use of org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair in project netvirt by opendaylight.
the class PortPairGroupTranslator method buildServiceFunctionForwarder.
public static ServiceFunctionForwarder buildServiceFunctionForwarder(PortPairGroup portPairGroup, List<PortPair> portPairs) {
Preconditions.checkNotNull(portPairGroup, "Port pair group must not be null");
Preconditions.checkNotNull(portPairs, "Port pairs must not be null");
Preconditions.checkElementIndex(0, portPairs.size(), "There must be at least one port pair");
// Currently we only support one SF per type. Mean, one port-pair per port-pair-group.
final PortPair portPair = portPairs.get(0);
ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
sffBuilder.setName(new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME));
DataPlaneLocatorBuilder forwardDplBuilder = new DataPlaneLocatorBuilder();
forwardDplBuilder.setTransport(Mac.class);
String forwardPort = portPair.getIngress().getValue();
LogicalInterface forwardInterface = new LogicalInterfaceBuilder().setInterfaceName(forwardPort).build();
forwardDplBuilder.setLocatorType(forwardInterface);
SffDataPlaneLocatorBuilder sffForwardDplBuilder = new SffDataPlaneLocatorBuilder();
sffForwardDplBuilder.setDataPlaneLocator(forwardDplBuilder.build());
String forwardDplName = portPair.getName() + DPL_INGRESS_SUFFIX;
sffForwardDplBuilder.setName(new SffDataPlaneLocatorName(forwardDplName));
DataPlaneLocatorBuilder reverseDplBuilder = new DataPlaneLocatorBuilder();
reverseDplBuilder.setTransport(Mac.class);
String reversePort = portPair.getEgress().getValue();
LogicalInterface reverseInterface = new LogicalInterfaceBuilder().setInterfaceName(reversePort).build();
reverseDplBuilder.setLocatorType(reverseInterface);
SffDataPlaneLocatorBuilder sffReverseDplBuilder = new SffDataPlaneLocatorBuilder();
sffReverseDplBuilder.setDataPlaneLocator(reverseDplBuilder.build());
String reverseDplName = portPair.getName() + DPL_EGRESS_SUFFIX;
sffReverseDplBuilder.setName(new SffDataPlaneLocatorName(reverseDplName));
List<SffDataPlaneLocator> sffDataPlaneLocator = new ArrayList<>();
sffDataPlaneLocator.add(sffForwardDplBuilder.build());
sffDataPlaneLocator.add(sffReverseDplBuilder.build());
sffBuilder.setSffDataPlaneLocator(sffDataPlaneLocator);
SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = new SffSfDataPlaneLocatorBuilder();
sffSfDataPlaneLocatorBuilder.setSffForwardDplName(new SffDataPlaneLocatorName(forwardDplName));
sffSfDataPlaneLocatorBuilder.setSfForwardDplName(new SfDataPlaneLocatorName(forwardDplName));
sffSfDataPlaneLocatorBuilder.setSffReverseDplName(new SffDataPlaneLocatorName(reverseDplName));
sffSfDataPlaneLocatorBuilder.setSfReverseDplName(new SfDataPlaneLocatorName(reverseDplName));
ServiceFunctionDictionaryBuilder sfdBuilder = new ServiceFunctionDictionaryBuilder();
sfdBuilder.setName(new SfName(portPair.getName()));
sfdBuilder.setSffSfDataPlaneLocator(sffSfDataPlaneLocatorBuilder.build());
List<ServiceFunctionDictionary> sfdList = new ArrayList<>();
sfdList.add(sfdBuilder.build());
sffBuilder.setServiceFunctionDictionary(sfdList);
return sffBuilder.build();
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair in project netvirt by opendaylight.
the class NeutronPortPairListener method remove.
/**
* Method removes PortPair which is identified by InstanceIdentifier.
*
* @param deletedPortPair - PortPair for removing
*/
@Override
public void remove(PortPair deletedPortPair) {
LOG.info("Received remove port pair event {}", deletedPortPair);
ServiceFunctionKey sfKey = PortPairTranslator.getSFKey(deletedPortPair);
LOG.info("Removing service function {}", sfKey);
sfcMdsalHelper.removeServiceFunction(sfKey);
ServiceFunctionForwarder sff;
ServiceFunctionForwarder updatedSff;
SffName sffName = new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME);
sff = sfcMdsalHelper.readServiceFunctionForwarder(new ServiceFunctionForwarderKey(sffName));
updatedSff = PortPairGroupTranslator.removePortPairFromServiceFunctionForwarder(sff, deletedPortPair);
LOG.info("Updating service function forwarder as {}", updatedSff);
sfcMdsalHelper.addServiceFunctionForwarder(updatedSff);
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair 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.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair in project netvirt by opendaylight.
the class PortPairGroupTranslator method removePortPairFromServiceFunctionForwarder.
public static ServiceFunctionForwarder removePortPairFromServiceFunctionForwarder(ServiceFunctionForwarder serviceFunctionForwarder, PortPair deletedPortPair) {
Preconditions.checkNotNull(deletedPortPair, "Port pair must not be null");
String portPairName = deletedPortPair.getName();
ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder(serviceFunctionForwarder);
List<ServiceFunctionDictionary> serviceFunctionDictionaryList = sffBuilder.getServiceFunctionDictionary();
if (serviceFunctionDictionaryList == null) {
LOG.debug("SF dictionary is empty");
return serviceFunctionForwarder;
}
ServiceFunctionDictionary serviceFunctionDictionary = serviceFunctionDictionaryList.stream().filter(sfDictionary -> sfDictionary.getName().getValue().equals(portPairName)).findFirst().orElse(null);
if (serviceFunctionDictionary == null) {
LOG.debug("SFF dictionary entry for port pair {} not found", portPairName);
return serviceFunctionForwarder;
}
SffSfDataPlaneLocator sffSfDataPlaneLocator = serviceFunctionDictionary.getSffSfDataPlaneLocator();
if (sffSfDataPlaneLocator != null) {
List<SffDataPlaneLocatorName> locators = Arrays.asList(sffSfDataPlaneLocator.getSffDplName(), sffSfDataPlaneLocator.getSffForwardDplName(), sffSfDataPlaneLocator.getSffReverseDplName());
List<SffDataPlaneLocator> sffDplList = sffBuilder.getSffDataPlaneLocator();
if (sffDplList != null) {
sffDplList.stream().filter(sffDataPlaneLocator -> locators.contains(sffDataPlaneLocator.getName())).map(sffDplList::remove);
}
}
serviceFunctionDictionaryList.remove(serviceFunctionDictionary);
return sffBuilder.build();
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair 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