Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
88 changed files
with
1048 additions
and
1420 deletions
1 | package org.onlab.onos.ifwd; | 1 | package org.onlab.onos.ifwd; |
2 | 2 | ||
3 | -import static org.slf4j.LoggerFactory.getLogger; | ||
4 | - | ||
5 | import org.apache.felix.scr.annotations.Activate; | 3 | import org.apache.felix.scr.annotations.Activate; |
6 | import org.apache.felix.scr.annotations.Component; | 4 | import org.apache.felix.scr.annotations.Component; |
7 | import org.apache.felix.scr.annotations.Deactivate; | 5 | import org.apache.felix.scr.annotations.Deactivate; |
8 | import org.apache.felix.scr.annotations.Reference; | 6 | import org.apache.felix.scr.annotations.Reference; |
9 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 7 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
8 | +import org.onlab.onos.ApplicationId; | ||
9 | +import org.onlab.onos.CoreService; | ||
10 | import org.onlab.onos.net.Host; | 10 | import org.onlab.onos.net.Host; |
11 | import org.onlab.onos.net.HostId; | 11 | import org.onlab.onos.net.HostId; |
12 | import org.onlab.onos.net.PortNumber; | 12 | import org.onlab.onos.net.PortNumber; |
... | @@ -16,7 +16,6 @@ import org.onlab.onos.net.flow.TrafficSelector; | ... | @@ -16,7 +16,6 @@ import org.onlab.onos.net.flow.TrafficSelector; |
16 | import org.onlab.onos.net.flow.TrafficTreatment; | 16 | import org.onlab.onos.net.flow.TrafficTreatment; |
17 | import org.onlab.onos.net.host.HostService; | 17 | import org.onlab.onos.net.host.HostService; |
18 | import org.onlab.onos.net.intent.HostToHostIntent; | 18 | import org.onlab.onos.net.intent.HostToHostIntent; |
19 | -import org.onlab.onos.net.intent.IntentId; | ||
20 | import org.onlab.onos.net.intent.IntentService; | 19 | import org.onlab.onos.net.intent.IntentService; |
21 | import org.onlab.onos.net.packet.DefaultOutboundPacket; | 20 | import org.onlab.onos.net.packet.DefaultOutboundPacket; |
22 | import org.onlab.onos.net.packet.InboundPacket; | 21 | import org.onlab.onos.net.packet.InboundPacket; |
... | @@ -28,6 +27,8 @@ import org.onlab.onos.net.topology.TopologyService; | ... | @@ -28,6 +27,8 @@ import org.onlab.onos.net.topology.TopologyService; |
28 | import org.onlab.packet.Ethernet; | 27 | import org.onlab.packet.Ethernet; |
29 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
30 | 29 | ||
30 | +import static org.slf4j.LoggerFactory.getLogger; | ||
31 | + | ||
31 | /** | 32 | /** |
32 | * WORK-IN-PROGRESS: Sample reactive forwarding application using intent framework. | 33 | * WORK-IN-PROGRESS: Sample reactive forwarding application using intent framework. |
33 | */ | 34 | */ |
... | @@ -37,6 +38,9 @@ public class IntentReactiveForwarding { | ... | @@ -37,6 +38,9 @@ public class IntentReactiveForwarding { |
37 | private final Logger log = getLogger(getClass()); | 38 | private final Logger log = getLogger(getClass()); |
38 | 39 | ||
39 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 40 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
41 | + protected CoreService coreService; | ||
42 | + | ||
43 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
40 | protected TopologyService topologyService; | 44 | protected TopologyService topologyService; |
41 | 45 | ||
42 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 46 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
... | @@ -49,11 +53,11 @@ public class IntentReactiveForwarding { | ... | @@ -49,11 +53,11 @@ public class IntentReactiveForwarding { |
49 | protected HostService hostService; | 53 | protected HostService hostService; |
50 | 54 | ||
51 | private ReactivePacketProcessor processor = new ReactivePacketProcessor(); | 55 | private ReactivePacketProcessor processor = new ReactivePacketProcessor(); |
52 | - | 56 | + private ApplicationId appId; |
53 | - private static long intentId = 0x123000; | ||
54 | 57 | ||
55 | @Activate | 58 | @Activate |
56 | public void activate() { | 59 | public void activate() { |
60 | + appId = coreService.registerApplication("org.onlab.onos.ifwd"); | ||
57 | packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2); | 61 | packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2); |
58 | log.info("Started"); | 62 | log.info("Started"); |
59 | } | 63 | } |
... | @@ -126,8 +130,7 @@ public class IntentReactiveForwarding { | ... | @@ -126,8 +130,7 @@ public class IntentReactiveForwarding { |
126 | TrafficSelector selector = DefaultTrafficSelector.builder().build(); | 130 | TrafficSelector selector = DefaultTrafficSelector.builder().build(); |
127 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | 131 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); |
128 | 132 | ||
129 | - HostToHostIntent intent = | 133 | + HostToHostIntent intent = new HostToHostIntent(appId, srcId, dstId, |
130 | - new HostToHostIntent(new IntentId(intentId++), srcId, dstId, | ||
131 | selector, treatment); | 134 | selector, treatment); |
132 | 135 | ||
133 | intentService.submit(intent); | 136 | intentService.submit(intent); | ... | ... |
1 | package org.onlab.onos.sdnip; | 1 | package org.onlab.onos.sdnip; |
2 | 2 | ||
3 | -import java.util.List; | 3 | +import org.onlab.onos.ApplicationId; |
4 | - | ||
5 | import org.onlab.onos.net.ConnectPoint; | 4 | import org.onlab.onos.net.ConnectPoint; |
6 | import org.onlab.onos.net.flow.DefaultTrafficSelector; | 5 | import org.onlab.onos.net.flow.DefaultTrafficSelector; |
7 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; | 6 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
8 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
9 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
10 | -import org.onlab.onos.net.intent.IntentId; | ||
11 | import org.onlab.onos.net.intent.IntentService; | 9 | import org.onlab.onos.net.intent.IntentService; |
12 | import org.onlab.onos.net.intent.PointToPointIntent; | 10 | import org.onlab.onos.net.intent.PointToPointIntent; |
13 | import org.onlab.onos.sdnip.config.BgpPeer; | 11 | import org.onlab.onos.sdnip.config.BgpPeer; |
... | @@ -22,6 +20,8 @@ import org.onlab.packet.IpPrefix; | ... | @@ -22,6 +20,8 @@ import org.onlab.packet.IpPrefix; |
22 | import org.slf4j.Logger; | 20 | import org.slf4j.Logger; |
23 | import org.slf4j.LoggerFactory; | 21 | import org.slf4j.LoggerFactory; |
24 | 22 | ||
23 | +import java.util.List; | ||
24 | + | ||
25 | /** | 25 | /** |
26 | * Manages the connectivity requirements between peers. | 26 | * Manages the connectivity requirements between peers. |
27 | */ | 27 | */ |
... | @@ -38,11 +38,13 @@ public class PeerConnectivityManager { | ... | @@ -38,11 +38,13 @@ public class PeerConnectivityManager { |
38 | private final InterfaceService interfaceService; | 38 | private final InterfaceService interfaceService; |
39 | private final IntentService intentService; | 39 | private final IntentService intentService; |
40 | 40 | ||
41 | - // TODO this sucks. | 41 | + private final ApplicationId appId; |
42 | - private int intentId = 0; | ||
43 | 42 | ||
44 | - public PeerConnectivityManager(SdnIpConfigService configInfoService, | 43 | + public PeerConnectivityManager(ApplicationId appId, |
45 | - InterfaceService interfaceService, IntentService intentService) { | 44 | + SdnIpConfigService configInfoService, |
45 | + InterfaceService interfaceService, | ||
46 | + IntentService intentService) { | ||
47 | + this.appId = appId; | ||
46 | this.configInfoService = configInfoService; | 48 | this.configInfoService = configInfoService; |
47 | this.interfaceService = interfaceService; | 49 | this.interfaceService = interfaceService; |
48 | this.intentService = intentService; | 50 | this.intentService = intentService; |
... | @@ -134,8 +136,8 @@ public class PeerConnectivityManager { | ... | @@ -134,8 +136,8 @@ public class PeerConnectivityManager { |
134 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 136 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
135 | .build(); | 137 | .build(); |
136 | 138 | ||
137 | - PointToPointIntent intentMatchDstTcpPort = new PointToPointIntent( | 139 | + PointToPointIntent intentMatchDstTcpPort = |
138 | - nextIntentId(), selector, treatment, | 140 | + new PointToPointIntent(appId, selector, treatment, |
139 | bgpdConnectPoint, bgpdPeerConnectPoint); | 141 | bgpdConnectPoint, bgpdPeerConnectPoint); |
140 | intentService.submit(intentMatchDstTcpPort); | 142 | intentService.submit(intentMatchDstTcpPort); |
141 | log.debug("Submitted BGP path intent matching dst TCP port 179 " | 143 | log.debug("Submitted BGP path intent matching dst TCP port 179 " |
... | @@ -152,8 +154,8 @@ public class PeerConnectivityManager { | ... | @@ -152,8 +154,8 @@ public class PeerConnectivityManager { |
152 | .matchTcpSrc(BGP_PORT) | 154 | .matchTcpSrc(BGP_PORT) |
153 | .build(); | 155 | .build(); |
154 | 156 | ||
155 | - PointToPointIntent intentMatchSrcTcpPort = new PointToPointIntent( | 157 | + PointToPointIntent intentMatchSrcTcpPort = |
156 | - nextIntentId(), selector, treatment, | 158 | + new PointToPointIntent(appId, selector, treatment, |
157 | bgpdConnectPoint, bgpdPeerConnectPoint); | 159 | bgpdConnectPoint, bgpdPeerConnectPoint); |
158 | intentService.submit(intentMatchSrcTcpPort); | 160 | intentService.submit(intentMatchSrcTcpPort); |
159 | log.debug("Submitted BGP path intent matching src TCP port 179" | 161 | log.debug("Submitted BGP path intent matching src TCP port 179" |
... | @@ -170,8 +172,8 @@ public class PeerConnectivityManager { | ... | @@ -170,8 +172,8 @@ public class PeerConnectivityManager { |
170 | .matchTcpDst(BGP_PORT) | 172 | .matchTcpDst(BGP_PORT) |
171 | .build(); | 173 | .build(); |
172 | 174 | ||
173 | - PointToPointIntent reversedIntentMatchDstTcpPort = new PointToPointIntent( | 175 | + PointToPointIntent reversedIntentMatchDstTcpPort = |
174 | - nextIntentId(), selector, treatment, | 176 | + new PointToPointIntent(appId, selector, treatment, |
175 | bgpdPeerConnectPoint, bgpdConnectPoint); | 177 | bgpdPeerConnectPoint, bgpdConnectPoint); |
176 | intentService.submit(reversedIntentMatchDstTcpPort); | 178 | intentService.submit(reversedIntentMatchDstTcpPort); |
177 | log.debug("Submitted BGP path intent matching dst TCP port 179" | 179 | log.debug("Submitted BGP path intent matching dst TCP port 179" |
... | @@ -188,8 +190,8 @@ public class PeerConnectivityManager { | ... | @@ -188,8 +190,8 @@ public class PeerConnectivityManager { |
188 | .matchTcpSrc(BGP_PORT) | 190 | .matchTcpSrc(BGP_PORT) |
189 | .build(); | 191 | .build(); |
190 | 192 | ||
191 | - PointToPointIntent reversedIntentMatchSrcTcpPort = new PointToPointIntent( | 193 | + PointToPointIntent reversedIntentMatchSrcTcpPort = |
192 | - nextIntentId(), selector, treatment, | 194 | + new PointToPointIntent(appId, selector, treatment, |
193 | bgpdPeerConnectPoint, bgpdConnectPoint); | 195 | bgpdPeerConnectPoint, bgpdConnectPoint); |
194 | intentService.submit(reversedIntentMatchSrcTcpPort); | 196 | intentService.submit(reversedIntentMatchSrcTcpPort); |
195 | log.debug("Submitted BGP path intent matching src TCP port 179" | 197 | log.debug("Submitted BGP path intent matching src TCP port 179" |
... | @@ -258,8 +260,8 @@ public class PeerConnectivityManager { | ... | @@ -258,8 +260,8 @@ public class PeerConnectivityManager { |
258 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 260 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
259 | .build(); | 261 | .build(); |
260 | 262 | ||
261 | - PointToPointIntent intent = new PointToPointIntent( | 263 | + PointToPointIntent intent = |
262 | - nextIntentId(), selector, treatment, | 264 | + new PointToPointIntent(appId, selector, treatment, |
263 | bgpdConnectPoint, bgpdPeerConnectPoint); | 265 | bgpdConnectPoint, bgpdPeerConnectPoint); |
264 | intentService.submit(intent); | 266 | intentService.submit(intent); |
265 | log.debug("Submitted ICMP path intent from BGPd {} to peer {} :" | 267 | log.debug("Submitted ICMP path intent from BGPd {} to peer {} :" |
... | @@ -273,8 +275,8 @@ public class PeerConnectivityManager { | ... | @@ -273,8 +275,8 @@ public class PeerConnectivityManager { |
273 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 275 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) |
274 | .build(); | 276 | .build(); |
275 | 277 | ||
276 | - PointToPointIntent reversedIntent = new PointToPointIntent( | 278 | + PointToPointIntent reversedIntent = |
277 | - nextIntentId(), selector, treatment, | 279 | + new PointToPointIntent(appId, selector, treatment, |
278 | bgpdPeerConnectPoint, bgpdConnectPoint); | 280 | bgpdPeerConnectPoint, bgpdConnectPoint); |
279 | intentService.submit(reversedIntent); | 281 | intentService.submit(reversedIntent); |
280 | log.debug("Submitted ICMP path intent from BGP peer {} to BGPd" | 282 | log.debug("Submitted ICMP path intent from BGP peer {} to BGPd" |
... | @@ -284,7 +286,4 @@ public class PeerConnectivityManager { | ... | @@ -284,7 +286,4 @@ public class PeerConnectivityManager { |
284 | } | 286 | } |
285 | } | 287 | } |
286 | 288 | ||
287 | - private IntentId nextIntentId() { | ||
288 | - return new IntentId(intentId++); | ||
289 | - } | ||
290 | } | 289 | } | ... | ... |
1 | package org.onlab.onos.sdnip; | 1 | package org.onlab.onos.sdnip; |
2 | 2 | ||
3 | -import java.util.Collection; | 3 | +import com.google.common.base.Objects; |
4 | -import java.util.HashMap; | 4 | +import com.google.common.collect.HashMultimap; |
5 | -import java.util.HashSet; | 5 | +import com.google.common.collect.Multimaps; |
6 | -import java.util.Iterator; | 6 | +import com.google.common.collect.SetMultimap; |
7 | -import java.util.LinkedList; | 7 | +import com.google.common.util.concurrent.ThreadFactoryBuilder; |
8 | -import java.util.List; | 8 | +import com.googlecode.concurrenttrees.common.KeyValuePair; |
9 | -import java.util.Map; | 9 | +import com.googlecode.concurrenttrees.radix.node.concrete.DefaultByteArrayNodeFactory; |
10 | -import java.util.Set; | 10 | +import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree; |
11 | -import java.util.concurrent.BlockingQueue; | 11 | +import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree; |
12 | -import java.util.concurrent.ConcurrentHashMap; | ||
13 | -import java.util.concurrent.ExecutorService; | ||
14 | -import java.util.concurrent.Executors; | ||
15 | -import java.util.concurrent.LinkedBlockingQueue; | ||
16 | -import java.util.concurrent.Semaphore; | ||
17 | - | ||
18 | import org.apache.commons.lang3.tuple.Pair; | 12 | import org.apache.commons.lang3.tuple.Pair; |
13 | +import org.onlab.onos.ApplicationId; | ||
19 | import org.onlab.onos.net.ConnectPoint; | 14 | import org.onlab.onos.net.ConnectPoint; |
20 | import org.onlab.onos.net.Host; | 15 | import org.onlab.onos.net.Host; |
21 | import org.onlab.onos.net.flow.DefaultTrafficSelector; | 16 | import org.onlab.onos.net.flow.DefaultTrafficSelector; |
... | @@ -29,7 +24,6 @@ import org.onlab.onos.net.host.HostEvent; | ... | @@ -29,7 +24,6 @@ import org.onlab.onos.net.host.HostEvent; |
29 | import org.onlab.onos.net.host.HostListener; | 24 | import org.onlab.onos.net.host.HostListener; |
30 | import org.onlab.onos.net.host.HostService; | 25 | import org.onlab.onos.net.host.HostService; |
31 | import org.onlab.onos.net.intent.Intent; | 26 | import org.onlab.onos.net.intent.Intent; |
32 | -import org.onlab.onos.net.intent.IntentId; | ||
33 | import org.onlab.onos.net.intent.IntentService; | 27 | import org.onlab.onos.net.intent.IntentService; |
34 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | 28 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; |
35 | import org.onlab.onos.sdnip.config.BgpPeer; | 29 | import org.onlab.onos.sdnip.config.BgpPeer; |
... | @@ -42,20 +36,25 @@ import org.onlab.packet.MacAddress; | ... | @@ -42,20 +36,25 @@ import org.onlab.packet.MacAddress; |
42 | import org.slf4j.Logger; | 36 | import org.slf4j.Logger; |
43 | import org.slf4j.LoggerFactory; | 37 | import org.slf4j.LoggerFactory; |
44 | 38 | ||
45 | -import com.google.common.base.Objects; | 39 | +import java.util.Collection; |
46 | -import com.google.common.collect.HashMultimap; | 40 | +import java.util.HashMap; |
47 | -import com.google.common.collect.Multimaps; | 41 | +import java.util.HashSet; |
48 | -import com.google.common.collect.SetMultimap; | 42 | +import java.util.Iterator; |
49 | -import com.google.common.util.concurrent.ThreadFactoryBuilder; | 43 | +import java.util.LinkedList; |
50 | -import com.googlecode.concurrenttrees.common.KeyValuePair; | 44 | +import java.util.List; |
51 | -import com.googlecode.concurrenttrees.radix.node.concrete.DefaultByteArrayNodeFactory; | 45 | +import java.util.Map; |
52 | -import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree; | 46 | +import java.util.Set; |
53 | -import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree; | 47 | +import java.util.concurrent.BlockingQueue; |
48 | +import java.util.concurrent.ConcurrentHashMap; | ||
49 | +import java.util.concurrent.ExecutorService; | ||
50 | +import java.util.concurrent.Executors; | ||
51 | +import java.util.concurrent.LinkedBlockingQueue; | ||
52 | +import java.util.concurrent.Semaphore; | ||
54 | 53 | ||
55 | /** | 54 | /** |
56 | * This class processes BGP route update, translates each update into a intent | 55 | * This class processes BGP route update, translates each update into a intent |
57 | * and submits the intent. | 56 | * and submits the intent. |
58 | - * | 57 | + * <p/> |
59 | * TODO: Make it thread-safe. | 58 | * TODO: Make it thread-safe. |
60 | */ | 59 | */ |
61 | public class Router implements RouteListener { | 60 | public class Router implements RouteListener { |
... | @@ -82,8 +81,7 @@ public class Router implements RouteListener { | ... | @@ -82,8 +81,7 @@ public class Router implements RouteListener { |
82 | private ExecutorService bgpUpdatesExecutor; | 81 | private ExecutorService bgpUpdatesExecutor; |
83 | private ExecutorService bgpIntentsSynchronizerExecutor; | 82 | private ExecutorService bgpIntentsSynchronizerExecutor; |
84 | 83 | ||
85 | - // TODO temporary | 84 | + private final ApplicationId appId; |
86 | - private int intentId = Integer.MAX_VALUE / 2; | ||
87 | 85 | ||
88 | // | 86 | // |
89 | // State to deal with SDN-IP Leader election and pushing Intents | 87 | // State to deal with SDN-IP Leader election and pushing Intents |
... | @@ -104,9 +102,10 @@ public class Router implements RouteListener { | ... | @@ -104,9 +102,10 @@ public class Router implements RouteListener { |
104 | * @param configInfoService the configuration service | 102 | * @param configInfoService the configuration service |
105 | * @param interfaceService the interface service | 103 | * @param interfaceService the interface service |
106 | */ | 104 | */ |
107 | - public Router(IntentService intentService, HostService hostService, | 105 | + public Router(ApplicationId appId, IntentService intentService, |
108 | - SdnIpConfigService configInfoService, InterfaceService interfaceService) { | 106 | + HostService hostService, SdnIpConfigService configInfoService, |
109 | - | 107 | + InterfaceService interfaceService) { |
108 | + this.appId = appId; | ||
110 | this.intentService = intentService; | 109 | this.intentService = intentService; |
111 | this.hostService = hostService; | 110 | this.hostService = hostService; |
112 | this.configInfoService = configInfoService; | 111 | this.configInfoService = configInfoService; |
... | @@ -609,8 +608,8 @@ public class Router implements RouteListener { | ... | @@ -609,8 +608,8 @@ public class Router implements RouteListener { |
609 | .build(); | 608 | .build(); |
610 | 609 | ||
611 | MultiPointToSinglePointIntent intent = | 610 | MultiPointToSinglePointIntent intent = |
612 | - new MultiPointToSinglePointIntent(nextIntentId(), | 611 | + new MultiPointToSinglePointIntent(appId, selector, treatment, |
613 | - selector, treatment, ingressPorts, egressPort); | 612 | + ingressPorts, egressPort); |
614 | 613 | ||
615 | if (isElectedLeader && isActivatedLeader) { | 614 | if (isElectedLeader && isActivatedLeader) { |
616 | log.debug("Intent installation: adding Intent for prefix: {}", | 615 | log.debug("Intent installation: adding Intent for prefix: {}", |
... | @@ -745,15 +744,6 @@ public class Router implements RouteListener { | ... | @@ -745,15 +744,6 @@ public class Router implements RouteListener { |
745 | } | 744 | } |
746 | 745 | ||
747 | /** | 746 | /** |
748 | - * Generates a new unique intent ID. | ||
749 | - * | ||
750 | - * @return the new intent ID. | ||
751 | - */ | ||
752 | - private IntentId nextIntentId() { | ||
753 | - return new IntentId(intentId++); | ||
754 | - } | ||
755 | - | ||
756 | - /** | ||
757 | * Listener for host events. | 747 | * Listener for host events. |
758 | */ | 748 | */ |
759 | class InternalHostListener implements HostListener { | 749 | class InternalHostListener implements HostListener { | ... | ... |
... | @@ -10,6 +10,8 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -10,6 +10,8 @@ import org.apache.felix.scr.annotations.Deactivate; |
10 | import org.apache.felix.scr.annotations.Reference; | 10 | import org.apache.felix.scr.annotations.Reference; |
11 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 11 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
12 | import org.apache.felix.scr.annotations.Service; | 12 | import org.apache.felix.scr.annotations.Service; |
13 | +import org.onlab.onos.ApplicationId; | ||
14 | +import org.onlab.onos.CoreService; | ||
13 | import org.onlab.onos.net.host.HostService; | 15 | import org.onlab.onos.net.host.HostService; |
14 | import org.onlab.onos.net.intent.IntentService; | 16 | import org.onlab.onos.net.intent.IntentService; |
15 | import org.onlab.onos.sdnip.bgp.BgpRouteEntry; | 17 | import org.onlab.onos.sdnip.bgp.BgpRouteEntry; |
... | @@ -24,9 +26,14 @@ import org.slf4j.Logger; | ... | @@ -24,9 +26,14 @@ import org.slf4j.Logger; |
24 | @Service | 26 | @Service |
25 | public class SdnIp implements SdnIpService { | 27 | public class SdnIp implements SdnIpService { |
26 | 28 | ||
29 | + private static final String SDN_ID_APP = "org.onlab.onos.sdnip"; | ||
30 | + | ||
27 | private final Logger log = getLogger(getClass()); | 31 | private final Logger log = getLogger(getClass()); |
28 | 32 | ||
29 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 33 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
34 | + protected CoreService coreService; | ||
35 | + | ||
36 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
30 | protected IntentService intentService; | 37 | protected IntentService intentService; |
31 | 38 | ||
32 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 39 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
... | @@ -46,10 +53,11 @@ public class SdnIp implements SdnIpService { | ... | @@ -46,10 +53,11 @@ public class SdnIp implements SdnIpService { |
46 | 53 | ||
47 | InterfaceService interfaceService = new HostToInterfaceAdaptor(hostService); | 54 | InterfaceService interfaceService = new HostToInterfaceAdaptor(hostService); |
48 | 55 | ||
49 | - peerConnectivity = new PeerConnectivityManager(config, interfaceService, intentService); | 56 | + ApplicationId appId = coreService.registerApplication(SDN_ID_APP); |
57 | + peerConnectivity = new PeerConnectivityManager(appId, config, interfaceService, intentService); | ||
50 | peerConnectivity.start(); | 58 | peerConnectivity.start(); |
51 | 59 | ||
52 | - router = new Router(intentService, hostService, config, interfaceService); | 60 | + router = new Router(appId, intentService, hostService, config, interfaceService); |
53 | router.start(); | 61 | router.start(); |
54 | 62 | ||
55 | bgpSessionManager = new BgpSessionManager(router); | 63 | bgpSessionManager = new BgpSessionManager(router); | ... | ... |
1 | package org.onlab.onos.sdnip; | 1 | package org.onlab.onos.sdnip; |
2 | 2 | ||
3 | -import static org.easymock.EasyMock.createMock; | 3 | +import com.google.common.collect.Sets; |
4 | -import static org.easymock.EasyMock.expect; | ||
5 | -import static org.easymock.EasyMock.replay; | ||
6 | -import static org.easymock.EasyMock.reportMatcher; | ||
7 | -import static org.easymock.EasyMock.reset; | ||
8 | -import static org.easymock.EasyMock.verify; | ||
9 | - | ||
10 | -import java.util.ArrayList; | ||
11 | -import java.util.Collections; | ||
12 | -import java.util.HashMap; | ||
13 | -import java.util.LinkedList; | ||
14 | -import java.util.List; | ||
15 | -import java.util.Map; | ||
16 | - | ||
17 | import org.easymock.IArgumentMatcher; | 4 | import org.easymock.IArgumentMatcher; |
18 | import org.junit.Before; | 5 | import org.junit.Before; |
19 | import org.junit.Ignore; | 6 | import org.junit.Ignore; |
20 | import org.junit.Test; | 7 | import org.junit.Test; |
8 | +import org.onlab.onos.ApplicationId; | ||
21 | import org.onlab.onos.net.ConnectPoint; | 9 | import org.onlab.onos.net.ConnectPoint; |
22 | import org.onlab.onos.net.DeviceId; | 10 | import org.onlab.onos.net.DeviceId; |
23 | import org.onlab.onos.net.PortNumber; | 11 | import org.onlab.onos.net.PortNumber; |
... | @@ -25,7 +13,6 @@ import org.onlab.onos.net.flow.DefaultTrafficSelector; | ... | @@ -25,7 +13,6 @@ import org.onlab.onos.net.flow.DefaultTrafficSelector; |
25 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; | 13 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
26 | import org.onlab.onos.net.flow.TrafficSelector; | 14 | import org.onlab.onos.net.flow.TrafficSelector; |
27 | import org.onlab.onos.net.flow.TrafficTreatment; | 15 | import org.onlab.onos.net.flow.TrafficTreatment; |
28 | -import org.onlab.onos.net.intent.IntentId; | ||
29 | import org.onlab.onos.net.intent.IntentService; | 16 | import org.onlab.onos.net.intent.IntentService; |
30 | import org.onlab.onos.net.intent.PointToPointIntent; | 17 | import org.onlab.onos.net.intent.PointToPointIntent; |
31 | import org.onlab.onos.sdnip.bgp.BgpConstants; | 18 | import org.onlab.onos.sdnip.bgp.BgpConstants; |
... | @@ -40,13 +27,32 @@ import org.onlab.packet.IpAddress; | ... | @@ -40,13 +27,32 @@ import org.onlab.packet.IpAddress; |
40 | import org.onlab.packet.IpPrefix; | 27 | import org.onlab.packet.IpPrefix; |
41 | import org.onlab.packet.MacAddress; | 28 | import org.onlab.packet.MacAddress; |
42 | 29 | ||
43 | -import com.google.common.collect.Sets; | 30 | +import java.util.ArrayList; |
31 | +import java.util.Collections; | ||
32 | +import java.util.HashMap; | ||
33 | +import java.util.LinkedList; | ||
34 | +import java.util.List; | ||
35 | +import java.util.Map; | ||
36 | + | ||
37 | +import static org.easymock.EasyMock.*; | ||
44 | 38 | ||
45 | /** | 39 | /** |
46 | * Unit tests for PeerConnectivityManager interface. | 40 | * Unit tests for PeerConnectivityManager interface. |
47 | */ | 41 | */ |
48 | public class PeerConnectivityManagerTest { | 42 | public class PeerConnectivityManagerTest { |
49 | 43 | ||
44 | + private static final ApplicationId APPID = new ApplicationId() { | ||
45 | + @Override | ||
46 | + public short id() { | ||
47 | + return 0; | ||
48 | + } | ||
49 | + | ||
50 | + @Override | ||
51 | + public String name() { | ||
52 | + return "foo"; | ||
53 | + } | ||
54 | + }; | ||
55 | + | ||
50 | private PeerConnectivityManager peerConnectivityManager; | 56 | private PeerConnectivityManager peerConnectivityManager; |
51 | private IntentService intentService; | 57 | private IntentService intentService; |
52 | private SdnIpConfigService configInfoService; | 58 | private SdnIpConfigService configInfoService; |
... | @@ -81,9 +87,6 @@ public class PeerConnectivityManagerTest { | ... | @@ -81,9 +87,6 @@ public class PeerConnectivityManagerTest { |
81 | private final ConnectPoint s2Eth1 = | 87 | private final ConnectPoint s2Eth1 = |
82 | new ConnectPoint(deviceId2, PortNumber.portNumber(1)); | 88 | new ConnectPoint(deviceId2, PortNumber.portNumber(1)); |
83 | 89 | ||
84 | - // We don't compare the intent ID so all expected intents can use the same ID | ||
85 | - private final IntentId testIntentId = new IntentId(0); | ||
86 | - | ||
87 | private final TrafficTreatment noTreatment = | 90 | private final TrafficTreatment noTreatment = |
88 | DefaultTrafficTreatment.builder().build(); | 91 | DefaultTrafficTreatment.builder().build(); |
89 | 92 | ||
... | @@ -257,7 +260,7 @@ public class PeerConnectivityManagerTest { | ... | @@ -257,7 +260,7 @@ public class PeerConnectivityManagerTest { |
257 | } | 260 | } |
258 | 261 | ||
259 | PointToPointIntent intent = new PointToPointIntent( | 262 | PointToPointIntent intent = new PointToPointIntent( |
260 | - testIntentId, builder.build(), noTreatment, | 263 | + APPID, builder.build(), noTreatment, |
261 | srcConnectPoint, dstConnectPoint); | 264 | srcConnectPoint, dstConnectPoint); |
262 | 265 | ||
263 | intentList.add(intent); | 266 | intentList.add(intent); |
... | @@ -429,7 +432,7 @@ public class PeerConnectivityManagerTest { | ... | @@ -429,7 +432,7 @@ public class PeerConnectivityManagerTest { |
429 | .build(); | 432 | .build(); |
430 | 433 | ||
431 | PointToPointIntent intent = new PointToPointIntent( | 434 | PointToPointIntent intent = new PointToPointIntent( |
432 | - testIntentId, selector, noTreatment, | 435 | + APPID, selector, noTreatment, |
433 | srcConnectPoint, dstConnectPoint); | 436 | srcConnectPoint, dstConnectPoint); |
434 | 437 | ||
435 | intentList.add(intent); | 438 | intentList.add(intent); |
... | @@ -511,7 +514,7 @@ public class PeerConnectivityManagerTest { | ... | @@ -511,7 +514,7 @@ public class PeerConnectivityManagerTest { |
511 | intentService = createMock(IntentService.class); | 514 | intentService = createMock(IntentService.class); |
512 | replay(intentService); | 515 | replay(intentService); |
513 | 516 | ||
514 | - peerConnectivityManager = new PeerConnectivityManager(configInfoService, | 517 | + peerConnectivityManager = new PeerConnectivityManager(APPID, configInfoService, |
515 | interfaceService, intentService); | 518 | interfaceService, intentService); |
516 | } | 519 | } |
517 | 520 | ||
... | @@ -557,7 +560,7 @@ public class PeerConnectivityManagerTest { | ... | @@ -557,7 +560,7 @@ public class PeerConnectivityManagerTest { |
557 | providedIntentString = providedIntent.toString(); | 560 | providedIntentString = providedIntent.toString(); |
558 | 561 | ||
559 | PointToPointIntent matchIntent = | 562 | PointToPointIntent matchIntent = |
560 | - new PointToPointIntent(providedIntent.id(), | 563 | + new PointToPointIntent(providedIntent.appId(), |
561 | intent.selector(), intent.treatment(), | 564 | intent.selector(), intent.treatment(), |
562 | intent.ingressPoint(), intent.egressPoint()); | 565 | intent.ingressPoint(), intent.egressPoint()); |
563 | 566 | ... | ... |
... | @@ -2,6 +2,8 @@ package org.onlab.onos.cli; | ... | @@ -2,6 +2,8 @@ package org.onlab.onos.cli; |
2 | 2 | ||
3 | import org.apache.karaf.shell.commands.Option; | 3 | import org.apache.karaf.shell.commands.Option; |
4 | import org.apache.karaf.shell.console.OsgiCommandSupport; | 4 | import org.apache.karaf.shell.console.OsgiCommandSupport; |
5 | +import org.onlab.onos.ApplicationId; | ||
6 | +import org.onlab.onos.CoreService; | ||
5 | import org.onlab.osgi.DefaultServiceDirectory; | 7 | import org.onlab.osgi.DefaultServiceDirectory; |
6 | import org.onlab.osgi.ServiceNotFoundException; | 8 | import org.onlab.osgi.ServiceNotFoundException; |
7 | 9 | ||
... | @@ -27,6 +29,15 @@ public abstract class AbstractShellCommand extends OsgiCommandSupport { | ... | @@ -27,6 +29,15 @@ public abstract class AbstractShellCommand extends OsgiCommandSupport { |
27 | } | 29 | } |
28 | 30 | ||
29 | /** | 31 | /** |
32 | + * Returns application ID for the CLI. | ||
33 | + * | ||
34 | + * @return command-line application identifier | ||
35 | + */ | ||
36 | + protected ApplicationId appId() { | ||
37 | + return get(CoreService.class).registerApplication("org.onlab.onos.cli"); | ||
38 | + } | ||
39 | + | ||
40 | + /** | ||
30 | * Prints the arguments using the specified format. | 41 | * Prints the arguments using the specified format. |
31 | * | 42 | * |
32 | * @param format format string; see {@link String#format} | 43 | * @param format format string; see {@link String#format} | ... | ... |
... | @@ -9,7 +9,6 @@ import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ... | @@ -9,7 +9,6 @@ import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
9 | import org.onlab.onos.net.flow.TrafficSelector; | 9 | import org.onlab.onos.net.flow.TrafficSelector; |
10 | import org.onlab.onos.net.flow.TrafficTreatment; | 10 | import org.onlab.onos.net.flow.TrafficTreatment; |
11 | import org.onlab.onos.net.intent.HostToHostIntent; | 11 | import org.onlab.onos.net.intent.HostToHostIntent; |
12 | -import org.onlab.onos.net.intent.IntentId; | ||
13 | import org.onlab.onos.net.intent.IntentService; | 12 | import org.onlab.onos.net.intent.IntentService; |
14 | 13 | ||
15 | /** | 14 | /** |
... | @@ -27,8 +26,6 @@ public class AddHostToHostIntentCommand extends AbstractShellCommand { | ... | @@ -27,8 +26,6 @@ public class AddHostToHostIntentCommand extends AbstractShellCommand { |
27 | required = true, multiValued = false) | 26 | required = true, multiValued = false) |
28 | String two = null; | 27 | String two = null; |
29 | 28 | ||
30 | - private static long id = 0x7870001; | ||
31 | - | ||
32 | @Override | 29 | @Override |
33 | protected void execute() { | 30 | protected void execute() { |
34 | IntentService service = get(IntentService.class); | 31 | IntentService service = get(IntentService.class); |
... | @@ -39,8 +36,7 @@ public class AddHostToHostIntentCommand extends AbstractShellCommand { | ... | @@ -39,8 +36,7 @@ public class AddHostToHostIntentCommand extends AbstractShellCommand { |
39 | TrafficSelector selector = DefaultTrafficSelector.builder().build(); | 36 | TrafficSelector selector = DefaultTrafficSelector.builder().build(); |
40 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | 37 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); |
41 | 38 | ||
42 | - HostToHostIntent intent = | 39 | + HostToHostIntent intent = new HostToHostIntent(appId(), oneId, twoId, |
43 | - new HostToHostIntent(new IntentId(id++), oneId, twoId, | ||
44 | selector, treatment); | 40 | selector, treatment); |
45 | service.submit(intent); | 41 | service.submit(intent); |
46 | } | 42 | } | ... | ... |
1 | package org.onlab.onos.cli.net; | 1 | package org.onlab.onos.cli.net; |
2 | 2 | ||
3 | -import java.util.HashSet; | ||
4 | -import java.util.Set; | ||
5 | - | ||
6 | import org.apache.karaf.shell.commands.Argument; | 3 | import org.apache.karaf.shell.commands.Argument; |
7 | import org.apache.karaf.shell.commands.Command; | 4 | import org.apache.karaf.shell.commands.Command; |
8 | import org.onlab.onos.cli.AbstractShellCommand; | 5 | import org.onlab.onos.cli.AbstractShellCommand; |
... | @@ -14,11 +11,16 @@ import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ... | @@ -14,11 +11,16 @@ import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
14 | import org.onlab.onos.net.flow.TrafficSelector; | 11 | import org.onlab.onos.net.flow.TrafficSelector; |
15 | import org.onlab.onos.net.flow.TrafficTreatment; | 12 | import org.onlab.onos.net.flow.TrafficTreatment; |
16 | import org.onlab.onos.net.intent.Intent; | 13 | import org.onlab.onos.net.intent.Intent; |
17 | -import org.onlab.onos.net.intent.IntentId; | ||
18 | import org.onlab.onos.net.intent.IntentService; | 14 | import org.onlab.onos.net.intent.IntentService; |
19 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | 15 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; |
20 | import org.onlab.packet.Ethernet; | 16 | import org.onlab.packet.Ethernet; |
21 | 17 | ||
18 | +import java.util.HashSet; | ||
19 | +import java.util.Set; | ||
20 | + | ||
21 | +import static org.onlab.onos.net.DeviceId.deviceId; | ||
22 | +import static org.onlab.onos.net.PortNumber.portNumber; | ||
23 | + | ||
22 | /** | 24 | /** |
23 | * Installs point-to-point connectivity intents. | 25 | * Installs point-to-point connectivity intents. |
24 | */ | 26 | */ |
... | @@ -31,8 +33,6 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman | ... | @@ -31,8 +33,6 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman |
31 | required = true, multiValued = true) | 33 | required = true, multiValued = true) |
32 | String[] deviceStrings = null; | 34 | String[] deviceStrings = null; |
33 | 35 | ||
34 | - private static long id = 0x7070001; | ||
35 | - | ||
36 | @Override | 36 | @Override |
37 | protected void execute() { | 37 | protected void execute() { |
38 | IntentService service = get(IntentService.class); | 38 | IntentService service = get(IntentService.class); |
... | @@ -42,33 +42,26 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman | ... | @@ -42,33 +42,26 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman |
42 | } | 42 | } |
43 | 43 | ||
44 | String egressDeviceString = deviceStrings[deviceStrings.length - 1]; | 44 | String egressDeviceString = deviceStrings[deviceStrings.length - 1]; |
45 | - DeviceId egressDeviceId = DeviceId.deviceId(getDeviceId(egressDeviceString)); | 45 | + DeviceId egressDeviceId = deviceId(getDeviceId(egressDeviceString)); |
46 | - PortNumber egressPortNumber = | 46 | + PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString)); |
47 | - PortNumber.portNumber(getPortNumber(egressDeviceString)); | ||
48 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); | 47 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); |
49 | Set<ConnectPoint> ingressPoints = new HashSet<>(); | 48 | Set<ConnectPoint> ingressPoints = new HashSet<>(); |
50 | 49 | ||
51 | for (int index = 0; index < deviceStrings.length - 1; index++) { | 50 | for (int index = 0; index < deviceStrings.length - 1; index++) { |
52 | String ingressDeviceString = deviceStrings[index]; | 51 | String ingressDeviceString = deviceStrings[index]; |
53 | - DeviceId ingressDeviceId = DeviceId.deviceId(getDeviceId(ingressDeviceString)); | 52 | + DeviceId ingressDeviceId = deviceId(getDeviceId(ingressDeviceString)); |
54 | - PortNumber ingressPortNumber = | 53 | + PortNumber ingressPortNumber = portNumber(getPortNumber(ingressDeviceString)); |
55 | - PortNumber.portNumber(getPortNumber(ingressDeviceString)); | ||
56 | ConnectPoint ingress = new ConnectPoint(ingressDeviceId, ingressPortNumber); | 54 | ConnectPoint ingress = new ConnectPoint(ingressDeviceId, ingressPortNumber); |
57 | ingressPoints.add(ingress); | 55 | ingressPoints.add(ingress); |
58 | } | 56 | } |
59 | 57 | ||
60 | - | ||
61 | TrafficSelector selector = DefaultTrafficSelector.builder() | 58 | TrafficSelector selector = DefaultTrafficSelector.builder() |
62 | .matchEthType(Ethernet.TYPE_IPV4) | 59 | .matchEthType(Ethernet.TYPE_IPV4) |
63 | .build(); | 60 | .build(); |
64 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | 61 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); |
65 | 62 | ||
66 | - Intent intent = | 63 | + Intent intent = new MultiPointToSinglePointIntent(appId(), selector, treatment, |
67 | - new MultiPointToSinglePointIntent(new IntentId(id++), | 64 | + ingressPoints, egress); |
68 | - selector, | ||
69 | - treatment, | ||
70 | - ingressPoints, | ||
71 | - egress); | ||
72 | service.submit(intent); | 65 | service.submit(intent); |
73 | } | 66 | } |
74 | 67 | ... | ... |
... | @@ -11,11 +11,13 @@ import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ... | @@ -11,11 +11,13 @@ import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
11 | import org.onlab.onos.net.flow.TrafficSelector; | 11 | import org.onlab.onos.net.flow.TrafficSelector; |
12 | import org.onlab.onos.net.flow.TrafficTreatment; | 12 | import org.onlab.onos.net.flow.TrafficTreatment; |
13 | import org.onlab.onos.net.intent.Intent; | 13 | import org.onlab.onos.net.intent.Intent; |
14 | -import org.onlab.onos.net.intent.IntentId; | ||
15 | import org.onlab.onos.net.intent.IntentService; | 14 | import org.onlab.onos.net.intent.IntentService; |
16 | import org.onlab.onos.net.intent.PointToPointIntent; | 15 | import org.onlab.onos.net.intent.PointToPointIntent; |
17 | import org.onlab.packet.Ethernet; | 16 | import org.onlab.packet.Ethernet; |
18 | 17 | ||
18 | +import static org.onlab.onos.net.DeviceId.deviceId; | ||
19 | +import static org.onlab.onos.net.PortNumber.portNumber; | ||
20 | + | ||
19 | /** | 21 | /** |
20 | * Installs point-to-point connectivity intents. | 22 | * Installs point-to-point connectivity intents. |
21 | */ | 23 | */ |
... | @@ -33,20 +35,16 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { | ... | @@ -33,20 +35,16 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { |
33 | required = true, multiValued = false) | 35 | required = true, multiValued = false) |
34 | String egressDeviceString = null; | 36 | String egressDeviceString = null; |
35 | 37 | ||
36 | - private static long id = 0x7470001; | ||
37 | - | ||
38 | @Override | 38 | @Override |
39 | protected void execute() { | 39 | protected void execute() { |
40 | IntentService service = get(IntentService.class); | 40 | IntentService service = get(IntentService.class); |
41 | 41 | ||
42 | - DeviceId ingressDeviceId = DeviceId.deviceId(getDeviceId(ingressDeviceString)); | 42 | + DeviceId ingressDeviceId = deviceId(getDeviceId(ingressDeviceString)); |
43 | - PortNumber ingressPortNumber = | 43 | + PortNumber ingressPortNumber = portNumber(getPortNumber(ingressDeviceString)); |
44 | - PortNumber.portNumber(getPortNumber(ingressDeviceString)); | ||
45 | ConnectPoint ingress = new ConnectPoint(ingressDeviceId, ingressPortNumber); | 44 | ConnectPoint ingress = new ConnectPoint(ingressDeviceId, ingressPortNumber); |
46 | 45 | ||
47 | - DeviceId egressDeviceId = DeviceId.deviceId(getDeviceId(egressDeviceString)); | 46 | + DeviceId egressDeviceId = deviceId(getDeviceId(egressDeviceString)); |
48 | - PortNumber egressPortNumber = | 47 | + PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString)); |
49 | - PortNumber.portNumber(getPortNumber(egressDeviceString)); | ||
50 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); | 48 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); |
51 | 49 | ||
52 | TrafficSelector selector = DefaultTrafficSelector.builder() | 50 | TrafficSelector selector = DefaultTrafficSelector.builder() |
... | @@ -54,12 +52,8 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { | ... | @@ -54,12 +52,8 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { |
54 | .build(); | 52 | .build(); |
55 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | 53 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); |
56 | 54 | ||
57 | - Intent intent = | 55 | + Intent intent = new PointToPointIntent(appId(), selector, treatment, |
58 | - new PointToPointIntent(new IntentId(id++), | 56 | + ingress, egress); |
59 | - selector, | ||
60 | - treatment, | ||
61 | - ingress, | ||
62 | - egress); | ||
63 | service.submit(intent); | 57 | service.submit(intent); |
64 | } | 58 | } |
65 | 59 | ... | ... |
1 | package org.onlab.onos.cli.net; | 1 | package org.onlab.onos.cli.net; |
2 | 2 | ||
3 | -import java.util.concurrent.CountDownLatch; | ||
4 | -import java.util.concurrent.TimeUnit; | ||
5 | - | ||
6 | import org.apache.karaf.shell.commands.Argument; | 3 | import org.apache.karaf.shell.commands.Argument; |
7 | import org.apache.karaf.shell.commands.Command; | 4 | import org.apache.karaf.shell.commands.Command; |
8 | import org.onlab.onos.cli.AbstractShellCommand; | 5 | import org.onlab.onos.cli.AbstractShellCommand; |
... | @@ -16,13 +13,18 @@ import org.onlab.onos.net.flow.TrafficTreatment; | ... | @@ -16,13 +13,18 @@ import org.onlab.onos.net.flow.TrafficTreatment; |
16 | import org.onlab.onos.net.intent.Intent; | 13 | import org.onlab.onos.net.intent.Intent; |
17 | import org.onlab.onos.net.intent.IntentEvent; | 14 | import org.onlab.onos.net.intent.IntentEvent; |
18 | import org.onlab.onos.net.intent.IntentEvent.Type; | 15 | import org.onlab.onos.net.intent.IntentEvent.Type; |
19 | -import org.onlab.onos.net.intent.IntentId; | ||
20 | import org.onlab.onos.net.intent.IntentListener; | 16 | import org.onlab.onos.net.intent.IntentListener; |
21 | import org.onlab.onos.net.intent.IntentService; | 17 | import org.onlab.onos.net.intent.IntentService; |
22 | import org.onlab.onos.net.intent.PointToPointIntent; | 18 | import org.onlab.onos.net.intent.PointToPointIntent; |
23 | import org.onlab.packet.Ethernet; | 19 | import org.onlab.packet.Ethernet; |
24 | import org.onlab.packet.MacAddress; | 20 | import org.onlab.packet.MacAddress; |
25 | 21 | ||
22 | +import java.util.concurrent.CountDownLatch; | ||
23 | +import java.util.concurrent.TimeUnit; | ||
24 | + | ||
25 | +import static org.onlab.onos.net.DeviceId.deviceId; | ||
26 | +import static org.onlab.onos.net.PortNumber.portNumber; | ||
27 | + | ||
26 | /** | 28 | /** |
27 | * Installs point-to-point connectivity intents. | 29 | * Installs point-to-point connectivity intents. |
28 | */ | 30 | */ |
... | @@ -57,14 +59,12 @@ public class IntentPushTestCommand extends AbstractShellCommand | ... | @@ -57,14 +59,12 @@ public class IntentPushTestCommand extends AbstractShellCommand |
57 | protected void execute() { | 59 | protected void execute() { |
58 | service = get(IntentService.class); | 60 | service = get(IntentService.class); |
59 | 61 | ||
60 | - DeviceId ingressDeviceId = DeviceId.deviceId(getDeviceId(ingressDeviceString)); | 62 | + DeviceId ingressDeviceId = deviceId(getDeviceId(ingressDeviceString)); |
61 | - PortNumber ingressPortNumber = | 63 | + PortNumber ingressPortNumber = portNumber(getPortNumber(ingressDeviceString)); |
62 | - PortNumber.portNumber(getPortNumber(ingressDeviceString)); | ||
63 | ConnectPoint ingress = new ConnectPoint(ingressDeviceId, ingressPortNumber); | 64 | ConnectPoint ingress = new ConnectPoint(ingressDeviceId, ingressPortNumber); |
64 | 65 | ||
65 | - DeviceId egressDeviceId = DeviceId.deviceId(getDeviceId(egressDeviceString)); | 66 | + DeviceId egressDeviceId = deviceId(getDeviceId(egressDeviceString)); |
66 | - PortNumber egressPortNumber = | 67 | + PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString)); |
67 | - PortNumber.portNumber(getPortNumber(egressDeviceString)); | ||
68 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); | 68 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); |
69 | 69 | ||
70 | TrafficSelector.Builder selector = DefaultTrafficSelector.builder() | 70 | TrafficSelector.Builder selector = DefaultTrafficSelector.builder() |
... | @@ -81,12 +81,8 @@ public class IntentPushTestCommand extends AbstractShellCommand | ... | @@ -81,12 +81,8 @@ public class IntentPushTestCommand extends AbstractShellCommand |
81 | TrafficSelector s = selector | 81 | TrafficSelector s = selector |
82 | .matchEthSrc(MacAddress.valueOf(i)) | 82 | .matchEthSrc(MacAddress.valueOf(i)) |
83 | .build(); | 83 | .build(); |
84 | - Intent intent = | 84 | + Intent intent = new PointToPointIntent(appId(), s, treatment, |
85 | - new PointToPointIntent(new IntentId(id++), | 85 | + ingress, egress); |
86 | - s, | ||
87 | - treatment, | ||
88 | - ingress, | ||
89 | - egress); | ||
90 | service.submit(intent); | 86 | service.submit(intent); |
91 | } | 87 | } |
92 | try { | 88 | try { | ... | ... |
... | @@ -7,6 +7,8 @@ import org.onlab.onos.net.intent.Intent; | ... | @@ -7,6 +7,8 @@ import org.onlab.onos.net.intent.Intent; |
7 | import org.onlab.onos.net.intent.IntentId; | 7 | import org.onlab.onos.net.intent.IntentId; |
8 | import org.onlab.onos.net.intent.IntentService; | 8 | import org.onlab.onos.net.intent.IntentService; |
9 | 9 | ||
10 | +import java.math.BigInteger; | ||
11 | + | ||
10 | /** | 12 | /** |
11 | * Removes host-to-host connectivity intent. | 13 | * Removes host-to-host connectivity intent. |
12 | */ | 14 | */ |
... | @@ -22,13 +24,11 @@ public class IntentRemoveCommand extends AbstractShellCommand { | ... | @@ -22,13 +24,11 @@ public class IntentRemoveCommand extends AbstractShellCommand { |
22 | protected void execute() { | 24 | protected void execute() { |
23 | IntentService service = get(IntentService.class); | 25 | IntentService service = get(IntentService.class); |
24 | 26 | ||
25 | - int radix = id.startsWith("0x") ? 16 : 10; | 27 | + if (id.startsWith("0x")) { |
26 | - if (radix == 16) { | ||
27 | id = id.replaceFirst("0x", ""); | 28 | id = id.replaceFirst("0x", ""); |
28 | } | 29 | } |
29 | - IntentId intentId = new IntentId(Long.parseLong(id, radix)); | ||
30 | - | ||
31 | 30 | ||
31 | + IntentId intentId = IntentId.valueOf(new BigInteger(id, 16).longValue()); | ||
32 | Intent intent = service.getIntent(intentId); | 32 | Intent intent = service.getIntent(intentId); |
33 | if (intent != null) { | 33 | if (intent != null) { |
34 | service.withdraw(intent); | 34 | service.withdraw(intent); | ... | ... |
... | @@ -18,7 +18,8 @@ public class IntentsListCommand extends AbstractShellCommand { | ... | @@ -18,7 +18,8 @@ public class IntentsListCommand extends AbstractShellCommand { |
18 | IntentService service = get(IntentService.class); | 18 | IntentService service = get(IntentService.class); |
19 | for (Intent intent : service.getIntents()) { | 19 | for (Intent intent : service.getIntents()) { |
20 | IntentState state = service.getIntentState(intent.id()); | 20 | IntentState state = service.getIntentState(intent.id()); |
21 | - print("%s %s %s", intent.id(), state, intent); | 21 | + print("id=%s, state=%s, appId=%s, %s", |
22 | + intent.id(), state, intent.appId().name(), intent); | ||
22 | } | 23 | } |
23 | } | 24 | } |
24 | 25 | ... | ... |
1 | package org.onlab.onos.cluster; | 1 | package org.onlab.onos.cluster; |
2 | 2 | ||
3 | -import java.util.Collections; | ||
4 | -import java.util.LinkedList; | ||
5 | import java.util.List; | 3 | import java.util.List; |
6 | import java.util.Objects; | 4 | import java.util.Objects; |
7 | 5 | ||
8 | -import static com.google.common.base.Preconditions.checkNotNull; | 6 | +import com.google.common.collect.ImmutableList; |
9 | 7 | ||
10 | /** | 8 | /** |
11 | * A container for detailed role information for a device, | 9 | * A container for detailed role information for a device, |
... | @@ -18,9 +16,7 @@ public class RoleInfo { | ... | @@ -18,9 +16,7 @@ public class RoleInfo { |
18 | 16 | ||
19 | public RoleInfo(NodeId master, List<NodeId> backups) { | 17 | public RoleInfo(NodeId master, List<NodeId> backups) { |
20 | this.master = master; | 18 | this.master = master; |
21 | - this.backups = new LinkedList<>(); | 19 | + this.backups = ImmutableList.copyOf(backups); |
22 | - | ||
23 | - this.backups.addAll(checkNotNull(backups)); | ||
24 | } | 20 | } |
25 | 21 | ||
26 | public NodeId master() { | 22 | public NodeId master() { |
... | @@ -28,7 +24,7 @@ public class RoleInfo { | ... | @@ -28,7 +24,7 @@ public class RoleInfo { |
28 | } | 24 | } |
29 | 25 | ||
30 | public List<NodeId> backups() { | 26 | public List<NodeId> backups() { |
31 | - return Collections.unmodifiableList(backups); | 27 | + return backups; |
32 | } | 28 | } |
33 | 29 | ||
34 | @Override | 30 | @Override |
... | @@ -57,10 +53,10 @@ public class RoleInfo { | ... | @@ -57,10 +53,10 @@ public class RoleInfo { |
57 | @Override | 53 | @Override |
58 | public String toString() { | 54 | public String toString() { |
59 | final StringBuilder builder = new StringBuilder(); | 55 | final StringBuilder builder = new StringBuilder(); |
60 | - builder.append("master: \n\t").append(master).append("\n"); | 56 | + builder.append("master:").append(master).append(","); |
61 | - builder.append("backups: \n"); | 57 | + builder.append("backups:"); |
62 | for (NodeId n : backups) { | 58 | for (NodeId n : backups) { |
63 | - builder.append("\t").append(n).append("\n"); | 59 | + builder.append(" ").append(n); |
64 | } | 60 | } |
65 | return builder.toString(); | 61 | return builder.toString(); |
66 | } | 62 | } | ... | ... |
... | @@ -3,7 +3,7 @@ package org.onlab.onos.net; | ... | @@ -3,7 +3,7 @@ package org.onlab.onos.net; |
3 | /** | 3 | /** |
4 | * Abstraction of a network infrastructure link. | 4 | * Abstraction of a network infrastructure link. |
5 | */ | 5 | */ |
6 | -public interface Link extends Annotated, Provided { | 6 | +public interface Link extends Annotated, Provided, NetworkResource { |
7 | 7 | ||
8 | /** | 8 | /** |
9 | * Coarse representation of the link type. | 9 | * Coarse representation of the link type. | ... | ... |
... | @@ -8,7 +8,6 @@ import org.onlab.packet.IpPrefix; | ... | @@ -8,7 +8,6 @@ import org.onlab.packet.IpPrefix; |
8 | import org.onlab.packet.MacAddress; | 8 | import org.onlab.packet.MacAddress; |
9 | import org.onlab.packet.VlanId; | 9 | import org.onlab.packet.VlanId; |
10 | 10 | ||
11 | -import java.util.Collections; | ||
12 | import java.util.HashMap; | 11 | import java.util.HashMap; |
13 | import java.util.Map; | 12 | import java.util.Map; |
14 | import java.util.Objects; | 13 | import java.util.Objects; |
... | @@ -27,7 +26,7 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -27,7 +26,7 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
27 | * @param criteria criteria | 26 | * @param criteria criteria |
28 | */ | 27 | */ |
29 | private DefaultTrafficSelector(Set<Criterion> criteria) { | 28 | private DefaultTrafficSelector(Set<Criterion> criteria) { |
30 | - this.criteria = Collections.unmodifiableSet(criteria); | 29 | + this.criteria = ImmutableSet.copyOf(criteria); |
31 | } | 30 | } |
32 | 31 | ||
33 | @Override | 32 | @Override | ... | ... |
... | @@ -7,7 +7,8 @@ import org.onlab.packet.IpPrefix; | ... | @@ -7,7 +7,8 @@ import org.onlab.packet.IpPrefix; |
7 | import org.onlab.packet.MacAddress; | 7 | import org.onlab.packet.MacAddress; |
8 | import org.onlab.packet.VlanId; | 8 | import org.onlab.packet.VlanId; |
9 | 9 | ||
10 | -import java.util.Collections; | 10 | +import com.google.common.collect.ImmutableList; |
11 | + | ||
11 | import java.util.LinkedList; | 12 | import java.util.LinkedList; |
12 | import java.util.List; | 13 | import java.util.List; |
13 | import java.util.Objects; | 14 | import java.util.Objects; |
... | @@ -25,7 +26,7 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { | ... | @@ -25,7 +26,7 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { |
25 | * @param instructions treatment instructions | 26 | * @param instructions treatment instructions |
26 | */ | 27 | */ |
27 | private DefaultTrafficTreatment(List<Instruction> instructions) { | 28 | private DefaultTrafficTreatment(List<Instruction> instructions) { |
28 | - this.instructions = Collections.unmodifiableList(instructions); | 29 | + this.instructions = ImmutableList.copyOf(instructions); |
29 | } | 30 | } |
30 | 31 | ||
31 | @Override | 32 | @Override | ... | ... |
... | @@ -24,7 +24,18 @@ public class FlowRuleEvent extends AbstractEvent<FlowRuleEvent.Type, FlowRule> { | ... | @@ -24,7 +24,18 @@ public class FlowRuleEvent extends AbstractEvent<FlowRuleEvent.Type, FlowRule> { |
24 | /** | 24 | /** |
25 | * Signifies that a rule has been updated. | 25 | * Signifies that a rule has been updated. |
26 | */ | 26 | */ |
27 | - RULE_UPDATED | 27 | + RULE_UPDATED, |
28 | + | ||
29 | + // internal event between Manager <-> Store | ||
30 | + | ||
31 | + /* | ||
32 | + * Signifies that a request to add flow rule has been added to the store. | ||
33 | + */ | ||
34 | + RULE_ADD_REQUESTED, | ||
35 | + /* | ||
36 | + * Signifies that a request to remove flow rule has been added to the store. | ||
37 | + */ | ||
38 | + RULE_REMOVE_REQUESTED, | ||
28 | } | 39 | } |
29 | 40 | ||
30 | /** | 41 | /** | ... | ... |
... | @@ -44,16 +44,18 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat | ... | @@ -44,16 +44,18 @@ public interface FlowRuleStore extends Store<FlowRuleEvent, FlowRuleStoreDelegat |
44 | * Stores a new flow rule without generating events. | 44 | * Stores a new flow rule without generating events. |
45 | * | 45 | * |
46 | * @param rule the flow rule to add | 46 | * @param rule the flow rule to add |
47 | + * @return true if the rule should be handled locally | ||
47 | */ | 48 | */ |
48 | - void storeFlowRule(FlowRule rule); | 49 | + boolean storeFlowRule(FlowRule rule); |
49 | 50 | ||
50 | /** | 51 | /** |
51 | * Marks a flow rule for deletion. Actual deletion will occur | 52 | * Marks a flow rule for deletion. Actual deletion will occur |
52 | * when the provider indicates that the flow has been removed. | 53 | * when the provider indicates that the flow has been removed. |
53 | * | 54 | * |
54 | * @param rule the flow rule to delete | 55 | * @param rule the flow rule to delete |
56 | + * @return true if the rule should be handled locally | ||
55 | */ | 57 | */ |
56 | - void deleteFlowRule(FlowRule rule); | 58 | + boolean deleteFlowRule(FlowRule rule); |
57 | 59 | ||
58 | /** | 60 | /** |
59 | * Stores a new flow rule, or updates an existing entry. | 61 | * Stores a new flow rule, or updates an existing entry. | ... | ... |
1 | -package org.onlab.onos.net.intent; | ||
2 | - | ||
3 | -/** | ||
4 | - * Base intent implementation. | ||
5 | - */ | ||
6 | -public abstract class AbstractIntent implements Intent { | ||
7 | - | ||
8 | - private final IntentId id; | ||
9 | - | ||
10 | - /** | ||
11 | - * Creates a base intent with the specified identifier. | ||
12 | - * | ||
13 | - * @param id intent identifier | ||
14 | - */ | ||
15 | - protected AbstractIntent(IntentId id) { | ||
16 | - this.id = id; | ||
17 | - } | ||
18 | - | ||
19 | - /** | ||
20 | - * Constructor for serializer. | ||
21 | - */ | ||
22 | - protected AbstractIntent() { | ||
23 | - this.id = null; | ||
24 | - } | ||
25 | - | ||
26 | - @Override | ||
27 | - public IntentId id() { | ||
28 | - return id; | ||
29 | - } | ||
30 | - | ||
31 | - @Override | ||
32 | - public boolean equals(Object o) { | ||
33 | - if (this == o) { | ||
34 | - return true; | ||
35 | - } | ||
36 | - if (o == null || getClass() != o.getClass()) { | ||
37 | - return false; | ||
38 | - } | ||
39 | - | ||
40 | - AbstractIntent that = (AbstractIntent) o; | ||
41 | - return id.equals(that.id); | ||
42 | - } | ||
43 | - | ||
44 | - @Override | ||
45 | - public int hashCode() { | ||
46 | - return id.hashCode(); | ||
47 | - } | ||
48 | - | ||
49 | -} |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | -import com.google.common.base.Objects; | 3 | +import com.google.common.collect.ImmutableSet; |
4 | +import org.onlab.onos.ApplicationId; | ||
5 | +import org.onlab.onos.net.Link; | ||
6 | +import org.onlab.onos.net.NetworkResource; | ||
4 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
5 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
6 | 9 | ||
10 | +import java.util.Collection; | ||
11 | + | ||
7 | import static com.google.common.base.Preconditions.checkNotNull; | 12 | import static com.google.common.base.Preconditions.checkNotNull; |
8 | 13 | ||
9 | /** | 14 | /** |
10 | * Abstraction of connectivity intent for traffic matching some criteria. | 15 | * Abstraction of connectivity intent for traffic matching some criteria. |
11 | */ | 16 | */ |
12 | -public abstract class ConnectivityIntent extends AbstractIntent { | 17 | +public abstract class ConnectivityIntent extends Intent { |
13 | 18 | ||
14 | // TODO: other forms of intents should be considered for this family: | 19 | // TODO: other forms of intents should be considered for this family: |
15 | // point-to-point with constraints (waypoints/obstacles) | 20 | // point-to-point with constraints (waypoints/obstacles) |
... | @@ -19,24 +24,26 @@ public abstract class ConnectivityIntent extends AbstractIntent { | ... | @@ -19,24 +24,26 @@ public abstract class ConnectivityIntent extends AbstractIntent { |
19 | // ... | 24 | // ... |
20 | 25 | ||
21 | private final TrafficSelector selector; | 26 | private final TrafficSelector selector; |
22 | - // TODO: should consider which is better for multiple actions, | ||
23 | - // defining compound action class or using list of actions. | ||
24 | private final TrafficTreatment treatment; | 27 | private final TrafficTreatment treatment; |
25 | 28 | ||
26 | /** | 29 | /** |
27 | - * Creates a connectivity intent that matches on the specified intent | 30 | + * Creates a connectivity intent that matches on the specified selector |
28 | - * and applies the specified treatement. | 31 | + * and applies the specified treatment. |
29 | * | 32 | * |
30 | - * @param intentId intent identifier | 33 | + * @param id intent identifier |
34 | + * @param appId application identifier | ||
35 | + * @param resources required network resources (optional) | ||
31 | * @param selector traffic selector | 36 | * @param selector traffic selector |
32 | - * @param treatement treatement | 37 | + * @param treatment treatment |
33 | * @throws NullPointerException if the selector or treatement is null | 38 | * @throws NullPointerException if the selector or treatement is null |
34 | */ | 39 | */ |
35 | - protected ConnectivityIntent(IntentId intentId, TrafficSelector selector, | 40 | + protected ConnectivityIntent(IntentId id, ApplicationId appId, |
36 | - TrafficTreatment treatement) { | 41 | + Collection<NetworkResource> resources, |
37 | - super(intentId); | 42 | + TrafficSelector selector, |
43 | + TrafficTreatment treatment) { | ||
44 | + super(id, appId, resources); | ||
38 | this.selector = checkNotNull(selector); | 45 | this.selector = checkNotNull(selector); |
39 | - this.treatment = checkNotNull(treatement); | 46 | + this.treatment = checkNotNull(treatment); |
40 | } | 47 | } |
41 | 48 | ||
42 | /** | 49 | /** |
... | @@ -66,19 +73,14 @@ public abstract class ConnectivityIntent extends AbstractIntent { | ... | @@ -66,19 +73,14 @@ public abstract class ConnectivityIntent extends AbstractIntent { |
66 | return treatment; | 73 | return treatment; |
67 | } | 74 | } |
68 | 75 | ||
69 | - @Override | 76 | + /** |
70 | - public boolean equals(Object o) { | 77 | + * Produces a collection of network resources from the given links. |
71 | - if (!super.equals(o)) { | 78 | + * |
72 | - return false; | 79 | + * @param links collection of links |
73 | - } | 80 | + * @return collection of link resources |
74 | - ConnectivityIntent that = (ConnectivityIntent) o; | 81 | + */ |
75 | - return Objects.equal(this.selector, that.selector) | 82 | + protected static Collection<NetworkResource> resources(Collection<Link> links) { |
76 | - && Objects.equal(this.treatment, that.treatment); | 83 | + return ImmutableSet.<NetworkResource>copyOf(links); |
77 | - } | ||
78 | - | ||
79 | - @Override | ||
80 | - public int hashCode() { | ||
81 | - return Objects.hashCode(super.hashCode(), selector, treatment); | ||
82 | } | 84 | } |
83 | 85 | ||
84 | } | 86 | } | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import com.google.common.base.MoreObjects; | 3 | import com.google.common.base.MoreObjects; |
4 | +import org.onlab.onos.ApplicationId; | ||
4 | import org.onlab.onos.net.HostId; | 5 | import org.onlab.onos.net.HostId; |
5 | import org.onlab.onos.net.flow.TrafficSelector; | 6 | import org.onlab.onos.net.flow.TrafficSelector; |
6 | import org.onlab.onos.net.flow.TrafficTreatment; | 7 | import org.onlab.onos.net.flow.TrafficTreatment; |
7 | 8 | ||
8 | -import java.util.Objects; | ||
9 | - | ||
10 | import static com.google.common.base.Preconditions.checkNotNull; | 9 | import static com.google.common.base.Preconditions.checkNotNull; |
11 | 10 | ||
12 | /** | 11 | /** |
... | @@ -18,25 +17,33 @@ public final class HostToHostIntent extends ConnectivityIntent { | ... | @@ -18,25 +17,33 @@ public final class HostToHostIntent extends ConnectivityIntent { |
18 | private final HostId two; | 17 | private final HostId two; |
19 | 18 | ||
20 | /** | 19 | /** |
21 | - * Creates a new point-to-point intent with the supplied ingress/egress | 20 | + * Creates a new host-to-host intent with the supplied host pair. |
22 | - * ports. | ||
23 | * | 21 | * |
24 | - * @param intentId intent identifier | 22 | + * @param appId application identifier |
25 | * @param one first host | 23 | * @param one first host |
26 | * @param two second host | 24 | * @param two second host |
27 | * @param selector action | 25 | * @param selector action |
28 | * @param treatment ingress port | 26 | * @param treatment ingress port |
29 | - * @throws NullPointerException if {@code ingressPort} or {@code egressPort} | 27 | + * @throws NullPointerException if {@code one} or {@code two} is null. |
30 | - * is null. | ||
31 | */ | 28 | */ |
32 | - public HostToHostIntent(IntentId intentId, HostId one, HostId two, | 29 | + public HostToHostIntent(ApplicationId appId, HostId one, HostId two, |
33 | TrafficSelector selector, | 30 | TrafficSelector selector, |
34 | TrafficTreatment treatment) { | 31 | TrafficTreatment treatment) { |
35 | - super(intentId, selector, treatment); | 32 | + super(id(HostToHostIntent.class, min(one, two), max(one, two), |
33 | + selector, treatment), | ||
34 | + appId, null, selector, treatment); | ||
36 | this.one = checkNotNull(one); | 35 | this.one = checkNotNull(one); |
37 | this.two = checkNotNull(two); | 36 | this.two = checkNotNull(two); |
38 | } | 37 | } |
39 | 38 | ||
39 | + private static HostId min(HostId one, HostId two) { | ||
40 | + return one.hashCode() < two.hashCode() ? one : two; | ||
41 | + } | ||
42 | + | ||
43 | + private static HostId max(HostId one, HostId two) { | ||
44 | + return one.hashCode() > two.hashCode() ? one : two; | ||
45 | + } | ||
46 | + | ||
40 | /** | 47 | /** |
41 | * Returns identifier of the first host. | 48 | * Returns identifier of the first host. |
42 | * | 49 | * |
... | @@ -56,31 +63,10 @@ public final class HostToHostIntent extends ConnectivityIntent { | ... | @@ -56,31 +63,10 @@ public final class HostToHostIntent extends ConnectivityIntent { |
56 | } | 63 | } |
57 | 64 | ||
58 | @Override | 65 | @Override |
59 | - public boolean equals(Object o) { | ||
60 | - if (this == o) { | ||
61 | - return true; | ||
62 | - } | ||
63 | - if (o == null || getClass() != o.getClass()) { | ||
64 | - return false; | ||
65 | - } | ||
66 | - if (!super.equals(o)) { | ||
67 | - return false; | ||
68 | - } | ||
69 | - | ||
70 | - HostToHostIntent that = (HostToHostIntent) o; | ||
71 | - return Objects.equals(this.one, that.one) | ||
72 | - && Objects.equals(this.two, that.two); | ||
73 | - } | ||
74 | - | ||
75 | - @Override | ||
76 | - public int hashCode() { | ||
77 | - return Objects.hash(super.hashCode(), one, two); | ||
78 | - } | ||
79 | - | ||
80 | - @Override | ||
81 | public String toString() { | 66 | public String toString() { |
82 | return MoreObjects.toStringHelper(getClass()) | 67 | return MoreObjects.toStringHelper(getClass()) |
83 | .add("id", id()) | 68 | .add("id", id()) |
69 | + .add("appId", appId()) | ||
84 | .add("selector", selector()) | 70 | .add("selector", selector()) |
85 | .add("treatment", treatment()) | 71 | .add("treatment", treatment()) |
86 | .add("one", one) | 72 | .add("one", one) | ... | ... |
1 | -package org.onlab.onos.net.intent; | ||
2 | -//TODO is this the right package? | ||
3 | - | ||
4 | -/** | ||
5 | - * A generalized interface for ID generation | ||
6 | - * | ||
7 | - * {@link #getNewId()} generates a globally unique ID instance on | ||
8 | - * each invocation. | ||
9 | - * | ||
10 | - * @param <T> the type of ID | ||
11 | - */ | ||
12 | -// TODO: do we need to define a base marker interface for ID, | ||
13 | -// then changed the type parameter to <T extends BaseId> something | ||
14 | -// like that? | ||
15 | -public interface IdGenerator<T> { | ||
16 | - /** | ||
17 | - * Returns a globally unique ID instance. | ||
18 | - * | ||
19 | - * @return globally unique ID instance | ||
20 | - */ | ||
21 | - T getNewId(); | ||
22 | -} |
1 | -package org.onlab.onos.net.intent; | ||
2 | - | ||
3 | -import org.onlab.onos.net.Link; | ||
4 | - | ||
5 | -import java.util.Collection; | ||
6 | - | ||
7 | -/** | ||
8 | - * Abstraction of an intent that can be installed into | ||
9 | - * the underlying system without additional compilation. | ||
10 | - */ | ||
11 | -public interface InstallableIntent extends Intent { | ||
12 | - | ||
13 | - /** | ||
14 | - * Returns the collection of links that are required for this installable | ||
15 | - * intent to exist. | ||
16 | - * | ||
17 | - * @return collection of links | ||
18 | - */ | ||
19 | - // FIXME: replace this with 'NetworkResource' | ||
20 | - Collection<Link> requiredLinks(); | ||
21 | - | ||
22 | -} |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | +import org.onlab.onos.ApplicationId; | ||
4 | +import org.onlab.onos.net.NetworkResource; | ||
5 | + | ||
6 | +import java.util.Collection; | ||
7 | +import java.util.Objects; | ||
8 | + | ||
9 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
10 | + | ||
3 | /** | 11 | /** |
4 | * Abstraction of an application level intent. | 12 | * Abstraction of an application level intent. |
5 | * <p/> | 13 | * <p/> |
6 | * Make sure that an Intent should be immutable when a new type is defined. | 14 | * Make sure that an Intent should be immutable when a new type is defined. |
7 | */ | 15 | */ |
8 | -public interface Intent extends BatchOperationTarget { | 16 | +public abstract class Intent implements BatchOperationTarget { |
17 | + | ||
18 | + private final IntentId id; | ||
19 | + private final ApplicationId appId; | ||
20 | + private final Collection<NetworkResource> resources; | ||
21 | + | ||
22 | + /** | ||
23 | + * Constructor for serializer. | ||
24 | + */ | ||
25 | + protected Intent() { | ||
26 | + this.id = null; | ||
27 | + this.appId = null; | ||
28 | + this.resources = null; | ||
29 | + } | ||
30 | + | ||
31 | + /** | ||
32 | + * Creates a new intent. | ||
33 | + * | ||
34 | + * @param id intent identifier | ||
35 | + * @param appId application identifier | ||
36 | + * @param resources required network resources (optional) | ||
37 | + */ | ||
38 | + protected Intent(IntentId id, ApplicationId appId, | ||
39 | + Collection<NetworkResource> resources) { | ||
40 | + this.appId = checkNotNull(appId, "Application ID cannot be null"); | ||
41 | + this.id = checkNotNull(id, "Fingerprint cannot be null"); | ||
42 | + this.resources = resources; | ||
43 | + } | ||
44 | + | ||
9 | /** | 45 | /** |
10 | * Returns the intent identifier. | 46 | * Returns the intent identifier. |
11 | * | 47 | * |
48 | + * @return intent fingerprint | ||
49 | + */ | ||
50 | + public IntentId id() { | ||
51 | + return id; | ||
52 | + } | ||
53 | + | ||
54 | + /** | ||
55 | + * Returns the identifier of the application that requested the intent. | ||
56 | + * | ||
57 | + * @return application identifier | ||
58 | + */ | ||
59 | + public ApplicationId appId() { | ||
60 | + return appId; | ||
61 | + } | ||
62 | + | ||
63 | + /** | ||
64 | + * Returns the collection of resources required for this intent. | ||
65 | + * | ||
66 | + * @return collection of resources; may be null | ||
67 | + */ | ||
68 | + public Collection<NetworkResource> resources() { | ||
69 | + return resources; | ||
70 | + } | ||
71 | + | ||
72 | + /** | ||
73 | + * Produces an intent identifier backed by hash-like fingerprint for the | ||
74 | + * specified class of intent and its constituent fields. | ||
75 | + * | ||
76 | + * @param fields intent fields | ||
12 | * @return intent identifier | 77 | * @return intent identifier |
13 | */ | 78 | */ |
14 | - IntentId id(); | 79 | + protected static IntentId id(Object... fields) { |
80 | + return IntentId.valueOf(Objects.hash(fields)); | ||
81 | + } | ||
82 | + | ||
83 | + /** | ||
84 | + * Indicates whether or not the intent is installable. | ||
85 | + * | ||
86 | + * @return true if installable | ||
87 | + */ | ||
88 | + public boolean isInstallable() { | ||
89 | + return false; | ||
90 | + } | ||
91 | + | ||
92 | + @Override | ||
93 | + public int hashCode() { | ||
94 | + return Objects.hash(id); | ||
95 | + } | ||
96 | + | ||
97 | + @Override | ||
98 | + public boolean equals(Object obj) { | ||
99 | + if (this == obj) { | ||
100 | + return true; | ||
101 | + } | ||
102 | + if (obj == null || getClass() != obj.getClass()) { | ||
103 | + return false; | ||
104 | + } | ||
105 | + final Intent other = (Intent) obj; | ||
106 | + return Objects.equals(this.id, other.id); | ||
107 | + } | ||
108 | + | ||
15 | } | 109 | } | ... | ... |
... | @@ -38,7 +38,7 @@ public interface IntentExtensionService { | ... | @@ -38,7 +38,7 @@ public interface IntentExtensionService { |
38 | * @param installer intent installer | 38 | * @param installer intent installer |
39 | * @param <T> the type of installable intent | 39 | * @param <T> the type of installable intent |
40 | */ | 40 | */ |
41 | - <T extends InstallableIntent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer); | 41 | + <T extends Intent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer); |
42 | 42 | ||
43 | /** | 43 | /** |
44 | * Unregisters the installer for the given installable intent class. | 44 | * Unregisters the installer for the given installable intent class. |
... | @@ -46,12 +46,12 @@ public interface IntentExtensionService { | ... | @@ -46,12 +46,12 @@ public interface IntentExtensionService { |
46 | * @param cls installable intent class | 46 | * @param cls installable intent class |
47 | * @param <T> the type of installable intent | 47 | * @param <T> the type of installable intent |
48 | */ | 48 | */ |
49 | - <T extends InstallableIntent> void unregisterInstaller(Class<T> cls); | 49 | + <T extends Intent> void unregisterInstaller(Class<T> cls); |
50 | 50 | ||
51 | /** | 51 | /** |
52 | * Returns immutable set of bindings of currently registered intent installers. | 52 | * Returns immutable set of bindings of currently registered intent installers. |
53 | * | 53 | * |
54 | * @return the set of installer bindings | 54 | * @return the set of installer bindings |
55 | */ | 55 | */ |
56 | - Map<Class<? extends InstallableIntent>, IntentInstaller<? extends InstallableIntent>> getInstallers(); | 56 | + Map<Class<? extends Intent>, IntentInstaller<? extends Intent>> getInstallers(); |
57 | } | 57 | } | ... | ... |
... | @@ -7,43 +7,37 @@ package org.onlab.onos.net.intent; | ... | @@ -7,43 +7,37 @@ package org.onlab.onos.net.intent; |
7 | */ | 7 | */ |
8 | public final class IntentId implements BatchOperationTarget { | 8 | public final class IntentId implements BatchOperationTarget { |
9 | 9 | ||
10 | - private static final int DEC = 10; | 10 | + private final long fingerprint; |
11 | - private static final int HEX = 16; | ||
12 | - | ||
13 | - private final long id; | ||
14 | 11 | ||
15 | /** | 12 | /** |
16 | * Creates an intent identifier from the specified string representation. | 13 | * Creates an intent identifier from the specified string representation. |
17 | * | 14 | * |
18 | - * @param value long value | 15 | + * @param fingerprint long value |
19 | * @return intent identifier | 16 | * @return intent identifier |
20 | */ | 17 | */ |
21 | - public static IntentId valueOf(String value) { | 18 | + public static IntentId valueOf(long fingerprint) { |
22 | - long id = value.toLowerCase().startsWith("0x") | 19 | + return new IntentId(fingerprint); |
23 | - ? Long.parseLong(value.substring(2), HEX) | ||
24 | - : Long.parseLong(value, DEC); | ||
25 | - return new IntentId(id); | ||
26 | } | 20 | } |
27 | 21 | ||
28 | /** | 22 | /** |
29 | * Constructor for serializer. | 23 | * Constructor for serializer. |
30 | */ | 24 | */ |
31 | - protected IntentId() { | 25 | + IntentId() { |
32 | - this.id = 0; | 26 | + this.fingerprint = 0; |
33 | } | 27 | } |
34 | 28 | ||
35 | /** | 29 | /** |
36 | * Constructs the ID corresponding to a given long value. | 30 | * Constructs the ID corresponding to a given long value. |
37 | * | 31 | * |
38 | - * @param id the underlying value of this ID | 32 | + * @param fingerprint the underlying value of this ID |
39 | */ | 33 | */ |
40 | - public IntentId(long id) { | 34 | + IntentId(long fingerprint) { |
41 | - this.id = id; | 35 | + this.fingerprint = fingerprint; |
42 | } | 36 | } |
43 | 37 | ||
44 | @Override | 38 | @Override |
45 | public int hashCode() { | 39 | public int hashCode() { |
46 | - return (int) (id ^ (id >>> 32)); | 40 | + return (int) (fingerprint ^ (fingerprint >>> 32)); |
47 | } | 41 | } |
48 | 42 | ||
49 | @Override | 43 | @Override |
... | @@ -51,18 +45,16 @@ public final class IntentId implements BatchOperationTarget { | ... | @@ -51,18 +45,16 @@ public final class IntentId implements BatchOperationTarget { |
51 | if (obj == this) { | 45 | if (obj == this) { |
52 | return true; | 46 | return true; |
53 | } | 47 | } |
54 | - | ||
55 | if (!(obj instanceof IntentId)) { | 48 | if (!(obj instanceof IntentId)) { |
56 | return false; | 49 | return false; |
57 | } | 50 | } |
58 | - | ||
59 | IntentId that = (IntentId) obj; | 51 | IntentId that = (IntentId) obj; |
60 | - return this.id == that.id; | 52 | + return this.fingerprint == that.fingerprint; |
61 | } | 53 | } |
62 | 54 | ||
63 | @Override | 55 | @Override |
64 | public String toString() { | 56 | public String toString() { |
65 | - return "0x" + Long.toHexString(id); | 57 | + return "0x" + Long.toHexString(fingerprint); |
66 | } | 58 | } |
67 | 59 | ||
68 | } | 60 | } | ... | ... |
... | @@ -7,7 +7,7 @@ import org.onlab.onos.net.flow.FlowRuleBatchOperation; | ... | @@ -7,7 +7,7 @@ import org.onlab.onos.net.flow.FlowRuleBatchOperation; |
7 | /** | 7 | /** |
8 | * Abstraction of entity capable of installing intents to the environment. | 8 | * Abstraction of entity capable of installing intents to the environment. |
9 | */ | 9 | */ |
10 | -public interface IntentInstaller<T extends InstallableIntent> { | 10 | +public interface IntentInstaller<T extends Intent> { |
11 | /** | 11 | /** |
12 | * Installs the specified intent to the environment. | 12 | * Installs the specified intent to the environment. |
13 | * | 13 | * | ... | ... |
... | @@ -77,8 +77,7 @@ public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> { | ... | @@ -77,8 +77,7 @@ public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> { |
77 | * @param intentId original intent identifier | 77 | * @param intentId original intent identifier |
78 | * @param installableIntents compiled installable intents | 78 | * @param installableIntents compiled installable intents |
79 | */ | 79 | */ |
80 | - void addInstallableIntents(IntentId intentId, | 80 | + void addInstallableIntents(IntentId intentId, List<Intent> installableIntents); |
81 | - List<InstallableIntent> installableIntents); | ||
82 | 81 | ||
83 | /** | 82 | /** |
84 | * Returns the list of the installable events associated with the specified | 83 | * Returns the list of the installable events associated with the specified |
... | @@ -87,7 +86,7 @@ public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> { | ... | @@ -87,7 +86,7 @@ public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> { |
87 | * @param intentId original intent identifier | 86 | * @param intentId original intent identifier |
88 | * @return compiled installable intents | 87 | * @return compiled installable intents |
89 | */ | 88 | */ |
90 | - List<InstallableIntent> getInstallableIntents(IntentId intentId); | 89 | + List<Intent> getInstallableIntents(IntentId intentId); |
91 | 90 | ||
92 | // TODO: this should be triggered from with the store as a result of removeIntent call | 91 | // TODO: this should be triggered from with the store as a result of removeIntent call |
93 | 92 | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | -import java.util.Collection; | 3 | +import com.google.common.base.MoreObjects; |
4 | -import java.util.Objects; | 4 | +import org.onlab.onos.ApplicationId; |
5 | -import java.util.Set; | ||
6 | - | ||
7 | import org.onlab.onos.net.ConnectPoint; | 5 | import org.onlab.onos.net.ConnectPoint; |
8 | import org.onlab.onos.net.Link; | 6 | import org.onlab.onos.net.Link; |
9 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
10 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
11 | 9 | ||
12 | -import com.google.common.base.MoreObjects; | 10 | +import java.util.Set; |
13 | 11 | ||
14 | /** | 12 | /** |
15 | * Abstraction of a connectivity intent that is implemented by a set of path | 13 | * Abstraction of a connectivity intent that is implemented by a set of path |
16 | * segments. | 14 | * segments. |
17 | */ | 15 | */ |
18 | -public final class LinkCollectionIntent extends ConnectivityIntent implements InstallableIntent { | 16 | +public final class LinkCollectionIntent extends ConnectivityIntent { |
19 | 17 | ||
20 | private final Set<Link> links; | 18 | private final Set<Link> links; |
21 | 19 | ||
... | @@ -25,34 +23,33 @@ public final class LinkCollectionIntent extends ConnectivityIntent implements In | ... | @@ -25,34 +23,33 @@ public final class LinkCollectionIntent extends ConnectivityIntent implements In |
25 | * Creates a new point-to-point intent with the supplied ingress/egress | 23 | * Creates a new point-to-point intent with the supplied ingress/egress |
26 | * ports and using the specified explicit path. | 24 | * ports and using the specified explicit path. |
27 | * | 25 | * |
28 | - * @param id intent identifier | 26 | + * @param appId application identifier |
29 | * @param selector traffic match | 27 | * @param selector traffic match |
30 | * @param treatment action | 28 | * @param treatment action |
31 | * @param links traversed links | 29 | * @param links traversed links |
32 | * @param egressPoint egress point | 30 | * @param egressPoint egress point |
33 | * @throws NullPointerException {@code path} is null | 31 | * @throws NullPointerException {@code path} is null |
34 | */ | 32 | */ |
35 | - public LinkCollectionIntent(IntentId id, | 33 | + public LinkCollectionIntent(ApplicationId appId, |
36 | TrafficSelector selector, | 34 | TrafficSelector selector, |
37 | TrafficTreatment treatment, | 35 | TrafficTreatment treatment, |
38 | Set<Link> links, | 36 | Set<Link> links, |
39 | ConnectPoint egressPoint) { | 37 | ConnectPoint egressPoint) { |
40 | - super(id, selector, treatment); | 38 | + super(id(LinkCollectionIntent.class, selector, treatment, links, egressPoint), |
39 | + appId, resources(links), selector, treatment); | ||
41 | this.links = links; | 40 | this.links = links; |
42 | this.egressPoint = egressPoint; | 41 | this.egressPoint = egressPoint; |
43 | } | 42 | } |
44 | 43 | ||
44 | + /** | ||
45 | + * Constructor for serializer. | ||
46 | + */ | ||
45 | protected LinkCollectionIntent() { | 47 | protected LinkCollectionIntent() { |
46 | super(); | 48 | super(); |
47 | this.links = null; | 49 | this.links = null; |
48 | this.egressPoint = null; | 50 | this.egressPoint = null; |
49 | } | 51 | } |
50 | 52 | ||
51 | - @Override | ||
52 | - public Collection<Link> requiredLinks() { | ||
53 | - return links; | ||
54 | - } | ||
55 | - | ||
56 | /** | 53 | /** |
57 | * Returns the set of links that represent the network connections needed | 54 | * Returns the set of links that represent the network connections needed |
58 | * by this intent. | 55 | * by this intent. |
... | @@ -73,34 +70,17 @@ public final class LinkCollectionIntent extends ConnectivityIntent implements In | ... | @@ -73,34 +70,17 @@ public final class LinkCollectionIntent extends ConnectivityIntent implements In |
73 | } | 70 | } |
74 | 71 | ||
75 | @Override | 72 | @Override |
76 | - public boolean equals(Object o) { | 73 | + public boolean isInstallable() { |
77 | - if (this == o) { | ||
78 | return true; | 74 | return true; |
79 | } | 75 | } |
80 | - if (o == null || getClass() != o.getClass()) { | ||
81 | - return false; | ||
82 | - } | ||
83 | - if (!super.equals(o)) { | ||
84 | - return false; | ||
85 | - } | ||
86 | - | ||
87 | - LinkCollectionIntent that = (LinkCollectionIntent) o; | ||
88 | - | ||
89 | - return Objects.equals(this.links, that.links) && | ||
90 | - Objects.equals(this.egressPoint, that.egressPoint); | ||
91 | - } | ||
92 | - | ||
93 | - @Override | ||
94 | - public int hashCode() { | ||
95 | - return Objects.hash(super.hashCode(), links, egressPoint); | ||
96 | - } | ||
97 | 76 | ||
98 | @Override | 77 | @Override |
99 | public String toString() { | 78 | public String toString() { |
100 | return MoreObjects.toStringHelper(getClass()) | 79 | return MoreObjects.toStringHelper(getClass()) |
101 | .add("id", id()) | 80 | .add("id", id()) |
102 | - .add("match", selector()) | 81 | + .add("appId", appId()) |
103 | - .add("action", treatment()) | 82 | + .add("selector", selector()) |
83 | + .add("treatment", treatment()) | ||
104 | .add("links", links()) | 84 | .add("links", links()) |
105 | .add("egress", egressPoint()) | 85 | .add("egress", egressPoint()) |
106 | .toString(); | 86 | .toString(); | ... | ... |
... | @@ -2,11 +2,11 @@ package org.onlab.onos.net.intent; | ... | @@ -2,11 +2,11 @@ package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import com.google.common.base.MoreObjects; | 3 | import com.google.common.base.MoreObjects; |
4 | import com.google.common.collect.Sets; | 4 | import com.google.common.collect.Sets; |
5 | +import org.onlab.onos.ApplicationId; | ||
5 | import org.onlab.onos.net.ConnectPoint; | 6 | import org.onlab.onos.net.ConnectPoint; |
6 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
7 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
8 | 9 | ||
9 | -import java.util.Objects; | ||
10 | import java.util.Set; | 10 | import java.util.Set; |
11 | 11 | ||
12 | import static com.google.common.base.Preconditions.checkArgument; | 12 | import static com.google.common.base.Preconditions.checkArgument; |
... | @@ -22,11 +22,11 @@ public final class MultiPointToSinglePointIntent extends ConnectivityIntent { | ... | @@ -22,11 +22,11 @@ public final class MultiPointToSinglePointIntent extends ConnectivityIntent { |
22 | 22 | ||
23 | /** | 23 | /** |
24 | * Creates a new multi-to-single point connectivity intent for the specified | 24 | * Creates a new multi-to-single point connectivity intent for the specified |
25 | - * traffic match and action. | 25 | + * traffic selector and treatment. |
26 | * | 26 | * |
27 | - * @param id intent identifier | 27 | + * @param appId application identifier |
28 | - * @param match traffic match | 28 | + * @param selector traffic selector |
29 | - * @param action action | 29 | + * @param treatment treatment |
30 | * @param ingressPoints set of ports from which ingress traffic originates | 30 | * @param ingressPoints set of ports from which ingress traffic originates |
31 | * @param egressPoint port to which traffic will egress | 31 | * @param egressPoint port to which traffic will egress |
32 | * @throws NullPointerException if {@code ingressPoints} or | 32 | * @throws NullPointerException if {@code ingressPoints} or |
... | @@ -34,15 +34,16 @@ public final class MultiPointToSinglePointIntent extends ConnectivityIntent { | ... | @@ -34,15 +34,16 @@ public final class MultiPointToSinglePointIntent extends ConnectivityIntent { |
34 | * @throws IllegalArgumentException if the size of {@code ingressPoints} is | 34 | * @throws IllegalArgumentException if the size of {@code ingressPoints} is |
35 | * not more than 1 | 35 | * not more than 1 |
36 | */ | 36 | */ |
37 | - public MultiPointToSinglePointIntent(IntentId id, TrafficSelector match, | 37 | + public MultiPointToSinglePointIntent(ApplicationId appId, |
38 | - TrafficTreatment action, | 38 | + TrafficSelector selector, |
39 | + TrafficTreatment treatment, | ||
39 | Set<ConnectPoint> ingressPoints, | 40 | Set<ConnectPoint> ingressPoints, |
40 | ConnectPoint egressPoint) { | 41 | ConnectPoint egressPoint) { |
41 | - super(id, match, action); | 42 | + super(id(MultiPointToSinglePointIntent.class, selector, treatment, |
43 | + ingressPoints, egressPoint), appId, null, selector, treatment); | ||
42 | 44 | ||
43 | checkNotNull(ingressPoints); | 45 | checkNotNull(ingressPoints); |
44 | - checkArgument(!ingressPoints.isEmpty(), | 46 | + checkArgument(!ingressPoints.isEmpty(), "Ingress point set cannot be empty"); |
45 | - "there should be at least one ingress port"); | ||
46 | 47 | ||
47 | this.ingressPoints = Sets.newHashSet(ingressPoints); | 48 | this.ingressPoints = Sets.newHashSet(ingressPoints); |
48 | this.egressPoint = checkNotNull(egressPoint); | 49 | this.egressPoint = checkNotNull(egressPoint); |
... | @@ -77,35 +78,14 @@ public final class MultiPointToSinglePointIntent extends ConnectivityIntent { | ... | @@ -77,35 +78,14 @@ public final class MultiPointToSinglePointIntent extends ConnectivityIntent { |
77 | } | 78 | } |
78 | 79 | ||
79 | @Override | 80 | @Override |
80 | - public boolean equals(Object o) { | ||
81 | - if (this == o) { | ||
82 | - return true; | ||
83 | - } | ||
84 | - if (o == null || getClass() != o.getClass()) { | ||
85 | - return false; | ||
86 | - } | ||
87 | - if (!super.equals(o)) { | ||
88 | - return false; | ||
89 | - } | ||
90 | - | ||
91 | - MultiPointToSinglePointIntent that = (MultiPointToSinglePointIntent) o; | ||
92 | - return Objects.equals(this.ingressPoints, that.ingressPoints) | ||
93 | - && Objects.equals(this.egressPoint, that.egressPoint); | ||
94 | - } | ||
95 | - | ||
96 | - @Override | ||
97 | - public int hashCode() { | ||
98 | - return Objects.hash(super.hashCode(), ingressPoints, egressPoint); | ||
99 | - } | ||
100 | - | ||
101 | - @Override | ||
102 | public String toString() { | 81 | public String toString() { |
103 | return MoreObjects.toStringHelper(getClass()) | 82 | return MoreObjects.toStringHelper(getClass()) |
104 | .add("id", id()) | 83 | .add("id", id()) |
105 | - .add("match", selector()) | 84 | + .add("appId", appId()) |
106 | - .add("action", treatment()) | 85 | + .add("selector", selector()) |
107 | - .add("ingressPoints", ingressPoints()) | 86 | + .add("treatment", treatment()) |
108 | - .add("egressPoint", egressPoint()) | 87 | + .add("ingress", ingressPoints()) |
88 | + .add("egress", egressPoint()) | ||
109 | .toString(); | 89 | .toString(); |
110 | } | 90 | } |
111 | } | 91 | } | ... | ... |
1 | -package org.onlab.onos.net.intent; | ||
2 | - | ||
3 | -import org.onlab.onos.net.ConnectPoint; | ||
4 | - | ||
5 | -// TODO: consider if this intent should be sub-class of ConnectivityIntent | ||
6 | - | ||
7 | -/** | ||
8 | - * An optical layer Intent for a connectivity from a transponder port to another | ||
9 | - * transponder port. | ||
10 | - * <p/> | ||
11 | - * This class doesn't accepts lambda specifier. This class computes path between | ||
12 | - * ports and assign lambda automatically. The lambda can be specified using | ||
13 | - * OpticalPathFlow class. | ||
14 | - */ | ||
15 | -public class OpticalConnectivityIntent extends AbstractIntent { | ||
16 | - protected ConnectPoint src; | ||
17 | - protected ConnectPoint dst; | ||
18 | - | ||
19 | - /** | ||
20 | - * Constructor. | ||
21 | - * | ||
22 | - * @param id ID for this new Intent object. | ||
23 | - * @param src The source transponder port. | ||
24 | - * @param dst The destination transponder port. | ||
25 | - */ | ||
26 | - public OpticalConnectivityIntent(IntentId id, ConnectPoint src, ConnectPoint dst) { | ||
27 | - super(id); | ||
28 | - this.src = src; | ||
29 | - this.dst = dst; | ||
30 | - } | ||
31 | - | ||
32 | - /** | ||
33 | - * Constructor for serializer. | ||
34 | - */ | ||
35 | - protected OpticalConnectivityIntent() { | ||
36 | - super(); | ||
37 | - this.src = null; | ||
38 | - this.dst = null; | ||
39 | - } | ||
40 | - | ||
41 | - /** | ||
42 | - * Gets source transponder port. | ||
43 | - * | ||
44 | - * @return The source transponder port. | ||
45 | - */ | ||
46 | - public ConnectPoint getSrcConnectPoint() { | ||
47 | - return src; | ||
48 | - } | ||
49 | - | ||
50 | - /** | ||
51 | - * Gets destination transponder port. | ||
52 | - * | ||
53 | - * @return The source transponder port. | ||
54 | - */ | ||
55 | - public ConnectPoint getDst() { | ||
56 | - return dst; | ||
57 | - } | ||
58 | -} |
1 | -package org.onlab.onos.net.intent; | ||
2 | - | ||
3 | -import java.util.Collection; | ||
4 | -import java.util.Collections; | ||
5 | -import java.util.HashSet; | ||
6 | -import java.util.Set; | ||
7 | - | ||
8 | -import org.onlab.onos.net.ConnectPoint; | ||
9 | -import org.onlab.onos.net.flow.TrafficSelector; | ||
10 | - | ||
11 | -// TODO: consider if this intent should be sub-class of Connectivity intent | ||
12 | -/** | ||
13 | - * A packet layer Intent for a connectivity from a set of ports to a set of | ||
14 | - * ports. | ||
15 | - * <p> | ||
16 | - * TODO: Design methods to support the ReactiveForwarding and the SDN-IP. <br> | ||
17 | - * NOTE: Should this class support modifier methods? Should this object a | ||
18 | - * read-only object? | ||
19 | - */ | ||
20 | -public class PacketConnectivityIntent extends AbstractIntent { | ||
21 | - protected Set<ConnectPoint> srcConnectPoints; | ||
22 | - protected TrafficSelector selector; | ||
23 | - protected Set<ConnectPoint> dstConnectPoints; | ||
24 | - protected boolean canSetupOpticalFlow; | ||
25 | - protected int idleTimeoutValue; | ||
26 | - protected int hardTimeoutValue; | ||
27 | - | ||
28 | - /** | ||
29 | - * Creates a connectivity intent for the packet layer. | ||
30 | - * <p> | ||
31 | - * When the "canSetupOpticalFlow" option is true, this intent will compute | ||
32 | - * the packet/optical converged path, decompose it to the OpticalPathFlow | ||
33 | - * and the PacketPathFlow objects, and execute the operations to add them | ||
34 | - * considering the dependency between the packet and optical layers. | ||
35 | - * | ||
36 | - * @param id ID for this new Intent object. | ||
37 | - * @param srcConnectPoints The set of source switch ports. | ||
38 | - * @param match Traffic specifier for this object. | ||
39 | - * @param dstConnectPoints The set of destination switch ports. | ||
40 | - * @param canSetupOpticalFlow The flag whether this intent can create | ||
41 | - * optical flows if needed. | ||
42 | - */ | ||
43 | - public PacketConnectivityIntent(IntentId id, | ||
44 | - Collection<ConnectPoint> srcConnectPoints, TrafficSelector match, | ||
45 | - Collection<ConnectPoint> dstConnectPoints, boolean canSetupOpticalFlow) { | ||
46 | - super(id); | ||
47 | - this.srcConnectPoints = new HashSet<ConnectPoint>(srcConnectPoints); | ||
48 | - this.selector = match; | ||
49 | - this.dstConnectPoints = new HashSet<ConnectPoint>(dstConnectPoints); | ||
50 | - this.canSetupOpticalFlow = canSetupOpticalFlow; | ||
51 | - this.idleTimeoutValue = 0; | ||
52 | - this.hardTimeoutValue = 0; | ||
53 | - | ||
54 | - // TODO: check consistency between these parameters. | ||
55 | - } | ||
56 | - | ||
57 | - /** | ||
58 | - * Constructor for serializer. | ||
59 | - */ | ||
60 | - protected PacketConnectivityIntent() { | ||
61 | - super(); | ||
62 | - this.srcConnectPoints = null; | ||
63 | - this.selector = null; | ||
64 | - this.dstConnectPoints = null; | ||
65 | - this.canSetupOpticalFlow = false; | ||
66 | - this.idleTimeoutValue = 0; | ||
67 | - this.hardTimeoutValue = 0; | ||
68 | - } | ||
69 | - | ||
70 | - /** | ||
71 | - * Gets the set of source switch ports. | ||
72 | - * | ||
73 | - * @return the set of source switch ports. | ||
74 | - */ | ||
75 | - public Collection<ConnectPoint> getSrcConnectPoints() { | ||
76 | - return Collections.unmodifiableCollection(srcConnectPoints); | ||
77 | - } | ||
78 | - | ||
79 | - /** | ||
80 | - * Gets the traffic specifier. | ||
81 | - * | ||
82 | - * @return The traffic specifier. | ||
83 | - */ | ||
84 | - public TrafficSelector getMatch() { | ||
85 | - return selector; | ||
86 | - } | ||
87 | - | ||
88 | - /** | ||
89 | - * Gets the set of destination switch ports. | ||
90 | - * | ||
91 | - * @return the set of destination switch ports. | ||
92 | - */ | ||
93 | - public Collection<ConnectPoint> getDstConnectPoints() { | ||
94 | - return Collections.unmodifiableCollection(dstConnectPoints); | ||
95 | - } | ||
96 | - | ||
97 | - /** | ||
98 | - * Adds the specified port to the set of source ports. | ||
99 | - * | ||
100 | - * @param port ConnectPoint object to be added | ||
101 | - */ | ||
102 | - public void addSrcConnectPoint(ConnectPoint port) { | ||
103 | - // TODO implement it. | ||
104 | - } | ||
105 | - | ||
106 | - /** | ||
107 | - * Adds the specified port to the set of destination ports. | ||
108 | - * | ||
109 | - * @param port ConnectPoint object to be added | ||
110 | - */ | ||
111 | - public void addDstConnectPoint(ConnectPoint port) { | ||
112 | - // TODO implement it. | ||
113 | - } | ||
114 | - | ||
115 | - /** | ||
116 | - * Removes the specified port from the set of source ports. | ||
117 | - * | ||
118 | - * @param port ConnectPoint object to be removed | ||
119 | - */ | ||
120 | - public void removeSrcConnectPoint(ConnectPoint port) { | ||
121 | - // TODO implement it. | ||
122 | - } | ||
123 | - | ||
124 | - /** | ||
125 | - * Removes the specified port from the set of destination ports. | ||
126 | - * | ||
127 | - * @param port ConnectPoint object to be removed | ||
128 | - */ | ||
129 | - public void removeDstConnectPoint(ConnectPoint port) { | ||
130 | - // TODO implement it. | ||
131 | - } | ||
132 | - | ||
133 | - /** | ||
134 | - * Sets idle-timeout value. | ||
135 | - * | ||
136 | - * @param timeout Idle-timeout value (seconds) | ||
137 | - */ | ||
138 | - public void setIdleTimeout(int timeout) { | ||
139 | - idleTimeoutValue = timeout; | ||
140 | - } | ||
141 | - | ||
142 | - /** | ||
143 | - * Sets hard-timeout value. | ||
144 | - * | ||
145 | - * @param timeout Hard-timeout value (seconds) | ||
146 | - */ | ||
147 | - public void setHardTimeout(int timeout) { | ||
148 | - hardTimeoutValue = timeout; | ||
149 | - } | ||
150 | - | ||
151 | - /** | ||
152 | - * Gets idle-timeout value. | ||
153 | - * | ||
154 | - * @return Idle-timeout value (seconds) | ||
155 | - */ | ||
156 | - public int getIdleTimeout() { | ||
157 | - return idleTimeoutValue; | ||
158 | - } | ||
159 | - | ||
160 | - /** | ||
161 | - * Gets hard-timeout value. | ||
162 | - * | ||
163 | - * @return Hard-timeout value (seconds) | ||
164 | - */ | ||
165 | - public int getHardTimeout() { | ||
166 | - return hardTimeoutValue; | ||
167 | - } | ||
168 | - | ||
169 | - /** | ||
170 | - * Returns whether this intent can create optical flows if needed. | ||
171 | - * | ||
172 | - * @return whether this intent can create optical flows. | ||
173 | - */ | ||
174 | - public boolean canSetupOpticalFlow() { | ||
175 | - return canSetupOpticalFlow; | ||
176 | - } | ||
177 | -} |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import com.google.common.base.MoreObjects; | 3 | import com.google.common.base.MoreObjects; |
4 | -import org.onlab.onos.net.ConnectPoint; | 4 | +import org.onlab.onos.ApplicationId; |
5 | -import org.onlab.onos.net.Link; | ||
6 | import org.onlab.onos.net.Path; | 5 | import org.onlab.onos.net.Path; |
7 | import org.onlab.onos.net.flow.TrafficSelector; | 6 | import org.onlab.onos.net.flow.TrafficSelector; |
8 | import org.onlab.onos.net.flow.TrafficTreatment; | 7 | import org.onlab.onos.net.flow.TrafficTreatment; |
9 | 8 | ||
10 | -import java.util.Collection; | ||
11 | -import java.util.Objects; | ||
12 | - | ||
13 | /** | 9 | /** |
14 | * Abstraction of explicitly path specified connectivity intent. | 10 | * Abstraction of explicitly path specified connectivity intent. |
15 | */ | 11 | */ |
16 | -public class PathIntent extends PointToPointIntent implements InstallableIntent { | 12 | +public class PathIntent extends ConnectivityIntent { |
17 | 13 | ||
18 | private final Path path; | 14 | private final Path path; |
19 | 15 | ||
... | @@ -21,21 +17,22 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent | ... | @@ -21,21 +17,22 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent |
21 | * Creates a new point-to-point intent with the supplied ingress/egress | 17 | * Creates a new point-to-point intent with the supplied ingress/egress |
22 | * ports and using the specified explicit path. | 18 | * ports and using the specified explicit path. |
23 | * | 19 | * |
24 | - * @param id intent identifier | 20 | + * @param appId application identifier |
25 | - * @param match traffic match | 21 | + * @param selector traffic selector |
26 | - * @param action action | 22 | + * @param treatment treatment |
27 | - * @param ingressPort ingress port | ||
28 | - * @param egressPort egress port | ||
29 | * @param path traversed links | 23 | * @param path traversed links |
30 | * @throws NullPointerException {@code path} is null | 24 | * @throws NullPointerException {@code path} is null |
31 | */ | 25 | */ |
32 | - public PathIntent(IntentId id, TrafficSelector match, TrafficTreatment action, | 26 | + public PathIntent(ApplicationId appId, TrafficSelector selector, |
33 | - ConnectPoint ingressPort, ConnectPoint egressPort, | 27 | + TrafficTreatment treatment, Path path) { |
34 | - Path path) { | 28 | + super(id(PathIntent.class, selector, treatment, path), appId, |
35 | - super(id, match, action, ingressPort, egressPort); | 29 | + resources(path.links()), selector, treatment); |
36 | this.path = path; | 30 | this.path = path; |
37 | } | 31 | } |
38 | 32 | ||
33 | + /** | ||
34 | + * Constructor for serializer. | ||
35 | + */ | ||
39 | protected PathIntent() { | 36 | protected PathIntent() { |
40 | super(); | 37 | super(); |
41 | this.path = null; | 38 | this.path = null; |
... | @@ -51,46 +48,19 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent | ... | @@ -51,46 +48,19 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent |
51 | } | 48 | } |
52 | 49 | ||
53 | @Override | 50 | @Override |
54 | - public boolean equals(Object o) { | 51 | + public boolean isInstallable() { |
55 | - if (this == o) { | ||
56 | return true; | 52 | return true; |
57 | } | 53 | } |
58 | - if (o == null || getClass() != o.getClass()) { | ||
59 | - return false; | ||
60 | - } | ||
61 | - if (!super.equals(o)) { | ||
62 | - return false; | ||
63 | - } | ||
64 | - | ||
65 | - PathIntent that = (PathIntent) o; | ||
66 | - | ||
67 | - if (!path.equals(that.path)) { | ||
68 | - return false; | ||
69 | - } | ||
70 | - | ||
71 | - return true; | ||
72 | - } | ||
73 | - | ||
74 | - @Override | ||
75 | - public int hashCode() { | ||
76 | - return Objects.hash(super.hashCode(), path); | ||
77 | - } | ||
78 | 54 | ||
79 | @Override | 55 | @Override |
80 | public String toString() { | 56 | public String toString() { |
81 | return MoreObjects.toStringHelper(getClass()) | 57 | return MoreObjects.toStringHelper(getClass()) |
82 | .add("id", id()) | 58 | .add("id", id()) |
83 | - .add("match", selector()) | 59 | + .add("appId", appId()) |
84 | - .add("action", treatment()) | 60 | + .add("selector", selector()) |
85 | - .add("ingressPort", ingressPoint()) | 61 | + .add("treatment", treatment()) |
86 | - .add("egressPort", egressPoint()) | ||
87 | .add("path", path) | 62 | .add("path", path) |
88 | .toString(); | 63 | .toString(); |
89 | } | 64 | } |
90 | 65 | ||
91 | - @Override | ||
92 | - public Collection<Link> requiredLinks() { | ||
93 | - return path.links(); | ||
94 | - } | ||
95 | - | ||
96 | } | 66 | } | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import com.google.common.base.MoreObjects; | 3 | import com.google.common.base.MoreObjects; |
4 | +import org.onlab.onos.ApplicationId; | ||
4 | import org.onlab.onos.net.ConnectPoint; | 5 | import org.onlab.onos.net.ConnectPoint; |
5 | import org.onlab.onos.net.flow.TrafficSelector; | 6 | import org.onlab.onos.net.flow.TrafficSelector; |
6 | import org.onlab.onos.net.flow.TrafficTreatment; | 7 | import org.onlab.onos.net.flow.TrafficTreatment; |
7 | 8 | ||
8 | -import java.util.Objects; | ||
9 | - | ||
10 | import static com.google.common.base.Preconditions.checkNotNull; | 9 | import static com.google.common.base.Preconditions.checkNotNull; |
11 | 10 | ||
12 | /** | 11 | /** |
... | @@ -21,18 +20,19 @@ public class PointToPointIntent extends ConnectivityIntent { | ... | @@ -21,18 +20,19 @@ public class PointToPointIntent extends ConnectivityIntent { |
21 | * Creates a new point-to-point intent with the supplied ingress/egress | 20 | * Creates a new point-to-point intent with the supplied ingress/egress |
22 | * ports. | 21 | * ports. |
23 | * | 22 | * |
24 | - * @param id intent identifier | 23 | + * @param appId application identifier |
25 | * @param selector traffic selector | 24 | * @param selector traffic selector |
26 | * @param treatment treatment | 25 | * @param treatment treatment |
27 | * @param ingressPoint ingress port | 26 | * @param ingressPoint ingress port |
28 | * @param egressPoint egress port | 27 | * @param egressPoint egress port |
29 | * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null. | 28 | * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null. |
30 | */ | 29 | */ |
31 | - public PointToPointIntent(IntentId id, TrafficSelector selector, | 30 | + public PointToPointIntent(ApplicationId appId, TrafficSelector selector, |
32 | TrafficTreatment treatment, | 31 | TrafficTreatment treatment, |
33 | ConnectPoint ingressPoint, | 32 | ConnectPoint ingressPoint, |
34 | ConnectPoint egressPoint) { | 33 | ConnectPoint egressPoint) { |
35 | - super(id, selector, treatment); | 34 | + super(id(PointToPointIntent.class, selector, treatment, ingressPoint, egressPoint), |
35 | + appId, null, selector, treatment); | ||
36 | this.ingressPoint = checkNotNull(ingressPoint); | 36 | this.ingressPoint = checkNotNull(ingressPoint); |
37 | this.egressPoint = checkNotNull(egressPoint); | 37 | this.egressPoint = checkNotNull(egressPoint); |
38 | } | 38 | } |
... | @@ -66,35 +66,14 @@ public class PointToPointIntent extends ConnectivityIntent { | ... | @@ -66,35 +66,14 @@ public class PointToPointIntent extends ConnectivityIntent { |
66 | } | 66 | } |
67 | 67 | ||
68 | @Override | 68 | @Override |
69 | - public boolean equals(Object o) { | ||
70 | - if (this == o) { | ||
71 | - return true; | ||
72 | - } | ||
73 | - if (o == null || getClass() != o.getClass()) { | ||
74 | - return false; | ||
75 | - } | ||
76 | - if (!super.equals(o)) { | ||
77 | - return false; | ||
78 | - } | ||
79 | - | ||
80 | - PointToPointIntent that = (PointToPointIntent) o; | ||
81 | - return Objects.equals(this.ingressPoint, that.ingressPoint) | ||
82 | - && Objects.equals(this.egressPoint, that.egressPoint); | ||
83 | - } | ||
84 | - | ||
85 | - @Override | ||
86 | - public int hashCode() { | ||
87 | - return Objects.hash(super.hashCode(), ingressPoint, egressPoint); | ||
88 | - } | ||
89 | - | ||
90 | - @Override | ||
91 | public String toString() { | 69 | public String toString() { |
92 | return MoreObjects.toStringHelper(getClass()) | 70 | return MoreObjects.toStringHelper(getClass()) |
93 | .add("id", id()) | 71 | .add("id", id()) |
94 | - .add("match", selector()) | 72 | + .add("appId", appId()) |
95 | - .add("action", treatment()) | 73 | + .add("selector", selector()) |
96 | - .add("ingressPoint", ingressPoint) | 74 | + .add("treatment", treatment()) |
97 | - .add("egressPoints", egressPoint) | 75 | + .add("ingress", ingressPoint) |
76 | + .add("egress", egressPoint) | ||
98 | .toString(); | 77 | .toString(); |
99 | } | 78 | } |
100 | 79 | ... | ... |
... | @@ -2,11 +2,11 @@ package org.onlab.onos.net.intent; | ... | @@ -2,11 +2,11 @@ package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import com.google.common.base.MoreObjects; | 3 | import com.google.common.base.MoreObjects; |
4 | import com.google.common.collect.Sets; | 4 | import com.google.common.collect.Sets; |
5 | +import org.onlab.onos.ApplicationId; | ||
5 | import org.onlab.onos.net.ConnectPoint; | 6 | import org.onlab.onos.net.ConnectPoint; |
6 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
7 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
8 | 9 | ||
9 | -import java.util.Objects; | ||
10 | import java.util.Set; | 10 | import java.util.Set; |
11 | 11 | ||
12 | import static com.google.common.base.Preconditions.checkArgument; | 12 | import static com.google.common.base.Preconditions.checkArgument; |
... | @@ -23,7 +23,7 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { | ... | @@ -23,7 +23,7 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { |
23 | /** | 23 | /** |
24 | * Creates a new single-to-multi point connectivity intent. | 24 | * Creates a new single-to-multi point connectivity intent. |
25 | * | 25 | * |
26 | - * @param id intent identifier | 26 | + * @param appId application identifier |
27 | * @param selector traffic selector | 27 | * @param selector traffic selector |
28 | * @param treatment treatment | 28 | * @param treatment treatment |
29 | * @param ingressPoint port on which traffic will ingress | 29 | * @param ingressPoint port on which traffic will ingress |
... | @@ -33,16 +33,15 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { | ... | @@ -33,16 +33,15 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { |
33 | * @throws IllegalArgumentException if the size of {@code egressPoints} is | 33 | * @throws IllegalArgumentException if the size of {@code egressPoints} is |
34 | * not more than 1 | 34 | * not more than 1 |
35 | */ | 35 | */ |
36 | - public SinglePointToMultiPointIntent(IntentId id, TrafficSelector selector, | 36 | + public SinglePointToMultiPointIntent(ApplicationId appId, |
37 | + TrafficSelector selector, | ||
37 | TrafficTreatment treatment, | 38 | TrafficTreatment treatment, |
38 | ConnectPoint ingressPoint, | 39 | ConnectPoint ingressPoint, |
39 | Set<ConnectPoint> egressPoints) { | 40 | Set<ConnectPoint> egressPoints) { |
40 | - super(id, selector, treatment); | 41 | + super(id(SinglePointToMultiPointIntent.class, selector, treatment, |
41 | - | 42 | + ingressPoint, egressPoints), appId, null, selector, treatment); |
42 | checkNotNull(egressPoints); | 43 | checkNotNull(egressPoints); |
43 | - checkArgument(!egressPoints.isEmpty(), | 44 | + checkArgument(!egressPoints.isEmpty(), "Egress point set cannot be empty"); |
44 | - "there should be at least one egress port"); | ||
45 | - | ||
46 | this.ingressPoint = checkNotNull(ingressPoint); | 45 | this.ingressPoint = checkNotNull(ingressPoint); |
47 | this.egressPoints = Sets.newHashSet(egressPoints); | 46 | this.egressPoints = Sets.newHashSet(egressPoints); |
48 | } | 47 | } |
... | @@ -75,35 +74,14 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { | ... | @@ -75,35 +74,14 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { |
75 | } | 74 | } |
76 | 75 | ||
77 | @Override | 76 | @Override |
78 | - public boolean equals(Object o) { | ||
79 | - if (this == o) { | ||
80 | - return true; | ||
81 | - } | ||
82 | - if (o == null || getClass() != o.getClass()) { | ||
83 | - return false; | ||
84 | - } | ||
85 | - if (!super.equals(o)) { | ||
86 | - return false; | ||
87 | - } | ||
88 | - | ||
89 | - SinglePointToMultiPointIntent that = (SinglePointToMultiPointIntent) o; | ||
90 | - return Objects.equals(this.ingressPoint, that.ingressPoint) | ||
91 | - && Objects.equals(this.egressPoints, that.egressPoints); | ||
92 | - } | ||
93 | - | ||
94 | - @Override | ||
95 | - public int hashCode() { | ||
96 | - return Objects.hash(super.hashCode(), ingressPoint, egressPoints); | ||
97 | - } | ||
98 | - | ||
99 | - @Override | ||
100 | public String toString() { | 77 | public String toString() { |
101 | return MoreObjects.toStringHelper(getClass()) | 78 | return MoreObjects.toStringHelper(getClass()) |
102 | .add("id", id()) | 79 | .add("id", id()) |
103 | - .add("match", selector()) | 80 | + .add("appId", appId()) |
104 | - .add("action", treatment()) | 81 | + .add("selector", selector()) |
105 | - .add("ingressPoint", ingressPoint) | 82 | + .add("treatment", treatment()) |
106 | - .add("egressPort", egressPoints) | 83 | + .add("ingress", ingressPoint) |
84 | + .add("egress", egressPoints) | ||
107 | .toString(); | 85 | .toString(); |
108 | } | 86 | } |
109 | 87 | ... | ... |
... | @@ -30,6 +30,7 @@ public final class Lambda extends LinkResource { | ... | @@ -30,6 +30,7 @@ public final class Lambda extends LinkResource { |
30 | 30 | ||
31 | /** | 31 | /** |
32 | * Returns lambda as an int value. | 32 | * Returns lambda as an int value. |
33 | + * | ||
33 | * @return lambda as an int value | 34 | * @return lambda as an int value |
34 | */ | 35 | */ |
35 | public int toInt() { | 36 | public int toInt() { | ... | ... |
1 | +package org.onlab.onos.net.resource; | ||
2 | + | ||
3 | +/** | ||
4 | + * Representation of allocated lambda resource. | ||
5 | + */ | ||
6 | +public interface LambdaResourceAllocation extends LambdaResourceRequest { | ||
7 | + /** | ||
8 | + * Returns the lambda resource. | ||
9 | + * | ||
10 | + * @return the lambda resource | ||
11 | + */ | ||
12 | + Lambda lambda(); | ||
13 | +} |
1 | +package org.onlab.onos.net.resource; | ||
2 | + | ||
3 | +import org.onlab.onos.net.Link; | ||
4 | + | ||
5 | +/** | ||
6 | + * Representation of allocated link resources. | ||
7 | + */ | ||
8 | +public interface LinkResourceAllocations extends LinkResourceRequest { | ||
9 | + /** | ||
10 | + * Returns allocated resource for the given link. | ||
11 | + * | ||
12 | + * @param link the target link | ||
13 | + * @return allocated resource for the link | ||
14 | + */ | ||
15 | + ResourceAllocation getResourceAllocation(Link link); | ||
16 | +} |
1 | +package org.onlab.onos.net.resource; | ||
2 | + | ||
3 | +import java.util.Collection; | ||
4 | +import java.util.Set; | ||
5 | + | ||
6 | +import org.onlab.onos.net.Link; | ||
7 | +import org.onlab.onos.net.intent.IntentId; | ||
8 | + | ||
9 | +/** | ||
10 | + * Representation of a request for link resource. | ||
11 | + */ | ||
12 | +public interface LinkResourceRequest extends ResourceRequest { | ||
13 | + | ||
14 | + /** | ||
15 | + * Returns the {@link IntentId} associated with the request. | ||
16 | + * | ||
17 | + * @return the {@link IntentId} associated with the request | ||
18 | + */ | ||
19 | + IntentId intendId(); | ||
20 | + | ||
21 | + /** | ||
22 | + * Returns the set of target links. | ||
23 | + * | ||
24 | + * @return the set of target links | ||
25 | + */ | ||
26 | + Collection<Link> links(); | ||
27 | + | ||
28 | + /** | ||
29 | + * Returns the set of resource requests. | ||
30 | + * | ||
31 | + * @return the set of resource requests | ||
32 | + */ | ||
33 | + Set<ResourceRequest> resources(); | ||
34 | +} |
1 | package org.onlab.onos.net.resource; | 1 | package org.onlab.onos.net.resource; |
2 | 2 | ||
3 | -import java.util.Map; | ||
4 | - | ||
5 | import org.onlab.onos.net.Link; | 3 | import org.onlab.onos.net.Link; |
6 | import org.onlab.onos.net.intent.IntentId; | 4 | import org.onlab.onos.net.intent.IntentId; |
7 | -import org.onlab.onos.net.intent.PathIntent; | ||
8 | 5 | ||
9 | /** | 6 | /** |
10 | * Service for providing link resource allocation. | 7 | * Service for providing link resource allocation. |
... | @@ -12,49 +9,48 @@ import org.onlab.onos.net.intent.PathIntent; | ... | @@ -12,49 +9,48 @@ import org.onlab.onos.net.intent.PathIntent; |
12 | public interface LinkResourceService { | 9 | public interface LinkResourceService { |
13 | 10 | ||
14 | /** | 11 | /** |
15 | - * Allocates resources along the path. | 12 | + * Requests resources. |
16 | - * <p> | ||
17 | - * Tries to allocate given resources on the links along the path specified | ||
18 | - * by the given intent. | ||
19 | * | 13 | * |
20 | - * @param res resources to be allocated | 14 | + * @param req resources to be allocated |
21 | - * @param intent an intent to be used for specifying the path | 15 | + * @return allocated resources |
22 | */ | 16 | */ |
23 | - void allocateResource(LinkResources res, PathIntent intent); | 17 | + LinkResourceAllocations requestResources(LinkResourceRequest req); |
24 | 18 | ||
25 | /** | 19 | /** |
26 | - * Releases resources along the path. | 20 | + * Releases resources. |
27 | * | 21 | * |
28 | - * @param intentId an ID for the intent for specifying the path | 22 | + * @param allocations resources to be released |
29 | */ | 23 | */ |
30 | - void releaseResource(IntentId intentId); | 24 | + void releaseResources(LinkResourceAllocations allocations); |
31 | 25 | ||
32 | /** | 26 | /** |
33 | - * Returns all allocated resources to each link. | 27 | + * Returns all allocated resources. |
34 | * | 28 | * |
35 | - * @return allocated resources to each link with {@link IntentId} | 29 | + * @return allocated resources |
36 | */ | 30 | */ |
37 | - Map<Link, Map<IntentId, LinkResources>> allocatedResources(); | 31 | + Iterable<LinkResourceAllocations> getAllocations(); |
38 | 32 | ||
39 | /** | 33 | /** |
40 | * Returns all allocated resources to given link. | 34 | * Returns all allocated resources to given link. |
41 | * | 35 | * |
42 | * @param link a target link | 36 | * @param link a target link |
43 | - * @return allocated resources to the target link with {@link IntentId} | 37 | + * @return allocated resources |
44 | */ | 38 | */ |
45 | - Map<IntentId, LinkResources> allocatedResources(Link link); | 39 | + Iterable<LinkResourceAllocations> getAllocations(Link link); |
46 | 40 | ||
47 | /** | 41 | /** |
48 | - * Returns available resources for each link. | 42 | + * Returns all IDs of intents using the given link. |
49 | * | 43 | * |
50 | - * @return available resources for each link | 44 | + * @param link a target link |
45 | + * @return IDs of intents using the link | ||
51 | */ | 46 | */ |
52 | - Map<Link, LinkResources> availableResources(); | 47 | + Iterable<IntentId> getIntents(Link link); |
53 | 48 | ||
54 | /** | 49 | /** |
55 | * Returns available resources for given link. | 50 | * Returns available resources for given link. |
51 | + * | ||
56 | * @param link a target link | 52 | * @param link a target link |
57 | * @return available resources for the target link | 53 | * @return available resources for the target link |
58 | */ | 54 | */ |
59 | - LinkResources availableResources(Link link); | 55 | + ResourceRequest getAvailableResources(Link link); |
60 | } | 56 | } | ... | ... |
... | @@ -2,6 +2,8 @@ package org.onlab.onos.net.intent; | ... | @@ -2,6 +2,8 @@ package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import java.util.Set; | 3 | import java.util.Set; |
4 | 4 | ||
5 | +import org.onlab.onos.ApplicationId; | ||
6 | +import org.onlab.onos.TestApplicationId; | ||
5 | import org.onlab.onos.net.ConnectPoint; | 7 | import org.onlab.onos.net.ConnectPoint; |
6 | import org.onlab.onos.net.DeviceId; | 8 | import org.onlab.onos.net.DeviceId; |
7 | import org.onlab.onos.net.PortNumber; | 9 | import org.onlab.onos.net.PortNumber; |
... | @@ -15,6 +17,8 @@ import org.onlab.onos.net.flow.TrafficTreatment; | ... | @@ -15,6 +17,8 @@ import org.onlab.onos.net.flow.TrafficTreatment; |
15 | */ | 17 | */ |
16 | public abstract class ConnectivityIntentTest extends IntentTest { | 18 | public abstract class ConnectivityIntentTest extends IntentTest { |
17 | 19 | ||
20 | + public static final ApplicationId APPID = new TestApplicationId("foo"); | ||
21 | + | ||
18 | public static final IntentId IID = new IntentId(123); | 22 | public static final IntentId IID = new IntentId(123); |
19 | public static final TrafficSelector MATCH = DefaultTrafficSelector.builder().build(); | 23 | public static final TrafficSelector MATCH = DefaultTrafficSelector.builder().build(); |
20 | public static final TrafficTreatment NOP = DefaultTrafficTreatment.builder().build(); | 24 | public static final TrafficTreatment NOP = DefaultTrafficTreatment.builder().build(); | ... | ... |
... | @@ -18,11 +18,11 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -18,11 +18,11 @@ public class FakeIntentManager implements TestableIntentService { |
18 | 18 | ||
19 | private final Map<IntentId, Intent> intents = new HashMap<>(); | 19 | private final Map<IntentId, Intent> intents = new HashMap<>(); |
20 | private final Map<IntentId, IntentState> intentStates = new HashMap<>(); | 20 | private final Map<IntentId, IntentState> intentStates = new HashMap<>(); |
21 | - private final Map<IntentId, List<InstallableIntent>> installables = new HashMap<>(); | 21 | + private final Map<IntentId, List<Intent>> installables = new HashMap<>(); |
22 | private final Set<IntentListener> listeners = new HashSet<>(); | 22 | private final Set<IntentListener> listeners = new HashSet<>(); |
23 | 23 | ||
24 | private final Map<Class<? extends Intent>, IntentCompiler<? extends Intent>> compilers = new HashMap<>(); | 24 | private final Map<Class<? extends Intent>, IntentCompiler<? extends Intent>> compilers = new HashMap<>(); |
25 | - private final Map<Class<? extends InstallableIntent>, IntentInstaller<? extends InstallableIntent>> installers | 25 | + private final Map<Class<? extends Intent>, IntentInstaller<? extends Intent>> installers |
26 | = new HashMap<>(); | 26 | = new HashMap<>(); |
27 | 27 | ||
28 | private final ExecutorService executor = Executors.newSingleThreadExecutor(); | 28 | private final ExecutorService executor = Executors.newSingleThreadExecutor(); |
... | @@ -54,7 +54,7 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -54,7 +54,7 @@ public class FakeIntentManager implements TestableIntentService { |
54 | @Override | 54 | @Override |
55 | public void run() { | 55 | public void run() { |
56 | try { | 56 | try { |
57 | - List<InstallableIntent> installable = getInstallable(intent.id()); | 57 | + List<Intent> installable = getInstallable(intent.id()); |
58 | executeWithdrawingPhase(intent, installable); | 58 | executeWithdrawingPhase(intent, installable); |
59 | } catch (IntentException e) { | 59 | } catch (IntentException e) { |
60 | exceptions.add(e); | 60 | exceptions.add(e); |
... | @@ -73,7 +73,7 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -73,7 +73,7 @@ public class FakeIntentManager implements TestableIntentService { |
73 | return compiler; | 73 | return compiler; |
74 | } | 74 | } |
75 | 75 | ||
76 | - private <T extends InstallableIntent> IntentInstaller<T> getInstaller(T intent) { | 76 | + private <T extends Intent> IntentInstaller<T> getInstaller(T intent) { |
77 | @SuppressWarnings("unchecked") | 77 | @SuppressWarnings("unchecked") |
78 | IntentInstaller<T> installer = (IntentInstaller<T>) installers.get(intent | 78 | IntentInstaller<T> installer = (IntentInstaller<T>) installers.get(intent |
79 | .getClass()); | 79 | .getClass()); |
... | @@ -87,9 +87,9 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -87,9 +87,9 @@ public class FakeIntentManager implements TestableIntentService { |
87 | setState(intent, IntentState.COMPILING); | 87 | setState(intent, IntentState.COMPILING); |
88 | try { | 88 | try { |
89 | // For the fake, we compile using a single level pass | 89 | // For the fake, we compile using a single level pass |
90 | - List<InstallableIntent> installable = new ArrayList<>(); | 90 | + List<Intent> installable = new ArrayList<>(); |
91 | for (Intent compiled : getCompiler(intent).compile(intent)) { | 91 | for (Intent compiled : getCompiler(intent).compile(intent)) { |
92 | - installable.add((InstallableIntent) compiled); | 92 | + installable.add((Intent) compiled); |
93 | } | 93 | } |
94 | executeInstallingPhase(intent, installable); | 94 | executeInstallingPhase(intent, installable); |
95 | 95 | ||
... | @@ -100,10 +100,10 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -100,10 +100,10 @@ public class FakeIntentManager implements TestableIntentService { |
100 | } | 100 | } |
101 | 101 | ||
102 | private void executeInstallingPhase(Intent intent, | 102 | private void executeInstallingPhase(Intent intent, |
103 | - List<InstallableIntent> installable) { | 103 | + List<Intent> installable) { |
104 | setState(intent, IntentState.INSTALLING); | 104 | setState(intent, IntentState.INSTALLING); |
105 | try { | 105 | try { |
106 | - for (InstallableIntent ii : installable) { | 106 | + for (Intent ii : installable) { |
107 | registerSubclassInstallerIfNeeded(ii); | 107 | registerSubclassInstallerIfNeeded(ii); |
108 | getInstaller(ii).install(ii); | 108 | getInstaller(ii).install(ii); |
109 | } | 109 | } |
... | @@ -118,10 +118,10 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -118,10 +118,10 @@ public class FakeIntentManager implements TestableIntentService { |
118 | } | 118 | } |
119 | 119 | ||
120 | private void executeWithdrawingPhase(Intent intent, | 120 | private void executeWithdrawingPhase(Intent intent, |
121 | - List<InstallableIntent> installable) { | 121 | + List<Intent> installable) { |
122 | setState(intent, IntentState.WITHDRAWING); | 122 | setState(intent, IntentState.WITHDRAWING); |
123 | try { | 123 | try { |
124 | - for (InstallableIntent ii : installable) { | 124 | + for (Intent ii : installable) { |
125 | getInstaller(ii).uninstall(ii); | 125 | getInstaller(ii).uninstall(ii); |
126 | } | 126 | } |
127 | removeInstallable(intent.id()); | 127 | removeInstallable(intent.id()); |
... | @@ -139,7 +139,7 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -139,7 +139,7 @@ public class FakeIntentManager implements TestableIntentService { |
139 | intentStates.put(intent.id(), state); | 139 | intentStates.put(intent.id(), state); |
140 | } | 140 | } |
141 | 141 | ||
142 | - private void putInstallable(IntentId id, List<InstallableIntent> installable) { | 142 | + private void putInstallable(IntentId id, List<Intent> installable) { |
143 | installables.put(id, installable); | 143 | installables.put(id, installable); |
144 | } | 144 | } |
145 | 145 | ||
... | @@ -147,8 +147,8 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -147,8 +147,8 @@ public class FakeIntentManager implements TestableIntentService { |
147 | installables.remove(id); | 147 | installables.remove(id); |
148 | } | 148 | } |
149 | 149 | ||
150 | - private List<InstallableIntent> getInstallable(IntentId id) { | 150 | + private List<Intent> getInstallable(IntentId id) { |
151 | - List<InstallableIntent> installable = installables.get(id); | 151 | + List<Intent> installable = installables.get(id); |
152 | if (installable != null) { | 152 | if (installable != null) { |
153 | return installable; | 153 | return installable; |
154 | } else { | 154 | } else { |
... | @@ -228,19 +228,19 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -228,19 +228,19 @@ public class FakeIntentManager implements TestableIntentService { |
228 | } | 228 | } |
229 | 229 | ||
230 | @Override | 230 | @Override |
231 | - public <T extends InstallableIntent> void registerInstaller(Class<T> cls, | 231 | + public <T extends Intent> void registerInstaller(Class<T> cls, |
232 | IntentInstaller<T> installer) { | 232 | IntentInstaller<T> installer) { |
233 | installers.put(cls, installer); | 233 | installers.put(cls, installer); |
234 | } | 234 | } |
235 | 235 | ||
236 | @Override | 236 | @Override |
237 | - public <T extends InstallableIntent> void unregisterInstaller(Class<T> cls) { | 237 | + public <T extends Intent> void unregisterInstaller(Class<T> cls) { |
238 | installers.remove(cls); | 238 | installers.remove(cls); |
239 | } | 239 | } |
240 | 240 | ||
241 | @Override | 241 | @Override |
242 | - public Map<Class<? extends InstallableIntent>, | 242 | + public Map<Class<? extends Intent>, |
243 | - IntentInstaller<? extends InstallableIntent>> getInstallers() { | 243 | + IntentInstaller<? extends Intent>> getInstallers() { |
244 | return Collections.unmodifiableMap(installers); | 244 | return Collections.unmodifiableMap(installers); |
245 | } | 245 | } |
246 | 246 | ||
... | @@ -261,13 +261,13 @@ public class FakeIntentManager implements TestableIntentService { | ... | @@ -261,13 +261,13 @@ public class FakeIntentManager implements TestableIntentService { |
261 | } | 261 | } |
262 | } | 262 | } |
263 | 263 | ||
264 | - private void registerSubclassInstallerIfNeeded(InstallableIntent intent) { | 264 | + private void registerSubclassInstallerIfNeeded(Intent intent) { |
265 | if (!installers.containsKey(intent.getClass())) { | 265 | if (!installers.containsKey(intent.getClass())) { |
266 | Class<?> cls = intent.getClass(); | 266 | Class<?> cls = intent.getClass(); |
267 | while (cls != Object.class) { | 267 | while (cls != Object.class) { |
268 | - // As long as we're within the InstallableIntent class | 268 | + // As long as we're within the Intent class |
269 | // descendants | 269 | // descendants |
270 | - if (InstallableIntent.class.isAssignableFrom(cls)) { | 270 | + if (Intent.class.isAssignableFrom(cls)) { |
271 | IntentInstaller<?> installer = installers.get(cls); | 271 | IntentInstaller<?> installer = installers.get(cls); |
272 | if (installer != null) { | 272 | if (installer != null) { |
273 | installers.put(intent.getClass(), installer); | 273 | installers.put(intent.getClass(), installer); | ... | ... |
1 | -package org.onlab.onos.net.intent; | ||
2 | - | ||
3 | -/** | ||
4 | - * This interface is for generator of IntentId. It is defined only for | ||
5 | - * testing purpose to keep type safety on mock creation. | ||
6 | - * | ||
7 | - * <p> | ||
8 | - * {@link #getNewId()} generates a globally unique {@link IntentId} instance | ||
9 | - * on each invocation. Application developers should not generate IntentId | ||
10 | - * by themselves. Instead use an implementation of this interface. | ||
11 | - * </p> | ||
12 | - */ | ||
13 | -public interface IntentIdGenerator extends IdGenerator<IntentId> { | ||
14 | -} |
... | @@ -44,14 +44,8 @@ public class IntentIdTest { | ... | @@ -44,14 +44,8 @@ public class IntentIdTest { |
44 | 44 | ||
45 | @Test | 45 | @Test |
46 | public void valueOf() { | 46 | public void valueOf() { |
47 | - IntentId id = new IntentId(12345); | ||
48 | - assertEquals("incorrect valueOf", id, IntentId.valueOf("12345")); | ||
49 | - } | ||
50 | - | ||
51 | - @Test | ||
52 | - public void valueOfHex() { | ||
53 | IntentId id = new IntentId(0xdeadbeefL); | 47 | IntentId id = new IntentId(0xdeadbeefL); |
54 | - assertEquals("incorrect valueOf", id, IntentId.valueOf(id.toString())); | 48 | + assertEquals("incorrect valueOf", id, IntentId.valueOf(0xdeadbeefL)); |
55 | } | 49 | } |
56 | 50 | ||
57 | } | 51 | } | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | -import static org.junit.Assert.assertEquals; | 3 | +import org.junit.Test; |
4 | -import static org.junit.Assert.assertFalse; | ||
5 | -import static org.junit.Assert.assertTrue; | ||
6 | 4 | ||
7 | import java.util.Arrays; | 5 | import java.util.Arrays; |
8 | import java.util.HashSet; | 6 | import java.util.HashSet; |
9 | import java.util.Set; | 7 | import java.util.Set; |
10 | 8 | ||
11 | -import org.junit.Test; | 9 | +import static org.junit.Assert.*; |
12 | 10 | ||
13 | /** | 11 | /** |
14 | * Base facilities to test various intent tests. | 12 | * Base facilities to test various intent tests. |
... | @@ -33,11 +31,7 @@ public abstract class IntentTest { | ... | @@ -33,11 +31,7 @@ public abstract class IntentTest { |
33 | 31 | ||
34 | assertTrue("should be equal", one.equals(like)); | 32 | assertTrue("should be equal", one.equals(like)); |
35 | assertEquals("incorrect hashCode", one.hashCode(), like.hashCode()); | 33 | assertEquals("incorrect hashCode", one.hashCode(), like.hashCode()); |
36 | - | ||
37 | assertFalse("should not be equal", one.equals(another)); | 34 | assertFalse("should not be equal", one.equals(another)); |
38 | - | ||
39 | - assertFalse("should not be equal", one.equals(null)); | ||
40 | - assertFalse("should not be equal", one.equals("foo")); | ||
41 | } | 35 | } |
42 | 36 | ||
43 | @Test | 37 | @Test | ... | ... |
... | @@ -12,7 +12,7 @@ public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest { | ... | @@ -12,7 +12,7 @@ public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest { |
12 | @Test | 12 | @Test |
13 | public void basics() { | 13 | public void basics() { |
14 | MultiPointToSinglePointIntent intent = createOne(); | 14 | MultiPointToSinglePointIntent intent = createOne(); |
15 | - assertEquals("incorrect id", IID, intent.id()); | 15 | + assertEquals("incorrect id", APPID, intent.appId()); |
16 | assertEquals("incorrect match", MATCH, intent.selector()); | 16 | assertEquals("incorrect match", MATCH, intent.selector()); |
17 | assertEquals("incorrect ingress", PS1, intent.ingressPoints()); | 17 | assertEquals("incorrect ingress", PS1, intent.ingressPoints()); |
18 | assertEquals("incorrect egress", P2, intent.egressPoint()); | 18 | assertEquals("incorrect egress", P2, intent.egressPoint()); |
... | @@ -20,11 +20,11 @@ public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest { | ... | @@ -20,11 +20,11 @@ public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest { |
20 | 20 | ||
21 | @Override | 21 | @Override |
22 | protected MultiPointToSinglePointIntent createOne() { | 22 | protected MultiPointToSinglePointIntent createOne() { |
23 | - return new MultiPointToSinglePointIntent(IID, MATCH, NOP, PS1, P2); | 23 | + return new MultiPointToSinglePointIntent(APPID, MATCH, NOP, PS1, P2); |
24 | } | 24 | } |
25 | 25 | ||
26 | @Override | 26 | @Override |
27 | protected MultiPointToSinglePointIntent createAnother() { | 27 | protected MultiPointToSinglePointIntent createAnother() { |
28 | - return new MultiPointToSinglePointIntent(IID, MATCH, NOP, PS2, P1); | 28 | + return new MultiPointToSinglePointIntent(APPID, MATCH, NOP, PS2, P1); |
29 | } | 29 | } |
30 | } | 30 | } | ... | ... |
... | @@ -16,21 +16,19 @@ public class PathIntentTest extends ConnectivityIntentTest { | ... | @@ -16,21 +16,19 @@ public class PathIntentTest extends ConnectivityIntentTest { |
16 | @Test | 16 | @Test |
17 | public void basics() { | 17 | public void basics() { |
18 | PathIntent intent = createOne(); | 18 | PathIntent intent = createOne(); |
19 | - assertEquals("incorrect id", IID, intent.id()); | 19 | + assertEquals("incorrect id", APPID, intent.appId()); |
20 | assertEquals("incorrect match", MATCH, intent.selector()); | 20 | assertEquals("incorrect match", MATCH, intent.selector()); |
21 | assertEquals("incorrect action", NOP, intent.treatment()); | 21 | assertEquals("incorrect action", NOP, intent.treatment()); |
22 | - assertEquals("incorrect ingress", P1, intent.ingressPoint()); | ||
23 | - assertEquals("incorrect egress", P2, intent.egressPoint()); | ||
24 | assertEquals("incorrect path", PATH1, intent.path()); | 22 | assertEquals("incorrect path", PATH1, intent.path()); |
25 | } | 23 | } |
26 | 24 | ||
27 | @Override | 25 | @Override |
28 | protected PathIntent createOne() { | 26 | protected PathIntent createOne() { |
29 | - return new PathIntent(IID, MATCH, NOP, P1, P2, PATH1); | 27 | + return new PathIntent(APPID, MATCH, NOP, PATH1); |
30 | } | 28 | } |
31 | 29 | ||
32 | @Override | 30 | @Override |
33 | protected PathIntent createAnother() { | 31 | protected PathIntent createAnother() { |
34 | - return new PathIntent(IID, MATCH, NOP, P1, P3, PATH2); | 32 | + return new PathIntent(APPID, MATCH, NOP, PATH2); |
35 | } | 33 | } |
36 | } | 34 | } | ... | ... |
... | @@ -12,7 +12,7 @@ public class PointToPointIntentTest extends ConnectivityIntentTest { | ... | @@ -12,7 +12,7 @@ public class PointToPointIntentTest extends ConnectivityIntentTest { |
12 | @Test | 12 | @Test |
13 | public void basics() { | 13 | public void basics() { |
14 | PointToPointIntent intent = createOne(); | 14 | PointToPointIntent intent = createOne(); |
15 | - assertEquals("incorrect id", IID, intent.id()); | 15 | + assertEquals("incorrect id", APPID, intent.appId()); |
16 | assertEquals("incorrect match", MATCH, intent.selector()); | 16 | assertEquals("incorrect match", MATCH, intent.selector()); |
17 | assertEquals("incorrect ingress", P1, intent.ingressPoint()); | 17 | assertEquals("incorrect ingress", P1, intent.ingressPoint()); |
18 | assertEquals("incorrect egress", P2, intent.egressPoint()); | 18 | assertEquals("incorrect egress", P2, intent.egressPoint()); |
... | @@ -20,11 +20,11 @@ public class PointToPointIntentTest extends ConnectivityIntentTest { | ... | @@ -20,11 +20,11 @@ public class PointToPointIntentTest extends ConnectivityIntentTest { |
20 | 20 | ||
21 | @Override | 21 | @Override |
22 | protected PointToPointIntent createOne() { | 22 | protected PointToPointIntent createOne() { |
23 | - return new PointToPointIntent(IID, MATCH, NOP, P1, P2); | 23 | + return new PointToPointIntent(APPID, MATCH, NOP, P1, P2); |
24 | } | 24 | } |
25 | 25 | ||
26 | @Override | 26 | @Override |
27 | protected PointToPointIntent createAnother() { | 27 | protected PointToPointIntent createAnother() { |
28 | - return new PointToPointIntent(IID, MATCH, NOP, P2, P1); | 28 | + return new PointToPointIntent(APPID, MATCH, NOP, P2, P1); |
29 | } | 29 | } |
30 | } | 30 | } | ... | ... |
... | @@ -12,7 +12,7 @@ public class SinglePointToMultiPointIntentTest extends ConnectivityIntentTest { | ... | @@ -12,7 +12,7 @@ public class SinglePointToMultiPointIntentTest extends ConnectivityIntentTest { |
12 | @Test | 12 | @Test |
13 | public void basics() { | 13 | public void basics() { |
14 | SinglePointToMultiPointIntent intent = createOne(); | 14 | SinglePointToMultiPointIntent intent = createOne(); |
15 | - assertEquals("incorrect id", IID, intent.id()); | 15 | + assertEquals("incorrect id", APPID, intent.appId()); |
16 | assertEquals("incorrect match", MATCH, intent.selector()); | 16 | assertEquals("incorrect match", MATCH, intent.selector()); |
17 | assertEquals("incorrect ingress", P1, intent.ingressPoint()); | 17 | assertEquals("incorrect ingress", P1, intent.ingressPoint()); |
18 | assertEquals("incorrect egress", PS2, intent.egressPoints()); | 18 | assertEquals("incorrect egress", PS2, intent.egressPoints()); |
... | @@ -20,11 +20,11 @@ public class SinglePointToMultiPointIntentTest extends ConnectivityIntentTest { | ... | @@ -20,11 +20,11 @@ public class SinglePointToMultiPointIntentTest extends ConnectivityIntentTest { |
20 | 20 | ||
21 | @Override | 21 | @Override |
22 | protected SinglePointToMultiPointIntent createOne() { | 22 | protected SinglePointToMultiPointIntent createOne() { |
23 | - return new SinglePointToMultiPointIntent(IID, MATCH, NOP, P1, PS2); | 23 | + return new SinglePointToMultiPointIntent(APPID, MATCH, NOP, P1, PS2); |
24 | } | 24 | } |
25 | 25 | ||
26 | @Override | 26 | @Override |
27 | protected SinglePointToMultiPointIntent createAnother() { | 27 | protected SinglePointToMultiPointIntent createAnother() { |
28 | - return new SinglePointToMultiPointIntent(IID, MATCH, NOP, P2, PS1); | 28 | + return new SinglePointToMultiPointIntent(APPID, MATCH, NOP, P2, PS1); |
29 | } | 29 | } |
30 | } | 30 | } | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | -//TODO is this the right package? | ||
3 | 2 | ||
4 | -import org.onlab.onos.net.Link; | 3 | +import org.onlab.onos.TestApplicationId; |
5 | - | ||
6 | -import java.util.Collection; | ||
7 | 4 | ||
8 | /** | 5 | /** |
9 | * An installable intent used in the unit test. | 6 | * An installable intent used in the unit test. |
10 | - * | ||
11 | - * FIXME: we don't want to expose this class publicly, but the current Kryo | ||
12 | - * serialization mechanism does not allow this class to be private and placed | ||
13 | - * on testing directory. | ||
14 | */ | 7 | */ |
15 | -public class TestInstallableIntent extends AbstractIntent implements InstallableIntent { | 8 | +public class TestInstallableIntent extends Intent { |
16 | /** | 9 | /** |
17 | * Constructs an instance with the specified intent ID. | 10 | * Constructs an instance with the specified intent ID. |
18 | * | 11 | * |
19 | * @param id intent ID | 12 | * @param id intent ID |
20 | */ | 13 | */ |
21 | public TestInstallableIntent(IntentId id) { | 14 | public TestInstallableIntent(IntentId id) { |
22 | - super(id); | 15 | + super(id, new TestApplicationId("foo"), null); |
23 | } | 16 | } |
24 | 17 | ||
25 | /** | 18 | /** |
... | @@ -30,7 +23,8 @@ public class TestInstallableIntent extends AbstractIntent implements Installable | ... | @@ -30,7 +23,8 @@ public class TestInstallableIntent extends AbstractIntent implements Installable |
30 | } | 23 | } |
31 | 24 | ||
32 | @Override | 25 | @Override |
33 | - public Collection<Link> requiredLinks() { | 26 | + public boolean isInstallable() { |
34 | - return null; | 27 | + return true; |
35 | } | 28 | } |
29 | + | ||
36 | } | 30 | } | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | -//TODO is this the right package? | 2 | + |
3 | +import org.onlab.onos.TestApplicationId; | ||
3 | 4 | ||
4 | /** | 5 | /** |
5 | * An intent used in the unit test. | 6 | * An intent used in the unit test. |
6 | - * | ||
7 | - * FIXME: we don't want to expose this class publicly, but the current Kryo | ||
8 | - * serialization mechanism does not allow this class to be private and placed | ||
9 | - * on testing directory. | ||
10 | */ | 7 | */ |
11 | -public class TestIntent extends AbstractIntent { | 8 | +public class TestIntent extends Intent { |
12 | /** | 9 | /** |
13 | * Constructs an instance with the specified intent ID. | 10 | * Constructs an instance with the specified intent ID. |
14 | * | 11 | * |
15 | * @param id intent ID | 12 | * @param id intent ID |
16 | */ | 13 | */ |
17 | public TestIntent(IntentId id) { | 14 | public TestIntent(IntentId id) { |
18 | - super(id); | 15 | + super(id, new TestApplicationId("foo"), null); |
19 | } | 16 | } |
20 | 17 | ||
21 | /** | 18 | /** | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | -//TODO is this the right package? | ||
3 | 2 | ||
4 | /** | 3 | /** |
5 | * An intent used in the unit test. | 4 | * An intent used in the unit test. |
6 | - * | ||
7 | - * FIXME: we don't want to expose this class publicly, but the current Kryo | ||
8 | - * serialization mechanism does not allow this class to be private and placed | ||
9 | - * on testing directory. | ||
10 | */ | 5 | */ |
11 | -public class TestSubclassInstallableIntent extends TestInstallableIntent implements InstallableIntent { | 6 | +public class TestSubclassInstallableIntent extends TestInstallableIntent { |
12 | /** | 7 | /** |
13 | * Constructs an instance with the specified intent ID. | 8 | * Constructs an instance with the specified intent ID. |
14 | * | 9 | * | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | -//TODO is this the right package? | ||
3 | 2 | ||
4 | /** | 3 | /** |
5 | * An intent used in the unit test. | 4 | * An intent used in the unit test. |
6 | - * | ||
7 | - * FIXME: we don't want to expose this class publicly, but the current Kryo | ||
8 | - * serialization mechanism does not allow this class to be private and placed | ||
9 | - * on testing directory. | ||
10 | */ | 5 | */ |
11 | public class TestSubclassIntent extends TestIntent { | 6 | public class TestSubclassIntent extends TestIntent { |
12 | /** | 7 | /** | ... | ... |
... | @@ -27,6 +27,7 @@ public class CoreManager implements CoreService { | ... | @@ -27,6 +27,7 @@ public class CoreManager implements CoreService { |
27 | private static Version version = Version.version("1.0.0-SNAPSHOT"); | 27 | private static Version version = Version.version("1.0.0-SNAPSHOT"); |
28 | 28 | ||
29 | private final Map<Short, DefaultApplicationId> appIds = new ConcurrentHashMap<>(); | 29 | private final Map<Short, DefaultApplicationId> appIds = new ConcurrentHashMap<>(); |
30 | + private final Map<String, DefaultApplicationId> appIdsByName = new ConcurrentHashMap<>(); | ||
30 | 31 | ||
31 | // TODO: work in progress | 32 | // TODO: work in progress |
32 | 33 | ||
... | @@ -50,9 +51,13 @@ public class CoreManager implements CoreService { | ... | @@ -50,9 +51,13 @@ public class CoreManager implements CoreService { |
50 | 51 | ||
51 | @Override | 52 | @Override |
52 | public ApplicationId registerApplication(String name) { | 53 | public ApplicationId registerApplication(String name) { |
54 | + DefaultApplicationId appId = appIdsByName.get(name); | ||
55 | + if (appId == null) { | ||
53 | short id = (short) ID_DISPENSER.getAndIncrement(); | 56 | short id = (short) ID_DISPENSER.getAndIncrement(); |
54 | - DefaultApplicationId appId = new DefaultApplicationId(id, name); | 57 | + appId = new DefaultApplicationId(id, name); |
55 | appIds.put(id, appId); | 58 | appIds.put(id, appId); |
59 | + appIdsByName.put(name, appId); | ||
60 | + } | ||
56 | return appId; | 61 | return appId; |
57 | } | 62 | } |
58 | 63 | ... | ... |
... | @@ -104,24 +104,52 @@ public class FlowRuleManager | ... | @@ -104,24 +104,52 @@ public class FlowRuleManager |
104 | public void applyFlowRules(FlowRule... flowRules) { | 104 | public void applyFlowRules(FlowRule... flowRules) { |
105 | for (int i = 0; i < flowRules.length; i++) { | 105 | for (int i = 0; i < flowRules.length; i++) { |
106 | FlowRule f = flowRules[i]; | 106 | FlowRule f = flowRules[i]; |
107 | - final Device device = deviceService.getDevice(f.deviceId()); | 107 | + boolean local = store.storeFlowRule(f); |
108 | - final FlowRuleProvider frp = getProvider(device.providerId()); | 108 | + if (local) { |
109 | - store.storeFlowRule(f); | 109 | + // TODO: aggregate all local rules and push down once? |
110 | + applyFlowRulesToProviders(f); | ||
111 | + } | ||
112 | + } | ||
113 | + } | ||
114 | + | ||
115 | + private void applyFlowRulesToProviders(FlowRule... flowRules) { | ||
116 | + DeviceId did = null; | ||
117 | + FlowRuleProvider frp = null; | ||
118 | + for (FlowRule f : flowRules) { | ||
119 | + if (!f.deviceId().equals(did)) { | ||
120 | + did = f.deviceId(); | ||
121 | + final Device device = deviceService.getDevice(did); | ||
122 | + frp = getProvider(device.providerId()); | ||
123 | + } | ||
124 | + if (frp != null) { | ||
110 | frp.applyFlowRule(f); | 125 | frp.applyFlowRule(f); |
111 | } | 126 | } |
112 | } | 127 | } |
128 | + } | ||
113 | 129 | ||
114 | @Override | 130 | @Override |
115 | public void removeFlowRules(FlowRule... flowRules) { | 131 | public void removeFlowRules(FlowRule... flowRules) { |
116 | FlowRule f; | 132 | FlowRule f; |
117 | - FlowRuleProvider frp; | ||
118 | - Device device; | ||
119 | for (int i = 0; i < flowRules.length; i++) { | 133 | for (int i = 0; i < flowRules.length; i++) { |
120 | f = flowRules[i]; | 134 | f = flowRules[i]; |
121 | - device = deviceService.getDevice(f.deviceId()); | 135 | + boolean local = store.deleteFlowRule(f); |
122 | - store.deleteFlowRule(f); | 136 | + if (local) { |
123 | - if (device != null) { | 137 | + // TODO: aggregate all local rules and push down once? |
138 | + removeFlowRulesFromProviders(f); | ||
139 | + } | ||
140 | + } | ||
141 | + } | ||
142 | + | ||
143 | + private void removeFlowRulesFromProviders(FlowRule... flowRules) { | ||
144 | + DeviceId did = null; | ||
145 | + FlowRuleProvider frp = null; | ||
146 | + for (FlowRule f : flowRules) { | ||
147 | + if (!f.deviceId().equals(did)) { | ||
148 | + did = f.deviceId(); | ||
149 | + final Device device = deviceService.getDevice(did); | ||
124 | frp = getProvider(device.providerId()); | 150 | frp = getProvider(device.providerId()); |
151 | + } | ||
152 | + if (frp != null) { | ||
125 | frp.removeFlowRule(f); | 153 | frp.removeFlowRule(f); |
126 | } | 154 | } |
127 | } | 155 | } |
... | @@ -135,8 +163,11 @@ public class FlowRuleManager | ... | @@ -135,8 +163,11 @@ public class FlowRuleManager |
135 | 163 | ||
136 | for (FlowRule f : rules) { | 164 | for (FlowRule f : rules) { |
137 | store.deleteFlowRule(f); | 165 | store.deleteFlowRule(f); |
166 | + // FIXME: only accept request and push to provider on internal event | ||
138 | device = deviceService.getDevice(f.deviceId()); | 167 | device = deviceService.getDevice(f.deviceId()); |
139 | frp = getProvider(device.providerId()); | 168 | frp = getProvider(device.providerId()); |
169 | + // FIXME: flows removed from store and flows removed from might diverge | ||
170 | + // get rid of #removeRulesById? | ||
140 | frp.removeRulesById(id, f); | 171 | frp.removeRulesById(id, f); |
141 | } | 172 | } |
142 | } | 173 | } |
... | @@ -352,7 +383,23 @@ public class FlowRuleManager | ... | @@ -352,7 +383,23 @@ public class FlowRuleManager |
352 | private class InternalStoreDelegate implements FlowRuleStoreDelegate { | 383 | private class InternalStoreDelegate implements FlowRuleStoreDelegate { |
353 | @Override | 384 | @Override |
354 | public void notify(FlowRuleEvent event) { | 385 | public void notify(FlowRuleEvent event) { |
386 | + switch (event.type()) { | ||
387 | + case RULE_ADD_REQUESTED: | ||
388 | + applyFlowRulesToProviders(event.subject()); | ||
389 | + break; | ||
390 | + case RULE_REMOVE_REQUESTED: | ||
391 | + removeFlowRulesFromProviders(event.subject()); | ||
392 | + break; | ||
393 | + | ||
394 | + case RULE_ADDED: | ||
395 | + case RULE_REMOVED: | ||
396 | + case RULE_UPDATED: | ||
397 | + // only dispatch events related to switch | ||
355 | eventDispatcher.post(event); | 398 | eventDispatcher.post(event); |
399 | + break; | ||
400 | + default: | ||
401 | + break; | ||
402 | + } | ||
356 | } | 403 | } |
357 | } | 404 | } |
358 | 405 | ... | ... |
1 | -package org.onlab.onos.net.intent.impl; | ||
2 | - | ||
3 | -import org.onlab.onos.net.intent.IdGenerator; | ||
4 | - | ||
5 | -/** | ||
6 | - * Base class of {@link IdGenerator} implementations which use {@link IdBlockAllocator} as | ||
7 | - * backend. | ||
8 | - * | ||
9 | - * @param <T> the type of ID | ||
10 | - */ | ||
11 | -public abstract class AbstractBlockAllocatorBasedIdGenerator<T> implements IdGenerator<T> { | ||
12 | - protected final IdBlockAllocator allocator; | ||
13 | - protected IdBlock idBlock; | ||
14 | - | ||
15 | - /** | ||
16 | - * Constructs an ID generator which use {@link IdBlockAllocator} as backend. | ||
17 | - * | ||
18 | - * @param allocator | ||
19 | - */ | ||
20 | - protected AbstractBlockAllocatorBasedIdGenerator(IdBlockAllocator allocator) { | ||
21 | - this.allocator = allocator; | ||
22 | - this.idBlock = allocator.allocateUniqueIdBlock(); | ||
23 | - } | ||
24 | - | ||
25 | - @Override | ||
26 | - public synchronized T getNewId() { | ||
27 | - try { | ||
28 | - return convertFrom(idBlock.getNextId()); | ||
29 | - } catch (UnavailableIdException e) { | ||
30 | - idBlock = allocator.allocateUniqueIdBlock(); | ||
31 | - return convertFrom(idBlock.getNextId()); | ||
32 | - } | ||
33 | - } | ||
34 | - | ||
35 | - /** | ||
36 | - * Returns an ID instance of {@code T} type from the long value. | ||
37 | - * | ||
38 | - * @param value original long value | ||
39 | - * @return ID instance | ||
40 | - */ | ||
41 | - protected abstract T convertFrom(long value); | ||
42 | -} |
1 | -package org.onlab.onos.net.intent.impl; | ||
2 | - | ||
3 | -public class DummyIdBlockAllocator implements IdBlockAllocator { | ||
4 | - private long blockTop; | ||
5 | - private static final long BLOCK_SIZE = 0x1000000L; | ||
6 | - | ||
7 | - /** | ||
8 | - * Returns a block of IDs which are unique and unused. | ||
9 | - * Range of IDs is fixed size and is assigned incrementally as this method | ||
10 | - * called. | ||
11 | - * | ||
12 | - * @return an IdBlock containing a set of unique IDs | ||
13 | - */ | ||
14 | - @Override | ||
15 | - public IdBlock allocateUniqueIdBlock() { | ||
16 | - synchronized (this) { | ||
17 | - long blockHead = blockTop; | ||
18 | - long blockTail = blockTop + BLOCK_SIZE; | ||
19 | - | ||
20 | - IdBlock block = new IdBlock(blockHead, BLOCK_SIZE); | ||
21 | - blockTop = blockTail; | ||
22 | - | ||
23 | - return block; | ||
24 | - } | ||
25 | - } | ||
26 | - | ||
27 | - @Override | ||
28 | - public IdBlock allocateUniqueIdBlock(long range) { | ||
29 | - throw new UnsupportedOperationException("Not supported yet"); | ||
30 | - } | ||
31 | -} |
... | @@ -11,11 +11,9 @@ import org.onlab.onos.net.Path; | ... | @@ -11,11 +11,9 @@ import org.onlab.onos.net.Path; |
11 | import org.onlab.onos.net.flow.TrafficSelector; | 11 | import org.onlab.onos.net.flow.TrafficSelector; |
12 | import org.onlab.onos.net.host.HostService; | 12 | import org.onlab.onos.net.host.HostService; |
13 | import org.onlab.onos.net.intent.HostToHostIntent; | 13 | import org.onlab.onos.net.intent.HostToHostIntent; |
14 | -import org.onlab.onos.net.intent.IdGenerator; | ||
15 | import org.onlab.onos.net.intent.Intent; | 14 | import org.onlab.onos.net.intent.Intent; |
16 | import org.onlab.onos.net.intent.IntentCompiler; | 15 | import org.onlab.onos.net.intent.IntentCompiler; |
17 | import org.onlab.onos.net.intent.IntentExtensionService; | 16 | import org.onlab.onos.net.intent.IntentExtensionService; |
18 | -import org.onlab.onos.net.intent.IntentId; | ||
19 | import org.onlab.onos.net.intent.PathIntent; | 17 | import org.onlab.onos.net.intent.PathIntent; |
20 | import org.onlab.onos.net.topology.PathService; | 18 | import org.onlab.onos.net.topology.PathService; |
21 | 19 | ||
... | @@ -41,12 +39,8 @@ public class HostToHostIntentCompiler | ... | @@ -41,12 +39,8 @@ public class HostToHostIntentCompiler |
41 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 39 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
42 | protected HostService hostService; | 40 | protected HostService hostService; |
43 | 41 | ||
44 | - protected IdGenerator<IntentId> intentIdGenerator; | ||
45 | - | ||
46 | @Activate | 42 | @Activate |
47 | public void activate() { | 43 | public void activate() { |
48 | - IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
49 | - intentIdGenerator = new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
50 | intentManager.registerCompiler(HostToHostIntent.class, this); | 44 | intentManager.registerCompiler(HostToHostIntent.class, this); |
51 | } | 45 | } |
52 | 46 | ||
... | @@ -70,13 +64,10 @@ public class HostToHostIntentCompiler | ... | @@ -70,13 +64,10 @@ public class HostToHostIntentCompiler |
70 | // Creates a path intent from the specified path and original connectivity intent. | 64 | // Creates a path intent from the specified path and original connectivity intent. |
71 | private Intent createPathIntent(Path path, Host src, Host dst, | 65 | private Intent createPathIntent(Path path, Host src, Host dst, |
72 | HostToHostIntent intent) { | 66 | HostToHostIntent intent) { |
73 | - | ||
74 | TrafficSelector selector = builder(intent.selector()) | 67 | TrafficSelector selector = builder(intent.selector()) |
75 | .matchEthSrc(src.mac()).matchEthDst(dst.mac()).build(); | 68 | .matchEthSrc(src.mac()).matchEthDst(dst.mac()).build(); |
76 | - | 69 | + return new PathIntent(intent.appId(), selector, intent.treatment(), |
77 | - return new PathIntent(intentIdGenerator.getNewId(), | 70 | + path); |
78 | - selector, intent.treatment(), | ||
79 | - path.src(), path.dst(), path); | ||
80 | } | 71 | } |
81 | 72 | ||
82 | private Path getPath(HostId one, HostId two) { | 73 | private Path getPath(HostId one, HostId two) { | ... | ... |
1 | -package org.onlab.onos.net.intent.impl; | ||
2 | - | ||
3 | -import static com.google.common.base.Preconditions.checkArgument; | ||
4 | - | ||
5 | -import java.util.Objects; | ||
6 | -import java.util.concurrent.atomic.AtomicLong; | ||
7 | - | ||
8 | -import com.google.common.base.MoreObjects; | ||
9 | - | ||
10 | -/** | ||
11 | - * A class representing an ID space. | ||
12 | - */ | ||
13 | -public final class IdBlock { | ||
14 | - private final long start; | ||
15 | - private final long size; | ||
16 | - | ||
17 | - private final AtomicLong currentId; | ||
18 | - | ||
19 | - /** | ||
20 | - * Constructs a new ID block with the specified size and initial value. | ||
21 | - * | ||
22 | - * @param start initial value of the block | ||
23 | - * @param size size of the block | ||
24 | - * @throws IllegalArgumentException if the size is less than or equal to 0 | ||
25 | - */ | ||
26 | - public IdBlock(long start, long size) { | ||
27 | - checkArgument(size > 0, "size should be more than 0, but %s", size); | ||
28 | - | ||
29 | - this.start = start; | ||
30 | - this.size = size; | ||
31 | - | ||
32 | - this.currentId = new AtomicLong(start); | ||
33 | - } | ||
34 | - | ||
35 | - // TODO: consider if this method is needed or not | ||
36 | - /** | ||
37 | - * Returns the initial value. | ||
38 | - * | ||
39 | - * @return initial value | ||
40 | - */ | ||
41 | - public long getStart() { | ||
42 | - return start; | ||
43 | - } | ||
44 | - | ||
45 | - // TODO: consider if this method is needed or not | ||
46 | - /** | ||
47 | - * Returns the last value. | ||
48 | - * | ||
49 | - * @return last value | ||
50 | - */ | ||
51 | - public long getEnd() { | ||
52 | - return start + size - 1; | ||
53 | - } | ||
54 | - | ||
55 | - /** | ||
56 | - * Returns the block size. | ||
57 | - * | ||
58 | - * @return block size | ||
59 | - */ | ||
60 | - public long getSize() { | ||
61 | - return size; | ||
62 | - } | ||
63 | - | ||
64 | - /** | ||
65 | - * Returns the next ID in the block. | ||
66 | - * | ||
67 | - * @return next ID | ||
68 | - * @throws UnavailableIdException if there is no available ID in the block. | ||
69 | - */ | ||
70 | - public long getNextId() { | ||
71 | - final long id = currentId.getAndIncrement(); | ||
72 | - if (id > getEnd()) { | ||
73 | - throw new UnavailableIdException(String.format( | ||
74 | - "used all IDs in allocated space (size: %d, end: %d, current: %d)", | ||
75 | - size, getEnd(), id | ||
76 | - )); | ||
77 | - } | ||
78 | - | ||
79 | - return id; | ||
80 | - } | ||
81 | - | ||
82 | - // TODO: Do we really need equals and hashCode? Should it contain currentId? | ||
83 | - @Override | ||
84 | - public boolean equals(Object o) { | ||
85 | - if (this == o) { | ||
86 | - return true; | ||
87 | - } | ||
88 | - if (o == null || getClass() != o.getClass()) { | ||
89 | - return false; | ||
90 | - } | ||
91 | - | ||
92 | - IdBlock that = (IdBlock) o; | ||
93 | - return Objects.equals(this.start, that.start) | ||
94 | - && Objects.equals(this.size, that.size) | ||
95 | - && Objects.equals(this.currentId.get(), that.currentId.get()); | ||
96 | - } | ||
97 | - | ||
98 | - @Override | ||
99 | - public int hashCode() { | ||
100 | - return Objects.hash(start, size, currentId); | ||
101 | - } | ||
102 | - | ||
103 | - @Override | ||
104 | - public String toString() { | ||
105 | - return MoreObjects.toStringHelper(getClass()) | ||
106 | - .add("start", start) | ||
107 | - .add("size", size) | ||
108 | - .add("currentId", currentId) | ||
109 | - .toString(); | ||
110 | - } | ||
111 | -} |
1 | -package org.onlab.onos.net.intent.impl; | ||
2 | - | ||
3 | -/** | ||
4 | - * An interface that gives unique ID spaces. | ||
5 | - */ | ||
6 | -public interface IdBlockAllocator { | ||
7 | - /** | ||
8 | - * Allocates a unique Id Block. | ||
9 | - * | ||
10 | - * @return Id Block. | ||
11 | - */ | ||
12 | - IdBlock allocateUniqueIdBlock(); | ||
13 | - | ||
14 | - /** | ||
15 | - * Allocates next unique id and retrieve a new range of ids if needed. | ||
16 | - * | ||
17 | - * @param range range to use for the identifier | ||
18 | - * @return Id Block. | ||
19 | - */ | ||
20 | - IdBlock allocateUniqueIdBlock(long range); | ||
21 | -} |
1 | -package org.onlab.onos.net.intent.impl; | ||
2 | - | ||
3 | -import org.onlab.onos.net.intent.IntentId; | ||
4 | - | ||
5 | -/** | ||
6 | - * An implementation of {@link org.onlab.onos.net.intent.IdGenerator} of intent ID, | ||
7 | - * which uses {@link IdBlockAllocator}. | ||
8 | - */ | ||
9 | -public class IdBlockAllocatorBasedIntentIdGenerator extends AbstractBlockAllocatorBasedIdGenerator<IntentId> { | ||
10 | - | ||
11 | - /** | ||
12 | - * Constructs an intent ID generator, which uses the specified ID block allocator | ||
13 | - * to generate a global unique intent ID. | ||
14 | - * | ||
15 | - * @param allocator the ID block allocator to use for generating intent IDs | ||
16 | - */ | ||
17 | - public IdBlockAllocatorBasedIntentIdGenerator(IdBlockAllocator allocator) { | ||
18 | - super(allocator); | ||
19 | - } | ||
20 | - | ||
21 | - @Override | ||
22 | - protected IntentId convertFrom(long value) { | ||
23 | - return new IntentId(value); | ||
24 | - } | ||
25 | -} |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import static com.google.common.base.Preconditions.checkNotNull; | 3 | +import com.google.common.collect.ImmutableList; |
4 | -import static java.util.concurrent.Executors.newSingleThreadExecutor; | 4 | +import com.google.common.collect.ImmutableMap; |
5 | -import static org.onlab.onos.net.intent.IntentState.COMPILING; | 5 | +import com.google.common.collect.Lists; |
6 | -import static org.onlab.onos.net.intent.IntentState.FAILED; | ||
7 | -import static org.onlab.onos.net.intent.IntentState.INSTALLED; | ||
8 | -import static org.onlab.onos.net.intent.IntentState.INSTALLING; | ||
9 | -import static org.onlab.onos.net.intent.IntentState.RECOMPILING; | ||
10 | -import static org.onlab.onos.net.intent.IntentState.WITHDRAWING; | ||
11 | -import static org.onlab.onos.net.intent.IntentState.WITHDRAWN; | ||
12 | -import static org.onlab.util.Tools.namedThreads; | ||
13 | -import static org.slf4j.LoggerFactory.getLogger; | ||
14 | - | ||
15 | -import java.util.ArrayList; | ||
16 | -import java.util.Iterator; | ||
17 | -import java.util.List; | ||
18 | -import java.util.Map; | ||
19 | -import java.util.Objects; | ||
20 | -import java.util.concurrent.ConcurrentHashMap; | ||
21 | -import java.util.concurrent.ConcurrentMap; | ||
22 | -import java.util.concurrent.ExecutionException; | ||
23 | -import java.util.concurrent.ExecutorService; | ||
24 | -import java.util.concurrent.Future; | ||
25 | -import java.util.concurrent.TimeUnit; | ||
26 | -import java.util.concurrent.TimeoutException; | ||
27 | - | ||
28 | import org.apache.felix.scr.annotations.Activate; | 6 | import org.apache.felix.scr.annotations.Activate; |
29 | import org.apache.felix.scr.annotations.Component; | 7 | import org.apache.felix.scr.annotations.Component; |
30 | import org.apache.felix.scr.annotations.Deactivate; | 8 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -36,7 +14,6 @@ import org.onlab.onos.event.EventDeliveryService; | ... | @@ -36,7 +14,6 @@ import org.onlab.onos.event.EventDeliveryService; |
36 | import org.onlab.onos.net.flow.CompletedBatchOperation; | 14 | import org.onlab.onos.net.flow.CompletedBatchOperation; |
37 | import org.onlab.onos.net.flow.FlowRuleBatchOperation; | 15 | import org.onlab.onos.net.flow.FlowRuleBatchOperation; |
38 | import org.onlab.onos.net.flow.FlowRuleService; | 16 | import org.onlab.onos.net.flow.FlowRuleService; |
39 | -import org.onlab.onos.net.intent.InstallableIntent; | ||
40 | import org.onlab.onos.net.intent.Intent; | 17 | import org.onlab.onos.net.intent.Intent; |
41 | import org.onlab.onos.net.intent.IntentCompiler; | 18 | import org.onlab.onos.net.intent.IntentCompiler; |
42 | import org.onlab.onos.net.intent.IntentEvent; | 19 | import org.onlab.onos.net.intent.IntentEvent; |
... | @@ -52,9 +29,24 @@ import org.onlab.onos.net.intent.IntentStore; | ... | @@ -52,9 +29,24 @@ import org.onlab.onos.net.intent.IntentStore; |
52 | import org.onlab.onos.net.intent.IntentStoreDelegate; | 29 | import org.onlab.onos.net.intent.IntentStoreDelegate; |
53 | import org.slf4j.Logger; | 30 | import org.slf4j.Logger; |
54 | 31 | ||
55 | -import com.google.common.collect.ImmutableList; | 32 | +import java.util.ArrayList; |
56 | -import com.google.common.collect.ImmutableMap; | 33 | +import java.util.Iterator; |
57 | -import com.google.common.collect.Lists; | 34 | +import java.util.List; |
35 | +import java.util.Map; | ||
36 | +import java.util.Objects; | ||
37 | +import java.util.concurrent.ConcurrentHashMap; | ||
38 | +import java.util.concurrent.ConcurrentMap; | ||
39 | +import java.util.concurrent.ExecutionException; | ||
40 | +import java.util.concurrent.ExecutorService; | ||
41 | +import java.util.concurrent.Future; | ||
42 | +import java.util.concurrent.TimeUnit; | ||
43 | +import java.util.concurrent.TimeoutException; | ||
44 | + | ||
45 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
46 | +import static java.util.concurrent.Executors.newSingleThreadExecutor; | ||
47 | +import static org.onlab.onos.net.intent.IntentState.*; | ||
48 | +import static org.onlab.util.Tools.namedThreads; | ||
49 | +import static org.slf4j.LoggerFactory.getLogger; | ||
58 | 50 | ||
59 | /** | 51 | /** |
60 | * An implementation of Intent Manager. | 52 | * An implementation of Intent Manager. |
... | @@ -71,8 +63,8 @@ public class IntentManager | ... | @@ -71,8 +63,8 @@ public class IntentManager |
71 | // Collections for compiler, installer, and listener are ONOS instance local | 63 | // Collections for compiler, installer, and listener are ONOS instance local |
72 | private final ConcurrentMap<Class<? extends Intent>, | 64 | private final ConcurrentMap<Class<? extends Intent>, |
73 | IntentCompiler<? extends Intent>> compilers = new ConcurrentHashMap<>(); | 65 | IntentCompiler<? extends Intent>> compilers = new ConcurrentHashMap<>(); |
74 | - private final ConcurrentMap<Class<? extends InstallableIntent>, | 66 | + private final ConcurrentMap<Class<? extends Intent>, |
75 | - IntentInstaller<? extends InstallableIntent>> installers = new ConcurrentHashMap<>(); | 67 | + IntentInstaller<? extends Intent>> installers = new ConcurrentHashMap<>(); |
76 | 68 | ||
77 | private final AbstractListenerRegistry<IntentEvent, IntentListener> | 69 | private final AbstractListenerRegistry<IntentEvent, IntentListener> |
78 | listenerRegistry = new AbstractListenerRegistry<>(); | 70 | listenerRegistry = new AbstractListenerRegistry<>(); |
... | @@ -186,17 +178,17 @@ public class IntentManager | ... | @@ -186,17 +178,17 @@ public class IntentManager |
186 | } | 178 | } |
187 | 179 | ||
188 | @Override | 180 | @Override |
189 | - public <T extends InstallableIntent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer) { | 181 | + public <T extends Intent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer) { |
190 | installers.put(cls, installer); | 182 | installers.put(cls, installer); |
191 | } | 183 | } |
192 | 184 | ||
193 | @Override | 185 | @Override |
194 | - public <T extends InstallableIntent> void unregisterInstaller(Class<T> cls) { | 186 | + public <T extends Intent> void unregisterInstaller(Class<T> cls) { |
195 | installers.remove(cls); | 187 | installers.remove(cls); |
196 | } | 188 | } |
197 | 189 | ||
198 | @Override | 190 | @Override |
199 | - public Map<Class<? extends InstallableIntent>, IntentInstaller<? extends InstallableIntent>> getInstallers() { | 191 | + public Map<Class<? extends Intent>, IntentInstaller<? extends Intent>> getInstallers() { |
200 | return ImmutableMap.copyOf(installers); | 192 | return ImmutableMap.copyOf(installers); |
201 | } | 193 | } |
202 | 194 | ||
... | @@ -223,7 +215,7 @@ public class IntentManager | ... | @@ -223,7 +215,7 @@ public class IntentManager |
223 | * @param <T> the type of installable intent | 215 | * @param <T> the type of installable intent |
224 | * @return intent installer corresponding to the specified installable intent | 216 | * @return intent installer corresponding to the specified installable intent |
225 | */ | 217 | */ |
226 | - private <T extends InstallableIntent> IntentInstaller<T> getInstaller(T intent) { | 218 | + private <T extends Intent> IntentInstaller<T> getInstaller(T intent) { |
227 | @SuppressWarnings("unchecked") | 219 | @SuppressWarnings("unchecked") |
228 | IntentInstaller<T> installer = (IntentInstaller<T>) installers.get(intent.getClass()); | 220 | IntentInstaller<T> installer = (IntentInstaller<T>) installers.get(intent.getClass()); |
229 | if (installer == null) { | 221 | if (installer == null) { |
... | @@ -243,7 +235,7 @@ public class IntentManager | ... | @@ -243,7 +235,7 @@ public class IntentManager |
243 | 235 | ||
244 | try { | 236 | try { |
245 | // Compile the intent into installable derivatives. | 237 | // Compile the intent into installable derivatives. |
246 | - List<InstallableIntent> installable = compileIntent(intent); | 238 | + List<Intent> installable = compileIntent(intent); |
247 | 239 | ||
248 | // If all went well, associate the resulting list of installable | 240 | // If all went well, associate the resulting list of installable |
249 | // intents with the top-level intent and proceed to install. | 241 | // intents with the top-level intent and proceed to install. |
... | @@ -264,12 +256,12 @@ public class IntentManager | ... | @@ -264,12 +256,12 @@ public class IntentManager |
264 | * @param intent intent | 256 | * @param intent intent |
265 | * @return result of compilation | 257 | * @return result of compilation |
266 | */ | 258 | */ |
267 | - private List<InstallableIntent> compileIntent(Intent intent) { | 259 | + private List<Intent> compileIntent(Intent intent) { |
268 | - if (intent instanceof InstallableIntent) { | 260 | + if (intent.isInstallable()) { |
269 | - return ImmutableList.of((InstallableIntent) intent); | 261 | + return ImmutableList.of(intent); |
270 | } | 262 | } |
271 | 263 | ||
272 | - List<InstallableIntent> installable = new ArrayList<>(); | 264 | + List<Intent> installable = new ArrayList<>(); |
273 | // TODO do we need to registerSubclassCompiler? | 265 | // TODO do we need to registerSubclassCompiler? |
274 | for (Intent compiled : getCompiler(intent).compile(intent)) { | 266 | for (Intent compiled : getCompiler(intent).compile(intent)) { |
275 | installable.addAll(compileIntent(compiled)); | 267 | installable.addAll(compileIntent(compiled)); |
... | @@ -290,12 +282,12 @@ public class IntentManager | ... | @@ -290,12 +282,12 @@ public class IntentManager |
290 | 282 | ||
291 | List<FlowRuleBatchOperation> installWork = Lists.newArrayList(); | 283 | List<FlowRuleBatchOperation> installWork = Lists.newArrayList(); |
292 | try { | 284 | try { |
293 | - List<InstallableIntent> installables = store.getInstallableIntents(intent.id()); | 285 | + List<Intent> installables = store.getInstallableIntents(intent.id()); |
294 | if (installables != null) { | 286 | if (installables != null) { |
295 | - for (InstallableIntent installable : installables) { | 287 | + for (Intent installable : installables) { |
296 | registerSubclassInstallerIfNeeded(installable); | 288 | registerSubclassInstallerIfNeeded(installable); |
297 | trackerService.addTrackedResources(intent.id(), | 289 | trackerService.addTrackedResources(intent.id(), |
298 | - installable.requiredLinks()); | 290 | + installable.resources()); |
299 | List<FlowRuleBatchOperation> batch = getInstaller(installable).install(installable); | 291 | List<FlowRuleBatchOperation> batch = getInstaller(installable).install(installable); |
300 | installWork.addAll(batch); | 292 | installWork.addAll(batch); |
301 | } | 293 | } |
... | @@ -324,14 +316,13 @@ public class IntentManager | ... | @@ -324,14 +316,13 @@ public class IntentManager |
324 | 316 | ||
325 | try { | 317 | try { |
326 | // Compile the intent into installable derivatives. | 318 | // Compile the intent into installable derivatives. |
327 | - List<InstallableIntent> installable = compileIntent(intent); | 319 | + List<Intent> installable = compileIntent(intent); |
328 | 320 | ||
329 | // If all went well, compare the existing list of installable | 321 | // If all went well, compare the existing list of installable |
330 | // intents with the newly compiled list. If they are the same, | 322 | // intents with the newly compiled list. If they are the same, |
331 | // bail, out since the previous approach was determined not to | 323 | // bail, out since the previous approach was determined not to |
332 | // be viable. | 324 | // be viable. |
333 | - List<InstallableIntent> originalInstallable = | 325 | + List<Intent> originalInstallable = store.getInstallableIntents(intent.id()); |
334 | - store.getInstallableIntents(intent.id()); | ||
335 | 326 | ||
336 | if (Objects.equals(originalInstallable, installable)) { | 327 | if (Objects.equals(originalInstallable, installable)) { |
337 | eventDispatcher.post(store.setState(intent, FAILED)); | 328 | eventDispatcher.post(store.setState(intent, FAILED)); |
... | @@ -376,9 +367,9 @@ public class IntentManager | ... | @@ -376,9 +367,9 @@ public class IntentManager |
376 | private void uninstallIntent(Intent intent, IntentState nextState) { | 367 | private void uninstallIntent(Intent intent, IntentState nextState) { |
377 | List<FlowRuleBatchOperation> uninstallWork = Lists.newArrayList(); | 368 | List<FlowRuleBatchOperation> uninstallWork = Lists.newArrayList(); |
378 | try { | 369 | try { |
379 | - List<InstallableIntent> installables = store.getInstallableIntents(intent.id()); | 370 | + List<Intent> installables = store.getInstallableIntents(intent.id()); |
380 | if (installables != null) { | 371 | if (installables != null) { |
381 | - for (InstallableIntent installable : installables) { | 372 | + for (Intent installable : installables) { |
382 | List<FlowRuleBatchOperation> batches = getInstaller(installable).uninstall(installable); | 373 | List<FlowRuleBatchOperation> batches = getInstaller(installable).uninstall(installable); |
383 | uninstallWork.addAll(batches); | 374 | uninstallWork.addAll(batches); |
384 | } | 375 | } |
... | @@ -422,12 +413,12 @@ public class IntentManager | ... | @@ -422,12 +413,12 @@ public class IntentManager |
422 | * | 413 | * |
423 | * @param intent intent | 414 | * @param intent intent |
424 | */ | 415 | */ |
425 | - private void registerSubclassInstallerIfNeeded(InstallableIntent intent) { | 416 | + private void registerSubclassInstallerIfNeeded(Intent intent) { |
426 | if (!installers.containsKey(intent.getClass())) { | 417 | if (!installers.containsKey(intent.getClass())) { |
427 | Class<?> cls = intent.getClass(); | 418 | Class<?> cls = intent.getClass(); |
428 | while (cls != Object.class) { | 419 | while (cls != Object.class) { |
429 | - // As long as we're within the InstallableIntent class descendants | 420 | + // As long as we're within the Intent class descendants |
430 | - if (InstallableIntent.class.isAssignableFrom(cls)) { | 421 | + if (Intent.class.isAssignableFrom(cls)) { |
431 | IntentInstaller<?> installer = installers.get(cls); | 422 | IntentInstaller<?> installer = installers.get(cls); |
432 | if (installer != null) { | 423 | if (installer != null) { |
433 | installers.put(intent.getClass(), installer); | 424 | installers.put(intent.getClass(), installer); |
... | @@ -531,9 +522,7 @@ public class IntentManager | ... | @@ -531,9 +522,7 @@ public class IntentManager |
531 | } | 522 | } |
532 | 523 | ||
533 | /** | 524 | /** |
534 | - * Apply a list of FlowRules. | 525 | + * Applies the next batch. |
535 | - * | ||
536 | - * @param rules rules to apply | ||
537 | */ | 526 | */ |
538 | private Future<CompletedBatchOperation> applyNextBatch() { | 527 | private Future<CompletedBatchOperation> applyNextBatch() { |
539 | if (work.isEmpty()) { | 528 | if (work.isEmpty()) { | ... | ... |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import java.util.Arrays; | ||
4 | -import java.util.HashSet; | ||
5 | -import java.util.List; | ||
6 | -import java.util.Set; | ||
7 | - | ||
8 | import org.apache.felix.scr.annotations.Activate; | 3 | import org.apache.felix.scr.annotations.Activate; |
9 | import org.apache.felix.scr.annotations.Component; | 4 | import org.apache.felix.scr.annotations.Component; |
10 | import org.apache.felix.scr.annotations.Deactivate; | 5 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -13,16 +8,19 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; | ... | @@ -13,16 +8,19 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; |
13 | import org.onlab.onos.net.ConnectPoint; | 8 | import org.onlab.onos.net.ConnectPoint; |
14 | import org.onlab.onos.net.Link; | 9 | import org.onlab.onos.net.Link; |
15 | import org.onlab.onos.net.Path; | 10 | import org.onlab.onos.net.Path; |
16 | -import org.onlab.onos.net.intent.IdGenerator; | ||
17 | import org.onlab.onos.net.intent.Intent; | 11 | import org.onlab.onos.net.intent.Intent; |
18 | import org.onlab.onos.net.intent.IntentCompiler; | 12 | import org.onlab.onos.net.intent.IntentCompiler; |
19 | import org.onlab.onos.net.intent.IntentExtensionService; | 13 | import org.onlab.onos.net.intent.IntentExtensionService; |
20 | -import org.onlab.onos.net.intent.IntentId; | ||
21 | import org.onlab.onos.net.intent.LinkCollectionIntent; | 14 | import org.onlab.onos.net.intent.LinkCollectionIntent; |
22 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | 15 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; |
23 | import org.onlab.onos.net.intent.PointToPointIntent; | 16 | import org.onlab.onos.net.intent.PointToPointIntent; |
24 | import org.onlab.onos.net.topology.PathService; | 17 | import org.onlab.onos.net.topology.PathService; |
25 | 18 | ||
19 | +import java.util.Arrays; | ||
20 | +import java.util.HashSet; | ||
21 | +import java.util.List; | ||
22 | +import java.util.Set; | ||
23 | + | ||
26 | /** | 24 | /** |
27 | * An intent compiler for | 25 | * An intent compiler for |
28 | * {@link org.onlab.onos.net.intent.MultiPointToSinglePointIntent}. | 26 | * {@link org.onlab.onos.net.intent.MultiPointToSinglePointIntent}. |
... | @@ -37,12 +35,8 @@ public class MultiPointToSinglePointIntentCompiler | ... | @@ -37,12 +35,8 @@ public class MultiPointToSinglePointIntentCompiler |
37 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 35 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
38 | protected PathService pathService; | 36 | protected PathService pathService; |
39 | 37 | ||
40 | - protected IdGenerator<IntentId> intentIdGenerator; | ||
41 | - | ||
42 | @Activate | 38 | @Activate |
43 | public void activate() { | 39 | public void activate() { |
44 | - IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
45 | - intentIdGenerator = new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
46 | intentManager.registerCompiler(MultiPointToSinglePointIntent.class, this); | 40 | intentManager.registerCompiler(MultiPointToSinglePointIntent.class, this); |
47 | } | 41 | } |
48 | 42 | ||
... | @@ -60,7 +54,7 @@ public class MultiPointToSinglePointIntentCompiler | ... | @@ -60,7 +54,7 @@ public class MultiPointToSinglePointIntentCompiler |
60 | links.addAll(path.links()); | 54 | links.addAll(path.links()); |
61 | } | 55 | } |
62 | 56 | ||
63 | - Intent result = new LinkCollectionIntent(intentIdGenerator.getNewId(), | 57 | + Intent result = new LinkCollectionIntent(intent.appId(), |
64 | intent.selector(), intent.treatment(), | 58 | intent.selector(), intent.treatment(), |
65 | links, intent.egressPoint()); | 59 | links, intent.egressPoint()); |
66 | return Arrays.asList(result); | 60 | return Arrays.asList(result); | ... | ... |
... | @@ -11,6 +11,7 @@ import org.apache.felix.scr.annotations.Service; | ... | @@ -11,6 +11,7 @@ import org.apache.felix.scr.annotations.Service; |
11 | import org.onlab.onos.event.Event; | 11 | import org.onlab.onos.event.Event; |
12 | import org.onlab.onos.net.Link; | 12 | import org.onlab.onos.net.Link; |
13 | import org.onlab.onos.net.LinkKey; | 13 | import org.onlab.onos.net.LinkKey; |
14 | +import org.onlab.onos.net.NetworkResource; | ||
14 | import org.onlab.onos.net.intent.IntentId; | 15 | import org.onlab.onos.net.intent.IntentId; |
15 | import org.onlab.onos.net.link.LinkEvent; | 16 | import org.onlab.onos.net.link.LinkEvent; |
16 | import org.onlab.onos.net.topology.TopologyEvent; | 17 | import org.onlab.onos.net.topology.TopologyEvent; |
... | @@ -27,8 +28,8 @@ import static com.google.common.base.Preconditions.checkArgument; | ... | @@ -27,8 +28,8 @@ import static com.google.common.base.Preconditions.checkArgument; |
27 | import static com.google.common.base.Preconditions.checkNotNull; | 28 | import static com.google.common.base.Preconditions.checkNotNull; |
28 | import static com.google.common.collect.Multimaps.synchronizedSetMultimap; | 29 | import static com.google.common.collect.Multimaps.synchronizedSetMultimap; |
29 | import static java.util.concurrent.Executors.newSingleThreadExecutor; | 30 | import static java.util.concurrent.Executors.newSingleThreadExecutor; |
30 | -import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED; | ||
31 | import static org.onlab.onos.net.LinkKey.linkKey; | 31 | import static org.onlab.onos.net.LinkKey.linkKey; |
32 | +import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED; | ||
32 | import static org.onlab.util.Tools.namedThreads; | 33 | import static org.onlab.util.Tools.namedThreads; |
33 | import static org.slf4j.LoggerFactory.getLogger; | 34 | import static org.slf4j.LoggerFactory.getLogger; |
34 | 35 | ||
... | @@ -81,16 +82,22 @@ public class ObjectiveTracker implements ObjectiveTrackerService { | ... | @@ -81,16 +82,22 @@ public class ObjectiveTracker implements ObjectiveTrackerService { |
81 | } | 82 | } |
82 | 83 | ||
83 | @Override | 84 | @Override |
84 | - public void addTrackedResources(IntentId intentId, Collection<Link> resources) { | 85 | + public void addTrackedResources(IntentId intentId, |
85 | - for (Link link : resources) { | 86 | + Collection<NetworkResource> resources) { |
86 | - intentsByLink.put(linkKey(link), intentId); | 87 | + for (NetworkResource resource : resources) { |
88 | + if (resource instanceof Link) { | ||
89 | + intentsByLink.put(linkKey((Link) resource), intentId); | ||
90 | + } | ||
87 | } | 91 | } |
88 | } | 92 | } |
89 | 93 | ||
90 | @Override | 94 | @Override |
91 | - public void removeTrackedResources(IntentId intentId, Collection<Link> resources) { | 95 | + public void removeTrackedResources(IntentId intentId, |
92 | - for (Link link : resources) { | 96 | + Collection<NetworkResource> resources) { |
93 | - intentsByLink.remove(linkKey(link), intentId); | 97 | + for (NetworkResource resource : resources) { |
98 | + if (resource instanceof Link) { | ||
99 | + intentsByLink.remove(linkKey((Link) resource), intentId); | ||
100 | + } | ||
94 | } | 101 | } |
95 | } | 102 | } |
96 | 103 | ... | ... |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import org.onlab.onos.net.Link; | 3 | +import org.onlab.onos.net.NetworkResource; |
4 | import org.onlab.onos.net.intent.IntentId; | 4 | import org.onlab.onos.net.intent.IntentId; |
5 | 5 | ||
6 | import java.util.Collection; | 6 | import java.util.Collection; |
... | @@ -31,7 +31,8 @@ public interface ObjectiveTrackerService { | ... | @@ -31,7 +31,8 @@ public interface ObjectiveTrackerService { |
31 | * @param intentId intent identity on whose behalf the path is being tracked | 31 | * @param intentId intent identity on whose behalf the path is being tracked |
32 | * @param resources resources to track | 32 | * @param resources resources to track |
33 | */ | 33 | */ |
34 | - public void addTrackedResources(IntentId intentId, Collection<Link> resources); | 34 | + public void addTrackedResources(IntentId intentId, |
35 | + Collection<NetworkResource> resources); | ||
35 | 36 | ||
36 | /** | 37 | /** |
37 | * Removes a path flow to be tracked. | 38 | * Removes a path flow to be tracked. |
... | @@ -39,6 +40,7 @@ public interface ObjectiveTrackerService { | ... | @@ -39,6 +40,7 @@ public interface ObjectiveTrackerService { |
39 | * @param intentId intent identity on whose behalf the path is being tracked | 40 | * @param intentId intent identity on whose behalf the path is being tracked |
40 | * @param resources resources to stop tracking | 41 | * @param resources resources to stop tracking |
41 | */ | 42 | */ |
42 | - public void removeTrackedResources(IntentId intentId, Collection<Link> resources); | 43 | + public void removeTrackedResources(IntentId intentId, |
44 | + Collection<NetworkResource> resources); | ||
43 | 45 | ||
44 | } | 46 | } | ... | ... |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import java.util.ArrayList; | ||
4 | -import java.util.Arrays; | ||
5 | -import java.util.List; | ||
6 | -import java.util.Set; | ||
7 | - | ||
8 | import org.apache.felix.scr.annotations.Activate; | 3 | import org.apache.felix.scr.annotations.Activate; |
9 | import org.apache.felix.scr.annotations.Component; | 4 | import org.apache.felix.scr.annotations.Component; |
10 | import org.apache.felix.scr.annotations.Deactivate; | 5 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -16,16 +11,19 @@ import org.onlab.onos.net.DefaultPath; | ... | @@ -16,16 +11,19 @@ import org.onlab.onos.net.DefaultPath; |
16 | import org.onlab.onos.net.Link; | 11 | import org.onlab.onos.net.Link; |
17 | import org.onlab.onos.net.Path; | 12 | import org.onlab.onos.net.Path; |
18 | import org.onlab.onos.net.host.HostService; | 13 | import org.onlab.onos.net.host.HostService; |
19 | -import org.onlab.onos.net.intent.IdGenerator; | ||
20 | import org.onlab.onos.net.intent.Intent; | 14 | import org.onlab.onos.net.intent.Intent; |
21 | import org.onlab.onos.net.intent.IntentCompiler; | 15 | import org.onlab.onos.net.intent.IntentCompiler; |
22 | import org.onlab.onos.net.intent.IntentExtensionService; | 16 | import org.onlab.onos.net.intent.IntentExtensionService; |
23 | -import org.onlab.onos.net.intent.IntentId; | ||
24 | import org.onlab.onos.net.intent.PathIntent; | 17 | import org.onlab.onos.net.intent.PathIntent; |
25 | import org.onlab.onos.net.intent.PointToPointIntent; | 18 | import org.onlab.onos.net.intent.PointToPointIntent; |
26 | import org.onlab.onos.net.provider.ProviderId; | 19 | import org.onlab.onos.net.provider.ProviderId; |
27 | import org.onlab.onos.net.topology.PathService; | 20 | import org.onlab.onos.net.topology.PathService; |
28 | 21 | ||
22 | +import java.util.ArrayList; | ||
23 | +import java.util.Arrays; | ||
24 | +import java.util.List; | ||
25 | +import java.util.Set; | ||
26 | + | ||
29 | /** | 27 | /** |
30 | * A intent compiler for {@link org.onlab.onos.net.intent.HostToHostIntent}. | 28 | * A intent compiler for {@link org.onlab.onos.net.intent.HostToHostIntent}. |
31 | */ | 29 | */ |
... | @@ -43,12 +41,8 @@ public class PointToPointIntentCompiler | ... | @@ -43,12 +41,8 @@ public class PointToPointIntentCompiler |
43 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 41 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
44 | protected HostService hostService; | 42 | protected HostService hostService; |
45 | 43 | ||
46 | - protected IdGenerator<IntentId> intentIdGenerator; | ||
47 | - | ||
48 | @Activate | 44 | @Activate |
49 | public void activate() { | 45 | public void activate() { |
50 | - IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
51 | - intentIdGenerator = new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
52 | intentManager.registerCompiler(PointToPointIntent.class, this); | 46 | intentManager.registerCompiler(PointToPointIntent.class, this); |
53 | } | 47 | } |
54 | 48 | ||
... | @@ -80,10 +74,8 @@ public class PointToPointIntentCompiler | ... | @@ -80,10 +74,8 @@ public class PointToPointIntentCompiler |
80 | */ | 74 | */ |
81 | private Intent createPathIntent(Path path, | 75 | private Intent createPathIntent(Path path, |
82 | PointToPointIntent intent) { | 76 | PointToPointIntent intent) { |
83 | - | 77 | + return new PathIntent(intent.appId(), |
84 | - return new PathIntent(intentIdGenerator.getNewId(), | 78 | + intent.selector(), intent.treatment(), path); |
85 | - intent.selector(), intent.treatment(), | ||
86 | - path.src(), path.dst(), path); | ||
87 | } | 79 | } |
88 | 80 | ||
89 | /** | 81 | /** | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import org.junit.Test; | 3 | import org.junit.Test; |
4 | +import org.onlab.onos.ApplicationId; | ||
5 | +import org.onlab.onos.TestApplicationId; | ||
4 | import org.onlab.onos.net.HostId; | 6 | import org.onlab.onos.net.HostId; |
5 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
6 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
... | @@ -16,15 +18,13 @@ import static org.onlab.onos.net.NetTestTools.hid; | ... | @@ -16,15 +18,13 @@ import static org.onlab.onos.net.NetTestTools.hid; |
16 | */ | 18 | */ |
17 | public class TestHostToHostIntent { | 19 | public class TestHostToHostIntent { |
18 | 20 | ||
21 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
22 | + | ||
19 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | 23 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); |
20 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | 24 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); |
21 | 25 | ||
22 | - private HostToHostIntent makeHostToHost(long id, HostId one, HostId two) { | 26 | + private HostToHostIntent makeHostToHost(HostId one, HostId two) { |
23 | - return new HostToHostIntent(new IntentId(id), | 27 | + return new HostToHostIntent(APPID, one, two, selector, treatment); |
24 | - one, | ||
25 | - two, | ||
26 | - selector, | ||
27 | - treatment); | ||
28 | } | 28 | } |
29 | 29 | ||
30 | /** | 30 | /** |
... | @@ -36,8 +36,8 @@ public class TestHostToHostIntent { | ... | @@ -36,8 +36,8 @@ public class TestHostToHostIntent { |
36 | 36 | ||
37 | HostId one = hid("00:00:00:00:00:01/-1"); | 37 | HostId one = hid("00:00:00:00:00:01/-1"); |
38 | HostId two = hid("00:00:00:00:00:02/-1"); | 38 | HostId two = hid("00:00:00:00:00:02/-1"); |
39 | - HostToHostIntent i1 = makeHostToHost(12, one, two); | 39 | + HostToHostIntent i1 = makeHostToHost(one, two); |
40 | - HostToHostIntent i2 = makeHostToHost(12, one, two); | 40 | + HostToHostIntent i2 = makeHostToHost(one, two); |
41 | 41 | ||
42 | assertThat(i1, is(equalTo(i2))); | 42 | assertThat(i1, is(equalTo(i2))); |
43 | } | 43 | } |
... | @@ -47,42 +47,39 @@ public class TestHostToHostIntent { | ... | @@ -47,42 +47,39 @@ public class TestHostToHostIntent { |
47 | * to different Hosts. These should compare not equal. | 47 | * to different Hosts. These should compare not equal. |
48 | */ | 48 | */ |
49 | @Test | 49 | @Test |
50 | - public void testLinksDifferentEquals() { | 50 | + public void testSameEquals2() { |
51 | - | ||
52 | HostId one = hid("00:00:00:00:00:01/-1"); | 51 | HostId one = hid("00:00:00:00:00:01/-1"); |
53 | HostId two = hid("00:00:00:00:00:02/-1"); | 52 | HostId two = hid("00:00:00:00:00:02/-1"); |
54 | - HostToHostIntent i1 = makeHostToHost(12, one, two); | 53 | + HostToHostIntent i1 = makeHostToHost(one, two); |
55 | - HostToHostIntent i2 = makeHostToHost(12, two, one); | 54 | + HostToHostIntent i2 = makeHostToHost(two, one); |
56 | 55 | ||
57 | - assertThat(i1, is(not(equalTo(i2)))); | 56 | + assertThat(i1, is(equalTo(i2))); |
58 | } | 57 | } |
59 | 58 | ||
60 | /** | 59 | /** |
61 | - * Tests the equals() method where two HostToHostIntents have different | 60 | + * Tests that the hashCode() values for two equivalent HostToHostIntent |
62 | - * ids. These should compare not equal. | 61 | + * objects are the same. |
63 | */ | 62 | */ |
64 | - | ||
65 | @Test | 63 | @Test |
66 | - public void testBaseDifferentEquals() { | 64 | + public void testHashCodeEquals() { |
67 | HostId one = hid("00:00:00:00:00:01/-1"); | 65 | HostId one = hid("00:00:00:00:00:01/-1"); |
68 | HostId two = hid("00:00:00:00:00:02/-1"); | 66 | HostId two = hid("00:00:00:00:00:02/-1"); |
69 | - HostToHostIntent i1 = makeHostToHost(12, one, two); | 67 | + HostToHostIntent i1 = makeHostToHost(one, two); |
70 | - HostToHostIntent i2 = makeHostToHost(11, one, two); | 68 | + HostToHostIntent i2 = makeHostToHost(one, two); |
71 | 69 | ||
72 | - assertThat(i1, is(not(equalTo(i2)))); | 70 | + assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); |
73 | } | 71 | } |
74 | 72 | ||
75 | /** | 73 | /** |
76 | - * Tests that the hashCode() values for two equivalent HostToHostIntent | 74 | + * Tests that the hashCode() values for two distinct LinkCollectionIntent |
77 | - * objects are the same. | 75 | + * objects are different. |
78 | */ | 76 | */ |
79 | - | ||
80 | @Test | 77 | @Test |
81 | - public void testHashCodeEquals() { | 78 | + public void testHashCodeEquals2() { |
82 | HostId one = hid("00:00:00:00:00:01/-1"); | 79 | HostId one = hid("00:00:00:00:00:01/-1"); |
83 | HostId two = hid("00:00:00:00:00:02/-1"); | 80 | HostId two = hid("00:00:00:00:00:02/-1"); |
84 | - HostToHostIntent i1 = makeHostToHost(12, one, two); | 81 | + HostToHostIntent i1 = makeHostToHost(one, two); |
85 | - HostToHostIntent i2 = makeHostToHost(12, one, two); | 82 | + HostToHostIntent i2 = makeHostToHost(two, one); |
86 | 83 | ||
87 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | 84 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); |
88 | } | 85 | } |
... | @@ -91,13 +88,13 @@ public class TestHostToHostIntent { | ... | @@ -91,13 +88,13 @@ public class TestHostToHostIntent { |
91 | * Tests that the hashCode() values for two distinct LinkCollectionIntent | 88 | * Tests that the hashCode() values for two distinct LinkCollectionIntent |
92 | * objects are different. | 89 | * objects are different. |
93 | */ | 90 | */ |
94 | - | ||
95 | @Test | 91 | @Test |
96 | public void testHashCodeDifferent() { | 92 | public void testHashCodeDifferent() { |
97 | HostId one = hid("00:00:00:00:00:01/-1"); | 93 | HostId one = hid("00:00:00:00:00:01/-1"); |
98 | HostId two = hid("00:00:00:00:00:02/-1"); | 94 | HostId two = hid("00:00:00:00:00:02/-1"); |
99 | - HostToHostIntent i1 = makeHostToHost(12, one, two); | 95 | + HostId three = hid("00:00:00:00:00:32/-1"); |
100 | - HostToHostIntent i2 = makeHostToHost(112, one, two); | 96 | + HostToHostIntent i1 = makeHostToHost(one, two); |
97 | + HostToHostIntent i2 = makeHostToHost(one, three); | ||
101 | 98 | ||
102 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | 99 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); |
103 | } | 100 | } | ... | ... |
... | @@ -11,6 +11,8 @@ import java.util.Set; | ... | @@ -11,6 +11,8 @@ import java.util.Set; |
11 | 11 | ||
12 | import org.junit.Before; | 12 | import org.junit.Before; |
13 | import org.junit.Test; | 13 | import org.junit.Test; |
14 | +import org.onlab.onos.ApplicationId; | ||
15 | +import org.onlab.onos.TestApplicationId; | ||
14 | import org.onlab.onos.net.ConnectPoint; | 16 | import org.onlab.onos.net.ConnectPoint; |
15 | import org.onlab.onos.net.DeviceId; | 17 | import org.onlab.onos.net.DeviceId; |
16 | import org.onlab.onos.net.Link; | 18 | import org.onlab.onos.net.Link; |
... | @@ -23,6 +25,8 @@ import org.onlab.onos.net.flow.TrafficTreatment; | ... | @@ -23,6 +25,8 @@ import org.onlab.onos.net.flow.TrafficTreatment; |
23 | */ | 25 | */ |
24 | public class TestLinkCollectionIntent { | 26 | public class TestLinkCollectionIntent { |
25 | 27 | ||
28 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
29 | + | ||
26 | private Link link1 = link("dev1", 1, "dev2", 2); | 30 | private Link link1 = link("dev1", 1, "dev2", 2); |
27 | private Link link2 = link("dev1", 1, "dev3", 2); | 31 | private Link link2 = link("dev1", 1, "dev3", 2); |
28 | private Link link3 = link("dev2", 1, "dev3", 2); | 32 | private Link link3 = link("dev2", 1, "dev3", 2); |
... | @@ -38,10 +42,9 @@ public class TestLinkCollectionIntent { | ... | @@ -38,10 +42,9 @@ public class TestLinkCollectionIntent { |
38 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | 42 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); |
39 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | 43 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); |
40 | 44 | ||
41 | - private LinkCollectionIntent makeLinkCollection(long id, Set<Link> links, | 45 | + private LinkCollectionIntent makeLinkCollection(Set<Link> links, |
42 | ConnectPoint egress) { | 46 | ConnectPoint egress) { |
43 | - return new LinkCollectionIntent(new IntentId(id), | 47 | + return new LinkCollectionIntent(APPID, selector, treatment, links, egress); |
44 | - selector, treatment, links, egress); | ||
45 | } | 48 | } |
46 | 49 | ||
47 | @Before | 50 | @Before |
... | @@ -64,8 +67,8 @@ public class TestLinkCollectionIntent { | ... | @@ -64,8 +67,8 @@ public class TestLinkCollectionIntent { |
64 | links2.add(link2); | 67 | links2.add(link2); |
65 | links2.add(link1); | 68 | links2.add(link1); |
66 | 69 | ||
67 | - LinkCollectionIntent i1 = makeLinkCollection(12, links1, egress1); | 70 | + LinkCollectionIntent i1 = makeLinkCollection(links1, egress1); |
68 | - LinkCollectionIntent i2 = makeLinkCollection(12, links2, egress1); | 71 | + LinkCollectionIntent i2 = makeLinkCollection(links2, egress1); |
69 | 72 | ||
70 | assertThat(i1, is(equalTo(i2))); | 73 | assertThat(i1, is(equalTo(i2))); |
71 | } | 74 | } |
... | @@ -82,8 +85,8 @@ public class TestLinkCollectionIntent { | ... | @@ -82,8 +85,8 @@ public class TestLinkCollectionIntent { |
82 | links2.add(link3); | 85 | links2.add(link3); |
83 | links2.add(link1); | 86 | links2.add(link1); |
84 | 87 | ||
85 | - LinkCollectionIntent i1 = makeLinkCollection(12, links1, egress1); | 88 | + LinkCollectionIntent i1 = makeLinkCollection(links1, egress1); |
86 | - LinkCollectionIntent i2 = makeLinkCollection(12, links2, egress1); | 89 | + LinkCollectionIntent i2 = makeLinkCollection(links2, egress1); |
87 | 90 | ||
88 | assertThat(i1, is(not(equalTo(i2)))); | 91 | assertThat(i1, is(not(equalTo(i2)))); |
89 | } | 92 | } |
... | @@ -102,26 +105,8 @@ public class TestLinkCollectionIntent { | ... | @@ -102,26 +105,8 @@ public class TestLinkCollectionIntent { |
102 | links2.add(link2); | 105 | links2.add(link2); |
103 | links2.add(link1); | 106 | links2.add(link1); |
104 | 107 | ||
105 | - LinkCollectionIntent i1 = makeLinkCollection(12, links1, egress1); | 108 | + LinkCollectionIntent i1 = makeLinkCollection(links1, egress1); |
106 | - LinkCollectionIntent i2 = makeLinkCollection(12, links2, egress2); | 109 | + LinkCollectionIntent i2 = makeLinkCollection(links2, egress2); |
107 | - | ||
108 | - assertThat(i1, is(not(equalTo(i2)))); | ||
109 | - } | ||
110 | - | ||
111 | - /** | ||
112 | - * Tests the equals() method where two LinkCollectionIntents have different | ||
113 | - * ids. These should compare not equal. | ||
114 | - */ | ||
115 | - @Test | ||
116 | - public void testBaseDifferentEquals() { | ||
117 | - links1.add(link1); | ||
118 | - links1.add(link2); | ||
119 | - | ||
120 | - links2.add(link2); | ||
121 | - links2.add(link1); | ||
122 | - | ||
123 | - LinkCollectionIntent i1 = makeLinkCollection(1, links1, egress1); | ||
124 | - LinkCollectionIntent i2 = makeLinkCollection(2, links2, egress1); | ||
125 | 110 | ||
126 | assertThat(i1, is(not(equalTo(i2)))); | 111 | assertThat(i1, is(not(equalTo(i2)))); |
127 | } | 112 | } |
... | @@ -140,8 +125,8 @@ public class TestLinkCollectionIntent { | ... | @@ -140,8 +125,8 @@ public class TestLinkCollectionIntent { |
140 | links2.add(link2); | 125 | links2.add(link2); |
141 | links2.add(link1); | 126 | links2.add(link1); |
142 | 127 | ||
143 | - LinkCollectionIntent i1 = makeLinkCollection(1, links1, egress1); | 128 | + LinkCollectionIntent i1 = makeLinkCollection(links1, egress1); |
144 | - LinkCollectionIntent i2 = makeLinkCollection(1, links2, egress1); | 129 | + LinkCollectionIntent i2 = makeLinkCollection(links2, egress1); |
145 | 130 | ||
146 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | 131 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); |
147 | } | 132 | } |
... | @@ -158,8 +143,8 @@ public class TestLinkCollectionIntent { | ... | @@ -158,8 +143,8 @@ public class TestLinkCollectionIntent { |
158 | links2.add(link1); | 143 | links2.add(link1); |
159 | links2.add(link3); | 144 | links2.add(link3); |
160 | 145 | ||
161 | - LinkCollectionIntent i1 = makeLinkCollection(1, links1, egress1); | 146 | + LinkCollectionIntent i1 = makeLinkCollection(links1, egress1); |
162 | - LinkCollectionIntent i2 = makeLinkCollection(1, links2, egress2); | 147 | + LinkCollectionIntent i2 = makeLinkCollection(links2, egress2); |
163 | 148 | ||
164 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | 149 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); |
165 | } | 150 | } | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | -import java.util.HashSet; | ||
4 | -import java.util.Set; | ||
5 | - | ||
6 | import org.junit.Before; | 3 | import org.junit.Before; |
7 | import org.junit.Test; | 4 | import org.junit.Test; |
5 | +import org.onlab.onos.ApplicationId; | ||
6 | +import org.onlab.onos.TestApplicationId; | ||
8 | import org.onlab.onos.net.ConnectPoint; | 7 | import org.onlab.onos.net.ConnectPoint; |
9 | import org.onlab.onos.net.flow.TrafficSelector; | 8 | import org.onlab.onos.net.flow.TrafficSelector; |
10 | import org.onlab.onos.net.flow.TrafficTreatment; | 9 | import org.onlab.onos.net.flow.TrafficTreatment; |
11 | 10 | ||
11 | +import java.util.HashSet; | ||
12 | +import java.util.Set; | ||
13 | + | ||
12 | import static org.hamcrest.CoreMatchers.not; | 14 | import static org.hamcrest.CoreMatchers.not; |
13 | import static org.hamcrest.MatcherAssert.assertThat; | 15 | import static org.hamcrest.MatcherAssert.assertThat; |
14 | import static org.hamcrest.Matchers.equalTo; | 16 | import static org.hamcrest.Matchers.equalTo; |
... | @@ -20,6 +22,8 @@ import static org.onlab.onos.net.NetTestTools.connectPoint; | ... | @@ -20,6 +22,8 @@ import static org.onlab.onos.net.NetTestTools.connectPoint; |
20 | */ | 22 | */ |
21 | public class TestMultiPointToSinglePointIntent { | 23 | public class TestMultiPointToSinglePointIntent { |
22 | 24 | ||
25 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
26 | + | ||
23 | private ConnectPoint point1 = connectPoint("dev1", 1); | 27 | private ConnectPoint point1 = connectPoint("dev1", 1); |
24 | private ConnectPoint point2 = connectPoint("dev2", 1); | 28 | private ConnectPoint point2 = connectPoint("dev2", 1); |
25 | private ConnectPoint point3 = connectPoint("dev3", 1); | 29 | private ConnectPoint point3 = connectPoint("dev3", 1); |
... | @@ -33,19 +37,14 @@ public class TestMultiPointToSinglePointIntent { | ... | @@ -33,19 +37,14 @@ public class TestMultiPointToSinglePointIntent { |
33 | /** | 37 | /** |
34 | * Creates a MultiPointToSinglePointIntent object. | 38 | * Creates a MultiPointToSinglePointIntent object. |
35 | * | 39 | * |
36 | - * @param id identifier to use for the new intent | ||
37 | * @param ingress set of ingress points | 40 | * @param ingress set of ingress points |
38 | * @param egress egress point | 41 | * @param egress egress point |
39 | * @return MultiPointToSinglePoint intent | 42 | * @return MultiPointToSinglePoint intent |
40 | */ | 43 | */ |
41 | - private MultiPointToSinglePointIntent makeIntent(long id, | 44 | + private MultiPointToSinglePointIntent makeIntent(Set<ConnectPoint> ingress, |
42 | - Set<ConnectPoint> ingress, | ||
43 | ConnectPoint egress) { | 45 | ConnectPoint egress) { |
44 | - return new MultiPointToSinglePointIntent(new IntentId(id), | 46 | + return new MultiPointToSinglePointIntent(APPID, selector, treatment, |
45 | - selector, | 47 | + ingress, egress); |
46 | - treatment, | ||
47 | - ingress, | ||
48 | - egress); | ||
49 | } | 48 | } |
50 | 49 | ||
51 | /** | 50 | /** |
... | @@ -72,8 +71,8 @@ public class TestMultiPointToSinglePointIntent { | ... | @@ -72,8 +71,8 @@ public class TestMultiPointToSinglePointIntent { |
72 | ingress2.add(point3); | 71 | ingress2.add(point3); |
73 | ingress2.add(point2); | 72 | ingress2.add(point2); |
74 | 73 | ||
75 | - Intent i1 = makeIntent(12, ingress1, point1); | 74 | + Intent i1 = makeIntent(ingress1, point1); |
76 | - Intent i2 = makeIntent(12, ingress2, point1); | 75 | + Intent i2 = makeIntent(ingress2, point1); |
77 | 76 | ||
78 | assertThat(i1, is(equalTo(i2))); | 77 | assertThat(i1, is(equalTo(i2))); |
79 | } | 78 | } |
... | @@ -89,23 +88,8 @@ public class TestMultiPointToSinglePointIntent { | ... | @@ -89,23 +88,8 @@ public class TestMultiPointToSinglePointIntent { |
89 | ingress2.add(point3); | 88 | ingress2.add(point3); |
90 | ingress2.add(point2); | 89 | ingress2.add(point2); |
91 | 90 | ||
92 | - Intent i1 = makeIntent(12, ingress1, point1); | 91 | + Intent i1 = makeIntent(ingress1, point1); |
93 | - Intent i2 = makeIntent(12, ingress2, point1); | 92 | + Intent i2 = makeIntent(ingress2, point1); |
94 | - | ||
95 | - assertThat(i1, is(not(equalTo(i2)))); | ||
96 | - } | ||
97 | - | ||
98 | - /** | ||
99 | - * Tests the equals() method where two MultiPointToSinglePoint have different | ||
100 | - * ids. These should compare not equal. | ||
101 | - */ | ||
102 | - @Test | ||
103 | - public void testBaseDifferentEquals() { | ||
104 | - ingress1.add(point3); | ||
105 | - ingress2.add(point3); | ||
106 | - | ||
107 | - Intent i1 = makeIntent(12, ingress1, point1); | ||
108 | - Intent i2 = makeIntent(11, ingress2, point1); | ||
109 | 93 | ||
110 | assertThat(i1, is(not(equalTo(i2)))); | 94 | assertThat(i1, is(not(equalTo(i2)))); |
111 | } | 95 | } |
... | @@ -122,8 +106,8 @@ public class TestMultiPointToSinglePointIntent { | ... | @@ -122,8 +106,8 @@ public class TestMultiPointToSinglePointIntent { |
122 | ingress2.add(point3); | 106 | ingress2.add(point3); |
123 | ingress2.add(point2); | 107 | ingress2.add(point2); |
124 | 108 | ||
125 | - Intent i1 = makeIntent(12, ingress1, point1); | 109 | + Intent i1 = makeIntent(ingress1, point1); |
126 | - Intent i2 = makeIntent(12, ingress2, point1); | 110 | + Intent i2 = makeIntent(ingress2, point1); |
127 | 111 | ||
128 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | 112 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); |
129 | } | 113 | } |
... | @@ -139,8 +123,8 @@ public class TestMultiPointToSinglePointIntent { | ... | @@ -139,8 +123,8 @@ public class TestMultiPointToSinglePointIntent { |
139 | ingress2.add(point3); | 123 | ingress2.add(point3); |
140 | ingress2.add(point2); | 124 | ingress2.add(point2); |
141 | 125 | ||
142 | - Intent i1 = makeIntent(12, ingress1, point1); | 126 | + Intent i1 = makeIntent(ingress1, point1); |
143 | - Intent i2 = makeIntent(12, ingress2, point1); | 127 | + Intent i2 = makeIntent(ingress2, point1); |
144 | 128 | ||
145 | 129 | ||
146 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | 130 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | ... | ... |
1 | package org.onlab.onos.net.intent; | 1 | package org.onlab.onos.net.intent; |
2 | 2 | ||
3 | import org.junit.Test; | 3 | import org.junit.Test; |
4 | +import org.onlab.onos.ApplicationId; | ||
5 | +import org.onlab.onos.TestApplicationId; | ||
4 | import org.onlab.onos.net.ConnectPoint; | 6 | import org.onlab.onos.net.ConnectPoint; |
5 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
6 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
7 | 9 | ||
8 | import static org.hamcrest.MatcherAssert.assertThat; | 10 | import static org.hamcrest.MatcherAssert.assertThat; |
9 | -import static org.hamcrest.Matchers.equalTo; | 11 | +import static org.hamcrest.Matchers.*; |
10 | -import static org.hamcrest.Matchers.is; | ||
11 | -import static org.hamcrest.Matchers.not; | ||
12 | import static org.onlab.onos.net.NetTestTools.connectPoint; | 12 | import static org.onlab.onos.net.NetTestTools.connectPoint; |
13 | 13 | ||
14 | /** | 14 | /** |
... | @@ -16,20 +16,17 @@ import static org.onlab.onos.net.NetTestTools.connectPoint; | ... | @@ -16,20 +16,17 @@ import static org.onlab.onos.net.NetTestTools.connectPoint; |
16 | */ | 16 | */ |
17 | public class TestPointToPointIntent { | 17 | public class TestPointToPointIntent { |
18 | 18 | ||
19 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
20 | + | ||
19 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | 21 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); |
20 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | 22 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); |
21 | 23 | ||
22 | private ConnectPoint point1 = connectPoint("dev1", 1); | 24 | private ConnectPoint point1 = connectPoint("dev1", 1); |
23 | private ConnectPoint point2 = connectPoint("dev2", 1); | 25 | private ConnectPoint point2 = connectPoint("dev2", 1); |
24 | 26 | ||
25 | - private PointToPointIntent makePointToPoint(long id, | 27 | + private PointToPointIntent makePointToPoint(ConnectPoint ingress, |
26 | - ConnectPoint ingress, | ||
27 | ConnectPoint egress) { | 28 | ConnectPoint egress) { |
28 | - return new PointToPointIntent(new IntentId(id), | 29 | + return new PointToPointIntent(APPID, selector, treatment, ingress, egress); |
29 | - selector, | ||
30 | - treatment, | ||
31 | - ingress, | ||
32 | - egress); | ||
33 | } | 30 | } |
34 | 31 | ||
35 | /** | 32 | /** |
... | @@ -38,8 +35,8 @@ public class TestPointToPointIntent { | ... | @@ -38,8 +35,8 @@ public class TestPointToPointIntent { |
38 | */ | 35 | */ |
39 | @Test | 36 | @Test |
40 | public void testSameEquals() { | 37 | public void testSameEquals() { |
41 | - PointToPointIntent i1 = makePointToPoint(12, point1, point2); | 38 | + PointToPointIntent i1 = makePointToPoint(point1, point2); |
42 | - PointToPointIntent i2 = makePointToPoint(12, point1, point2); | 39 | + PointToPointIntent i2 = makePointToPoint(point1, point2); |
43 | 40 | ||
44 | assertThat(i1, is(equalTo(i2))); | 41 | assertThat(i1, is(equalTo(i2))); |
45 | } | 42 | } |
... | @@ -50,22 +47,8 @@ public class TestPointToPointIntent { | ... | @@ -50,22 +47,8 @@ public class TestPointToPointIntent { |
50 | */ | 47 | */ |
51 | @Test | 48 | @Test |
52 | public void testLinksDifferentEquals() { | 49 | public void testLinksDifferentEquals() { |
53 | - | 50 | + PointToPointIntent i1 = makePointToPoint(point1, point2); |
54 | - PointToPointIntent i1 = makePointToPoint(12, point1, point2); | 51 | + PointToPointIntent i2 = makePointToPoint(point2, point1); |
55 | - PointToPointIntent i2 = makePointToPoint(12, point2, point1); | ||
56 | - | ||
57 | - assertThat(i1, is(not(equalTo(i2)))); | ||
58 | - } | ||
59 | - | ||
60 | - /** | ||
61 | - * Tests the equals() method where two HostToHostIntents have different | ||
62 | - * ids. These should compare not equal. | ||
63 | - */ | ||
64 | - @Test | ||
65 | - public void testBaseDifferentEquals() { | ||
66 | - PointToPointIntent i1 = makePointToPoint(12, point1, point2); | ||
67 | - PointToPointIntent i2 = makePointToPoint(11, point1, point2); | ||
68 | - | ||
69 | 52 | ||
70 | assertThat(i1, is(not(equalTo(i2)))); | 53 | assertThat(i1, is(not(equalTo(i2)))); |
71 | } | 54 | } |
... | @@ -76,8 +59,8 @@ public class TestPointToPointIntent { | ... | @@ -76,8 +59,8 @@ public class TestPointToPointIntent { |
76 | */ | 59 | */ |
77 | @Test | 60 | @Test |
78 | public void testHashCodeEquals() { | 61 | public void testHashCodeEquals() { |
79 | - PointToPointIntent i1 = makePointToPoint(12, point1, point2); | 62 | + PointToPointIntent i1 = makePointToPoint(point1, point2); |
80 | - PointToPointIntent i2 = makePointToPoint(12, point1, point2); | 63 | + PointToPointIntent i2 = makePointToPoint(point1, point2); |
81 | 64 | ||
82 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); | 65 | assertThat(i1.hashCode(), is(equalTo(i2.hashCode()))); |
83 | } | 66 | } |
... | @@ -88,8 +71,8 @@ public class TestPointToPointIntent { | ... | @@ -88,8 +71,8 @@ public class TestPointToPointIntent { |
88 | */ | 71 | */ |
89 | @Test | 72 | @Test |
90 | public void testHashCodeDifferent() { | 73 | public void testHashCodeDifferent() { |
91 | - PointToPointIntent i1 = makePointToPoint(12, point1, point2); | 74 | + PointToPointIntent i1 = makePointToPoint(point1, point2); |
92 | - PointToPointIntent i2 = makePointToPoint(22, point1, point2); | 75 | + PointToPointIntent i2 = makePointToPoint(point2, point1); |
93 | 76 | ||
94 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); | 77 | assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode())))); |
95 | } | 78 | } | ... | ... |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import java.util.List; | ||
4 | - | ||
5 | import org.hamcrest.Matchers; | 3 | import org.hamcrest.Matchers; |
6 | import org.junit.Before; | 4 | import org.junit.Before; |
7 | import org.junit.Test; | 5 | import org.junit.Test; |
6 | +import org.onlab.onos.ApplicationId; | ||
7 | +import org.onlab.onos.TestApplicationId; | ||
8 | import org.onlab.onos.net.Host; | 8 | import org.onlab.onos.net.Host; |
9 | import org.onlab.onos.net.HostId; | 9 | import org.onlab.onos.net.HostId; |
10 | import org.onlab.onos.net.flow.TrafficSelector; | 10 | import org.onlab.onos.net.flow.TrafficSelector; |
... | @@ -12,16 +12,14 @@ import org.onlab.onos.net.flow.TrafficTreatment; | ... | @@ -12,16 +12,14 @@ import org.onlab.onos.net.flow.TrafficTreatment; |
12 | import org.onlab.onos.net.host.HostService; | 12 | import org.onlab.onos.net.host.HostService; |
13 | import org.onlab.onos.net.intent.HostToHostIntent; | 13 | import org.onlab.onos.net.intent.HostToHostIntent; |
14 | import org.onlab.onos.net.intent.Intent; | 14 | import org.onlab.onos.net.intent.Intent; |
15 | -import org.onlab.onos.net.intent.IntentId; | ||
16 | import org.onlab.onos.net.intent.IntentTestsMocks; | 15 | import org.onlab.onos.net.intent.IntentTestsMocks; |
17 | import org.onlab.onos.net.intent.PathIntent; | 16 | import org.onlab.onos.net.intent.PathIntent; |
18 | import org.onlab.packet.MacAddress; | 17 | import org.onlab.packet.MacAddress; |
19 | import org.onlab.packet.VlanId; | 18 | import org.onlab.packet.VlanId; |
20 | 19 | ||
21 | -import static org.easymock.EasyMock.createMock; | 20 | +import java.util.List; |
22 | -import static org.easymock.EasyMock.eq; | 21 | + |
23 | -import static org.easymock.EasyMock.expect; | 22 | +import static org.easymock.EasyMock.*; |
24 | -import static org.easymock.EasyMock.replay; | ||
25 | import static org.hamcrest.CoreMatchers.notNullValue; | 23 | import static org.hamcrest.CoreMatchers.notNullValue; |
26 | import static org.hamcrest.MatcherAssert.assertThat; | 24 | import static org.hamcrest.MatcherAssert.assertThat; |
27 | import static org.hamcrest.Matchers.hasSize; | 25 | import static org.hamcrest.Matchers.hasSize; |
... | @@ -40,6 +38,8 @@ public class TestHostToHostIntentCompiler { | ... | @@ -40,6 +38,8 @@ public class TestHostToHostIntentCompiler { |
40 | private static final String HOST_ONE = HOST_ONE_MAC + "/" + HOST_ONE_VLAN; | 38 | private static final String HOST_ONE = HOST_ONE_MAC + "/" + HOST_ONE_VLAN; |
41 | private static final String HOST_TWO = HOST_TWO_MAC + "/" + HOST_TWO_VLAN; | 39 | private static final String HOST_TWO = HOST_TWO_MAC + "/" + HOST_TWO_VLAN; |
42 | 40 | ||
41 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
42 | + | ||
43 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | 43 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); |
44 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | 44 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); |
45 | 45 | ||
... | @@ -73,11 +73,8 @@ public class TestHostToHostIntentCompiler { | ... | @@ -73,11 +73,8 @@ public class TestHostToHostIntentCompiler { |
73 | * @return HostToHostIntent for the two hosts | 73 | * @return HostToHostIntent for the two hosts |
74 | */ | 74 | */ |
75 | private HostToHostIntent makeIntent(String oneIdString, String twoIdString) { | 75 | private HostToHostIntent makeIntent(String oneIdString, String twoIdString) { |
76 | - return new HostToHostIntent(new IntentId(12), | 76 | + return new HostToHostIntent(APPID, hid(oneIdString), hid(twoIdString), |
77 | - hid(oneIdString), | 77 | + selector, treatment); |
78 | - hid(twoIdString), | ||
79 | - selector, | ||
80 | - treatment); | ||
81 | } | 78 | } |
82 | 79 | ||
83 | /** | 80 | /** |
... | @@ -91,9 +88,6 @@ public class TestHostToHostIntentCompiler { | ... | @@ -91,9 +88,6 @@ public class TestHostToHostIntentCompiler { |
91 | new HostToHostIntentCompiler(); | 88 | new HostToHostIntentCompiler(); |
92 | compiler.pathService = new IntentTestsMocks.MockPathService(hops); | 89 | compiler.pathService = new IntentTestsMocks.MockPathService(hops); |
93 | compiler.hostService = mockHostService; | 90 | compiler.hostService = mockHostService; |
94 | - IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
95 | - compiler.intentIdGenerator = | ||
96 | - new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
97 | return compiler; | 91 | return compiler; |
98 | } | 92 | } |
99 | 93 | ... | ... |
core/net/src/test/java/org/onlab/onos/net/intent/impl/TestMultiPointToSinglePointIntentCompiler.java
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import java.util.HashSet; | ||
4 | -import java.util.List; | ||
5 | -import java.util.Set; | ||
6 | - | ||
7 | import org.hamcrest.Matchers; | 3 | import org.hamcrest.Matchers; |
8 | import org.junit.Test; | 4 | import org.junit.Test; |
5 | +import org.onlab.onos.ApplicationId; | ||
6 | +import org.onlab.onos.TestApplicationId; | ||
9 | import org.onlab.onos.net.ConnectPoint; | 7 | import org.onlab.onos.net.ConnectPoint; |
10 | import org.onlab.onos.net.ElementId; | 8 | import org.onlab.onos.net.ElementId; |
11 | import org.onlab.onos.net.Path; | 9 | import org.onlab.onos.net.Path; |
12 | import org.onlab.onos.net.flow.TrafficSelector; | 10 | import org.onlab.onos.net.flow.TrafficSelector; |
13 | import org.onlab.onos.net.flow.TrafficTreatment; | 11 | import org.onlab.onos.net.flow.TrafficTreatment; |
14 | import org.onlab.onos.net.intent.Intent; | 12 | import org.onlab.onos.net.intent.Intent; |
15 | -import org.onlab.onos.net.intent.IntentId; | ||
16 | import org.onlab.onos.net.intent.IntentTestsMocks; | 13 | import org.onlab.onos.net.intent.IntentTestsMocks; |
17 | import org.onlab.onos.net.intent.LinkCollectionIntent; | 14 | import org.onlab.onos.net.intent.LinkCollectionIntent; |
18 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | 15 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; |
19 | import org.onlab.onos.net.topology.LinkWeight; | 16 | import org.onlab.onos.net.topology.LinkWeight; |
20 | import org.onlab.onos.net.topology.PathService; | 17 | import org.onlab.onos.net.topology.PathService; |
21 | 18 | ||
19 | +import java.util.HashSet; | ||
20 | +import java.util.List; | ||
21 | +import java.util.Set; | ||
22 | + | ||
22 | import static org.hamcrest.CoreMatchers.notNullValue; | 23 | import static org.hamcrest.CoreMatchers.notNullValue; |
23 | import static org.hamcrest.MatcherAssert.assertThat; | 24 | import static org.hamcrest.MatcherAssert.assertThat; |
24 | import static org.hamcrest.Matchers.hasSize; | 25 | import static org.hamcrest.Matchers.hasSize; |
... | @@ -32,6 +33,8 @@ import static org.onlab.onos.net.intent.LinksHaveEntryWithSourceDestinationPairM | ... | @@ -32,6 +33,8 @@ import static org.onlab.onos.net.intent.LinksHaveEntryWithSourceDestinationPairM |
32 | */ | 33 | */ |
33 | public class TestMultiPointToSinglePointIntentCompiler { | 34 | public class TestMultiPointToSinglePointIntentCompiler { |
34 | 35 | ||
36 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
37 | + | ||
35 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | 38 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); |
36 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | 39 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); |
37 | 40 | ||
... | @@ -85,12 +88,8 @@ public class TestMultiPointToSinglePointIntentCompiler { | ... | @@ -85,12 +88,8 @@ public class TestMultiPointToSinglePointIntentCompiler { |
85 | ingressPoints.add(connectPoint(ingressId, 1)); | 88 | ingressPoints.add(connectPoint(ingressId, 1)); |
86 | } | 89 | } |
87 | 90 | ||
88 | - return new MultiPointToSinglePointIntent( | 91 | + return new MultiPointToSinglePointIntent(APPID, selector, treatment, |
89 | - new IntentId(12), | 92 | + ingressPoints, egressPoint); |
90 | - selector, | ||
91 | - treatment, | ||
92 | - ingressPoints, | ||
93 | - egressPoint); | ||
94 | } | 93 | } |
95 | 94 | ||
96 | /** | 95 | /** |
... | @@ -103,9 +102,6 @@ public class TestMultiPointToSinglePointIntentCompiler { | ... | @@ -103,9 +102,6 @@ public class TestMultiPointToSinglePointIntentCompiler { |
103 | MultiPointToSinglePointIntentCompiler compiler = | 102 | MultiPointToSinglePointIntentCompiler compiler = |
104 | new MultiPointToSinglePointIntentCompiler(); | 103 | new MultiPointToSinglePointIntentCompiler(); |
105 | compiler.pathService = new MockPathService(hops); | 104 | compiler.pathService = new MockPathService(hops); |
106 | - IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
107 | - compiler.intentIdGenerator = | ||
108 | - new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
109 | return compiler; | 105 | return compiler; |
110 | } | 106 | } |
111 | 107 | ... | ... |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import java.util.List; | ||
4 | - | ||
5 | import org.hamcrest.Matchers; | 3 | import org.hamcrest.Matchers; |
6 | import org.junit.Test; | 4 | import org.junit.Test; |
5 | +import org.onlab.onos.ApplicationId; | ||
6 | +import org.onlab.onos.TestApplicationId; | ||
7 | import org.onlab.onos.net.flow.TrafficSelector; | 7 | import org.onlab.onos.net.flow.TrafficSelector; |
8 | import org.onlab.onos.net.flow.TrafficTreatment; | 8 | import org.onlab.onos.net.flow.TrafficTreatment; |
9 | import org.onlab.onos.net.intent.Intent; | 9 | import org.onlab.onos.net.intent.Intent; |
10 | -import org.onlab.onos.net.intent.IntentId; | ||
11 | import org.onlab.onos.net.intent.IntentTestsMocks; | 10 | import org.onlab.onos.net.intent.IntentTestsMocks; |
12 | import org.onlab.onos.net.intent.PathIntent; | 11 | import org.onlab.onos.net.intent.PathIntent; |
13 | import org.onlab.onos.net.intent.PointToPointIntent; | 12 | import org.onlab.onos.net.intent.PointToPointIntent; |
14 | 13 | ||
14 | +import java.util.List; | ||
15 | + | ||
15 | import static org.hamcrest.CoreMatchers.notNullValue; | 16 | import static org.hamcrest.CoreMatchers.notNullValue; |
16 | import static org.hamcrest.MatcherAssert.assertThat; | 17 | import static org.hamcrest.MatcherAssert.assertThat; |
17 | import static org.hamcrest.Matchers.hasSize; | 18 | import static org.hamcrest.Matchers.hasSize; |
... | @@ -24,6 +25,8 @@ import static org.onlab.onos.net.intent.LinksHaveEntryWithSourceDestinationPairM | ... | @@ -24,6 +25,8 @@ import static org.onlab.onos.net.intent.LinksHaveEntryWithSourceDestinationPairM |
24 | */ | 25 | */ |
25 | public class TestPointToPointIntentCompiler { | 26 | public class TestPointToPointIntentCompiler { |
26 | 27 | ||
28 | + private static final ApplicationId APPID = new TestApplicationId("foo"); | ||
29 | + | ||
27 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); | 30 | private TrafficSelector selector = new IntentTestsMocks.MockSelector(); |
28 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); | 31 | private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment(); |
29 | 32 | ||
... | @@ -36,9 +39,7 @@ public class TestPointToPointIntentCompiler { | ... | @@ -36,9 +39,7 @@ public class TestPointToPointIntentCompiler { |
36 | */ | 39 | */ |
37 | private PointToPointIntent makeIntent(String ingressIdString, | 40 | private PointToPointIntent makeIntent(String ingressIdString, |
38 | String egressIdString) { | 41 | String egressIdString) { |
39 | - return new PointToPointIntent(new IntentId(12), | 42 | + return new PointToPointIntent(APPID, selector, treatment, |
40 | - selector, | ||
41 | - treatment, | ||
42 | connectPoint(ingressIdString, 1), | 43 | connectPoint(ingressIdString, 1), |
43 | connectPoint(egressIdString, 1)); | 44 | connectPoint(egressIdString, 1)); |
44 | } | 45 | } |
... | @@ -53,9 +54,6 @@ public class TestPointToPointIntentCompiler { | ... | @@ -53,9 +54,6 @@ public class TestPointToPointIntentCompiler { |
53 | PointToPointIntentCompiler compiler = | 54 | PointToPointIntentCompiler compiler = |
54 | new PointToPointIntentCompiler(); | 55 | new PointToPointIntentCompiler(); |
55 | compiler.pathService = new IntentTestsMocks.MockPathService(hops); | 56 | compiler.pathService = new IntentTestsMocks.MockPathService(hops); |
56 | - IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator(); | ||
57 | - compiler.intentIdGenerator = | ||
58 | - new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator); | ||
59 | return compiler; | 57 | return compiler; |
60 | } | 58 | } |
61 | 59 | ... | ... |
... | @@ -2,6 +2,7 @@ package org.onlab.onos.store.flow.impl; | ... | @@ -2,6 +2,7 @@ package org.onlab.onos.store.flow.impl; |
2 | 2 | ||
3 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; | 3 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; |
4 | import static org.slf4j.LoggerFactory.getLogger; | 4 | import static org.slf4j.LoggerFactory.getLogger; |
5 | +import static org.onlab.onos.store.flow.impl.FlowStoreMessageSubjects.*; | ||
5 | 6 | ||
6 | import java.io.IOException; | 7 | import java.io.IOException; |
7 | import java.util.Collection; | 8 | import java.util.Collection; |
... | @@ -30,6 +31,7 @@ import org.onlab.onos.net.flow.StoredFlowEntry; | ... | @@ -30,6 +31,7 @@ import org.onlab.onos.net.flow.StoredFlowEntry; |
30 | import org.onlab.onos.store.AbstractStore; | 31 | import org.onlab.onos.store.AbstractStore; |
31 | import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService; | 32 | import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService; |
32 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; | 33 | import org.onlab.onos.store.cluster.messaging.ClusterMessage; |
34 | +import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler; | ||
33 | import org.onlab.onos.store.cluster.messaging.ClusterMessageResponse; | 35 | import org.onlab.onos.store.cluster.messaging.ClusterMessageResponse; |
34 | import org.onlab.onos.store.flow.ReplicaInfo; | 36 | import org.onlab.onos.store.flow.ReplicaInfo; |
35 | import org.onlab.onos.store.flow.ReplicaInfoService; | 37 | import org.onlab.onos.store.flow.ReplicaInfoService; |
... | @@ -80,10 +82,44 @@ public class DistributedFlowRuleStore | ... | @@ -80,10 +82,44 @@ public class DistributedFlowRuleStore |
80 | }; | 82 | }; |
81 | 83 | ||
82 | // TODO: make this configurable | 84 | // TODO: make this configurable |
83 | - private static final long FLOW_RULE_STORE_TIMEOUT_MILLIS = 1000; | 85 | + private static final long FLOW_RULE_STORE_TIMEOUT_MILLIS = 5000; |
84 | 86 | ||
85 | @Activate | 87 | @Activate |
86 | public void activate() { | 88 | public void activate() { |
89 | + clusterCommunicator.addSubscriber(STORE_FLOW_RULE, new ClusterMessageHandler() { | ||
90 | + | ||
91 | + @Override | ||
92 | + public void handle(ClusterMessage message) { | ||
93 | + FlowRule rule = SERIALIZER.decode(message.payload()); | ||
94 | + log.info("received add request for {}", rule); | ||
95 | + storeFlowEntryInternal(rule); | ||
96 | + // FIXME what to respond. | ||
97 | + try { | ||
98 | + // FIXME: #respond() not working. responded message is | ||
99 | + // handled by this sender node and never goes back. | ||
100 | + message.respond(SERIALIZER.encode("ACK")); | ||
101 | + } catch (IOException e) { | ||
102 | + log.error("Failed to respond back", e); | ||
103 | + } | ||
104 | + } | ||
105 | + }); | ||
106 | + | ||
107 | + clusterCommunicator.addSubscriber(DELETE_FLOW_RULE, new ClusterMessageHandler() { | ||
108 | + | ||
109 | + @Override | ||
110 | + public void handle(ClusterMessage message) { | ||
111 | + FlowRule rule = SERIALIZER.decode(message.payload()); | ||
112 | + log.info("received delete request for {}", rule); | ||
113 | + deleteFlowRuleInternal(rule); | ||
114 | + // FIXME what to respond. | ||
115 | + try { | ||
116 | + message.respond(SERIALIZER.encode("ACK")); | ||
117 | + } catch (IOException e) { | ||
118 | + log.error("Failed to respond back", e); | ||
119 | + } | ||
120 | + | ||
121 | + } | ||
122 | + }); | ||
87 | log.info("Started"); | 123 | log.info("Started"); |
88 | } | 124 | } |
89 | 125 | ||
... | @@ -131,13 +167,14 @@ public class DistributedFlowRuleStore | ... | @@ -131,13 +167,14 @@ public class DistributedFlowRuleStore |
131 | } | 167 | } |
132 | 168 | ||
133 | @Override | 169 | @Override |
134 | - public void storeFlowRule(FlowRule rule) { | 170 | + public boolean storeFlowRule(FlowRule rule) { |
135 | ReplicaInfo replicaInfo = replicaInfoManager.getReplicaInfoFor(rule.deviceId()); | 171 | ReplicaInfo replicaInfo = replicaInfoManager.getReplicaInfoFor(rule.deviceId()); |
136 | if (replicaInfo.master().get().equals(clusterService.getLocalNode().id())) { | 172 | if (replicaInfo.master().get().equals(clusterService.getLocalNode().id())) { |
137 | - storeFlowEntryInternal(rule); | 173 | + return storeFlowEntryInternal(rule); |
138 | - return; | ||
139 | } | 174 | } |
140 | 175 | ||
176 | + log.warn("Not my flow forwarding to {}", replicaInfo.master().orNull()); | ||
177 | + | ||
141 | ClusterMessage message = new ClusterMessage( | 178 | ClusterMessage message = new ClusterMessage( |
142 | clusterService.getLocalNode().id(), | 179 | clusterService.getLocalNode().id(), |
143 | FlowStoreMessageSubjects.STORE_FLOW_RULE, | 180 | FlowStoreMessageSubjects.STORE_FLOW_RULE, |
... | @@ -150,26 +187,29 @@ public class DistributedFlowRuleStore | ... | @@ -150,26 +187,29 @@ public class DistributedFlowRuleStore |
150 | // FIXME: throw a FlowStoreException | 187 | // FIXME: throw a FlowStoreException |
151 | throw new RuntimeException(e); | 188 | throw new RuntimeException(e); |
152 | } | 189 | } |
190 | + return false; | ||
153 | } | 191 | } |
154 | 192 | ||
155 | - private synchronized void storeFlowEntryInternal(FlowRule flowRule) { | 193 | + private synchronized boolean storeFlowEntryInternal(FlowRule flowRule) { |
156 | StoredFlowEntry flowEntry = new DefaultFlowEntry(flowRule); | 194 | StoredFlowEntry flowEntry = new DefaultFlowEntry(flowRule); |
157 | DeviceId deviceId = flowRule.deviceId(); | 195 | DeviceId deviceId = flowRule.deviceId(); |
158 | // write to local copy. | 196 | // write to local copy. |
159 | if (!flowEntries.containsEntry(deviceId, flowEntry)) { | 197 | if (!flowEntries.containsEntry(deviceId, flowEntry)) { |
160 | flowEntries.put(deviceId, flowEntry); | 198 | flowEntries.put(deviceId, flowEntry); |
161 | flowEntriesById.put(flowRule.appId(), flowEntry); | 199 | flowEntriesById.put(flowRule.appId(), flowEntry); |
200 | + notifyDelegate(new FlowRuleEvent(Type.RULE_ADD_REQUESTED, flowRule)); | ||
201 | + return true; | ||
162 | } | 202 | } |
163 | // write to backup. | 203 | // write to backup. |
164 | // TODO: write to a hazelcast map. | 204 | // TODO: write to a hazelcast map. |
205 | + return false; | ||
165 | } | 206 | } |
166 | 207 | ||
167 | @Override | 208 | @Override |
168 | - public synchronized void deleteFlowRule(FlowRule rule) { | 209 | + public synchronized boolean deleteFlowRule(FlowRule rule) { |
169 | ReplicaInfo replicaInfo = replicaInfoManager.getReplicaInfoFor(rule.deviceId()); | 210 | ReplicaInfo replicaInfo = replicaInfoManager.getReplicaInfoFor(rule.deviceId()); |
170 | if (replicaInfo.master().get().equals(clusterService.getLocalNode().id())) { | 211 | if (replicaInfo.master().get().equals(clusterService.getLocalNode().id())) { |
171 | - deleteFlowRuleInternal(rule); | 212 | + return deleteFlowRuleInternal(rule); |
172 | - return; | ||
173 | } | 213 | } |
174 | 214 | ||
175 | ClusterMessage message = new ClusterMessage( | 215 | ClusterMessage message = new ClusterMessage( |
... | @@ -184,15 +224,21 @@ public class DistributedFlowRuleStore | ... | @@ -184,15 +224,21 @@ public class DistributedFlowRuleStore |
184 | // FIXME: throw a FlowStoreException | 224 | // FIXME: throw a FlowStoreException |
185 | throw new RuntimeException(e); | 225 | throw new RuntimeException(e); |
186 | } | 226 | } |
227 | + return false; | ||
187 | } | 228 | } |
188 | 229 | ||
189 | - private synchronized void deleteFlowRuleInternal(FlowRule flowRule) { | 230 | + private synchronized boolean deleteFlowRuleInternal(FlowRule flowRule) { |
190 | StoredFlowEntry entry = getFlowEntryInternal(flowRule); | 231 | StoredFlowEntry entry = getFlowEntryInternal(flowRule); |
191 | if (entry == null) { | 232 | if (entry == null) { |
192 | - return; | 233 | + return false; |
193 | } | 234 | } |
194 | entry.setState(FlowEntryState.PENDING_REMOVE); | 235 | entry.setState(FlowEntryState.PENDING_REMOVE); |
236 | + | ||
195 | // TODO: also update backup. | 237 | // TODO: also update backup. |
238 | + | ||
239 | + notifyDelegate(new FlowRuleEvent(Type.RULE_REMOVE_REQUESTED, flowRule)); | ||
240 | + | ||
241 | + return true; | ||
196 | } | 242 | } |
197 | 243 | ||
198 | @Override | 244 | @Override | ... | ... |
core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
0 → 100644
1 | +package org.onlab.onos.store.intent.impl; | ||
2 | + | ||
3 | +import com.google.common.collect.ImmutableSet; | ||
4 | +import org.apache.felix.scr.annotations.Activate; | ||
5 | +import org.apache.felix.scr.annotations.Component; | ||
6 | +import org.apache.felix.scr.annotations.Deactivate; | ||
7 | +import org.apache.felix.scr.annotations.Service; | ||
8 | +import org.onlab.onos.net.intent.Intent; | ||
9 | +import org.onlab.onos.net.intent.IntentEvent; | ||
10 | +import org.onlab.onos.net.intent.IntentId; | ||
11 | +import org.onlab.onos.net.intent.IntentState; | ||
12 | +import org.onlab.onos.net.intent.IntentStore; | ||
13 | +import org.onlab.onos.net.intent.IntentStoreDelegate; | ||
14 | +import org.onlab.onos.store.AbstractStore; | ||
15 | +import org.slf4j.Logger; | ||
16 | + | ||
17 | +import java.util.List; | ||
18 | +import java.util.Map; | ||
19 | +import java.util.concurrent.ConcurrentHashMap; | ||
20 | + | ||
21 | +import static org.onlab.onos.net.intent.IntentState.*; | ||
22 | +import static org.slf4j.LoggerFactory.getLogger; | ||
23 | + | ||
24 | +//FIXME: I LIE I AM NOT DISTRIBUTED | ||
25 | +@Component(immediate = true) | ||
26 | +@Service | ||
27 | +public class DistributedIntentStore | ||
28 | + extends AbstractStore<IntentEvent, IntentStoreDelegate> | ||
29 | + implements IntentStore { | ||
30 | + | ||
31 | + private final Logger log = getLogger(getClass()); | ||
32 | + private final Map<IntentId, Intent> intents = new ConcurrentHashMap<>(); | ||
33 | + private final Map<IntentId, IntentState> states = new ConcurrentHashMap<>(); | ||
34 | + private final Map<IntentId, List<Intent>> installable = new ConcurrentHashMap<>(); | ||
35 | + | ||
36 | + @Activate | ||
37 | + public void activate() { | ||
38 | + log.info("Started"); | ||
39 | + } | ||
40 | + | ||
41 | + @Deactivate | ||
42 | + public void deactivate() { | ||
43 | + log.info("Stopped"); | ||
44 | + } | ||
45 | + | ||
46 | + @Override | ||
47 | + public IntentEvent createIntent(Intent intent) { | ||
48 | + intents.put(intent.id(), intent); | ||
49 | + return this.setState(intent, IntentState.SUBMITTED); | ||
50 | + } | ||
51 | + | ||
52 | + @Override | ||
53 | + public IntentEvent removeIntent(IntentId intentId) { | ||
54 | + Intent intent = intents.remove(intentId); | ||
55 | + installable.remove(intentId); | ||
56 | + IntentEvent event = this.setState(intent, WITHDRAWN); | ||
57 | + states.remove(intentId); | ||
58 | + return event; | ||
59 | + } | ||
60 | + | ||
61 | + @Override | ||
62 | + public long getIntentCount() { | ||
63 | + return intents.size(); | ||
64 | + } | ||
65 | + | ||
66 | + @Override | ||
67 | + public Iterable<Intent> getIntents() { | ||
68 | + return ImmutableSet.copyOf(intents.values()); | ||
69 | + } | ||
70 | + | ||
71 | + @Override | ||
72 | + public Intent getIntent(IntentId intentId) { | ||
73 | + return intents.get(intentId); | ||
74 | + } | ||
75 | + | ||
76 | + @Override | ||
77 | + public IntentState getIntentState(IntentId id) { | ||
78 | + return states.get(id); | ||
79 | + } | ||
80 | + | ||
81 | + @Override | ||
82 | + public IntentEvent setState(Intent intent, IntentState state) { | ||
83 | + IntentId id = intent.id(); | ||
84 | + states.put(id, state); | ||
85 | + IntentEvent.Type type = (state == SUBMITTED ? IntentEvent.Type.SUBMITTED : | ||
86 | + (state == INSTALLED ? IntentEvent.Type.INSTALLED : | ||
87 | + (state == FAILED ? IntentEvent.Type.FAILED : | ||
88 | + state == WITHDRAWN ? IntentEvent.Type.WITHDRAWN : | ||
89 | + null))); | ||
90 | + return type == null ? null : new IntentEvent(type, intent); | ||
91 | + } | ||
92 | + | ||
93 | + @Override | ||
94 | + public void addInstallableIntents(IntentId intentId, List<Intent> result) { | ||
95 | + installable.put(intentId, result); | ||
96 | + } | ||
97 | + | ||
98 | + @Override | ||
99 | + public List<Intent> getInstallableIntents(IntentId intentId) { | ||
100 | + return installable.get(intentId); | ||
101 | + } | ||
102 | + | ||
103 | + @Override | ||
104 | + public void removeInstalledIntents(IntentId intentId) { | ||
105 | + installable.remove(intentId); | ||
106 | + } | ||
107 | + | ||
108 | +} |
... | @@ -8,6 +8,7 @@ import java.util.HashMap; | ... | @@ -8,6 +8,7 @@ import java.util.HashMap; |
8 | import org.onlab.onos.cluster.ControllerNode; | 8 | import org.onlab.onos.cluster.ControllerNode; |
9 | import org.onlab.onos.cluster.DefaultControllerNode; | 9 | import org.onlab.onos.cluster.DefaultControllerNode; |
10 | import org.onlab.onos.cluster.NodeId; | 10 | import org.onlab.onos.cluster.NodeId; |
11 | +import org.onlab.onos.cluster.RoleInfo; | ||
11 | import org.onlab.onos.mastership.MastershipTerm; | 12 | import org.onlab.onos.mastership.MastershipTerm; |
12 | import org.onlab.onos.net.ConnectPoint; | 13 | import org.onlab.onos.net.ConnectPoint; |
13 | import org.onlab.onos.net.DefaultAnnotations; | 14 | import org.onlab.onos.net.DefaultAnnotations; |
... | @@ -26,7 +27,12 @@ import org.onlab.onos.net.PortNumber; | ... | @@ -26,7 +27,12 @@ import org.onlab.onos.net.PortNumber; |
26 | import org.onlab.onos.net.device.DefaultDeviceDescription; | 27 | import org.onlab.onos.net.device.DefaultDeviceDescription; |
27 | import org.onlab.onos.net.device.DefaultPortDescription; | 28 | import org.onlab.onos.net.device.DefaultPortDescription; |
28 | import org.onlab.onos.net.flow.DefaultFlowRule; | 29 | import org.onlab.onos.net.flow.DefaultFlowRule; |
30 | +import org.onlab.onos.net.flow.DefaultTrafficSelector; | ||
31 | +import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ||
29 | import org.onlab.onos.net.flow.FlowId; | 32 | import org.onlab.onos.net.flow.FlowId; |
33 | +import org.onlab.onos.net.flow.criteria.Criteria; | ||
34 | +import org.onlab.onos.net.flow.criteria.Criterion; | ||
35 | +import org.onlab.onos.net.flow.instructions.Instructions; | ||
30 | import org.onlab.onos.net.host.DefaultHostDescription; | 36 | import org.onlab.onos.net.host.DefaultHostDescription; |
31 | import org.onlab.onos.net.host.HostDescription; | 37 | import org.onlab.onos.net.host.HostDescription; |
32 | import org.onlab.onos.net.link.DefaultLinkDescription; | 38 | import org.onlab.onos.net.link.DefaultLinkDescription; |
... | @@ -88,7 +94,22 @@ public final class KryoNamespaces { | ... | @@ -88,7 +94,22 @@ public final class KryoNamespaces { |
88 | HostDescription.class, | 94 | HostDescription.class, |
89 | DefaultHostDescription.class, | 95 | DefaultHostDescription.class, |
90 | DefaultFlowRule.class, | 96 | DefaultFlowRule.class, |
91 | - FlowId.class | 97 | + FlowId.class, |
98 | + DefaultTrafficSelector.class, | ||
99 | + Criteria.PortCriterion.class, | ||
100 | + Criteria.EthCriterion.class, | ||
101 | + Criteria.EthTypeCriterion.class, | ||
102 | + Criteria.IPCriterion.class, | ||
103 | + Criteria.IPProtocolCriterion.class, | ||
104 | + Criteria.VlanIdCriterion.class, | ||
105 | + Criteria.VlanPcpCriterion.class, | ||
106 | + Criteria.TcpPortCriterion.class, | ||
107 | + Criterion.class, | ||
108 | + Criterion.Type.class, | ||
109 | + DefaultTrafficTreatment.class, | ||
110 | + Instructions.DropInstruction.class, | ||
111 | + Instructions.OutputInstruction.class, | ||
112 | + RoleInfo.class | ||
92 | ) | 113 | ) |
93 | .register(URI.class, new URISerializer()) | 114 | .register(URI.class, new URISerializer()) |
94 | .register(NodeId.class, new NodeIdSerializer()) | 115 | .register(NodeId.class, new NodeIdSerializer()) | ... | ... |
... | @@ -3,6 +3,7 @@ package org.onlab.onos.store.serializers; | ... | @@ -3,6 +3,7 @@ package org.onlab.onos.store.serializers; |
3 | import static org.junit.Assert.assertEquals; | 3 | import static org.junit.Assert.assertEquals; |
4 | import static org.onlab.onos.net.DeviceId.deviceId; | 4 | import static org.onlab.onos.net.DeviceId.deviceId; |
5 | import static org.onlab.onos.net.PortNumber.portNumber; | 5 | import static org.onlab.onos.net.PortNumber.portNumber; |
6 | +import static java.util.Arrays.asList; | ||
6 | 7 | ||
7 | import java.nio.ByteBuffer; | 8 | import java.nio.ByteBuffer; |
8 | 9 | ||
... | @@ -11,6 +12,7 @@ import org.junit.Before; | ... | @@ -11,6 +12,7 @@ import org.junit.Before; |
11 | import org.junit.BeforeClass; | 12 | import org.junit.BeforeClass; |
12 | import org.junit.Test; | 13 | import org.junit.Test; |
13 | import org.onlab.onos.cluster.NodeId; | 14 | import org.onlab.onos.cluster.NodeId; |
15 | +import org.onlab.onos.cluster.RoleInfo; | ||
14 | import org.onlab.onos.mastership.MastershipTerm; | 16 | import org.onlab.onos.mastership.MastershipTerm; |
15 | import org.onlab.onos.net.Annotations; | 17 | import org.onlab.onos.net.Annotations; |
16 | import org.onlab.onos.net.ConnectPoint; | 18 | import org.onlab.onos.net.ConnectPoint; |
... | @@ -198,6 +200,12 @@ public class KryoSerializerTest { | ... | @@ -198,6 +200,12 @@ public class KryoSerializerTest { |
198 | } | 200 | } |
199 | 201 | ||
200 | @Test | 202 | @Test |
203 | + public void testRoleInfo() { | ||
204 | + testSerialized(new RoleInfo(new NodeId("master"), | ||
205 | + asList(new NodeId("stby1"), new NodeId("stby2")))); | ||
206 | + } | ||
207 | + | ||
208 | + @Test | ||
201 | public void testAnnotations() { | 209 | public void testAnnotations() { |
202 | // Annotations does not have equals defined, manually test equality | 210 | // Annotations does not have equals defined, manually test equality |
203 | final byte[] a1Bytes = serializer.encode(A1); | 211 | final byte[] a1Bytes = serializer.encode(A1); | ... | ... |
... | @@ -148,8 +148,9 @@ public class SimpleFlowRuleStore | ... | @@ -148,8 +148,9 @@ public class SimpleFlowRuleStore |
148 | } | 148 | } |
149 | 149 | ||
150 | @Override | 150 | @Override |
151 | - public void storeFlowRule(FlowRule rule) { | 151 | + public boolean storeFlowRule(FlowRule rule) { |
152 | final boolean added = storeFlowRuleInternal(rule); | 152 | final boolean added = storeFlowRuleInternal(rule); |
153 | + return added; | ||
153 | } | 154 | } |
154 | 155 | ||
155 | private boolean storeFlowRuleInternal(FlowRule rule) { | 156 | private boolean storeFlowRuleInternal(FlowRule rule) { |
... | @@ -166,13 +167,14 @@ public class SimpleFlowRuleStore | ... | @@ -166,13 +167,14 @@ public class SimpleFlowRuleStore |
166 | } | 167 | } |
167 | // new flow rule added | 168 | // new flow rule added |
168 | existing.add(f); | 169 | existing.add(f); |
169 | - // TODO: notify through delegate about remote event? | 170 | + // TODO: Should we notify only if it's "remote" event? |
171 | + //notifyDelegate(new FlowRuleEvent(Type.RULE_ADD_REQUESTED, rule)); | ||
170 | return true; | 172 | return true; |
171 | } | 173 | } |
172 | } | 174 | } |
173 | 175 | ||
174 | @Override | 176 | @Override |
175 | - public void deleteFlowRule(FlowRule rule) { | 177 | + public boolean deleteFlowRule(FlowRule rule) { |
176 | 178 | ||
177 | List<StoredFlowEntry> entries = getFlowEntries(rule.deviceId(), rule.id()); | 179 | List<StoredFlowEntry> entries = getFlowEntries(rule.deviceId(), rule.id()); |
178 | synchronized (entries) { | 180 | synchronized (entries) { |
... | @@ -180,12 +182,15 @@ public class SimpleFlowRuleStore | ... | @@ -180,12 +182,15 @@ public class SimpleFlowRuleStore |
180 | if (entry.equals(rule)) { | 182 | if (entry.equals(rule)) { |
181 | synchronized (entry) { | 183 | synchronized (entry) { |
182 | entry.setState(FlowEntryState.PENDING_REMOVE); | 184 | entry.setState(FlowEntryState.PENDING_REMOVE); |
183 | - return; | 185 | + // TODO: Should we notify only if it's "remote" event? |
186 | + //notifyDelegate(new FlowRuleEvent(Type.RULE_REMOVE_REQUESTED, rule)); | ||
187 | + return true; | ||
184 | } | 188 | } |
185 | } | 189 | } |
186 | } | 190 | } |
187 | } | 191 | } |
188 | //log.warn("Cannot find rule {}", rule); | 192 | //log.warn("Cannot find rule {}", rule); |
193 | + return false; | ||
189 | } | 194 | } |
190 | 195 | ||
191 | @Override | 196 | @Override | ... | ... |
1 | package org.onlab.onos.store.trivial.impl; | 1 | package org.onlab.onos.store.trivial.impl; |
2 | 2 | ||
3 | -import static org.onlab.onos.net.intent.IntentState.FAILED; | 3 | +import com.google.common.collect.ImmutableSet; |
4 | -import static org.onlab.onos.net.intent.IntentState.INSTALLED; | ||
5 | -import static org.onlab.onos.net.intent.IntentState.SUBMITTED; | ||
6 | -import static org.onlab.onos.net.intent.IntentState.WITHDRAWN; | ||
7 | -import static org.slf4j.LoggerFactory.getLogger; | ||
8 | - | ||
9 | -import java.util.List; | ||
10 | -import java.util.Map; | ||
11 | -import java.util.concurrent.ConcurrentHashMap; | ||
12 | - | ||
13 | import org.apache.felix.scr.annotations.Activate; | 4 | import org.apache.felix.scr.annotations.Activate; |
14 | import org.apache.felix.scr.annotations.Component; | 5 | import org.apache.felix.scr.annotations.Component; |
15 | import org.apache.felix.scr.annotations.Deactivate; | 6 | import org.apache.felix.scr.annotations.Deactivate; |
16 | import org.apache.felix.scr.annotations.Service; | 7 | import org.apache.felix.scr.annotations.Service; |
17 | -import org.onlab.onos.net.intent.InstallableIntent; | ||
18 | import org.onlab.onos.net.intent.Intent; | 8 | import org.onlab.onos.net.intent.Intent; |
19 | import org.onlab.onos.net.intent.IntentEvent; | 9 | import org.onlab.onos.net.intent.IntentEvent; |
20 | import org.onlab.onos.net.intent.IntentId; | 10 | import org.onlab.onos.net.intent.IntentId; |
... | @@ -24,7 +14,12 @@ import org.onlab.onos.net.intent.IntentStoreDelegate; | ... | @@ -24,7 +14,12 @@ import org.onlab.onos.net.intent.IntentStoreDelegate; |
24 | import org.onlab.onos.store.AbstractStore; | 14 | import org.onlab.onos.store.AbstractStore; |
25 | import org.slf4j.Logger; | 15 | import org.slf4j.Logger; |
26 | 16 | ||
27 | -import com.google.common.collect.ImmutableSet; | 17 | +import java.util.List; |
18 | +import java.util.Map; | ||
19 | +import java.util.concurrent.ConcurrentHashMap; | ||
20 | + | ||
21 | +import static org.onlab.onos.net.intent.IntentState.*; | ||
22 | +import static org.slf4j.LoggerFactory.getLogger; | ||
28 | 23 | ||
29 | @Component(immediate = true) | 24 | @Component(immediate = true) |
30 | @Service | 25 | @Service |
... | @@ -35,7 +30,7 @@ public class SimpleIntentStore | ... | @@ -35,7 +30,7 @@ public class SimpleIntentStore |
35 | private final Logger log = getLogger(getClass()); | 30 | private final Logger log = getLogger(getClass()); |
36 | private final Map<IntentId, Intent> intents = new ConcurrentHashMap<>(); | 31 | private final Map<IntentId, Intent> intents = new ConcurrentHashMap<>(); |
37 | private final Map<IntentId, IntentState> states = new ConcurrentHashMap<>(); | 32 | private final Map<IntentId, IntentState> states = new ConcurrentHashMap<>(); |
38 | - private final Map<IntentId, List<InstallableIntent>> installable = | 33 | + private final Map<IntentId, List<Intent>> installable = |
39 | new ConcurrentHashMap<>(); | 34 | new ConcurrentHashMap<>(); |
40 | 35 | ||
41 | @Activate | 36 | @Activate |
... | @@ -96,12 +91,12 @@ public class SimpleIntentStore | ... | @@ -96,12 +91,12 @@ public class SimpleIntentStore |
96 | } | 91 | } |
97 | 92 | ||
98 | @Override | 93 | @Override |
99 | - public void addInstallableIntents(IntentId intentId, List<InstallableIntent> result) { | 94 | + public void addInstallableIntents(IntentId intentId, List<Intent> result) { |
100 | installable.put(intentId, result); | 95 | installable.put(intentId, result); |
101 | } | 96 | } |
102 | 97 | ||
103 | @Override | 98 | @Override |
104 | - public List<InstallableIntent> getInstallableIntents(IntentId intentId) { | 99 | + public List<Intent> getInstallableIntents(IntentId intentId) { |
105 | return installable.get(intentId); | 100 | return installable.get(intentId); |
106 | } | 101 | } |
107 | 102 | ... | ... |
... | @@ -572,7 +572,7 @@ | ... | @@ -572,7 +572,7 @@ |
572 | <group> | 572 | <group> |
573 | <title>Sample Applications</title> | 573 | <title>Sample Applications</title> |
574 | <packages> | 574 | <packages> |
575 | - org.onlab.onos.tvue:org.onlab.onos.fwd:org.onlab.onos.ifwd:org.onlab.onos.mobility:org.onlab.onos.proxyarp:org.onlab.onos.foo:org.onlab.onos.calendar | 575 | + org.onlab.onos.tvue:org.onlab.onos.fwd:org.onlab.onos.ifwd:org.onlab.onos.mobility:org.onlab.onos.proxyarp:org.onlab.onos.foo:org.onlab.onos.calendar:org.onlab.onos.sdnip:org.onlab.onos.sdnip.*:org.onlab.onos.optical:org.onlab.onos.optical.* |
576 | </packages> | 576 | </packages> |
577 | </group> | 577 | </group> |
578 | </groups> | 578 | </groups> | ... | ... |
... | @@ -171,6 +171,7 @@ public final class KryoNamespace implements KryoFactory { | ... | @@ -171,6 +171,7 @@ public final class KryoNamespace implements KryoFactory { |
171 | Kryo kryo = getKryo(); | 171 | Kryo kryo = getKryo(); |
172 | try { | 172 | try { |
173 | kryo.writeClassAndObject(out, obj); | 173 | kryo.writeClassAndObject(out, obj); |
174 | + out.flush(); | ||
174 | return out.toBytes(); | 175 | return out.toBytes(); |
175 | } finally { | 176 | } finally { |
176 | putKryo(kryo); | 177 | putKryo(kryo); |
... | @@ -188,6 +189,7 @@ public final class KryoNamespace implements KryoFactory { | ... | @@ -188,6 +189,7 @@ public final class KryoNamespace implements KryoFactory { |
188 | Kryo kryo = getKryo(); | 189 | Kryo kryo = getKryo(); |
189 | try { | 190 | try { |
190 | kryo.writeClassAndObject(out, obj); | 191 | kryo.writeClassAndObject(out, obj); |
192 | + out.flush(); | ||
191 | } finally { | 193 | } finally { |
192 | putKryo(kryo); | 194 | putKryo(kryo); |
193 | } | 195 | } | ... | ... |
-
Please register or login to post a comment