From 60dadf44f03bfd9eec4b223e17e3a459f2843303 Mon Sep 17 00:00:00 2001 From: Michal Rehak Date: Wed, 7 Dec 2016 11:39:42 +0100 Subject: [PATCH] Wire ip-sgt-distribution-service - renderer part added: - dependency + feature - ip-sgt-distribution-service resolution - compute input values - collect src+dest part and invoke the service Change-Id: Ie03ca9d7fd9a88ef3b9843b2ee5d47bd9cf9826f Signed-off-by: Michal Rehak --- features/src/main/features/features.xml | 1 + renderers/ios-xe/pom.xml | 4 ++ .../impl/IosXeRendererProviderImpl.java | 10 ++-- .../impl/config/IosXeProviderInstance.java | 9 +++- .../impl/manager/PolicyManagerImpl.java | 36 +++++++++++--- .../impl/util/PolicyManagerUtil.java | 35 ++++++++++++-- .../blueprint/ios-xe-renderer.xml | 6 ++- .../impl/manager/PolicyManagerImplTest.java | 33 +++++++------ .../impl/util/PolicyManagerUtilTest.java | 47 ++++++++++++++++++- 9 files changed, 147 insertions(+), 34 deletions(-) diff --git a/features/src/main/features/features.xml b/features/src/main/features/features.xml index e419b79c6..09ade0412 100755 --- a/features/src/main/features/features.xml +++ b/features/src/main/features/features.xml @@ -209,6 +209,7 @@ odl-groupbasedpolicy-base odl-groupbasedpolicy-sxp-ep-provider + odl-groupbasedpolicy-ip-sgt-distribution-service odl-sfc-provider odl-sxp-core odl-netconf-clustered-topology diff --git a/renderers/ios-xe/pom.xml b/renderers/ios-xe/pom.xml index 604402063..74be385f1 100755 --- a/renderers/ios-xe/pom.xml +++ b/renderers/ios-xe/pom.xml @@ -78,6 +78,10 @@ org.opendaylight.groupbasedpolicy sxp-ep-provider + + org.opendaylight.groupbasedpolicy + ip-sgt-distribution-service + org.opendaylight.sfc sfc-provider diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/IosXeRendererProviderImpl.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/IosXeRendererProviderImpl.java index 33badeb05..b41b50e3b 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/IosXeRendererProviderImpl.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/IosXeRendererProviderImpl.java @@ -44,6 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinitionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinition; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinitionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,12 +60,15 @@ public class IosXeRendererProviderImpl implements IosXeRendererProvider, Binding private final SxpEpProviderProvider sxpEpProvider; private RendererConfigurationListenerImpl rendererConfigurationListener; private IosXeCapableNodeListenerImpl iosXeCapableNodeListener; + private final IpSgtDistributionService ipSgtDistributor; public IosXeRendererProviderImpl(final DataBroker dataBroker, final BindingAwareBroker broker, - final SxpEpProviderProvider sxpEpProvider) { + final SxpEpProviderProvider sxpEpProvider, + final IpSgtDistributionService ipSgtDistributor) { LOG.debug("ios-xe renderer bootstrap"); this.dataBroker = Preconditions.checkNotNull(dataBroker, "missing dataBroker dependency"); this.sxpEpProvider = Preconditions.checkNotNull(sxpEpProvider, "missing sxpEpProvider param"); + this.ipSgtDistributor = Preconditions.checkNotNull(ipSgtDistributor, "missing ipSgtDistributor param"); broker.registerProvider(this); } @@ -90,7 +94,7 @@ public class IosXeRendererProviderImpl implements IosXeRendererProvider, Binding iosXeCapableNodeListener = new IosXeCapableNodeListenerImpl(dataBroker, nodeManager); // policy-manager and delegates - final PolicyManager policyManager = new PolicyManagerImpl(dataBroker, nodeManager, sxpEpProvider.getEPToSgtMapper()); + final PolicyManager policyManager = new PolicyManagerImpl(dataBroker, nodeManager, sxpEpProvider.getEPToSgtMapper(), ipSgtDistributor); final PolicyManager policyManagerZip = new PolicyManagerZipImpl(policyManager); // renderer-configuration endpoints @@ -105,7 +109,7 @@ public class IosXeRendererProviderImpl implements IosXeRendererProvider, Binding private void writeRendererCapabilities() { final Optional optionalWriteTransaction = NetconfTransactionCreator.netconfWriteOnlyTransaction(dataBroker); - if (!optionalWriteTransaction.isPresent()) { + if (! optionalWriteTransaction.isPresent()) { LOG.warn("Failed to create transaction, mountpoint: {}", dataBroker); return; } diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/config/IosXeProviderInstance.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/config/IosXeProviderInstance.java index 3ef74be95..4421bd10c 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/config/IosXeProviderInstance.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/config/IosXeProviderInstance.java @@ -14,12 +14,14 @@ import com.google.common.util.concurrent.ListenableFuture; import org.opendaylight.controller.config.yang.config.groupbasedpolicy.GroupbasedpolicyInstance; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.IosXeRendererProviderImpl; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,17 +35,20 @@ public class IosXeProviderInstance implements ClusterSingletonService, AutoClose private final BindingAwareBroker bindingAwareBroker; private final ClusterSingletonServiceProvider clusterSingletonService; private final SxpEpProviderProvider sxpEpProvider; + private final IpSgtDistributionService ipSgtDistributor; private ClusterSingletonServiceRegistration singletonServiceRegistration; private IosXeRendererProviderImpl renderer; public IosXeProviderInstance(final DataBroker dataBroker, final BindingAwareBroker broker, final ClusterSingletonServiceProvider clusterSingletonService, - final SxpEpProviderProvider sxpEpProvider) { + final SxpEpProviderProvider sxpEpProvider, + final RpcProviderRegistry rpcProviderRegistry) { this.dataBroker = Preconditions.checkNotNull(dataBroker); this.bindingAwareBroker = Preconditions.checkNotNull(broker); this.clusterSingletonService = Preconditions.checkNotNull(clusterSingletonService); this.sxpEpProvider = Preconditions.checkNotNull(sxpEpProvider); + this.ipSgtDistributor = Preconditions.checkNotNull(rpcProviderRegistry.getRpcService(IpSgtDistributionService.class)); } public void initialize() { @@ -54,7 +59,7 @@ public class IosXeProviderInstance implements ClusterSingletonService, AutoClose @Override public void instantiateServiceInstance() { LOG.info("Instantiating {}", this.getClass().getSimpleName()); - renderer = new IosXeRendererProviderImpl(dataBroker, bindingAwareBroker, sxpEpProvider); + renderer = new IosXeRendererProviderImpl(dataBroker, bindingAwareBroker, sxpEpProvider, ipSgtDistributor); } @Override diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java index c27361312..3cd543e19 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java @@ -11,23 +11,25 @@ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager; import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Create; import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Delete; -import java.util.concurrent.TimeUnit; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; -import java.util.Optional; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.api.manager.PolicyManager; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil; +import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.RendererPolicyUtil; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.StatusUtil; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName; @@ -43,6 +45,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.status.UnconfiguredEndpointsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SendIpSgtBindingToPeerInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -57,12 +61,15 @@ public class PolicyManagerImpl implements PolicyManager { private final DataBroker dataBroker; private final NodeManager nodeManager; private final EPToSgtMapper epToSgtMapper; + private final IpSgtDistributionService ipSgtDistributor; public PolicyManagerImpl(final DataBroker dataBroker, - final NodeManager nodeManager, final EPToSgtMapper epToSgtMapper) { + final NodeManager nodeManager, final EPToSgtMapper epToSgtMapper, + final IpSgtDistributionService ipSgtDistributor) { this.dataBroker = Preconditions.checkNotNull(dataBroker); this.nodeManager = Preconditions.checkNotNull(nodeManager); this.epToSgtMapper = Preconditions.checkNotNull(epToSgtMapper); + this.ipSgtDistributor = Preconditions.checkNotNull(ipSgtDistributor); } @Override @@ -136,7 +143,7 @@ public class PolicyManagerImpl implements PolicyManager { continue; } final Optional optionalManagementIpAddress = nodeManager.getNodeManagementIpByMountPointIid(mountpointIid); - if (!optionalManagementIpAddress.isPresent()) { + if (! optionalManagementIpAddress.isPresent()) { final String info = String.format("Can not create policyWriter, managementIpAddress for mountpoint %s is null", mountpointIid); context.appendUnconfiguredRendererEP(StatusUtil.assembleFullyNotConfigurableRendererEP(context, info)); @@ -160,12 +167,25 @@ public class PolicyManagerImpl implements PolicyManager { final long TIMEOUT = 10; final TimeUnit UNIT = TimeUnit.SECONDS; + final SendIpSgtBindingToPeerInputBuilder ipSgtBindings = new SendIpSgtBindingToPeerInputBuilder(); + ipSgtBindings.setBinding(new ArrayList<>()); + final Sgt sourceSgt = PolicyManagerUtil.findSgtTag(epToSgtMapper, rendererEndpoint, dataAfter.getEndpoints() .getAddressEndpointWithLocation(), TIMEOUT, UNIT); + final AddressEndpointWithLocation sourceEPAddressWithLocation = RendererPolicyUtil.lookupEndpoint( + rendererEndpoint, dataAfter.getEndpoints().getAddressEndpointWithLocation()); + + PolicyManagerUtil.createIpSgtBindingItem(sourceSgt, sourceEPAddressWithLocation).ifPresent(ipSgtBindings.getBinding()::add); + // Peer Endpoint for (PeerEndpoint peerEndpoint : rendererEndpoint.getPeerEndpoint()) { final Sgt destinationSgt = PolicyManagerUtil.findSgtTag(epToSgtMapper, peerEndpoint, dataAfter.getEndpoints() .getAddressEndpointWithLocation(), TIMEOUT, UNIT); + final AddressEndpointWithLocation destinationEPAddressWithLocation = RendererPolicyUtil.lookupEndpoint( + peerEndpoint, dataAfter.getEndpoints().getAddressEndpointWithLocation()); + PolicyManagerUtil.createIpSgtBindingItem(destinationSgt, destinationEPAddressWithLocation) + .ifPresent(ipSgtBindings.getBinding()::add); + if (sourceSgt == null || destinationSgt == null) { final String info = String.format("Endpoint-policy: missing sgt value(sourceSgt=%s, destinationSgt=%s)", sourceSgt, destinationSgt); @@ -186,6 +206,8 @@ public class PolicyManagerImpl implements PolicyManager { peerEndpoint); } } + + ipSgtDistributor.sendIpSgtBindingToPeer(ipSgtBindings.build()); } final ListenableFuture> cumulativeResult = context.getCumulativeResult(); return Futures.transform(cumulativeResult, new Function, Optional>() { diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java index e81924d2c..1b44900cd 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java @@ -34,6 +34,7 @@ import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.P import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriterUtil; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper; 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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ios.rev160308.ClassNameType; import org.opendaylight.yang.gen.v1.urn.ios.rev160308.PolicyActionType; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._class.map.match.grouping.SecurityGroup; @@ -75,6 +76,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.IpPrefixType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation; @@ -86,6 +88,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.rpc.fields.Binding; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.rpc.fields.BindingBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.rpc.fields.binding.PeerNodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -115,7 +120,7 @@ public class PolicyManagerUtil { final PolicyConfigurationContext context, final Configuration data, final PeerEndpoint peerEndpoint, final DataBroker dataBroker) { // Create appropriate policy map - if (!PolicyManagerUtil.constructEmptyPolicyMapWithInterface(context)) { + if (! PolicyManagerUtil.constructEmptyPolicyMapWithInterface(context)) { final String policyMapName = context.getPolicyMapLocation().getPolicyMapName(); final String interfaceName = context.getPolicyMapLocation().getInterfaceName(); final String info = String.format("Unable to create policy-map %s on interface %s", policyMapName, interfaceName); @@ -166,7 +171,7 @@ public class PolicyManagerUtil { } // Remove policy-map if empty - if (!deleteEmptyPolicyMapWithInterface(context.getPolicyMapLocation())) { + if (! deleteEmptyPolicyMapWithInterface(context.getPolicyMapLocation())) { final PolicyManagerImpl.PolicyMapLocation location = context.getPolicyMapLocation(); final String info = String.format("Unable to remove policy-map %s and interface %s", location.getPolicyMapName(), location.getInterfaceName()); @@ -188,10 +193,10 @@ public class PolicyManagerUtil { final ContractId contractId = ruleGroupWithParticipation.getContractId(); final SubjectName subjectName = ruleGroupWithParticipation.getSubjectName(); for (RuleGroup ruleGroup : data.getRuleGroups().getRuleGroup()) { - if (!ruleGroup.getTenantId().equals(tenantId)) { + if (! ruleGroup.getTenantId().equals(tenantId)) { continue; } - if (!ruleGroup.getContractId().equals(contractId)) { + if (! ruleGroup.getContractId().equals(contractId)) { continue; } if (ruleGroup.getSubjectName().equals(subjectName)) { @@ -485,6 +490,28 @@ public class PolicyManagerUtil { return "srcTag" + sourceTag + "_dstTag" + destinationTag; } + public static Optional createIpSgtBindingItem(final Sgt sgt, final AddressEndpointWithLocation addressEndpointWithLocation) { + final Optional result; + final LocationType locationType = addressEndpointWithLocation.getAbsoluteLocation().getLocationType(); + + if (IpPrefixType.class == addressEndpointWithLocation.getAddressType() && + locationType instanceof ExternalLocationCase && + sgt != null) { + final Binding binding = new BindingBuilder() + .setSgt(sgt) + .setIpPrefix(new IpPrefix(addressEndpointWithLocation.getAddress().toCharArray())) + .setPeerNode(Collections.singletonList(new PeerNodeBuilder() + .setNodeIid(((ExternalLocationCase) locationType).getExternalNodeMountPoint()) + .build())) + .build(); + + result = Optional.ofNullable(binding); + } else { + result = Optional.empty(); + } + return result; + } + /** * Action in Direction - wrapper class */ diff --git a/renderers/ios-xe/src/main/resources/org/opendaylight/blueprint/ios-xe-renderer.xml b/renderers/ios-xe/src/main/resources/org/opendaylight/blueprint/ios-xe-renderer.xml index d3177038a..40b7d8818 100644 --- a/renderers/ios-xe/src/main/resources/org/opendaylight/blueprint/ios-xe-renderer.xml +++ b/renderers/ios-xe/src/main/resources/org/opendaylight/blueprint/ios-xe-renderer.xml @@ -8,12 +8,14 @@ + + init-method="initialize" destroy-method="close"> - + + \ No newline at end of file diff --git a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java index f4006a79e..83cf5670b 100644 --- a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java +++ b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java @@ -7,11 +7,24 @@ */ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction.Out; +import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation.PROVIDER; +import static org.powermock.api.support.membermodification.MemberMatcher.method; +import static org.powermock.api.support.membermodification.MemberModifier.stub; + import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil; @@ -74,6 +87,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.AddressEndpointWithLocationAug; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.AddressEndpointWithLocationAugBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.IpSgtDistributionService; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; @@ -86,24 +100,11 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction.Out; -import static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation.PROVIDER; -import static org.powermock.api.support.membermodification.MemberMatcher.method; -import static org.powermock.api.support.membermodification.MemberModifier.stub; - @RunWith(PowerMockRunner.class) @PrepareForTest({RendererPolicyUtil.class, PolicyManagerUtil.class, SfcProviderServiceForwarderAPI.class}) public class PolicyManagerImplTest { - private final String address = "address"; + private final String address = "10.11.12.42/32"; private final String connector = "connector"; private final SfpName servicePath = new SfpName("service-path"); private final RspName renderedPath = new RspName("rendered-path"); @@ -125,6 +126,8 @@ public class PolicyManagerImplTest { private DataBroker mountpoint; private NodeManager nodeManager; private EPToSgtMapper epToSgtMapper; + @Mock + private IpSgtDistributionService ipSgtDistributor; @Before public void init() { @@ -132,7 +135,7 @@ public class PolicyManagerImplTest { ReadWriteTransaction readWriteTransaction = mock(ReadWriteTransaction.class); nodeManager = mock(NodeManager.class); epToSgtMapper = mock(EPToSgtMapper.class); - policyManager = new PolicyManagerImpl(mountpoint, nodeManager, epToSgtMapper); + policyManager = new PolicyManagerImpl(mountpoint, nodeManager, epToSgtMapper, ipSgtDistributor); when(mountpoint.newReadWriteTransaction()).thenReturn(readWriteTransaction); when(readWriteTransaction.submit()).thenReturn(Futures.immediateCheckedFuture(null)); } diff --git a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtilTest.java b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtilTest.java index 642a7aabe..7f920094a 100644 --- a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtilTest.java +++ b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtilTest.java @@ -10,9 +10,9 @@ package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util; import static org.junit.Assert.assertNotNull; -import java.util.Collections; import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; +import java.util.Collections; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -38,14 +38,29 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev1407 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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native.ClassMap; import org.opendaylight.yang.gen.v1.urn.ios.rev160308._native._class.map.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.IpPrefixType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.rpc.fields.Binding; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.rpc.fields.binding.PeerNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.rpc.fields.binding.PeerNodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; +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.NodeKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** @@ -151,4 +166,34 @@ public class PolicyManagerUtilTest { Match result = PolicyManagerUtil.createSecurityGroupMatch(10, 20); assertNotNull(result); } + + @Test + public void createIpSgtBindingItem() throws Exception { + final Sgt sgt = new Sgt(42); + final IpPrefix ipPrefix = new IpPrefix("10.11.12.42/32".toCharArray()); + final InstanceIdentifier nodeII = InstanceIdentifier.create(NetworkTopology.class) + .child(Topology.class, new TopologyKey(new TopologyId("dummy-topology"))) + .child(Node.class, new NodeKey(new NodeId("dummy-node-1"))); + final PeerNode peerNode = new PeerNodeBuilder() + .setNodeIid(nodeII) + .build(); + final AddressEndpointWithLocation addressEndpointWithLocation = new AddressEndpointWithLocationBuilder() + .setAddressType(IpPrefixType.class) + .setAddress(ipPrefix.getIpv4Prefix().getValue()) + .setAbsoluteLocation(new AbsoluteLocationBuilder() + .setLocationType(new ExternalLocationCaseBuilder() + .setExternalNodeMountPoint(nodeII) + .build()) + .build()) + .build(); + + final java.util.Optional ipSgtBindingItem = PolicyManagerUtil.createIpSgtBindingItem(sgt, addressEndpointWithLocation); + + Assert.assertTrue(ipSgtBindingItem.isPresent()); + final Binding binding = ipSgtBindingItem.get(); + Assert.assertEquals(sgt, binding.getSgt()); + Assert.assertEquals(ipPrefix, binding.getIpPrefix()); + Assert.assertEquals(1, binding.getPeerNode().size()); + Assert.assertEquals(peerNode, binding.getPeerNode().get(0)); + } } -- 2.36.6