From: Sam Hague Date: Tue, 10 Nov 2015 17:11:10 +0000 (-0500) Subject: workaround for sfc X-Git-Tag: release/beryllium-sr2~289^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=ac6c91b94ac75fa5a710eff018e5a550373069a4;p=netvirt.git workaround for sfc Change-Id: I46b22b084627f95c1e478b1cf004681d21d4595c Signed-off-by: Sam Hague --- diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/INetvirtSfcOF13Provider.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/INetvirtSfcOF13Provider.java index 66fd2a362d..458216343b 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/INetvirtSfcOF13Provider.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/INetvirtSfcOF13Provider.java @@ -8,10 +8,12 @@ package org.opendaylight.ovsdb.openstack.netvirt.sfc; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services.SfcClassifierService; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.Acl; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.classifier.Bridges; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.classifier.bridges.Bridge; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.classifier.sffs.Sff; +import org.osgi.framework.ServiceReference; /** * Open vSwitch OpenFlow 1.3 Networking Provider for Netvirt SFC @@ -40,4 +42,7 @@ public interface INetvirtSfcOF13Provider { void addClassifierRules(Acl acl); void removeClassifierRules(Acl acl); + + void setSfcClassifierService(ISfcClassifierService sfcClassifierService); + public void setDependencies(ServiceReference serviceReference); } diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/ISfcClassifierService.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/ISfcClassifierService.java new file mode 100644 index 0000000000..e0a9dfba6e --- /dev/null +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/ISfcClassifierService.java @@ -0,0 +1,16 @@ +/* + * Copyright © 2015 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.ovsdb.openstack.netvirt.sfc; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.Matches; + +public interface ISfcClassifierService { + void programIngressClassifier(long dataPathId, String ruleName, Matches matches, + NshUtils nshHeader, long vxGpeOfPort, boolean write); +} diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcProvider.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcProvider.java index 0289d60eea..a77b8cf560 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcProvider.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcProvider.java @@ -19,7 +19,7 @@ import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.OF13Provide import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service; import org.opendaylight.ovsdb.openstack.netvirt.sfc.standalone.openflow13.NetvirtSfcStandaloneOF13Provider; import org.opendaylight.ovsdb.openstack.netvirt.sfc.standalone.openflow13.services.SfcClassifierService; -import org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services.NetvirtSfcWorkaroundOF13Provider; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.NetvirtSfcWorkaroundOF13Provider; import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; @@ -57,6 +57,7 @@ public class NetvirtSfcProvider implements BindingAwareProvider, AutoCloseable { MdsalUtils mdsalUtils = new MdsalUtils(dataBroker); SfcUtils sfcUtils = new SfcUtils(mdsalUtils); + // Allocate provider based on config INetvirtSfcOF13Provider provider; if (of13Provider.equals("standalone")) { @@ -67,7 +68,8 @@ public class NetvirtSfcProvider implements BindingAwareProvider, AutoCloseable { aclListener = new NetvirtSfcAclListener(provider, dataBroker); classifierListener = new NetvirtSfcClassifierListener(provider, dataBroker); - addToPipeline(); + addToPipeline(provider); + provider.setDependencies(null); } @Override @@ -77,13 +79,24 @@ public class NetvirtSfcProvider implements BindingAwareProvider, AutoCloseable { classifierListener.close(); } - private void addToPipeline() { - SfcClassifierService sfcClassifierService = new SfcClassifierService(); - registerService(bundleContext, SfcClassifierService.class.getName(), - sfcClassifierService, Service.SFC_CLASSIFIER); - sfcClassifierService.setDependencies(bundleContext, null); + private void addToPipeline(INetvirtSfcOF13Provider provider) { + if (provider instanceof NetvirtSfcStandaloneOF13Provider) { + SfcClassifierService sfcClassifierService = + new org.opendaylight.ovsdb.openstack.netvirt.sfc.standalone.openflow13.services.SfcClassifierService(); + registerService(bundleContext, ISfcClassifierService.class.getName(), + sfcClassifierService, Service.SFC_CLASSIFIER); + sfcClassifierService.setDependencies(bundleContext, null); + } else { + org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services.SfcClassifierService sfcClassifierService = + new org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services.SfcClassifierService(); + registerService(bundleContext, ISfcClassifierService.class.getName(), + sfcClassifierService, Service.SFC_CLASSIFIER); + sfcClassifierService.setDependencies(bundleContext, null); } + //provider.setSfcClassifierService(sfcClassifierService); + } + private ServiceRegistration registerService(BundleContext bundleContext, String[] interfaces, Dictionary properties, Object impl) { ServiceRegistration serviceRegistration = bundleContext.registerService(interfaces, impl, properties); @@ -96,7 +109,7 @@ public class NetvirtSfcProvider implements BindingAwareProvider, AutoCloseable { properties.put(AbstractServiceInstance.SERVICE_PROPERTY, serviceProperty); properties.put(Constants.PROVIDER_NAME_PROPERTY, OF13Provider.NAME); return registerService(bundleContext, - new String[] {AbstractServiceInstance.class.getName(), - interfaceClassName}, properties, impl); + new String[] {AbstractServiceInstance.class.getName(),interfaceClassName}, + properties, impl); } } diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/SfcUtils.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/SfcUtils.java index 4114b1f08b..f7f0f31aa0 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/SfcUtils.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/SfcUtils.java @@ -10,17 +10,27 @@ package org.opendaylight.ovsdb.openstack.netvirt.sfc; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils; +import org.opendaylight.sfc.provider.api.SfcProviderServiceFunctionAPI; import org.opendaylight.sfc.provider.api.SfcProviderServicePathAPI; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName; +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.rsp.rev140701.RenderedServicePaths; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathKey; +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.sfp.rev140701.ServiceFunctionPaths; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.Ip; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.Classifiers; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SfcUtils { + private static final Logger LOG = LoggerFactory.getLogger(SfcUtils.class); private MdsalUtils mdsalUtils; public SfcUtils(MdsalUtils mdsalUtils) { @@ -40,6 +50,11 @@ public class SfcUtils { .child(RenderedServicePath.class, new RenderedServicePathKey(new RspName(rspName))).build(); } + public InstanceIdentifier getSfId(String sfName) { + return InstanceIdentifier.builder(ServiceFunctions.class) + .child(ServiceFunction.class, new ServiceFunctionKey(SfName.getDefaultInstance(sfName))).build(); + } + public RenderedServicePath getRspforSfp(String sfpName) { RenderedServicePath rspFound = null; RenderedServicePaths rsps = mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, this.getRspsId()); @@ -67,4 +82,17 @@ public class SfcUtils { } return sfpFound; } + + public IpAddress getSfIp(String sfname) { + ServiceFunction serviceFunction = + SfcProviderServiceFunctionAPI.readServiceFunction(SfName.getDefaultInstance(sfname)); + + if (serviceFunction == null) { + LOG.info("Failed to read ServiceFunction: {}", sfname); + return null; + } + + Ip ipLocator = (Ip) serviceFunction.getSfDataPlaneLocator().get(0).getLocatorType(); + return ipLocator.getIp(); + } } diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/NetvirtSfcStandaloneOF13Provider.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/NetvirtSfcStandaloneOF13Provider.java index 6343a8a391..7cfcf6c96e 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/NetvirtSfcStandaloneOF13Provider.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/NetvirtSfcStandaloneOF13Provider.java @@ -19,6 +19,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager; import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound; import org.opendaylight.ovsdb.openstack.netvirt.sfc.INetvirtSfcOF13Provider; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.ISfcClassifierService; import org.opendaylight.ovsdb.openstack.netvirt.sfc.NshUtils; import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils; import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper; @@ -82,7 +83,7 @@ public class NetvirtSfcStandaloneOF13Provider implements INetvirtSfcOF13Provider public NetvirtSfcStandaloneOF13Provider(final DataBroker dataBroker) { Preconditions.checkNotNull(dataBroker, "Input dataBroker cannot be NULL!"); mdsalUtils = new MdsalUtils(dataBroker); - this.setDependencies(null); + //this.setDependencies(null); sfcClassifier = new SfcClassifier(dataBroker, southbound, mdsalUtils); } @@ -126,6 +127,11 @@ public class NetvirtSfcStandaloneOF13Provider implements INetvirtSfcOF13Provider } } + @Override + public void setSfcClassifierService(ISfcClassifierService sfcClassifierService) { + + } + @Override public void addClassifierRules(Bridge bridge, Acl acl) { @@ -407,7 +413,8 @@ public class NetvirtSfcStandaloneOF13Provider implements INetvirtSfcOF13Provider sfcClassifier.programLocalInPort(dpidLong, segmentationId, inPort, writeTable, goToTableId, matches, write); } - private void setDependencies(ServiceReference serviceReference) { + @Override + public void setDependencies(ServiceReference serviceReference) { nodeCacheManager = (NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this); southbound = (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this); } diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/services/SfcClassifierService.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/services/SfcClassifierService.java index bc0140fa79..96b240cb07 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/services/SfcClassifierService.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/standalone/openflow13/services/SfcClassifierService.java @@ -11,12 +11,15 @@ package org.opendaylight.ovsdb.openstack.netvirt.sfc.standalone.openflow13.servi import org.opendaylight.ovsdb.openstack.netvirt.providers.ConfigInterface; import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance; import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.ISfcClassifierService; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.NshUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.Matches; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SfcClassifierService extends AbstractServiceInstance implements ConfigInterface { +public class SfcClassifierService extends AbstractServiceInstance implements ConfigInterface, ISfcClassifierService { private static final Logger LOG = LoggerFactory.getLogger(SfcClassifierService.class); public SfcClassifierService(Service service) { @@ -34,4 +37,9 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con @Override public void setDependencies(Object impl) {} + + @Override + public void programIngressClassifier(long dataPathId, String ruleName, Matches matches, NshUtils nshHeader, long vxGpeOfPort, boolean write) { + + } } diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/NetvirtSfcWorkaroundOF13Provider.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/NetvirtSfcWorkaroundOF13Provider.java similarity index 54% rename from openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/NetvirtSfcWorkaroundOF13Provider.java rename to openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/NetvirtSfcWorkaroundOF13Provider.java index fa26ee54cd..258b6b4255 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/NetvirtSfcWorkaroundOF13Provider.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/NetvirtSfcWorkaroundOF13Provider.java @@ -6,31 +6,43 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services; +package org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround; import com.google.common.base.Preconditions; +import java.util.List; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager; import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound; import org.opendaylight.ovsdb.openstack.netvirt.sfc.INetvirtSfcOF13Provider; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.ISfcClassifierService; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.NshUtils; import org.opendaylight.ovsdb.openstack.netvirt.sfc.SfcUtils; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services.SfcClassifierService; import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils; import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper; import org.opendaylight.sfc.provider.api.SfcProviderRenderedPathAPI; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInput; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInputBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.path.first.hop.info.RenderedServicePathFirstHop; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHop; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.Acl; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.Ace; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.Matches; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfc; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.Classifiers; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.Classifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.classifier.Bridges; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.classifier.bridges.Bridge; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.classifier.rev150105.classifiers.classifier.sffs.Sff; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,9 +51,17 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider private static final Logger LOG = LoggerFactory.getLogger(NetvirtSfcWorkaroundOF13Provider.class); private volatile NodeCacheManager nodeCacheManager; private volatile Southbound southbound; + private volatile ISfcClassifierService sfcClassifierService; + + public void setSfcClassifierService(ISfcClassifierService sfcClassifierService) { + this.sfcClassifierService = sfcClassifierService; + } + private MdsalUtils mdsalUtils; private SfcUtils sfcUtils; - private SfcClassifierService sfcClassifierService; + private static final String VXGPE = "vxgpe"; + private static final String TUNNEL_DST = "192.168.120.31"; + private static final String TUNNEL_VNID = "10"; public NetvirtSfcWorkaroundOF13Provider(final DataBroker dataBroker, MdsalUtils mdsalUtils, SfcUtils sfcUtils) { Preconditions.checkNotNull(dataBroker, "Input dataBroker cannot be NULL!"); @@ -50,7 +70,7 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider this.mdsalUtils = mdsalUtils; this.sfcUtils = sfcUtils; - this.setDependencies(null); + //this.setDependencies(null); } @Override @@ -62,10 +82,6 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider public void addClassifierRules(Bridges bridges, Acl acl) { Preconditions.checkNotNull(bridges, "Input bridges cannot be NULL!"); Preconditions.checkNotNull(acl, "Input acl cannot be NULL!"); - - for (Ace ace : acl.getAccessListEntries().getAce()) { - processAclEntry(ace, bridges); - } } @Override @@ -78,15 +94,15 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider String aclName = acl.getAclName(); Classifiers classifiers = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, sfcUtils.getClassifierIid()); if (classifiers == null) { - LOG.debug("add: No Classifiers found"); + LOG.debug("addClassifierRules: No Classifiers found"); return; } - LOG.debug("add: Classifiers: {}", classifiers); + LOG.debug("addClassifierRules: Classifiers: {}", classifiers); for (Classifier classifier : classifiers.getClassifier()) { if (classifier.getAcl().equals(aclName)) { - if (classifier.getBridges() != null) { - addClassifierRules(classifier.getBridges(), acl); + for (Ace ace : acl.getAccessListEntries().getAce()) { + processAclEntry(ace); } } } @@ -97,7 +113,7 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider } - private void processAclEntry(Ace entry, Bridges bridges) { + private void processAclEntry(Ace entry) { Matches matches = entry.getMatches(); Preconditions.checkNotNull(matches, "Input bridges cannot be NULL!"); @@ -107,10 +123,72 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider return; } - //handleIngressClassifier(); + handleIngressClassifier(rsp, entry); //handleEgressClassifier(); //handleSfLoopback(); + } + + private void handleIngressClassifier(RenderedServicePath rsp, Ace entry) { + LOG.info("handleIngressClassifier: RSP: {}", rsp); + + Matches matches = entry.getMatches(); + if (matches == null) { + LOG.warn("processAclEntry: matches not found"); + return; + } + + List pathHopList = rsp.getRenderedServicePathHop(); + if (pathHopList.isEmpty()) { + LOG.warn("handleIngressClassifier: RSP {} has empty hops!!", rsp.getName()); + return; + } + LOG.info("handleIngressClassifier: pathHopList: {}", pathHopList); + + final List bridgeNodes = nodeCacheManager.getBridgeNodes(); + if (bridgeNodes == null || bridgeNodes.isEmpty()) { + LOG.warn("handleIngressClassifier: There are no bridges to process"); + return; + } + for (Node bridgeNode : bridgeNodes) { + OvsdbBridgeAugmentation ovsdbBridgeAugmentation = southbound.getBridge(bridgeNode, "br-int"); + if (ovsdbBridgeAugmentation == null) { + continue; + } + long vxGpeOfPort = southbound.getOFPort(bridgeNode, VXGPE); + if (vxGpeOfPort == 0L) { + LOG.warn("programAclEntry: Could not identify tunnel port {} -> OF ({}) on {}", + VXGPE, vxGpeOfPort, bridgeNode); + continue; + } + + // Find the first Hop within an RSP. + // The classifier flow needs to send all matched traffic to this first hop SFF. + RenderedServicePathFirstHop firstRspHop = SfcProviderRenderedPathAPI + .readRenderedServicePathFirstHop(rsp.getName()); + + LOG.info("handleIngressClassifier: firstRspHop: {}", firstRspHop); + LOG.debug("handleIngressClassifier: First Hop IPAddress = {}, Port = {}", + firstRspHop.getIp().getIpv4Address().getValue(), + firstRspHop.getPort().getValue().intValue()); + + NshUtils nshHeader = new NshUtils(); + nshHeader.setNshMetaC1(NshUtils.convertIpAddressToLong(new Ipv4Address(TUNNEL_DST))); + nshHeader.setNshMetaC2(Long.parseLong(TUNNEL_VNID)); + nshHeader.setNshNsp(rsp.getPathId()); + RenderedServicePathHop firstHop = pathHopList.get(0); + nshHeader.setNshNsi(firstHop.getServiceIndex()); + // workaround: bypass sff and got directly to sf + //nshHeader.setNshTunIpDst(firstRspHop.getIp().getIpv4Address()); + IpAddress sfIpAddress = sfcUtils.getSfIp(firstHop.getServiceFunctionName().getValue()); + nshHeader.setNshTunIpDst(sfIpAddress.getIpv4Address()); + nshHeader.setNshTunUdpPort(firstRspHop.getPort()); + LOG.debug("handleIngressClassifier: NSH Header = {}", nshHeader); + + sfcClassifierService.programIngressClassifier( + southbound.getDataPathId(bridgeNode), entry.getRuleName(), + matches, nshHeader, vxGpeOfPort, true); + } } // loop through sf's: @@ -121,6 +199,7 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider } + private RenderedServicePath getRenderedServicePath (Ace entry) { RedirectToSfc sfcRedirect = entry.getActions().getAugmentation(RedirectToSfc.class); LOG.debug("Processing ACL entry = {} sfcRedirect = {}", entry.getRuleName(), sfcRedirect); @@ -172,9 +251,38 @@ public class NetvirtSfcWorkaroundOF13Provider implements INetvirtSfcOF13Provider return rsp; } - private void setDependencies(ServiceReference serviceReference) { + public Long getOFPort(Node bridgeNode, String portName) { + Long ofPort = 0L; + OvsdbTerminationPointAugmentation port = southbound.extractTerminationPointAugmentation(bridgeNode, portName); + if (port != null) { + ofPort = southbound.getOFPort(port); + } + for (int i = 0; i < 5; i++) { + LOG.info("Looking for ofPort {}, try: {}", portName, i); + if (ofPort == 0L) { + TerminationPoint tp = southbound.readTerminationPoint(bridgeNode, null, portName); + if (tp != null) { + port = tp.getAugmentation(OvsdbTerminationPointAugmentation.class); + if (port != null) { + ofPort = southbound.getOFPort(port); + break; + } + } + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return ofPort; + } + + @Override + public void setDependencies(ServiceReference serviceReference) { nodeCacheManager = (NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this); southbound = (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this); - sfcClassifierService = (SfcClassifierService) ServiceHelper.getGlobalInstance(SfcClassifierService.class, this); + sfcClassifierService = (ISfcClassifierService) ServiceHelper.getGlobalInstance(ISfcClassifierService.class, this); + LOG.info("sfcClassifierService= {}", sfcClassifierService); } } diff --git a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/SfcClassifierService.java b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/SfcClassifierService.java index 59e4c6b658..44be094fd7 100644 --- a/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/SfcClassifierService.java +++ b/openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/workaround/services/SfcClassifierService.java @@ -8,13 +8,45 @@ package org.opendaylight.ovsdb.openstack.netvirt.sfc.workaround.services; +import com.google.common.collect.Lists; +import java.math.BigInteger; +import java.util.List; import org.opendaylight.ovsdb.openstack.netvirt.providers.ConfigInterface; import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance; import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.ISfcClassifierService; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.NshUtils; +import org.opendaylight.ovsdb.utils.mdsal.openflow.ActionUtils; +import org.opendaylight.ovsdb.utils.mdsal.openflow.FlowUtils; +import org.opendaylight.ovsdb.utils.mdsal.openflow.MatchUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.Matches; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEth; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SfcClassifierService extends AbstractServiceInstance implements ConfigInterface, ISfcClassifierService { + private static final Logger LOG = LoggerFactory.getLogger(SfcClassifierService.class); + private static final short SFC_TABLE = 10; -public class SfcClassifierService extends AbstractServiceInstance implements ConfigInterface { public SfcClassifierService(Service service) { super(service); } @@ -25,9 +57,108 @@ public class SfcClassifierService extends AbstractServiceInstance implements Con @Override public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) { - super.setDependencies(bundleContext.getServiceReference(SfcClassifierService.class.getName()), this); + super.setDependencies(bundleContext.getServiceReference(ISfcClassifierService.class.getName()), this); } @Override public void setDependencies(Object impl) {} + + @Override + public void programIngressClassifier(long dataPathId, String ruleName, Matches matches, + NshUtils nshHeader, long vxGpeOfPort, boolean write) { + NodeBuilder nodeBuilder = FlowUtils.createNodeBuilder(dataPathId); + FlowBuilder flowBuilder = new FlowBuilder(); + + MatchBuilder matchBuilder = buildMatch(matches); + flowBuilder.setMatch(matchBuilder.build()); + MatchUtils.addNxRegMatch(matchBuilder, + new MatchUtils.RegMatch(FlowUtils.REG_FIELD, FlowUtils.REG_VALUE_FROM_LOCAL)); + + String flowId = "sfcClass_" + ruleName;// + "_" + nshHeader.getNshNsp(); + flowBuilder.setId(new FlowId(flowId)); + FlowKey key = new FlowKey(new FlowId(flowId)); + flowBuilder.setBarrier(true); + flowBuilder.setTableId(SFC_TABLE); + flowBuilder.setKey(key); + flowBuilder.setFlowName(flowId); + flowBuilder.setHardTimeout(0); + flowBuilder.setIdleTimeout(0); + + if (write) { + List actionList = getNshAction(nshHeader); + ActionBuilder ab = new ActionBuilder(); + + ab.setAction(ActionUtils.outputAction(FlowUtils.getNodeConnectorId(dataPathId, vxGpeOfPort))); + ab.setOrder(actionList.size()); + ab.setKey(new ActionKey(actionList.size())); + actionList.add(ab.build()); + + ApplyActionsBuilder aab = new ApplyActionsBuilder(); + aab.setAction(actionList); + + InstructionBuilder ib = new InstructionBuilder(); + ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build()); + ib.setOrder(0); + ib.setKey(new InstructionKey(0)); + List instructions = Lists.newArrayList(); + instructions.add(ib.build()); + + InstructionsBuilder isb = new InstructionsBuilder(); + isb.setInstruction(instructions); + flowBuilder.setInstructions(isb.build()); + writeFlow(flowBuilder, nodeBuilder); + } else { + removeFlow(flowBuilder, nodeBuilder); + } + } + + private List getNshAction(NshUtils header) { + // Build the Actions to Add the NSH Header + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nshC1Load = + ActionUtils.nxLoadNshc1RegAction(header.getNshMetaC1()); + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nshC2Load = + ActionUtils.nxLoadNshc2RegAction(header.getNshMetaC2()); + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nspLoad = + ActionUtils.nxSetNspAction(header.getNshNsp()); + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nsiLoad = + ActionUtils.nxSetNsiAction(header.getNshNsi()); + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action loadChainTunVnid = + ActionUtils.nxLoadTunIdAction(BigInteger.valueOf(header.getNshNsp()), false); + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action loadChainTunDest = + ActionUtils.nxLoadTunIPv4Action(header.getNshTunIpDst().getValue(), false); + + int count = 0; + List actionList = Lists.newArrayList(); + actionList.add(new ActionBuilder().setOrder(count++).setAction(nshC1Load).build()); + actionList.add(new ActionBuilder().setOrder(count++).setAction(nshC2Load).build()); + actionList.add(new ActionBuilder().setOrder(count++).setAction(nspLoad).build()); + actionList.add(new ActionBuilder().setOrder(count++).setAction(nsiLoad).build()); + actionList.add(new ActionBuilder().setOrder(count++).setAction(loadChainTunDest).build()); + actionList.add(new ActionBuilder().setOrder(count++).setAction(loadChainTunVnid).build()); + return actionList; + } + + public MatchBuilder buildMatch(Matches matches) { + MatchBuilder matchBuilder = new MatchBuilder(); + + if (matches.getAceType() instanceof AceIp) { + AceIp aceIp = (AceIp)matches.getAceType(); + if (aceIp.getAceIpVersion() instanceof AceIpv4) { + //AceIpv4 aceIpv4 = (AceIpv4) aceIp.getAceIpVersion(); + //MatchUtils.createSrcL3IPv4Match(matchBuilder, aceIpv4.getSourceIpv4Network()); + //MatchUtils.createDstL3IPv4Match(matchBuilder, aceIpv4.getDestinationIpv4Network()); + MatchUtils.createIpProtocolMatch(matchBuilder, aceIp.getProtocol()); + MatchUtils.addLayer4Match(matchBuilder, aceIp.getProtocol().intValue(), 0, + aceIp.getDestinationPortRange().getLowerPort().getValue().intValue()); + } + } else if (matches.getAceType() instanceof AceEth) { + AceEth aceEth = (AceEth) matches.getAceType(); + MatchUtils.createEthSrcMatch(matchBuilder, new MacAddress(aceEth.getSourceMacAddress().getValue())); + MatchUtils.createDestEthMatch(matchBuilder, new MacAddress(aceEth.getDestinationMacAddress().getValue()), + new MacAddress(aceEth.getDestinationMacAddressMask().getValue())); + } + + LOG.info("buildMatch: {}", matchBuilder.build()); + return matchBuilder; + } } diff --git a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcIT.java b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcIT.java index a53c1bbcb3..1505dfde17 100644 --- a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcIT.java +++ b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcIT.java @@ -25,6 +25,7 @@ import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.configure import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRuntimeFolder; +import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; @@ -44,6 +45,8 @@ import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service; import org.opendaylight.ovsdb.openstack.netvirt.sfc.standalone.openflow13.SfcClassifier; import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.AclUtils; import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.ClassifierUtils; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.ServiceFunctionChainUtils; +import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.ServiceFunctionPathUtils; import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.SfcUtils; import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.ServiceFunctionForwarderUtils; import org.opendaylight.ovsdb.openstack.netvirt.sfc.utils.ServiceFunctionUtils; @@ -56,21 +59,22 @@ import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper; import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils; 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.ServiceFunctionsBuilder; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.entry.SfDataPlaneLocator; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.entry.SfDataPlaneLocatorBuilder; 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.ServiceFunctionBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.ServiceFunctionChains; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.ServiceFunctionChainsBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunction; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunctionBuilder; 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.ServiceFunctionForwardersBuilder; 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.service.function.forwarder.ServiceFunctionDictionary; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionaryBuilder; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.SffDataPlaneLocator; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.SffDataPlaneLocatorBuilder; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.service.function.dictionary.SffSfDataPlaneLocatorBuilder; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.sff.data.plane.locator.DataPlaneLocatorBuilder; -import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.Dpi; +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.ServiceFunctionPathsBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.Firewall; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.AccessLists; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.AccessListsBuilder; @@ -128,6 +132,8 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { private static SfcUtils sfcUtils = new SfcUtils(); private static ServiceFunctionUtils serviceFunctionUtils = new ServiceFunctionUtils(); private static ServiceFunctionForwarderUtils serviceFunctionForwarderUtils = new ServiceFunctionForwarderUtils(); + private static ServiceFunctionChainUtils serviceFunctionChainUtils = new ServiceFunctionChainUtils(); + private static ServiceFunctionPathUtils serviceFunctionPathUtils = new ServiceFunctionPathUtils(); private static MdsalUtils mdsalUtils; private static AtomicBoolean setup = new AtomicBoolean(false); private static SouthboundUtils southboundUtils; @@ -146,6 +152,25 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { public static final String INTEGRATION_BRIDGE_NAME = "br-int"; private static final String NETVIRT_TOPOLOGY_ID = "netvirt:1"; private static final String OVSDB_TRACE = "ovsdb.trace"; + private static final String SF1NAME = "firewall-72"; + private static final String SF2NAME = "dpi-72"; + private static final String SF1IP = "127.0.0.1";//"192.168.50.70";//"192.168.120.31"; + private static final String SF2IP = "192.168.120.32"; + private static final String SF1DPLNAME = "1"; + private static final String SF2DPLNAME = "2"; + private static final String SFF1IP = "192.168.120.31"; + private static final String SFF2IP = "192.168.120.32"; + private static final String SFF1NAME = "SFF1"; + private static final String SFF2NAME = "SFF2"; + private static final String SFFDPL1NAME = "vxgpe"; + private static final String SFFDPL2NAME = "vxgpe"; + private static final String SN1NAME = "OVSDB1"; + private static final String SN2NAME = "OVSDB2"; + private static final String BRIDGE1NAME= "br-int"; + private static final String BRIDGE2NAME= "br-int"; + private static final String ACLNAME= "httpAcl"; + private static final String SFCNAME = "SFC"; + private static final int GPEPORT = 6633; @Override public String getModuleName() { @@ -212,6 +237,9 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { editConfigurationFilePut(ORG_OPS4J_PAX_LOGGING_CFG, "log4j.logger.org.opendaylight.ovsdb", LogLevelOption.LogLevel.TRACE.name())), + //editConfigurationFilePut(ORG_OPS4J_PAX_LOGGING_CFG, + // "log4j.logger.org.opendaylight.ovsdb", + // LogLevelOption.LogLevel.TRACE.name()), editConfigurationFilePut(ORG_OPS4J_PAX_LOGGING_CFG, logConfiguration(NetvirtSfcIT.class), LogLevel.INFO.name()), @@ -219,7 +247,7 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { "log4j.logger.org.opendaylight.ovsdb.openstack.netvirt.sfc", LogLevel.TRACE.name()), editConfigurationFilePut(ORG_OPS4J_PAX_LOGGING_CFG, - "log4j.logger.org.opendaylight.ovsdb.sfc", + "log4j.logger.org.opendaylight.sfc", LogLevel.TRACE.name()), super.getLoggingOption()); } @@ -331,31 +359,33 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { assertTrue(true); } - private AccessListsBuilder setAccessLists () { + private AccessListsBuilder accessListsBuilder() { MatchesBuilder matchesBuilder = aclUtils.matchesBuilder(new MatchesBuilder(), 80); - ActionsBuilder actionsBuilder = aclUtils.actionsBuilder(new ActionsBuilder(), Boolean.TRUE); - AceBuilder accessListEntryBuilder = aclUtils.aceBuilder( - new AceBuilder(), "http", matchesBuilder, actionsBuilder); - AccessListEntriesBuilder accessListEntriesBuilder = aclUtils.accessListEntriesBuidler( - new AccessListEntriesBuilder(), accessListEntryBuilder); - AclBuilder accessListBuilder = aclUtils.aclBuilder(new AclBuilder(), - "http", accessListEntriesBuilder); - AccessListsBuilder accessListsBuilder = aclUtils.accessListsBuidler(new AccessListsBuilder(), - accessListBuilder); + LOG.info("Matches: {}", matchesBuilder.build()); + //ActionsBuilder actionsBuilder = aclUtils.actionsBuilder(new ActionsBuilder(), Boolean.TRUE); + ActionsBuilder actionsBuilder = aclUtils.actionsBuilder(new ActionsBuilder(), SFCNAME); + AceBuilder accessListEntryBuilder = + aclUtils.aceBuilder(new AceBuilder(), "httpRule", matchesBuilder, actionsBuilder); + AccessListEntriesBuilder accessListEntriesBuilder = + aclUtils.accessListEntriesBuidler(new AccessListEntriesBuilder(), accessListEntryBuilder); + AclBuilder accessListBuilder = + aclUtils.aclBuilder(new AclBuilder(), ACLNAME, accessListEntriesBuilder); + AccessListsBuilder accessListsBuilder = + aclUtils.accesslistsbuilder(new AccessListsBuilder(), accessListBuilder); LOG.info("AccessLists: {}", accessListsBuilder.build()); return accessListsBuilder; } @Test public void testAccessLists() throws InterruptedException { - testModel(setAccessLists(), AccessLists.class, 0); + testModel(accessListsBuilder(), AccessLists.class, 0); } - private ClassifiersBuilder setClassifiers() { - SffBuilder sffBuilder = classifierUtils.sffBuilder(new SffBuilder(), "sffname"); + private ClassifiersBuilder classifiersBuilder() { + SffBuilder sffBuilder = classifierUtils.sffBuilder(new SffBuilder(), SFF1NAME); SffsBuilder sffsBuilder = classifierUtils.sffsBuilder(new SffsBuilder(), sffBuilder); ClassifierBuilder classifierBuilder = classifierUtils.classifierBuilder(new ClassifierBuilder(), - "classifierName", "aclName", sffsBuilder); + "classifierName", ACLNAME, sffsBuilder); ClassifiersBuilder classifiersBuilder = classifierUtils.ClassifiersBuilder(new ClassifiersBuilder(), classifierBuilder); LOG.info("Classifiers: {}", classifiersBuilder.build()); @@ -364,7 +394,7 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { @Test public void testClassifiers() throws InterruptedException { - testModel(setClassifiers(), Classifiers.class, 0); + testModel(classifiersBuilder(), Classifiers.class, 0); } private SfcBuilder netvirtSfcBuilder() { @@ -376,41 +406,55 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { testModel(netvirtSfcBuilder(), Sfc.class, 0); } - private void testModel(Builder builder, Class clazz, long wait) - throws InterruptedException { + private void testModelPut(Builder builder, Class clazz) { InstanceIdentifier path = InstanceIdentifier.create(clazz); assertTrue(mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, path, builder.build())); T result = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, path); assertNotNull(clazz.getSimpleName() + " should not be null", result); - Thread.sleep(wait); + } + + private void testModelDelete(Builder builder, Class clazz) + throws InterruptedException { + InstanceIdentifier path = InstanceIdentifier.create(clazz); assertTrue("Failed to remove " + clazz.getSimpleName(), mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, path)); - result = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, path); + T result = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, path); assertNull(clazz.getSimpleName() + " should be null", result); } + private void testModel(Builder builder, Class clazz, long wait) + throws InterruptedException { + testModelPut(builder, clazz); + Thread.sleep(wait); + testModelDelete(builder, clazz); + } + private ServiceFunctionsBuilder serviceFunctionsBuilder() { - SfDataPlaneLocatorBuilder sfDataPlaneLocator = - serviceFunctionUtils.sfDataPlaneLocatorBuilder(new SfDataPlaneLocatorBuilder(), - "192.168.120.31", 6633, "testDpl1-1234-uuid", "testSff1"); - List sfDataPlaneLocatorList = serviceFunctionUtils.list( - new ArrayList(), sfDataPlaneLocator); + String sf1Name = SF1NAME; + String sf1Ip = SF1IP; + String sff1Ip = SF1IP; + String sff1Name = SFF1NAME; + String sffDpl1Name = SFFDPL1NAME; + String sn1Name = SN1NAME; + String bridge1Name= BRIDGE1NAME; + String sf2Name = SF2NAME; + String sf2Ip = SF2IP; + String sff2Ip = SF2IP; + String sff2Name = SFF2NAME; + String sffDpl2Name = SFFDPL2NAME; + String sn2Name = SN2NAME; + String bridge2Name= BRIDGE2NAME; + int port = GPEPORT; + ServiceFunctionBuilder serviceFunctionBuilder = - serviceFunctionUtils.serviceFunctionBuidler(new ServiceFunctionBuilder(), - "192.168.120.31", "testSf", sfDataPlaneLocatorList, Firewall.class); + serviceFunctionUtils.serviceFunctionBuilder(sf1Ip, port, sffDpl1Name, sff1Name, sf1Name); List serviceFunctionList = serviceFunctionUtils.list( new ArrayList(), serviceFunctionBuilder); - sfDataPlaneLocator = - serviceFunctionUtils.sfDataPlaneLocatorBuilder(new SfDataPlaneLocatorBuilder(), - "192.168.120.32", 6633, "testDpl2-1234-uuid", "testSff2"); - sfDataPlaneLocatorList = serviceFunctionUtils.list( - new ArrayList(), sfDataPlaneLocator); - serviceFunctionBuilder = - serviceFunctionUtils.serviceFunctionBuidler(new ServiceFunctionBuilder(), - "192.168.120.32", "testSf2", sfDataPlaneLocatorList, Dpi.class); - serviceFunctionList = serviceFunctionUtils.list( - serviceFunctionList, serviceFunctionBuilder); + //serviceFunctionBuilder = + // serviceFunctionUtils.serviceFunctionBuilder(sf2Ip, port, sffDpl2Name, sff2Name, sf2Name); + //serviceFunctionList = serviceFunctionUtils.list( + // serviceFunctionList, serviceFunctionBuilder); ServiceFunctionsBuilder serviceFunctionsBuilder = serviceFunctionUtils.serviceFunctionsBuilder(new ServiceFunctionsBuilder(), @@ -420,39 +464,35 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { } private ServiceFunctionForwardersBuilder serviceFunctionForwardersBuilder() { - String sf1Name = "firewall-72"; - String sff1Ip = "192.168.120.31"; - String sff1Name = "SFF1"; - String sffDpl1Name = "sfc-tun2"; - String sn1Name = "OVSDB2"; - String bridge1Name= "sw2"; - int port = 6633; - - DataPlaneLocatorBuilder dataPlaneLocatorBuilder = - serviceFunctionForwarderUtils.dataPlaneLocatorBuilder( - new DataPlaneLocatorBuilder(), sff1Ip, port); - SffDataPlaneLocatorBuilder sffDataPlaneLocatorBuilder = - serviceFunctionForwarderUtils.sffDataPlaneLocatorBuilder( - new SffDataPlaneLocatorBuilder(), dataPlaneLocatorBuilder, sffDpl1Name); - List sffDataPlaneLocatorList = serviceFunctionForwarderUtils.list( - new ArrayList(), sffDataPlaneLocatorBuilder); - - SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = - serviceFunctionForwarderUtils.sffSfDataPlaneLocatorBuilder( - new SffSfDataPlaneLocatorBuilder(), sff1Ip, port); - ServiceFunctionDictionaryBuilder serviceFunctionDictionaryBuilder = - serviceFunctionForwarderUtils.serviceFunctionDictionaryBuilder( - new ServiceFunctionDictionaryBuilder(), sf1Name, Firewall.class, - sffSfDataPlaneLocatorBuilder); - List serviceFunctionDictionaryList = serviceFunctionForwarderUtils.list( - new ArrayList(), serviceFunctionDictionaryBuilder); + String sf1Name = SF1NAME; + String sf1Ip = SF1IP; + String sff1Ip = SF1IP; + String sff1Name = SFF1NAME; + String sffDpl1Name = SFFDPL1NAME; + String sn1Name = SN1NAME; + String bridge1Name= BRIDGE1NAME; + String sf2Name = SF2NAME; + String sf2Ip = SF2IP; + String sff2Ip = SF2IP; + String sff2Name = SFF2NAME; + String sffDpl2Name = SFFDPL2NAME; + String sn2Name = SN2NAME; + String bridge2Name= BRIDGE2NAME; + String aclName = ACLNAME; + int port = GPEPORT; ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder = serviceFunctionForwarderUtils.serviceFunctionForwarderBuilder( - new ServiceFunctionForwarderBuilder(), sff1Name, sn1Name, bridge1Name, - sffDataPlaneLocatorList, serviceFunctionDictionaryList); + sff1Name, sff1Ip, port, sffDpl1Name, sf1Name, sff1Ip, sn1Name, bridge1Name, Firewall.class); List serviceFunctionForwarderList = serviceFunctionForwarderUtils.list( new ArrayList(), serviceFunctionForwarderBuilder); + + //serviceFunctionForwarderBuilder = + // serviceFunctionForwarderUtils.serviceFunctionForwarderBuilder( + // sff2Name, sff2Ip, port, sffDpl2Name, sf2Name, sff2Ip, sn2Name, bridge2Name, Dpi.class); + //serviceFunctionForwarderList = serviceFunctionForwarderUtils.list( + // serviceFunctionForwarderList, serviceFunctionForwarderBuilder); + ServiceFunctionForwardersBuilder serviceFunctionForwardersBuilder = serviceFunctionForwarderUtils.serviceFunctionForwardersBuilder( new ServiceFunctionForwardersBuilder(), serviceFunctionForwarderList); @@ -460,10 +500,97 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { return serviceFunctionForwardersBuilder; } + private ServiceFunctionChainsBuilder serviceFunctionChainsBuilder() { + String sf1Name = "firewall-abstract1"; + String sf2Name = "dpi-abstract1"; + String sfcName = SFCNAME; + + SfcServiceFunctionBuilder sfcServiceFunctionBuilder = serviceFunctionChainUtils.sfcServiceFunctionBuilder( + new SfcServiceFunctionBuilder(), sf1Name, Firewall.class); + List sfcServiceFunctionList = + serviceFunctionChainUtils.list(new ArrayList(), sfcServiceFunctionBuilder); + + //sfcServiceFunctionBuilder = serviceFunctionChainUtils.sfcServiceFunctionBuilder( + // sfcServiceFunctionBuilder, sf2Name, Dpi.class); + //sfcServiceFunctionList = serviceFunctionChainUtils.list(sfcServiceFunctionList, sfcServiceFunctionBuilder); + + ServiceFunctionChainBuilder serviceFunctionChainBuilder = + serviceFunctionChainUtils.serviceFunctionChainBuilder( + new ServiceFunctionChainBuilder(), sfcName, false, sfcServiceFunctionList); + ServiceFunctionChainsBuilder serviceFunctionChainsBuilder = + serviceFunctionChainUtils.serviceFunctionChainsBuilder( + new ServiceFunctionChainsBuilder(), + serviceFunctionChainUtils.list(new ArrayList(), + serviceFunctionChainBuilder)); + LOG.info("ServiceFunctionChains: {}", serviceFunctionChainBuilder.build()); + return serviceFunctionChainsBuilder; + } + + private ServiceFunctionPathsBuilder serviceFunctionPathsBuilder() { + String sfpName = "SFC-Path"; + String sfcName = "SFC"; + short startingIndex = 255; + + ServiceFunctionPathBuilder serviceFunctionPathBuilder = + serviceFunctionPathUtils.serviceFunctionPathBuilder( + new ServiceFunctionPathBuilder(), sfpName, sfcName, startingIndex, false); + ServiceFunctionPathsBuilder serviceFunctionPathsBuilder = + serviceFunctionPathUtils.serviceFunctionPathsBuilder( + serviceFunctionPathUtils.list(new ArrayList(), + serviceFunctionPathBuilder)); + LOG.info("ServiceFunctionPaths: {}", serviceFunctionPathsBuilder.build()); + return serviceFunctionPathsBuilder; + } + @Test public void testSfcModel() throws InterruptedException { testModel(serviceFunctionsBuilder(), ServiceFunctions.class, 3000); testModel(serviceFunctionForwardersBuilder(), ServiceFunctionForwarders.class, 3000); + testModel(serviceFunctionChainsBuilder(), ServiceFunctionChains.class, 3000); + testModel(serviceFunctionPathsBuilder(), ServiceFunctionPaths.class, 3000); + } + + @Test + public void testSfcModels() throws InterruptedException { + String bridgeName = INTEGRATION_BRIDGE_NAME; + ConnectionInfo connectionInfo = southboundUtils.getConnectionInfo(addressStr, portStr); + assertNotNull("connection failed", southboundUtils.connectOvsdbNode(connectionInfo)); + Node ovsdbNode = southboundUtils.getOvsdbNode(connectionInfo); + assertNotNull("node is not connected", ovsdbNode); + + Thread.sleep(5000); + + testModelPut(serviceFunctionsBuilder(), ServiceFunctions.class); + testModelPut(serviceFunctionForwardersBuilder(), ServiceFunctionForwarders.class); + testModelPut(serviceFunctionChainsBuilder(), ServiceFunctionChains.class); + testModelPut(serviceFunctionPathsBuilder(), ServiceFunctionPaths.class); + + Thread.sleep(5000); + + testModelPut(accessListsBuilder(), AccessLists.class); + testModelPut(classifiersBuilder(), Classifiers.class); + + Thread.sleep(10000); + + Node bridgeNode = southbound.getBridgeNode(ovsdbNode, bridgeName); + assertNotNull("bridge " + bridgeName + " was not found", bridgeNode); + long datapathId = southbound.getDataPathId(bridgeNode); + + ISfcClassifierService sfcClassifierService = (ISfcClassifierService) ServiceHelper.getGlobalInstance(ISfcClassifierService.class, this); + LOG.info("SfcClassifierService: {}", sfcClassifierService); + readwait(); + //sfcClassifierService.programIngressClassifier(datapathId); + + NodeBuilder nodeBuilder = FlowUtils.createNodeBuilder(datapathId); + FlowBuilder flowBuilder = getSfcIngressClassifierFlowBuilder(); + Flow flow = getFlow(flowBuilder, nodeBuilder, LogicalDatastoreType.CONFIGURATION); + assertNotNull("Could not find flow in config", flow); + flow = getFlow(flowBuilder, nodeBuilder, LogicalDatastoreType.OPERATIONAL); + assertNotNull("Could not find flow in operational", flow); + + assertTrue(southboundUtils.deleteBridge(connectionInfo, bridgeName)); + Thread.sleep(1000); + assertTrue(southboundUtils.disconnectOvsdbNode(connectionInfo)); } /* @@ -662,17 +789,36 @@ public class NetvirtSfcIT extends AbstractMdsalTestBase { return flowBuilder; } + private FlowBuilder getSfcIngressClassifierFlowBuilder() { + FlowBuilder flowBuilder = new FlowBuilder(); + String flowId = "sfcClass_" + "httpRule"; + flowBuilder.setId(new FlowId(flowId)); + FlowKey key = new FlowKey(new FlowId(flowId)); + flowBuilder.setKey(key); + flowBuilder.setFlowName(flowId); + flowBuilder.setTableId((short)10); + return flowBuilder; + } + private Flow getFlow (FlowBuilder flowBuilder, NodeBuilder nodeBuilder, LogicalDatastoreType store) throws InterruptedException { Flow flow = null; for (int i = 0; i < 10; i++) { flow = FlowUtils.getFlow(flowBuilder, nodeBuilder, dataBroker.newReadOnlyTransaction(), store); if (flow != null) { - LOG.info("getFlow: flow({}): {}", store, flow); + LOG.info("getFlow: flow: {}: {}", store, flow); break; } Thread.sleep(1000); } return flow; } + + private void readwait() { + try { + System.in.read(); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/AclUtils.java b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/AclUtils.java index bae8a7261b..76734d11d1 100644 --- a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/AclUtils.java +++ b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/AclUtils.java @@ -23,6 +23,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.cont import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4Builder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev150611.acl.transport.header.fields.DestinationPortRangeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfcBuilder; public class AclUtils extends AbstractUtils { public MatchesBuilder matchesBuilder(MatchesBuilder matchesBuilder, int destPort) { @@ -43,6 +45,12 @@ public class AclUtils extends AbstractUtils { return actionsBuilder.setPacketHandling(new PermitBuilder().setPermit(permit).build()); } + public ActionsBuilder actionsBuilder(ActionsBuilder actionsBuilder, String sfcName) { + RedirectToSfcBuilder redirectToSfcBuilder = new RedirectToSfcBuilder().setRedirectSfc(sfcName); + + return actionsBuilder.addAugmentation(RedirectToSfc.class, redirectToSfcBuilder.build()); + } + public AceBuilder aceBuilder(AceBuilder accessListEntryBuilder, String ruleName, MatchesBuilder matchesBuilder, @@ -54,27 +62,26 @@ public class AclUtils extends AbstractUtils { } public AccessListEntriesBuilder accessListEntriesBuidler(AccessListEntriesBuilder accessListEntriesBuilder, - AceBuilder accessListEntryBuilder) { - List accessListEntriesList = new ArrayList<>(); - accessListEntriesList.add(accessListEntryBuilder.build()); + AceBuilder aceBuilder) { + List aceList = new ArrayList<>(); + aceList.add(aceBuilder.build()); - return accessListEntriesBuilder; + return accessListEntriesBuilder.setAce(aceList); } - public AclBuilder aclBuilder(AclBuilder accessListBuilder, + public AclBuilder aclBuilder(AclBuilder aclBuilder, String aclName, AccessListEntriesBuilder accessListEntriesBuilder) { - return accessListBuilder + return aclBuilder .setAclName(aclName) .setAccessListEntries(accessListEntriesBuilder.build()); } - public AccessListsBuilder accessListsBuidler(AccessListsBuilder accessListsBuilder, - AclBuilder accessListBuilder) { - List accessListList = new ArrayList<>(); - accessListList.add(accessListBuilder.build()); - accessListsBuilder.setAcl(accessListList); + public AccessListsBuilder accesslistsbuilder(AccessListsBuilder accessListsBuilder, + AclBuilder aclBuilder) { + List aclList = new ArrayList<>(); + aclList.add(aclBuilder.build()); - return accessListsBuilder; + return accessListsBuilder.setAcl(aclList); } } diff --git a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionChainUtils.java b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionChainUtils.java new file mode 100644 index 0000000000..3ad69c4a14 --- /dev/null +++ b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionChainUtils.java @@ -0,0 +1,46 @@ +/* + * Copyright © 2015 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.ovsdb.openstack.netvirt.sfc.utils; + +import java.util.List; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfcName; + +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.ServiceFunctionChainsBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunction; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunctionBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.ServiceFunctionTypeIdentity; + +public class ServiceFunctionChainUtils extends AbstractUtils { + public SfcServiceFunctionBuilder sfcServiceFunctionBuilder(SfcServiceFunctionBuilder sfcServiceFunctionBuilder, + String name, + Class type) { + return sfcServiceFunctionBuilder + .setName(name) + .setType(type); + } + + public ServiceFunctionChainBuilder serviceFunctionChainBuilder( + ServiceFunctionChainBuilder serviceFunctionChainBuilder, String name, Boolean symmetric, + List sfcServiceFunctionList) { + + return serviceFunctionChainBuilder + .setName(SfcName.getDefaultInstance(name)) + .setSymmetric(symmetric) + .setSfcServiceFunction(sfcServiceFunctionList); + } + + public ServiceFunctionChainsBuilder serviceFunctionChainsBuilder( + ServiceFunctionChainsBuilder serviceFunctionChainsBuilder, + List serviceFunctionChainBuilderList) { + + return serviceFunctionChainsBuilder.setServiceFunctionChain(serviceFunctionChainBuilderList); + } +} diff --git a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionForwarderUtils.java b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionForwarderUtils.java index 0d92935b27..79f3a69d7d 100644 --- a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionForwarderUtils.java +++ b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionForwarderUtils.java @@ -8,13 +8,17 @@ package org.opendaylight.ovsdb.openstack.netvirt.sfc.utils; +import java.util.ArrayList; import java.util.List; 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.SffDataPlaneLocatorName; 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.common.rev151017.SnName; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsBridgeAugmentation; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsBridgeAugmentationBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsLocatorOptionsAugmentation; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsLocatorOptionsAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.bridge.OvsBridgeBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.options.OvsOptionsBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.ServiceFunctionForwardersBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder; @@ -27,6 +31,8 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev1407 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.sff.data.plane.locator.DataPlaneLocatorBuilder; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.ServiceFunctionTypeIdentity; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName; public class ServiceFunctionForwarderUtils extends AbstractUtils { public OvsOptionsBuilder ovsOptionsBuilder(OvsOptionsBuilder ovsOptionsBuilder, int port) { @@ -76,17 +82,25 @@ public class ServiceFunctionForwarderUtils extends AbstractUtils { .setSffSfDataPlaneLocator(sffSfDataPlaneLocatorBuilder.build()); } + public OvsBridgeBuilder ovsBridgeBuilder(OvsBridgeBuilder ovsBridgeBuilder, String bridgeNme) { + return ovsBridgeBuilder.setBridgeName(bridgeNme); + } + public ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder( ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder, String sffName, String serviceNodeName, String bridgeName, List sffDataPlaneLocatorList, List serviceFunctionDictionaryList) { + SffOvsBridgeAugmentationBuilder sffOvsBridgeAugmentationBuilder = new SffOvsBridgeAugmentationBuilder(); + sffOvsBridgeAugmentationBuilder.setOvsBridge(ovsBridgeBuilder(new OvsBridgeBuilder(), bridgeName).build()); + return serviceFunctionForwarderBuilder .setName(new SffName(sffName)) .setServiceNode(new SnName(serviceNodeName)) .setServiceFunctionDictionary(serviceFunctionDictionaryList) - .setSffDataPlaneLocator(sffDataPlaneLocatorList); + .setSffDataPlaneLocator(sffDataPlaneLocatorList) + .addAugmentation(SffOvsBridgeAugmentation.class, sffOvsBridgeAugmentationBuilder.build()); } public ServiceFunctionForwardersBuilder serviceFunctionForwardersBuilder( @@ -94,4 +108,31 @@ public class ServiceFunctionForwarderUtils extends AbstractUtils { List serviceFunctionForwarderList) { return serviceFunctionForwardersBuilder.setServiceFunctionForwarder(serviceFunctionForwarderList); } + + public ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder( + String sffName, String sffIp, int port, String sffDplName, + String sfName, String sfIp, String snName, String bridgeName, + Class type) { + + DataPlaneLocatorBuilder dataPlaneLocatorBuilder = + dataPlaneLocatorBuilder(new DataPlaneLocatorBuilder(), sffIp, port); + SffDataPlaneLocatorBuilder sffDataPlaneLocatorBuilder = + sffDataPlaneLocatorBuilder( new SffDataPlaneLocatorBuilder(), dataPlaneLocatorBuilder, sffDplName); + List sffDataPlaneLocatorList = + list(new ArrayList(), sffDataPlaneLocatorBuilder); + + SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = + sffSfDataPlaneLocatorBuilder(new SffSfDataPlaneLocatorBuilder(), sffIp, port); + ServiceFunctionDictionaryBuilder serviceFunctionDictionaryBuilder = + serviceFunctionDictionaryBuilder(new ServiceFunctionDictionaryBuilder(), sfName, type, + sffSfDataPlaneLocatorBuilder); + List serviceFunctionDictionaryList = + list(new ArrayList(), serviceFunctionDictionaryBuilder); + + ServiceFunctionForwarderBuilder serviceFunctionForwarderBuilder = + serviceFunctionForwarderBuilder( + new ServiceFunctionForwarderBuilder(), sffName, snName, bridgeName, + sffDataPlaneLocatorList, serviceFunctionDictionaryList); + return serviceFunctionForwarderBuilder; + } } diff --git a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionPathUtils.java b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionPathUtils.java new file mode 100644 index 0000000000..4f9dfd9e64 --- /dev/null +++ b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionPathUtils.java @@ -0,0 +1,35 @@ +/* + * Copyright © 2015 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.ovsdb.openstack.netvirt.sfc.utils; + +import java.util.List; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfcName; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfpName; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPathsBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder; + +public class ServiceFunctionPathUtils extends AbstractUtils { + public ServiceFunctionPathBuilder serviceFunctionPathBuilder( + ServiceFunctionPathBuilder serviceFunctionPathBuilder, + String sfpName, String sfcName, short startingIndex, Boolean symmetric) { + + return serviceFunctionPathBuilder + .setSymmetric(symmetric) + .setName(SfpName.getDefaultInstance(sfpName)) + .setServiceChainName(SfcName.getDefaultInstance(sfcName)) + .setStartingIndex(startingIndex); + } + + public ServiceFunctionPathsBuilder serviceFunctionPathsBuilder( + List serviceFunctionPathList) { + + return new ServiceFunctionPathsBuilder().setServiceFunctionPath(serviceFunctionPathList); + } +} diff --git a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionUtils.java b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionUtils.java index 6c70675d01..39f38387b8 100644 --- a/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionUtils.java +++ b/openstack/net-virt-sfc/it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/utils/ServiceFunctionUtils.java @@ -8,6 +8,7 @@ package org.opendaylight.ovsdb.openstack.netvirt.sfc.utils; +import java.util.ArrayList; import java.util.List; 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; @@ -17,6 +18,7 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev14070 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.entry.SfDataPlaneLocatorBuilder; 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.ServiceFunctionBuilder; +import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.Firewall; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.ServiceFunctionTypeIdentity; import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; @@ -31,7 +33,7 @@ public class ServiceFunctionUtils extends AbstractUtils { .setServiceFunctionForwarder(new SffName(sffName)); } - public ServiceFunctionBuilder serviceFunctionBuidler(ServiceFunctionBuilder serviceFunctionBuilder, + public ServiceFunctionBuilder serviceFunctionBuilder(ServiceFunctionBuilder serviceFunctionBuilder, String ip, String sfName, List sfDataPlaneLocatorList, Class type) { @@ -47,4 +49,16 @@ public class ServiceFunctionUtils extends AbstractUtils { List serviceFunctionList) { return serviceFunctionsBuilder.setServiceFunction(serviceFunctionList); } + + public ServiceFunctionBuilder serviceFunctionBuilder(String sfIp, int port, String sf1DplName, + String sffname, String sfName) { + SfDataPlaneLocatorBuilder sfDataPlaneLocator = + sfDataPlaneLocatorBuilder(new SfDataPlaneLocatorBuilder(), sfIp, port, sf1DplName, sffname); + List sfDataPlaneLocatorList = + list(new ArrayList(), sfDataPlaneLocator); + return serviceFunctionBuilder( + new ServiceFunctionBuilder(), sfIp, sfName, sfDataPlaneLocatorList, Firewall.class); + } + + } diff --git a/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/FlowUtils.java b/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/FlowUtils.java index 2ab09e9079..915c997ba9 100644 --- a/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/FlowUtils.java +++ b/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/FlowUtils.java @@ -26,6 +26,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +35,9 @@ import org.slf4j.LoggerFactory; public class FlowUtils { private static final Logger LOG = LoggerFactory.getLogger(FlowUtils.class); private static final String OPENFLOW = "openflow"; + public final static long REG_VALUE_FROM_LOCAL = 0x1L; + public final static long REG_VALUE_FROM_REMOTE = 0x2L; + public static final Class REG_FIELD = NxmNxReg0.class; public static String getNodeName(long dpidLong) { return OPENFLOW + ":" + dpidLong; @@ -80,7 +85,7 @@ public class FlowUtils { LOG.error(e.getMessage(), e); } - LOG.info("Cannot find data for Flow {}", flowBuilder.getFlowName()); + LOG.info("Cannot find data for Flow {} in {}", flowBuilder.getFlowName(), store); return null; }