Committed by
Gerrit Code Review
ONOS-3633 - Adding intent event listener to PointToPointIntent virtual network
provider. Intent events will either set the virtual link state to ACTIVE or INACTIVE. Change-Id: I34b65b2bfff29b791e7b2eb4d7cefb2ec4e88672
Showing
14 changed files
with
268 additions
and
118 deletions
| ... | @@ -34,7 +34,7 @@ import java.util.List; | ... | @@ -34,7 +34,7 @@ import java.util.List; |
| 34 | public class VirtualLinkListCommand extends AbstractShellCommand { | 34 | public class VirtualLinkListCommand extends AbstractShellCommand { |
| 35 | 35 | ||
| 36 | private static final String FMT_VIRTUAL_LINK = | 36 | private static final String FMT_VIRTUAL_LINK = |
| 37 | - "src=%s, dst=%s, tunnelId=%s"; | 37 | + "src=%s, dst=%s, state=%s, tunnelId=%s"; |
| 38 | 38 | ||
| 39 | @Argument(index = 0, name = "networkId", description = "Network ID", | 39 | @Argument(index = 0, name = "networkId", description = "Network ID", |
| 40 | required = true, multiValued = false) | 40 | required = true, multiValued = false) |
| ... | @@ -66,6 +66,7 @@ public class VirtualLinkListCommand extends AbstractShellCommand { | ... | @@ -66,6 +66,7 @@ public class VirtualLinkListCommand extends AbstractShellCommand { |
| 66 | */ | 66 | */ |
| 67 | private void printVirtualLink(VirtualLink virtualLink) { | 67 | private void printVirtualLink(VirtualLink virtualLink) { |
| 68 | print(FMT_VIRTUAL_LINK, virtualLink.src().toString(), virtualLink.dst().toString(), | 68 | print(FMT_VIRTUAL_LINK, virtualLink.src().toString(), virtualLink.dst().toString(), |
| 69 | + virtualLink.state(), | ||
| 69 | virtualLink.tunnelId() == null ? null : virtualLink.tunnelId().toString()); | 70 | virtualLink.tunnelId() == null ? null : virtualLink.tunnelId().toString()); |
| 70 | } | 71 | } |
| 71 | } | 72 | } | ... | ... |
| ... | @@ -42,7 +42,7 @@ public class DefaultEdgeLink extends DefaultLink implements EdgeLink { | ... | @@ -42,7 +42,7 @@ public class DefaultEdgeLink extends DefaultLink implements EdgeLink { |
| 42 | HostLocation hostLocation, boolean isIngress, | 42 | HostLocation hostLocation, boolean isIngress, |
| 43 | Annotations... annotations) { | 43 | Annotations... annotations) { |
| 44 | super(providerId, isIngress ? hostPoint : hostLocation, | 44 | super(providerId, isIngress ? hostPoint : hostLocation, |
| 45 | - isIngress ? hostLocation : hostPoint, Type.EDGE, annotations); | 45 | + isIngress ? hostLocation : hostPoint, Type.EDGE, State.ACTIVE, annotations); |
| 46 | checkArgument(hostPoint.elementId() instanceof HostId, | 46 | checkArgument(hostPoint.elementId() instanceof HostId, |
| 47 | "Host point does not refer to a host ID"); | 47 | "Host point does not refer to a host ID"); |
| 48 | this.hostId = (HostId) hostPoint.elementId(); | 48 | this.hostId = (HostId) hostPoint.elementId(); | ... | ... |
| ... | @@ -36,17 +36,18 @@ public class DefaultLink extends AbstractProjectableModel implements Link { | ... | @@ -36,17 +36,18 @@ public class DefaultLink extends AbstractProjectableModel implements Link { |
| 36 | private final boolean isExpected; | 36 | private final boolean isExpected; |
| 37 | 37 | ||
| 38 | /** | 38 | /** |
| 39 | - * Creates an active infrastructure link using the supplied information. | 39 | + * Creates an infrastructure link using the supplied information. |
| 40 | * | 40 | * |
| 41 | * @param providerId provider identity | 41 | * @param providerId provider identity |
| 42 | * @param src link source | 42 | * @param src link source |
| 43 | * @param dst link destination | 43 | * @param dst link destination |
| 44 | * @param type link type | 44 | * @param type link type |
| 45 | + * @param state link state | ||
| 45 | * @param annotations optional key/value annotations | 46 | * @param annotations optional key/value annotations |
| 46 | */ | 47 | */ |
| 47 | protected DefaultLink(ProviderId providerId, ConnectPoint src, ConnectPoint dst, | 48 | protected DefaultLink(ProviderId providerId, ConnectPoint src, ConnectPoint dst, |
| 48 | - Type type, Annotations... annotations) { | 49 | + Type type, State state, Annotations... annotations) { |
| 49 | - this(providerId, src, dst, type, ACTIVE, false, annotations); | 50 | + this(providerId, src, dst, type, state, false, annotations); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | /** | 53 | /** | ... | ... |
| ... | @@ -44,7 +44,7 @@ public class DefaultPath extends DefaultLink implements Path { | ... | @@ -44,7 +44,7 @@ public class DefaultPath extends DefaultLink implements Path { |
| 44 | */ | 44 | */ |
| 45 | public DefaultPath(ProviderId providerId, List<Link> links, double cost, | 45 | public DefaultPath(ProviderId providerId, List<Link> links, double cost, |
| 46 | Annotations... annotations) { | 46 | Annotations... annotations) { |
| 47 | - super(providerId, source(links), destination(links), Type.INDIRECT, annotations); | 47 | + super(providerId, source(links), destination(links), Type.INDIRECT, State.ACTIVE, annotations); |
| 48 | this.links = ImmutableList.copyOf(links); | 48 | this.links = ImmutableList.copyOf(links); |
| 49 | this.cost = cost; | 49 | this.cost = cost; |
| 50 | } | 50 | } | ... | ... |
| ... | @@ -42,11 +42,11 @@ public class DefaultLinkTest { | ... | @@ -42,11 +42,11 @@ public class DefaultLinkTest { |
| 42 | 42 | ||
| 43 | @Test | 43 | @Test |
| 44 | public void testEquality() { | 44 | public void testEquality() { |
| 45 | - Link l1 = new DefaultLink(PID, cp(DID1, P1), cp(DID2, P2), DIRECT); | 45 | + Link l1 = new DefaultLink(PID, cp(DID1, P1), cp(DID2, P2), DIRECT, Link.State.ACTIVE); |
| 46 | - Link l2 = new DefaultLink(PID, cp(DID1, P1), cp(DID2, P2), DIRECT); | 46 | + Link l2 = new DefaultLink(PID, cp(DID1, P1), cp(DID2, P2), DIRECT, Link.State.ACTIVE); |
| 47 | - Link l3 = new DefaultLink(PID, cp(DID1, P2), cp(DID2, P2), DIRECT); | 47 | + Link l3 = new DefaultLink(PID, cp(DID1, P2), cp(DID2, P2), DIRECT, Link.State.ACTIVE); |
| 48 | - Link l4 = new DefaultLink(PID, cp(DID1, P2), cp(DID2, P2), DIRECT); | 48 | + Link l4 = new DefaultLink(PID, cp(DID1, P2), cp(DID2, P2), DIRECT, Link.State.ACTIVE); |
| 49 | - Link l5 = new DefaultLink(PID, cp(DID1, P2), cp(DID2, P2), INDIRECT); | 49 | + Link l5 = new DefaultLink(PID, cp(DID1, P2), cp(DID2, P2), INDIRECT, Link.State.ACTIVE); |
| 50 | 50 | ||
| 51 | new EqualsTester().addEqualityGroup(l1, l2) | 51 | new EqualsTester().addEqualityGroup(l1, l2) |
| 52 | .addEqualityGroup(l3, l4) | 52 | .addEqualityGroup(l3, l4) |
| ... | @@ -56,7 +56,7 @@ public class DefaultLinkTest { | ... | @@ -56,7 +56,7 @@ public class DefaultLinkTest { |
| 56 | 56 | ||
| 57 | @Test | 57 | @Test |
| 58 | public void basics() { | 58 | public void basics() { |
| 59 | - Link link = new DefaultLink(PID, cp(DID1, P1), cp(DID2, P2), DIRECT); | 59 | + Link link = new DefaultLink(PID, cp(DID1, P1), cp(DID2, P2), DIRECT, Link.State.ACTIVE); |
| 60 | assertEquals("incorrect src", cp(DID1, P1), link.src()); | 60 | assertEquals("incorrect src", cp(DID1, P1), link.src()); |
| 61 | assertEquals("incorrect dst", cp(DID2, P2), link.dst()); | 61 | assertEquals("incorrect dst", cp(DID2, P2), link.dst()); |
| 62 | assertEquals("incorrect type", DIRECT, link.type()); | 62 | assertEquals("incorrect type", DIRECT, link.type()); | ... | ... |
| ... | @@ -81,7 +81,7 @@ public final class NetTestTools { | ... | @@ -81,7 +81,7 @@ public final class NetTestTools { |
| 81 | return new DefaultLink(PID, | 81 | return new DefaultLink(PID, |
| 82 | connectPoint(src, sp), | 82 | connectPoint(src, sp), |
| 83 | connectPoint(dst, dp), | 83 | connectPoint(dst, dp), |
| 84 | - Link.Type.DIRECT); | 84 | + Link.Type.DIRECT, Link.State.ACTIVE); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | // Creates a path that leads through the given devices. | 87 | // Creates a path that leads through the given devices. | ... | ... |
| ... | @@ -44,10 +44,12 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink | ... | @@ -44,10 +44,12 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink |
| 44 | * @param networkId network identifier | 44 | * @param networkId network identifier |
| 45 | * @param src source connection point | 45 | * @param src source connection point |
| 46 | * @param dst destination connection point | 46 | * @param dst destination connection point |
| 47 | + * @param state link state | ||
| 47 | * @param tunnelId tunnel identifier | 48 | * @param tunnelId tunnel identifier |
| 48 | */ | 49 | */ |
| 49 | - private DefaultVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) { | 50 | + private DefaultVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, |
| 50 | - super(PID, src, dst, Type.VIRTUAL, DefaultAnnotations.builder().build()); | 51 | + State state, TunnelId tunnelId) { |
| 52 | + super(PID, src, dst, Type.VIRTUAL, state, DefaultAnnotations.builder().build()); | ||
| 51 | this.networkId = networkId; | 53 | this.networkId = networkId; |
| 52 | this.tunnelId = tunnelId; | 54 | this.tunnelId = tunnelId; |
| 53 | } | 55 | } |
| ... | @@ -107,6 +109,7 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink | ... | @@ -107,6 +109,7 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink |
| 107 | private ConnectPoint src; | 109 | private ConnectPoint src; |
| 108 | private ConnectPoint dst; | 110 | private ConnectPoint dst; |
| 109 | private TunnelId tunnelId; | 111 | private TunnelId tunnelId; |
| 112 | + private State state; | ||
| 110 | 113 | ||
| 111 | private Builder() { | 114 | private Builder() { |
| 112 | // Hide constructor | 115 | // Hide constructor |
| ... | @@ -157,6 +160,17 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink | ... | @@ -157,6 +160,17 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink |
| 157 | } | 160 | } |
| 158 | 161 | ||
| 159 | /** | 162 | /** |
| 163 | + * Sets the link state to be used by the builder. | ||
| 164 | + * | ||
| 165 | + * @param state link state | ||
| 166 | + * @return self | ||
| 167 | + */ | ||
| 168 | + public Builder state(State state) { | ||
| 169 | + this.state = state; | ||
| 170 | + return this; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + /** | ||
| 160 | * Builds a default virtual link object from the accumulated parameters. | 174 | * Builds a default virtual link object from the accumulated parameters. |
| 161 | * | 175 | * |
| 162 | * @return default virtual link object | 176 | * @return default virtual link object |
| ... | @@ -166,7 +180,7 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink | ... | @@ -166,7 +180,7 @@ public final class DefaultVirtualLink extends DefaultLink implements VirtualLink |
| 166 | checkNotNull(dst, "Destination connect point cannot be null"); | 180 | checkNotNull(dst, "Destination connect point cannot be null"); |
| 167 | checkNotNull(networkId, "Network Id cannot be null"); | 181 | checkNotNull(networkId, "Network Id cannot be null"); |
| 168 | 182 | ||
| 169 | - return new DefaultVirtualLink(networkId, src, dst, tunnelId); | 183 | + return new DefaultVirtualLink(networkId, src, dst, state, tunnelId); |
| 170 | } | 184 | } |
| 171 | } | 185 | } |
| 172 | } | 186 | } | ... | ... |
incubator/api/src/main/java/org/onosproject/incubator/net/virtual/VirtualNetworkProviderService.java
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.incubator.net.virtual; | 16 | package org.onosproject.incubator.net.virtual; |
| 17 | 17 | ||
| 18 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
| 18 | import org.onosproject.net.ConnectPoint; | 19 | import org.onosproject.net.ConnectPoint; |
| 19 | import org.onosproject.net.provider.ProviderService; | 20 | import org.onosproject.net.provider.ProviderService; |
| 20 | 21 | ||
| ... | @@ -30,8 +31,9 @@ public interface VirtualNetworkProviderService extends ProviderService<VirtualNe | ... | @@ -30,8 +31,9 @@ public interface VirtualNetworkProviderService extends ProviderService<VirtualNe |
| 30 | * @param networkId network identifier | 31 | * @param networkId network identifier |
| 31 | * @param src source connection point | 32 | * @param src source connection point |
| 32 | * @param dst destination connection point | 33 | * @param dst destination connection point |
| 34 | + * @param tunnelId tunnel identifier | ||
| 33 | */ | 35 | */ |
| 34 | - void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst); | 36 | + void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId); |
| 35 | 37 | ||
| 36 | /** | 38 | /** |
| 37 | * This method is used to notify the VirtualNetwork service that a tunnel is now | 39 | * This method is used to notify the VirtualNetwork service that a tunnel is now |
| ... | @@ -40,7 +42,8 @@ public interface VirtualNetworkProviderService extends ProviderService<VirtualNe | ... | @@ -40,7 +42,8 @@ public interface VirtualNetworkProviderService extends ProviderService<VirtualNe |
| 40 | * @param networkId network identifier | 42 | * @param networkId network identifier |
| 41 | * @param src source connection point | 43 | * @param src source connection point |
| 42 | * @param dst destination connection point | 44 | * @param dst destination connection point |
| 45 | + * @param tunnelId tunnel identifier | ||
| 43 | */ | 46 | */ |
| 44 | - void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst); | 47 | + void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId); |
| 45 | 48 | ||
| 46 | } | 49 | } | ... | ... |
| ... | @@ -60,7 +60,9 @@ public interface VirtualNetworkService { | ... | @@ -60,7 +60,9 @@ public interface VirtualNetworkService { |
| 60 | Set<VirtualLink> getVirtualLinks(NetworkId networkId); | 60 | Set<VirtualLink> getVirtualLinks(NetworkId networkId); |
| 61 | 61 | ||
| 62 | /** | 62 | /** |
| 63 | - * Returns list of all virtual ports of the specified device. | 63 | + * Returns list of all virtual ports of the specified device. If the |
| 64 | + * device identifier is null then all of the virtual ports in the specified | ||
| 65 | + * network will be returned. | ||
| 64 | * | 66 | * |
| 65 | * @param networkId network identifier | 67 | * @param networkId network identifier |
| 66 | * @param deviceId device identifier | 68 | * @param deviceId device identifier | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.incubator.net.virtual; | ... | @@ -18,6 +18,7 @@ package org.onosproject.incubator.net.virtual; |
| 18 | import org.onosproject.incubator.net.tunnel.TunnelId; | 18 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 19 | import org.onosproject.net.ConnectPoint; | 19 | import org.onosproject.net.ConnectPoint; |
| 20 | import org.onosproject.net.DeviceId; | 20 | import org.onosproject.net.DeviceId; |
| 21 | +import org.onosproject.net.Link; | ||
| 21 | import org.onosproject.net.Port; | 22 | import org.onosproject.net.Port; |
| 22 | import org.onosproject.net.PortNumber; | 23 | import org.onosproject.net.PortNumber; |
| 23 | import org.onosproject.store.Store; | 24 | import org.onosproject.store.Store; |
| ... | @@ -89,18 +90,20 @@ public interface VirtualNetworkStore | ... | @@ -89,18 +90,20 @@ public interface VirtualNetworkStore |
| 89 | * @param networkId network identifier | 90 | * @param networkId network identifier |
| 90 | * @param src source end-point of the link | 91 | * @param src source end-point of the link |
| 91 | * @param dst destination end-point of the link | 92 | * @param dst destination end-point of the link |
| 93 | + * @param state link state | ||
| 92 | * @param realizedBy underlying tunnel identifier using which this link is realized | 94 | * @param realizedBy underlying tunnel identifier using which this link is realized |
| 93 | * @return the virtual link | 95 | * @return the virtual link |
| 94 | */ | 96 | */ |
| 95 | - VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId realizedBy); | 97 | + VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, Link.State state, TunnelId realizedBy); |
| 96 | 98 | ||
| 97 | /** | 99 | /** |
| 98 | * Updates the tunnelId in the virtual link. | 100 | * Updates the tunnelId in the virtual link. |
| 99 | * | 101 | * |
| 100 | - * @param virtualLink virtual link | 102 | + * @param virtualLink virtual link |
| 101 | - * @param tunnelId tunnel identifier | 103 | + * @param tunnelId tunnel identifier |
| 104 | + * @param state link state | ||
| 102 | */ | 105 | */ |
| 103 | - void updateLink(VirtualLink virtualLink, TunnelId tunnelId); | 106 | + void updateLink(VirtualLink virtualLink, TunnelId tunnelId, Link.State state); |
| 104 | 107 | ||
| 105 | /** | 108 | /** |
| 106 | * Removes the specified link from the store. | 109 | * Removes the specified link from the store. |
| ... | @@ -158,10 +161,21 @@ public interface VirtualNetworkStore | ... | @@ -158,10 +161,21 @@ public interface VirtualNetworkStore |
| 158 | Set<VirtualLink> getLinks(NetworkId networkId); | 161 | Set<VirtualLink> getLinks(NetworkId networkId); |
| 159 | 162 | ||
| 160 | /** | 163 | /** |
| 164 | + * Returns the virtual link matching the network identifier, source connect point, | ||
| 165 | + * and destination connect point. | ||
| 166 | + * | ||
| 167 | + * @param networkId network identifier | ||
| 168 | + * @param src source connect point | ||
| 169 | + * @param dst destination connect point | ||
| 170 | + * @return virtual link | ||
| 171 | + */ | ||
| 172 | + VirtualLink getLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst); | ||
| 173 | + | ||
| 174 | + /** | ||
| 161 | * Returns the list of ports of the specified virtual device. | 175 | * Returns the list of ports of the specified virtual device. |
| 162 | * | 176 | * |
| 163 | * @param networkId network identifier | 177 | * @param networkId network identifier |
| 164 | - * @param deviceId device identifier | 178 | + * @param deviceId device identifier |
| 165 | * @return set of virtual networks | 179 | * @return set of virtual networks |
| 166 | */ | 180 | */ |
| 167 | Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId); | 181 | Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId); | ... | ... |
| ... | @@ -35,8 +35,9 @@ import org.onosproject.net.ConnectPoint; | ... | @@ -35,8 +35,9 @@ import org.onosproject.net.ConnectPoint; |
| 35 | import org.onosproject.net.EncapsulationType; | 35 | import org.onosproject.net.EncapsulationType; |
| 36 | import org.onosproject.net.intent.Constraint; | 36 | import org.onosproject.net.intent.Constraint; |
| 37 | import org.onosproject.net.intent.Intent; | 37 | import org.onosproject.net.intent.Intent; |
| 38 | +import org.onosproject.net.intent.IntentEvent; | ||
| 39 | +import org.onosproject.net.intent.IntentListener; | ||
| 38 | import org.onosproject.net.intent.IntentService; | 40 | import org.onosproject.net.intent.IntentService; |
| 39 | -import org.onosproject.net.intent.IntentState; | ||
| 40 | import org.onosproject.net.intent.Key; | 41 | import org.onosproject.net.intent.Key; |
| 41 | import org.onosproject.net.intent.PointToPointIntent; | 42 | import org.onosproject.net.intent.PointToPointIntent; |
| 42 | import org.onosproject.net.intent.constraint.EncapsulationConstraint; | 43 | import org.onosproject.net.intent.constraint.EncapsulationConstraint; |
| ... | @@ -45,9 +46,9 @@ import org.slf4j.Logger; | ... | @@ -45,9 +46,9 @@ import org.slf4j.Logger; |
| 45 | 46 | ||
| 46 | import java.util.ArrayList; | 47 | import java.util.ArrayList; |
| 47 | import java.util.List; | 48 | import java.util.List; |
| 49 | +import java.util.StringTokenizer; | ||
| 48 | 50 | ||
| 49 | import static com.google.common.base.Preconditions.checkNotNull; | 51 | import static com.google.common.base.Preconditions.checkNotNull; |
| 50 | -import static java.lang.Thread.sleep; | ||
| 51 | import static org.slf4j.LoggerFactory.getLogger; | 52 | import static org.slf4j.LoggerFactory.getLogger; |
| 52 | 53 | ||
| 53 | /** | 54 | /** |
| ... | @@ -55,13 +56,15 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -55,13 +56,15 @@ import static org.slf4j.LoggerFactory.getLogger; |
| 55 | */ | 56 | */ |
| 56 | @Component(immediate = true) | 57 | @Component(immediate = true) |
| 57 | @Service | 58 | @Service |
| 58 | -public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider implements VirtualNetworkProvider { | 59 | +public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider |
| 60 | + implements VirtualNetworkProvider { | ||
| 59 | 61 | ||
| 60 | private final Logger log = getLogger(PtToPtIntentVirtualNetworkProvider.class); | 62 | private final Logger log = getLogger(PtToPtIntentVirtualNetworkProvider.class); |
| 61 | private static final String NETWORK_ID_NULL = "Network ID cannot be null"; | 63 | private static final String NETWORK_ID_NULL = "Network ID cannot be null"; |
| 62 | private static final String CONNECT_POINT_NULL = "Connect Point cannot be null"; | 64 | private static final String CONNECT_POINT_NULL = "Connect Point cannot be null"; |
| 63 | private static final String INTENT_NULL = "Intent cannot be null"; | 65 | private static final String INTENT_NULL = "Intent cannot be null"; |
| 64 | - protected static final String KEY_FORMAT = "networkId=%s src=%s dst=%s"; | 66 | + private static final String NETWORK_ID = "networkId="; |
| 67 | + protected static final String KEY_FORMAT = NETWORK_ID + "%s, src=%s, dst=%s"; | ||
| 65 | private static final int MAX_WAIT_COUNT = 30; | 68 | private static final int MAX_WAIT_COUNT = 30; |
| 66 | 69 | ||
| 67 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 70 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| ... | @@ -72,6 +75,8 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme | ... | @@ -72,6 +75,8 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme |
| 72 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 75 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 73 | protected IntentService intentService; | 76 | protected IntentService intentService; |
| 74 | 77 | ||
| 78 | + private final InternalPtPtIntentListener intentListener = new InternalPtPtIntentListener(); | ||
| 79 | + | ||
| 75 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 80 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 76 | protected CoreService coreService; | 81 | protected CoreService coreService; |
| 77 | 82 | ||
| ... | @@ -90,11 +95,13 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme | ... | @@ -90,11 +95,13 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme |
| 90 | providerService = providerRegistry.register(this); | 95 | providerService = providerRegistry.register(this); |
| 91 | appId = coreService.registerApplication(PTPT_INTENT_APPID); | 96 | appId = coreService.registerApplication(PTPT_INTENT_APPID); |
| 92 | 97 | ||
| 98 | + intentService.addListener(intentListener); | ||
| 93 | log.info("Started"); | 99 | log.info("Started"); |
| 94 | } | 100 | } |
| 95 | 101 | ||
| 96 | @Deactivate | 102 | @Deactivate |
| 97 | public void deactivate() { | 103 | public void deactivate() { |
| 104 | + intentService.removeListener(intentListener); | ||
| 98 | providerRegistry.unregister(this); | 105 | providerRegistry.unregister(this); |
| 99 | providerService = null; | 106 | providerService = null; |
| 100 | log.info("Stopped"); | 107 | log.info("Stopped"); |
| ... | @@ -105,8 +112,7 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme | ... | @@ -105,8 +112,7 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme |
| 105 | checkNotNull(networkId, NETWORK_ID_NULL); | 112 | checkNotNull(networkId, NETWORK_ID_NULL); |
| 106 | checkNotNull(src, CONNECT_POINT_NULL); | 113 | checkNotNull(src, CONNECT_POINT_NULL); |
| 107 | checkNotNull(dst, CONNECT_POINT_NULL); | 114 | checkNotNull(dst, CONNECT_POINT_NULL); |
| 108 | - String key = String.format(KEY_FORMAT, networkId.toString(), src.toString(), dst.toString()); | 115 | + Key intentKey = encodeKey(networkId, src, dst); |
| 109 | - Key intentKey = Key.of(key, appId); | ||
| 110 | 116 | ||
| 111 | List<Constraint> constraints = new ArrayList<>(); | 117 | List<Constraint> constraints = new ArrayList<>(); |
| 112 | constraints.add(new EncapsulationConstraint(EncapsulationType.VLAN)); | 118 | constraints.add(new EncapsulationConstraint(EncapsulationType.VLAN)); |
| ... | @@ -123,7 +129,7 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme | ... | @@ -123,7 +129,7 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme |
| 123 | intentService.submit(intent); | 129 | intentService.submit(intent); |
| 124 | 130 | ||
| 125 | // construct tunnelId from the key | 131 | // construct tunnelId from the key |
| 126 | - return TunnelId.valueOf(key); | 132 | + return TunnelId.valueOf(intentKey.toString()); |
| 127 | } | 133 | } |
| 128 | 134 | ||
| 129 | @Override | 135 | @Override |
| ... | @@ -133,20 +139,64 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme | ... | @@ -133,20 +139,64 @@ public class PtToPtIntentVirtualNetworkProvider extends AbstractProvider impleme |
| 133 | Intent intent = intentService.getIntent(intentKey); | 139 | Intent intent = intentService.getIntent(intentKey); |
| 134 | checkNotNull(intent, INTENT_NULL); | 140 | checkNotNull(intent, INTENT_NULL); |
| 135 | intentService.withdraw(intent); | 141 | intentService.withdraw(intent); |
| 136 | - try { | 142 | + } |
| 137 | - int count = 0; | 143 | + |
| 138 | - // Loop waiting for the intent to go into a withdrawn or failed state | 144 | + private NetworkId decodeNetworkIdFromKey(Key intentKey) { |
| 139 | - // before attempting to purge it. | 145 | + // Extract the network identifier from the intent key |
| 140 | - while (++count <= MAX_WAIT_COUNT) { | 146 | + StringTokenizer tokenizer = new StringTokenizer(intentKey.toString(), ","); |
| 141 | - IntentState state = intentService.getIntentState(intentKey); | 147 | + String networkIdString = tokenizer.nextToken().substring(NETWORK_ID.length()); |
| 142 | - if ((state == IntentState.FAILED) || (state == IntentState.WITHDRAWN)) { | 148 | + return NetworkId.networkId(Integer.valueOf(networkIdString)); |
| 149 | + } | ||
| 150 | + | ||
| 151 | + private Key encodeKey(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | ||
| 152 | + String key = String.format(KEY_FORMAT, networkId, src, dst); | ||
| 153 | + return Key.of(key, appId); | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + private class InternalPtPtIntentListener implements IntentListener { | ||
| 157 | + @Override | ||
| 158 | + public void event(IntentEvent event) { | ||
| 159 | + PointToPointIntent intent = (PointToPointIntent) event.subject(); | ||
| 160 | + Key intentKey = intent.key(); | ||
| 161 | + | ||
| 162 | + // Ignore intent events that are not relevant. | ||
| 163 | + if (!isRelevant(event)) { | ||
| 164 | + return; | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + NetworkId networkId = decodeNetworkIdFromKey(intentKey); | ||
| 168 | + ConnectPoint src = intent.ingressPoint(); | ||
| 169 | + ConnectPoint dst = intent.egressPoint(); | ||
| 170 | + | ||
| 171 | + switch (event.type()) { | ||
| 172 | + case INSTALLED: | ||
| 173 | + providerService.tunnelUp(networkId, src, dst, TunnelId.valueOf(intentKey.toString())); | ||
| 174 | + break; | ||
| 175 | + case WITHDRAWN: | ||
| 143 | intentService.purge(intent); | 176 | intentService.purge(intent); |
| 177 | + // Fall through and notify the provider service that the tunnel is down | ||
| 178 | + // for both WITHDRAWN and FAILED intent event types. | ||
| 179 | + case FAILED: | ||
| 180 | + providerService.tunnelDown(networkId, src, dst, TunnelId.valueOf(intentKey.toString())); | ||
| 181 | + break; | ||
| 182 | + case INSTALL_REQ: | ||
| 183 | + case CORRUPT: | ||
| 184 | + case PURGED: | ||
| 185 | + break; // Not sure what do with these events, ignore for now. | ||
| 186 | + default: | ||
| 144 | break; | 187 | break; |
| 145 | - } | ||
| 146 | - sleep(1000); | ||
| 147 | } | 188 | } |
| 148 | - } catch (Exception e) { | 189 | + } |
| 149 | - log.error("Exception: " + e); | 190 | + |
| 191 | + @Override | ||
| 192 | + public boolean isRelevant(IntentEvent event) { | ||
| 193 | + PointToPointIntent intent = (PointToPointIntent) event.subject(); | ||
| 194 | + | ||
| 195 | + // Only events that are for this appId are relevent. | ||
| 196 | + if (intent.appId().equals(appId)) { | ||
| 197 | + return true; | ||
| 198 | + } | ||
| 199 | + return false; | ||
| 150 | } | 200 | } |
| 151 | } | 201 | } |
| 152 | } | 202 | } | ... | ... |
| ... | @@ -39,6 +39,7 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate; | ... | @@ -39,6 +39,7 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate; |
| 39 | import org.onosproject.incubator.net.virtual.VirtualPort; | 39 | import org.onosproject.incubator.net.virtual.VirtualPort; |
| 40 | import org.onosproject.net.ConnectPoint; | 40 | import org.onosproject.net.ConnectPoint; |
| 41 | import org.onosproject.net.DeviceId; | 41 | import org.onosproject.net.DeviceId; |
| 42 | +import org.onosproject.net.Link; | ||
| 42 | import org.onosproject.net.Port; | 43 | import org.onosproject.net.Port; |
| 43 | import org.onosproject.net.PortNumber; | 44 | import org.onosproject.net.PortNumber; |
| 44 | import org.onosproject.net.provider.AbstractListenerProviderRegistry; | 45 | import org.onosproject.net.provider.AbstractListenerProviderRegistry; |
| ... | @@ -140,7 +141,7 @@ public class VirtualNetworkManager | ... | @@ -140,7 +141,7 @@ public class VirtualNetworkManager |
| 140 | checkNotNull(networkId, NETWORK_NULL); | 141 | checkNotNull(networkId, NETWORK_NULL); |
| 141 | checkNotNull(src, LINK_POINT_NULL); | 142 | checkNotNull(src, LINK_POINT_NULL); |
| 142 | checkNotNull(dst, LINK_POINT_NULL); | 143 | checkNotNull(dst, LINK_POINT_NULL); |
| 143 | - VirtualLink virtualLink = store.addLink(networkId, src, dst, null); | 144 | + VirtualLink virtualLink = store.addLink(networkId, src, dst, Link.State.INACTIVE, null); |
| 144 | checkNotNull(virtualLink, VIRTUAL_LINK_NULL); | 145 | checkNotNull(virtualLink, VIRTUAL_LINK_NULL); |
| 145 | 146 | ||
| 146 | if (virtualLink.providerId() != null) { | 147 | if (virtualLink.providerId() != null) { |
| ... | @@ -148,7 +149,7 @@ public class VirtualNetworkManager | ... | @@ -148,7 +149,7 @@ public class VirtualNetworkManager |
| 148 | if (provider != null) { | 149 | if (provider != null) { |
| 149 | TunnelId tunnelId = provider.createTunnel(networkId, mapVirtualToPhysicalPort(networkId, src), | 150 | TunnelId tunnelId = provider.createTunnel(networkId, mapVirtualToPhysicalPort(networkId, src), |
| 150 | mapVirtualToPhysicalPort(networkId, dst)); | 151 | mapVirtualToPhysicalPort(networkId, dst)); |
| 151 | - store.updateLink(virtualLink, tunnelId); | 152 | + store.updateLink(virtualLink, tunnelId, Link.State.INACTIVE); |
| 152 | } | 153 | } |
| 153 | } | 154 | } |
| 154 | return virtualLink; | 155 | return virtualLink; |
| ... | @@ -173,6 +174,25 @@ public class VirtualNetworkManager | ... | @@ -173,6 +174,25 @@ public class VirtualNetworkManager |
| 173 | return null; | 174 | return null; |
| 174 | } | 175 | } |
| 175 | 176 | ||
| 177 | + /** | ||
| 178 | + * Maps the physical connect point to a virtual connect point. | ||
| 179 | + * | ||
| 180 | + * @param networkId network identifier | ||
| 181 | + * @param physicalCp physical connect point | ||
| 182 | + * @return virtual connect point | ||
| 183 | + */ | ||
| 184 | + private ConnectPoint mapPhysicalToVirtualToPort(NetworkId networkId, | ||
| 185 | + ConnectPoint physicalCp) { | ||
| 186 | + Set<VirtualPort> ports = store.getPorts(networkId, null); | ||
| 187 | + for (VirtualPort port : ports) { | ||
| 188 | + if (port.realizedBy().element().id().equals(physicalCp.elementId()) && | ||
| 189 | + port.realizedBy().number().equals(physicalCp.port())) { | ||
| 190 | + return new ConnectPoint(port.element().id(), port.number()); | ||
| 191 | + } | ||
| 192 | + } | ||
| 193 | + return null; | ||
| 194 | + } | ||
| 195 | + | ||
| 176 | @Override | 196 | @Override |
| 177 | public void removeVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 197 | public void removeVirtualLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { |
| 178 | checkNotNull(networkId, NETWORK_NULL); | 198 | checkNotNull(networkId, NETWORK_NULL); |
| ... | @@ -226,7 +246,6 @@ public class VirtualNetworkManager | ... | @@ -226,7 +246,6 @@ public class VirtualNetworkManager |
| 226 | @Override | 246 | @Override |
| 227 | public Set<VirtualPort> getVirtualPorts(NetworkId networkId, DeviceId deviceId) { | 247 | public Set<VirtualPort> getVirtualPorts(NetworkId networkId, DeviceId deviceId) { |
| 228 | checkNotNull(networkId, NETWORK_NULL); | 248 | checkNotNull(networkId, NETWORK_NULL); |
| 229 | - checkNotNull(deviceId, DEVICE_NULL); | ||
| 230 | return store.getPorts(networkId, deviceId); | 249 | return store.getPorts(networkId, deviceId); |
| 231 | } | 250 | } |
| 232 | 251 | ||
| ... | @@ -251,13 +270,32 @@ public class VirtualNetworkManager | ... | @@ -251,13 +270,32 @@ public class VirtualNetworkManager |
| 251 | } | 270 | } |
| 252 | 271 | ||
| 253 | @Override | 272 | @Override |
| 254 | - public void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 273 | + public void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) { |
| 274 | + | ||
| 275 | + ConnectPoint srcVirtualCp = mapPhysicalToVirtualToPort(networkId, src); | ||
| 276 | + ConnectPoint dstVirtualCp = mapPhysicalToVirtualToPort(networkId, dst); | ||
| 277 | + if ((srcVirtualCp == null) || (dstVirtualCp == null)) { | ||
| 278 | + log.error("Src or dst virtual connection point was not found."); | ||
| 279 | + } | ||
| 255 | 280 | ||
| 281 | + VirtualLink virtualLink = store.getLink(networkId, srcVirtualCp, dstVirtualCp); | ||
| 282 | + if (virtualLink != null) { | ||
| 283 | + store.updateLink(virtualLink, tunnelId, Link.State.ACTIVE); | ||
| 284 | + } | ||
| 256 | } | 285 | } |
| 257 | 286 | ||
| 258 | @Override | 287 | @Override |
| 259 | - public void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 288 | + public void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) { |
| 289 | + ConnectPoint srcVirtualCp = mapPhysicalToVirtualToPort(networkId, src); | ||
| 290 | + ConnectPoint dstVirtualCp = mapPhysicalToVirtualToPort(networkId, dst); | ||
| 291 | + if ((srcVirtualCp == null) || (dstVirtualCp == null)) { | ||
| 292 | + log.error("Src or dst virtual connection point was not found."); | ||
| 293 | + } | ||
| 260 | 294 | ||
| 295 | + VirtualLink virtualLink = store.getLink(networkId, srcVirtualCp, dstVirtualCp); | ||
| 296 | + if (virtualLink != null) { | ||
| 297 | + store.updateLink(virtualLink, tunnelId, Link.State.INACTIVE); | ||
| 298 | + } | ||
| 261 | } | 299 | } |
| 262 | } | 300 | } |
| 263 | 301 | ... | ... |
| ... | @@ -16,7 +16,7 @@ | ... | @@ -16,7 +16,7 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.incubator.net.virtual.impl; | 17 | package org.onosproject.incubator.net.virtual.impl; |
| 18 | 18 | ||
| 19 | -import com.google.common.collect.Sets; | 19 | +import com.google.common.collect.Lists; |
| 20 | import org.junit.After; | 20 | import org.junit.After; |
| 21 | import org.junit.Before; | 21 | import org.junit.Before; |
| 22 | import org.junit.Test; | 22 | import org.junit.Test; |
| ... | @@ -33,21 +33,29 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkProviderService; | ... | @@ -33,21 +33,29 @@ import org.onosproject.incubator.net.virtual.VirtualNetworkProviderService; |
| 33 | import org.onosproject.net.ConnectPoint; | 33 | import org.onosproject.net.ConnectPoint; |
| 34 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
| 35 | import org.onosproject.net.PortNumber; | 35 | import org.onosproject.net.PortNumber; |
| 36 | +import org.onosproject.net.intent.FakeIntentManager; | ||
| 37 | +import org.onosproject.net.intent.FlowRuleIntent; | ||
| 36 | import org.onosproject.net.intent.Intent; | 38 | import org.onosproject.net.intent.Intent; |
| 37 | -import org.onosproject.net.intent.IntentService; | 39 | +import org.onosproject.net.intent.IntentCompiler; |
| 38 | -import org.onosproject.net.intent.IntentServiceAdapter; | 40 | +import org.onosproject.net.intent.IntentEvent; |
| 39 | -import org.onosproject.net.intent.IntentState; | 41 | +import org.onosproject.net.intent.IntentExtensionService; |
| 40 | -import org.onosproject.net.intent.Key; | 42 | +import org.onosproject.net.intent.IntentListener; |
| 43 | +import org.onosproject.net.intent.IntentTestsMocks; | ||
| 41 | import org.onosproject.net.intent.MockIdGenerator; | 44 | import org.onosproject.net.intent.MockIdGenerator; |
| 45 | +import org.onosproject.net.intent.PointToPointIntent; | ||
| 46 | +import org.onosproject.net.intent.TestableIntentService; | ||
| 42 | import org.onosproject.net.provider.AbstractProviderService; | 47 | import org.onosproject.net.provider.AbstractProviderService; |
| 43 | import org.onosproject.net.provider.ProviderId; | 48 | import org.onosproject.net.provider.ProviderId; |
| 44 | 49 | ||
| 50 | +import java.util.Collections; | ||
| 51 | +import java.util.List; | ||
| 45 | import java.util.Set; | 52 | import java.util.Set; |
| 53 | +import java.util.concurrent.Semaphore; | ||
| 54 | +import java.util.concurrent.TimeUnit; | ||
| 46 | import java.util.concurrent.atomic.AtomicLong; | 55 | import java.util.concurrent.atomic.AtomicLong; |
| 47 | 56 | ||
| 48 | import static org.easymock.EasyMock.*; | 57 | import static org.easymock.EasyMock.*; |
| 49 | -import static org.junit.Assert.assertEquals; | 58 | +import static org.junit.Assert.*; |
| 50 | -import static org.junit.Assert.assertNotNull; | ||
| 51 | 59 | ||
| 52 | /** | 60 | /** |
| 53 | * Junit tests for PtToPtIntentVirtualNetworkProvider. | 61 | * Junit tests for PtToPtIntentVirtualNetworkProvider. |
| ... | @@ -58,12 +66,19 @@ public class PtToPtIntentVirtualNetworkProviderTest { | ... | @@ -58,12 +66,19 @@ public class PtToPtIntentVirtualNetworkProviderTest { |
| 58 | private VirtualNetworkProviderRegistry providerRegistry; | 66 | private VirtualNetworkProviderRegistry providerRegistry; |
| 59 | 67 | ||
| 60 | private final VirtualNetworkRegistryAdapter virtualNetworkRegistry = new VirtualNetworkRegistryAdapter(); | 68 | private final VirtualNetworkRegistryAdapter virtualNetworkRegistry = new VirtualNetworkRegistryAdapter(); |
| 61 | - private IntentService intentService; | 69 | + private TestableIntentService intentService = new FakeIntentManager(); |
| 70 | + private TestListener listener = new TestListener(); | ||
| 71 | + protected TestIntentCompiler compiler = new TestIntentCompiler(); | ||
| 72 | + private IntentExtensionService intentExtensionService; | ||
| 62 | 73 | ||
| 63 | private static final ApplicationId APP_ID = | 74 | private static final ApplicationId APP_ID = |
| 64 | TestApplicationId.create(PtToPtIntentVirtualNetworkProvider.PTPT_INTENT_APPID); | 75 | TestApplicationId.create(PtToPtIntentVirtualNetworkProvider.PTPT_INTENT_APPID); |
| 65 | 76 | ||
| 66 | private IdGenerator idGenerator = new MockIdGenerator(); | 77 | private IdGenerator idGenerator = new MockIdGenerator(); |
| 78 | + private static final int MAX_WAIT_TIME = 5; | ||
| 79 | + private static final int MAX_PERMITS = 2; | ||
| 80 | + private static Semaphore created; | ||
| 81 | + private static Semaphore removed; | ||
| 67 | 82 | ||
| 68 | @Before | 83 | @Before |
| 69 | public void setUp() { | 84 | public void setUp() { |
| ... | @@ -77,18 +92,28 @@ public class PtToPtIntentVirtualNetworkProviderTest { | ... | @@ -77,18 +92,28 @@ public class PtToPtIntentVirtualNetworkProviderTest { |
| 77 | Intent.unbindIdGenerator(idGenerator); | 92 | Intent.unbindIdGenerator(idGenerator); |
| 78 | Intent.bindIdGenerator(idGenerator); | 93 | Intent.bindIdGenerator(idGenerator); |
| 79 | 94 | ||
| 80 | - intentService = new TestIntentService(); | 95 | + intentService.addListener(listener); |
| 81 | provider.intentService = intentService; | 96 | provider.intentService = intentService; |
| 97 | + | ||
| 98 | + // Register a compiler and an installer both setup for success. | ||
| 99 | + intentExtensionService = intentService; | ||
| 100 | + intentExtensionService.registerCompiler(PointToPointIntent.class, compiler); | ||
| 101 | + | ||
| 82 | provider.activate(); | 102 | provider.activate(); |
| 103 | + created = new Semaphore(0, true); | ||
| 104 | + removed = new Semaphore(0, true); | ||
| 83 | } | 105 | } |
| 84 | 106 | ||
| 85 | @After | 107 | @After |
| 86 | public void tearDown() { | 108 | public void tearDown() { |
| 109 | + Intent.unbindIdGenerator(idGenerator); | ||
| 110 | + intentService.removeListener(listener); | ||
| 87 | provider.deactivate(); | 111 | provider.deactivate(); |
| 88 | provider.providerRegistry = null; | 112 | provider.providerRegistry = null; |
| 89 | provider.coreService = null; | 113 | provider.coreService = null; |
| 90 | provider.intentService = null; | 114 | provider.intentService = null; |
| 91 | - Intent.unbindIdGenerator(idGenerator); | 115 | + created = null; |
| 116 | + removed = null; | ||
| 92 | } | 117 | } |
| 93 | 118 | ||
| 94 | @Test | 119 | @Test |
| ... | @@ -134,11 +159,30 @@ public class PtToPtIntentVirtualNetworkProviderTest { | ... | @@ -134,11 +159,30 @@ public class PtToPtIntentVirtualNetworkProviderTest { |
| 134 | ConnectPoint dst = new ConnectPoint(DeviceId.deviceId("device2"), PortNumber.portNumber(2)); | 159 | ConnectPoint dst = new ConnectPoint(DeviceId.deviceId("device2"), PortNumber.portNumber(2)); |
| 135 | 160 | ||
| 136 | TunnelId tunnelId = provider.createTunnel(networkId, src, dst); | 161 | TunnelId tunnelId = provider.createTunnel(networkId, src, dst); |
| 162 | + | ||
| 163 | + // Wait for the tunnel to go into an INSTALLED state, and that the tunnelUp method was called. | ||
| 164 | + try { | ||
| 165 | + if (!created.tryAcquire(MAX_PERMITS, MAX_WAIT_TIME, TimeUnit.SECONDS)) { | ||
| 166 | + fail("Failed to wait for tunnel to get installed."); | ||
| 167 | + } | ||
| 168 | + } catch (InterruptedException e) { | ||
| 169 | + fail("Semaphore exception during tunnel installation." + e.getMessage()); | ||
| 170 | + } | ||
| 171 | + | ||
| 137 | String key = String.format(PtToPtIntentVirtualNetworkProvider.KEY_FORMAT, | 172 | String key = String.format(PtToPtIntentVirtualNetworkProvider.KEY_FORMAT, |
| 138 | networkId.toString(), src.toString(), dst.toString()); | 173 | networkId.toString(), src.toString(), dst.toString()); |
| 139 | 174 | ||
| 140 | assertEquals("TunnelId does not match as expected.", key, tunnelId.toString()); | 175 | assertEquals("TunnelId does not match as expected.", key, tunnelId.toString()); |
| 141 | provider.destroyTunnel(networkId, tunnelId); | 176 | provider.destroyTunnel(networkId, tunnelId); |
| 177 | + | ||
| 178 | + // Wait for the tunnel to go into a WITHDRAWN state, and that the tunnelDown method was called. | ||
| 179 | + try { | ||
| 180 | + if (!removed.tryAcquire(MAX_PERMITS, MAX_WAIT_TIME, TimeUnit.SECONDS)) { | ||
| 181 | + fail("Failed to wait for tunnel to get removed."); | ||
| 182 | + } | ||
| 183 | + } catch (InterruptedException e) { | ||
| 184 | + fail("Semaphore exception during tunnel removal." + e.getMessage()); | ||
| 185 | + } | ||
| 142 | } | 186 | } |
| 143 | 187 | ||
| 144 | /** | 188 | /** |
| ... | @@ -176,16 +220,36 @@ public class PtToPtIntentVirtualNetworkProviderTest { | ... | @@ -176,16 +220,36 @@ public class PtToPtIntentVirtualNetworkProviderTest { |
| 176 | } | 220 | } |
| 177 | 221 | ||
| 178 | @Override | 222 | @Override |
| 179 | - public void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 223 | + public void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) { |
| 180 | - | 224 | + // Release one permit on the created semaphore since the tunnelUp method was called. |
| 225 | + created.release(); | ||
| 181 | } | 226 | } |
| 182 | 227 | ||
| 183 | @Override | 228 | @Override |
| 184 | - public void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | 229 | + public void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) { |
| 185 | - | 230 | + // Release one permit on the removed semaphore since the tunnelDown method was called. |
| 231 | + removed.release(); | ||
| 186 | } | 232 | } |
| 187 | } | 233 | } |
| 188 | 234 | ||
| 235 | + private static class TestListener implements IntentListener { | ||
| 236 | + | ||
| 237 | + @Override | ||
| 238 | + public void event(IntentEvent event) { | ||
| 239 | + switch (event.type()) { | ||
| 240 | + case INSTALLED: | ||
| 241 | + // Release one permit on the created semaphore since the Intent event was received. | ||
| 242 | + created.release(); | ||
| 243 | + break; | ||
| 244 | + case WITHDRAWN: | ||
| 245 | + // Release one permit on the removed semaphore since the Intent event was received. | ||
| 246 | + removed.release(); | ||
| 247 | + break; | ||
| 248 | + default: | ||
| 249 | + break; | ||
| 250 | + } | ||
| 251 | + } | ||
| 252 | + } | ||
| 189 | 253 | ||
| 190 | /** | 254 | /** |
| 191 | * Core service test class. | 255 | * Core service test class. |
| ... | @@ -205,55 +269,17 @@ public class PtToPtIntentVirtualNetworkProviderTest { | ... | @@ -205,55 +269,17 @@ public class PtToPtIntentVirtualNetworkProviderTest { |
| 205 | } | 269 | } |
| 206 | } | 270 | } |
| 207 | 271 | ||
| 208 | - /** | 272 | + private static class TestIntentCompiler implements IntentCompiler<PointToPointIntent> { |
| 209 | - * Represents a fake IntentService class that easily allows to store and | ||
| 210 | - * retrieve intents without implementing the IntentService logic. | ||
| 211 | - */ | ||
| 212 | - private class TestIntentService extends IntentServiceAdapter { | ||
| 213 | - | ||
| 214 | - private Set<Intent> intents; | ||
| 215 | - | ||
| 216 | - public TestIntentService() { | ||
| 217 | - intents = Sets.newHashSet(); | ||
| 218 | - } | ||
| 219 | - | ||
| 220 | - @Override | ||
| 221 | - public void submit(Intent intent) { | ||
| 222 | - intents.add(intent); | ||
| 223 | - } | ||
| 224 | - | ||
| 225 | - @Override | ||
| 226 | - public void withdraw(Intent intent) { | ||
| 227 | - } | ||
| 228 | - | ||
| 229 | - @Override | ||
| 230 | - public IntentState getIntentState(Key intentKey) { | ||
| 231 | - return IntentState.WITHDRAWN; | ||
| 232 | - } | ||
| 233 | - | ||
| 234 | @Override | 273 | @Override |
| 235 | - public void purge(Intent intent) { | 274 | + public List<Intent> compile(PointToPointIntent intent, List<Intent> installable) { |
| 236 | - intents.remove(intent); | 275 | + return Lists.newArrayList(new MockInstallableIntent()); |
| 237 | - } | ||
| 238 | - | ||
| 239 | - @Override | ||
| 240 | - public long getIntentCount() { | ||
| 241 | - return intents.size(); | ||
| 242 | } | 276 | } |
| 277 | + } | ||
| 243 | 278 | ||
| 244 | - @Override | 279 | + private static class MockInstallableIntent extends FlowRuleIntent { |
| 245 | - public Iterable<Intent> getIntents() { | ||
| 246 | - return intents; | ||
| 247 | - } | ||
| 248 | 280 | ||
| 249 | - @Override | 281 | + public MockInstallableIntent() { |
| 250 | - public Intent getIntent(Key intentKey) { | 282 | + super(APP_ID, Collections.singletonList(new IntentTestsMocks.MockFlowRule(100)), Collections.emptyList()); |
| 251 | - for (Intent intent : intents) { | ||
| 252 | - if (intent.key().equals(intentKey)) { | ||
| 253 | - return intent; | ||
| 254 | - } | ||
| 255 | - } | ||
| 256 | - return null; | ||
| 257 | } | 283 | } |
| 258 | } | 284 | } |
| 259 | } | 285 | } | ... | ... |
| ... | @@ -44,6 +44,7 @@ import org.onosproject.incubator.net.virtual.VirtualPort; | ... | @@ -44,6 +44,7 @@ import org.onosproject.incubator.net.virtual.VirtualPort; |
| 44 | import org.onosproject.net.ConnectPoint; | 44 | import org.onosproject.net.ConnectPoint; |
| 45 | import org.onosproject.net.Device; | 45 | import org.onosproject.net.Device; |
| 46 | import org.onosproject.net.DeviceId; | 46 | import org.onosproject.net.DeviceId; |
| 47 | +import org.onosproject.net.Link; | ||
| 47 | import org.onosproject.net.Port; | 48 | import org.onosproject.net.Port; |
| 48 | import org.onosproject.net.PortNumber; | 49 | import org.onosproject.net.PortNumber; |
| 49 | import org.onosproject.store.AbstractStore; | 50 | import org.onosproject.store.AbstractStore; |
| ... | @@ -295,6 +296,7 @@ public class DistributedVirtualNetworkStore | ... | @@ -295,6 +296,7 @@ public class DistributedVirtualNetworkStore |
| 295 | * @return true if the network identifier exists, false otherwise. | 296 | * @return true if the network identifier exists, false otherwise. |
| 296 | */ | 297 | */ |
| 297 | private boolean networkExists(NetworkId networkId) { | 298 | private boolean networkExists(NetworkId networkId) { |
| 299 | + checkNotNull(networkId, "The network identifier cannot be null."); | ||
| 298 | return (networkIdVirtualNetworkMap.containsKey(networkId)); | 300 | return (networkIdVirtualNetworkMap.containsKey(networkId)); |
| 299 | } | 301 | } |
| 300 | 302 | ||
| ... | @@ -339,7 +341,8 @@ public class DistributedVirtualNetworkStore | ... | @@ -339,7 +341,8 @@ public class DistributedVirtualNetworkStore |
| 339 | } | 341 | } |
| 340 | 342 | ||
| 341 | @Override | 343 | @Override |
| 342 | - public VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId realizedBy) { | 344 | + public VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, |
| 345 | + Link.State state, TunnelId realizedBy) { | ||
| 343 | checkState(networkExists(networkId), "The network has not been added."); | 346 | checkState(networkExists(networkId), "The network has not been added."); |
| 344 | Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); | 347 | Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); |
| 345 | if (virtualLinkSet == null) { | 348 | if (virtualLinkSet == null) { |
| ... | @@ -352,6 +355,7 @@ public class DistributedVirtualNetworkStore | ... | @@ -352,6 +355,7 @@ public class DistributedVirtualNetworkStore |
| 352 | .networkId(networkId) | 355 | .networkId(networkId) |
| 353 | .src(src) | 356 | .src(src) |
| 354 | .dst(dst) | 357 | .dst(dst) |
| 358 | + .state(state) | ||
| 355 | .tunnelId(realizedBy) | 359 | .tunnelId(realizedBy) |
| 356 | .build(); | 360 | .build(); |
| 357 | 361 | ||
| ... | @@ -361,7 +365,7 @@ public class DistributedVirtualNetworkStore | ... | @@ -361,7 +365,7 @@ public class DistributedVirtualNetworkStore |
| 361 | } | 365 | } |
| 362 | 366 | ||
| 363 | @Override | 367 | @Override |
| 364 | - public void updateLink(VirtualLink virtualLink, TunnelId tunnelId) { | 368 | + public void updateLink(VirtualLink virtualLink, TunnelId tunnelId, Link.State state) { |
| 365 | checkState(networkExists(virtualLink.networkId()), "The network has not been added."); | 369 | checkState(networkExists(virtualLink.networkId()), "The network has not been added."); |
| 366 | Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(virtualLink.networkId()); | 370 | Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(virtualLink.networkId()); |
| 367 | if (virtualLinkSet == null) { | 371 | if (virtualLinkSet == null) { |
| ... | @@ -374,6 +378,7 @@ public class DistributedVirtualNetworkStore | ... | @@ -374,6 +378,7 @@ public class DistributedVirtualNetworkStore |
| 374 | .src(virtualLink.src()) | 378 | .src(virtualLink.src()) |
| 375 | .dst(virtualLink.dst()) | 379 | .dst(virtualLink.dst()) |
| 376 | .tunnelId(tunnelId) | 380 | .tunnelId(tunnelId) |
| 381 | + .state(state) | ||
| 377 | .build(); | 382 | .build(); |
| 378 | 383 | ||
| 379 | virtualLinkSet.add(newVirtualLink); | 384 | virtualLinkSet.add(newVirtualLink); |
| ... | @@ -471,16 +476,8 @@ public class DistributedVirtualNetworkStore | ... | @@ -471,16 +476,8 @@ public class DistributedVirtualNetworkStore |
| 471 | return ImmutableSet.copyOf(virtualLinkSet); | 476 | return ImmutableSet.copyOf(virtualLinkSet); |
| 472 | } | 477 | } |
| 473 | 478 | ||
| 474 | - /** | 479 | + @Override |
| 475 | - * Returns the virtual link matching the network identifier, source connect point, | 480 | + public VirtualLink getLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { |
| 476 | - * and destination connect point. | ||
| 477 | - * | ||
| 478 | - * @param networkId network identifier | ||
| 479 | - * @param src source connect point | ||
| 480 | - * @param dst destination connect point | ||
| 481 | - * @return virtual link | ||
| 482 | - */ | ||
| 483 | - private VirtualLink getLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) { | ||
| 484 | Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); | 481 | Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId); |
| 485 | if (virtualLinkSet == null) { | 482 | if (virtualLinkSet == null) { |
| 486 | return null; | 483 | return null; |
| ... | @@ -504,6 +501,10 @@ public class DistributedVirtualNetworkStore | ... | @@ -504,6 +501,10 @@ public class DistributedVirtualNetworkStore |
| 504 | virtualPortSet = new HashSet<>(); | 501 | virtualPortSet = new HashSet<>(); |
| 505 | } | 502 | } |
| 506 | 503 | ||
| 504 | + if (deviceId == null) { | ||
| 505 | + return ImmutableSet.copyOf(virtualPortSet); | ||
| 506 | + } | ||
| 507 | + | ||
| 507 | Set<VirtualPort> portSet = new HashSet<>(); | 508 | Set<VirtualPort> portSet = new HashSet<>(); |
| 508 | virtualPortSet.forEach(virtualPort -> { | 509 | virtualPortSet.forEach(virtualPort -> { |
| 509 | if (virtualPort.element().id().equals(deviceId)) { | 510 | if (virtualPort.element().id().equals(deviceId)) { | ... | ... |
-
Please register or login to post a comment