BUG-6650: ep-ip/sgt, implement and wire template provider 83/46383/2
authorMichal Rehak <mirehak@cisco.com>
Thu, 18 Aug 2016 16:04:50 +0000 (18:04 +0200)
committerMichal Rehak <mirehak@cisco.com>
Mon, 3 Oct 2016 15:10:42 +0000 (17:10 +0200)
    - provider needs ise adapter which registers upon feature started
    - unit tests
    - added epPolicyTemplateDaoFacade

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

27 files changed:
sxp-integration/sxp-ep-provider/pom.xml
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPPolicyTemplateDaoFacade.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPPolicyTemplateProvider.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPPolicyTemplateProviderRegistry.java
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/TemplateProviderDistributionTarget.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateFacade.java [deleted file]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateProviderRegistryImpl.java [new file with mode: 0644]
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 [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoImpl.java
sxp-integration/sxp-ep-provider/src/main/yang/sxp-ep-provider-model.yang
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateProviderRegistryImplTest.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SxpEpProviderProviderImplTest.java [new file with mode: 0644]
sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImplTest.java [new file with mode: 0644]
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/controller/config/yang/config/groupbasedpolicy/sxp_integration/gbp_sxp_ise_adapter/GbpIseAdapterProviderInstance.java
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderFacade.java [new file with mode: 0644]
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderIseImpl.java [new file with mode: 0644]
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/GbpIseAdapterProvider.java
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/GbpIseConfigListenerImpl.java
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/GbpIseSgtHarvesterImpl.java
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/util/IseReplyUtil.java [new file with mode: 0644]
sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/util/RestClientFactory.java
sxp-integration/sxp-ise-adapter/src/main/resources/org/opendaylight/blueprint/gbp-ise-adapter.xml
sxp-integration/sxp-ise-adapter/src/main/yang/gbp-sxp-ise-adapter-cfg.yang
sxp-integration/sxp-ise-adapter/src/test/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderIseImplTest.java [new file with mode: 0644]
sxp-integration/sxp-ise-adapter/src/test/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/GbpIseAdapterProviderTest.java
sxp-integration/sxp-ise-adapter/src/test/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/GbpIseConfigListenerImplTest.java

index 9e04c8c97a7efa4bc003c552defad00b370c9882..84afb4c9df4a74d96770d749314f99122a66bb92 100755 (executable)
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-module-junit4</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <!-- project build -->
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPPolicyTemplateDaoFacade.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/EPPolicyTemplateDaoFacade.java
new file mode 100644 (file)
index 0000000..25af1da
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * 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 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.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;
+
+/**
+ * Purpose: union of template-dao and template provider consumer
+ */
+public interface EPPolicyTemplateDaoFacade extends TemplateProviderDistributionTarget<EPPolicyTemplateProvider>,
+        DSAsyncDao<Sgt, EndpointPolicyTemplateBySgt>, ReadableByKey<EpPolicyTemplateValueKey, EndpointPolicyTemplateBySgt> {
+}
index 5a9e47856c68f722f0cdf7e23dc81f013c469557..00f59b5d720c4374dbef52f88bda9177710e930d 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.api;
 
 import java.util.Optional;
+import javax.annotation.Nonnull;
 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.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
@@ -20,8 +21,7 @@ public interface EPPolicyTemplateProvider {
 
     /**
      * @param sgt of template
-     * @param tenantId of template
      * @return template if available (expecting empty conditions field)
      */
-    Optional<EndpointPolicyTemplateBySgt> provideTemplate(final Sgt sgt, final TenantId tenantId);
+    Optional<EndpointPolicyTemplateBySgt> provideTemplate(@Nonnull final Sgt sgt);
 }
index 22d95ab45c3ef6d54e4fa17745338f024d2b36a3..32ec411f2fbb99db6f3a1c96479133de938e5e1d 100644 (file)
@@ -13,11 +13,19 @@ import org.opendaylight.yangtools.concepts.ObjectRegistration;
 /**
  * Purpose: injection point for a {@link EPPolicyTemplateProvider}
  */
-public interface EPPolicyTemplateProviderRegistry {
+public interface EPPolicyTemplateProviderRegistry extends AutoCloseable {
 
     /**
      * @param templateProvider provider to register
      * @return corresponding registration
      */
     ObjectRegistration<EPPolicyTemplateProvider> registerTemplateProvider(EPPolicyTemplateProvider templateProvider);
+
+    /**
+     * @param templateProviderDistributionTarget consumer of template provider
+     */
+    void addDistributionTarget(TemplateProviderDistributionTarget<EPPolicyTemplateProvider> templateProviderDistributionTarget);
+
+    @Override
+    void close();
 }
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/TemplateProviderDistributionTarget.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/api/TemplateProviderDistributionTarget.java
new file mode 100644 (file)
index 0000000..d9f68b0
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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;
+
+/**
+ * Purpose: support injecting of template provider
+ */
+public interface TemplateProviderDistributionTarget<T> {
+
+    /**
+     * @param templateProvider current template provider
+     */
+    void setTemplateProvider(T templateProvider);
+
+}
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateFacade.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateFacade.java
deleted file mode 100644 (file)
index 5ccef33..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
-import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProviderRegistry;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-
-/**
- * Purpose: provide registration and internal distribution for obtained {@link EPPolicyTemplateProvider}
- */
-public class EPPolicyTemplateFacade implements EPPolicyTemplateProviderRegistry {
-    @Override
-    public ObjectRegistration<EPPolicyTemplateProvider> registerTemplateProvider(final EPPolicyTemplateProvider templateProvider) {
-        //TODO stub
-        return null;
-    }
-}
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateProviderRegistryImpl.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateProviderRegistryImpl.java
new file mode 100644 (file)
index 0000000..eb4ab33
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * 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.Sets;
+import java.util.Set;
+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.TemplateProviderDistributionTarget;
+import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+
+/**
+ * Purpose: provide registration and internal distribution for obtained {@link EPPolicyTemplateProvider}
+ */
+public class EPPolicyTemplateProviderRegistryImpl implements EPPolicyTemplateProviderRegistry {
+    private EPPolicyTemplateProvider templateProvider;
+    private Set<TemplateProviderDistributionTarget<EPPolicyTemplateProvider>> distributionTargets = Sets.newConcurrentHashSet();
+
+    @Override
+    public ObjectRegistration<EPPolicyTemplateProvider> registerTemplateProvider(final EPPolicyTemplateProvider templateProvider) {
+        distributeTemplateProvider(templateProvider);
+        return new AbstractObjectRegistration<EPPolicyTemplateProvider>(templateProvider) {
+            @Override
+            protected void removeRegistration() {
+                distributeTemplateProvider(null);
+            }
+        };
+    }
+
+    @Override
+    public void addDistributionTarget(final TemplateProviderDistributionTarget<EPPolicyTemplateProvider> templateProviderDistributionTarget) {
+        distributionTargets.add(templateProviderDistributionTarget);
+        if (templateProvider != null) {
+            templateProviderDistributionTarget.setTemplateProvider(templateProvider);
+        }
+    }
+
+    /**
+     * inject given templateProvider into available targets
+     * @param templateProvider current provider
+     */
+    private void distributeTemplateProvider(final EPPolicyTemplateProvider templateProvider) {
+        this.templateProvider = templateProvider;
+        for (TemplateProviderDistributionTarget<EPPolicyTemplateProvider> distributionTarget : distributionTargets) {
+            distributionTarget.setTemplateProvider(templateProvider);
+        }
+    }
+
+    @Override
+    public void close() {
+        distributeTemplateProvider(null);
+        distributionTargets.clear();
+    }
+}
index 41b0a88ac185f394920ee2f049640868a881ea6f..c20eb00a073112239dde97f61ecd884aa14390ba 100644 (file)
@@ -12,8 +12,10 @@ 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.impl.dao.EPForwardingTemplateDaoImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoFacadeImpl;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoImpl;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKeyFactory;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.MasterDatabaseBindingDaoImpl;
@@ -41,7 +43,6 @@ public class SxpEpProviderProviderImpl implements SxpEpProviderProvider {
     private static final Logger LOG = LoggerFactory.getLogger(SxpEpProviderProviderImpl.class);
 
     private final MasterDatabaseBindingListenerImpl sxpDatabaseListener;
-    private final SxpMapperReactor sxpMapperReactor;
     private final EPTemplateListener epPolicyTemplateListener;
     private final EPTemplateListener epForwardingTemplateListener;
     private final DomainSpecificRegistry domainSpecificRegistry;
@@ -53,10 +54,10 @@ public class SxpEpProviderProviderImpl implements SxpEpProviderProvider {
         LOG.info("starting SxmMapper ..");
         this.domainSpecificRegistry = domainSpecificRegistry;
 
-        epPolicyTemplateRegistry = new EPPolicyTemplateFacade();
+        epPolicyTemplateRegistry = new EPPolicyTemplateProviderRegistryImpl();
 
         final BaseEndpointService endpointService = rpcRegistryDependency.getRpcService(BaseEndpointService.class);
-        sxpMapperReactor = new SxpMapperReactorImpl(endpointService, dataBroker);
+        final SxpMapperReactor sxpMapperReactor = new SxpMapperReactorImpl(endpointService, dataBroker);
 
         final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao = new SimpleCachedDaoImpl<>();
         final SimpleCachedDao<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateCachedDao =
@@ -66,18 +67,21 @@ public class SxpEpProviderProviderImpl implements SxpEpProviderProvider {
         final EpPolicyTemplateValueKeyFactory epPolicyTemplateKeyFactory = new EpPolicyTemplateValueKeyFactory(
                 EPTemplateUtil.createEndpointGroupIdOrdering(), EPTemplateUtil.createConditionNameOrdering());
         final EPPolicyTemplateDaoImpl epPolicyTemplateDao = new EPPolicyTemplateDaoImpl(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory);
-        //TODO: inject delegate (ise-adapter-provider)
+        final EPPolicyTemplateDaoFacade epPolicyTemplateDaoFacade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, epPolicyTemplateDao);
+        epPolicyTemplateRegistry.addDistributionTarget(epPolicyTemplateDaoFacade);
+
         final EPForwardingTemplateDaoImpl epForwardingTemplateDao = new EPForwardingTemplateDaoImpl(dataBroker,
                 epForwardingTemplateCachedDao);
+
         final MasterDatabaseBindingDaoImpl masterDBBindingDao = new MasterDatabaseBindingDaoImpl(dataBroker, masterDBBindingCachedDao);
 
         sxpDatabaseListener = new MasterDatabaseBindingListenerImpl(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
-                epPolicyTemplateDao, epForwardingTemplateDao);
+                epPolicyTemplateDaoFacade, epForwardingTemplateDao);
         epPolicyTemplateListener = new EPPolicyTemplateListenerImpl(dataBroker, sxpMapperReactor, epPolicyTemplateCachedDao,
                 masterDBBindingDao, epForwardingTemplateDao);
         epForwardingTemplateListener = new EPForwardingTemplateListenerImpl(dataBroker, sxpMapperReactor, epForwardingTemplateCachedDao,
-                masterDBBindingDao, epPolicyTemplateDao);
-        sxpEndpointAugmentor = new SxpEndpointAugmentorImpl(epPolicyTemplateDao, epPolicyTemplateKeyFactory);
+                masterDBBindingDao, epPolicyTemplateDaoFacade);
+        sxpEndpointAugmentor = new SxpEndpointAugmentorImpl(epPolicyTemplateDaoFacade, epPolicyTemplateKeyFactory);
         domainSpecificRegistry.getEndpointAugmentorRegistry().register(sxpEndpointAugmentor);
         LOG.info("started SxmMapper");
     }
@@ -92,6 +96,7 @@ public class SxpEpProviderProviderImpl implements SxpEpProviderProvider {
         sxpDatabaseListener.close();
         epPolicyTemplateListener.close();
         epForwardingTemplateListener.close();
+        epPolicyTemplateRegistry.close();
         domainSpecificRegistry.getEndpointAugmentorRegistry().unregister(sxpEndpointAugmentor);
     }
 }
