Committed by
Gerrit Code Review
Injecting topology through JSON ConfigProvider works for multi-instance (ONOS-490).
Change-Id: Ib977f4cf9a59ddec360072891fd803c6f9ee84f1 Injecting optical device annotations and ports works for multi-instance (ONOS-870). Change-Id: Icdde16ef72fc4e47eec7213250b04902083f0537
Showing
12 changed files
with
242 additions
and
36 deletions
| ... | @@ -179,7 +179,7 @@ public class OpticalPathProvisioner { | ... | @@ -179,7 +179,7 @@ public class OpticalPathProvisioner { |
| 179 | 179 | ||
| 180 | if (!IntentState.FAILED.equals(intentService.getIntentState(intent.key()))) { | 180 | if (!IntentState.FAILED.equals(intentService.getIntentState(intent.key()))) { |
| 181 | return; | 181 | return; |
| 182 | - } | 182 | + } |
| 183 | 183 | ||
| 184 | List<Intent> intents = Lists.newArrayList(); | 184 | List<Intent> intents = Lists.newArrayList(); |
| 185 | if (intent instanceof HostToHostIntent) { | 185 | if (intent instanceof HostToHostIntent) { | ... | ... |
| ... | @@ -15,10 +15,10 @@ | ... | @@ -15,10 +15,10 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.event; | 16 | package org.onosproject.event; |
| 17 | 17 | ||
| 18 | -import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 19 | - | ||
| 20 | import org.joda.time.LocalDateTime; | 18 | import org.joda.time.LocalDateTime; |
| 21 | 19 | ||
| 20 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 21 | + | ||
| 22 | /** | 22 | /** |
| 23 | * Base event implementation. | 23 | * Base event implementation. |
| 24 | */ | 24 | */ |
| ... | @@ -75,5 +75,4 @@ public class AbstractEvent<T extends Enum, S> implements Event<T, S> { | ... | @@ -75,5 +75,4 @@ public class AbstractEvent<T extends Enum, S> implements Event<T, S> { |
| 75 | .add("subject", subject()) | 75 | .add("subject", subject()) |
| 76 | .toString(); | 76 | .toString(); |
| 77 | } | 77 | } |
| 78 | - | ||
| 79 | } | 78 | } | ... | ... |
| ... | @@ -47,7 +47,7 @@ public class DefaultDeviceDescription extends AbstractDescription | ... | @@ -47,7 +47,7 @@ public class DefaultDeviceDescription extends AbstractDescription |
| 47 | * @param hwVersion device HW version | 47 | * @param hwVersion device HW version |
| 48 | * @param swVersion device SW version | 48 | * @param swVersion device SW version |
| 49 | * @param serialNumber device serial number | 49 | * @param serialNumber device serial number |
| 50 | - * @param chassis chasis id | 50 | + * @param chassis chassis id |
| 51 | * @param annotations optional key/value annotations map | 51 | * @param annotations optional key/value annotations map |
| 52 | */ | 52 | */ |
| 53 | public DefaultDeviceDescription(URI uri, Type type, String manufacturer, | 53 | public DefaultDeviceDescription(URI uri, Type type, String manufacturer, | ... | ... |
| ... | @@ -306,18 +306,16 @@ public class DeviceManager | ... | @@ -306,18 +306,16 @@ public class DeviceManager |
| 306 | // TODO: Do we need to explicitly tell the Provider that | 306 | // TODO: Do we need to explicitly tell the Provider that |
| 307 | // this instance is not the MASTER | 307 | // this instance is not the MASTER |
| 308 | applyRole(deviceId, MastershipRole.STANDBY); | 308 | applyRole(deviceId, MastershipRole.STANDBY); |
| 309 | - return; | 309 | + } else { |
| 310 | + log.info("Role of this node is MASTER for {}", deviceId); | ||
| 311 | + // tell clock provider if this instance is the master | ||
| 312 | + deviceClockProviderService.setMastershipTerm(deviceId, term); | ||
| 313 | + applyRole(deviceId, MastershipRole.MASTER); | ||
| 310 | } | 314 | } |
| 311 | - log.info("Role of this node is MASTER for {}", deviceId); | ||
| 312 | - | ||
| 313 | - // tell clock provider if this instance is the master | ||
| 314 | - deviceClockProviderService.setMastershipTerm(deviceId, term); | ||
| 315 | 315 | ||
| 316 | DeviceEvent event = store.createOrUpdateDevice(provider().id(), | 316 | DeviceEvent event = store.createOrUpdateDevice(provider().id(), |
| 317 | deviceId, deviceDescription); | 317 | deviceId, deviceDescription); |
| 318 | 318 | ||
| 319 | - applyRole(deviceId, MastershipRole.MASTER); | ||
| 320 | - | ||
| 321 | // If there was a change of any kind, tell the provider | 319 | // If there was a change of any kind, tell the provider |
| 322 | // that this instance is the master. | 320 | // that this instance is the master. |
| 323 | if (event != null) { | 321 | if (event != null) { | ... | ... |
| 1 | +package org.onosproject.store.device.impl; | ||
| 2 | + | ||
| 3 | +import com.google.common.base.MoreObjects; | ||
| 4 | +import org.onosproject.net.DeviceId; | ||
| 5 | +import org.onosproject.net.device.DeviceDescription; | ||
| 6 | +import org.onosproject.net.provider.ProviderId; | ||
| 7 | + | ||
| 8 | +public class DeviceInjectedEvent { | ||
| 9 | + private final ProviderId providerId; | ||
| 10 | + private final DeviceId deviceId; | ||
| 11 | + private final DeviceDescription deviceDescription; | ||
| 12 | + | ||
| 13 | + protected DeviceInjectedEvent( | ||
| 14 | + ProviderId providerId, | ||
| 15 | + DeviceId deviceId, | ||
| 16 | + DeviceDescription deviceDescription) { | ||
| 17 | + this.providerId = providerId; | ||
| 18 | + this.deviceId = deviceId; | ||
| 19 | + this.deviceDescription = deviceDescription; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public DeviceId deviceId() { | ||
| 23 | + return deviceId; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public ProviderId providerId() { | ||
| 27 | + return providerId; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + public DeviceDescription deviceDescription() { | ||
| 31 | + return deviceDescription; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @Override | ||
| 35 | + public String toString() { | ||
| 36 | + return MoreObjects.toStringHelper(getClass()) | ||
| 37 | + .add("providerId", providerId) | ||
| 38 | + .add("deviceId", deviceId) | ||
| 39 | + .add("deviceDescription", deviceDescription) | ||
| 40 | + .toString(); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + // for serializer | ||
| 44 | + protected DeviceInjectedEvent() { | ||
| 45 | + this.providerId = null; | ||
| 46 | + this.deviceId = null; | ||
| 47 | + this.deviceDescription = null; | ||
| 48 | + } | ||
| 49 | +} |
This diff is collapsed. Click to expand it.
| ... | @@ -34,4 +34,8 @@ public final class GossipDeviceStoreMessageSubjects { | ... | @@ -34,4 +34,8 @@ public final class GossipDeviceStoreMessageSubjects { |
| 34 | public static final MessageSubject DEVICE_ADVERTISE = new MessageSubject("peer-device-advertisements"); | 34 | public static final MessageSubject DEVICE_ADVERTISE = new MessageSubject("peer-device-advertisements"); |
| 35 | // to be used with 3-way anti-entropy process | 35 | // to be used with 3-way anti-entropy process |
| 36 | public static final MessageSubject DEVICE_REQUEST = new MessageSubject("peer-device-request"); | 36 | public static final MessageSubject DEVICE_REQUEST = new MessageSubject("peer-device-request"); |
| 37 | + | ||
| 38 | + // Network elements injected (not discovered) by ConfigProvider | ||
| 39 | + public static final MessageSubject DEVICE_INJECTED = new MessageSubject("peer-device-injected"); | ||
| 40 | + public static final MessageSubject PORT_INJECTED = new MessageSubject("peer-port-injected"); | ||
| 37 | } | 41 | } | ... | ... |
| 1 | +package org.onosproject.store.device.impl; | ||
| 2 | + | ||
| 3 | +import com.google.common.base.MoreObjects; | ||
| 4 | +import org.onosproject.net.DeviceId; | ||
| 5 | +import org.onosproject.net.device.PortDescription; | ||
| 6 | +import org.onosproject.net.provider.ProviderId; | ||
| 7 | + | ||
| 8 | +import java.util.List; | ||
| 9 | + | ||
| 10 | +public class PortInjectedEvent { | ||
| 11 | + | ||
| 12 | + private ProviderId providerId; | ||
| 13 | + private DeviceId deviceId; | ||
| 14 | + private List<PortDescription> portDescriptions; | ||
| 15 | + | ||
| 16 | + protected PortInjectedEvent(ProviderId providerId, DeviceId deviceId, List<PortDescription> portDescriptions) { | ||
| 17 | + this.providerId = providerId; | ||
| 18 | + this.deviceId = deviceId; | ||
| 19 | + this.portDescriptions = portDescriptions; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public DeviceId deviceId() { | ||
| 23 | + return deviceId; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public ProviderId providerId() { | ||
| 27 | + return providerId; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + public List<PortDescription> portDescriptions() { | ||
| 31 | + return portDescriptions; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @Override | ||
| 35 | + public String toString() { | ||
| 36 | + return MoreObjects.toStringHelper(getClass()) | ||
| 37 | + .add("providerId", providerId) | ||
| 38 | + .add("deviceId", deviceId) | ||
| 39 | + .add("portDescriptions", portDescriptions) | ||
| 40 | + .toString(); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + // for serializer | ||
| 44 | + protected PortInjectedEvent() { | ||
| 45 | + this.providerId = null; | ||
| 46 | + this.deviceId = null; | ||
| 47 | + this.portDescriptions = null; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | +} |
| ... | @@ -32,6 +32,7 @@ import org.onlab.util.KryoNamespace; | ... | @@ -32,6 +32,7 @@ import org.onlab.util.KryoNamespace; |
| 32 | import org.onosproject.cluster.ClusterService; | 32 | import org.onosproject.cluster.ClusterService; |
| 33 | import org.onosproject.cluster.ControllerNode; | 33 | import org.onosproject.cluster.ControllerNode; |
| 34 | import org.onosproject.cluster.NodeId; | 34 | import org.onosproject.cluster.NodeId; |
| 35 | +import org.onosproject.mastership.MastershipService; | ||
| 35 | import org.onosproject.net.AnnotationKeys; | 36 | import org.onosproject.net.AnnotationKeys; |
| 36 | import org.onosproject.net.AnnotationsUtil; | 37 | import org.onosproject.net.AnnotationsUtil; |
| 37 | import org.onosproject.net.ConnectPoint; | 38 | import org.onosproject.net.ConnectPoint; |
| ... | @@ -90,9 +91,7 @@ import static org.onosproject.net.Link.State.INACTIVE; | ... | @@ -90,9 +91,7 @@ import static org.onosproject.net.Link.State.INACTIVE; |
| 90 | import static org.onosproject.net.Link.Type.DIRECT; | 91 | import static org.onosproject.net.Link.Type.DIRECT; |
| 91 | import static org.onosproject.net.Link.Type.INDIRECT; | 92 | import static org.onosproject.net.Link.Type.INDIRECT; |
| 92 | import static org.onosproject.net.LinkKey.linkKey; | 93 | import static org.onosproject.net.LinkKey.linkKey; |
| 93 | -import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED; | 94 | +import static org.onosproject.net.link.LinkEvent.Type.*; |
| 94 | -import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED; | ||
| 95 | -import static org.onosproject.net.link.LinkEvent.Type.LINK_UPDATED; | ||
| 96 | import static org.onosproject.store.link.impl.GossipLinkStoreMessageSubjects.LINK_ANTI_ENTROPY_ADVERTISEMENT; | 95 | import static org.onosproject.store.link.impl.GossipLinkStoreMessageSubjects.LINK_ANTI_ENTROPY_ADVERTISEMENT; |
| 97 | import static org.slf4j.LoggerFactory.getLogger; | 96 | import static org.slf4j.LoggerFactory.getLogger; |
| 98 | 97 | ||
| ... | @@ -106,6 +105,9 @@ public class GossipLinkStore | ... | @@ -106,6 +105,9 @@ public class GossipLinkStore |
| 106 | extends AbstractStore<LinkEvent, LinkStoreDelegate> | 105 | extends AbstractStore<LinkEvent, LinkStoreDelegate> |
| 107 | implements LinkStore { | 106 | implements LinkStore { |
| 108 | 107 | ||
| 108 | + // Timeout in milliseconds to process links on remote master node | ||
| 109 | + private static final int REMOTE_MASTER_TIMEOUT = 1000; | ||
| 110 | + | ||
| 109 | private final Logger log = getLogger(getClass()); | 111 | private final Logger log = getLogger(getClass()); |
| 110 | 112 | ||
| 111 | // Link inventory | 113 | // Link inventory |
| ... | @@ -131,6 +133,9 @@ public class GossipLinkStore | ... | @@ -131,6 +133,9 @@ public class GossipLinkStore |
| 131 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 133 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 132 | protected ClusterService clusterService; | 134 | protected ClusterService clusterService; |
| 133 | 135 | ||
| 136 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 137 | + protected MastershipService mastershipService; | ||
| 138 | + | ||
| 134 | protected static final KryoSerializer SERIALIZER = new KryoSerializer() { | 139 | protected static final KryoSerializer SERIALIZER = new KryoSerializer() { |
| 135 | @Override | 140 | @Override |
| 136 | protected void setupKryoPool() { | 141 | protected void setupKryoPool() { |
| ... | @@ -141,6 +146,7 @@ public class GossipLinkStore | ... | @@ -141,6 +146,7 @@ public class GossipLinkStore |
| 141 | .register(InternalLinkRemovedEvent.class) | 146 | .register(InternalLinkRemovedEvent.class) |
| 142 | .register(LinkAntiEntropyAdvertisement.class) | 147 | .register(LinkAntiEntropyAdvertisement.class) |
| 143 | .register(LinkFragmentId.class) | 148 | .register(LinkFragmentId.class) |
| 149 | + .register(LinkInjectedEvent.class) | ||
| 144 | .build(); | 150 | .build(); |
| 145 | } | 151 | } |
| 146 | }; | 152 | }; |
| ... | @@ -161,6 +167,9 @@ public class GossipLinkStore | ... | @@ -161,6 +167,9 @@ public class GossipLinkStore |
| 161 | clusterCommunicator.addSubscriber( | 167 | clusterCommunicator.addSubscriber( |
| 162 | GossipLinkStoreMessageSubjects.LINK_ANTI_ENTROPY_ADVERTISEMENT, | 168 | GossipLinkStoreMessageSubjects.LINK_ANTI_ENTROPY_ADVERTISEMENT, |
| 163 | new InternalLinkAntiEntropyAdvertisementListener()); | 169 | new InternalLinkAntiEntropyAdvertisementListener()); |
| 170 | + clusterCommunicator.addSubscriber( | ||
| 171 | + GossipLinkStoreMessageSubjects.LINK_INJECTED, | ||
| 172 | + new LinkInjectedEventListener()); | ||
| 164 | 173 | ||
| 165 | executor = Executors.newCachedThreadPool(namedThreads("onos-link-fg-%d")); | 174 | executor = Executors.newCachedThreadPool(namedThreads("onos-link-fg-%d")); |
| 166 | 175 | ||
| ... | @@ -270,27 +279,52 @@ public class GossipLinkStore | ... | @@ -270,27 +279,52 @@ public class GossipLinkStore |
| 270 | public LinkEvent createOrUpdateLink(ProviderId providerId, | 279 | public LinkEvent createOrUpdateLink(ProviderId providerId, |
| 271 | LinkDescription linkDescription) { | 280 | LinkDescription linkDescription) { |
| 272 | 281 | ||
| 273 | - DeviceId dstDeviceId = linkDescription.dst().deviceId(); | 282 | + final DeviceId dstDeviceId = linkDescription.dst().deviceId(); |
| 274 | - Timestamp newTimestamp = deviceClockService.getTimestamp(dstDeviceId); | 283 | + final NodeId localNode = clusterService.getLocalNode().id(); |
| 284 | + final NodeId dstNode = mastershipService.getMasterFor(dstDeviceId); | ||
| 275 | 285 | ||
| 276 | - final Timestamped<LinkDescription> deltaDesc = new Timestamped<>(linkDescription, newTimestamp); | 286 | + // Process link update only if we're the master of the destination node, |
| 287 | + // otherwise signal the actual master. | ||
| 288 | + LinkEvent linkEvent = null; | ||
| 289 | + if (localNode.equals(dstNode)) { | ||
| 277 | 290 | ||
| 278 | - LinkKey key = linkKey(linkDescription.src(), linkDescription.dst()); | 291 | + Timestamp newTimestamp = deviceClockService.getTimestamp(dstDeviceId); |
| 279 | - final LinkEvent event; | 292 | + |
| 280 | - final Timestamped<LinkDescription> mergedDesc; | 293 | + final Timestamped<LinkDescription> deltaDesc = new Timestamped<>(linkDescription, newTimestamp); |
| 281 | - Map<ProviderId, Timestamped<LinkDescription>> map = getOrCreateLinkDescriptions(key); | 294 | + |
| 282 | - synchronized (map) { | 295 | + LinkKey key = linkKey(linkDescription.src(), linkDescription.dst()); |
| 283 | - event = createOrUpdateLinkInternal(providerId, deltaDesc); | 296 | + final Timestamped<LinkDescription> mergedDesc; |
| 284 | - mergedDesc = map.get(providerId); | 297 | + Map<ProviderId, Timestamped<LinkDescription>> map = getOrCreateLinkDescriptions(key); |
| 285 | - } | 298 | + |
| 299 | + synchronized (map) { | ||
| 300 | + linkEvent = createOrUpdateLinkInternal(providerId, deltaDesc); | ||
| 301 | + mergedDesc = map.get(providerId); | ||
| 302 | + } | ||
| 303 | + | ||
| 304 | + if (linkEvent != null) { | ||
| 305 | + log.info("Notifying peers of a link update topology event from providerId: " | ||
| 306 | + + "{} between src: {} and dst: {}", | ||
| 307 | + providerId, linkDescription.src(), linkDescription.dst()); | ||
| 308 | + notifyPeers(new InternalLinkEvent(providerId, mergedDesc)); | ||
| 309 | + } | ||
| 310 | + | ||
| 311 | + } else { | ||
| 312 | + | ||
| 313 | + LinkInjectedEvent linkInjectedEvent = new LinkInjectedEvent(providerId, linkDescription); | ||
| 314 | + ClusterMessage linkInjectedMessage = new ClusterMessage(localNode, | ||
| 315 | + GossipLinkStoreMessageSubjects.LINK_INJECTED, SERIALIZER.encode(linkInjectedEvent)); | ||
| 316 | + | ||
| 317 | + try { | ||
| 318 | + clusterCommunicator.unicast(linkInjectedMessage, dstNode); | ||
| 319 | + } catch (IOException e) { | ||
| 320 | + log.warn("Failed to process link update between src: {} and dst: {} " + | ||
| 321 | + "(cluster messaging failed: {})", | ||
| 322 | + linkDescription.src(), linkDescription.dst(), e); | ||
| 323 | + } | ||
| 286 | 324 | ||
| 287 | - if (event != null) { | ||
| 288 | - log.info("Notifying peers of a link update topology event from providerId: " | ||
| 289 | - + "{} between src: {} and dst: {}", | ||
| 290 | - providerId, linkDescription.src(), linkDescription.dst()); | ||
| 291 | - notifyPeers(new InternalLinkEvent(providerId, mergedDesc)); | ||
| 292 | } | 325 | } |
| 293 | - return event; | 326 | + |
| 327 | + return linkEvent; | ||
| 294 | } | 328 | } |
| 295 | 329 | ||
| 296 | @Override | 330 | @Override |
| ... | @@ -318,7 +352,7 @@ public class GossipLinkStore | ... | @@ -318,7 +352,7 @@ public class GossipLinkStore |
| 318 | Timestamped<LinkDescription> linkDescription) { | 352 | Timestamped<LinkDescription> linkDescription) { |
| 319 | 353 | ||
| 320 | final LinkKey key = linkKey(linkDescription.value().src(), | 354 | final LinkKey key = linkKey(linkDescription.value().src(), |
| 321 | - linkDescription.value().dst()); | 355 | + linkDescription.value().dst()); |
| 322 | Map<ProviderId, Timestamped<LinkDescription>> descs = getOrCreateLinkDescriptions(key); | 356 | Map<ProviderId, Timestamped<LinkDescription>> descs = getOrCreateLinkDescriptions(key); |
| 323 | 357 | ||
| 324 | synchronized (descs) { | 358 | synchronized (descs) { |
| ... | @@ -397,7 +431,7 @@ public class GossipLinkStore | ... | @@ -397,7 +431,7 @@ public class GossipLinkStore |
| 397 | !AnnotationsUtil.isEqual(oldLink.annotations(), newLink.annotations())) { | 431 | !AnnotationsUtil.isEqual(oldLink.annotations(), newLink.annotations())) { |
| 398 | 432 | ||
| 399 | links.put(key, newLink); | 433 | links.put(key, newLink); |
| 400 | - // strictly speaking following can be ommitted | 434 | + // strictly speaking following can be omitted |
| 401 | srcLinks.put(oldLink.src().deviceId(), key); | 435 | srcLinks.put(oldLink.src().deviceId(), key); |
| 402 | dstLinks.put(oldLink.dst().deviceId(), key); | 436 | dstLinks.put(oldLink.dst().deviceId(), key); |
| 403 | return new LinkEvent(LINK_UPDATED, newLink); | 437 | return new LinkEvent(LINK_UPDATED, newLink); |
| ... | @@ -848,4 +882,25 @@ public class GossipLinkStore | ... | @@ -848,4 +882,25 @@ public class GossipLinkStore |
| 848 | }); | 882 | }); |
| 849 | } | 883 | } |
| 850 | } | 884 | } |
| 885 | + | ||
| 886 | + private final class LinkInjectedEventListener | ||
| 887 | + implements ClusterMessageHandler { | ||
| 888 | + @Override | ||
| 889 | + public void handle(ClusterMessage message) { | ||
| 890 | + | ||
| 891 | + log.trace("Received injected link event from peer: {}", message.sender()); | ||
| 892 | + LinkInjectedEvent linkInjectedEvent = SERIALIZER.decode(message.payload()); | ||
| 893 | + | ||
| 894 | + ProviderId providerId = linkInjectedEvent.providerId(); | ||
| 895 | + LinkDescription linkDescription = linkInjectedEvent.linkDescription(); | ||
| 896 | + | ||
| 897 | + executor.submit(new Runnable() { | ||
| 898 | + | ||
| 899 | + @Override | ||
| 900 | + public void run() { | ||
| 901 | + createOrUpdateLink(providerId, linkDescription); | ||
| 902 | + } | ||
| 903 | + }); | ||
| 904 | + } | ||
| 905 | + } | ||
| 851 | } | 906 | } | ... | ... |
| ... | @@ -15,7 +15,7 @@ | ... | @@ -15,7 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.store.link.impl; | 16 | package org.onosproject.store.link.impl; |
| 17 | 17 | ||
| 18 | -import org.onosproject.store.cluster.messaging.MessageSubject; | 18 | + import org.onosproject.store.cluster.messaging.MessageSubject; |
| 19 | 19 | ||
| 20 | /** | 20 | /** |
| 21 | * MessageSubjects used by GossipLinkStore peer-peer communication. | 21 | * MessageSubjects used by GossipLinkStore peer-peer communication. |
| ... | @@ -30,4 +30,6 @@ public final class GossipLinkStoreMessageSubjects { | ... | @@ -30,4 +30,6 @@ public final class GossipLinkStoreMessageSubjects { |
| 30 | new MessageSubject("peer-link-removed"); | 30 | new MessageSubject("peer-link-removed"); |
| 31 | public static final MessageSubject LINK_ANTI_ENTROPY_ADVERTISEMENT = | 31 | public static final MessageSubject LINK_ANTI_ENTROPY_ADVERTISEMENT = |
| 32 | new MessageSubject("link-enti-entropy-advertisement"); | 32 | new MessageSubject("link-enti-entropy-advertisement"); |
| 33 | + public static final MessageSubject LINK_INJECTED = | ||
| 34 | + new MessageSubject("peer-link-injected"); | ||
| 33 | } | 35 | } | ... | ... |
| 1 | +package org.onosproject.store.link.impl; | ||
| 2 | + | ||
| 3 | +import com.google.common.base.MoreObjects; | ||
| 4 | +import org.onosproject.net.link.LinkDescription; | ||
| 5 | +import org.onosproject.net.provider.ProviderId; | ||
| 6 | + | ||
| 7 | +public class LinkInjectedEvent { | ||
| 8 | + | ||
| 9 | + ProviderId providerId; | ||
| 10 | + LinkDescription linkDescription; | ||
| 11 | + | ||
| 12 | + public LinkInjectedEvent(ProviderId providerId, LinkDescription linkDescription) { | ||
| 13 | + this.providerId = providerId; | ||
| 14 | + this.linkDescription = linkDescription; | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + public ProviderId providerId() { | ||
| 18 | + return providerId; | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + public LinkDescription linkDescription() { | ||
| 22 | + return linkDescription; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + @Override | ||
| 26 | + public String toString() { | ||
| 27 | + return MoreObjects.toStringHelper(getClass()) | ||
| 28 | + .add("providerId", providerId) | ||
| 29 | + .add("linkDescription", linkDescription) | ||
| 30 | + .toString(); | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + // for serializer | ||
| 34 | + protected LinkInjectedEvent() { | ||
| 35 | + this.providerId = null; | ||
| 36 | + this.linkDescription = null; | ||
| 37 | + } | ||
| 38 | +} |
| ... | @@ -27,6 +27,8 @@ import org.onlab.packet.IpAddress; | ... | @@ -27,6 +27,8 @@ import org.onlab.packet.IpAddress; |
| 27 | import org.onosproject.cluster.ControllerNode; | 27 | import org.onosproject.cluster.ControllerNode; |
| 28 | import org.onosproject.cluster.DefaultControllerNode; | 28 | import org.onosproject.cluster.DefaultControllerNode; |
| 29 | import org.onosproject.cluster.NodeId; | 29 | import org.onosproject.cluster.NodeId; |
| 30 | +import org.onosproject.mastership.MastershipService; | ||
| 31 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 30 | import org.onosproject.mastership.MastershipTerm; | 32 | import org.onosproject.mastership.MastershipTerm; |
| 31 | import org.onosproject.net.ConnectPoint; | 33 | import org.onosproject.net.ConnectPoint; |
| 32 | import org.onosproject.net.DefaultAnnotations; | 34 | import org.onosproject.net.DefaultAnnotations; |
| ... | @@ -115,7 +117,7 @@ public class GossipLinkStoreTest { | ... | @@ -115,7 +117,7 @@ public class GossipLinkStoreTest { |
| 115 | private DeviceClockManager deviceClockManager; | 117 | private DeviceClockManager deviceClockManager; |
| 116 | private DeviceClockService deviceClockService; | 118 | private DeviceClockService deviceClockService; |
| 117 | private ClusterCommunicationService clusterCommunicator; | 119 | private ClusterCommunicationService clusterCommunicator; |
| 118 | - | 120 | + private MastershipService mastershipService; |
| 119 | 121 | ||
| 120 | @BeforeClass | 122 | @BeforeClass |
| 121 | public static void setUpBeforeClass() throws Exception { | 123 | public static void setUpBeforeClass() throws Exception { |
| ... | @@ -146,11 +148,13 @@ public class GossipLinkStoreTest { | ... | @@ -146,11 +148,13 @@ public class GossipLinkStoreTest { |
| 146 | linkStoreImpl.deviceClockService = deviceClockService; | 148 | linkStoreImpl.deviceClockService = deviceClockService; |
| 147 | linkStoreImpl.clusterCommunicator = clusterCommunicator; | 149 | linkStoreImpl.clusterCommunicator = clusterCommunicator; |
| 148 | linkStoreImpl.clusterService = new TestClusterService(); | 150 | linkStoreImpl.clusterService = new TestClusterService(); |
| 151 | + linkStoreImpl.mastershipService = new TestMastershipService(); | ||
| 149 | linkStoreImpl.activate(); | 152 | linkStoreImpl.activate(); |
| 150 | linkStore = linkStoreImpl; | 153 | linkStore = linkStoreImpl; |
| 151 | 154 | ||
| 152 | verify(clusterCommunicator); | 155 | verify(clusterCommunicator); |
| 153 | reset(clusterCommunicator); | 156 | reset(clusterCommunicator); |
| 157 | + | ||
| 154 | } | 158 | } |
| 155 | 159 | ||
| 156 | @After | 160 | @After |
| ... | @@ -602,4 +606,11 @@ public class GossipLinkStoreTest { | ... | @@ -602,4 +606,11 @@ public class GossipLinkStoreTest { |
| 602 | nodeStates.put(NID2, ACTIVE); | 606 | nodeStates.put(NID2, ACTIVE); |
| 603 | } | 607 | } |
| 604 | } | 608 | } |
| 609 | + | ||
| 610 | + private final class TestMastershipService extends MastershipServiceAdapter { | ||
| 611 | + @Override | ||
| 612 | + public NodeId getMasterFor(DeviceId deviceId) { | ||
| 613 | + return NID1; | ||
| 614 | + } | ||
| 615 | + } | ||
| 605 | } | 616 | } | ... | ... |
-
Please register or login to post a comment