Jonathan Hart
Committed by Gerrit Code Review

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

Change-Id: I22a73c6c2c472155408ba109f0d21b5907107857
......@@ -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.
*
......
......@@ -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();
}
......
......@@ -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);
}
}
......
......@@ -29,9 +29,13 @@
<action class="org.onosproject.xosintegration.cli.VoltRemoveTenantCommand"/>
<completers>
<ref component-id="tenantIdCompleter"/>
<ref component-id="placeholderCompleter"/>
<ref component-id="connectPointCompleter"/>
<null/>
</completers>
</command>
</command-bundle>
<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>
......