Provision flows on OLT and fabric when we add a vOLT tenant

Change-Id: I22a73c6c2c472155408ba109f0d21b5907107857
This commit is contained in:
Jonathan Hart 2015-05-19 16:21:46 -07:00 committed by Gerrit Code Review
parent d8697235da
commit 5e9a63d4eb
4 changed files with 136 additions and 13 deletions

View File

@ -15,11 +15,12 @@
*/ */
package org.onosproject.xosintegration; package org.onosproject.xosintegration;
import java.util.Dictionary; import com.eclipsesource.json.JsonArray;
import java.util.Set; import com.eclipsesource.json.JsonObject;
import java.util.stream.Collectors; import com.sun.jersey.api.client.Client;
import java.util.stream.IntStream; 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.Activate;
import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate; 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.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service; import org.apache.felix.scr.annotations.Service;
import org.onlab.packet.VlanId;
import org.onlab.util.Tools; import org.onlab.util.Tools;
import org.onosproject.cfg.ComponentConfigService; import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.core.ApplicationId; import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService; 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.osgi.service.component.ComponentContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import com.eclipsesource.json.JsonArray; import java.util.Dictionary;
import com.eclipsesource.json.JsonObject; import java.util.Set;
import com.sun.jersey.api.client.Client; import java.util.stream.Collectors;
import com.sun.jersey.api.client.ClientResponse; import java.util.stream.IntStream;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.base.Strings.isNullOrEmpty;
import static com.google.common.net.MediaType.JSON_UTF_8; 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 String XOS_TENANT_BASE_URI = "/xoslib/volttenant/";
private static final int TEST_XOS_PROVIDER_SERVICE = 1; 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()); private final Logger log = getLogger(getClass());
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService; protected CoreService coreService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ComponentConfigService cfgService; protected ComponentConfigService cfgService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected FlowObjectiveService flowObjectiveService;
@Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME, @Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME,
value = TEST_XOS_SERVER_ADDRESS, value = TEST_XOS_SERVER_ADDRESS,
label = "XOS Server address") label = "XOS Server address")
@ -267,9 +291,16 @@ public class OnosXOSIntegrationManager implements VoltTenantService {
.withProviderService(providerServiceId) .withProviderService(providerServiceId)
.withServiceSpecificId(newTenant.serviceSpecificId()) .withServiceSpecificId(newTenant.serviceSpecificId())
.withVlanId(newTenant.vlanId()) .withVlanId(newTenant.vlanId())
.withPort(newTenant.port())
.build(); .build();
String json = tenantToJson(tenantToCreate); String json = tenantToJson(tenantToCreate);
provisionDataPlane(tenantToCreate);
postRest(json); postRest(json);
provisionFabric(VlanId.vlanId(Short.parseShort(newTenant.vlanId())));
return newTenant; 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. * Extracts properties from the component configuration context.
* *

View File

@ -16,6 +16,7 @@
package org.onosproject.xosintegration; package org.onosproject.xosintegration;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import org.onosproject.net.ConnectPoint;
public final class VoltTenant { public final class VoltTenant {
@ -24,6 +25,7 @@ public final class VoltTenant {
private final long providerService; private final long providerService;
private final String serviceSpecificId; private final String serviceSpecificId;
private final String vlanId; private final String vlanId;
private final ConnectPoint port;
/** /**
* Constructs a vOLT tenant object. * Constructs a vOLT tenant object.
@ -35,12 +37,13 @@ public final class VoltTenant {
* @param vlanId vlan id for the user * @param vlanId vlan id for the user
*/ */
private VoltTenant(String humanReadableName, long id, long providerService, private VoltTenant(String humanReadableName, long id, long providerService,
String serviceSpecificId, String vlanId) { String serviceSpecificId, String vlanId, ConnectPoint port) {
this.humanReadableName = humanReadableName; this.humanReadableName = humanReadableName;
this.id = id; this.id = id;
this.providerService = providerService; this.providerService = providerService;
this.serviceSpecificId = serviceSpecificId; this.serviceSpecificId = serviceSpecificId;
this.vlanId = vlanId; this.vlanId = vlanId;
this.port = port;
} }
/** /**
@ -97,6 +100,10 @@ public final class VoltTenant {
return vlanId; return vlanId;
} }
public ConnectPoint port() {
return port;
}
/** /**
* Builder class to allow callers to assemble tenants. * Builder class to allow callers to assemble tenants.
*/ */
@ -107,6 +114,7 @@ public final class VoltTenant {
private long providerService = -1; private long providerService = -1;
private String serviceSpecificId = "unknown"; private String serviceSpecificId = "unknown";
private String vlanId = "unknown"; private String vlanId = "unknown";
private ConnectPoint port;
/** /**
* Sets the name string for the tenant. * Sets the name string for the tenant.
@ -163,6 +171,11 @@ public final class VoltTenant {
return this; return this;
} }
public Builder withPort(ConnectPoint port) {
this.port = port;
return this;
}
/** /**
* Constructs a VoltTenant from the assembled data. * Constructs a VoltTenant from the assembled data.
* *
@ -170,7 +183,7 @@ public final class VoltTenant {
*/ */
public VoltTenant build() { public VoltTenant build() {
return new VoltTenant(humanReadableName, id, providerService, return new VoltTenant(humanReadableName, id, providerService,
serviceSpecificId, vlanId); serviceSpecificId, vlanId, port);
} }
} }
@ -182,6 +195,7 @@ public final class VoltTenant {
.add("providerService", providerService()) .add("providerService", providerService())
.add("serviceSpecificId", serviceSpecificId()) .add("serviceSpecificId", serviceSpecificId())
.add("vlanId", vlanId()) .add("vlanId", vlanId())
.add("port", port())
.toString(); .toString();
} }

View File

@ -18,6 +18,7 @@ package org.onosproject.xosintegration.cli;
import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand; import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.net.ConnectPoint;
import org.onosproject.xosintegration.VoltTenant; import org.onosproject.xosintegration.VoltTenant;
import org.onosproject.xosintegration.VoltTenantService; import org.onosproject.xosintegration.VoltTenantService;
@ -38,6 +39,11 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand {
required = true, multiValued = false) required = true, multiValued = false)
String vlanId; String vlanId;
@Argument(index = 2, name = "port",
description = "Port",
required = true, multiValued = false)
String port;
@Override @Override
protected void execute() { protected void execute() {
VoltTenantService service = get(VoltTenantService.class); VoltTenantService service = get(VoltTenantService.class);
@ -45,7 +51,9 @@ public class VoltTenantsCreateCommand extends AbstractShellCommand {
VoltTenant newTenant = VoltTenant.builder() VoltTenant newTenant = VoltTenant.builder()
.withServiceSpecificId(serviceSpecificId) .withServiceSpecificId(serviceSpecificId)
.withVlanId(vlanId) .withVlanId(vlanId)
.withPort(ConnectPoint.deviceConnectPoint(port))
.build(); .build();
service.addTenant(newTenant); service.addTenant(newTenant);
} }
} }

View File

@ -29,9 +29,13 @@
<action class="org.onosproject.xosintegration.cli.VoltRemoveTenantCommand"/> <action class="org.onosproject.xosintegration.cli.VoltRemoveTenantCommand"/>
<completers> <completers>
<ref component-id="tenantIdCompleter"/> <ref component-id="tenantIdCompleter"/>
<ref component-id="placeholderCompleter"/>
<ref component-id="connectPointCompleter"/>
<null/> <null/>
</completers> </completers>
</command> </command>
</command-bundle> </command-bundle>
<bean id="tenantIdCompleter" class="org.onosproject.xosintegration.cli.TenantIdCompleter"/> <bean id="tenantIdCompleter" class="org.onosproject.xosintegration.cli.TenantIdCompleter"/>
<bean id="placeholderCompleter" class="org.onosproject.cli.PlaceholderCompleter"/>
<bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
</blueprint> </blueprint>