Remove NatUtil::read()
[netvirt.git] / vpnservice / natservice / natservice-impl / src / main / java / org / opendaylight / netvirt / natservice / internal / RouterPortsListener.java
index d712857a4716e95b02d8dbd4ed20b4a90c27436e..a69d542ffa5541fd3690444344c3092c2fb232d3 100644 (file)
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import org.opendaylight.genius.mdsalutil.AbstractDataChangeListener;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import com.google.common.base.Optional;
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPorts;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPortsKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.PortsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.PortsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.Routermapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.router.to.vpn.mapping.RoutermappingKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
+@Singleton
+public class RouterPortsListener
+    extends AsyncDataTreeChangeListenerBase<RouterPorts, RouterPortsListener>
+    implements AutoCloseable {
 
-public class RouterPortsListener extends AbstractDataChangeListener<RouterPorts> implements AutoCloseable{
     private static final Logger LOG = LoggerFactory.getLogger(RouterPortsListener.class);
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private final DataBroker broker;
-
+    private final DataBroker dataBroker;
 
-    public RouterPortsListener (final DataBroker db) {
-        super(RouterPorts.class);
-        broker = db;
-        registerListener(db);
+    @Inject
+    public RouterPortsListener(final DataBroker dataBroker) {
+        super(RouterPorts.class, RouterPortsListener.class);
+        this.dataBroker = dataBroker;
     }
 
     @Override
-    public void close() throws Exception {
-        if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up DataChangeListener.", e);
-            }
-            listenerRegistration = null;
-        }
-        LOG.info("Router ports Listener Closed");
+    @PostConstruct
+    public void init() {
+        LOG.info("{} init", getClass().getSimpleName());
+        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
-    private void registerListener(final DataBroker db) {
-        try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                    getWildCardPath(), RouterPortsListener.this, AsyncDataBroker.DataChangeScope.SUBTREE);
-        } catch (final Exception e) {
-            LOG.error("RouterPorts DataChange listener registration fail!", e);
-            throw new IllegalStateException("RouterPorts Listener registration Listener failed.", e);
-        }
-    }
-
-    private InstanceIdentifier<RouterPorts> getWildCardPath() {
+    @Override
+    protected InstanceIdentifier<RouterPorts> getWildCardPath() {
         return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
     }
 
+    @Override
+    protected RouterPortsListener getDataTreeChangeListener() {
+        return RouterPortsListener.this;
+    }
 
     @Override
     protected void add(final InstanceIdentifier<RouterPorts> identifier, final RouterPorts routerPorts) {
-        LOG.trace("Add router ports method - key: " + identifier + ", value=" + routerPorts );
-        Optional<RouterPorts> optRouterPorts = NatUtil.read(broker, LogicalDatastoreType.OPERATIONAL, identifier);
-        if(optRouterPorts.isPresent()) {
+        LOG.trace("Add router ports method - key: " + identifier + ", value=" + routerPorts);
+        Optional<RouterPorts> optRouterPorts =
+                SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
+                        LogicalDatastoreType.OPERATIONAL, identifier);
+        if (optRouterPorts.isPresent()) {
             RouterPorts ports = optRouterPorts.get();
             String routerName = ports.getRouterId();
-            MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, 
+            MDSALUtil.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier,
                 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
                     .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
         } else {
             String routerName = routerPorts.getRouterId();
-            MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, identifier, 
+            MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier,
                 new RouterPortsBuilder().setKey(new RouterPortsKey(routerName)).setRouterId(routerName)
-                        .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
+                    .setExternalNetworkId(routerPorts.getExternalNetworkId()).build());
         }
         //Check if the router is associated with any BGP VPN and update the association
         String routerName = routerPorts.getRouterId();
-        Uuid vpnName = NatUtil.getVpnForRouter(broker, routerName);
-        if(vpnName != null) {
+        Uuid vpnName = NatUtil.getVpnForRouter(dataBroker, routerName);
+        if (vpnName != null) {
             InstanceIdentifier<Routermapping> routerMappingId = NatUtil.getRouterVpnMappingId(routerName);
-            Optional<Routermapping> optRouterMapping = NatUtil.read(broker, LogicalDatastoreType.OPERATIONAL, routerMappingId);
-            if(!optRouterMapping.isPresent()){
-                Long vpnId = NatUtil.getVpnId(broker, vpnName.getValue());
+            Optional<Routermapping> optRouterMapping =
+                    SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
+                            LogicalDatastoreType.OPERATIONAL, routerMappingId);
+            if (!optRouterMapping.isPresent()) {
+                Long vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
                 LOG.debug("Updating router {} to VPN {} association with Id {}", routerName, vpnName, vpnId);
                 Routermapping routerMapping = new RoutermappingBuilder().setKey(new RoutermappingKey(routerName))
-                                                 .setRouterName(routerName).setVpnName(vpnName.getValue()).setVpnId(vpnId).build();
-                MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, routerMappingId, routerMapping);
+                    .setRouterName(routerName).setVpnName(vpnName.getValue()).setVpnId(vpnId).build();
+                MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, routerMappingId, routerMapping);
             }
         }
     }
 
     @Override
     protected void remove(InstanceIdentifier<RouterPorts> identifier, RouterPorts routerPorts) {
-        LOG.trace("Remove router ports method - key: " + identifier + ", value=" + routerPorts );
-        //MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, identifier);
+        LOG.trace("Remove router ports method - key: " + identifier + ", value=" + routerPorts);
+        //MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
         //Remove the router to vpn association mapping entry if at all present
-        MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, NatUtil.getRouterVpnMappingId(routerPorts.getRouterId()));
+        String routerName = routerPorts.getRouterId();
+        Uuid vpnName = NatUtil.getVpnForRouter(dataBroker, routerName);
+        if (vpnName != null) {
+            MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                NatUtil.getRouterVpnMappingId(routerName));
+        }
     }
 
     @Override
     protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
-        LOG.trace("Update router ports method - key: " + identifier + ", original=" + original + ", update=" + update );
+        LOG.trace("Update router ports method - key: " + identifier + ", original=" + original + ", update=" + update);
     }
 }