blob: 137d2e006fb748d4a76df748a9afcf4933739c89 [file] [log] [blame]
Brian Stanke11f6d532016-07-05 16:17:59 -04001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.net.intent.impl.compiler;
18
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.osgi.ServiceDirectory;
23import org.onlab.osgi.TestServiceDirectory;
24import org.onlab.rest.BaseResource;
25import org.onosproject.TestApplicationId;
26import org.onosproject.common.event.impl.TestEventDispatcher;
27import org.onosproject.core.ApplicationId;
28import org.onosproject.core.CoreService;
29import org.onosproject.core.CoreServiceAdapter;
30import org.onosproject.core.IdGenerator;
31import org.onosproject.incubator.net.virtual.TenantId;
32import org.onosproject.incubator.net.virtual.VirtualDevice;
33import org.onosproject.incubator.net.virtual.VirtualLink;
34import org.onosproject.incubator.net.virtual.VirtualNetwork;
35import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
36import org.onosproject.incubator.net.virtual.VirtualNetworkService;
37import org.onosproject.incubator.net.virtual.VirtualNetworkStore;
38import org.onosproject.incubator.net.virtual.impl.VirtualNetworkManager;
39import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
40import org.onosproject.net.ConnectPoint;
41import org.onosproject.net.DefaultPort;
42import org.onosproject.net.EncapsulationType;
43import org.onosproject.net.Link;
44import org.onosproject.net.NetTestTools;
45import org.onosproject.net.Port;
46import org.onosproject.net.PortNumber;
47import org.onosproject.net.TestDeviceParams;
48import org.onosproject.net.intent.Constraint;
49import org.onosproject.net.intent.FakeIntentManager;
50import org.onosproject.net.intent.Intent;
51import org.onosproject.net.intent.IntentExtensionService;
52import org.onosproject.net.intent.IntentService;
53import org.onosproject.net.intent.Key;
54import org.onosproject.net.intent.MockIdGenerator;
55import org.onosproject.net.intent.TestableIntentService;
56import org.onosproject.net.intent.constraint.EncapsulationConstraint;
57import org.onosproject.store.service.TestStorageService;
58
59import java.util.ArrayList;
60import java.util.Collections;
61import java.util.List;
62import java.util.concurrent.atomic.AtomicLong;
63
64import static org.junit.Assert.assertEquals;
65import static org.onlab.junit.TestUtils.TestUtilsException;
66import static org.onlab.junit.TestUtils.setField;
67
68/**
69 * Junit tests for virtual network intent compiler.
70 */
71public class VirtualNetworkIntentCompilerTest extends TestDeviceParams {
72
73 private CoreService coreService;
74 private TestableIntentService intentService = new FakeIntentManager();
75 private IntentExtensionService intentExtensionService;
76 private final IdGenerator idGenerator = new MockIdGenerator();
77 private VirtualNetworkIntentCompiler compiler;
78 private VirtualNetworkManager manager;
79 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
80 private ServiceDirectory testDirectory;
81
82 private final String tenantIdValue1 = "TENANT_ID1";
83 private static final ApplicationId APP_ID =
84 new TestApplicationId("test");
85
86 private ConnectPoint cp1;
87 private ConnectPoint cp2;
88 private ConnectPoint cp3;
89 private ConnectPoint cp4;
90 private ConnectPoint cp5;
91 private ConnectPoint cp6;
92 private VirtualLink link1;
93 private VirtualLink link2;
94 private VirtualLink link3;
95 private VirtualLink link4;
96 private VirtualLink link5;
97 private VirtualLink link6;
98
99 @Before
100 public void setUp() throws TestUtilsException {
101 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
102
103 coreService = new TestCoreService();
104
105 Intent.unbindIdGenerator(idGenerator);
106 Intent.bindIdGenerator(idGenerator);
107
108 virtualNetworkManagerStore.setCoreService(coreService);
109 setField(coreService, "coreService", new TestCoreService());
110 setField(virtualNetworkManagerStore, "storageService", new TestStorageService());
111 virtualNetworkManagerStore.activate();
112
113 manager = new VirtualNetworkManager();
114 manager.setStore(virtualNetworkManagerStore);
115 manager.setIntentService(intentService);
116 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
117 manager.activate();
118
119 // Register a compiler and an installer both setup for success.
120 intentExtensionService = intentService;
121
122 testDirectory = new TestServiceDirectory()
123 .add(VirtualNetworkService.class, manager)
124 .add(VirtualNetworkStore.class, virtualNetworkManagerStore)
125 .add(IntentService.class, intentService);
126 BaseResource.setServiceDirectory(testDirectory);
127
128 compiler = new VirtualNetworkIntentCompiler();
129 compiler.manager = manager;
130 compiler.intentService = intentService;
131 compiler.store = virtualNetworkManagerStore;
132 compiler.intentManager = intentExtensionService;
133 compiler.serviceDirectory = testDirectory;
134 }
135
136 @After
137 public void tearDown() {
138 Intent.unbindIdGenerator(idGenerator);
139 manager.deactivate();
140 }
141
142 /**
143 * Method to create the virtual network for further testing.
144 *
145 * @return virtual network
146 */
147 private VirtualNetwork setupVirtualNetworkTopology() {
148 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
149 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
150 VirtualDevice virtualDevice1 =
151 manager.createVirtualDevice(virtualNetwork.id(), DID1);
152 VirtualDevice virtualDevice2 =
153 manager.createVirtualDevice(virtualNetwork.id(), DID2);
154 VirtualDevice virtualDevice3 =
155 manager.createVirtualDevice(virtualNetwork.id(), DID3);
156 VirtualDevice virtualDevice4 =
157 manager.createVirtualDevice(virtualNetwork.id(), DID4);
158
159 Port port1 = new DefaultPort(virtualDevice1, PortNumber.portNumber(1), true);
160 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(), port1.number(), port1);
161 cp1 = new ConnectPoint(virtualDevice1.id(), port1.number());
162
163 Port port2 = new DefaultPort(virtualDevice1, PortNumber.portNumber(2), true);
164 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(), port2.number(), port2);
165 cp2 = new ConnectPoint(virtualDevice1.id(), port2.number());
166
167 Port port3 = new DefaultPort(virtualDevice2, PortNumber.portNumber(3), true);
168 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(), port3.number(), port3);
169 cp3 = new ConnectPoint(virtualDevice2.id(), port3.number());
170
171 Port port4 = new DefaultPort(virtualDevice2, PortNumber.portNumber(4), true);
172 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(), port4.number(), port4);
173 cp4 = new ConnectPoint(virtualDevice2.id(), port4.number());
174
175 Port port5 = new DefaultPort(virtualDevice3, PortNumber.portNumber(5), true);
176 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(), port5.number(), port5);
177 cp5 = new ConnectPoint(virtualDevice3.id(), port5.number());
178
179 Port port6 = new DefaultPort(virtualDevice3, PortNumber.portNumber(6), true);
180 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(), port6.number(), port6);
181 cp6 = new ConnectPoint(virtualDevice3.id(), port6.number());
182
183 link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
184 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
185 link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
186 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
187 link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
188 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
189 link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
190 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
191
192 return virtualNetwork;
193 }
194
195 @Test
196 public void testCompiler() {
197 compiler.activate();
198 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
199
200 Key intentKey = Key.of("test", APP_ID);
201
202 List<Constraint> constraints = new ArrayList<>();
203 constraints.add(new EncapsulationConstraint(EncapsulationType.VLAN));
204
205 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
206 .networkId(virtualNetwork.id())
207 .key(intentKey)
208 .appId(APP_ID)
209 .ingressPoint(cp1)
210 .egressPoint(cp5)
211 .constraints(constraints)
212 .build();
213
214 List<Intent> compiled = compiler.compile(virtualIntent, Collections.emptyList());
215 assertEquals("The virtual intents size is not as expected.", 2, compiled.size());
216
217 compiler.deactivate();
218 }
219
220
221 /**
222 * Core service test class.
223 */
224 private class TestCoreService extends CoreServiceAdapter {
225
226 @Override
227 public IdGenerator getIdGenerator(String topic) {
228 return new IdGenerator() {
229 private AtomicLong counter = new AtomicLong(0);
230
231 @Override
232 public long getNewId() {
233 return counter.getAndIncrement();
234 }
235 };
236 }
237 }
238
239}