Wire ip-sgt-distribution-service - renderer part 86/49186/1
authorMichal Rehak <mirehak@cisco.com>
Wed, 7 Dec 2016 10:39:42 +0000 (11:39 +0100)
committerMichal Rehak <mirehak@cisco.com>
Fri, 9 Dec 2016 15:50:33 +0000 (16:50 +0100)
    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 <mirehak@cisco.com>
(cherry picked from commit 10621dd92cd8df1e759fa25c3a7e4b250c02ba77)

features/src/main/features/features.xml
renderers/ios-xe/pom.xml
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/IosXeRendererProviderImpl.java
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/config/IosXeProviderInstance.java
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImpl.java
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtil.java
renderers/ios-xe/src/main/resources/org/opendaylight/blueprint/ios-xe-renderer.xml
renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/manager/PolicyManagerImplTest.java
renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/PolicyManagerUtilTest.java

index 206804b9b0bfe88a3af7c43e504e363bc20688c2..387d824cf9bc2c873739a8bb108799be4c90e5cf 100755 (executable)
     <feature name='odl-groupbasedpolicy-ios-xe' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: ios-xe renderer'>
         <feature version="${project.version}">odl-groupbasedpolicy-base</feature>
         <feature version="${project.version}">odl-groupbasedpolicy-sxp-ep-provider</feature>
+        <feature version="${project.version}">odl-groupbasedpolicy-ip-sgt-distribution-service</feature>
         <feature version="${sfc.version}">odl-sfc-provider</feature>
         <feature version="${sxp.version}">odl-sxp-core</feature>
         <feature version="${netconf.version}">odl-netconf-topology</feature>
index c37b33f9c87a58f8c6e6ae9592c822e5d6fc6277..cd592b1770a80bec7a6fa370b1f720a40549c40f 100755 (executable)
             <groupId>org.opendaylight.groupbasedpolicy</groupId>
             <artifactId>sxp-ep-provider</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.groupbasedpolicy</groupId>
+            <artifactId>ip-sgt-distribution-service</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.sfc</groupId>
             <artifactId>sfc-provider</artifactId>
index 33badeb0576087d1ed7ddc5bb070990c3c658261..b41b50e3b6d6d54c8066b64dffb192edfe8bcc2d 100644 (file)
@@ -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<WriteTransaction> optionalWriteTransaction =
                 NetconfTransactionCreator.netconfWriteOnlyTransaction(dataBroker);
-        if (!optionalWriteTransaction.isPresent()) {
+        if (! optionalWriteTransaction.isPresent()) {
             LOG.warn("Failed to create transaction, mountpoint: {}", dataBroker);
             return;
         }
index 3ef74be95b2c7080f4b1e67ed1212873b93ed02b..4421bd10c6ec62156b95431177c6c4a8aa8ea11c 100644 (file)
@@ -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
index c273613126a1bec6929e7632ed348c894ab26b64..3cd543e19c1ecb756234ba72795224e801c2f9d3 100644 (file)
@@ -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<String> 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<List<Boolean>> cumulativeResult = context.getCumulativeResult();
         return Futures.transform(cumulativeResult, new Function<List<Boolean>, Optional<Status>>() {
index e81924d2c5bf068106c6d7733f9620a5ab12ab1f..1b44900cd8e1d8597fd26c1fb068be4d5b0cb3d5 100644 (file)
@@ -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<Binding> createIpSgtBindingItem(final Sgt sgt, final AddressEndpointWithLocation addressEndpointWithLocation) {
+        final Optional<Binding> 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
      */
index d3177038ae557fd33e23aeea220f439725613f5f..40b7d88185c2242e6d7d59e172131564a48795fd 100644 (file)
@@ -8,12 +8,14 @@
     <reference id="clusterSingletonService" interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
     <reference id="sxpEpProvider"
                interface="org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider"/>
+    <reference id="rpcRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"/>
 
     <bean id="iosXeRenderer" class="org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.config.IosXeProviderInstance"
-        init-method="initialize" destroy-method="close">
+          init-method="initialize" destroy-method="close">
         <argument ref="dataBroker"/>
         <argument ref="broker"/>
-        <argument ref="clusterSingletonService" />
+        <argument ref="clusterSingletonService"/>
         <argument ref="sxpEpProvider"/>
+        <argument ref="rpcRegistry"/>
     </bean>
 </blueprint>
\ No newline at end of file
index f4006a79e23fc08147e6454b9b45b1d4ec19291a..83cf5670b4b0a8546b8f15c0033a8fa375db8304 100644 (file)
@@ -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));
     }
index ac95a22eac920d08077f990b7d829c9e0689c3df..5caf222b58ebf899001f8d1f4908b5c48d173038 100644 (file)
@@ -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);
     }
-}
\ No newline at end of file
+
+    @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<Node> 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<Binding> 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));
+    }
+}