BUG-6650: ep-ip/sgt, propose sxp-generator 84/46384/2
authorMichal Rehak <mirehak@cisco.com>
Mon, 22 Aug 2016 09:26:15 +0000 (11:26 +0200)
committerMichal Rehak <mirehak@cisco.com>
Mon, 3 Oct 2016 15:10:42 +0000 (17:10 +0200)
    - ep-to-sgt mapper implementation
    - sxp-ep-mapper wiring
    - added blueprint migration impact
       - moved sgt-generator-config model to top-level

Change-Id: Id3765448f1e0e7da37701131e307c6f544dd20d2
Signed-off-by: Michal Rehak <mirehak@cisco.com>
(cherry picked from commit ed1db1fa56f6dfc88d1c390ffb8c63b2cdc2f5a8)

28 files changed:
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
sxp-integration/sxp-ep-provider/src/main/config/default-config.xml
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderInstance.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderModule.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPPolicyTemplateDaoFacade.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPToSgtMapper.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPToSgtMapperImpl.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SgtGeneratorImpl.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SimpleCachedDao.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SxpEpProviderProviderImpl.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImpl.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/SimpleCachedDaoEPForwardingTemplateImpl.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/SimpleCachedDaoImpl.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/listen/EPPolicyTemplateListenerImpl.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/util/EPTemplateUtil.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/spi/SxpEpProviderProvider.java
sxp-integration/sxp-ep-provider/src/main/resources/org/opendaylight/blueprint/sxp-mapper.xml [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/yang/sxp-ep-provider-cfg.yang
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderInstanceTest.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPToSgtMapperImplTest.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SgtGeneratorImplTest.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SxpEpProviderProviderImplTest.java
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImplTest.java

index e6075f3356904bb4626046c00d2e7f0e07126d20..33badeb0576087d1ed7ddc5bb070990c3c658261 100644 (file)
@@ -13,6 +13,8 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
+import java.util.List;
+import java.util.Optional;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -31,6 +33,7 @@ import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.ChainAction
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.Classifier;
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.EtherTypeClassifier;
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.IpProtoClassifier;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
@@ -45,9 +48,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.Optional;
-
 /**
  * Purpose: bootstrap provider implementation of Ios-xe renderer
  */
@@ -56,12 +56,15 @@ public class IosXeRendererProviderImpl implements IosXeRendererProvider, Binding
     private static final Logger LOG = LoggerFactory.getLogger(IosXeRendererProviderImpl.class);
 
     private final DataBroker dataBroker;
+    private final SxpEpProviderProvider sxpEpProvider;
     private RendererConfigurationListenerImpl rendererConfigurationListener;
     private IosXeCapableNodeListenerImpl iosXeCapableNodeListener;
 
-    public IosXeRendererProviderImpl(final DataBroker dataBroker, final BindingAwareBroker broker) {
+    public IosXeRendererProviderImpl(final DataBroker dataBroker, final BindingAwareBroker broker,
+                                     final SxpEpProviderProvider sxpEpProvider) {
         LOG.debug("ios-xe renderer bootstrap");
         this.dataBroker = Preconditions.checkNotNull(dataBroker, "missing dataBroker dependency");
+        this.sxpEpProvider = Preconditions.checkNotNull(sxpEpProvider, "missing sxpEpProvider param");
         broker.registerProvider(this);
     }
 
@@ -87,7 +90,7 @@ public class IosXeRendererProviderImpl implements IosXeRendererProvider, Binding
         iosXeCapableNodeListener = new IosXeCapableNodeListenerImpl(dataBroker, nodeManager);
 
         // policy-manager and delegates
-        final PolicyManager policyManager = new PolicyManagerImpl(dataBroker, nodeManager);
+        final PolicyManager policyManager = new PolicyManagerImpl(dataBroker, nodeManager, sxpEpProvider.getEPToSgtMapper());
         final PolicyManager policyManagerZip = new PolicyManagerZipImpl(policyManager);
 
         // renderer-configuration endpoints
index e261ece26f46528bf0198a2472a55888159073a4..3ef74be95b2c7080f4b1e67ed1212873b93ed02b 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.controller.config.yang.config.groupbasedpolicy.Groupbase
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 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;
@@ -31,15 +32,18 @@ public class IosXeProviderInstance implements ClusterSingletonService, AutoClose
     private final DataBroker dataBroker;
     private final BindingAwareBroker bindingAwareBroker;
     private final ClusterSingletonServiceProvider clusterSingletonService;
+    private final SxpEpProviderProvider sxpEpProvider;
     private ClusterSingletonServiceRegistration singletonServiceRegistration;
     private IosXeRendererProviderImpl renderer;
 
     public IosXeProviderInstance(final DataBroker dataBroker,
                                  final BindingAwareBroker broker,
-                                 final ClusterSingletonServiceProvider clusterSingletonService) {
+                                 final ClusterSingletonServiceProvider clusterSingletonService,
+                                 final SxpEpProviderProvider sxpEpProvider) {
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
         this.bindingAwareBroker = Preconditions.checkNotNull(broker);
         this.clusterSingletonService = Preconditions.checkNotNull(clusterSingletonService);
+        this.sxpEpProvider = Preconditions.checkNotNull(sxpEpProvider);
     }
 
     public void initialize() {
@@ -50,7 +54,7 @@ public class IosXeProviderInstance implements ClusterSingletonService, AutoClose
     @Override
     public void instantiateServiceInstance() {
         LOG.info("Instantiating {}", this.getClass().getSimpleName());
-        renderer = new IosXeRendererProviderImpl(dataBroker, bindingAwareBroker);
+        renderer = new IosXeRendererProviderImpl(dataBroker, bindingAwareBroker, sxpEpProvider);
     }
 
     @Override
index 3b5f5a5e2c1939d685a094d671ae5dc110ef90ce..884e74e469defdecfb9a73440552f610aeace3b5 100644 (file)
@@ -28,6 +28,8 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
 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.StatusUtil;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
@@ -54,11 +56,13 @@ public class PolicyManagerImpl implements PolicyManager {
     private static final String BASE_POLICY_MAP_NAME = "service-chains-";
     private final DataBroker dataBroker;
     private final NodeManager nodeManager;
+    private final EPToSgtMapper epToSgtMapper;
 
     public PolicyManagerImpl(final DataBroker dataBroker,
-                             final NodeManager nodeManager) {
+                             final NodeManager nodeManager, final EPToSgtMapper epToSgtMapper) {
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
         this.nodeManager = Preconditions.checkNotNull(nodeManager);
+        this.epToSgtMapper = Preconditions.checkNotNull(epToSgtMapper);
     }
 
     @Override
@@ -152,11 +156,11 @@ public class PolicyManagerImpl implements PolicyManager {
                     managementIpAddress, mountpoint);
             context.setPolicyMapLocation(policyMapLocation);
 
-            final Sgt sourceSgt = PolicyManagerUtil.findSgtTag(rendererEndpoint, dataAfter.getEndpoints()
+            final Sgt sourceSgt = PolicyManagerUtil.findSgtTag(epToSgtMapper, rendererEndpoint, dataAfter.getEndpoints()
                     .getAddressEndpointWithLocation());
             // Peer Endpoint
             for (PeerEndpoint peerEndpoint : rendererEndpoint.getPeerEndpoint()) {
-                final Sgt destinationSgt = PolicyManagerUtil.findSgtTag(peerEndpoint, dataAfter.getEndpoints()
+                final Sgt destinationSgt = PolicyManagerUtil.findSgtTag(epToSgtMapper, peerEndpoint, dataAfter.getEndpoints()
                         .getAddressEndpointWithLocation());
                 if (sourceSgt == null || destinationSgt == null) {
                     final String info = String.format("Endpoint-policy: missing sgt value(sourceSgt=%s, destinationSgt=%s)",
index 2dcaa1b620affbbb5413c5cb7befa2a640deb139..e9e9ee27638142b389c0defd1155929ec881750a 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.P
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl;
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.ActionCase;
 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.ios.rev160308.ClassNameType;
 import org.opendaylight.yang.gen.v1.urn.ios.rev160308.PolicyActionType;
@@ -198,13 +199,15 @@ public class PolicyManagerUtil {
     }
 
     @Nullable
-    public static Sgt findSgtTag(final AddressEndpointKey endpointKey,
+    public static Sgt findSgtTag(final EPToSgtMapper sxpEpProvider, final AddressEndpointKey endpointKey,
                                  final List<AddressEndpointWithLocation> endpointsWithLocation) {
         if (endpointKey == null || endpointsWithLocation == null) {
             return null;
         }
         final AddressEndpointWithLocation endpointWithLocation = RendererPolicyUtil.lookupEndpoint(endpointKey,
                 endpointsWithLocation);
+
+        //TODO: involve sxpEpProvider
         final AddressEndpointWithLocationAug augmentation = endpointWithLocation.getAugmentation(AddressEndpointWithLocationAug.class);
         if (augmentation == null) {
             return null;
index 9803c23c26dd70d717743a06e12c4f4035d654fc..d3177038ae557fd33e23aeea220f439725613f5f 100644 (file)
@@ -6,11 +6,14 @@
     <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"/>
     <reference id="broker" interface="org.opendaylight.controller.sal.binding.api.BindingAwareBroker"/>
     <reference id="clusterSingletonService" interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
+    <reference id="sxpEpProvider"
+               interface="org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider"/>
 
     <bean id="iosXeRenderer" class="org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.config.IosXeProviderInstance"
         init-method="initialize" destroy-method="close">
         <argument ref="dataBroker"/>
         <argument ref="broker"/>
         <argument ref="clusterSingletonService" />
+        <argument ref="sxpEpProvider"/>
     </bean>
 </blueprint>
\ No newline at end of file
index 77d2aec16c555d6b762b6f3db4c55e61a8516344..f4006a79e23fc08147e6454b9b45b1d4ec19291a 100644 (file)
@@ -7,20 +7,8 @@
  */
 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;
@@ -29,6 +17,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 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.ServiceChainingUtil;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
 import org.opendaylight.groupbasedpolicy.util.IetfModelCodec;
 import org.opendaylight.sfc.provider.api.SfcProviderServiceForwarderAPI;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName;
@@ -97,6 +86,19 @@ 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 {
@@ -122,13 +124,15 @@ public class PolicyManagerImplTest {
     private PolicyManagerImpl policyManager;
     private DataBroker mountpoint;
     private NodeManager nodeManager;
+    private EPToSgtMapper epToSgtMapper;
 
     @Before
     public void init() {
         mountpoint = mock(DataBroker.class);
         ReadWriteTransaction readWriteTransaction = mock(ReadWriteTransaction.class);
         nodeManager = mock(NodeManager.class);
-        policyManager = new PolicyManagerImpl(mountpoint, nodeManager);
+        epToSgtMapper = mock(EPToSgtMapper.class);
+        policyManager = new PolicyManagerImpl(mountpoint, nodeManager, epToSgtMapper);
         when(mountpoint.newReadWriteTransaction()).thenReturn(readWriteTransaction);
         when(readWriteTransaction.submit()).thenReturn(Futures.immediateCheckedFuture(null));
     }
index 89a40b9186139b454707e88ded8ad84b32a21b2d..2e0812d4f23b2fe21314e573acf4dbfd88b8c4fd 100755 (executable)
                         sxp-ep-provider:sxp-ep-provider-impl
                     </type>
                     <name>sxp-ep-provider-default-impl</name>
-
-                    <data-broker>
-                        <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-async-data-broker</type>
-                        <name>binding-data-broker</name>
-                    </data-broker>
-                    <rpc-registry>
-                        <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
-                        <name>binding-rpc-broker</name>
-                    </rpc-registry>
-                    <domain-specific-registry>
-                        <type xmlns:gbp="urn:opendaylight:params:xml:ns:yang:controller:config:groupbasedpolicy">
-                            gbp:domain-specific-registry
-                        </type>
-                        <name>domain-specific-registry</name>
-                    </domain-specific-registry>
                 </module>
             </modules>
-            <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-                <service>
-                    <type xmlns:sxp-ep-provider="urn:opendaylight:params:xml:ns:yang:controller:config:groupbasedpolicy:sxp-integration:sxp-ep-provider">
-                        sxp-ep-provider:sxp-ep-provider
-                    </type>
-
-                    <instance>
-                        <name>sxp-ep-provider-service</name>
-                        <provider>/modules/module[type='sxp-ep-provider-impl'][name='sxp-ep-provider-default-impl']</provider>
-                    </instance>
-                </service>
-            </services>
         </data>
 
     </configuration>
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderInstance.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderInstance.java
new file mode 100644 (file)
index 0000000..59f18ec
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.controller.config.yang.config.groupbasedpolicy.sxp_integration.sxp_ep_provider;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+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.groupbasedpolicy.api.DomainSpecificRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProviderRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SxpEpProviderProviderImpl;
+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.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SxpEpProviderProviderInstance implements SxpEpProviderProvider, ClusterSingletonService, AutoCloseable {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SxpEpProviderProviderInstance.class);
+
+    private static final ServiceGroupIdentifier IDENTIFIER =
+            ServiceGroupIdentifier.create(GroupbasedpolicyInstance.GBP_SERVICE_GROUP_IDENTIFIER);
+
+    private final DataBroker dataBroker;
+    private final BaseEndpointService endpointService;
+    private final DomainSpecificRegistry registry;
+    private final ClusterSingletonServiceProvider clusterSingletonService;
+    private final SgtGeneratorConfig sgtGeneratorConfig;
+    private ClusterSingletonServiceRegistration singletonServiceRegistration;
+    private SxpEpProviderProviderImpl sxpEpProviderProvider;
+
+    public SxpEpProviderProviderInstance(DataBroker dataBroker, BaseEndpointService endpointService,
+                                         DomainSpecificRegistry registry,
+                                         ClusterSingletonServiceProvider clusterSingletonService,
+                                         SgtGeneratorConfig sgtGeneratorConfig) {
+        this.dataBroker = Preconditions.checkNotNull(dataBroker);
+        this.endpointService = Preconditions.checkNotNull(endpointService);
+        this.registry = Preconditions.checkNotNull(registry);
+        this.clusterSingletonService = Preconditions.checkNotNull(clusterSingletonService);
+        this.sgtGeneratorConfig = Preconditions.checkNotNull(sgtGeneratorConfig);
+    }
+
+    public void initialize() {
+        LOG.info("Clustering session initiated for {}", this.getClass().getSimpleName());
+        singletonServiceRegistration = clusterSingletonService.registerClusterSingletonService(this);
+    }
+
+    @Override
+    public void instantiateServiceInstance() {
+        LOG.info("Instantiating {}", this.getClass().getSimpleName());
+        sxpEpProviderProvider = new SxpEpProviderProviderImpl(dataBroker, endpointService, registry, sgtGeneratorConfig);
+    }
+
+    @Override
+    public ListenableFuture<Void> closeServiceInstance() {
+        LOG.info("Instance {} closed", this.getClass().getSimpleName());
+        try {
+            sxpEpProviderProvider.close();
+        } catch (Exception e) {
+            LOG.warn("Exception while closing ... {}", e.getMessage());
+        }
+        return Futures.immediateFuture(null);
+    }
+
+    @Override
+    public void close() throws Exception {
+        LOG.info("Clustering provider closed for {}", this.getClass().getSimpleName());
+        if (singletonServiceRegistration != null) {
+            try {
+                singletonServiceRegistration.close();
+            } catch (Exception e) {
+                LOG.warn("{} closed unexpectedly. Cause: {}", e.getMessage());
+            }
+            singletonServiceRegistration = null;
+        }
+    }
+
+    @Override
+    public ServiceGroupIdentifier getIdentifier() {
+        return IDENTIFIER;
+    }
+
+    @Override
+    public EPToSgtMapper getEPToSgtMapper() {
+        return sxpEpProviderProvider.getEPToSgtMapper();
+    }
+
+    @Override
+    public EPPolicyTemplateProviderRegistry getEPPolicyTemplateProviderRegistry() {
+        return sxpEpProviderProvider.getEPPolicyTemplateProviderRegistry();
+    }
+}
index 56458dbd2872133862d65b7540255f169bc806d6..181e007af1c691f41f90d4cccad38c060703f15c 100644 (file)
@@ -8,7 +8,8 @@
 
 package org.opendaylight.controller.config.yang.config.groupbasedpolicy.sxp_integration.sxp_ep_provider;
 
-import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SxpEpProviderProviderImpl;
+
+import org.opendaylight.controller.sal.common.util.NoopAutoCloseable;
 
 /**
 * sxp-ep-provider impl module
@@ -29,8 +30,7 @@ public class SxpEpProviderProviderModule extends org.opendaylight.controller.con
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        return new SxpEpProviderProviderImpl(getDataBrokerDependency(), getRpcRegistryDependency(),
-                getDomainSpecificRegistryDependency());
+        return NoopAutoCloseable.INSTANCE;
     }
 
 }
index 25af1dab68cd1f355d4e59c56ccbf850c0be1117..0737de9a6dc87e32c9cd55aad5f2480554a84efa 100644 (file)
@@ -9,7 +9,7 @@
 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.api;
 
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.DSAsyncDao;
-import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.ReadableByKey;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.ReadableAsyncByKey;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
@@ -18,5 +18,5 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
  * Purpose: union of template-dao and template provider consumer
  */
 public interface EPPolicyTemplateDaoFacade extends TemplateProviderDistributionTarget<EPPolicyTemplateProvider>,
-        DSAsyncDao<Sgt, EndpointPolicyTemplateBySgt>, ReadableByKey<EpPolicyTemplateValueKey, EndpointPolicyTemplateBySgt> {
+        DSAsyncDao<Sgt, EndpointPolicyTemplateBySgt>, ReadableAsyncByKey<EpPolicyTemplateValueKey, EndpointPolicyTemplateBySgt> {
 }
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPToSgtMapper.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPToSgtMapper.java
new file mode 100644 (file)
index 0000000..2f4bbf6
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.groupbasedpolicy.sxp.ep.provider.api;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collection;
+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.sxp.database.rev160308.Sgt;
+
+/**
+ * Purpose: expose endpoint to sgt mapping
+ */
+public interface EPToSgtMapper {
+
+    /**
+     * @param endpointWithLocation peer which sgt is being searched for
+     * @return found sgt
+     */
+    ListenableFuture<Collection<Sgt>> findSgtForEP(AddressEndpointWithLocation endpointWithLocation);
+}
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPToSgtMapperImpl.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPToSgtMapperImpl.java
new file mode 100644 (file)
index 0000000..3ec8e5e
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.groupbasedpolicy.sxp.ep.provider.impl;
+
+import com.google.common.base.Function;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collection;
+import java.util.HashSet;
+import javax.annotation.Nullable;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateDaoFacade;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKey;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKeyFactory;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.EPTemplateUtil;
+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.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
+
+/**
+ * Purpose: mapper implementation based on {@link ReadableAsyncByKey} (e.g.: {@link EPPolicyTemplateDaoFacade})
+ */
+public class EPToSgtMapperImpl implements EPToSgtMapper {
+
+    public static final Function<Collection<EndpointPolicyTemplateBySgt>, Collection<Sgt>> TRANSFORM_TEMPLATE_TO_SGT =
+            new Function<Collection<EndpointPolicyTemplateBySgt>, Collection<Sgt>>() {
+                @Nullable
+                @Override
+                public Collection<Sgt> apply(@Nullable final Collection<EndpointPolicyTemplateBySgt> input) {
+                    final Collection<Sgt> sgtBag = new HashSet<>();
+                    for (EndpointPolicyTemplateBySgt template : input) {
+                        sgtBag.add(template.getSgt());
+                    }
+                    return sgtBag;
+                }
+            };
+
+    private final ReadableAsyncByKey<EpPolicyTemplateValueKey, EndpointPolicyTemplateBySgt> epPolicyTemplateReader;
+    private final EpPolicyTemplateValueKeyFactory keyFactory;
+
+    public EPToSgtMapperImpl(final ReadableAsyncByKey<EpPolicyTemplateValueKey, EndpointPolicyTemplateBySgt> epPolicyTemplateReader) {
+        this.epPolicyTemplateReader = epPolicyTemplateReader;
+        keyFactory = new EpPolicyTemplateValueKeyFactory(
+                EPTemplateUtil.createEndpointGroupIdOrdering(), EPTemplateUtil.createConditionNameOrdering());
+
+    }
+
+    @Override
+    public ListenableFuture<Collection<Sgt>> findSgtForEP(final AddressEndpointWithLocation endpointWithLocation) {
+        final EpPolicyTemplateValueKey rawKey = new EpPolicyTemplateValueKey(endpointWithLocation);
+        final EpPolicyTemplateValueKey key = keyFactory.sortValueKeyLists(rawKey);
+        return Futures.transform(epPolicyTemplateReader.readBy(key), TRANSFORM_TEMPLATE_TO_SGT);
+    }
+}
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SgtGeneratorImpl.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SgtGeneratorImpl.java
new file mode 100644 (file)
index 0000000..1c4ec78
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.groupbasedpolicy.sxp.ep.provider.impl;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Range;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.EPTemplateUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
+
+import java.util.Optional;
+
+/**
+ * Purpose: generate {@link Sgt} value on demand
+ */
+public class SgtGeneratorImpl {
+    private final Ordering<Sgt> sgtOrdering;
+    private Optional<Range<Integer>> sgtRange = Optional.empty();
+
+    public SgtGeneratorImpl(final SgtGeneratorConfig sgtGenerator) {
+        if (sgtGenerator != null) {
+            sgtRange = Optional.of(
+                    Range.closed(sgtGenerator.getSgtLow().getValue(), sgtGenerator.getSgtHigh().getValue()));
+        }
+        sgtOrdering = EPTemplateUtil.createSgtOrdering();
+    }
+
+    /**
+     * @param templateCache source of used sgt items
+     * @return next free sgt
+     */
+    public java.util.Optional<Sgt> generateNextSgt(SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> templateCache) {
+        return sgtRange.flatMap(range ->
+                findTopUsedSgt(templateCache.keySet())
+                        .map(topUsedSgt -> incrementSafely(range, topUsedSgt))
+        );
+    }
+
+    private Optional<Sgt> findTopUsedSgt(final Iterable<Sgt> sgts) {
+        return java.util.Optional.ofNullable(sgts)
+                .filter(sgtBag -> !Iterables.isEmpty(sgtBag))
+                .map(sgtOrdering::max);
+    }
+
+    private Sgt incrementSafely(final Range<Integer> range, final Sgt topUsedSgt) {
+        final Sgt applicableSgt;
+
+        final int nextMax = topUsedSgt.getValue() + 1;
+        if (range.contains(nextMax)) {
+            applicableSgt = new Sgt(nextMax);
+        } else if (nextMax < range.lowerEndpoint()) {
+            applicableSgt = new Sgt(range.lowerEndpoint());
+        } else {
+            applicableSgt = null;
+        }
+
+        return applicableSgt;
+    }
+}
index 913274bd367d3b0ca79c4a1875f02514fc68517d..21ae5944d035176b1cad5f4ee4f1a467d895b07c 100644 (file)
@@ -47,4 +47,9 @@ public interface SimpleCachedDao<K, V> extends SimpleDao<K, V> {
      * @return unmodifiable iterator through all cached values
      */
     Iterable<V> values();
+
+    /**
+     * @return unmodifiable iterator through all cached keys
+     */
+    Iterable<K> keySet();
 }
index c20eb00a073112239dde97f61ecd884aa14390ba..0542cd4c37899adc2cf91d61bb4ee11c56f05740 100644 (file)
@@ -9,11 +9,11 @@
 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.api.DomainSpecificRegistry;
 import org.opendaylight.groupbasedpolicy.api.EndpointAugmentor;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateDaoFacade;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProviderRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPForwardingTemplateDaoImpl;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoFacadeImpl;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoImpl;
@@ -30,6 +30,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointForwardingTemplateBySubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.slf4j.Logger;
@@ -48,41 +49,50 @@ public class SxpEpProviderProviderImpl implements SxpEpProviderProvider {
     private final DomainSpecificRegistry domainSpecificRegistry;
     private final EndpointAugmentor sxpEndpointAugmentor;
     private final EPPolicyTemplateProviderRegistry epPolicyTemplateRegistry;
+    private final EPToSgtMapper epToSgtMapper;
 
-    public SxpEpProviderProviderImpl(final DataBroker dataBroker, final RpcProviderRegistry rpcRegistryDependency,
-                                     final DomainSpecificRegistry domainSpecificRegistry) {
+    public SxpEpProviderProviderImpl(final DataBroker dataBroker, final BaseEndpointService endpointService,
+                                     final DomainSpecificRegistry domainSpecificRegistry, final SgtGeneratorConfig sgtGeneratorConfig) {
         LOG.info("starting SxmMapper ..");
         this.domainSpecificRegistry = domainSpecificRegistry;
 
-        epPolicyTemplateRegistry = new EPPolicyTemplateProviderRegistryImpl();
-
-        final BaseEndpointService endpointService = rpcRegistryDependency.getRpcService(BaseEndpointService.class);
+        // low level reactor
         final SxpMapperReactor sxpMapperReactor = new SxpMapperReactorImpl(endpointService, dataBroker);
 
+        // cached dao layer for templates and master-database
         final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao = new SimpleCachedDaoImpl<>();
         final SimpleCachedDao<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateCachedDao =
                 new SimpleCachedDaoEPForwardingTemplateImpl();
         final SimpleCachedDao<IpPrefix, MasterDatabaseBinding> masterDBBindingCachedDao = new SimpleCachedDaoImpl<>();
 
+        // reading dao layer for templates and master-database
         final EpPolicyTemplateValueKeyFactory epPolicyTemplateKeyFactory = new EpPolicyTemplateValueKeyFactory(
                 EPTemplateUtil.createEndpointGroupIdOrdering(), EPTemplateUtil.createConditionNameOrdering());
         final EPPolicyTemplateDaoImpl epPolicyTemplateDao = new EPPolicyTemplateDaoImpl(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory);
-        final EPPolicyTemplateDaoFacade epPolicyTemplateDaoFacade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, epPolicyTemplateDao);
-        epPolicyTemplateRegistry.addDistributionTarget(epPolicyTemplateDaoFacade);
-
         final EPForwardingTemplateDaoImpl epForwardingTemplateDao = new EPForwardingTemplateDaoImpl(dataBroker,
                 epForwardingTemplateCachedDao);
-
         final MasterDatabaseBindingDaoImpl masterDBBindingDao = new MasterDatabaseBindingDaoImpl(dataBroker, masterDBBindingCachedDao);
 
+        // facade for ep-policy-template: reading dao + consumer of ise provider + template generator
+        final SgtGeneratorImpl sgtGeneratorImpl = new SgtGeneratorImpl(sgtGeneratorConfig);
+        final EPPolicyTemplateDaoFacade epPolicyTemplateDaoFacade = new EPPolicyTemplateDaoFacadeImpl(dataBroker,
+                epPolicyTemplateDao, epPolicyTemplateCachedDao, sgtGeneratorImpl);
+        epPolicyTemplateRegistry = new EPPolicyTemplateProviderRegistryImpl();
+        epPolicyTemplateRegistry.addDistributionTarget(epPolicyTemplateDaoFacade);
+        epToSgtMapper = new EPToSgtMapperImpl(epPolicyTemplateDaoFacade);
+
+        // DS-listeners for templates and master-database
         sxpDatabaseListener = new MasterDatabaseBindingListenerImpl(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
                 epPolicyTemplateDaoFacade, epForwardingTemplateDao);
         epPolicyTemplateListener = new EPPolicyTemplateListenerImpl(dataBroker, sxpMapperReactor, epPolicyTemplateCachedDao,
                 masterDBBindingDao, epForwardingTemplateDao);
         epForwardingTemplateListener = new EPForwardingTemplateListenerImpl(dataBroker, sxpMapperReactor, epForwardingTemplateCachedDao,
                 masterDBBindingDao, epPolicyTemplateDaoFacade);
-        sxpEndpointAugmentor = new SxpEndpointAugmentorImpl(epPolicyTemplateDaoFacade, epPolicyTemplateKeyFactory);
+
+        // sxp-ep-augmentor -> deprecated, will use ep2sxpMapper service
+        sxpEndpointAugmentor = new SxpEndpointAugmentorImpl(epPolicyTemplateDao, epPolicyTemplateKeyFactory);
         domainSpecificRegistry.getEndpointAugmentorRegistry().register(sxpEndpointAugmentor);
+
         LOG.info("started SxmMapper");
     }
 
@@ -91,6 +101,11 @@ public class SxpEpProviderProviderImpl implements SxpEpProviderProvider {
         return epPolicyTemplateRegistry;
     }
 
+    @Override
+    public EPToSgtMapper getEPToSgtMapper() {
+        return epToSgtMapper;
+    }
+
     @Override
     public void close() throws Exception {
         sxpDatabaseListener.close();
index e23064c6797ad67013ed358263bbfce35e1d2985..fa3f457c11d0632605b67eb1188db8e6586e865c 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.util.concurrent.AsyncFunction;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collection;
+import java.util.Collections;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -21,6 +22,8 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateDaoFacade;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SgtGeneratorImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SimpleCachedDao;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
@@ -28,7 +31,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.SxpEpMapper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgtBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgtKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -43,13 +48,19 @@ public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade
     private static final Logger LOG = LoggerFactory.getLogger(EPPolicyTemplateDaoFacadeImpl.class);
 
     private final EPPolicyTemplateDaoImpl epPolicyTemplateDao;
+    private final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao;
+    private final SgtGeneratorImpl sgtGenerator;
     private final DataBroker dataBroker;
 
     private EPPolicyTemplateProvider templateProvider;
 
-    public EPPolicyTemplateDaoFacadeImpl(final DataBroker dataBroker, final EPPolicyTemplateDaoImpl epPolicyTemplateDao) {
+    public EPPolicyTemplateDaoFacadeImpl(final DataBroker dataBroker, final EPPolicyTemplateDaoImpl epPolicyTemplateDao,
+                                         final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao,
+                                         final SgtGeneratorImpl sgtGenerator) {
         this.dataBroker = dataBroker;
         this.epPolicyTemplateDao = epPolicyTemplateDao;
+        this.epPolicyTemplateCachedDao = epPolicyTemplateCachedDao;
+        this.sgtGenerator = sgtGenerator;
     }
 
     @Override
@@ -106,10 +117,10 @@ public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade
                 .child(EndpointPolicyTemplateBySgt.class, new EndpointPolicyTemplateBySgtKey(sgtValue));
         wTx.put(LogicalDatastoreType.CONFIGURATION, epPolicyTemplatePath, template, true);
 
-        return Futures.transform(wTx.submit(), createStoreOutcomeHandler(template));
+        return Futures.transform(wTx.submit(), createStoreOutcomeHandlerToOptional(template));
     }
 
-    private Function<Void, Optional<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandler(final EndpointPolicyTemplateBySgt template) {
+    private Function<Void, Optional<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandlerToOptional(final EndpointPolicyTemplateBySgt template) {
         return new Function<Void, Optional<EndpointPolicyTemplateBySgt>>() {
             @Nullable
             @Override
@@ -119,8 +130,55 @@ public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade
         };
     }
 
+    private Function<Void, Collection<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandlerToCollection(final EndpointPolicyTemplateBySgt template) {
+        return new Function<Void, Collection<EndpointPolicyTemplateBySgt>>() {
+            @Nullable
+            @Override
+            public Collection<EndpointPolicyTemplateBySgt> apply(@Nullable final Void aVoid) {
+                return Collections.singletonList(template);
+            }
+        };
+    }
+
     @Override
-    public Collection<EndpointPolicyTemplateBySgt> readBy(@Nonnull final EpPolicyTemplateValueKey specialKey) {
-        return epPolicyTemplateDao.readBy(specialKey);
+    public ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> readBy(@Nonnull final EpPolicyTemplateValueKey templateLookupKey) {
+        //TODO: expose to ios-xe renderer,
+        final Collection<EndpointPolicyTemplateBySgt> templatesFromDao = epPolicyTemplateDao.readBy(templateLookupKey);
+        final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> result;
+        if (!templatesFromDao.isEmpty()) {
+            result = Futures.immediateFuture(templatesFromDao);
+        } else {
+            // generate
+            result = sgtGenerator.generateNextSgt(epPolicyTemplateCachedDao)
+                    // build ep-policy-template
+                    .map(sgt -> buildEpPolicyTemplate(templateLookupKey, sgt))
+                    // store the template
+                    .map(this::storeTemplate)
+                    .orElse(Futures.immediateFuture(Collections.emptyList()));
+        }
+        return result;
+    }
+
+    private ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> storeTemplate(final EndpointPolicyTemplateBySgt template) {
+        final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
+        // store ep-policy-template
+        final Sgt sgt = template.getSgt();
+        LOG.trace("storing generated epPolicyTemplate: {}", sgt.getValue());
+        final InstanceIdentifier<EndpointPolicyTemplateBySgt> epPolicyTemplatePath = InstanceIdentifier
+                .create(SxpEpMapper.class)
+                .child(EndpointPolicyTemplateBySgt.class, new EndpointPolicyTemplateBySgtKey(sgt));
+        wTx.put(LogicalDatastoreType.CONFIGURATION, epPolicyTemplatePath, template, true);
+
+        return Futures.transform(wTx.submit(), createStoreOutcomeHandlerToCollection(template));
+    }
+
+    private EndpointPolicyTemplateBySgt buildEpPolicyTemplate(final EpPolicyTemplateValueKey templateLookupKey, final Sgt sgt) {
+        return new EndpointPolicyTemplateBySgtBuilder()
+                .setOrigin(TemplateGenerated.class)
+                .setTenant(templateLookupKey.getTenantId())
+                .setSgt(sgt)
+                .setEndpointGroups(templateLookupKey.getEpgId())
+                .setConditions(templateLookupKey.getConditionName())
+                .build();
     }
 }
index 5ae7af3729f085d04618a1f58cec728906a36525..d08f83b750f1d8ae061b59bdd8117ca8c3f6fff7 100644 (file)
@@ -125,4 +125,10 @@ public class SimpleCachedDaoEPForwardingTemplateImpl implements SimpleCachedDao<
     public Iterable<EndpointForwardingTemplateBySubnet> values() {
         return Iterables.unmodifiableIterable(Iterables.concat(plainCache.values(), subnetCache.values()));
     }
+
+    @Override
+    public Iterable<IpPrefix> keySet() {
+        // bypassing subnets
+        return Iterables.unmodifiableIterable(plainCache.keySet());
+    }
 }
index a6c16297197aba354d0dd1259ab63bc7b9809a42..c5786b0423d25c3723e3c6ad1cc51ca74bb58d03 100644 (file)
@@ -58,4 +58,9 @@ public class SimpleCachedDaoImpl<K, V extends DataObject> implements SimpleCache
     public Iterable<V> values() {
         return Iterables.unmodifiableIterable(cache.values());
     }
+
+    @Override
+    public Iterable<K> keySet() {
+        return Iterables.unmodifiableIterable(cache.keySet());
+    }
 }
index 9fa8be05c5865c18b25434a8e9d9b33bab328e19..4b70c55b68e96b94aa3af0551a74caf800d1d210 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.EPTemplateUti
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.L3EPServiceUtil;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.SxpListenerUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointForwardingTemplateBySubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
@@ -89,7 +90,13 @@ public class EPPolicyTemplateListenerImpl implements EPTemplateListener<Endpoint
             SxpListenerUtil.updateCachedDao(templateCachedDao, changeKey, change);
 
             final EndpointPolicyTemplateBySgt epPolicyTemplate = change.getRootNode().getDataAfter();
-            processWithEPTemplates(epPolicyTemplate);
+
+            // skip generated template
+            if (epPolicyTemplate != null && !TemplateGenerated.class.equals(epPolicyTemplate.getOrigin())) {
+                processWithEPTemplates(epPolicyTemplate);
+            } else {
+                LOG.trace("skipping ep-policy-template processing: {}", epPolicyTemplate);
+            }
         }
     }
 
@@ -141,7 +148,7 @@ public class EPPolicyTemplateListenerImpl implements EPTemplateListener<Endpoint
 
                 return result;
             }
-};
+        };
     }
 
     private AsyncFunction<Collection<MasterDatabaseBinding>, List<Pair<MasterDatabaseBinding, EndpointForwardingTemplateBySubnet>>>
index c3b89e16d7a6727feea948e281f30fc416d2717b..300ef8d36e27e3c150a0cd5a672f56e483c22ec7 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointForwardingTemplateBySubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 
 /**
  * Purpose: util methods for {@link EndpointForwardingTemplateBySubnet} and {@link EndpointPolicyTemplateBySgt}
@@ -128,6 +129,19 @@ public final class EPTemplateUtil {
         });
     }
 
+    public static Ordering<Sgt> createSgtOrdering() {
+        return Ordering.natural().onResultOf(new Function<Sgt, Comparable>() {
+            @Nullable
+            @Override
+            public Comparable apply(@Nullable final Sgt input) {
+                if (input == null) {
+                    return EMPTY_COMPARABLE;
+                }
+                return MoreObjects.firstNonNull(input.getValue(), EMPTY_COMPARABLE);
+            }
+        });
+    }
+
     public static class OptionalMutablePair<L, R> extends MutablePair<Optional<L>, Optional<R>> {
         public OptionalMutablePair() {
             super(Optional.absent(), Optional.absent());
index 3f9042afa55e8ef915794815340d1674c779d9d8..654457d7916fba7df92028d6c7f5c644f54e4d2a 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi;
 
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProviderRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
 
 /**
  * Purpose: spi for sxp-ep-provider
@@ -20,4 +21,9 @@ public interface SxpEpProviderProvider extends AutoCloseable {
      * @return registry point for {@link EPPolicyTemplateProvider}
      */
     EPPolicyTemplateProviderRegistry getEPPolicyTemplateProviderRegistry();
+
+    /**
+     * @return endpoint-to-sgt mapper
+     */
+    EPToSgtMapper getEPToSgtMapper();
 }
diff --git a/sxp-integration/sxp-ep-provider/src/main/resources/org/opendaylight/blueprint/sxp-mapper.xml b/sxp-integration/sxp-ep-provider/src/main/resources/org/opendaylight/blueprint/sxp-mapper.xml
new file mode 100644 (file)
index 0000000..118741a
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+           odl:use-default-for-reference-types="true">
+
+    <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"/>
+    <reference id="domainSpecificRegistry" interface="org.opendaylight.groupbasedpolicy.api.DomainSpecificRegistry"/>
+    <reference id="clusterSingletonService" interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
+    <odl:rpc-service id="baseEndpointService"
+                     interface="org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService"/>
+
+    <odl:clustered-app-config id="sgtGeneratorConfig"
+                              binding-class="org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig">
+        <odl:default-config><![CDATA[
+            <sgt-generator-config
+                xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:groupbasedpolicy:sxp-integration:sxp-ep-provider">
+                <sgt-low>100</sgt-low>
+                <sgt-high>200</sgt-high>
+            </sgt-generator-config>
+        ]]></odl:default-config>
+    </odl:clustered-app-config>
+
+    <bean id="sxpEpProvider"
+          class="org.opendaylight.controller.config.yang.config.groupbasedpolicy.sxp_integration.sxp_ep_provider.SxpEpProviderProviderInstance"
+          init-method="initialize" destroy-method="close">
+        <argument ref="dataBroker"/>
+        <argument ref="baseEndpointService"/>
+        <argument ref="domainSpecificRegistry"/>
+        <argument ref="clusterSingletonService"/>
+        <argument ref="sgtGeneratorConfig"/>
+    </bean>
+
+    <service ref="sxpEpProvider" interface="org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider"/>
+</blueprint>
\ No newline at end of file
index 84bca86054b6f75c04a166f2b6744b232389a510..89a6155f81889cfdd59192d860501e7e8834714d 100644 (file)
@@ -14,6 +14,7 @@ module sxp-ep-provider-cfg {
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
     import groupbasedpolicy-cfg {prefix gbpcfg; revision-date 2015-11-06; }
+    import sxp-database { prefix sxp-database; revision-date 2016-03-08; }
 
     description
         "This module contains the base YANG definitions for
@@ -45,34 +46,20 @@ module sxp-ep-provider-cfg {
     augment "/config:modules/config:module/config:configuration" {
         case sxp-ep-provider-impl {
             when "/config:modules/config:module/config:type = 'sxp-ep-provider-impl'";
+        }
+    }
 
-            //wires in the data-broker service
-            container data-broker {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity mdsal:binding-async-data-broker;
-                    }
-                }
-            }
-            //RPC Registry
-            container rpc-registry {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity mdsal:binding-rpc-registry;
-                    }
-                }
-            }
-            //Domain specific registry
-            container domain-specific-registry {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity gbpcfg:domain-specific-registry;
-                    }
-                }
-            }
+    container sgt-generator-config {
+        description "sgt-generator configuration";
+        leaf sgt-low {
+            type sxp-database:sgt;
+            mandatory true;
+            description "minimal SGT value to be used by sgt-generator";
+        }
+        leaf sgt-high {
+            type sxp-database:sgt;
+            mandatory true;
+            description "maximal SGT value to be used by sgt-generator";
         }
     }
 }
diff --git a/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderInstanceTest.java b/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/sxp_ep_provider/SxpEpProviderProviderInstanceTest.java
new file mode 100644 (file)
index 0000000..9824b4e
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.controller.config.yang.config.groupbasedpolicy.sxp_integration.sxp_ep_provider;
+
+import static org.powermock.api.mockito.PowerMockito.verifyNew;
+import static org.powermock.api.mockito.PowerMockito.whenNew;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.groupbasedpolicy.api.DomainSpecificRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProviderRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPToSgtMapper;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SxpEpProviderProviderImpl;
+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.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+/**
+ * Test for {@link SxpEpProviderProviderInstance}.
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SxpEpProviderProviderInstance.class})
+public class SxpEpProviderProviderInstanceTest {
+
+    @Mock
+    private DataBroker dataBroker;
+    @Mock
+    private BindingAwareBroker bindingAwareBroker;
+    @Mock
+    private ClusterSingletonServiceProvider clusterSingletonService;
+    @Mock
+    private BaseEndpointService endpointService;
+    @Mock
+    private DomainSpecificRegistry domainSpecificRegistry;
+    @Mock
+    private SgtGeneratorConfig sgtGeneratorConfig;
+    @Mock
+    private SxpEpProviderProvider sxpEpProvider;
+    @Mock
+    private ClusterSingletonServiceRegistration clusterSingletonRegistration;
+    @Mock
+    private SxpEpProviderProviderImpl sxpEpProviderProvider;
+    @Mock
+    private EPToSgtMapper epToSgtMapper;
+    @Mock
+    private EPPolicyTemplateProviderRegistry epPolicyTemplateProviderRegistry;
+
+    private SxpEpProviderProviderInstance instance;
+
+    @Before
+    public void setUp() throws Exception {
+        Mockito.when(clusterSingletonService.registerClusterSingletonService(Matchers.<ClusterSingletonService>any()))
+                .thenReturn(clusterSingletonRegistration);
+        Mockito.when(sxpEpProviderProvider.getEPToSgtMapper()).thenReturn(epToSgtMapper);
+        Mockito.when(sxpEpProviderProvider.getEPPolicyTemplateProviderRegistry()).thenReturn(epPolicyTemplateProviderRegistry);
+
+        whenNew(SxpEpProviderProviderImpl.class)
+                .withArguments(dataBroker, endpointService, domainSpecificRegistry, sgtGeneratorConfig)
+                .thenReturn(sxpEpProviderProvider);
+
+        instance = new SxpEpProviderProviderInstance(dataBroker, endpointService, domainSpecificRegistry,
+                clusterSingletonService, sgtGeneratorConfig);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Mockito.verifyNoMoreInteractions(dataBroker, bindingAwareBroker, clusterSingletonService, sxpEpProvider,
+                clusterSingletonRegistration, sgtGeneratorConfig, endpointService, domainSpecificRegistry);
+    }
+
+    @Test
+    public void testInitialize() throws Exception {
+        instance.initialize();
+        Mockito.verify(clusterSingletonService).registerClusterSingletonService(instance);
+    }
+
+    @Test
+    public void testInstantiateServiceInstance() throws Exception {
+        instance.instantiateServiceInstance();
+
+        verifyNew(SxpEpProviderProviderImpl.class).withArguments(dataBroker, endpointService, domainSpecificRegistry,
+                sgtGeneratorConfig);
+    }
+
+    @Test
+    public void testCloseServiceInstance() throws Exception {
+        instance.instantiateServiceInstance();
+        final ListenableFuture<Void> future = instance.closeServiceInstance();
+
+        Mockito.verify(sxpEpProviderProvider).close();
+        Assert.assertTrue(future.isDone());
+        Assert.assertNull(future.get());
+    }
+
+    @Test
+    public void testCloseServiceInstance_null() throws Exception {
+        final ListenableFuture<Void> future = instance.closeServiceInstance();
+
+        Assert.assertTrue(future.isDone());
+        Assert.assertNull(future.get());
+    }
+
+    @Test
+    public void testClose() throws Exception {
+        instance.initialize();
+        Mockito.verify(clusterSingletonService).registerClusterSingletonService(instance);
+
+        instance.close();
+        Mockito.verify(clusterSingletonRegistration).close();
+    }
+
+    @Test
+    public void testClose_null() throws Exception {
+        instance.close();
+    }
+
+    @Test
+    public void testGetIdentifier() throws Exception {
+        final ServiceGroupIdentifier identifier = instance.getIdentifier();
+        Assert.assertEquals("gbp-service-group-identifier", identifier.getValue());
+    }
+
+    @Test
+    public void testGetEPToSgtMapper() throws Exception {
+        instance.instantiateServiceInstance();
+        Assert.assertEquals(epToSgtMapper, instance.getEPToSgtMapper());
+    }
+
+    @Test
+    public void testGetEPPolicyTemplateProviderRegistry() throws Exception {
+        instance.instantiateServiceInstance();
+        Assert.assertEquals(epPolicyTemplateProviderRegistry, instance.getEPPolicyTemplateProviderRegistry());
+    }
+}
\ No newline at end of file
diff --git a/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPToSgtMapperImplTest.java b/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPToSgtMapperImplTest.java
new file mode 100644 (file)
index 0000000..bf67d72
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.groupbasedpolicy.sxp.ep.provider.impl;
+
+import com.google.common.collect.Iterables;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collection;
+import java.util.Collections;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+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.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgtBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
+
+/**
+ * Test for {@link EPToSgtMapperImpl}.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class EPToSgtMapperImplTest {
+
+    private static final EndpointGroupId EPG_ID = new EndpointGroupId("epg-42");
+    private static final TenantId TENANT_ID = new TenantId("tenant-01");
+    private static final Sgt SGT = new Sgt(42);
+
+    @Mock
+    private ReadableAsyncByKey<EpPolicyTemplateValueKey, EndpointPolicyTemplateBySgt> templateReader;
+
+    private EPToSgtMapperImpl mapper;
+
+    @Before
+    public void setUp() throws Exception {
+        mapper = new EPToSgtMapperImpl(templateReader);
+    }
+
+    @Test
+    public void testFindSgtForEP() throws Exception {
+        final AddressEndpointWithLocation epWithLocation = new AddressEndpointWithLocationBuilder()
+                .setEndpointGroup(Collections.singletonList(EPG_ID))
+                .setTenant(TENANT_ID)
+                .setCondition(Collections.emptyList())
+                .build();
+
+        final EndpointPolicyTemplateBySgt epPolicyTemplate = new EndpointPolicyTemplateBySgtBuilder()
+                .setConditions(epWithLocation.getCondition())
+                .setTenant(epWithLocation.getTenant())
+                .setEndpointGroups(epWithLocation.getEndpointGroup())
+                .setSgt(SGT)
+                .setOrigin(TemplateGenerated.class)
+                .build();
+
+        Mockito.when(templateReader.readBy(Matchers.<EpPolicyTemplateValueKey>any()))
+                .thenReturn(Futures.immediateFuture(Collections.singletonList(epPolicyTemplate)));
+
+        final ListenableFuture<Collection<Sgt>> sgtForEP = mapper.findSgtForEP(epWithLocation);
+        Assert.assertTrue(sgtForEP.isDone());
+        final Collection<Sgt> sgts = sgtForEP.get();
+        Assert.assertEquals(1, sgts.size());
+        Assert.assertEquals(SGT, Iterables.getFirst(sgts, null));
+    }
+}
\ No newline at end of file
diff --git a/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SgtGeneratorImplTest.java b/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SgtGeneratorImplTest.java
new file mode 100644 (file)
index 0000000..2d5b46c
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.groupbasedpolicy.sxp.ep.provider.impl;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
+
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Test for {@link SgtGeneratorImpl}.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class SgtGeneratorImplTest {
+
+    @Mock
+    private SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> templateDao;
+
+    private SgtGeneratorImpl generator;
+    private Set<Sgt> sgts;
+
+    @Before
+    public void setUp() throws Exception {
+        final SgtGeneratorConfig config = new SgtGeneratorConfigBuilder()
+                .setSgtLow(new Sgt(10))
+                .setSgtHigh(new Sgt(20))
+                .build();
+
+        sgts = new HashSet<>();
+        Mockito.when(templateDao.keySet()).thenReturn(sgts);
+        generator = new SgtGeneratorImpl(config);
+    }
+
+    @Test
+    public void testGenerateNextSgt_noData() throws Exception {
+        final Optional<Sgt> sgt = generator.generateNextSgt(templateDao);
+        Assert.assertFalse(sgt.isPresent());
+    }
+
+    @Test
+    public void testGenerateNextSgt_topIsAboveLimit() throws Exception {
+        sgts.add(new Sgt(20));
+        final Optional<Sgt> sgt = generator.generateNextSgt(templateDao);
+        Assert.assertFalse(sgt.isPresent());
+    }
+
+    @Test
+    public void testGenerateNextSgt_topIsBelowLimit() throws Exception {
+        sgts.add(new Sgt(9));
+        final Optional<Sgt> sgt = generator.generateNextSgt(templateDao);
+
+        Assert.assertTrue(sgt.isPresent());
+        Assert.assertEquals(10, sgt.get().getValue().intValue());
+    }
+
+    @Test
+    public void testGenerateNextSgt_withinLimits() throws Exception {
+        sgts.add(new Sgt(10));
+        final Optional<Sgt> sgt = generator.generateNextSgt(templateDao);
+
+        Assert.assertTrue(sgt.isPresent());
+        Assert.assertEquals(11, sgt.get().getValue().intValue());
+    }
+}
\ No newline at end of file
index ed7895c57329d31b04218aa5526fde6eea034551..8039fcf9d0c97eeaa08eff72956230b413a8448d 100644 (file)
@@ -8,11 +8,6 @@
 
 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl;
 
-import static org.powermock.api.mockito.PowerMockito.verifyNew;
-import static org.powermock.api.mockito.PowerMockito.whenNew;
-import static org.powermock.api.support.membermodification.MemberMatcher.method;
-import static org.powermock.api.support.membermodification.MemberModifier.stub;
-
 import com.google.common.collect.Ordering;
 import org.junit.Assert;
 import org.junit.Before;
@@ -21,7 +16,6 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.api.DomainSpecificRegistry;
 import org.opendaylight.groupbasedpolicy.api.EndpointAugmentorRegistry;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPForwardingTemplateDaoImpl;
@@ -40,11 +34,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
+import static org.powermock.api.mockito.PowerMockito.verifyNew;
+import static org.powermock.api.mockito.PowerMockito.whenNew;
+import static org.powermock.api.support.membermodification.MemberMatcher.method;
+import static org.powermock.api.support.membermodification.MemberModifier.stub;
+
 /**
  * Test for {@link SxpEpProviderProviderImpl}.
  */
@@ -55,15 +55,13 @@ public class SxpEpProviderProviderImplTest {
     @Mock
     private DataBroker dataBroker;
     @Mock
-    private RpcProviderRegistry rpcRegistry;
-    @Mock
     private DomainSpecificRegistry domainSpecificRegistry;
     @Mock
     private EPPolicyTemplateProviderRegistryImpl templateProviderRegistry;
     @Mock
     private SxpMapperReactorImpl sxpMapperReactor;
     @Mock
-    private BaseEndpointService endPointService;
+    private BaseEndpointService endpointService;
     @Mock
     private SimpleCachedDaoImpl<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao;
     @Mock
@@ -94,16 +92,21 @@ public class SxpEpProviderProviderImplTest {
     private EndpointAugmentorRegistry epAugmentorRegistry;
     @Mock
     private EPPolicyTemplateDaoFacadeImpl epPolicyTemplateDaoFacade;
+    @Mock
+    private SgtGeneratorConfig sgtGeneratorConfig;
+    @Mock
+    private SgtGeneratorImpl sgtGenerator;
+    @Mock
+    private EPToSgtMapperImpl epToSgtMapper;
 
     private SxpEpProviderProviderImpl provider;
 
     @Before
     public void setUp() throws Exception {
-        Mockito.when(rpcRegistry.getRpcService(BaseEndpointService.class)).thenReturn(endPointService);
         Mockito.when(domainSpecificRegistry.getEndpointAugmentorRegistry()).thenReturn(epAugmentorRegistry);
 
         whenNew(EPPolicyTemplateProviderRegistryImpl.class).withNoArguments().thenReturn(templateProviderRegistry);
-        whenNew(SxpMapperReactorImpl.class).withArguments(endPointService, dataBroker).thenReturn(sxpMapperReactor);
+        whenNew(SxpMapperReactorImpl.class).withArguments(endpointService, dataBroker).thenReturn(sxpMapperReactor);
         whenNew(SimpleCachedDaoImpl.class).withNoArguments().thenReturn(epPolicyTemplateCachedDao, masterDBBindingCachedDao);
         whenNew(SimpleCachedDaoEPForwardingTemplateImpl.class).withNoArguments().thenReturn(epFwTemplateCachedDao);
         stub(method(EPTemplateUtil.class, "createEndpointGroupIdOrdering")).toReturn(groupOrdering);
@@ -112,8 +115,11 @@ public class SxpEpProviderProviderImplTest {
                 .thenReturn(epPolicyTemplateKeyFactory);
         whenNew(EPPolicyTemplateDaoImpl.class).withArguments(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory)
                 .thenReturn(epPolicyTemplateDao);
-        whenNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao)
+        whenNew(SgtGeneratorImpl.class).withArguments(sgtGeneratorConfig).thenReturn(sgtGenerator);
+        whenNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao, epPolicyTemplateCachedDao, sgtGenerator)
                 .thenReturn(epPolicyTemplateDaoFacade);
+        whenNew(EPToSgtMapperImpl.class).withArguments(epPolicyTemplateDaoFacade).thenReturn(epToSgtMapper);
+
         whenNew(EPForwardingTemplateDaoImpl.class).withArguments(dataBroker, epFwTemplateCachedDao)
                 .thenReturn(epForwardingTemplateDao);
         whenNew(MasterDatabaseBindingDaoImpl.class).withArguments(dataBroker, masterDBBindingCachedDao)
@@ -124,24 +130,25 @@ public class SxpEpProviderProviderImplTest {
                 masterDBBindingDao, epForwardingTemplateDao).thenReturn(epPolicyTemplateListener);
         whenNew(EPForwardingTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epFwTemplateCachedDao,
                 masterDBBindingDao, epPolicyTemplateDaoFacade).thenReturn(epForwardingTemplateListener);
-        whenNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDaoFacade,epPolicyTemplateKeyFactory)
+        whenNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDaoepPolicyTemplateKeyFactory)
                 .thenReturn(sxpEPAugmentor);
 
 
-        provider = new SxpEpProviderProviderImpl(dataBroker, rpcRegistry, domainSpecificRegistry);
+        provider = new SxpEpProviderProviderImpl(dataBroker, endpointService, domainSpecificRegistry, sgtGeneratorConfig);
 
-        Mockito.verify(rpcRegistry).getRpcService(BaseEndpointService.class);
         Mockito.verify(templateProviderRegistry).addDistributionTarget(epPolicyTemplateDaoFacade);
         Mockito.verify(epAugmentorRegistry).register(sxpEPAugmentor);
 
         // check if all expected object got constructed and wired
         verifyNew(EPPolicyTemplateProviderRegistryImpl.class).withNoArguments();
-        verifyNew(SxpMapperReactorImpl.class).withArguments(endPointService, dataBroker);
+        verifyNew(SxpMapperReactorImpl.class).withArguments(endpointService, dataBroker);
         verifyNew(SimpleCachedDaoImpl.class, Mockito.times(2)).withNoArguments();
         verifyNew(SimpleCachedDaoEPForwardingTemplateImpl.class).withNoArguments();
         verifyNew(EpPolicyTemplateValueKeyFactory.class).withArguments(groupOrdering, conditionOrdering);
         verifyNew(EPPolicyTemplateDaoImpl.class).withArguments(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory);
-        verifyNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao);
+        verifyNew(SgtGeneratorImpl.class).withArguments(sgtGeneratorConfig);
+        verifyNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao, epPolicyTemplateCachedDao, sgtGenerator);
+        verifyNew(EPToSgtMapperImpl.class).withArguments(epPolicyTemplateDaoFacade);
         verifyNew(EPForwardingTemplateDaoImpl.class).withArguments(dataBroker, epFwTemplateCachedDao);
         verifyNew(MasterDatabaseBindingDaoImpl.class).withArguments(dataBroker, masterDBBindingCachedDao);
         verifyNew(MasterDatabaseBindingListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
@@ -150,7 +157,7 @@ public class SxpEpProviderProviderImplTest {
                 masterDBBindingDao, epForwardingTemplateDao);
         verifyNew(EPForwardingTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epFwTemplateCachedDao,
                 masterDBBindingDao, epPolicyTemplateDaoFacade);
-        verifyNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDaoFacade,epPolicyTemplateKeyFactory);
+        verifyNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDaoepPolicyTemplateKeyFactory);
     }
 
     @Test
