Pavlin Radoslavov
Committed by Ray Milkey

Changes related to the "LinkCollectionIntent" type of intents

(e.g., Multipoint-to-singlepoint and Singlepoint-to-multipoint)

* Apply the Intent-defined traffic treatment only on the flowmods
  on the ingress switch with ingress inport for a flowmod.
  Previously, the traffic treatments were applied on each switch,
  and semantically it is not the correct (default) behavior.

* Express the flowmods by explicitly specifying the expected inport
  in the matching conditions for each flowmod.
  Previously, the inport was not included in the matching conditions.

[Merge from branch onos-1.0 - manually]

Change-Id: Ic378b6e8be033a70b016f4ba5550d91fe08ddd9a
...@@ -36,16 +36,19 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -36,16 +36,19 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
36 36
37 private final Set<Link> links; 37 private final Set<Link> links;
38 38
39 + private final Set<ConnectPoint> ingressPoints;
39 private final Set<ConnectPoint> egressPoints; 40 private final Set<ConnectPoint> egressPoints;
40 41
41 /** 42 /**
42 - * Creates a new actionable intent capable of funneling the selected traffic 43 + * Creates a new actionable intent capable of funneling the selected
43 - * along the specified convergent tree and out the given egress point. 44 + * traffic along the specified convergent tree and out the given egress
45 + * point.
44 * 46 *
45 * @param appId application identifier 47 * @param appId application identifier
46 * @param selector traffic match 48 * @param selector traffic match
47 * @param treatment action 49 * @param treatment action
48 * @param links traversed links 50 * @param links traversed links
51 + * @param ingressPoint ingress point
49 * @param egressPoint egress point 52 * @param egressPoint egress point
50 * @throws NullPointerException {@code path} is null 53 * @throws NullPointerException {@code path} is null
51 */ 54 */
...@@ -53,19 +56,22 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -53,19 +56,22 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
53 TrafficSelector selector, 56 TrafficSelector selector,
54 TrafficTreatment treatment, 57 TrafficTreatment treatment,
55 Set<Link> links, 58 Set<Link> links,
59 + ConnectPoint ingressPoint,
56 ConnectPoint egressPoint) { 60 ConnectPoint egressPoint) {
57 - this(appId, selector, treatment, links, egressPoint, Collections.emptyList()); 61 + this(appId, selector, treatment, links, ingressPoint, egressPoint,
62 + Collections.emptyList());
58 } 63 }
59 64
60 /** 65 /**
61 * Creates a new actionable intent capable of funneling the selected 66 * Creates a new actionable intent capable of funneling the selected
62 - * traffic along the specified convergent tree and out the given egress point 67 + * traffic along the specified convergent tree and out the given egress
63 - * satisfying the specified constraints. 68 + * point satisfying the specified constraints.
64 * 69 *
65 * @param appId application identifier 70 * @param appId application identifier
66 * @param selector traffic match 71 * @param selector traffic match
67 * @param treatment action 72 * @param treatment action
68 * @param links traversed links 73 * @param links traversed links
74 + * @param ingressPoint ingress point
69 * @param egressPoint egress point 75 * @param egressPoint egress point
70 * @param constraints optional list of constraints 76 * @param constraints optional list of constraints
71 * @throws NullPointerException {@code path} is null 77 * @throws NullPointerException {@code path} is null
...@@ -74,22 +80,26 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -74,22 +80,26 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
74 TrafficSelector selector, 80 TrafficSelector selector,
75 TrafficTreatment treatment, 81 TrafficTreatment treatment,
76 Set<Link> links, 82 Set<Link> links,
83 + ConnectPoint ingressPoint,
77 ConnectPoint egressPoint, 84 ConnectPoint egressPoint,
78 List<Constraint> constraints) { 85 List<Constraint> constraints) {
79 super(appId, resources(links), selector, treatment, constraints); 86 super(appId, resources(links), selector, treatment, constraints);
80 this.links = links; 87 this.links = links;
88 + this.ingressPoints = ImmutableSet.of(ingressPoint);
81 this.egressPoints = ImmutableSet.of(egressPoint); 89 this.egressPoints = ImmutableSet.of(egressPoint);
82 } 90 }
83 91
84 /** 92 /**
85 - * Creates a new actionable intent capable of funneling the selected traffic 93 + * Creates a new actionable intent capable of funneling the selected
86 - * along the specified convergent tree and out the given egress point. 94 + * traffic along the specified convergent tree and out the given egress
95 + * point.
87 * 96 *
88 * @param appId application identifier 97 * @param appId application identifier
89 * @param selector traffic match 98 * @param selector traffic match
90 * @param treatment action 99 * @param treatment action
91 * @param links traversed links 100 * @param links traversed links
92 - * @param egressPoints Set of egress point 101 + * @param ingressPoints Set of ingress points
102 + * @param egressPoints Set of egress points
93 * @param constraints the constraints 103 * @param constraints the constraints
94 * @throws NullPointerException {@code path} is null 104 * @throws NullPointerException {@code path} is null
95 */ 105 */
...@@ -97,11 +107,13 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -97,11 +107,13 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
97 TrafficSelector selector, 107 TrafficSelector selector,
98 TrafficTreatment treatment, 108 TrafficTreatment treatment,
99 Set<Link> links, 109 Set<Link> links,
110 + Set<ConnectPoint> ingressPoints,
100 Set<ConnectPoint> egressPoints, 111 Set<ConnectPoint> egressPoints,
101 List<Constraint> constraints) { 112 List<Constraint> constraints) {
102 super(appId, resources(links), selector, treatment, constraints); 113 super(appId, resources(links), selector, treatment, constraints);
103 114
104 this.links = links; 115 this.links = links;
116 + this.ingressPoints = ImmutableSet.copyOf(ingressPoints);
105 this.egressPoints = ImmutableSet.copyOf(egressPoints); 117 this.egressPoints = ImmutableSet.copyOf(egressPoints);
106 } 118 }
107 119
...@@ -111,6 +123,7 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -111,6 +123,7 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
111 protected LinkCollectionIntent() { 123 protected LinkCollectionIntent() {
112 super(); 124 super();
113 this.links = null; 125 this.links = null;
126 + this.ingressPoints = null;
114 this.egressPoints = null; 127 this.egressPoints = null;
115 } 128 }
116 129
...@@ -125,9 +138,18 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -125,9 +138,18 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
125 } 138 }
126 139
127 /** 140 /**
128 - * Returns the egress point of the intent. 141 + * Returns the ingress points of the intent.
142 + *
143 + * @return the ingress points
144 + */
145 + public Set<ConnectPoint> ingressPoints() {
146 + return ingressPoints;
147 + }
148 +
149 + /**
150 + * Returns the egress points of the intent.
129 * 151 *
130 - * @return the egress point 152 + * @return the egress points
131 */ 153 */
132 public Set<ConnectPoint> egressPoints() { 154 public Set<ConnectPoint> egressPoints() {
133 return egressPoints; 155 return egressPoints;
...@@ -148,6 +170,7 @@ public final class LinkCollectionIntent extends ConnectivityIntent { ...@@ -148,6 +170,7 @@ public final class LinkCollectionIntent extends ConnectivityIntent {
148 .add("selector", selector()) 170 .add("selector", selector())
149 .add("treatment", treatment()) 171 .add("treatment", treatment())
150 .add("links", links()) 172 .add("links", links())
173 + .add("ingress", ingressPoints())
151 .add("egress", egressPoints()) 174 .add("egress", egressPoints())
152 .toString(); 175 .toString();
153 } 176 }
......
...@@ -45,6 +45,7 @@ import static org.onosproject.net.NetTestTools.link; ...@@ -45,6 +45,7 @@ import static org.onosproject.net.NetTestTools.link;
45 */ 45 */
46 public class LinkCollectionIntentTest extends IntentTest { 46 public class LinkCollectionIntentTest extends IntentTest {
47 47
48 + final ConnectPoint ingress = NetTestTools.connectPoint("ingress", 2);
48 final ConnectPoint egress = NetTestTools.connectPoint("egress", 3); 49 final ConnectPoint egress = NetTestTools.connectPoint("egress", 3);
49 final TrafficSelector selector = new IntentTestsMocks.MockSelector(); 50 final TrafficSelector selector = new IntentTestsMocks.MockSelector();
50 final IntentTestsMocks.MockTreatment treatment = new IntentTestsMocks.MockTreatment(); 51 final IntentTestsMocks.MockTreatment treatment = new IntentTestsMocks.MockTreatment();
...@@ -70,6 +71,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -70,6 +71,7 @@ public class LinkCollectionIntentTest extends IntentTest {
70 selector, 71 selector,
71 treatment, 72 treatment,
72 links1, 73 links1,
74 + ingress,
73 egress); 75 egress);
74 76
75 final HashSet<Link> links2 = new HashSet<>(); 77 final HashSet<Link> links2 = new HashSet<>();
...@@ -79,6 +81,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -79,6 +81,7 @@ public class LinkCollectionIntentTest extends IntentTest {
79 selector, 81 selector,
80 treatment, 82 treatment,
81 links2, 83 links2,
84 + ingress,
82 egress); 85 egress);
83 86
84 new EqualsTester() 87 new EqualsTester()
...@@ -99,6 +102,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -99,6 +102,7 @@ public class LinkCollectionIntentTest extends IntentTest {
99 selector, 102 selector,
100 treatment, 103 treatment,
101 links1, 104 links1,
105 + ingress,
102 egress); 106 egress);
103 107
104 final Set<Link> createdLinks = collectionIntent.links(); 108 final Set<Link> createdLinks = collectionIntent.links();
...@@ -106,6 +110,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -106,6 +110,7 @@ public class LinkCollectionIntentTest extends IntentTest {
106 assertThat(collectionIntent.isInstallable(), is(true)); 110 assertThat(collectionIntent.isInstallable(), is(true));
107 assertThat(collectionIntent.treatment(), is(treatment)); 111 assertThat(collectionIntent.treatment(), is(treatment));
108 assertThat(collectionIntent.selector(), is(selector)); 112 assertThat(collectionIntent.selector(), is(selector));
113 + assertThat(collectionIntent.ingressPoints(), is(ImmutableSet.of(ingress)));
109 assertThat(collectionIntent.egressPoints(), is(ImmutableSet.of(egress))); 114 assertThat(collectionIntent.egressPoints(), is(ImmutableSet.of(egress)));
110 assertThat(collectionIntent.resources(), hasSize(1)); 115 assertThat(collectionIntent.resources(), hasSize(1));
111 final List<Constraint> createdConstraints = collectionIntent.constraints(); 116 final List<Constraint> createdConstraints = collectionIntent.constraints();
...@@ -127,6 +132,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -127,6 +132,7 @@ public class LinkCollectionIntentTest extends IntentTest {
127 selector, 132 selector,
128 treatment, 133 treatment,
129 links1, 134 links1,
135 + ingress,
130 egress, 136 egress,
131 constraints); 137 constraints);
132 138
...@@ -135,6 +141,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -135,6 +141,7 @@ public class LinkCollectionIntentTest extends IntentTest {
135 assertThat(collectionIntent.isInstallable(), is(true)); 141 assertThat(collectionIntent.isInstallable(), is(true));
136 assertThat(collectionIntent.treatment(), is(treatment)); 142 assertThat(collectionIntent.treatment(), is(treatment));
137 assertThat(collectionIntent.selector(), is(selector)); 143 assertThat(collectionIntent.selector(), is(selector));
144 + assertThat(collectionIntent.ingressPoints(), is(ImmutableSet.of(ingress)));
138 assertThat(collectionIntent.egressPoints(), is(ImmutableSet.of(egress))); 145 assertThat(collectionIntent.egressPoints(), is(ImmutableSet.of(egress)));
139 146
140 final List<Constraint> createdConstraints = collectionIntent.constraints(); 147 final List<Constraint> createdConstraints = collectionIntent.constraints();
...@@ -156,6 +163,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -156,6 +163,7 @@ public class LinkCollectionIntentTest extends IntentTest {
156 assertThat(collectionIntent.isInstallable(), is(true)); 163 assertThat(collectionIntent.isInstallable(), is(true));
157 assertThat(collectionIntent.treatment(), nullValue()); 164 assertThat(collectionIntent.treatment(), nullValue());
158 assertThat(collectionIntent.selector(), nullValue()); 165 assertThat(collectionIntent.selector(), nullValue());
166 + assertThat(collectionIntent.ingressPoints(), nullValue());
159 assertThat(collectionIntent.egressPoints(), nullValue()); 167 assertThat(collectionIntent.egressPoints(), nullValue());
160 168
161 final List<Constraint> createdConstraints = collectionIntent.constraints(); 169 final List<Constraint> createdConstraints = collectionIntent.constraints();
...@@ -170,6 +178,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -170,6 +178,7 @@ public class LinkCollectionIntentTest extends IntentTest {
170 selector, 178 selector,
171 treatment, 179 treatment,
172 links1, 180 links1,
181 + ingress,
173 egress); 182 egress);
174 } 183 }
175 184
...@@ -181,6 +190,7 @@ public class LinkCollectionIntentTest extends IntentTest { ...@@ -181,6 +190,7 @@ public class LinkCollectionIntentTest extends IntentTest {
181 selector, 190 selector,
182 treatment, 191 treatment,
183 links2, 192 links2,
193 + ingress,
184 egress); 194 egress);
185 } 195 }
186 } 196 }
......
...@@ -43,9 +43,9 @@ import org.onosproject.net.intent.IntentInstaller; ...@@ -43,9 +43,9 @@ import org.onosproject.net.intent.IntentInstaller;
43 import org.onosproject.net.intent.LinkCollectionIntent; 43 import org.onosproject.net.intent.LinkCollectionIntent;
44 44
45 import java.util.Collection; 45 import java.util.Collection;
46 +import java.util.HashSet;
46 import java.util.List; 47 import java.util.List;
47 import java.util.Set; 48 import java.util.Set;
48 -import java.util.stream.Collectors;
49 49
50 /** 50 /**
51 * Installer for {@link org.onosproject.net.intent.LinkCollectionIntent} path 51 * Installer for {@link org.onosproject.net.intent.LinkCollectionIntent} path
...@@ -88,35 +88,29 @@ public class LinkCollectionIntentInstaller ...@@ -88,35 +88,29 @@ public class LinkCollectionIntentInstaller
88 LinkCollectionIntent intent, FlowRuleOperation.Type operation) { 88 LinkCollectionIntent intent, FlowRuleOperation.Type operation) {
89 89
90 //TODO do we need a set here? 90 //TODO do we need a set here?
91 + SetMultimap<DeviceId, PortNumber> inputPorts = HashMultimap.create();
91 SetMultimap<DeviceId, PortNumber> outputPorts = HashMultimap.create(); 92 SetMultimap<DeviceId, PortNumber> outputPorts = HashMultimap.create();
92 93
93 for (Link link : intent.links()) { 94 for (Link link : intent.links()) {
95 + inputPorts.put(link.dst().deviceId(), link.dst().port());
94 outputPorts.put(link.src().deviceId(), link.src().port()); 96 outputPorts.put(link.src().deviceId(), link.src().port());
95 } 97 }
96 98
97 - for (ConnectPoint egressPoint : intent.egressPoints()) { 99 + for (ConnectPoint ingressPoint : intent.ingressPoints()) {
98 - outputPorts.put(egressPoint.deviceId(), egressPoint.port()); 100 + inputPorts.put(ingressPoint.deviceId(), ingressPoint.port());
99 } 101 }
100 102
101 - //FIXME change to new api 103 + for (ConnectPoint egressPoint : intent.egressPoints()) {
102 - /* Fear of streams */ 104 + outputPorts.put(egressPoint.deviceId(), egressPoint.port());
103 - /*
104 - Set<FlowRuleBatchEntry> rules = Sets.newHashSet();
105 - for (DeviceId deviceId : outputPorts.keys()) {
106 - rules.add(createBatchEntry(operation,
107 - intent, deviceId,
108 - outputPorts.get(deviceId)));
109 } 105 }
110 - */
111 106
112 - Set<FlowRuleOperation> rules = 107 + List<FlowRuleOperation> rules = Lists.newArrayList();
113 - outputPorts 108 + outputPorts.keys().stream()
114 - .keys() 109 + .map(deviceId -> createBatchEntries(operation,
115 - .stream() 110 + intent, deviceId,
116 - .map(deviceId -> createBatchEntry(operation, 111 + inputPorts.get(deviceId),
117 - intent, deviceId, 112 + outputPorts.get(deviceId)))
118 - outputPorts.get(deviceId))) 113 + .forEach(rules::addAll);
119 - .collect(Collectors.toSet());
120 114
121 return Lists.newArrayList(ImmutableSet.of(rules)); 115 return Lists.newArrayList(ImmutableSet.of(rules));
122 } 116 }
...@@ -132,35 +126,72 @@ public class LinkCollectionIntentInstaller ...@@ -132,35 +126,72 @@ public class LinkCollectionIntentInstaller
132 } 126 }
133 127
134 /** 128 /**
135 - * Creates a FlowRuleBatchEntry based on the provided parameters. 129 + * Creates a collection of FlowRuleOperation based on the provided
130 + * parameters.
136 * 131 *
137 - * @param operation the FlowRuleOperation to use 132 + * @param operation the FlowRuleOperation type to use
138 * @param intent the link collection intent 133 * @param intent the link collection intent
139 * @param deviceId the device ID for the flow rule 134 * @param deviceId the device ID for the flow rule
135 + * @param inPorts the logical input ports of the flow rule
140 * @param outPorts the set of output ports for the flow rule 136 * @param outPorts the set of output ports for the flow rule
141 - * @return the new flow rule batch entry 137 + * @return a collection with the new flow rule batch entries
142 */ 138 */
143 - private FlowRuleOperation createBatchEntry(FlowRuleOperation.Type operation, 139 + private Collection<FlowRuleOperation> createBatchEntries(
144 - LinkCollectionIntent intent, 140 + FlowRuleOperation.Type operation,
145 - DeviceId deviceId, 141 + LinkCollectionIntent intent,
146 - Set<PortNumber> outPorts) { 142 + DeviceId deviceId,
147 - 143 + Set<PortNumber> inPorts,
148 - TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment 144 + Set<PortNumber> outPorts) {
149 - .builder(intent.treatment()); 145 + Collection<FlowRuleOperation> result = Lists.newLinkedList();
146 + Set<PortNumber> ingressPorts = new HashSet<PortNumber>();
147 +
148 + //
149 + // Collect all ingress ports for this device.
150 + // The intent treatment is applied only on those ports.
151 + //
152 + for (ConnectPoint cp : intent.ingressPoints()) {
153 + if (cp.deviceId().equals(deviceId)) {
154 + ingressPorts.add(cp.port());
155 + }
156 + }
150 157
158 + //
159 + // Create two treatments: one for setting the output ports,
160 + // and a second one that applies the intent treatment and sets the
161 + // output ports.
162 + // NOTE: The second one is created only if there are ingress ports.
163 + //
164 + TrafficTreatment.Builder defaultTreatmentBuilder =
165 + DefaultTrafficTreatment.builder();
151 for (PortNumber outPort : outPorts) { 166 for (PortNumber outPort : outPorts) {
152 - treatmentBuilder.setOutput(outPort); 167 + defaultTreatmentBuilder.setOutput(outPort);
168 + }
169 + TrafficTreatment defaultTreatment = defaultTreatmentBuilder.build();
170 + TrafficTreatment intentTreatment = null;
171 + if (!ingressPorts.isEmpty()) {
172 + TrafficTreatment.Builder intentTreatmentBuilder =
173 + DefaultTrafficTreatment.builder(intent.treatment());
174 + for (PortNumber outPort : outPorts) {
175 + intentTreatmentBuilder.setOutput(outPort);
176 + }
177 + intentTreatment = intentTreatmentBuilder.build();
153 } 178 }
154 - TrafficTreatment treatment = treatmentBuilder.build();
155 -
156 - TrafficSelector selector = DefaultTrafficSelector
157 - .builder(intent.selector()).build();
158 179
159 - FlowRule rule = new DefaultFlowRule(deviceId, 180 + for (PortNumber inPort : inPorts) {
181 + TrafficSelector selector = DefaultTrafficSelector
182 + .builder(intent.selector()).matchInPort(inPort).build();
183 + TrafficTreatment treatment = defaultTreatment;
184 + if (ingressPorts.contains(inPort)) {
185 + // Use the intent treatment if this is ingress port
186 + treatment = intentTreatment;
187 + }
188 + FlowRule rule = new DefaultFlowRule(deviceId,
160 selector, treatment, 123, appId, 189 selector, treatment, 123, appId,
161 new DefaultGroupId((short) (intent.id().fingerprint() & 0xffff)), 190 new DefaultGroupId((short) (intent.id().fingerprint() & 0xffff)),
162 0, true); 191 0, true);
192 + result.add(new FlowRuleOperation(rule, operation));
193 + }
163 194
164 - return new FlowRuleOperation(rule, operation); 195 + return result;
165 } 196 }
166 } 197 }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.net.intent.impl.compiler; 16 package org.onosproject.net.intent.impl.compiler;
17 17
18 import java.util.Arrays; 18 import java.util.Arrays;
19 +import java.util.Collections;
19 import java.util.HashMap; 20 import java.util.HashMap;
20 import java.util.List; 21 import java.util.List;
21 import java.util.Map; 22 import java.util.Map;
...@@ -40,6 +41,7 @@ import org.onosproject.net.intent.impl.PathNotFoundException; ...@@ -40,6 +41,7 @@ import org.onosproject.net.intent.impl.PathNotFoundException;
40 import org.onosproject.net.resource.LinkResourceAllocations; 41 import org.onosproject.net.resource.LinkResourceAllocations;
41 import org.onosproject.net.topology.PathService; 42 import org.onosproject.net.topology.PathService;
42 43
44 +import com.google.common.collect.ImmutableSet;
43 import com.google.common.collect.Sets; 45 import com.google.common.collect.Sets;
44 46
45 /** 47 /**
...@@ -76,8 +78,10 @@ public class MultiPointToSinglePointIntentCompiler ...@@ -76,8 +78,10 @@ public class MultiPointToSinglePointIntentCompiler
76 for (Link link : path.links()) { 78 for (Link link : path.links()) {
77 if (links.containsKey(link.src().deviceId())) { 79 if (links.containsKey(link.src().deviceId())) {
78 // We've already reached the existing tree with the first 80 // We've already reached the existing tree with the first
79 - // part of this path. Don't add the remainder of the path 81 + // part of this path. Add the merging point with different
82 + // incoming port, but don't add the remainder of the path
80 // in case it differs from the path we already have. 83 // in case it differs from the path we already have.
84 + links.put(link.src().deviceId(), link);
81 break; 85 break;
82 } 86 }
83 87
...@@ -87,7 +91,10 @@ public class MultiPointToSinglePointIntentCompiler ...@@ -87,7 +91,10 @@ public class MultiPointToSinglePointIntentCompiler
87 91
88 Intent result = new LinkCollectionIntent(intent.appId(), 92 Intent result = new LinkCollectionIntent(intent.appId(),
89 intent.selector(), intent.treatment(), 93 intent.selector(), intent.treatment(),
90 - Sets.newHashSet(links.values()), intent.egressPoint()); 94 + Sets.newHashSet(links.values()),
95 + intent.ingressPoints(),
96 + ImmutableSet.of(intent.egressPoint()),
97 + Collections.emptyList());
91 return Arrays.asList(result); 98 return Arrays.asList(result);
92 } 99 }
93 100
......
...@@ -33,6 +33,8 @@ import org.onosproject.net.intent.SinglePointToMultiPointIntent; ...@@ -33,6 +33,8 @@ import org.onosproject.net.intent.SinglePointToMultiPointIntent;
33 import org.onosproject.net.provider.ProviderId; 33 import org.onosproject.net.provider.ProviderId;
34 import org.onosproject.net.resource.LinkResourceAllocations; 34 import org.onosproject.net.resource.LinkResourceAllocations;
35 35
36 +import com.google.common.collect.ImmutableSet;
37 +
36 @Component(immediate = true) 38 @Component(immediate = true)
37 public class SinglePointToMultiPointIntentCompiler 39 public class SinglePointToMultiPointIntentCompiler
38 extends ConnectivityIntentCompiler<SinglePointToMultiPointIntent> { 40 extends ConnectivityIntentCompiler<SinglePointToMultiPointIntent> {
...@@ -67,6 +69,7 @@ public class SinglePointToMultiPointIntentCompiler ...@@ -67,6 +69,7 @@ public class SinglePointToMultiPointIntentCompiler
67 Intent result = new LinkCollectionIntent(intent.appId(), 69 Intent result = new LinkCollectionIntent(intent.appId(),
68 intent.selector(), 70 intent.selector(),
69 intent.treatment(), links, 71 intent.treatment(), links,
72 + ImmutableSet.of(intent.ingressPoint()),
70 intent.egressPoints(), Collections.emptyList()); 73 intent.egressPoints(), Collections.emptyList());
71 74
72 return Arrays.asList(result); 75 return Arrays.asList(result);
......