Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
7 changed files
with
111 additions
and
325 deletions
This diff is collapsed. Click to expand it.
core/store/dist/src/main/java/org/onlab/onos/store/link/impl/GossipLinkStoreMessageSubjects.java
0 → 100644
| 1 | +package org.onlab.onos.store.link.impl; | ||
| 2 | + | ||
| 3 | +import org.onlab.onos.store.cluster.messaging.MessageSubject; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * MessageSubjects used by GossipLinkStore peer-peer communication. | ||
| 7 | + */ | ||
| 8 | +public final class GossipLinkStoreMessageSubjects { | ||
| 9 | + | ||
| 10 | + private GossipLinkStoreMessageSubjects() {} | ||
| 11 | + | ||
| 12 | + public static final MessageSubject LINK_UPDATE = new MessageSubject("peer-link-update"); | ||
| 13 | + public static final MessageSubject LINK_REMOVED = new MessageSubject("peer-link-removed"); | ||
| 14 | +} |
| 1 | +package org.onlab.onos.store.link.impl; | ||
| 2 | + | ||
| 3 | +import com.google.common.base.MoreObjects; | ||
| 4 | + | ||
| 5 | +import org.onlab.onos.net.link.LinkDescription; | ||
| 6 | +import org.onlab.onos.net.provider.ProviderId; | ||
| 7 | +import org.onlab.onos.store.common.impl.Timestamped; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * Information published by GossipDeviceStore to notify peers of a device | ||
| 11 | + * change event. | ||
| 12 | + */ | ||
| 13 | +public class InternalLinkEvent { | ||
| 14 | + | ||
| 15 | + private final ProviderId providerId; | ||
| 16 | + private final Timestamped<LinkDescription> linkDescription; | ||
| 17 | + | ||
| 18 | + protected InternalLinkEvent( | ||
| 19 | + ProviderId providerId, | ||
| 20 | + Timestamped<LinkDescription> linkDescription) { | ||
| 21 | + this.providerId = providerId; | ||
| 22 | + this.linkDescription = linkDescription; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + public ProviderId providerId() { | ||
| 26 | + return providerId; | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + public Timestamped<LinkDescription> linkDescription() { | ||
| 30 | + return linkDescription; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + @Override | ||
| 34 | + public String toString() { | ||
| 35 | + return MoreObjects.toStringHelper(getClass()) | ||
| 36 | + .add("providerId", providerId) | ||
| 37 | + .add("linkDescription", linkDescription) | ||
| 38 | + .toString(); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + // for serializer | ||
| 42 | + protected InternalLinkEvent() { | ||
| 43 | + this.providerId = null; | ||
| 44 | + this.linkDescription = null; | ||
| 45 | + } | ||
| 46 | +} |
core/store/dist/src/main/java/org/onlab/onos/store/link/impl/InternalLinkRemovedEvent.java
0 → 100644
| 1 | +package org.onlab.onos.store.link.impl; | ||
| 2 | + | ||
| 3 | +import org.onlab.onos.net.LinkKey; | ||
| 4 | +import org.onlab.onos.store.Timestamp; | ||
| 5 | + | ||
| 6 | +import com.google.common.base.MoreObjects; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * Information published by GossipLinkStore to notify peers of a link | ||
| 10 | + * being removed. | ||
| 11 | + */ | ||
| 12 | +public class InternalLinkRemovedEvent { | ||
| 13 | + | ||
| 14 | + private final LinkKey linkKey; | ||
| 15 | + private final Timestamp timestamp; | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * Creates a InternalLinkRemovedEvent. | ||
| 19 | + * @param linkKey identifier of the removed link. | ||
| 20 | + * @param timestamp timestamp of when the link was removed. | ||
| 21 | + */ | ||
| 22 | + public InternalLinkRemovedEvent(LinkKey linkKey, Timestamp timestamp) { | ||
| 23 | + this.linkKey = linkKey; | ||
| 24 | + this.timestamp = timestamp; | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + public LinkKey linkKey() { | ||
| 28 | + return linkKey; | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + public Timestamp timestamp() { | ||
| 32 | + return timestamp; | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + @Override | ||
| 36 | + public String toString() { | ||
| 37 | + return MoreObjects.toStringHelper(getClass()) | ||
| 38 | + .add("linkKey", linkKey) | ||
| 39 | + .add("timestamp", timestamp) | ||
| 40 | + .toString(); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + // for serializer | ||
| 44 | + @SuppressWarnings("unused") | ||
| 45 | + private InternalLinkRemovedEvent() { | ||
| 46 | + linkKey = null; | ||
| 47 | + timestamp = null; | ||
| 48 | + } | ||
| 49 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
core/store/dist/src/main/java/org/onlab/onos/store/link/impl/OnosDistributedLinkStore.java
deleted
100644 → 0
| 1 | -package org.onlab.onos.store.link.impl; | ||
| 2 | - | ||
| 3 | -import static org.onlab.onos.net.Link.Type.DIRECT; | ||
| 4 | -import static org.onlab.onos.net.Link.Type.INDIRECT; | ||
| 5 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_ADDED; | ||
| 6 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED; | ||
| 7 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_UPDATED; | ||
| 8 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 9 | - | ||
| 10 | -import java.util.HashSet; | ||
| 11 | -import java.util.Set; | ||
| 12 | -import java.util.concurrent.ConcurrentHashMap; | ||
| 13 | -import java.util.concurrent.ConcurrentMap; | ||
| 14 | - | ||
| 15 | -import org.apache.felix.scr.annotations.Activate; | ||
| 16 | -import org.apache.felix.scr.annotations.Component; | ||
| 17 | -import org.apache.felix.scr.annotations.Deactivate; | ||
| 18 | -import org.apache.felix.scr.annotations.Reference; | ||
| 19 | -import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 20 | -import org.apache.felix.scr.annotations.Service; | ||
| 21 | -import org.onlab.onos.net.ConnectPoint; | ||
| 22 | -import org.onlab.onos.net.DefaultLink; | ||
| 23 | -import org.onlab.onos.net.DeviceId; | ||
| 24 | -import org.onlab.onos.net.Link; | ||
| 25 | -import org.onlab.onos.net.LinkKey; | ||
| 26 | -import org.onlab.onos.net.link.LinkDescription; | ||
| 27 | -import org.onlab.onos.net.link.LinkEvent; | ||
| 28 | -import org.onlab.onos.net.link.LinkStore; | ||
| 29 | -import org.onlab.onos.net.link.LinkStoreDelegate; | ||
| 30 | -import org.onlab.onos.net.provider.ProviderId; | ||
| 31 | -import org.onlab.onos.store.AbstractStore; | ||
| 32 | -import org.onlab.onos.store.ClockService; | ||
| 33 | -import org.onlab.onos.store.Timestamp; | ||
| 34 | -import org.slf4j.Logger; | ||
| 35 | - | ||
| 36 | -import com.google.common.collect.HashMultimap; | ||
| 37 | -import com.google.common.collect.ImmutableSet; | ||
| 38 | -import com.google.common.collect.Multimap; | ||
| 39 | -import com.google.common.collect.ImmutableSet.Builder; | ||
| 40 | - | ||
| 41 | -import static com.google.common.base.Preconditions.checkArgument; | ||
| 42 | -import static com.google.common.base.Preconditions.checkState; | ||
| 43 | - | ||
| 44 | -//TODO: Add support for multiple provider and annotations | ||
| 45 | -/** | ||
| 46 | - * Manages inventory of infrastructure links using a protocol that takes into consideration | ||
| 47 | - * the order in which events occur. | ||
| 48 | - */ | ||
| 49 | -// FIXME: This does not yet implement the full protocol. | ||
| 50 | -// The full protocol requires the sender of LLDP message to include the | ||
| 51 | -// version information of src device/port and the receiver to | ||
| 52 | -// take that into account when figuring out if a more recent src | ||
| 53 | -// device/port down event renders the link discovery obsolete. | ||
| 54 | -@Component(immediate = true) | ||
| 55 | -@Service | ||
| 56 | -public class OnosDistributedLinkStore | ||
| 57 | - extends AbstractStore<LinkEvent, LinkStoreDelegate> | ||
| 58 | - implements LinkStore { | ||
| 59 | - | ||
| 60 | - private final Logger log = getLogger(getClass()); | ||
| 61 | - | ||
| 62 | - // Link inventory | ||
| 63 | - private ConcurrentMap<LinkKey, VersionedValue<Link>> links; | ||
| 64 | - | ||
| 65 | - public static final String LINK_NOT_FOUND = "Link between %s and %s not found"; | ||
| 66 | - | ||
| 67 | - // TODO synchronize? | ||
| 68 | - // Egress and ingress link sets | ||
| 69 | - private final Multimap<DeviceId, VersionedValue<Link>> srcLinks = HashMultimap.create(); | ||
| 70 | - private final Multimap<DeviceId, VersionedValue<Link>> dstLinks = HashMultimap.create(); | ||
| 71 | - | ||
| 72 | - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 73 | - protected ClockService clockService; | ||
| 74 | - | ||
| 75 | - @Activate | ||
| 76 | - public void activate() { | ||
| 77 | - | ||
| 78 | - links = new ConcurrentHashMap<>(); | ||
| 79 | - | ||
| 80 | - log.info("Started"); | ||
| 81 | - } | ||
| 82 | - | ||
| 83 | - @Deactivate | ||
| 84 | - public void deactivate() { | ||
| 85 | - log.info("Stopped"); | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - @Override | ||
| 89 | - public int getLinkCount() { | ||
| 90 | - return links.size(); | ||
| 91 | - } | ||
| 92 | - | ||
| 93 | - @Override | ||
| 94 | - public Iterable<Link> getLinks() { | ||
| 95 | - Builder<Link> builder = ImmutableSet.builder(); | ||
| 96 | - synchronized (this) { | ||
| 97 | - for (VersionedValue<Link> link : links.values()) { | ||
| 98 | - builder.add(link.entity()); | ||
| 99 | - } | ||
| 100 | - return builder.build(); | ||
| 101 | - } | ||
| 102 | - } | ||
| 103 | - | ||
| 104 | - @Override | ||
| 105 | - public Set<Link> getDeviceEgressLinks(DeviceId deviceId) { | ||
| 106 | - Set<VersionedValue<Link>> egressLinks = ImmutableSet.copyOf(srcLinks.get(deviceId)); | ||
| 107 | - Set<Link> rawEgressLinks = new HashSet<>(); | ||
| 108 | - for (VersionedValue<Link> link : egressLinks) { | ||
| 109 | - rawEgressLinks.add(link.entity()); | ||
| 110 | - } | ||
| 111 | - return rawEgressLinks; | ||
| 112 | - } | ||
| 113 | - | ||
| 114 | - @Override | ||
| 115 | - public Set<Link> getDeviceIngressLinks(DeviceId deviceId) { | ||
| 116 | - Set<VersionedValue<Link>> ingressLinks = ImmutableSet.copyOf(dstLinks.get(deviceId)); | ||
| 117 | - Set<Link> rawIngressLinks = new HashSet<>(); | ||
| 118 | - for (VersionedValue<Link> link : ingressLinks) { | ||
| 119 | - rawIngressLinks.add(link.entity()); | ||
| 120 | - } | ||
| 121 | - return rawIngressLinks; | ||
| 122 | - } | ||
| 123 | - | ||
| 124 | - @Override | ||
| 125 | - public Link getLink(ConnectPoint src, ConnectPoint dst) { | ||
| 126 | - VersionedValue<Link> link = links.get(new LinkKey(src, dst)); | ||
| 127 | - checkArgument(link != null, "LINK_NOT_FOUND", src, dst); | ||
| 128 | - return link.entity(); | ||
| 129 | - } | ||
| 130 | - | ||
| 131 | - @Override | ||
| 132 | - public Set<Link> getEgressLinks(ConnectPoint src) { | ||
| 133 | - Set<Link> egressLinks = new HashSet<>(); | ||
| 134 | - for (VersionedValue<Link> link : srcLinks.get(src.deviceId())) { | ||
| 135 | - if (link.entity().src().equals(src)) { | ||
| 136 | - egressLinks.add(link.entity()); | ||
| 137 | - } | ||
| 138 | - } | ||
| 139 | - return egressLinks; | ||
| 140 | - } | ||
| 141 | - | ||
| 142 | - @Override | ||
| 143 | - public Set<Link> getIngressLinks(ConnectPoint dst) { | ||
| 144 | - Set<Link> ingressLinks = new HashSet<>(); | ||
| 145 | - for (VersionedValue<Link> link : dstLinks.get(dst.deviceId())) { | ||
| 146 | - if (link.entity().dst().equals(dst)) { | ||
| 147 | - ingressLinks.add(link.entity()); | ||
| 148 | - } | ||
| 149 | - } | ||
| 150 | - return ingressLinks; | ||
| 151 | - } | ||
| 152 | - | ||
| 153 | - @Override | ||
| 154 | - public LinkEvent createOrUpdateLink(ProviderId providerId, | ||
| 155 | - LinkDescription linkDescription) { | ||
| 156 | - | ||
| 157 | - final DeviceId destinationDeviceId = linkDescription.dst().deviceId(); | ||
| 158 | - final Timestamp newTimestamp = clockService.getTimestamp(destinationDeviceId); | ||
| 159 | - | ||
| 160 | - LinkKey key = new LinkKey(linkDescription.src(), linkDescription.dst()); | ||
| 161 | - VersionedValue<Link> link = links.get(key); | ||
| 162 | - if (link == null) { | ||
| 163 | - return createLink(providerId, key, linkDescription, newTimestamp); | ||
| 164 | - } | ||
| 165 | - | ||
| 166 | - checkState(newTimestamp.compareTo(link.timestamp()) > 0, | ||
| 167 | - "Existing Link has a timestamp in the future!"); | ||
| 168 | - | ||
| 169 | - return updateLink(providerId, link, key, linkDescription, newTimestamp); | ||
| 170 | - } | ||
| 171 | - | ||
| 172 | - // Creates and stores the link and returns the appropriate event. | ||
| 173 | - private LinkEvent createLink(ProviderId providerId, LinkKey key, | ||
| 174 | - LinkDescription linkDescription, Timestamp timestamp) { | ||
| 175 | - VersionedValue<Link> link = new VersionedValue<Link>(new DefaultLink(providerId, key.src(), key.dst(), | ||
| 176 | - linkDescription.type()), true, timestamp); | ||
| 177 | - synchronized (this) { | ||
| 178 | - links.put(key, link); | ||
| 179 | - addNewLink(link, timestamp); | ||
| 180 | - } | ||
| 181 | - // FIXME: notify peers. | ||
| 182 | - return new LinkEvent(LINK_ADDED, link.entity()); | ||
| 183 | - } | ||
| 184 | - | ||
| 185 | - // update Egress and ingress link sets | ||
| 186 | - private void addNewLink(VersionedValue<Link> link, Timestamp timestamp) { | ||
| 187 | - Link rawLink = link.entity(); | ||
| 188 | - synchronized (this) { | ||
| 189 | - srcLinks.put(rawLink.src().deviceId(), link); | ||
| 190 | - dstLinks.put(rawLink.dst().deviceId(), link); | ||
| 191 | - } | ||
| 192 | - } | ||
| 193 | - | ||
| 194 | - // Updates, if necessary the specified link and returns the appropriate event. | ||
| 195 | - private LinkEvent updateLink(ProviderId providerId, VersionedValue<Link> existingLink, | ||
| 196 | - LinkKey key, LinkDescription linkDescription, Timestamp timestamp) { | ||
| 197 | - // FIXME confirm Link update condition is OK | ||
| 198 | - if (existingLink.entity().type() == INDIRECT && linkDescription.type() == DIRECT) { | ||
| 199 | - synchronized (this) { | ||
| 200 | - | ||
| 201 | - VersionedValue<Link> updatedLink = new VersionedValue<Link>( | ||
| 202 | - new DefaultLink(providerId, existingLink.entity().src(), existingLink.entity().dst(), | ||
| 203 | - linkDescription.type()), true, timestamp); | ||
| 204 | - links.replace(key, existingLink, updatedLink); | ||
| 205 | - | ||
| 206 | - replaceLink(existingLink, updatedLink); | ||
| 207 | - // FIXME: notify peers. | ||
| 208 | - return new LinkEvent(LINK_UPDATED, updatedLink.entity()); | ||
| 209 | - } | ||
| 210 | - } | ||
| 211 | - return null; | ||
| 212 | - } | ||
| 213 | - | ||
| 214 | - // update Egress and ingress link sets | ||
| 215 | - private void replaceLink(VersionedValue<Link> current, VersionedValue<Link> updated) { | ||
| 216 | - synchronized (this) { | ||
| 217 | - srcLinks.remove(current.entity().src().deviceId(), current); | ||
| 218 | - dstLinks.remove(current.entity().dst().deviceId(), current); | ||
| 219 | - | ||
| 220 | - srcLinks.put(current.entity().src().deviceId(), updated); | ||
| 221 | - dstLinks.put(current.entity().dst().deviceId(), updated); | ||
| 222 | - } | ||
| 223 | - } | ||
| 224 | - | ||
| 225 | - @Override | ||
| 226 | - public LinkEvent removeLink(ConnectPoint src, ConnectPoint dst) { | ||
| 227 | - synchronized (this) { | ||
| 228 | - LinkKey key = new LinkKey(src, dst); | ||
| 229 | - VersionedValue<Link> link = links.remove(key); | ||
| 230 | - if (link != null) { | ||
| 231 | - removeLink(link); | ||
| 232 | - // notify peers | ||
| 233 | - return new LinkEvent(LINK_REMOVED, link.entity()); | ||
| 234 | - } | ||
| 235 | - return null; | ||
| 236 | - } | ||
| 237 | - } | ||
| 238 | - | ||
| 239 | - // update Egress and ingress link sets | ||
| 240 | - private void removeLink(VersionedValue<Link> link) { | ||
| 241 | - synchronized (this) { | ||
| 242 | - srcLinks.remove(link.entity().src().deviceId(), link); | ||
| 243 | - dstLinks.remove(link.entity().dst().deviceId(), link); | ||
| 244 | - } | ||
| 245 | - } | ||
| 246 | -} |
| 1 | -package org.onlab.onos.store.link.impl; | ||
| 2 | - | ||
| 3 | -import java.util.Objects; | ||
| 4 | - | ||
| 5 | -import org.onlab.onos.store.Timestamp; | ||
| 6 | - | ||
| 7 | -// TODO: remove once we stop using this | ||
| 8 | -/** | ||
| 9 | - * Wrapper class for a entity that is versioned | ||
| 10 | - * and can either be up or down. | ||
| 11 | - * | ||
| 12 | - * @param <T> type of the value. | ||
| 13 | - */ | ||
| 14 | -public class VersionedValue<T> { | ||
| 15 | - private final T entity; | ||
| 16 | - private final Timestamp timestamp; | ||
| 17 | - private final boolean isUp; | ||
| 18 | - | ||
| 19 | - public VersionedValue(T entity, boolean isUp, Timestamp timestamp) { | ||
| 20 | - this.entity = entity; | ||
| 21 | - this.isUp = isUp; | ||
| 22 | - this.timestamp = timestamp; | ||
| 23 | - } | ||
| 24 | - | ||
| 25 | - /** | ||
| 26 | - * Returns the value. | ||
| 27 | - * @return value. | ||
| 28 | - */ | ||
| 29 | - public T entity() { | ||
| 30 | - return entity; | ||
| 31 | - } | ||
| 32 | - | ||
| 33 | - /** | ||
| 34 | - * Tells whether the entity is up or down. | ||
| 35 | - * @return true if up, false otherwise. | ||
| 36 | - */ | ||
| 37 | - public boolean isUp() { | ||
| 38 | - return isUp; | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - /** | ||
| 42 | - * Returns the timestamp (version) associated with this entity. | ||
| 43 | - * @return timestamp. | ||
| 44 | - */ | ||
| 45 | - public Timestamp timestamp() { | ||
| 46 | - return timestamp; | ||
| 47 | - } | ||
| 48 | - | ||
| 49 | - | ||
| 50 | - @Override | ||
| 51 | - public int hashCode() { | ||
| 52 | - return Objects.hash(entity, timestamp, isUp); | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - @Override | ||
| 56 | - public boolean equals(Object obj) { | ||
| 57 | - if (this == obj) { | ||
| 58 | - return true; | ||
| 59 | - } | ||
| 60 | - if (obj == null) { | ||
| 61 | - return false; | ||
| 62 | - } | ||
| 63 | - if (getClass() != obj.getClass()) { | ||
| 64 | - return false; | ||
| 65 | - } | ||
| 66 | - @SuppressWarnings("unchecked") | ||
| 67 | - VersionedValue<T> that = (VersionedValue<T>) obj; | ||
| 68 | - return Objects.equals(this.entity, that.entity) && | ||
| 69 | - Objects.equals(this.timestamp, that.timestamp) && | ||
| 70 | - Objects.equals(this.isUp, that.isUp); | ||
| 71 | - } | ||
| 72 | - | ||
| 73 | - // Default constructor for serializer | ||
| 74 | - protected VersionedValue() { | ||
| 75 | - this.entity = null; | ||
| 76 | - this.isUp = false; | ||
| 77 | - this.timestamp = null; | ||
| 78 | - } | ||
| 79 | -} |
| ... | @@ -24,6 +24,7 @@ import org.onlab.onos.net.Port; | ... | @@ -24,6 +24,7 @@ import org.onlab.onos.net.Port; |
| 24 | import org.onlab.onos.net.PortNumber; | 24 | import org.onlab.onos.net.PortNumber; |
| 25 | import org.onlab.onos.net.device.DefaultDeviceDescription; | 25 | import org.onlab.onos.net.device.DefaultDeviceDescription; |
| 26 | import org.onlab.onos.net.device.DefaultPortDescription; | 26 | import org.onlab.onos.net.device.DefaultPortDescription; |
| 27 | +import org.onlab.onos.net.link.DefaultLinkDescription; | ||
| 27 | import org.onlab.onos.net.provider.ProviderId; | 28 | import org.onlab.onos.net.provider.ProviderId; |
| 28 | import org.onlab.onos.store.Timestamp; | 29 | import org.onlab.onos.store.Timestamp; |
| 29 | import org.onlab.packet.IpAddress; | 30 | import org.onlab.packet.IpAddress; |
| ... | @@ -58,6 +59,7 @@ public final class KryoPoolUtil { | ... | @@ -58,6 +59,7 @@ public final class KryoPoolUtil { |
| 58 | DefaultControllerNode.class, | 59 | DefaultControllerNode.class, |
| 59 | DefaultDevice.class, | 60 | DefaultDevice.class, |
| 60 | DefaultDeviceDescription.class, | 61 | DefaultDeviceDescription.class, |
| 62 | + DefaultLinkDescription.class, | ||
| 61 | MastershipRole.class, | 63 | MastershipRole.class, |
| 62 | Port.class, | 64 | Port.class, |
| 63 | DefaultPortDescription.class, | 65 | DefaultPortDescription.class, | ... | ... |
-
Please register or login to post a comment