index 57727c7763c5b9b77a355eff7d82010ad935e8f1..532da14ddb16a9140a3f22bb6020c28e5a2c3b67 100644 (file)
@@ -9,8 +9,10 @@
 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao;
 
 import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.concurrent.ExecutionException;
 import org.hamcrest.BaseMatcher;
@@ -28,6 +30,8 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SgtGeneratorImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SimpleCachedDao;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
@@ -52,15 +56,20 @@ public class EPPolicyTemplateDaoFacadeImplTest {
     @Mock
     private EPPolicyTemplateDaoImpl delegateDao;
     @Mock
+    private SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> delegateCachedDao;
+    @Mock
     private DataBroker dataBroker;
     @Mock
     private EPPolicyTemplateProvider provider;
     @Mock
+    private SgtGeneratorImpl sgtGeneratorImpl;
+    @Mock
     private WriteTransaction wTx;
 
 
     private EndpointPolicyTemplateBySgtBuilder templateBld;
     private EPPolicyTemplateDaoFacadeImpl facade;
+    private EndpointPolicyTemplateBySgt first;
 
     @Before
     public void setUp() throws Exception {
@@ -71,7 +80,7 @@ public class EPPolicyTemplateDaoFacadeImplTest {
                 .setSgt(SGT)
                 .setEndpointGroups(Collections.singletonList(EPG_ID));
 
-        facade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, delegateDao);
+        facade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, delegateDao, delegateCachedDao, sgtGeneratorImpl);
     }
 
     @Test
