Upgrade ietf-{inet,yang}-types to 2013-07-15
[groupbasedpolicy.git] / sxp-mapper / src / main / java / org / opendaylight / groupbasedpolicy / sxp / mapper / impl / listen / MasterDatabaseBindingListenerImpl.java
index abb8cf9fc0a77b73d6117fb36799248b9d9d96b1..621721115349c33b730a527618db2fadb8328adc 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.groupbasedpolicy.sxp.mapper.impl.listen;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collection;
@@ -19,22 +20,28 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.groupbasedpolicy.sxp.mapper.api.DSDaoAsync;
-import org.opendaylight.groupbasedpolicy.sxp.mapper.api.DSDaoCached;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.api.DSAsyncDao;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.MasterDatabaseBindingListener;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SimpleCachedDao;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SxpMapperReactor;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.EPTemplateUtil;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.L3EPServiceUtil;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.SxpListenerUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointForwardingTemplateBySubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.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.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.databases.fields.MasterDatabase;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,19 +52,25 @@ public class MasterDatabaseBindingListenerImpl implements MasterDatabaseBindingL
 
     private static final Logger LOG = LoggerFactory.getLogger(MasterDatabaseBindingListenerImpl.class);
 
+    private static final FutureCallback<RpcResult<Void>> RPC_POLICY_RESULT_FUTURE_CALLBACK =
+            L3EPServiceUtil.createFailureLoggingCallback("failed to read epPolicyTemplate");
+
+    public static final FutureCallback<RpcResult<Void>> RPC_FW_RESULT_FUTURE_CALLBACK =
+            L3EPServiceUtil.createFailureLoggingCallback("failed to read epForwardingTemplate");
+
     private final SxpMapperReactor sxpMapperReactor;
-    private final DSDaoCached<Sgt, MasterDatabaseBinding> masterDBBindingDaoCached;
-    private final DSDaoAsync<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateDao;
-    private final DSDaoAsync<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateDao;
+    private final SimpleCachedDao<IpPrefix, MasterDatabaseBinding> masterDBBindingDaoCached;
+    private final DSAsyncDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateDao;
+    private final DSAsyncDao<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateDao;
 
     private final ListenerRegistration<? extends DataTreeChangeListener> listenerRegistration;
     private final InstanceIdentifier<MasterDatabaseBinding> sxpDbPath;
 
     public MasterDatabaseBindingListenerImpl(final DataBroker dataBroker,
                                              final SxpMapperReactor sxpMapperReactor,
-                                             final DSDaoCached<Sgt, MasterDatabaseBinding> masterDBBindingDaoCached,
-                                             final DSDaoAsync<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateDao,
-                                             final DSDaoAsync<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateDao) {
+                                             final SimpleCachedDao<IpPrefix, MasterDatabaseBinding> masterDBBindingDaoCached,
+                                             final DSAsyncDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateDao,
+                                             final DSAsyncDao<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateDao) {
         this.sxpMapperReactor = Preconditions.checkNotNull(sxpMapperReactor);
         this.masterDBBindingDaoCached = Preconditions.checkNotNull(masterDBBindingDaoCached);
         this.epPolicyTemplateDao = Preconditions.checkNotNull(epPolicyTemplateDao);
@@ -65,6 +78,8 @@ public class MasterDatabaseBindingListenerImpl implements MasterDatabaseBindingL
         sxpDbPath = MasterDatabaseBindingListener.SXP_TOPOLOGY_PATH
                 .child(Node.class)
                 .augmentation(SxpNodeIdentity.class)
+                .child(SxpDomains.class)
+                .child(SxpDomain.class)
                 .child(MasterDatabase.class)
                 .child(MasterDatabaseBinding.class);
 
@@ -82,53 +97,65 @@ public class MasterDatabaseBindingListenerImpl implements MasterDatabaseBindingL
             final MasterDatabaseBinding sxpMasterDBItem = change.getRootNode().getDataAfter();
             if (sxpMasterDBItem == null) {
                 //TODO: cover sgt-ip mapping removal
+                LOG.debug("ip-sgt mapping was removed - NOOP: {}",
+                        change.getRootPath().getRootIdentifier().firstKeyOf(MasterDatabaseBinding.class));
             } else {
-                final Sgt sgtKey = sxpMasterDBItem.getSecurityGroupTag();
                 final IpPrefix ipPrefixKey = sxpMasterDBItem.getIpPrefix();
-                SxpListenerUtil.updateCachedDao(masterDBBindingDaoCached, sgtKey, change);
-
-                processWithEPPolicyTemplate(sgtKey, sxpMasterDBItem);
-                processWithEPForwardingTemplate(ipPrefixKey, sxpMasterDBItem);
+                SxpListenerUtil.updateCachedDao(masterDBBindingDaoCached, ipPrefixKey, change);
+                processWithEPTemplates(sxpMasterDBItem);
             }
         }
     }
 
