blob: ccebb725acec93d705c846f6ceadb9d94faa15c6 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 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 */
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070016package org.onlab.onos.store.device.impl;
17
Yuta HIGUCHI47c40882014-10-10 18:44:37 -070018import static org.easymock.EasyMock.*;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070019import static org.junit.Assert.*;
20import static org.onlab.onos.net.Device.Type.SWITCH;
21import static org.onlab.onos.net.DeviceId.deviceId;
22import static org.onlab.onos.net.device.DeviceEvent.Type.*;
Yuta HIGUCHI47c40882014-10-10 18:44:37 -070023import static org.onlab.onos.cluster.ControllerNode.State.*;
24import static org.onlab.onos.net.DefaultAnnotations.union;
25import static java.util.Arrays.asList;
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -070026
Madan Jampani47c93732014-10-06 20:46:08 -070027import java.io.IOException;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070028import java.util.Arrays;
Yuta HIGUCHI47c40882014-10-10 18:44:37 -070029import java.util.Collections;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070030import java.util.HashMap;
31import java.util.List;
32import java.util.Map;
33import java.util.Set;
34import java.util.concurrent.CountDownLatch;
35import java.util.concurrent.TimeUnit;
36
Yuta HIGUCHI47c40882014-10-10 18:44:37 -070037import org.easymock.Capture;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070038import org.junit.After;
39import org.junit.AfterClass;
40import org.junit.Before;
41import org.junit.BeforeClass;
42import org.junit.Ignore;
43import org.junit.Test;
Madan Jampani53e44e62014-10-07 12:39:51 -070044import org.onlab.onos.cluster.ClusterService;
45import org.onlab.onos.cluster.ControllerNode;
Madan Jampani53e44e62014-10-07 12:39:51 -070046import org.onlab.onos.cluster.DefaultControllerNode;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070047import org.onlab.onos.cluster.NodeId;
Yuta HIGUCHIe8252bb2014-10-22 09:41:01 -070048import org.onlab.onos.mastership.MastershipServiceAdapter;
Yuta HIGUCHI80912e62014-10-12 00:15:47 -070049import org.onlab.onos.mastership.MastershipTerm;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070050import org.onlab.onos.net.Annotations;
51import org.onlab.onos.net.DefaultAnnotations;
52import org.onlab.onos.net.Device;
53import org.onlab.onos.net.DeviceId;
54import org.onlab.onos.net.Port;
55import org.onlab.onos.net.PortNumber;
56import org.onlab.onos.net.SparseAnnotations;
57import org.onlab.onos.net.device.DefaultDeviceDescription;
58import org.onlab.onos.net.device.DefaultPortDescription;
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -070059import org.onlab.onos.net.device.DeviceClockService;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070060import org.onlab.onos.net.device.DeviceDescription;
61import org.onlab.onos.net.device.DeviceEvent;
62import org.onlab.onos.net.device.DeviceStore;
63import org.onlab.onos.net.device.DeviceStoreDelegate;
64import org.onlab.onos.net.device.PortDescription;
65import org.onlab.onos.net.provider.ProviderId;
Yuta HIGUCHI3e5d11a2014-11-04 14:16:44 -080066import org.onlab.onos.store.cluster.StaticClusterService;
Madan Jampani47c93732014-10-06 20:46:08 -070067import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
68import org.onlab.onos.store.cluster.messaging.ClusterMessage;
69import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
70import org.onlab.onos.store.cluster.messaging.MessageSubject;
alshabib7911a052014-10-16 17:49:37 -070071import org.onlab.packet.ChassisId;
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070072import org.onlab.packet.IpAddress;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070073
74import com.google.common.collect.Iterables;
75import com.google.common.collect.Sets;
76
77
78// TODO add tests for remote replication
79/**
80 * Test of the gossip based distributed DeviceStore implementation.
81 */
82public class GossipDeviceStoreTest {
83
84 private static final ProviderId PID = new ProviderId("of", "foo");
85 private static final ProviderId PIDA = new ProviderId("of", "bar", true);
86 private static final DeviceId DID1 = deviceId("of:foo");
87 private static final DeviceId DID2 = deviceId("of:bar");
88 private static final String MFR = "whitebox";
89 private static final String HW = "1.1.x";
90 private static final String SW1 = "3.8.1";
91 private static final String SW2 = "3.9.5";
92 private static final String SN = "43311-12345";
alshabib7911a052014-10-16 17:49:37 -070093 private static final ChassisId CID = new ChassisId();
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -070094
95 private static final PortNumber P1 = PortNumber.portNumber(1);
96 private static final PortNumber P2 = PortNumber.portNumber(2);
97 private static final PortNumber P3 = PortNumber.portNumber(3);
98
99 private static final SparseAnnotations A1 = DefaultAnnotations.builder()
100 .set("A1", "a1")
101 .set("B1", "b1")
102 .build();
103 private static final SparseAnnotations A1_2 = DefaultAnnotations.builder()
104 .remove("A1")
105 .set("B3", "b3")
106 .build();
107 private static final SparseAnnotations A2 = DefaultAnnotations.builder()
108 .set("A2", "a2")
109 .set("B2", "b2")
110 .build();
111 private static final SparseAnnotations A2_2 = DefaultAnnotations.builder()
112 .remove("A2")
113 .set("B4", "b4")
114 .build();
115
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700116 // local node
117 private static final NodeId NID1 = new NodeId("local");
118 private static final ControllerNode ONOS1 =
Pavlin Radoslavov444b5192014-10-28 10:45:19 -0700119 new DefaultControllerNode(NID1, IpAddress.valueOf("127.0.0.1"));
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700120
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700121 // remote node
122 private static final NodeId NID2 = new NodeId("remote");
123 private static final ControllerNode ONOS2 =
Pavlin Radoslavov444b5192014-10-28 10:45:19 -0700124 new DefaultControllerNode(NID2, IpAddress.valueOf("127.0.0.2"));
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700125 private static final List<SparseAnnotations> NO_ANNOTATION = Collections.<SparseAnnotations>emptyList();
126
127
128 private TestGossipDeviceStore testGossipDeviceStore;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700129 private GossipDeviceStore gossipDeviceStore;
130 private DeviceStore deviceStore;
131
132 private DeviceClockManager deviceClockManager;
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700133 private DeviceClockService deviceClockService;
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700134 private ClusterCommunicationService clusterCommunicator;
Yuta HIGUCHI3e5d11a2014-11-04 14:16:44 -0800135
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700136 @BeforeClass
137 public static void setUpBeforeClass() throws Exception {
138 }
139
140 @AfterClass
141 public static void tearDownAfterClass() throws Exception {
142 }
143
144
145 @Before
146 public void setUp() throws Exception {
147 deviceClockManager = new DeviceClockManager();
148 deviceClockManager.activate();
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700149 deviceClockService = deviceClockManager;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700150
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700151 deviceClockManager.setMastershipTerm(DID1, MastershipTerm.of(NID1, 1));
152 deviceClockManager.setMastershipTerm(DID2, MastershipTerm.of(NID1, 2));
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700153
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700154 clusterCommunicator = createNiceMock(ClusterCommunicationService.class);
155 clusterCommunicator.addSubscriber(anyObject(MessageSubject.class),
156 anyObject(ClusterMessageHandler.class));
157 expectLastCall().anyTimes();
158 replay(clusterCommunicator);
Madan Jampani53e44e62014-10-07 12:39:51 -0700159 ClusterService clusterService = new TestClusterService();
Madan Jampani47c93732014-10-06 20:46:08 -0700160
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700161 testGossipDeviceStore = new TestGossipDeviceStore(deviceClockService, clusterService, clusterCommunicator);
Yuta HIGUCHIe8252bb2014-10-22 09:41:01 -0700162 testGossipDeviceStore.mastershipService = new TestMastershipService();
163
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700164 gossipDeviceStore = testGossipDeviceStore;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700165 gossipDeviceStore.activate();
166 deviceStore = gossipDeviceStore;
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700167 verify(clusterCommunicator);
168 reset(clusterCommunicator);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700169 }
170
171 @After
172 public void tearDown() throws Exception {
173 gossipDeviceStore.deactivate();
174 deviceClockManager.deactivate();
175 }
176
Yuta HIGUCHI0d6a5e62014-10-03 15:54:09 -0700177 private void putDevice(DeviceId deviceId, String swVersion,
178 SparseAnnotations... annotations) {
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700179 DeviceDescription description =
180 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700181 HW, swVersion, SN, CID, annotations);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700182 reset(clusterCommunicator);
183 try {
184 expect(clusterCommunicator.broadcast(anyObject(ClusterMessage.class)))
185 .andReturn(true).anyTimes();
186 } catch (IOException e) {
187 fail("Should never reach here");
188 }
189 replay(clusterCommunicator);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700190 deviceStore.createOrUpdateDevice(PID, deviceId, description);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700191 verify(clusterCommunicator);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700192 }
193
Yuta HIGUCHI0d6a5e62014-10-03 15:54:09 -0700194 private void putDeviceAncillary(DeviceId deviceId, String swVersion,
195 SparseAnnotations... annotations) {
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700196 DeviceDescription description =
197 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700198 HW, swVersion, SN, CID, annotations);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700199 deviceStore.createOrUpdateDevice(PIDA, deviceId, description);
200 }
201
202 private static void assertDevice(DeviceId id, String swVersion, Device device) {
203 assertNotNull(device);
204 assertEquals(id, device.id());
205 assertEquals(MFR, device.manufacturer());
206 assertEquals(HW, device.hwVersion());
207 assertEquals(swVersion, device.swVersion());
208 assertEquals(SN, device.serialNumber());
209 }
210
211 /**
212 * Verifies that Annotations created by merging {@code annotations} is
213 * equal to actual Annotations.
214 *
215 * @param actual Annotations to check
216 * @param annotations
217 */
218 private static void assertAnnotationsEquals(Annotations actual, SparseAnnotations... annotations) {
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700219 SparseAnnotations expected = DefaultAnnotations.builder().build();
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700220 for (SparseAnnotations a : annotations) {
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700221 expected = DefaultAnnotations.union(expected, a);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700222 }
223 assertEquals(expected.keys(), actual.keys());
224 for (String key : expected.keys()) {
225 assertEquals(expected.value(key), actual.value(key));
226 }
227 }
228
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700229 private static void assertDeviceDescriptionEquals(DeviceDescription expected,
230 DeviceDescription actual) {
231 if (expected == actual) {
232 return;
233 }
234 assertEquals(expected.deviceURI(), actual.deviceURI());
235 assertEquals(expected.hwVersion(), actual.hwVersion());
236 assertEquals(expected.manufacturer(), actual.manufacturer());
237 assertEquals(expected.serialNumber(), actual.serialNumber());
238 assertEquals(expected.swVersion(), actual.swVersion());
239
240 assertAnnotationsEquals(actual.annotations(), expected.annotations());
241 }
242
243 private static void assertDeviceDescriptionEquals(DeviceDescription expected,
244 List<SparseAnnotations> expectedAnnotations,
245 DeviceDescription actual) {
246 if (expected == actual) {
247 return;
248 }
249 assertEquals(expected.deviceURI(), actual.deviceURI());
250 assertEquals(expected.hwVersion(), actual.hwVersion());
251 assertEquals(expected.manufacturer(), actual.manufacturer());
252 assertEquals(expected.serialNumber(), actual.serialNumber());
253 assertEquals(expected.swVersion(), actual.swVersion());
254
255 assertAnnotationsEquals(actual.annotations(),
256 expectedAnnotations.toArray(new SparseAnnotations[0]));
257 }
258
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700259 @Test
260 public final void testGetDeviceCount() {
261 assertEquals("initialy empty", 0, deviceStore.getDeviceCount());
262
263 putDevice(DID1, SW1);
264 putDevice(DID2, SW2);
265 putDevice(DID1, SW1);
266
267 assertEquals("expect 2 uniq devices", 2, deviceStore.getDeviceCount());
268 }
269
270 @Test
271 public final void testGetDevices() {
272 assertEquals("initialy empty", 0, Iterables.size(deviceStore.getDevices()));
273
274 putDevice(DID1, SW1);
275 putDevice(DID2, SW2);
276 putDevice(DID1, SW1);
277
278 assertEquals("expect 2 uniq devices",
279 2, Iterables.size(deviceStore.getDevices()));
280
281 Map<DeviceId, Device> devices = new HashMap<>();
282 for (Device device : deviceStore.getDevices()) {
283 devices.put(device.id(), device);
284 }
285
286 assertDevice(DID1, SW1, devices.get(DID1));
287 assertDevice(DID2, SW2, devices.get(DID2));
288
289 // add case for new node?
290 }
291
292 @Test
293 public final void testGetDevice() {
294
295 putDevice(DID1, SW1);
296
297 assertDevice(DID1, SW1, deviceStore.getDevice(DID1));
298 assertNull("DID2 shouldn't be there", deviceStore.getDevice(DID2));
299 }
300
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700301 private void assertInternalDeviceEvent(NodeId sender,
302 DeviceId deviceId,
303 ProviderId providerId,
304 DeviceDescription expectedDesc,
305 Capture<ClusterMessage> actualMsg) {
306 assertTrue(actualMsg.hasCaptured());
307 assertEquals(sender, actualMsg.getValue().sender());
308 assertEquals(GossipDeviceStoreMessageSubjects.DEVICE_UPDATE,
309 actualMsg.getValue().subject());
310 InternalDeviceEvent addEvent
311 = testGossipDeviceStore.deserialize(actualMsg.getValue().payload());
312 assertEquals(deviceId, addEvent.deviceId());
313 assertEquals(providerId, addEvent.providerId());
314 assertDeviceDescriptionEquals(expectedDesc, addEvent.deviceDescription().value());
315 }
316
317 private void assertInternalDeviceEvent(NodeId sender,
318 DeviceId deviceId,
319 ProviderId providerId,
320 DeviceDescription expectedDesc,
321 List<SparseAnnotations> expectedAnnotations,
322 Capture<ClusterMessage> actualMsg) {
323 assertTrue(actualMsg.hasCaptured());
324 assertEquals(sender, actualMsg.getValue().sender());
325 assertEquals(GossipDeviceStoreMessageSubjects.DEVICE_UPDATE,
326 actualMsg.getValue().subject());
327 InternalDeviceEvent addEvent
328 = testGossipDeviceStore.deserialize(actualMsg.getValue().payload());
329 assertEquals(deviceId, addEvent.deviceId());
330 assertEquals(providerId, addEvent.providerId());
331 assertDeviceDescriptionEquals(expectedDesc, expectedAnnotations, addEvent.deviceDescription().value());
332 }
333
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700334 @Test
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700335 public final void testCreateOrUpdateDevice() throws IOException {
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700336 DeviceDescription description =
337 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700338 HW, SW1, SN, CID);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700339 Capture<ClusterMessage> bcast = new Capture<>();
340
341 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700342 DeviceEvent event = deviceStore.createOrUpdateDevice(PID, DID1, description);
343 assertEquals(DEVICE_ADDED, event.type());
344 assertDevice(DID1, SW1, event.subject());
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700345 verify(clusterCommunicator);
346 assertInternalDeviceEvent(NID1, DID1, PID, description, bcast);
347
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700348
349 DeviceDescription description2 =
350 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700351 HW, SW2, SN, CID);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700352 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700353 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
354 assertEquals(DEVICE_UPDATED, event2.type());
355 assertDevice(DID1, SW2, event2.subject());
356
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700357 verify(clusterCommunicator);
358 assertInternalDeviceEvent(NID1, DID1, PID, description2, bcast);
359 reset(clusterCommunicator);
360
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700361 assertNull("No change expected", deviceStore.createOrUpdateDevice(PID, DID1, description2));
362 }
363
364 @Test
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700365 public final void testCreateOrUpdateDeviceAncillary() throws IOException {
366 // add
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700367 DeviceDescription description =
368 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700369 HW, SW1, SN, CID, A2);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700370 Capture<ClusterMessage> bcast = new Capture<>();
371
372 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700373 DeviceEvent event = deviceStore.createOrUpdateDevice(PIDA, DID1, description);
374 assertEquals(DEVICE_ADDED, event.type());
375 assertDevice(DID1, SW1, event.subject());
376 assertEquals(PIDA, event.subject().providerId());
377 assertAnnotationsEquals(event.subject().annotations(), A2);
378 assertFalse("Ancillary will not bring device up", deviceStore.isAvailable(DID1));
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700379 verify(clusterCommunicator);
380 assertInternalDeviceEvent(NID1, DID1, PIDA, description, bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700381
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700382 // update from primary
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700383 DeviceDescription description2 =
384 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700385 HW, SW2, SN, CID, A1);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700386 resetCommunicatorExpectingSingleBroadcast(bcast);
387
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700388 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
389 assertEquals(DEVICE_UPDATED, event2.type());
390 assertDevice(DID1, SW2, event2.subject());
391 assertEquals(PID, event2.subject().providerId());
392 assertAnnotationsEquals(event2.subject().annotations(), A1, A2);
393 assertTrue(deviceStore.isAvailable(DID1));
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700394 verify(clusterCommunicator);
395 assertInternalDeviceEvent(NID1, DID1, PID, description2, bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700396
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700397 // no-op update from primary
398 resetCommunicatorExpectingNoBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700399 assertNull("No change expected", deviceStore.createOrUpdateDevice(PID, DID1, description2));
400
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700401 verify(clusterCommunicator);
402 assertFalse("no broadcast expected", bcast.hasCaptured());
403
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700404 // For now, Ancillary is ignored once primary appears
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700405 resetCommunicatorExpectingNoBroadcast(bcast);
406
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700407 assertNull("No change expected", deviceStore.createOrUpdateDevice(PIDA, DID1, description));
408
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700409 verify(clusterCommunicator);
410 assertFalse("no broadcast expected", bcast.hasCaptured());
411
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700412 // But, Ancillary annotations will be in effect
413 DeviceDescription description3 =
414 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700415 HW, SW1, SN, CID, A2_2);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700416 resetCommunicatorExpectingSingleBroadcast(bcast);
417
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700418 DeviceEvent event3 = deviceStore.createOrUpdateDevice(PIDA, DID1, description3);
419 assertEquals(DEVICE_UPDATED, event3.type());
420 // basic information will be the one from Primary
421 assertDevice(DID1, SW2, event3.subject());
422 assertEquals(PID, event3.subject().providerId());
423 // but annotation from Ancillary will be merged
424 assertAnnotationsEquals(event3.subject().annotations(), A1, A2, A2_2);
425 assertTrue(deviceStore.isAvailable(DID1));
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700426 verify(clusterCommunicator);
427 // note: only annotation from PIDA is sent over the wire
428 assertInternalDeviceEvent(NID1, DID1, PIDA, description3,
429 asList(union(A2, A2_2)), bcast);
430
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700431 }
432
433
434 @Test
435 public final void testMarkOffline() {
436
437 putDevice(DID1, SW1);
438 assertTrue(deviceStore.isAvailable(DID1));
439
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700440 Capture<ClusterMessage> bcast = new Capture<>();
441
442 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700443 DeviceEvent event = deviceStore.markOffline(DID1);
444 assertEquals(DEVICE_AVAILABILITY_CHANGED, event.type());
445 assertDevice(DID1, SW1, event.subject());
446 assertFalse(deviceStore.isAvailable(DID1));
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700447 verify(clusterCommunicator);
448 // TODO: verify broadcast message
449 assertTrue(bcast.hasCaptured());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700450
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700451
452 resetCommunicatorExpectingNoBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700453 DeviceEvent event2 = deviceStore.markOffline(DID1);
454 assertNull("No change, no event", event2);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700455 verify(clusterCommunicator);
456 assertFalse(bcast.hasCaptured());
457 }
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700458
459 @Test
460 public final void testUpdatePorts() {
461 putDevice(DID1, SW1);
462 List<PortDescription> pds = Arrays.<PortDescription>asList(
463 new DefaultPortDescription(P1, true),
464 new DefaultPortDescription(P2, true)
465 );
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700466 Capture<ClusterMessage> bcast = new Capture<>();
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700467
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700468 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700469 List<DeviceEvent> events = deviceStore.updatePorts(PID, DID1, pds);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700470 verify(clusterCommunicator);
471 // TODO: verify broadcast message
472 assertTrue(bcast.hasCaptured());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700473
474 Set<PortNumber> expectedPorts = Sets.newHashSet(P1, P2);
475 for (DeviceEvent event : events) {
476 assertEquals(PORT_ADDED, event.type());
477 assertDevice(DID1, SW1, event.subject());
478 assertTrue("PortNumber is one of expected",
479 expectedPorts.remove(event.port().number()));
480 assertTrue("Port is enabled", event.port().isEnabled());
481 }
482 assertTrue("Event for all expectedport appeared", expectedPorts.isEmpty());
483
484
485 List<PortDescription> pds2 = Arrays.<PortDescription>asList(
486 new DefaultPortDescription(P1, false),
487 new DefaultPortDescription(P2, true),
488 new DefaultPortDescription(P3, true)
489 );
490
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700491 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700492 events = deviceStore.updatePorts(PID, DID1, pds2);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700493 verify(clusterCommunicator);
494 // TODO: verify broadcast message
495 assertTrue(bcast.hasCaptured());
496
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700497 assertFalse("event should be triggered", events.isEmpty());
498 for (DeviceEvent event : events) {
499 PortNumber num = event.port().number();
500 if (P1.equals(num)) {
501 assertEquals(PORT_UPDATED, event.type());
502 assertDevice(DID1, SW1, event.subject());
503 assertFalse("Port is disabled", event.port().isEnabled());
504 } else if (P2.equals(num)) {
505 fail("P2 event not expected.");
506 } else if (P3.equals(num)) {
507 assertEquals(PORT_ADDED, event.type());
508 assertDevice(DID1, SW1, event.subject());
509 assertTrue("Port is enabled", event.port().isEnabled());
510 } else {
511 fail("Unknown port number encountered: " + num);
512 }
513 }
514
515 List<PortDescription> pds3 = Arrays.<PortDescription>asList(
516 new DefaultPortDescription(P1, false),
517 new DefaultPortDescription(P2, true)
518 );
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700519 resetCommunicatorExpectingSingleBroadcast(bcast);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700520 events = deviceStore.updatePorts(PID, DID1, pds3);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700521 verify(clusterCommunicator);
522 // TODO: verify broadcast message
523 assertTrue(bcast.hasCaptured());
524
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700525 assertFalse("event should be triggered", events.isEmpty());
526 for (DeviceEvent event : events) {
527 PortNumber num = event.port().number();
528 if (P1.equals(num)) {
529 fail("P1 event not expected.");
530 } else if (P2.equals(num)) {
531 fail("P2 event not expected.");
532 } else if (P3.equals(num)) {
533 assertEquals(PORT_REMOVED, event.type());
534 assertDevice(DID1, SW1, event.subject());
535 assertTrue("Port was enabled", event.port().isEnabled());
536 } else {
537 fail("Unknown port number encountered: " + num);
538 }
539 }
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700540 }
541
542 @Test
543 public final void testUpdatePortStatus() {
544 putDevice(DID1, SW1);
545 List<PortDescription> pds = Arrays.<PortDescription>asList(
546 new DefaultPortDescription(P1, true)
547 );
548 deviceStore.updatePorts(PID, DID1, pds);
549
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700550 Capture<ClusterMessage> bcast = new Capture<>();
551
552 resetCommunicatorExpectingSingleBroadcast(bcast);
553 final DefaultPortDescription desc = new DefaultPortDescription(P1, false);
554 DeviceEvent event = deviceStore.updatePortStatus(PID, DID1, desc);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700555 assertEquals(PORT_UPDATED, event.type());
556 assertDevice(DID1, SW1, event.subject());
557 assertEquals(P1, event.port().number());
558 assertFalse("Port is disabled", event.port().isEnabled());
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700559 verify(clusterCommunicator);
560 assertInternalPortStatusEvent(NID1, DID1, PID, desc, NO_ANNOTATION, bcast);
561 assertTrue(bcast.hasCaptured());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700562 }
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700563
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700564 @Test
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700565 public final void testUpdatePortStatusAncillary() throws IOException {
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700566 putDeviceAncillary(DID1, SW1);
567 putDevice(DID1, SW1);
568 List<PortDescription> pds = Arrays.<PortDescription>asList(
569 new DefaultPortDescription(P1, true, A1)
570 );
571 deviceStore.updatePorts(PID, DID1, pds);
572
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700573 Capture<ClusterMessage> bcast = new Capture<>();
574
575
576 // update port from primary
577 resetCommunicatorExpectingSingleBroadcast(bcast);
578 final DefaultPortDescription desc1 = new DefaultPortDescription(P1, false, A1_2);
579 DeviceEvent event = deviceStore.updatePortStatus(PID, DID1, desc1);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700580 assertEquals(PORT_UPDATED, event.type());
581 assertDevice(DID1, SW1, event.subject());
582 assertEquals(P1, event.port().number());
583 assertAnnotationsEquals(event.port().annotations(), A1, A1_2);
584 assertFalse("Port is disabled", event.port().isEnabled());
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700585 verify(clusterCommunicator);
586 assertInternalPortStatusEvent(NID1, DID1, PID, desc1, asList(A1, A1_2), bcast);
587 assertTrue(bcast.hasCaptured());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700588
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700589 // update port from ancillary with no attributes
590 resetCommunicatorExpectingNoBroadcast(bcast);
591 final DefaultPortDescription desc2 = new DefaultPortDescription(P1, true);
592 DeviceEvent event2 = deviceStore.updatePortStatus(PIDA, DID1, desc2);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700593 assertNull("Ancillary is ignored if primary exists", event2);
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700594 verify(clusterCommunicator);
595 assertFalse(bcast.hasCaptured());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700596
597 // but, Ancillary annotation update will be notified
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700598 resetCommunicatorExpectingSingleBroadcast(bcast);
599 final DefaultPortDescription desc3 = new DefaultPortDescription(P1, true, A2);
600 DeviceEvent event3 = deviceStore.updatePortStatus(PIDA, DID1, desc3);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700601 assertEquals(PORT_UPDATED, event3.type());
602 assertDevice(DID1, SW1, event3.subject());
603 assertEquals(P1, event3.port().number());
604 assertAnnotationsEquals(event3.port().annotations(), A1, A1_2, A2);
605 assertFalse("Port is disabled", event3.port().isEnabled());
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700606 verify(clusterCommunicator);
607 assertInternalPortStatusEvent(NID1, DID1, PIDA, desc3, asList(A2), bcast);
608 assertTrue(bcast.hasCaptured());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700609
610 // port only reported from Ancillary will be notified as down
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700611 resetCommunicatorExpectingSingleBroadcast(bcast);
612 final DefaultPortDescription desc4 = new DefaultPortDescription(P2, true);
613 DeviceEvent event4 = deviceStore.updatePortStatus(PIDA, DID1, desc4);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700614 assertEquals(PORT_ADDED, event4.type());
615 assertDevice(DID1, SW1, event4.subject());
616 assertEquals(P2, event4.port().number());
617 assertAnnotationsEquals(event4.port().annotations());
618 assertFalse("Port is disabled if not given from primary provider",
619 event4.port().isEnabled());
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700620 verify(clusterCommunicator);
621 // TODO: verify broadcast message content
622 assertInternalPortStatusEvent(NID1, DID1, PIDA, desc4, NO_ANNOTATION, bcast);
623 assertTrue(bcast.hasCaptured());
624 }
625
626 private void assertInternalPortStatusEvent(NodeId sender, DeviceId did,
627 ProviderId pid, DefaultPortDescription expectedDesc,
628 List<SparseAnnotations> expectedAnnotations, Capture<ClusterMessage> actualMsg) {
629
630 assertTrue(actualMsg.hasCaptured());
631 assertEquals(sender, actualMsg.getValue().sender());
632 assertEquals(GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE,
633 actualMsg.getValue().subject());
634 InternalPortStatusEvent addEvent
635 = testGossipDeviceStore.deserialize(actualMsg.getValue().payload());
636 assertEquals(did, addEvent.deviceId());
637 assertEquals(pid, addEvent.providerId());
638 assertPortDescriptionEquals(expectedDesc, expectedAnnotations,
639 addEvent.portDescription().value());
640
641 }
642
643 private void assertPortDescriptionEquals(
644 PortDescription expectedDesc,
645 List<SparseAnnotations> expectedAnnotations,
646 PortDescription actual) {
647
648 assertEquals(expectedDesc.portNumber(), actual.portNumber());
649 assertEquals(expectedDesc.isEnabled(), actual.isEnabled());
650
651 assertAnnotationsEquals(actual.annotations(),
652 expectedAnnotations.toArray(new SparseAnnotations[0]));
653 }
654
655 private void resetCommunicatorExpectingNoBroadcast(
656 Capture<ClusterMessage> bcast) {
657 bcast.reset();
658 reset(clusterCommunicator);
659 replay(clusterCommunicator);
660 }
661
662 private void resetCommunicatorExpectingSingleBroadcast(
663 Capture<ClusterMessage> bcast) {
664
665 bcast.reset();
666 reset(clusterCommunicator);
667 try {
668 expect(clusterCommunicator.broadcast(capture(bcast))).andReturn(true).once();
669 } catch (IOException e) {
670 fail("Should never reach here");
671 }
672 replay(clusterCommunicator);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700673 }
674
675 @Test
676 public final void testGetPorts() {
677 putDevice(DID1, SW1);
678 putDevice(DID2, SW1);
679 List<PortDescription> pds = Arrays.<PortDescription>asList(
680 new DefaultPortDescription(P1, true),
681 new DefaultPortDescription(P2, true)
682 );
683 deviceStore.updatePorts(PID, DID1, pds);
684
685 Set<PortNumber> expectedPorts = Sets.newHashSet(P1, P2);
686 List<Port> ports = deviceStore.getPorts(DID1);
687 for (Port port : ports) {
688 assertTrue("Port is enabled", port.isEnabled());
689 assertTrue("PortNumber is one of expected",
690 expectedPorts.remove(port.number()));
691 }
692 assertTrue("Event for all expectedport appeared", expectedPorts.isEmpty());
693
694
695 assertTrue("DID2 has no ports", deviceStore.getPorts(DID2).isEmpty());
696 }
697
698 @Test
699 public final void testGetPort() {
700 putDevice(DID1, SW1);
701 putDevice(DID2, SW1);
702 List<PortDescription> pds = Arrays.<PortDescription>asList(
703 new DefaultPortDescription(P1, true),
704 new DefaultPortDescription(P2, false)
705 );
706 deviceStore.updatePorts(PID, DID1, pds);
707
708 Port port1 = deviceStore.getPort(DID1, P1);
709 assertEquals(P1, port1.number());
710 assertTrue("Port is enabled", port1.isEnabled());
711
712 Port port2 = deviceStore.getPort(DID1, P2);
713 assertEquals(P2, port2.number());
714 assertFalse("Port is disabled", port2.isEnabled());
715
716 Port port3 = deviceStore.getPort(DID1, P3);
717 assertNull("P3 not expected", port3);
718 }
719
720 @Test
721 public final void testRemoveDevice() {
Yuta HIGUCHI0d6a5e62014-10-03 15:54:09 -0700722 putDevice(DID1, SW1, A1);
723 List<PortDescription> pds = Arrays.<PortDescription>asList(
724 new DefaultPortDescription(P1, true, A2)
725 );
726 deviceStore.updatePorts(PID, DID1, pds);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700727 putDevice(DID2, SW1);
728
729 assertEquals(2, deviceStore.getDeviceCount());
Yuta HIGUCHI0d6a5e62014-10-03 15:54:09 -0700730 assertEquals(1, deviceStore.getPorts(DID1).size());
731 assertAnnotationsEquals(deviceStore.getDevice(DID1).annotations(), A1);
732 assertAnnotationsEquals(deviceStore.getPort(DID1, P1).annotations(), A2);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700733
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700734 Capture<ClusterMessage> bcast = new Capture<>();
735
736 resetCommunicatorExpectingSingleBroadcast(bcast);
737
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700738 DeviceEvent event = deviceStore.removeDevice(DID1);
739 assertEquals(DEVICE_REMOVED, event.type());
740 assertDevice(DID1, SW1, event.subject());
741
742 assertEquals(1, deviceStore.getDeviceCount());
Yuta HIGUCHI0d6a5e62014-10-03 15:54:09 -0700743 assertEquals(0, deviceStore.getPorts(DID1).size());
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700744 verify(clusterCommunicator);
745 // TODO: verify broadcast message
746 assertTrue(bcast.hasCaptured());
Yuta HIGUCHI0d6a5e62014-10-03 15:54:09 -0700747
748 // putBack Device, Port w/o annotation
749 putDevice(DID1, SW1);
750 List<PortDescription> pds2 = Arrays.<PortDescription>asList(
751 new DefaultPortDescription(P1, true)
752 );
753 deviceStore.updatePorts(PID, DID1, pds2);
754
755 // annotations should not survive
756 assertEquals(2, deviceStore.getDeviceCount());
757 assertEquals(1, deviceStore.getPorts(DID1).size());
758 assertAnnotationsEquals(deviceStore.getDevice(DID1).annotations());
759 assertAnnotationsEquals(deviceStore.getPort(DID1, P1).annotations());
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700760 }
761
762 // If Delegates should be called only on remote events,
763 // then Simple* should never call them, thus not test required.
764 // TODO add test for Port events when we have them
765 @Ignore("Ignore until Delegate spec. is clear.")
766 @Test
767 public final void testEvents() throws InterruptedException {
768 final CountDownLatch addLatch = new CountDownLatch(1);
769 DeviceStoreDelegate checkAdd = new DeviceStoreDelegate() {
770 @Override
771 public void notify(DeviceEvent event) {
772 assertEquals(DEVICE_ADDED, event.type());
773 assertDevice(DID1, SW1, event.subject());
774 addLatch.countDown();
775 }
776 };
777 final CountDownLatch updateLatch = new CountDownLatch(1);
778 DeviceStoreDelegate checkUpdate = new DeviceStoreDelegate() {
779 @Override
780 public void notify(DeviceEvent event) {
781 assertEquals(DEVICE_UPDATED, event.type());
782 assertDevice(DID1, SW2, event.subject());
783 updateLatch.countDown();
784 }
785 };
786 final CountDownLatch removeLatch = new CountDownLatch(1);
787 DeviceStoreDelegate checkRemove = new DeviceStoreDelegate() {
788 @Override
789 public void notify(DeviceEvent event) {
790 assertEquals(DEVICE_REMOVED, event.type());
791 assertDevice(DID1, SW2, event.subject());
792 removeLatch.countDown();
793 }
794 };
795
796 DeviceDescription description =
797 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700798 HW, SW1, SN, CID);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700799 deviceStore.setDelegate(checkAdd);
800 deviceStore.createOrUpdateDevice(PID, DID1, description);
801 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS));
802
803
804 DeviceDescription description2 =
805 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
alshabib7911a052014-10-16 17:49:37 -0700806 HW, SW2, SN, CID);
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700807 deviceStore.unsetDelegate(checkAdd);
808 deviceStore.setDelegate(checkUpdate);
809 deviceStore.createOrUpdateDevice(PID, DID1, description2);
810 assertTrue("Update event fired", updateLatch.await(1, TimeUnit.SECONDS));
811
812 deviceStore.unsetDelegate(checkUpdate);
813 deviceStore.setDelegate(checkRemove);
814 deviceStore.removeDevice(DID1);
815 assertTrue("Remove event fired", removeLatch.await(1, TimeUnit.SECONDS));
816 }
817
Yuta HIGUCHIe8252bb2014-10-22 09:41:01 -0700818 private final class TestMastershipService extends MastershipServiceAdapter {
819 @Override
820 public NodeId getMasterFor(DeviceId deviceId) {
821 return NID1;
822 }
823 }
824
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700825 private static final class TestGossipDeviceStore extends GossipDeviceStore {
826
Madan Jampani53e44e62014-10-07 12:39:51 -0700827 public TestGossipDeviceStore(
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700828 DeviceClockService deviceClockService,
Madan Jampani53e44e62014-10-07 12:39:51 -0700829 ClusterService clusterService,
830 ClusterCommunicationService clusterCommunicator) {
Yuta HIGUCHI093e83e2014-10-10 22:26:11 -0700831 this.deviceClockService = deviceClockService;
Madan Jampani53e44e62014-10-07 12:39:51 -0700832 this.clusterService = clusterService;
Madan Jampani47c93732014-10-06 20:46:08 -0700833 this.clusterCommunicator = clusterCommunicator;
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700834 }
Madan Jampani47c93732014-10-06 20:46:08 -0700835
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700836 public <T> T deserialize(byte[] bytes) {
837 return SERIALIZER.decode(bytes);
838 }
Madan Jampani47c93732014-10-06 20:46:08 -0700839 }
Madan Jampani53e44e62014-10-07 12:39:51 -0700840
Yuta HIGUCHI3e5d11a2014-11-04 14:16:44 -0800841 private static final class TestClusterService extends StaticClusterService {
Madan Jampani53e44e62014-10-07 12:39:51 -0700842
843 public TestClusterService() {
Yuta HIGUCHI3e5d11a2014-11-04 14:16:44 -0800844 localNode = ONOS1;
Yuta HIGUCHI47c40882014-10-10 18:44:37 -0700845 nodes.put(NID1, ONOS1);
846 nodeStates.put(NID1, ACTIVE);
847
848 nodes.put(NID2, ONOS2);
849 nodeStates.put(NID2, ACTIVE);
Madan Jampani53e44e62014-10-07 12:39:51 -0700850 }
Madan Jampani53e44e62014-10-07 12:39:51 -0700851 }
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700852}