@@ -154,4 +163,29 @@ public class EPPolicyTemplateDaoFacadeImplTest {
         });
         actual.get();
     }
+
+    @Test
+    public void testReadBy() throws Exception {
+        Mockito.when(sgtGeneratorImpl.generateNextSgt(delegateCachedDao))
+                .thenReturn(java.util.Optional.empty())
+                .thenReturn(java.util.Optional.of(new Sgt(42)));
+
+        final EpPolicyTemplateValueKey lookupKey = new EpPolicyTemplateValueKey(TENANT_ID,
+                Collections.singletonList(EPG_ID), Collections.emptyList());
+
+        final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> templateFail = facade.readBy(lookupKey);
+        Assert.assertTrue(templateFail.isDone());
+        Assert.assertTrue(templateFail.get().isEmpty());
+
+        final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> templateSuccess = facade.readBy(lookupKey);
+        Assert.assertTrue(templateSuccess.isDone());
+        final Collection<EndpointPolicyTemplateBySgt> templateBag = templateSuccess.get();
+        Assert.assertFalse(templateBag.isEmpty());
+        first = Iterables.getFirst(templateBag, null);
+        Assert.assertNotNull(templateBag);
+        Assert.assertEquals(TemplateGenerated.class, first.getOrigin());
+        Assert.assertEquals(Collections.singletonList(EPG_ID), Iterables.getFirst(templateBag, null).getEndpointGroups());
+        Assert.assertTrue(Iterables.getFirst(templateBag, null).getConditions().isEmpty());
+        Assert.assertEquals(42, Iterables.getFirst(templateBag, null).getSgt().getValue().intValue());
+    }
 }
\ No newline at end of file