From 5e9a63d4eb92072cd93db2956a98d075de743117 Mon Sep 17 00:00:00 2001 From: Jonathan Hart Date: Tue, 19 May 2015 16:21:46 -0700 Subject: [PATCH] Provision flows on OLT and fabric when we add a vOLT tenant Change-Id: I22a73c6c2c472155408ba109f0d21b5907107857 --- .../OnosXOSIntegrationManager.java | 119 ++++++++++++++++-- .../xosintegration/VoltTenant.java | 18 ++- .../cli/VoltTenantsCreateCommand.java | 8 ++ .../OSGI-INF/blueprint/shell-config.xml | 4 + 4 files changed, 136 insertions(+), 13 deletions(-) diff --git a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java index 9950c33c1b..dccbd4e253 100644 --- a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java +++ b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java @@ -15,11 +15,12 @@ */ package org.onosproject.xosintegration; -import java.util.Dictionary; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Deactivate; @@ -28,19 +29,28 @@ import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; +import org.onlab.packet.VlanId; import org.onlab.util.Tools; import org.onosproject.cfg.ComponentConfigService; import org.onosproject.core.ApplicationId; import org.onosproject.core.CoreService; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.DeviceId; +import org.onosproject.net.PortNumber; +import org.onosproject.net.flow.DefaultTrafficSelector; +import org.onosproject.net.flow.DefaultTrafficTreatment; +import org.onosproject.net.flow.TrafficSelector; +import org.onosproject.net.flow.TrafficTreatment; +import org.onosproject.net.flowobjective.DefaultForwardingObjective; +import org.onosproject.net.flowobjective.FlowObjectiveService; +import org.onosproject.net.flowobjective.ForwardingObjective; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; -import com.eclipsesource.json.JsonArray; -import com.eclipsesource.json.JsonObject; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; +import java.util.Dictionary; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.net.MediaType.JSON_UTF_8; @@ -68,12 +78,26 @@ public class OnosXOSIntegrationManager implements VoltTenantService { private static final String XOS_TENANT_BASE_URI = "/xoslib/volttenant/"; private static final int TEST_XOS_PROVIDER_SERVICE = 1; + private static final DeviceId FABRIC_DEVICE_ID = DeviceId.deviceId("of:5e3e486e73000187"); + private static final PortNumber FABRIC_OLT_CONNECT_POINT = PortNumber.portNumber(2); + private static final PortNumber FABRIC_VCPE_CONNECT_POINT = PortNumber.portNumber(3); + private static final String FABRIC_CONTROLLER_ADDRESS = "10.0.3.136"; + private static final int FABRIC_SERVER_PORT = 8181; + private static final String FABRIC_BASE_URI = "/onos/cordfabric/vlans/add"; + + private static final ConnectPoint FABRIC_PORT = new ConnectPoint( + DeviceId.deviceId("of:000090e2ba82f974"), + PortNumber.portNumber(2)); + private final Logger log = getLogger(getClass()); @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected CoreService coreService; @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected ComponentConfigService cfgService; + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected FlowObjectiveService flowObjectiveService; + @Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME, value = TEST_XOS_SERVER_ADDRESS, label = "XOS Server address") @@ -267,9 +291,16 @@ public class OnosXOSIntegrationManager implements VoltTenantService { .withProviderService(providerServiceId) .withServiceSpecificId(newTenant.serviceSpecificId()) .withVlanId(newTenant.vlanId()) + .withPort(newTenant.port()) .build(); String json = tenantToJson(tenantToCreate); + + provisionDataPlane(tenantToCreate); + postRest(json); + + provisionFabric(VlanId.vlanId(Short.parseShort(newTenant.vlanId()))); + return newTenant; } @@ -284,6 +315,72 @@ public class OnosXOSIntegrationManager implements VoltTenantService { } } + private void provisionDataPlane(VoltTenant tenant) { + VlanId vlan = VlanId.vlanId(Short.parseShort(tenant.vlanId())); + + TrafficSelector fromGateway = DefaultTrafficSelector.builder() + .matchInPhyPort(tenant.port().port()) + .build(); + + TrafficSelector fromFabric = DefaultTrafficSelector.builder() + .matchInPhyPort(FABRIC_PORT.port()) + .matchVlanId(vlan) + .build(); + + TrafficTreatment toFabric = DefaultTrafficTreatment.builder() + .pushVlan() + .setVlanId(vlan) + .setOutput(FABRIC_PORT.port()) + .build(); + + TrafficTreatment toGateway = DefaultTrafficTreatment.builder() + .popVlan() + .setOutput(tenant.port().port()) + .build(); + + ForwardingObjective forwardToFabric = DefaultForwardingObjective.builder() + .withFlag(ForwardingObjective.Flag.VERSATILE) + .withPriority(1000) + .makePermanent() + .fromApp(appId) + .withSelector(fromGateway) + .withTreatment(toFabric) + .add(); + + ForwardingObjective forwardToGateway = DefaultForwardingObjective.builder() + .withFlag(ForwardingObjective.Flag.VERSATILE) + .withPriority(1000) + .makePermanent() + .fromApp(appId) + .withSelector(fromFabric) + .withTreatment(toGateway) + .add(); + + flowObjectiveService.forward(FABRIC_PORT.deviceId(), forwardToFabric); + flowObjectiveService.forward(FABRIC_PORT.deviceId(), forwardToGateway); + } + + private void provisionFabric(VlanId vlanId) { + String json = "{\"vlan\":" + vlanId + ",\"ports\":["; + json += "{\"device\":\"" + FABRIC_DEVICE_ID.toString() + "\",\"port\":\"" + + FABRIC_OLT_CONNECT_POINT.toString() + "\"},"; + json += "{\"device\":\"" + FABRIC_DEVICE_ID.toString() + "\",\"port\":\"" + + FABRIC_VCPE_CONNECT_POINT.toString() + "\"}"; + json += "]}"; + + String baseUrl = "http://" + FABRIC_CONTROLLER_ADDRESS + ":" + + Integer.toString(FABRIC_SERVER_PORT); + Client client = Client.create(); + client.addFilter(new HTTPBasicAuthFilter("padmin@vicci.org", "letmein")); + WebResource resource = client.resource(baseUrl + + FABRIC_BASE_URI); + WebResource.Builder builder = resource.accept(JSON_UTF_8.toString()) + .type(JSON_UTF_8.toString()); + + ClientResponse response = builder.post(ClientResponse.class, json); + + } + /** * Extracts properties from the component configuration context. * diff --git a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java index 18b24e10f0..6685b7ac20 100644 --- a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java +++ b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java @@ -16,6 +16,7 @@ package org.onosproject.xosintegration; import com.google.common.base.MoreObjects; +import org.onosproject.net.ConnectPoint; public final class VoltTenant { @@ -24,6 +25,7 @@ public final class VoltTenant { private final long providerService; private final String serviceSpecificId; private final String vlanId; + private final ConnectPoint port; /** * Constructs a vOLT tenant object. @@ -35,12 +37,13 @@ public final class VoltTenant { * @param vlanId vlan id for the user */ private VoltTenant(String humanReadableName, long id, long providerService, - String serviceSpecificId, String vlanId) { + String serviceSpecificId, String vlanId, ConnectPoint port) { this.humanReadableName = humanReadableName; this.id = id; this.providerService = providerService; this.serviceSpecificId = serviceSpecificId; this.vlanId = vlanId; + this.port = port; } /** @@ -97,6 +100,10 @@ public final class VoltTenant { return vlanId; } + public ConnectPoint port() { + return port; + } + /** * Builder class to allow callers to assemble tenants. */ @@ -107,6 +114,7 @@ public final class VoltTenant { private long providerService = -1; private String serviceSpecificId = "unknown"; private String vlanId = "unknown"; + private ConnectPoint port; /** * Sets the name string for the tenant. @@ -163,6 +171,11 @@ public final class VoltTenant { return this; } + public Builder withPort(ConnectPoint port) { + this.port = port; + return this; + } + /** * Constructs a VoltTenant from the assembled data. * @@ -170,7 +183,7 @@ public final class VoltTenant { */ public VoltTenant build() { return new VoltTenant(humanReadableName, id, providerService, - serviceSpecificId, vlanId); + serviceSpecificId, vlanId, port); } } @@ -182,6 +195,7 @@ public final class VoltTenant { .add("providerService", providerService()) .add("serviceSpecificId", serviceSpecificId()) .add("vlanId", vlanId()) + .add("port", port()) .toString(); } diff --git a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java index 611446d3e8..3a5b094ca6 100644 --- a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java +++ b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java @@ -18,6 +18,7 @@ package org.onosproject.xosintegration.cli; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.onosproject.cli.AbstractShellCommand; +import org.onosproject.net.ConnectPoint; import org.onosproject.xosintegration.VoltTenant; import org.onosproject.xosintegration.VoltTenantService; @@ -38,6 +39,11 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand { required = true, multiValued = false) String vlanId; + @Argument(index = 2, name = "port", + description = "Port", + required = true, multiValued = false) + String port; + @Override protected void execute() { VoltTenantService service = get(VoltTenantService.class); @@ -45,7 +51,9 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand { VoltTenant newTenant = VoltTenant.builder() .withServiceSpecificId(serviceSpecificId) .withVlanId(vlanId) + .withPort(ConnectPoint.deviceConnectPoint(port)) .build(); + service.addTenant(newTenant); } } diff --git a/apps/xos-integration/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/xos-integration/src/main/resources/OSGI-INF/blueprint/shell-config.xml index 9c951178e2..92fca627fd 100644 --- a/apps/xos-integration/src/main/resources/OSGI-INF/blueprint/shell-config.xml +++ b/apps/xos-integration/src/main/resources/OSGI-INF/blueprint/shell-config.xml @@ -29,9 +29,13 @@ + + + +