-    private void processWithEPForwardingTemplate(final IpPrefix changeKey, final MasterDatabaseBinding sxpMasterDBItem) {
+    private void processWithEPTemplates(final MasterDatabaseBinding sxpMasterDBItem) {
+        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> epPolicyTemplateFuture =
+                epPolicyTemplateDao.read(sxpMasterDBItem.getSecurityGroupTag());
+
         final ListenableFuture<Optional<EndpointForwardingTemplateBySubnet>> epForwardingTemplateFuture =
-                epForwardingTemplateDao.read(changeKey);
-
-        final ListenableFuture<RpcResult<Void>> rpcResult = Futures.transform(epForwardingTemplateFuture, new AsyncFunction<Optional<EndpointForwardingTemplateBySubnet>, RpcResult<Void>>() {
-            @Override
-            public ListenableFuture<RpcResult<Void>> apply(final Optional<EndpointForwardingTemplateBySubnet> input) throws Exception {
-                if (input == null || !input.isPresent()) {
-                    LOG.debug("no epForwardingTemplate available for ipPrefix: {}", changeKey);
-                    throw new IllegalArgumentException("no epForwardingTemplate available");
-                } else {
-                    // TODO: invoke reactor
-                    return null;
-                }
-            }
-        });
-    }
+                epForwardingTemplateDao.read(sxpMasterDBItem.getIpPrefix());
 
-    private void processWithEPPolicyTemplate(final Sgt changeKey, final MasterDatabaseBinding sxpMasterDBItem) {
-        final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> epPolicyTemplateFuture =
-                epPolicyTemplateDao.read(changeKey);
-
-        final ListenableFuture<RpcResult<Void>> rpcResult = Futures.transform(epPolicyTemplateFuture, new AsyncFunction<Optional<EndpointPolicyTemplateBySgt>, RpcResult<Void>>() {
-            @Override
-            public ListenableFuture<RpcResult<Void>> apply(final Optional<EndpointPolicyTemplateBySgt> input) throws Exception {
-                if (input == null || !input.isPresent()) {
-                    LOG.debug("no epPolicyTemplate available for sgt: {}", changeKey);
-                    throw new IllegalArgumentException("no epPolicyTemplate available");
-                } else {
-                    LOG.trace("processing sxpMasterDB event and epPolicyTemplate for sgt: {}", changeKey);
-                    // TODO: invoke reactor
-                    return null;
+        final ListenableFuture<EPTemplateUtil.OptionalMutablePair<EndpointPolicyTemplateBySgt, EndpointForwardingTemplateBySubnet>> compositeRead
+                = EPTemplateUtil.compositeRead(epPolicyTemplateFuture, epForwardingTemplateFuture);
+
+        final ListenableFuture<RpcResult<Void>> rpcResult = Futures.transform(compositeRead,
+                new AsyncFunction<EPTemplateUtil.OptionalMutablePair<EndpointPolicyTemplateBySgt, EndpointForwardingTemplateBySubnet>, RpcResult<Void>>() {
+                    @Override
+                    public ListenableFuture<RpcResult<Void>> apply(final EPTemplateUtil.OptionalMutablePair<EndpointPolicyTemplateBySgt, EndpointForwardingTemplateBySubnet> input) throws Exception {
+                        final ListenableFuture<RpcResult<Void>> result;
+                        if (input == null) {
+                            LOG.debug("no ep*Templates available for sgt/ip-prefix: {}/{}",
+                                    sxpMasterDBItem.getSecurityGroupTag(),
+                                    sxpMasterDBItem.getIpPrefix());
+                            result = RpcResultBuilder.<Void>failed()
+                                    .withError(RpcError.ErrorType.APPLICATION,
+                                            "no ep-templates available for" + sxpMasterDBItem)
+                                    .buildFuture();
+
+                        } else if (!input.getLeft().isPresent()) {
+                            LOG.debug("no epPolicyTemplate available for sgt: {}", sxpMasterDBItem.getSecurityGroupTag());
+                            result = RpcResultBuilder.<Void>failed()
+                                    .withError(RpcError.ErrorType.APPLICATION,
+                                            "no epPolicyTemplate available for " + sxpMasterDBItem)
+                                    .buildFuture();
+                        } else if (!input.getRight().isPresent()) {
+                            LOG.debug("no epForwardingTemplate available for ip-prefix: {}",
+                                    sxpMasterDBItem.getIpPrefix());
+                            result = RpcResultBuilder.<Void>failed()
+                                    .withError(RpcError.ErrorType.APPLICATION,
+                                            "no epForwardingTemplate available for " + sxpMasterDBItem)
+                                    .buildFuture();
+                        } else {
+                            LOG.trace("processing sxpMasterDB event and epPolicyTemplate for sgt/ip-prefix: {}/{}",
+                                    sxpMasterDBItem.getSecurityGroupTag(),
+                                    sxpMasterDBItem.getIpPrefix());
+                            result = sxpMapperReactor.processTemplatesAndSxpMasterDB(input.getLeft().get(),
+                                    input.getRight().get(), sxpMasterDBItem);
                 }
+                return result;
             }
         });
 
+        Futures.addCallback(rpcResult, RPC_POLICY_RESULT_FUTURE_CALLBACK);
     }
 
     @Override