use of org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction in project netvirt by opendaylight.
the class NeutronPortChainListener method processPortChain.
private void processPortChain(PortChain newPortChain) {
// List of Port Pair Group attached to the Port Chain
List<PortPairGroup> portPairGroupList = new ArrayList<>();
// Port Pair Group and associated Port Pair
Map<Uuid, List<PortPair>> groupPortPairsList = new HashMap<>();
List<ServiceFunction> portChainServiceFunctionList = new ArrayList<>();
// Read chain related port pair group from neutron data store
for (Uuid ppgUuid : newPortChain.getPortPairGroups()) {
PortPairGroup ppg = neutronMdsalHelper.getNeutronPortPairGroup(ppgUuid);
if (ppg != null) {
List<PortPair> portPairList = new ArrayList<>();
portPairGroupList.add(ppg);
for (Uuid ppUuid : ppg.getPortPairs()) {
PortPair pp = neutronMdsalHelper.getNeutronPortPair(ppUuid);
if (pp == null) {
LOG.error("Port pair {} does not exist in the neutron data store", ppUuid);
return;
}
portPairList.add(pp);
}
groupPortPairsList.put(ppgUuid, portPairList);
}
}
// For each port pair group
for (PortPairGroup ppg : portPairGroupList) {
List<PortPair> portPairList = groupPortPairsList.get(ppg.getUuid());
// Generate all the SF and write it to SFC data store
for (PortPair portPair : portPairList) {
// Build the service function for the given port pair.
ServiceFunction serviceFunction = PortPairTranslator.buildServiceFunction(portPair, ppg);
portChainServiceFunctionList.add(serviceFunction);
// Write the Service Function to SFC data store.
LOG.info("Add Service Function {} for Port Pair {}", serviceFunction, portPair);
sfcMdsalHelper.addServiceFunction(serviceFunction);
}
// Build the SFF Builder from port pair group
ServiceFunctionForwarder serviceFunctionForwarder;
serviceFunctionForwarder = PortPairGroupTranslator.buildServiceFunctionForwarder(ppg, portPairList);
// Send SFF create request
LOG.info("Update Service Function Forwarder with {} for Port Pair Group {}", serviceFunctionForwarder, ppg);
sfcMdsalHelper.updateServiceFunctionForwarder(serviceFunctionForwarder);
}
// Build Service Function Chain Builder
ServiceFunctionChain sfc = PortChainTranslator.buildServiceFunctionChain(newPortChain, portChainServiceFunctionList);
// Write SFC to data store
if (sfc == null) {
LOG.warn("Service Function Chain building failed for Port Chain {}", newPortChain);
return;
}
LOG.info("Add service function chain {}", sfc);
sfcMdsalHelper.addServiceFunctionChain(sfc);
// Build Service Function Path Builder
ServiceFunctionPath sfp = PortChainTranslator.buildServiceFunctionPath(sfc);
// Write SFP to data store
LOG.info("Add service function path {}", sfp);
sfcMdsalHelper.addServiceFunctionPath(sfp);
// The RSP will automatically be created from the SFP added above.
// Add ACLs from flow classifiers
processFlowClassifiers(newPortChain, newPortChain.getFlowClassifiers(), sfp.getName().getValue());
}
use of org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction in project netvirt by opendaylight.
the class PortChainTranslator method buildServiceFunctionChain.
public static ServiceFunctionChain buildServiceFunctionChain(PortChain portChain, List<ServiceFunction> sfList) {
ServiceFunctionChainBuilder sfcBuilder = new ServiceFunctionChainBuilder();
sfcBuilder.setName(new SfcName(portChain.getName()));
sfcBuilder.setKey(new ServiceFunctionChainKey(sfcBuilder.getName()));
// By default set it to false. If user specify it in chain parameters, it
// will be overridden.
sfcBuilder.setSymmetric(false);
// Set service functions
List<SfcServiceFunction> sfcSfList = new ArrayList<>();
for (ServiceFunction sf : sfList) {
SfcServiceFunctionBuilder sfcSfBuilder = new SfcServiceFunctionBuilder();
sfcSfBuilder.setName(sf.getName().getValue());
sfcSfBuilder.setType(sf.getType());
sfcSfBuilder.setKey(new SfcServiceFunctionKey(sfcSfBuilder.getName()));
// NOTE: no explicit order is set.
sfcSfList.add(sfcSfBuilder.build());
}
List<ChainParameters> cpList = portChain.getChainParameters();
if (cpList != null && !cpList.isEmpty()) {
for (ChainParameters cp : cpList) {
if (cp.getChainParameter().equals(SYMMETRIC_PARAM)) {
// Override the symmetric default value.
sfcBuilder.setSymmetric(Boolean.valueOf(cp.getChainParameterValue()));
break;
}
}
}
sfcBuilder.setSfcServiceFunction(sfcSfList);
return sfcBuilder.build();
}
use of org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction in project netvirt by opendaylight.
the class PortPairTranslator method buildServiceFunction.
@Nonnull
public static ServiceFunction buildServiceFunction(PortPair portPair, PortPairGroup portPairGroup) {
Preconditions.checkNotNull(portPair, "Port pair must not be null");
Preconditions.checkNotNull(portPairGroup, "Port pair group must not be null");
ServiceFunctionBuilder serviceFunctionBuilder = new ServiceFunctionBuilder();
// Set SF name and tenant-id
serviceFunctionBuilder.setName(new SfName(portPair.getName()));
serviceFunctionBuilder.setTenantId(new TenantId(portPair.getTenantId().getValue()));
// Set SF Type. Setting it to PortPairGroup Type, this will be overridden if user pass
// it through service_function_params
serviceFunctionBuilder.setType(SftTypeName.getDefaultInstance(portPairGroup.getName()));
// If user pass specific param using service_function_parameters, set/override it accordingly
Class transportTypeClass = null;
List<ServiceFunctionParameters> sfParams = portPair.getServiceFunctionParameters();
if (sfParams != null) {
for (ServiceFunctionParameters sfParam : sfParams) {
// There is by default type set to port pair group name, override it if user pass it specific type
if (sfParam.getServiceFunctionParameter().equals(SF_TYPE_PARAM)) {
serviceFunctionBuilder.setType(new SftTypeName(sfParam.getServiceFunctionParameterValue()));
}
if (sfParam.getServiceFunctionParameter().equals(DPL_TRANSPORT_PARAM)) {
transportTypeClass = DPL_TRANSPORT_TYPE.get(sfParam.getServiceFunctionParameterValue());
}
}
}
// Build forward DPL
SfDataPlaneLocatorBuilder sfForwardDplBuilder = new SfDataPlaneLocatorBuilder();
sfForwardDplBuilder.setName(new SfDataPlaneLocatorName(portPair.getName() + DPL_INGRESS_SUFFIX));
sfForwardDplBuilder.setTransport(transportTypeClass == null ? Mac.class : transportTypeClass);
sfForwardDplBuilder.setServiceFunctionForwarder(new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME));
String forwardPort = portPair.getIngress().getValue();
LogicalInterface forwardInterface = new LogicalInterfaceBuilder().setInterfaceName(forwardPort).build();
sfForwardDplBuilder.setLocatorType(forwardInterface);
// Build reverse DPL
SfDataPlaneLocatorBuilder sfReverseDplBuilder = new SfDataPlaneLocatorBuilder();
sfReverseDplBuilder.setName(new SfDataPlaneLocatorName(portPair.getName() + DPL_EGRESS_SUFFIX));
sfReverseDplBuilder.setTransport(transportTypeClass == null ? Mac.class : transportTypeClass);
sfReverseDplBuilder.setServiceFunctionForwarder(new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME));
String reversePort = portPair.getEgress().getValue();
LogicalInterface reverseInterface = new LogicalInterfaceBuilder().setInterfaceName(reversePort).build();
sfReverseDplBuilder.setLocatorType(reverseInterface);
// Set all data plane locator
List<SfDataPlaneLocator> sfDataPlaneLocatorList = new ArrayList<>();
sfDataPlaneLocatorList.add(sfForwardDplBuilder.build());
sfDataPlaneLocatorList.add(sfReverseDplBuilder.build());
serviceFunctionBuilder.setSfDataPlaneLocator(sfDataPlaneLocatorList);
return serviceFunctionBuilder.build();
}
Aggregations