diff --git a/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImpl.java b/sxp-integration/sxp-ep-provider/src/main/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImpl.java
new file mode 100644 (file)
index 0000000..e23064c
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * 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.dao;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+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 javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+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;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateDaoFacade;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
+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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
+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.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.EndpointPolicyTemplateBySgtKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Purpose: add template provider fallback to {@link EPPolicyTemplateDaoImpl}
+ */
+public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade {
+
+    private static final Logger LOG = LoggerFactory.getLogger(EPPolicyTemplateDaoFacadeImpl.class);
+
+    private final EPPolicyTemplateDaoImpl epPolicyTemplateDao;
+    private final DataBroker dataBroker;
+
+    private EPPolicyTemplateProvider templateProvider;
+
+    public EPPolicyTemplateDaoFacadeImpl(final DataBroker dataBroker, final EPPolicyTemplateDaoImpl epPolicyTemplateDao) {
+        this.dataBroker = dataBroker;
+        this.epPolicyTemplateDao = epPolicyTemplateDao;
+    }
+
+    @Override
+    public void setTemplateProvider(final EPPolicyTemplateProvider templateProvider) {
+        this.templateProvider = templateProvider;
+    }
+
+
+    @Override
+    public ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> read(@Nonnull final Sgt key) {
+        // read from delegate
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> templateFu = epPolicyTemplateDao.read(key);
+
+        // involve fallback if template is absent
+        return Futures.transform(templateFu, new AsyncFunction<Optional<EndpointPolicyTemplateBySgt>, Optional<EndpointPolicyTemplateBySgt>>() {
+            @Override
+            public ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> apply(
+                    @Nonnull final Optional<EndpointPolicyTemplateBySgt> templateOpt) throws Exception {
+
+                return templateOpt.transform(template -> Futures.immediateFuture(templateOpt))
+                        // failed to read template -> invoke fallback if available
+                        .or(() -> java.util.Optional.ofNullable(templateProvider)
+                                .flatMap(provider -> templateProvider.provideTemplate(key))
+                                .map(template -> storeTemplateAndEpg(template))
+                                .orElse(Futures.immediateFuture(Optional.absent()))
+                        );
+            }
+        });
+    }
+
+    private ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> storeTemplateAndEpg(final EndpointPolicyTemplateBySgt template) {
+        // store EPG (presume that it does not exist)
+        final Sgt sgtValue = template.getSgt();
+        LOG.trace("storing EPGs for generated epPolicyTemplate: {} [{}]",
+                sgtValue.getValue(), template.getEndpointGroups().size());
+        final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
+
+        boolean createParent = true;
+        for (EndpointGroupId epgId : template.getEndpointGroups()) {
+            final InstanceIdentifier<EndpointGroup> epgPath = IidFactory.endpointGroupIid(template.getTenant(), epgId);
+            final EndpointGroup epg = new EndpointGroupBuilder()
+                    .setId(epgId)
+                    .setDescription(new Description("imported from ISE for sgt=" + sgtValue.getValue()))
+                    .setName(new Name(String.format("%s_ISE_SGT_%d", epgId.getValue(), sgtValue.getValue())))
+                    .build();
+            wTx.put(LogicalDatastoreType.CONFIGURATION, epgPath, epg, createParent);
+            createParent = false;
+        }
+
+        // store ep-policy-template
+        LOG.trace("storing generated epPolicyTemplate: {}", sgtValue.getValue());
+        final InstanceIdentifier<EndpointPolicyTemplateBySgt> epPolicyTemplatePath = InstanceIdentifier
+                .create(SxpEpMapper.class)
+                .child(EndpointPolicyTemplateBySgt.class, new EndpointPolicyTemplateBySgtKey(sgtValue));
+        wTx.put(LogicalDatastoreType.CONFIGURATION, epPolicyTemplatePath, template, true);
+
+        return Futures.transform(wTx.submit(), createStoreOutcomeHandler(template));
+    }
+
+    private Function<Void, Optional<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandler(final EndpointPolicyTemplateBySgt template) {
+        return new Function<Void, Optional<EndpointPolicyTemplateBySgt>>() {
+            @Nullable
+            @Override
+            public Optional<EndpointPolicyTemplateBySgt> apply(@Nullable final Void aVoid) {
+                return Optional.of(template);
+            }
+        };
+    }
+
+    @Override
+    public Collection<EndpointPolicyTemplateBySgt> readBy(@Nonnull final EpPolicyTemplateValueKey specialKey) {
+        return epPolicyTemplateDao.readBy(specialKey);
+    }
+}
index 531d721b85450ac875218bf926f8fc1fd30a28a3..3e028c9ad04c5665b39316d57cd849a9ccf86c47 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
@@ -55,11 +56,10 @@ public class EPPolicyTemplateDaoImpl implements DSAsyncDao<Sgt, EndpointPolicyTe
 
     @Override
     public ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> read(@Nonnull final Sgt key) {
-        final Optional<EndpointPolicyTemplateBySgt> cachedEndpointPolicyTemplateBySgtalue = lookup(cachedDao, key);
-        if (cachedEndpointPolicyTemplateBySgtalue.isPresent()) {
-            return Futures.immediateFuture(cachedEndpointPolicyTemplateBySgtalue);
+        final Optional<EndpointPolicyTemplateBySgt> cachedEndpointPolicyTemplateBySgtValue = lookup(cachedDao, key);
+        if (cachedEndpointPolicyTemplateBySgtValue.isPresent()) {
+            return Futures.immediateFuture(cachedEndpointPolicyTemplateBySgtValue);
         } else if (!cachedDao.isEmpty()) {
-            //TODO: delegate to ise-template-provider
             return READ_FUTURE_ABSENT;
         } else {
             final ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
@@ -81,6 +81,7 @@ public class EPPolicyTemplateDaoImpl implements DSAsyncDao<Sgt, EndpointPolicyTe
         }
     }
 
+    @VisibleForTesting
     protected InstanceIdentifier<EndpointPolicyTemplateBySgt> buildReadPath(final Sgt key) {
         return EPTemplateListener.SXP_MAPPER_TEMPLATE_PARENT_PATH
                 .child(EndpointPolicyTemplateBySgt.class, new EndpointPolicyTemplateBySgtKey(key));
index 0bb3a865e83bb0fd195d5ec7837c41ff45c8520e..1ea69bdb97c4a77c0c939b96171c920caecdcebc 100644 (file)
@@ -108,5 +108,7 @@ module sxp-ep-provider-model {
     augment "renderer:renderers/renderer:renderer/renderer:renderer-policy/renderer:configuration/renderer:endpoints/renderer:address-endpoint-with-location" {
         ext:augment-identifier "address-endpoint-with-location-aug";
         uses sxp-sgt;
+        status deprecated;
+        description "deprecated: to be replaced by sxp-ep-provider mechanism (lookup template with sgt or generate sgt)";
     }
 }
diff --git a/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateProviderRegistryImplTest.java b/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/EPPolicyTemplateProviderRegistryImplTest.java
new file mode 100644 (file)
index 0000000..9244108
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * 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.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.api.EPPolicyTemplateProvider;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.TemplateProviderDistributionTarget;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+
+/**
+ * Test for {@link EPPolicyTemplateProviderRegistryImpl}.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class EPPolicyTemplateProviderRegistryImplTest {
+
+    @Mock
+    private EPPolicyTemplateProvider templateProvider;
+    @Mock
+    private TemplateProviderDistributionTarget<EPPolicyTemplateProvider> target1;
+    @Mock
+    private TemplateProviderDistributionTarget<EPPolicyTemplateProvider> target2;
+    @Mock
+    private TemplateProviderDistributionTarget<EPPolicyTemplateProvider> target3;
+
+    private EPPolicyTemplateProviderRegistryImpl registry;
+
+    @Before
+    public void setUp() throws Exception {
+        registry = new EPPolicyTemplateProviderRegistryImpl();
+    }
+
+    @Test
+    public void testRegisterTemplateProvider() throws Exception {
+        registry.addDistributionTarget(target1);
+        final ObjectRegistration<EPPolicyTemplateProvider> registration = registry.registerTemplateProvider(templateProvider);
+        Mockito.verify(target1).setTemplateProvider(templateProvider);
+        registry.addDistributionTarget(target2);
+        Mockito.verify(target2).setTemplateProvider(templateProvider);
+
+        registration.close();
+        Mockito.verify(target1).setTemplateProvider(null);
+        Mockito.verify(target2).setTemplateProvider(null);
+        registry.addDistributionTarget(target3);
+
+        Mockito.verifyNoMoreInteractions(target1, target2, target3);
+    }
+
+    @Test
+    public void testAddDistributionTarget() throws Exception {
+        registry.addDistributionTarget(target1);
+        Mockito.verify(target1, Mockito.never()).setTemplateProvider(Matchers.<EPPolicyTemplateProvider>any());
+
+        registry.registerTemplateProvider(templateProvider);
+        Mockito.verify(target1).setTemplateProvider(templateProvider);
+
+        registry.addDistributionTarget(target2);
+        Mockito.verify(target2).setTemplateProvider(templateProvider);
+    }
+
+    @Test
+    public void testClose() throws Exception {
+        registry.addDistributionTarget(target1);
+        final ObjectRegistration<EPPolicyTemplateProvider> registration = registry.registerTemplateProvider(templateProvider);
+        registry.addDistributionTarget(target2);
+        Mockito.verify(target1).setTemplateProvider(templateProvider);
+        Mockito.verify(target2).setTemplateProvider(templateProvider);
+
+        registry.close();
+        Mockito.verify(target1).setTemplateProvider(null);
+        Mockito.verify(target2).setTemplateProvider(null);
+
+        Mockito.verifyNoMoreInteractions(target1, target2);
+    }
+}
\ No newline at end of file
diff --git a/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SxpEpProviderProviderImplTest.java b/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/SxpEpProviderProviderImplTest.java
new file mode 100644 (file)
index 0000000..ed7895c
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * 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 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;
+import org.junit.Test;
+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;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoFacadeImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKeyFactory;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.MasterDatabaseBindingDaoImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.SimpleCachedDaoEPForwardingTemplateImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.SimpleCachedDaoImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.listen.EPForwardingTemplateListenerImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.listen.EPPolicyTemplateListenerImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.listen.MasterDatabaseBindingListenerImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.EPTemplateUtil;
+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.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService;
+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.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;
+
+/**
+ * Test for {@link SxpEpProviderProviderImpl}.
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SxpEpProviderProviderImpl.class, EPTemplateUtil.class})
+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;
+    @Mock
+    private SimpleCachedDaoImpl<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao;
+    @Mock
+    private SimpleCachedDaoImpl<IpPrefix, MasterDatabaseBinding> masterDBBindingCachedDao;
+    @Mock
+    private SimpleCachedDaoEPForwardingTemplateImpl epFwTemplateCachedDao;
+    @Mock
+    private Ordering<EndpointGroupId> groupOrdering;
+    @Mock
+    private Ordering<ConditionName> conditionOrdering;
+    @Mock
+    private EpPolicyTemplateValueKeyFactory epPolicyTemplateKeyFactory;
+    @Mock
+    private EPPolicyTemplateDaoImpl epPolicyTemplateDao;
+    @Mock
+    private EPForwardingTemplateDaoImpl epForwardingTemplateDao;
+    @Mock
+    private MasterDatabaseBindingDaoImpl masterDBBindingDao;
+    @Mock
+    private MasterDatabaseBindingListenerImpl masterDBBindingListener;
+    @Mock
+    private EPPolicyTemplateListenerImpl epPolicyTemplateListener;
+    @Mock
+    private EPForwardingTemplateListenerImpl epForwardingTemplateListener;
+    @Mock
+    private SxpEndpointAugmentorImpl sxpEPAugmentor;
+    @Mock
+    private EndpointAugmentorRegistry epAugmentorRegistry;
+    @Mock
+    private EPPolicyTemplateDaoFacadeImpl epPolicyTemplateDaoFacade;
+
+    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(SimpleCachedDaoImpl.class).withNoArguments().thenReturn(epPolicyTemplateCachedDao, masterDBBindingCachedDao);
+        whenNew(SimpleCachedDaoEPForwardingTemplateImpl.class).withNoArguments().thenReturn(epFwTemplateCachedDao);
+        stub(method(EPTemplateUtil.class, "createEndpointGroupIdOrdering")).toReturn(groupOrdering);
+        stub(method(EPTemplateUtil.class, "createConditionNameOrdering")).toReturn(conditionOrdering);
+        whenNew(EpPolicyTemplateValueKeyFactory.class).withArguments(groupOrdering, conditionOrdering)
+                .thenReturn(epPolicyTemplateKeyFactory);
+        whenNew(EPPolicyTemplateDaoImpl.class).withArguments(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory)
+                .thenReturn(epPolicyTemplateDao);
+        whenNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao)
+                .thenReturn(epPolicyTemplateDaoFacade);
+        whenNew(EPForwardingTemplateDaoImpl.class).withArguments(dataBroker, epFwTemplateCachedDao)
+                .thenReturn(epForwardingTemplateDao);
+        whenNew(MasterDatabaseBindingDaoImpl.class).withArguments(dataBroker, masterDBBindingCachedDao)
+                .thenReturn(masterDBBindingDao);
+        whenNew(MasterDatabaseBindingListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
+                epPolicyTemplateDaoFacade, epForwardingTemplateDao).thenReturn(masterDBBindingListener);
+        whenNew(EPPolicyTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epPolicyTemplateCachedDao,
+                masterDBBindingDao, epForwardingTemplateDao).thenReturn(epPolicyTemplateListener);
+        whenNew(EPForwardingTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epFwTemplateCachedDao,
+                masterDBBindingDao, epPolicyTemplateDaoFacade).thenReturn(epForwardingTemplateListener);
+        whenNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDaoFacade,epPolicyTemplateKeyFactory)
+                .thenReturn(sxpEPAugmentor);
+
+
+        provider = new SxpEpProviderProviderImpl(dataBroker, rpcRegistry, domainSpecificRegistry);
+
+        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(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(EPForwardingTemplateDaoImpl.class).withArguments(dataBroker, epFwTemplateCachedDao);
+        verifyNew(MasterDatabaseBindingDaoImpl.class).withArguments(dataBroker, masterDBBindingCachedDao);
+        verifyNew(MasterDatabaseBindingListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
+                epPolicyTemplateDaoFacade, epForwardingTemplateDao);
+        verifyNew(EPPolicyTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epPolicyTemplateCachedDao,
+                masterDBBindingDao, epForwardingTemplateDao);
+        verifyNew(EPForwardingTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epFwTemplateCachedDao,
+                masterDBBindingDao, epPolicyTemplateDaoFacade);
+        verifyNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDaoFacade,epPolicyTemplateKeyFactory);
+    }
+
+    @Test
+    public void testGetEPPolicyTemplateProviderRegistry() throws Exception {
+        Assert.assertSame(templateProviderRegistry, provider.getEPPolicyTemplateProviderRegistry());
+    }
+
+    @Test
+    public void testClose() throws Exception {
+        provider.close();
+        Mockito.verify(masterDBBindingListener).close();
+        Mockito.verify(epPolicyTemplateListener).close();
+        Mockito.verify(epForwardingTemplateListener).close();
+        Mockito.verify(templateProviderRegistry).close();
+        Mockito.verify(epAugmentorRegistry).unregister(sxpEPAugmentor);
+    }
+}
\ No newline at end of file
diff --git a/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImplTest.java b/sxp-integration/sxp-ep-provider/src/test/java/org/opendaylight/groupbasedpolicy/sxp/ep/provider/impl/dao/EPPolicyTemplateDaoFacadeImplTest.java
new file mode 100644 (file)
index 0000000..57727c7
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * 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.dao;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+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.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;
+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 EPPolicyTemplateDaoFacadeImpl}.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class EPPolicyTemplateDaoFacadeImplTest {
+
+    private static final Sgt SGT = new Sgt(42);
+    private static final TenantId TENANT_ID = new TenantId("tenant-01");
+    private static final EndpointGroupId EPG_ID = new EndpointGroupId("epg-01");
+    private static final TransactionCommitFailedException TX_EXCEPTION = new TransactionCommitFailedException("unit-txSubmit-error");
+
+    @Rule
+    public ExpectedException thrownRule = ExpectedException.none();
+
+    @Mock
+    private EPPolicyTemplateDaoImpl delegateDao;
+    @Mock
+    private DataBroker dataBroker;
+    @Mock
+    private EPPolicyTemplateProvider provider;
+    @Mock
+    private WriteTransaction wTx;
+
+
+    private EndpointPolicyTemplateBySgtBuilder templateBld;
+    private EPPolicyTemplateDaoFacadeImpl facade;
+
+    @Before
+    public void setUp() throws Exception {
+        Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture((Void) null));
+        Mockito.when(dataBroker.newWriteOnlyTransaction()).thenReturn(wTx);
+        templateBld = new EndpointPolicyTemplateBySgtBuilder()
+                .setTenant(TENANT_ID)
+                .setSgt(SGT)
+                .setEndpointGroups(Collections.singletonList(EPG_ID));
+
+        facade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, delegateDao);
+    }
+
+    @Test
+    public void testRead_trivial() throws Exception {
+        final EndpointPolicyTemplateBySgt template = templateBld.build();
+        Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.of(template)));
+
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
+        Assert.assertTrue(actual.isDone());
+        Assert.assertTrue(actual.get().isPresent());
+        Assert.assertEquals(template, actual.get().get());
+    }
+
+    @Test
+    public void testRead_success() throws Exception {
+        final EndpointPolicyTemplateBySgt template = templateBld
+                .setOrigin(TemplateGenerated.class)
+                .build();
+
+        Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
+        Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.of(template));
+        Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
+        facade.setTemplateProvider(provider);
+
+
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
+        Assert.assertTrue(actual.isDone());
+        Assert.assertTrue(actual.get().isPresent());
+        Assert.assertEquals(template, actual.get().get());
+    }
+
+    @Test
+    public void testRead_failNoProvider() throws Exception {
+        Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
+
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
+        Assert.assertTrue(actual.isDone());
+        Assert.assertFalse(actual.get().isPresent());
+    }
+
+    @Test
+    public void testRead_failProviderMiss() throws Exception {
+        Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
+        Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.empty());
+        facade.setTemplateProvider(provider);
+
+
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
+        Assert.assertTrue(actual.isDone());
+        Assert.assertFalse(actual.get().isPresent());
+    }
+
+    @Test
+    public void testRead_failProviderStoreError() throws Exception {
+        Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
+        final EndpointPolicyTemplateBySgt template = templateBld
+                .setOrigin(TemplateGenerated.class)
+                .build();
+
+        Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
+        Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.of(template));
+        Mockito.when(wTx.submit()).thenReturn(Futures.immediateFailedCheckedFuture(TX_EXCEPTION));
+        facade.setTemplateProvider(provider);
+
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
+        Assert.assertTrue(actual.isDone());
+
+        // prepare exception rule
+        thrownRule.expect(ExecutionException.class);
+        thrownRule.expectCause(new BaseMatcher<Throwable>() {
+            @Override
+            public boolean matches(final Object item) {
+                return TX_EXCEPTION == item;
+            }
+
+            @Override
+            public void describeTo(final Description description) {
+                description.appendText("TransactionCommitFailedException");
+            }
+        });
+        actual.get();
+    }
+}
\ No newline at end of file
index 44ca42c45cf3e40706f11bfe4725b37e5c9f0014..a9858764d57ea90f8bd9092dc39fbdcc08551f5f 100644 (file)
@@ -14,6 +14,7 @@ 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.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider;
 import org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.GbpIseAdapterProvider;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
@@ -31,15 +32,18 @@ public class GbpIseAdapterProviderInstance implements ClusterSingletonService, A
     private final DataBroker dataBroker;
     private final BindingAwareBroker bindingAwareBroker;
     private final ClusterSingletonServiceProvider clusterSingletonService;
+    private final SxpEpProviderProvider sxpEpProvider;
     private ClusterSingletonServiceRegistration singletonServiceRegistration;
     private GbpIseAdapterProvider iseAdapterProvider;
 
     public GbpIseAdapterProviderInstance(final DataBroker dataBroker,
                                          final BindingAwareBroker bindingAwareBroker,
-                                         final ClusterSingletonServiceProvider clusterSingletonService) {
+                                         final ClusterSingletonServiceProvider clusterSingletonService,
+                                         final SxpEpProviderProvider sxpEpProvider) {
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
         this.bindingAwareBroker = Preconditions.checkNotNull(bindingAwareBroker);
         this.clusterSingletonService = Preconditions.checkNotNull(clusterSingletonService);
+        this.sxpEpProvider = Preconditions.checkNotNull(sxpEpProvider);
     }
 
     public void initialize() {
@@ -50,13 +54,17 @@ public class GbpIseAdapterProviderInstance implements ClusterSingletonService, A
     @Override
     public void instantiateServiceInstance() {
         LOG.info("Instantiating {}", this.getClass().getSimpleName());
-        iseAdapterProvider = new GbpIseAdapterProvider(dataBroker, bindingAwareBroker);
+        iseAdapterProvider = new GbpIseAdapterProvider(dataBroker, bindingAwareBroker, sxpEpProvider);
     }
 
     @Override
     public ListenableFuture<Void> closeServiceInstance() {
         LOG.info("Instance {} closed", this.getClass().getSimpleName());
-        iseAdapterProvider.close();
+        try {
+            iseAdapterProvider.close();
+        } catch (Exception e) {
+            LOG.warn("iseAdapterProvider closing failed: {}", e.getMessage());
+        }
         return Futures.immediateFuture(null);
     }
 
diff --git a/sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderFacade.java b/sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderFacade.java
new file mode 100644 (file)
index 0000000..bde8640
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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_ise_adapter.impl;
+
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfig;
+
+/**
+ * Purpose: wrap {@link EPPolicyTemplateProvider} and {@link IseSourceConfig} injection
+ */
+public interface EPPolicyTemplateProviderFacade extends EPPolicyTemplateProvider {
+
+    /**
+     * @param iseSourceConfig current ise configuration
+     */
+    void assignIseSourceConfig(final IseSourceConfig iseSourceConfig);
+
+}
diff --git a/sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderIseImpl.java b/sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderIseImpl.java
new file mode 100644 (file)
index 0000000..de64878
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * 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_ise_adapter.impl;
+
+import com.google.common.collect.Range;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import java.util.Collections;
+import java.util.Optional;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.util.IseReplyUtil;
+import org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.util.RestClientFactory;
+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.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.ConnectionConfig;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Node;
+
+/**
+ * Purpose: query ise in order to get name of sgt for given tenant and build {@link EndpointPolicyTemplateBySgt}
+ */
+public class EPPolicyTemplateProviderIseImpl implements EPPolicyTemplateProviderFacade {
+
+    private static final Logger LOG = LoggerFactory.getLogger(EPPolicyTemplateProviderIseImpl.class);
+
+    private Optional<IseSourceConfig> iseSourceConfig = Optional.empty();
+
+    @Override
+    public Optional<EndpointPolicyTemplateBySgt> provideTemplate(@Nonnull final Sgt sgt) {
+        return findIseSourceConfigBySgt(sgt)
+                .flatMap(iseSourceConfig -> queryIseOnSgt(iseSourceConfig.getConnectionConfig(), sgt)
+                        .map(sgtName -> buildTemplate(sgt, iseSourceConfig.getTenant(), sgtName)));
+    }
+
+    private EndpointPolicyTemplateBySgt buildTemplate(final @Nonnull Sgt sgt, final @Nonnull TenantId tenantId,
+                                                      final @Nonnull String sgtName) {
+        return new EndpointPolicyTemplateBySgtBuilder()
+                .setSgt(sgt)
+                .setEndpointGroups(Collections.singletonList(new EndpointGroupId(sgtName)))
+                .setTenant(tenantId)
+                // no conditions
+                .setOrigin(TemplateGenerated.class)
+                .build();
+    }
+
+    private Optional<String> queryIseOnSgt(final ConnectionConfig connectionConfig, final Sgt sgt) {
+        String sgtName = null;
+        try {
+            final Client iseClient = RestClientFactory.createIseClient(connectionConfig);
+            final WebResource baseWebResource = iseClient.resource(connectionConfig.getIseRestUrl().getValue());
+
+            final String pathToSgtDetail = String.format("%s/%d", RestClientFactory.PATH_ERS_CONFIG_SGT, sgt.getValue());
+            final WebResource.Builder requestBuilder = RestClientFactory.createRequestBuilder(baseWebResource,
+                    connectionConfig.getHeader(), pathToSgtDetail);
+            final String rawSgtDetail = IseReplyUtil.deliverResponse(requestBuilder);
+
+            final XPath xpath = IseReplyUtil.setupXpath();
+            final Node sgtNameNode = (Node) xpath.evaluate(
+                    IseReplyUtil.EXPRESSION_SGT_NAME_ATTR, IseReplyUtil.createInputSource(rawSgtDetail),
+                    XPathConstants.NODE);
+            sgtName = sgtNameNode.getNodeValue();
+            LOG.debug("obtained sgt/name: {}/{}", sgt.getValue(), sgtName);
+        } catch (Exception e) {
+            LOG.debug("failed to read sgt detail on ISE", e);
+        }
+        return Optional.ofNullable(sgtName);
+    }
+
+    private Optional<IseSourceConfig> findIseSourceConfigBySgt(final Sgt sgt) {
+        //TODO: cover multiple sources / tenants .. lookup (option: multiple servers per tenant?)
+        return iseSourceConfig
+                .filter(config ->
+                        Range.closed(config.getSgtRangeMin().getValue(), config.getSgtRangeMax().getValue())
+                                .contains(sgt.getValue()));
+    }
+
+    @Override
+    public void assignIseSourceConfig(final @Nullable IseSourceConfig iseSourceConfig) {
+        this.iseSourceConfig = Optional.ofNullable(iseSourceConfig);
+    }
+}
index a7b9f06a8520cd890b4adc357978deaaa4bf9a32..4dfa7a5be83140e9fcb61fb579a20d8646957e3c 100644 (file)
@@ -14,9 +14,12 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.GbpSxpIseAdapter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfig;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,31 +34,47 @@ public class GbpIseAdapterProvider implements AutoCloseable, BindingAwareProvide
     private static final Logger LOG = LoggerFactory.getLogger(GbpIseAdapterProvider.class);
 
     private final DataBroker dataBroker;
+    private final SxpEpProviderProvider sxpEpProvider;
     private ListenerRegistration<ClusteredDataTreeChangeListener<IseSourceConfig>> registration;
+    private ObjectRegistration<EPPolicyTemplateProvider> epPolicyTemplateProviderRegistration;
 
-    public GbpIseAdapterProvider(final DataBroker dataBroker, final BindingAwareBroker brokerDependency) {
+    public GbpIseAdapterProvider(final DataBroker dataBroker, final BindingAwareBroker broker,
+                                 final SxpEpProviderProvider sxpEpProvider) {
         this.dataBroker = Preconditions.checkNotNull(dataBroker, "provided dataBroker must not be null");
-        brokerDependency.registerProvider(this);
+        this.sxpEpProvider = Preconditions.checkNotNull(sxpEpProvider, "provided sxp-ep-provider must not be null");
+
+        broker.registerProvider(this);
     }
 
     @Override
-    public void close() {
+    public void close() throws Exception {
         if (registration != null) {
             LOG.info("closing GbpIseAdapterProvider");
             registration.close();
             registration = null;
         }
+        if (epPolicyTemplateProviderRegistration != null) {
+            LOG.info("closing EPPolicyTemplateProvider");
+            epPolicyTemplateProviderRegistration.close();
+            epPolicyTemplateProviderRegistration = null;
+        }
     }
 
     @Override
     public void onSessionInitiated(final BindingAwareBroker.ProviderContext providerContext) {
         LOG.info("Starting GbpIseAdapterProvider ..");
 
+        // setup template provider pipeline
+        final EPPolicyTemplateProviderFacade templateProviderFacade = new EPPolicyTemplateProviderIseImpl();
+        epPolicyTemplateProviderRegistration = sxpEpProvider.getEPPolicyTemplateProviderRegistry()
+                .registerTemplateProvider(templateProviderFacade);
+
         // setup harvesting and processing pipeline
         final SgtInfoProcessor epgGenerator = new SgtToEpgGeneratorImpl(dataBroker);
         final SgtInfoProcessor templateGenerator = new SgtToEPTemplateGeneratorImpl(dataBroker);
         final GbpIseSgtHarvester gbpIseSgtHarvester = new GbpIseSgtHarvesterImpl(epgGenerator, templateGenerator);
-        final GbpIseConfigListenerImpl gbpIseConfigListener = new GbpIseConfigListenerImpl(dataBroker, gbpIseSgtHarvester);
+        final GbpIseConfigListenerImpl gbpIseConfigListener = new GbpIseConfigListenerImpl(
+                dataBroker, gbpIseSgtHarvester, templateProviderFacade);
 
         // build data-tree path
         final DataTreeIdentifier<IseSourceConfig> dataTreePath = new DataTreeIdentifier<>(
index 69c1f8d37bfb441cbb44fdd669cd903cbbb20873..d75bd9599f98d96e6aa2a1b9abfbccf7770e03c8 100644 (file)
@@ -48,11 +48,14 @@ public class GbpIseConfigListenerImpl implements GbpIseConfigListener {
 
     private final DataBroker dataBroker;
     private final GbpIseSgtHarvester gbpIseSgtHarvester;
+    @Nonnull private final EPPolicyTemplateProviderFacade templateProviderFacade;
     private final ThreadPoolExecutor pool;
 
-    public GbpIseConfigListenerImpl(@Nonnull final DataBroker dataBroker, @Nonnull final GbpIseSgtHarvester gbpIseSgtHarvester) {
+    public GbpIseConfigListenerImpl(@Nonnull final DataBroker dataBroker, @Nonnull final GbpIseSgtHarvester gbpIseSgtHarvester,
+                                    @Nonnull final EPPolicyTemplateProviderFacade templateProviderFacade) {
         this.dataBroker = dataBroker;
         this.gbpIseSgtHarvester = gbpIseSgtHarvester;
+        this.templateProviderFacade = templateProviderFacade;
         pool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10),
                 new ThreadFactoryBuilder().setNameFormat("ise-sgt-harverster-%d").build()) {
             @Override
@@ -69,6 +72,8 @@ public class GbpIseConfigListenerImpl implements GbpIseConfigListener {
     public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<IseSourceConfig>> collection) {
         for (DataTreeModification<IseSourceConfig> modification : collection) {
             final IseSourceConfig iseSourceConfig = modification.getRootNode().getDataAfter();
+            //TODO: separate template provider from harvesting
+            templateProviderFacade.assignIseSourceConfig(iseSourceConfig);
             if (iseSourceConfig != null) {
                 pool.submit(() -> {
                     final ListenableFuture<Integer> harvestResult = gbpIseSgtHarvester.harvest(iseSourceConfig);
index 1eb2f37913c208826f54afffe3f081ac2bbb48b3..bcdec2d09b11d77be7ed09ac4d0bd9d5a55a7898 100644 (file)
@@ -13,21 +13,16 @@ import com.google.common.util.concurrent.AsyncFunction;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.WebResource;
-import java.io.StringReader;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
+import org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.util.IseReplyUtil;
 import org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.util.RestClientFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.ConnectionConfig;
@@ -46,12 +41,6 @@ public class GbpIseSgtHarvesterImpl implements GbpIseSgtHarvester {
 
     private static final Logger LOG = LoggerFactory.getLogger(GbpIseSgtHarvesterImpl.class);
 
-    public static final String PATH_ERS_CONFIG_SGT = "/ers/config/sgt";
-    public static final String EXPRESSION_SGT_ALL_LINK_HREFS = "/ns3:searchResult/ns3:resources/ns5:resource/link/@href";
-    public static final String EXPRESSION_SGT_DETAIL = "./ns4:sgt";
-    public static final String EXPRESSION_SGT_NAME_ATTR = "./@name";
-    public static final String EXPRESSION_SGT_VALUE = "./value/text()";
-
     private final SgtInfoProcessor[] sgtInfoProcessors;
 
     /**
@@ -69,9 +58,9 @@ public class GbpIseSgtHarvesterImpl implements GbpIseSgtHarvester {
             final Client iseClient = RestClientFactory.createIseClient(connectionConfig);
             final WebResource baseWebResource = iseClient.resource(connectionConfig.getIseRestUrl().getValue());
 
-            final WebResource.Builder requestBuilder = createRequestBuilder(baseWebResource,
-                    connectionConfig.getHeader(), PATH_ERS_CONFIG_SGT);
-            final String rawSgtSummary = deliverResponse(requestBuilder);
+            final WebResource.Builder requestBuilder = RestClientFactory.createRequestBuilder(baseWebResource,
+                    connectionConfig.getHeader(), RestClientFactory.PATH_ERS_CONFIG_SGT);
+            final String rawSgtSummary = IseReplyUtil.deliverResponse(requestBuilder);
 
             final List<SgtInfo> sgtInfos = harvestDetails(rawSgtSummary, baseWebResource, connectionConfig.getHeader());
 
@@ -101,29 +90,16 @@ public class GbpIseSgtHarvesterImpl implements GbpIseSgtHarvester {
         return result;
     }
 
-    private static String deliverResponse(final WebResource.Builder requestBuilder) {
-        return requestBuilder.get(ClientResponse.class).getEntity(String.class);
-    }
-
-    private static WebResource.Builder createRequestBuilder(final WebResource resource, final List<Header> headers,
-                                                            final String path) {
-        final WebResource webResource = resource.path(path);
-        final WebResource.Builder requestBuilder = webResource.getRequestBuilder();
-        headers.stream().forEach(
-                (header) -> requestBuilder.header(header.getName(), header.getValue()));
-        return requestBuilder;
-    }
-
     private List<SgtInfo> harvestDetails(final String rawSgtSummary, final WebResource baseWebResource, final List<Header> headers) {
         LOG.trace("rawSgtSummary: {}", rawSgtSummary);
         final List<SgtInfo> sgtInfos = new ArrayList<>();
 
         // parse sgtSummary
-        final XPath xpath = setupXpath();
+        final XPath xpath = IseReplyUtil.setupXpath();
 
-        InputSource inputSource = new InputSource(new StringReader(rawSgtSummary));
+        InputSource inputSource = IseReplyUtil.createInputSource(rawSgtSummary);
         try {
-            final NodeList sgtLinkNodes = (NodeList) xpath.evaluate(EXPRESSION_SGT_ALL_LINK_HREFS, inputSource,
+            final NodeList sgtLinkNodes = (NodeList) xpath.evaluate(IseReplyUtil.EXPRESSION_SGT_ALL_LINK_HREFS, inputSource,
                     XPathConstants.NODESET);
             for (int i = 0; i < sgtLinkNodes.getLength(); i++) {
                 final String sgtLinkHrefValue = sgtLinkNodes.item(i).getNodeValue();
@@ -131,14 +107,14 @@ public class GbpIseSgtHarvesterImpl implements GbpIseSgtHarvester {
 
                 // query all sgt entries (serial-vise)
                 final URI hrefToSgtDetailUri = URI.create(sgtLinkHrefValue);
-                final WebResource.Builder requestBuilder = createRequestBuilder(baseWebResource, headers, hrefToSgtDetailUri.getPath());
-                final String rawSgtDetail = deliverResponse(requestBuilder);
+                final WebResource.Builder requestBuilder = RestClientFactory.createRequestBuilder(baseWebResource, headers, hrefToSgtDetailUri.getPath());
+                final String rawSgtDetail = IseReplyUtil.deliverResponse(requestBuilder);
                 LOG.trace("rawSgtDetail: {}", rawSgtDetail);
 
-                final Node sgtNode = (Node) xpath.evaluate(EXPRESSION_SGT_DETAIL, new InputSource(new StringReader(rawSgtDetail)),
+                final Node sgtNode = (Node) xpath.evaluate(IseReplyUtil.EXPRESSION_SGT_DETAIL, IseReplyUtil.createInputSource(rawSgtDetail),
                         XPathConstants.NODE);
-                final Node sgtName = (Node) xpath.evaluate(EXPRESSION_SGT_NAME_ATTR, sgtNode, XPathConstants.NODE);
-                final Node sgtValue = (Node) xpath.evaluate(EXPRESSION_SGT_VALUE, sgtNode, XPathConstants.NODE);
+                final Node sgtName = (Node) xpath.evaluate(IseReplyUtil.EXPRESSION_SGT_NAME_ATTR, sgtNode, XPathConstants.NODE);
+                final Node sgtValue = (Node) xpath.evaluate(IseReplyUtil.EXPRESSION_SGT_VALUE, sgtNode, XPathConstants.NODE);
                 LOG.debug("sgt value [{}]: {} -> {}", i, sgtValue, sgtName);
 
                 // store replies into list of SgtInfo
@@ -153,42 +129,4 @@ public class GbpIseSgtHarvesterImpl implements GbpIseSgtHarvester {
         return sgtInfos;
     }
 
-    /**
-     * @return initiated xpath with ise namespace context injected
-     */
-    private static XPath setupXpath() {
-        final NamespaceContext nsContext = new NamespaceContext() {
-            public String getNamespaceURI(String prefix) {
-                final String outcome;
-                if (prefix == null) {
-                    throw new NullPointerException("Null prefix");
-                }
-
-                if ("ns5".equals(prefix)) {
-                    outcome = "ers.ise.cisco.com";
-                } else if ("ns3".equals(prefix)) {
-                    outcome = "v2.ers.ise.cisco.com";
-                } else if ("ns4".equals(prefix)) {
-                    outcome = "trustsec.ers.ise.cisco.com";
-                } else {
-                    outcome = XMLConstants.NULL_NS_URI;
-                }
-                return outcome;
-            }
-
-            // This method isn't necessary for XPath processing.
-            public String getPrefix(String uri) {
-                throw new UnsupportedOperationException();
-            }
-
-            // This method isn't necessary for XPath processing either.
-            public Iterator getPrefixes(String uri) {
-                throw new UnsupportedOperationException();
-            }
-        };
-
-        XPath xpath = XPathFactory.newInstance().newXPath();
-        xpath.setNamespaceContext(nsContext);
-        return xpath;
-    }
 }
diff --git a/sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/util/IseReplyUtil.java b/sxp-integration/sxp-ise-adapter/src/main/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/util/IseReplyUtil.java
new file mode 100644 (file)
index 0000000..13e4f52
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * 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_ise_adapter.impl.util;
+
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import java.io.StringReader;
+import java.util.Iterator;
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+import org.xml.sax.InputSource;
+
+/**
+ * Purpose: provide common functionality upon ise reply message
+ */
+public class IseReplyUtil {
+
+    public static final String EXPRESSION_SGT_ALL_LINK_HREFS = "/ns3:searchResult/ns3:resources/ns5:resource/link/@href";
+    public static final String EXPRESSION_SGT_DETAIL = "./ns4:sgt";
+    public static final String EXPRESSION_SGT_NAME_ATTR = "./@name";
+    public static final String EXPRESSION_SGT_VALUE = "./value/text()";
+
+    private IseReplyUtil() {
+        throw new IllegalAccessError("util class - no instances supported");
+    }
+
+
+    public static String deliverResponse(final WebResource.Builder requestBuilder) {
+        return requestBuilder.get(ClientResponse.class).getEntity(String.class);
+    }
+
+    /**
+     * @return initiated xpath with ise namespace context injected
+     */
+    public static XPath setupXpath() {
+        final NamespaceContext nsContext = new NamespaceContext() {
+            public String getNamespaceURI(String prefix) {
+                final String outcome;
+                if (prefix == null) {
+                    throw new NullPointerException("Null prefix");
+                }
+
+                if ("ns5".equals(prefix)) {
+                    outcome = "ers.ise.cisco.com";
+                } else if ("ns3".equals(prefix)) {
+                    outcome = "v2.ers.ise.cisco.com";
+                } else if ("ns4".equals(prefix)) {
+                    outcome = "trustsec.ers.ise.cisco.com";
+                } else {
+                    outcome = XMLConstants.NULL_NS_URI;
+                }
+                return outcome;
+            }
+
+            // This method isn't necessary for XPath processing.
+            public String getPrefix(String uri) {
+                throw new UnsupportedOperationException();
+            }
+
+            // This method isn't necessary for XPath processing either.
+            public Iterator getPrefixes(String uri) {
+                throw new UnsupportedOperationException();
+            }
+        };
+
+        XPath xpath = XPathFactory.newInstance().newXPath();
+        xpath.setNamespaceContext(nsContext);
+        return xpath;
+    }
+
+    public static InputSource createInputSource(final String rawSgtDetail) {
+        return new InputSource(new StringReader(rawSgtDetail));
+    }
+}
index 5cd992417541bbb3196715b2a9d44abf30fedfb0..d9107eab19842557e9cbba3e9850b06b3dbdf26d 100644 (file)
@@ -9,22 +9,27 @@
 package org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.util;
 
 import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
 import com.sun.jersey.api.client.config.ClientConfig;
 import com.sun.jersey.api.client.config.DefaultClientConfig;
 import com.sun.jersey.client.urlconnection.HTTPSProperties;
 import java.security.GeneralSecurityException;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
+import java.util.List;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
 import org.apache.commons.net.util.TrustManagerUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.ConnectionConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.connection.config.Header;
 
 /**
  * Purpose: setup ise-ready jersey {@link Client}
  */
 public class RestClientFactory {
 
+    public static final String PATH_ERS_CONFIG_SGT = "/ers/config/sgt";
+
     private RestClientFactory() {
         throw new IllegalAccessError("factory class - no instances supported");
     }
@@ -58,4 +63,13 @@ public class RestClientFactory {
                 sslContext
         ));
     }
+
+    public static WebResource.Builder createRequestBuilder(final WebResource resource, final List<Header> headers,
+                                                           final String path) {
+        final WebResource webResource = resource.path(path);
+        final WebResource.Builder requestBuilder = webResource.getRequestBuilder();
+        headers.stream().forEach(
+                (header) -> requestBuilder.header(header.getName(), header.getValue()));
+        return requestBuilder;
+    }
 }
index 0d982338a3843f587ba99b035127ea413f6f9ee9..b094619db9418bf2e2f26a127ce58ab385b480d5 100644 (file)
@@ -1,4 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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
+  -->
+
 <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="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="gbpIseAdapter" class="org.opendaylight.controller.config.yang.config.groupbasedpolicy.gbp_ise_adapter.GbpIseAdapterProviderInstance"
         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 188e7eb64ad341e06bfb7f80430cef73a4cb10d2..de8d67d3962aa5d179ad3a76da8a3259ece81ce0 100644 (file)
@@ -13,6 +13,7 @@ module gbp-sxp-ise-adapter-cfg {
 
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
+    import sxp-ep-provider-cfg { prefix gbp-sxp-ep; revision-date 2016-07-22; }
 
     description
         "This module contains the base YANG definitions for
diff --git a/sxp-integration/sxp-ise-adapter/src/test/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderIseImplTest.java b/sxp-integration/sxp-ise-adapter/src/test/java/org/opendaylight/groupbasedpolicy/sxp_ise_adapter/impl/EPPolicyTemplateProviderIseImplTest.java
new file mode 100644 (file)
index 0000000..4d605b0
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * 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_ise_adapter.impl;
+
+import static org.powermock.api.support.membermodification.MemberMatcher.method;
+import static org.powermock.api.support.membermodification.MemberModifier.stub;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+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.groupbasedpolicy.sxp_ise_adapter.impl.util.IseReplyUtil;
+import org.opendaylight.groupbasedpolicy.sxp_ise_adapter.impl.util.RestClientFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
+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.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.ConnectionConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.ConnectionConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.ise.source.config.connection.config.HeaderBuilder;
+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.sxp.database.rev160308.Sgt;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+/**
+ * Test for {@link EPPolicyTemplateProviderIseImpl}.
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({IseReplyUtil.class, RestClientFactory.class})
+public class EPPolicyTemplateProviderIseImplTest {
+
+    private static final Sgt SGT = new Sgt(42);
+    private static final Sgt SGT_LOW = new Sgt(1);
+    private static final Sgt SGT_HI = new Sgt(100);
+    private static final TenantId TENANT_ID = new TenantId("tenant-01");
+
+    @Mock
+    private XPath xpathWalker;
+    @Mock
+    private Client iseClient;
+    @Mock
+    private WebResource.Builder wrBuilder;
+
+    private EPPolicyTemplateProviderIseImpl templateProvider;
+
+    @Before
+    public void setUp() throws Exception {
+        templateProvider = new EPPolicyTemplateProviderIseImpl();
+    }
+
+    @Test
+    public void testProvideTemplate_noConfig() throws Exception {
+        final Optional<EndpointPolicyTemplateBySgt> endpointPolicyTemplateBySgt = templateProvider.provideTemplate(SGT);
+        Assert.assertFalse(endpointPolicyTemplateBySgt.isPresent());
+    }
+
+    @Test
+    public void testProvideTemplate_config() throws Exception {
+        final ConnectionConfig connectionConfig = new ConnectionConfigBuilder()
+                .setIseRestUrl(new Uri("http://example.org"))
+                .setConnectionTimeout(10)
+                .setReadTimeout(10)
+                .setHeader(Collections.singletonList(new HeaderBuilder()
+                        .setName("headerName")
+                        .setValue("headerValue")
+                        .build()))
+                .build();
+        final IseSourceConfig sourceConfig = new IseSourceConfigBuilder()
+                .setTenant(TENANT_ID)
+                .setConnectionConfig(connectionConfig)
+                .setSgtRangeMin(SGT_LOW)
+                .setSgtRangeMax(SGT_HI)
+                .build();
+
+        final String rawResponse = "";
+        stub(method(IseReplyUtil.class, "deliverResponse")).toReturn(rawResponse);
+        stub(method(IseReplyUtil.class, "setupXpath")).toReturn(xpathWalker);
+        stub(method(RestClientFactory.class, "createIseClient", ConnectionConfig.class)).toReturn(iseClient);
+        stub(method(RestClientFactory.class, "createRequestBuilder", WebResource.class, List.class, String.class)).toReturn(wrBuilder);
+
+
+        final String epgName = "name-for-sgt42";
+        final Node sgtNameNode = Mockito.mock(Node.class);
+        Mockito.when(sgtNameNode.getNodeValue()).thenReturn(epgName);
+        Mockito.when(xpathWalker.evaluate(Matchers.same(IseReplyUtil.EXPRESSION_SGT_NAME_ATTR),
+                Matchers.<InputSource>any(), Matchers.same(XPathConstants.NODE)))
+                .thenReturn(sgtNameNode);
+
+        templateProvider.assignIseSourceConfig(sourceConfig);
+        final Optional<EndpointPolicyTemplateBySgt> templateWrap = templateProvider.provideTemplate(SGT);
+
+        Assert.assertTrue(templateWrap.isPresent());
+        final EndpointPolicyTemplateBySgt template = templateWrap.get();
+        Assert.assertEquals(SGT, template.getSgt());
+        Assert.assertNull(template.getConditions());
+        Assert.assertEquals(TENANT_ID, template.getTenant());
+        Assert.assertEquals(1, template.getEndpointGroups().size());
+        Assert.assertEquals(epgName, template.getEndpointGroups().get(0).getValue());
+        Assert.assertEquals(TemplateGenerated.class, template.getOrigin());
+    }
+}
\ No newline at end of file
index a7febc9b649c12a46228adbfd6cfcc3eaf8dd37e..c4c79d24825e91da67a1dabd842168f794284947 100644 (file)
@@ -20,6 +20,8 @@ import org.mockito.Mockito;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProviderRegistry;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.spi.SxpEpProviderProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.gbp.sxp.ise.adapter.model.rev160630.gbp.sxp.ise.adapter.IseSourceConfig;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.powermock.core.classloader.annotations.PrepareForTest;
@@ -48,12 +50,20 @@ public class GbpIseAdapterProviderTest {
     private GbpIseSgtHarvesterImpl harvester;
     @Mock
     private GbpIseConfigListenerImpl listener;
+    @Mock
+    private SxpEpProviderProvider sxpEpProvider;
+    @Mock
+    private EPPolicyTemplateProviderRegistry templateProviderRegistry;
+    @Mock
+    private EPPolicyTemplateProviderIseImpl templateProvider;
 
     private GbpIseAdapterProvider provider;
 
     @Before
     public void setUp() throws Exception {
-        provider = new GbpIseAdapterProvider(dataBroker, broker);
+        Mockito.when(sxpEpProvider.getEPPolicyTemplateProviderRegistry())
+                .thenReturn(templateProviderRegistry);
+        provider = new GbpIseAdapterProvider(dataBroker, broker, sxpEpProvider);
         Mockito.verify(broker).registerProvider(provider);
     }
 
@@ -68,13 +78,15 @@ public class GbpIseAdapterProviderTest {
         whenNew(SgtToEPTemplateGeneratorImpl.class).withAnyArguments().thenReturn(generator2);
         whenNew(GbpIseSgtHarvesterImpl.class).withArguments(generator1, generator2).thenReturn(harvester);
         whenNew(GbpIseConfigListenerImpl.class).withAnyArguments().thenReturn(listener);
+        whenNew(EPPolicyTemplateProviderIseImpl.class).withNoArguments().thenReturn(templateProvider);
         provider.onSessionInitiated(providerContext);
 
+        Mockito.verify(templateProviderRegistry).registerTemplateProvider(templateProvider);
         // check if all expected object got constructed and wired
         verifyNew(SgtToEpgGeneratorImpl.class).withArguments(dataBroker);
         verifyNew(SgtToEPTemplateGeneratorImpl.class).withArguments(dataBroker);
         verifyNew(GbpIseSgtHarvesterImpl.class).withArguments(generator1, generator2);
-        verifyNew(GbpIseConfigListenerImpl.class).withArguments(dataBroker, harvester);
+        verifyNew(GbpIseConfigListenerImpl.class).withArguments(dataBroker, harvester, templateProvider);
 
         // close provider check
         provider.close();
index 9e0072be492bd18aac7807cca954823912b48082..444f011cc59e26b810e9df337dbdf5d5be4c7ba5 100644 (file)
@@ -45,12 +45,14 @@ public class GbpIseConfigListenerImplTest {
     private WriteTransaction wTx;
     @Mock
     private IseSourceConfig config;
+    @Mock
+    private EPPolicyTemplateProviderFacade templateProviderFacade;
 
     private GbpIseConfigListenerImpl listener;
 
     @Before
     public void setUp() throws Exception {
-        listener = new GbpIseConfigListenerImpl(dataBroker, harvester);
+        listener = new GbpIseConfigListenerImpl(dataBroker, harvester, templateProviderFacade);
     }
 
     @Test