Committed by
Gerrit Code Review
Provision flows on OLT and fabric when we add a vOLT tenant
Change-Id: I22a73c6c2c472155408ba109f0d21b5907107857
Showing
4 changed files
with
136 additions
and
13 deletions
... | @@ -15,11 +15,12 @@ | ... | @@ -15,11 +15,12 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.xosintegration; | 16 | package org.onosproject.xosintegration; |
17 | 17 | ||
18 | -import java.util.Dictionary; | 18 | +import com.eclipsesource.json.JsonArray; |
19 | -import java.util.Set; | 19 | +import com.eclipsesource.json.JsonObject; |
20 | -import java.util.stream.Collectors; | 20 | +import com.sun.jersey.api.client.Client; |
21 | -import java.util.stream.IntStream; | 21 | +import com.sun.jersey.api.client.ClientResponse; |
22 | - | 22 | +import com.sun.jersey.api.client.WebResource; |
23 | +import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; | ||
23 | import org.apache.felix.scr.annotations.Activate; | 24 | import org.apache.felix.scr.annotations.Activate; |
24 | import org.apache.felix.scr.annotations.Component; | 25 | import org.apache.felix.scr.annotations.Component; |
25 | import org.apache.felix.scr.annotations.Deactivate; | 26 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -28,19 +29,28 @@ import org.apache.felix.scr.annotations.Property; | ... | @@ -28,19 +29,28 @@ import org.apache.felix.scr.annotations.Property; |
28 | import org.apache.felix.scr.annotations.Reference; | 29 | import org.apache.felix.scr.annotations.Reference; |
29 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 30 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
30 | import org.apache.felix.scr.annotations.Service; | 31 | import org.apache.felix.scr.annotations.Service; |
32 | +import org.onlab.packet.VlanId; | ||
31 | import org.onlab.util.Tools; | 33 | import org.onlab.util.Tools; |
32 | import org.onosproject.cfg.ComponentConfigService; | 34 | import org.onosproject.cfg.ComponentConfigService; |
33 | import org.onosproject.core.ApplicationId; | 35 | import org.onosproject.core.ApplicationId; |
34 | import org.onosproject.core.CoreService; | 36 | import org.onosproject.core.CoreService; |
37 | +import org.onosproject.net.ConnectPoint; | ||
38 | +import org.onosproject.net.DeviceId; | ||
39 | +import org.onosproject.net.PortNumber; | ||
40 | +import org.onosproject.net.flow.DefaultTrafficSelector; | ||
41 | +import org.onosproject.net.flow.DefaultTrafficTreatment; | ||
42 | +import org.onosproject.net.flow.TrafficSelector; | ||
43 | +import org.onosproject.net.flow.TrafficTreatment; | ||
44 | +import org.onosproject.net.flowobjective.DefaultForwardingObjective; | ||
45 | +import org.onosproject.net.flowobjective.FlowObjectiveService; | ||
46 | +import org.onosproject.net.flowobjective.ForwardingObjective; | ||
35 | import org.osgi.service.component.ComponentContext; | 47 | import org.osgi.service.component.ComponentContext; |
36 | import org.slf4j.Logger; | 48 | import org.slf4j.Logger; |
37 | 49 | ||
38 | -import com.eclipsesource.json.JsonArray; | 50 | +import java.util.Dictionary; |
39 | -import com.eclipsesource.json.JsonObject; | 51 | +import java.util.Set; |
40 | -import com.sun.jersey.api.client.Client; | 52 | +import java.util.stream.Collectors; |
41 | -import com.sun.jersey.api.client.ClientResponse; | 53 | +import java.util.stream.IntStream; |
42 | -import com.sun.jersey.api.client.WebResource; | ||
43 | -import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; | ||
44 | 54 | ||
45 | import static com.google.common.base.Strings.isNullOrEmpty; | 55 | import static com.google.common.base.Strings.isNullOrEmpty; |
46 | import static com.google.common.net.MediaType.JSON_UTF_8; | 56 | import static com.google.common.net.MediaType.JSON_UTF_8; |
... | @@ -68,12 +78,26 @@ public class OnosXOSIntegrationManager implements VoltTenantService { | ... | @@ -68,12 +78,26 @@ public class OnosXOSIntegrationManager implements VoltTenantService { |
68 | private static final String XOS_TENANT_BASE_URI = "/xoslib/volttenant/"; | 78 | private static final String XOS_TENANT_BASE_URI = "/xoslib/volttenant/"; |
69 | private static final int TEST_XOS_PROVIDER_SERVICE = 1; | 79 | private static final int TEST_XOS_PROVIDER_SERVICE = 1; |
70 | 80 | ||
81 | + private static final DeviceId FABRIC_DEVICE_ID = DeviceId.deviceId("of:5e3e486e73000187"); | ||
82 | + private static final PortNumber FABRIC_OLT_CONNECT_POINT = PortNumber.portNumber(2); | ||
83 | + private static final PortNumber FABRIC_VCPE_CONNECT_POINT = PortNumber.portNumber(3); | ||
84 | + private static final String FABRIC_CONTROLLER_ADDRESS = "10.0.3.136"; | ||
85 | + private static final int FABRIC_SERVER_PORT = 8181; | ||
86 | + private static final String FABRIC_BASE_URI = "/onos/cordfabric/vlans/add"; | ||
87 | + | ||
88 | + private static final ConnectPoint FABRIC_PORT = new ConnectPoint( | ||
89 | + DeviceId.deviceId("of:000090e2ba82f974"), | ||
90 | + PortNumber.portNumber(2)); | ||
91 | + | ||
71 | private final Logger log = getLogger(getClass()); | 92 | private final Logger log = getLogger(getClass()); |
72 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 93 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
73 | protected CoreService coreService; | 94 | protected CoreService coreService; |
74 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 95 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
75 | protected ComponentConfigService cfgService; | 96 | protected ComponentConfigService cfgService; |
76 | 97 | ||
98 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
99 | + protected FlowObjectiveService flowObjectiveService; | ||
100 | + | ||
77 | @Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME, | 101 | @Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME, |
78 | value = TEST_XOS_SERVER_ADDRESS, | 102 | value = TEST_XOS_SERVER_ADDRESS, |
79 | label = "XOS Server address") | 103 | label = "XOS Server address") |
... | @@ -267,9 +291,16 @@ public class OnosXOSIntegrationManager implements VoltTenantService { | ... | @@ -267,9 +291,16 @@ public class OnosXOSIntegrationManager implements VoltTenantService { |
267 | .withProviderService(providerServiceId) | 291 | .withProviderService(providerServiceId) |
268 | .withServiceSpecificId(newTenant.serviceSpecificId()) | 292 | .withServiceSpecificId(newTenant.serviceSpecificId()) |
269 | .withVlanId(newTenant.vlanId()) | 293 | .withVlanId(newTenant.vlanId()) |
294 | + .withPort(newTenant.port()) | ||
270 | .build(); | 295 | .build(); |
271 | String json = tenantToJson(tenantToCreate); | 296 | String json = tenantToJson(tenantToCreate); |
297 | + | ||
298 | + provisionDataPlane(tenantToCreate); | ||
299 | + | ||
272 | postRest(json); | 300 | postRest(json); |
301 | + | ||
302 | + provisionFabric(VlanId.vlanId(Short.parseShort(newTenant.vlanId()))); | ||
303 | + | ||
273 | return newTenant; | 304 | return newTenant; |
274 | } | 305 | } |
275 | 306 | ||
... | @@ -284,6 +315,72 @@ public class OnosXOSIntegrationManager implements VoltTenantService { | ... | @@ -284,6 +315,72 @@ public class OnosXOSIntegrationManager implements VoltTenantService { |
284 | } | 315 | } |
285 | } | 316 | } |
286 | 317 | ||
318 | + private void provisionDataPlane(VoltTenant tenant) { | ||
319 | + VlanId vlan = VlanId.vlanId(Short.parseShort(tenant.vlanId())); | ||
320 | + | ||
321 | + TrafficSelector fromGateway = DefaultTrafficSelector.builder() | ||
322 | + .matchInPhyPort(tenant.port().port()) | ||
323 | + .build(); | ||
324 | + | ||
325 | + TrafficSelector fromFabric = DefaultTrafficSelector.builder() | ||
326 | + .matchInPhyPort(FABRIC_PORT.port()) | ||
327 | + .matchVlanId(vlan) | ||
328 | + .build(); | ||
329 | + | ||
330 | + TrafficTreatment toFabric = DefaultTrafficTreatment.builder() | ||
331 | + .pushVlan() | ||
332 | + .setVlanId(vlan) | ||
333 | + .setOutput(FABRIC_PORT.port()) | ||
334 | + .build(); | ||
335 | + | ||
336 | + TrafficTreatment toGateway = DefaultTrafficTreatment.builder() | ||
337 | + .popVlan() | ||
338 | + .setOutput(tenant.port().port()) | ||
339 | + .build(); | ||
340 | + | ||
341 | + ForwardingObjective forwardToFabric = DefaultForwardingObjective.builder() | ||
342 | + .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
343 | + .withPriority(1000) | ||
344 | + .makePermanent() | ||
345 | + .fromApp(appId) | ||
346 | + .withSelector(fromGateway) | ||
347 | + .withTreatment(toFabric) | ||
348 | + .add(); | ||
349 | + | ||
350 | + ForwardingObjective forwardToGateway = DefaultForwardingObjective.builder() | ||
351 | + .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
352 | + .withPriority(1000) | ||
353 | + .makePermanent() | ||
354 | + .fromApp(appId) | ||
355 | + .withSelector(fromFabric) | ||
356 | + .withTreatment(toGateway) | ||
357 | + .add(); | ||
358 | + | ||
359 | + flowObjectiveService.forward(FABRIC_PORT.deviceId(), forwardToFabric); | ||
360 | + flowObjectiveService.forward(FABRIC_PORT.deviceId(), forwardToGateway); | ||
361 | + } | ||
362 | + | ||
363 | + private void provisionFabric(VlanId vlanId) { | ||
364 | + String json = "{\"vlan\":" + vlanId + ",\"ports\":["; | ||
365 | + json += "{\"device\":\"" + FABRIC_DEVICE_ID.toString() + "\",\"port\":\"" | ||
366 | + + FABRIC_OLT_CONNECT_POINT.toString() + "\"},"; | ||
367 | + json += "{\"device\":\"" + FABRIC_DEVICE_ID.toString() + "\",\"port\":\"" | ||
368 | + + FABRIC_VCPE_CONNECT_POINT.toString() + "\"}"; | ||
369 | + json += "]}"; | ||
370 | + | ||
371 | + String baseUrl = "http://" + FABRIC_CONTROLLER_ADDRESS + ":" | ||
372 | + + Integer.toString(FABRIC_SERVER_PORT); | ||
373 | + Client client = Client.create(); | ||
374 | + client.addFilter(new HTTPBasicAuthFilter("padmin@vicci.org", "letmein")); | ||
375 | + WebResource resource = client.resource(baseUrl | ||
376 | + + FABRIC_BASE_URI); | ||
377 | + WebResource.Builder builder = resource.accept(JSON_UTF_8.toString()) | ||
378 | + .type(JSON_UTF_8.toString()); | ||
379 | + | ||
380 | + ClientResponse response = builder.post(ClientResponse.class, json); | ||
381 | + | ||
382 | + } | ||
383 | + | ||
287 | /** | 384 | /** |
288 | * Extracts properties from the component configuration context. | 385 | * Extracts properties from the component configuration context. |
289 | * | 386 | * | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.xosintegration; | 16 | package org.onosproject.xosintegration; |
17 | 17 | ||
18 | import com.google.common.base.MoreObjects; | 18 | import com.google.common.base.MoreObjects; |
19 | +import org.onosproject.net.ConnectPoint; | ||
19 | 20 | ||
20 | public final class VoltTenant { | 21 | public final class VoltTenant { |
21 | 22 | ||
... | @@ -24,6 +25,7 @@ public final class VoltTenant { | ... | @@ -24,6 +25,7 @@ public final class VoltTenant { |
24 | private final long providerService; | 25 | private final long providerService; |
25 | private final String serviceSpecificId; | 26 | private final String serviceSpecificId; |
26 | private final String vlanId; | 27 | private final String vlanId; |
28 | + private final ConnectPoint port; | ||
27 | 29 | ||
28 | /** | 30 | /** |
29 | * Constructs a vOLT tenant object. | 31 | * Constructs a vOLT tenant object. |
... | @@ -35,12 +37,13 @@ public final class VoltTenant { | ... | @@ -35,12 +37,13 @@ public final class VoltTenant { |
35 | * @param vlanId vlan id for the user | 37 | * @param vlanId vlan id for the user |
36 | */ | 38 | */ |
37 | private VoltTenant(String humanReadableName, long id, long providerService, | 39 | private VoltTenant(String humanReadableName, long id, long providerService, |
38 | - String serviceSpecificId, String vlanId) { | 40 | + String serviceSpecificId, String vlanId, ConnectPoint port) { |
39 | this.humanReadableName = humanReadableName; | 41 | this.humanReadableName = humanReadableName; |
40 | this.id = id; | 42 | this.id = id; |
41 | this.providerService = providerService; | 43 | this.providerService = providerService; |
42 | this.serviceSpecificId = serviceSpecificId; | 44 | this.serviceSpecificId = serviceSpecificId; |
43 | this.vlanId = vlanId; | 45 | this.vlanId = vlanId; |
46 | + this.port = port; | ||
44 | } | 47 | } |
45 | 48 | ||
46 | /** | 49 | /** |
... | @@ -97,6 +100,10 @@ public final class VoltTenant { | ... | @@ -97,6 +100,10 @@ public final class VoltTenant { |
97 | return vlanId; | 100 | return vlanId; |
98 | } | 101 | } |
99 | 102 | ||
103 | + public ConnectPoint port() { | ||
104 | + return port; | ||
105 | + } | ||
106 | + | ||
100 | /** | 107 | /** |
101 | * Builder class to allow callers to assemble tenants. | 108 | * Builder class to allow callers to assemble tenants. |
102 | */ | 109 | */ |
... | @@ -107,6 +114,7 @@ public final class VoltTenant { | ... | @@ -107,6 +114,7 @@ public final class VoltTenant { |
107 | private long providerService = -1; | 114 | private long providerService = -1; |
108 | private String serviceSpecificId = "unknown"; | 115 | private String serviceSpecificId = "unknown"; |
109 | private String vlanId = "unknown"; | 116 | private String vlanId = "unknown"; |
117 | + private ConnectPoint port; | ||
110 | 118 | ||
111 | /** | 119 | /** |
112 | * Sets the name string for the tenant. | 120 | * Sets the name string for the tenant. |
... | @@ -163,6 +171,11 @@ public final class VoltTenant { | ... | @@ -163,6 +171,11 @@ public final class VoltTenant { |
163 | return this; | 171 | return this; |
164 | } | 172 | } |
165 | 173 | ||
174 | + public Builder withPort(ConnectPoint port) { | ||
175 | + this.port = port; | ||
176 | + return this; | ||
177 | + } | ||
178 | + | ||
166 | /** | 179 | /** |
167 | * Constructs a VoltTenant from the assembled data. | 180 | * Constructs a VoltTenant from the assembled data. |
168 | * | 181 | * |
... | @@ -170,7 +183,7 @@ public final class VoltTenant { | ... | @@ -170,7 +183,7 @@ public final class VoltTenant { |
170 | */ | 183 | */ |
171 | public VoltTenant build() { | 184 | public VoltTenant build() { |
172 | return new VoltTenant(humanReadableName, id, providerService, | 185 | return new VoltTenant(humanReadableName, id, providerService, |
173 | - serviceSpecificId, vlanId); | 186 | + serviceSpecificId, vlanId, port); |
174 | } | 187 | } |
175 | } | 188 | } |
176 | 189 | ||
... | @@ -182,6 +195,7 @@ public final class VoltTenant { | ... | @@ -182,6 +195,7 @@ public final class VoltTenant { |
182 | .add("providerService", providerService()) | 195 | .add("providerService", providerService()) |
183 | .add("serviceSpecificId", serviceSpecificId()) | 196 | .add("serviceSpecificId", serviceSpecificId()) |
184 | .add("vlanId", vlanId()) | 197 | .add("vlanId", vlanId()) |
198 | + .add("port", port()) | ||
185 | .toString(); | 199 | .toString(); |
186 | } | 200 | } |
187 | 201 | ... | ... |
... | @@ -18,6 +18,7 @@ package org.onosproject.xosintegration.cli; | ... | @@ -18,6 +18,7 @@ package org.onosproject.xosintegration.cli; |
18 | import org.apache.karaf.shell.commands.Argument; | 18 | import org.apache.karaf.shell.commands.Argument; |
19 | import org.apache.karaf.shell.commands.Command; | 19 | import org.apache.karaf.shell.commands.Command; |
20 | import org.onosproject.cli.AbstractShellCommand; | 20 | import org.onosproject.cli.AbstractShellCommand; |
21 | +import org.onosproject.net.ConnectPoint; | ||
21 | import org.onosproject.xosintegration.VoltTenant; | 22 | import org.onosproject.xosintegration.VoltTenant; |
22 | import org.onosproject.xosintegration.VoltTenantService; | 23 | import org.onosproject.xosintegration.VoltTenantService; |
23 | 24 | ||
... | @@ -38,6 +39,11 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand { | ... | @@ -38,6 +39,11 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand { |
38 | required = true, multiValued = false) | 39 | required = true, multiValued = false) |
39 | String vlanId; | 40 | String vlanId; |
40 | 41 | ||
42 | + @Argument(index = 2, name = "port", | ||
43 | + description = "Port", | ||
44 | + required = true, multiValued = false) | ||
45 | + String port; | ||
46 | + | ||
41 | @Override | 47 | @Override |
42 | protected void execute() { | 48 | protected void execute() { |
43 | VoltTenantService service = get(VoltTenantService.class); | 49 | VoltTenantService service = get(VoltTenantService.class); |
... | @@ -45,7 +51,9 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand { | ... | @@ -45,7 +51,9 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand { |
45 | VoltTenant newTenant = VoltTenant.builder() | 51 | VoltTenant newTenant = VoltTenant.builder() |
46 | .withServiceSpecificId(serviceSpecificId) | 52 | .withServiceSpecificId(serviceSpecificId) |
47 | .withVlanId(vlanId) | 53 | .withVlanId(vlanId) |
54 | + .withPort(ConnectPoint.deviceConnectPoint(port)) | ||
48 | .build(); | 55 | .build(); |
56 | + | ||
49 | service.addTenant(newTenant); | 57 | service.addTenant(newTenant); |
50 | } | 58 | } |
51 | } | 59 | } | ... | ... |
... | @@ -29,9 +29,13 @@ | ... | @@ -29,9 +29,13 @@ |
29 | <action class="org.onosproject.xosintegration.cli.VoltRemoveTenantCommand"/> | 29 | <action class="org.onosproject.xosintegration.cli.VoltRemoveTenantCommand"/> |
30 | <completers> | 30 | <completers> |
31 | <ref component-id="tenantIdCompleter"/> | 31 | <ref component-id="tenantIdCompleter"/> |
32 | + <ref component-id="placeholderCompleter"/> | ||
33 | + <ref component-id="connectPointCompleter"/> | ||
32 | <null/> | 34 | <null/> |
33 | </completers> | 35 | </completers> |
34 | </command> | 36 | </command> |
35 | </command-bundle> | 37 | </command-bundle> |
36 | <bean id="tenantIdCompleter" class="org.onosproject.xosintegration.cli.TenantIdCompleter"/> | 38 | <bean id="tenantIdCompleter" class="org.onosproject.xosintegration.cli.TenantIdCompleter"/> |
39 | + <bean id="placeholderCompleter" class="org.onosproject.cli.PlaceholderCompleter"/> | ||
40 | + <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/> | ||
37 | </blueprint> | 41 | </blueprint> | ... | ... |
-
Please register or login to post a comment