BUG-6650: ep-ip/sgt, propose sxp-generator
[groupbasedpolicy.git] / sxp-integration / sxp-ep-provider / src / main / java / org / opendaylight / groupbasedpolicy / sxp / ep / provider / impl / dao / EPPolicyTemplateDaoFacadeImpl.java
index e23064c6797ad67013ed358263bbfce35e1d2985..fa3f457c11d0632605b67eb1188db8e6586e865c 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.util.concurrent.AsyncFunction;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collection;
+import java.util.Collections;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -21,6 +22,8 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateDaoFacade;
 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SgtGeneratorImpl;
+import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SimpleCachedDao;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
@@ -28,7 +31,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.SxpEpMapper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgtBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgtKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -43,13 +48,19 @@ public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade
     private static final Logger LOG = LoggerFactory.getLogger(EPPolicyTemplateDaoFacadeImpl.class);
 
     private final EPPolicyTemplateDaoImpl epPolicyTemplateDao;
+    private final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao;
+    private final SgtGeneratorImpl sgtGenerator;
     private final DataBroker dataBroker;
 
     private EPPolicyTemplateProvider templateProvider;
 
-    public EPPolicyTemplateDaoFacadeImpl(final DataBroker dataBroker, final EPPolicyTemplateDaoImpl epPolicyTemplateDao) {
+    public EPPolicyTemplateDaoFacadeImpl(final DataBroker dataBroker, final EPPolicyTemplateDaoImpl epPolicyTemplateDao,
+                                         final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao,
+                                         final SgtGeneratorImpl sgtGenerator) {
         this.dataBroker = dataBroker;
         this.epPolicyTemplateDao = epPolicyTemplateDao;
+        this.epPolicyTemplateCachedDao = epPolicyTemplateCachedDao;
+        this.sgtGenerator = sgtGenerator;
     }
 
     @Override
@@ -106,10 +117,10 @@ public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade
                 .child(EndpointPolicyTemplateBySgt.class, new EndpointPolicyTemplateBySgtKey(sgtValue));
         wTx.put(LogicalDatastoreType.CONFIGURATION, epPolicyTemplatePath, template, true);
 
-        return Futures.transform(wTx.submit(), createStoreOutcomeHandler(template));
+        return Futures.transform(wTx.submit(), createStoreOutcomeHandlerToOptional(template));
     }
 
-    private Function<Void, Optional<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandler(final EndpointPolicyTemplateBySgt template) {
+    private Function<Void, Optional<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandlerToOptional(final EndpointPolicyTemplateBySgt template) {
         return new Function<Void, Optional<EndpointPolicyTemplateBySgt>>() {
             @Nullable
             @Override
@@ -119,8 +130,55 @@ public class EPPolicyTemplateDaoFacadeImpl implements EPPolicyTemplateDaoFacade
         };
     }
 
+    private Function<Void, Collection<EndpointPolicyTemplateBySgt>> createStoreOutcomeHandlerToCollection(final EndpointPolicyTemplateBySgt template) {
+        return new Function<Void, Collection<EndpointPolicyTemplateBySgt>>() {
+            @Nullable
+            @Override
+            public Collection<EndpointPolicyTemplateBySgt> apply(@Nullable final Void aVoid) {
+                return Collections.singletonList(template);
+            }
+        };
+    }
+
     @Override
-    public Collection<EndpointPolicyTemplateBySgt> readBy(@Nonnull final EpPolicyTemplateValueKey specialKey) {
-        return epPolicyTemplateDao.readBy(specialKey);
+    public ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> readBy(@Nonnull final EpPolicyTemplateValueKey templateLookupKey) {
+        //TODO: expose to ios-xe renderer,
+        final Collection<EndpointPolicyTemplateBySgt> templatesFromDao = epPolicyTemplateDao.readBy(templateLookupKey);
+        final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> result;
+        if (!templatesFromDao.isEmpty()) {
+            result = Futures.immediateFuture(templatesFromDao);
+        } else {
+            // generate
+            result = sgtGenerator.generateNextSgt(epPolicyTemplateCachedDao)
+                    // build ep-policy-template
+                    .map(sgt -> buildEpPolicyTemplate(templateLookupKey, sgt))
+                    // store the template
+                    .map(this::storeTemplate)
+                    .orElse(Futures.immediateFuture(Collections.emptyList()));
+        }
+        return result;
+    }
+
+    private ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> storeTemplate(final EndpointPolicyTemplateBySgt template) {
+        final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
+        // store ep-policy-template
+        final Sgt sgt = template.getSgt();
+        LOG.trace("storing generated epPolicyTemplate: {}", sgt.getValue());
+        final InstanceIdentifier<EndpointPolicyTemplateBySgt> epPolicyTemplatePath = InstanceIdentifier
+                .create(SxpEpMapper.class)
+                .child(EndpointPolicyTemplateBySgt.class, new EndpointPolicyTemplateBySgtKey(sgt));
+        wTx.put(LogicalDatastoreType.CONFIGURATION, epPolicyTemplatePath, template, true);
+
+        return Futures.transform(wTx.submit(), createStoreOutcomeHandlerToCollection(template));
+    }
+
+    private EndpointPolicyTemplateBySgt buildEpPolicyTemplate(final EpPolicyTemplateValueKey templateLookupKey, final Sgt sgt) {
+        return new EndpointPolicyTemplateBySgtBuilder()
+                .setOrigin(TemplateGenerated.class)
+                .setTenant(templateLookupKey.getTenantId())
+                .setSgt(sgt)
+                .setEndpointGroups(templateLookupKey.getEpgId())
+                .setConditions(templateLookupKey.getConditionName())
+                .build();
     }
 }