neutronPortPairListener = new NeutronPortPairListener(dataBroker);
neutronPortPairGroupListener = new NeutronPortPairGroupListener(dataBroker);
neutronPortChainListener = new NeutronPortChainListener(dataBroker, rspService);
+ SfcMdsalHelper sfcMdsal = new SfcMdsalHelper(dataBroker);
+ sfcMdsal.addNetvirLogicalSff();
if (this.rspService == null) {
LOG.warn("RenderedServicePath Service is not available. Translation layer might not work as expected.");
}
* Utility methods to read OpenDaylight OVSDB models.
*/
public class OvsdbMdsalHelper {
- private static final Logger LOG = LoggerFactory.getLogger(SfcMdsalHelper.class);
+ private static final Logger LOG = LoggerFactory.getLogger(OvsdbMdsalHelper.class);
private static final String OVSDB_TOPOLOGY_ID = "ovsdb:1";
private static final InstanceIdentifier<Topology> TOPOLOGY_PATH
= InstanceIdentifier.create(NetworkTopology.class)
package org.opendaylight.netvirt.sfc.translator;
-import java.util.List;
+import java.util.Objects;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.ServiceFunctions;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainKey;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.ServiceFunctionForwarders;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPaths;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
InstanceIdentifier.create(ServiceFunctionChains.class);
private static InstanceIdentifier<ServiceFunctionPaths> sfpIid
= InstanceIdentifier.create(ServiceFunctionPaths.class);
+ public static final String NETVIRT_LOGICAL_SFF_NAME = "Netvirt-Logical-SFF";
private final DataBroker dataBroker;
ServiceFunctionForwarders existingSffs =
SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
LogicalDatastoreType.CONFIGURATION, sffIid).orNull();
- if (existingSffs != null
- && existingSffs.getServiceFunctionForwarder() != null
- && !existingSffs.getServiceFunctionForwarder().isEmpty()) {
-
- List<ServiceFunctionForwarder> existingSffList = existingSffs.getServiceFunctionForwarder();
- for (ServiceFunctionForwarder sff : existingSffList) {
- if (sff.getIpMgmtAddress().getIpv4Address().equals(new Ipv4Address(ipAddress))) {
- return sff;
- }
- }
- }
- return null;
+
+ return existingSffs == null || existingSffs.getServiceFunctionForwarder() == null
+ ? null
+ : existingSffs.getServiceFunctionForwarder().stream()
+ .filter(sff -> Objects.nonNull(sff.getIpMgmtAddress()))
+ .filter(sff -> new Ipv4Address(ipAddress).equals(sff.getIpMgmtAddress().getIpv4Address()))
+ .findFirst()
+ .orElse(null);
+ }
+
+ public void addNetvirLogicalSff() {
+ ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
+ sffBuilder.setName(new SffName(NETVIRT_LOGICAL_SFF_NAME));
+ ServiceFunctionForwarder sff = sffBuilder.build();
+ this.addServiceFunctionForwarder(sff);
}
}
import java.util.concurrent.atomic.AtomicInteger;
import org.opendaylight.netvirt.sfc.translator.OvsdbMdsalHelper;
import org.opendaylight.netvirt.sfc.translator.OvsdbPortMetadata;
+import org.opendaylight.netvirt.sfc.translator.SfcMdsalHelper;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfDataPlaneLocatorName;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.Mac;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.SlTransportType;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.IpBuilder;
import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sf.ovs.rev160107.SfDplOvsAugmentation;
import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sf.ovs.rev160107.SfDplOvsAugmentationBuilder;
import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sf.ovs.rev160107.connected.port.OvsPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.functions.service.function.sf.data.plane.locator.locator.type.LogicalInterface;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.functions.service.function.sf.data.plane.locator.locator.type.LogicalInterfaceBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
private static final String DPL_TRANSPORT_PARAM = "dpl-transport";
private static final String DPL_IP_PARAM = "dpl-ip";
private static final String DPL_PORT_PARAM = "dpl-port";
+ private static final String SFF_LOGICAL = "-logical";
private static final String SFF_STR = "sff";
public static final ImmutableBiMap<String, Class<? extends SlTransportType>> DPL_TRANSPORT_TYPE
sfDataPlaneLocatorBuilder.setLocatorType(sfLocator.build());
+ SfDataPlaneLocatorBuilder logicalInterfaceDplBuilder = new SfDataPlaneLocatorBuilder();
+ String dataPlaneName = portPair.getName() + SFF_LOGICAL + DPL_SUFFIX_PARAM;
+ logicalInterfaceDplBuilder.setName(new SfDataPlaneLocatorName(dataPlaneName));
+ logicalInterfaceDplBuilder.setTransport(Mac.class);
+ SffName defaultSffName = new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME);
+ logicalInterfaceDplBuilder.setServiceFunctionForwarder(defaultSffName);
+ String neutronPortValue = neutronPort.getUuid().getValue();
+ LogicalInterface neutronIntf = new LogicalInterfaceBuilder().setInterfaceName(neutronPortValue).build();
+ logicalInterfaceDplBuilder.setLocatorType(neutronIntf);
+
List<SfDataPlaneLocator> sfDataPlaneLocatorList = new ArrayList<>();
- sfDataPlaneLocatorList.add(sfDataPlaneLocatorBuilder.build());
+
+ sfDataPlaneLocatorList.add(logicalInterfaceDplBuilder.build());
+// sfDataPlaneLocatorList.add(sfDataPlaneLocatorBuilder.build());
//Set management IP to same as DPL IP.
serviceFunctionBuilder.setIpMgmtAddress(sfLocator.getIp());