X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=renderers%2Fofoverlay%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fgroupbasedpolicy%2Frenderer%2Fofoverlay%2Fsf%2FChainAction.java;h=2c349f92d37d70e99f8c4af27bfee63dad4a2614;hb=refs%2Fchanges%2F29%2F40829%2F8;hp=8ee0c2c30cdc5de6dae802623718fff30791cecc;hpb=f9fcafb0efb24a32d9e357831bf0d1c9096717c2;p=groupbasedpolicy.git diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java index 8ee0c2c30..2c349f92d 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java @@ -12,6 +12,7 @@ import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.ChainAct import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxSetNsiAction; import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxSetNspAction; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -22,13 +23,12 @@ import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition; import org.opendaylight.groupbasedpolicy.dto.ValidationResultBuilder; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter; -import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.policyenforcer.PolicyEnforcer; -import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.policyenforcer.PolicyEnforcer.NetworkElements; -import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.policyenforcer.PolicyEnforcer.PolicyPair; +import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.policyenforcer.NetworkElements; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcIidFactory; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader.SfcNshHeaderBuilder; import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.groupbasedpolicy.util.IetfModelCodec; import org.opendaylight.sfc.provider.api.SfcProviderRenderedPathAPI; import org.opendaylight.sfc.provider.api.SfcProviderServiceChainAPI; import org.opendaylight.sfc.provider.api.SfcProviderServicePathAPI; @@ -42,7 +42,7 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev1407 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.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.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.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; @@ -73,6 +73,11 @@ import com.google.common.collect.Iterables; public class ChainAction extends Action { private static final Logger LOG = LoggerFactory.getLogger(ChainAction.class); + private List resolvedSymmetricChains = new ArrayList<>();; + + public void setResolvedSymmetricChains(List resolvedSymmetricChains) { + this.resolvedSymmetricChains = resolvedSymmetricChains; + } @Override public ActionDefinitionId getId() { @@ -86,7 +91,7 @@ public class ChainAction extends Action { @Override public List updateAction(List actions, Map params, Integer order, - NetworkElements netElements, PolicyPair policyPair, OfWriter ofWriter, + NetworkElements netElements, OfWriter ofWriter, OfContext ctx, Direction direction) { /* * Get the named chain @@ -113,7 +118,7 @@ public class ChainAction extends Action { return null; } - Long returnVnId; + Long tunnelId; /* * If path is symmetrical then there are two RSPs. @@ -134,7 +139,7 @@ public class ChainAction extends Action { ReadOnlyTransaction rTx = ctx.getDataBroker().newReadOnlyTransaction(); RenderedServicePath renderedServicePath; RenderedServicePath rsp = getRspByName(rspName, rTx); - returnVnId = (long) resolveTunnelId(netElements, false); + tunnelId = (long) netElements.getSrcEpOrdinals().getTunnelId(); if (rsp == null) { renderedServicePath = createRsp(sfcPath, rspName); if (renderedServicePath != null) { @@ -148,10 +153,10 @@ public class ChainAction extends Action { } try { - if (sfcPath.isSymmetric() && direction.equals(Direction.Out)) { + if (sfcPath.isSymmetric() && resolvedSymmetricChains.contains(chainName)) { rspName = new RspName(rspName.getValue() + "-Reverse"); rsp = getRspByName(rspName, rTx); - returnVnId = (long) resolveTunnelId(netElements, true); + tunnelId = (long) netElements.getDstEpOrdinals().getTunnelId(); if (rsp == null) { LOG.info("updateAction: Could not find Reverse RSP {} for Chain {}", rspName, chainName); renderedServicePath = createSymmetricRsp(renderedServicePath); @@ -185,34 +190,25 @@ public class ChainAction extends Action { RenderedServicePathHop firstRspHop = renderedServicePath.getRenderedServicePathHop().get(0); RenderedServicePathHop lastRspHop = Iterables.getLast(renderedServicePath.getRenderedServicePathHop()); - SfcNshHeader sfcNshHeader = new SfcNshHeaderBuilder().setNshTunIpDst(rspFirstHop.getIp().getIpv4Address()) - .setNshTunUdpPort(rspFirstHop.getPort()) + SfcNshHeader sfcNshHeader = new SfcNshHeaderBuilder().setNshTunIpDst(IetfModelCodec.ipv4Address2010(rspFirstHop.getIp().getIpv4Address())) + .setNshTunUdpPort(IetfModelCodec.portNumber2010(rspFirstHop.getPort())) .setNshNsiToChain(firstRspHop.getServiceIndex()) .setNshNspToChain(renderedServicePath.getPathId()) .setNshNsiFromChain((short) (lastRspHop.getServiceIndex().intValue() - 1)) .setNshNspFromChain(renderedServicePath.getPathId()) .setNshMetaC1(SfcNshHeader.convertIpAddressToLong(tunnelDest.getIpv4Address())) - .setNshMetaC2(returnVnId) + .setNshMetaC2(tunnelId) .build(); - // Cannot set all actions here. Some actions are destination specific, and we don't know - // a destination is to be - // chained until we reach this point. Need to write match/action in External Table for - // chained packets. - actions = addActionBuilder(actions, nxSetNsiAction(sfcNshHeader.getNshNsiToChain()), order); - actions = addActionBuilder(actions, nxSetNspAction(sfcNshHeader.getNshNspToChain()), order); - createChainTunnelFlows(sfcNshHeader, netElements, ofWriter, ctx); - return actions; - } + createChainTunnelFlows(sfcNshHeader, netElements, ofWriter, ctx, direction); - // Return tunnelId according to policy direction - private int resolveTunnelId(NetworkElements netElements, boolean isReversedPath) { - if ((isReversedPath && PolicyEnforcer.checkPolicyOrientation()) - || (!isReversedPath && !PolicyEnforcer.checkPolicyOrientation())) { - return netElements.getDstEpOrdinals().getTunnelId(); + if (direction.equals(Direction.Out) ) { + actions = addActionBuilder(actions, nxSetNsiAction(sfcNshHeader.getNshNsiToChain()), order); + actions = addActionBuilder(actions, nxSetNspAction(sfcNshHeader.getNshNspToChain()), order); } else { - return netElements.getSrcEpOrdinals().getTunnelId(); + return null; } + return actions; } private RenderedServicePath createRsp(ServiceFunctionPath sfcPath, RspName rspName) { @@ -288,11 +284,13 @@ public class ChainAction extends Action { } } - public ServiceFunctionPath getSfcPath(SfcName chainName) { + public static ServiceFunctionPath getSfcPath(SfcName chainName) { ServiceFunctionPaths paths = SfcProviderServicePathAPI.readAllServiceFunctionPaths(); - for (ServiceFunctionPath path : paths.getServiceFunctionPath()) { - if (path.getServiceChainName().equals(chainName)) { - return path; + if (paths != null) { + for (ServiceFunctionPath path : paths.getServiceFunctionPath()) { + if (path.getServiceChainName().equals(chainName)) { + return path; + } } } return null; @@ -324,5 +322,4 @@ public class ChainAction extends Action { return ImmutableList.of(new SupportedParameterValuesBuilder() .setParameterName(new ParameterName(ChainActionDefinition.SFC_CHAIN_NAME)).build()); } - }