propagate datastore exceptions all the way to northbound
[neutron.git] / transcriber / src / main / java / org / opendaylight / neutron / transcriber / NeutronLoadBalancerPoolInterface.java
index 8128692edb4463ff2b65bfeecffc1cb90270fe98..1f1ee0608ab0d42a15b29158742cd30337096ac5 100644 (file)
@@ -5,7 +5,6 @@
  * 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.neutron.transcriber;
 
 import com.google.common.base.Optional;
@@ -15,7 +14,8 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.ExecutionException;
+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.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
@@ -23,10 +23,10 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
+import org.opendaylight.neutron.spi.NeutronID;
 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
-import org.opendaylight.neutron.spi.NeutronLoadBalancer_SessionPersistence;
-import org.opendaylight.neutron.spi.Neutron_ID;
+import org.opendaylight.neutron.spi.NeutronLoadBalancerSessionPersistence;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 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.neutron.constants.rev150712.ProtocolBase;
@@ -37,26 +37,35 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.Pools;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.Pool;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.PoolBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.PoolKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.pool.Members;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.pool.members.Member;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.lbaas.attributes.pools.pool.members.MemberBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.lbaasv2.rev150712.pool.attributes.SessionPersistenceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.OperationFailedException;
+import org.ops4j.pax.cdi.api.OsgiServiceProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<Pool, Pools, NeutronLoadBalancerPool>
+@Singleton
+@OsgiServiceProvider(classes = INeutronLoadBalancerPoolCRUD.class)
+public final class NeutronLoadBalancerPoolInterface
+        extends AbstractNeutronInterface<Pool, Pools, PoolKey, NeutronLoadBalancerPool>
         implements INeutronLoadBalancerPoolCRUD {
-    private static final Logger LOGGER = LoggerFactory.getLogger(NeutronLoadBalancerPoolInterface.class);
+
+    private static final Logger LOG = LoggerFactory.getLogger(NeutronLoadBalancerPoolInterface.class);
 
     private static final ImmutableBiMap<Class<? extends ProtocolBase>,
             String> PROTOCOL_MAP = new ImmutableBiMap.Builder<Class<? extends ProtocolBase>, String>()
                     .put(ProtocolHttp.class, "HTTP").put(ProtocolHttps.class, "HTTPS").put(ProtocolTcp.class, "TCP")
                     .put(ProtocolTerminatedHttps.class, "TERMINATED_HTTPS").build();
 
-    NeutronLoadBalancerPoolInterface(DataBroker db) {
-        super(db);
+    @Inject
+    public NeutronLoadBalancerPoolInterface(DataBroker db) {
+        super(PoolBuilder.class, db);
     }
 
     @Override
@@ -64,117 +73,83 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         return pools.getPool();
     }
 
-    @Override
-    protected InstanceIdentifier<Pool> createInstanceIdentifier(Pool pool) {
-        return InstanceIdentifier.create(Neutron.class).child(Pools.class).child(Pool.class, pool.getKey());
-    }
-
-    @Override
-    protected InstanceIdentifier<Pools> createInstanceIdentifier() {
-        return InstanceIdentifier.create(Neutron.class).child(Pools.class);
-    }
-
     @Override
     protected Pool toMd(NeutronLoadBalancerPool pool) {
         final PoolBuilder poolBuilder = new PoolBuilder();
+        toMdBaseAttributes(pool, poolBuilder);
         poolBuilder.setAdminStateUp(pool.getLoadBalancerPoolAdminIsStateIsUp());
-        if (pool.getNeutronLoadBalancerPoolHealthMonitorID() != null) {
-            poolBuilder.setHealthmonitorId(toUuid(pool.getNeutronLoadBalancerPoolHealthMonitorID()));
+        if (pool.getLoadBalancerPoolHealthMonitorID() != null) {
+            poolBuilder.setHealthmonitorId(toUuid(pool.getLoadBalancerPoolHealthMonitorID()));
         }
         if (pool.getLoadBalancerPoolLbAlgorithm() != null) {
             poolBuilder.setLbAlgorithm(pool.getLoadBalancerPoolLbAlgorithm());
         }
         if (pool.getLoadBalancerPoolListeners() != null) {
-            final List<Uuid> listListener = new ArrayList<Uuid>();
-            for (final Neutron_ID neutron_id : pool.getLoadBalancerPoolListeners()) {
-                listListener.add(toUuid(neutron_id.getID()));
+            final List<Uuid> listListener = new ArrayList<>();
+            for (final NeutronID neutronId : pool.getLoadBalancerPoolListeners()) {
+                listListener.add(toUuid(neutronId.getID()));
             }
             poolBuilder.setListeners(listListener);
         }
         // because members are another container, we don't want to copy
         // it over, so just skip it here
-        if (pool.getLoadBalancerPoolName() != null) {
-            poolBuilder.setName(pool.getLoadBalancerPoolName());
-        }
         if (pool.getLoadBalancerPoolProtocol() != null) {
             final ImmutableBiMap<String, Class<? extends ProtocolBase>> mapper = PROTOCOL_MAP.inverse();
-            poolBuilder.setProtocol((Class<? extends ProtocolBase>) mapper.get(pool.getLoadBalancerPoolProtocol()));
+            poolBuilder.setProtocol(mapper.get(pool.getLoadBalancerPoolProtocol()));
         }
         if (pool.getLoadBalancerPoolSessionPersistence() != null) {
-            final NeutronLoadBalancer_SessionPersistence sessionPersistence = pool
+            final NeutronLoadBalancerSessionPersistence sessionPersistence = pool
                     .getLoadBalancerPoolSessionPersistence();
             final SessionPersistenceBuilder sessionPersistenceBuilder = new SessionPersistenceBuilder();
             sessionPersistenceBuilder.setCookieName(sessionPersistence.getCookieName());
             sessionPersistenceBuilder.setType(sessionPersistence.getType());
             poolBuilder.setSessionPersistence(sessionPersistenceBuilder.build());
         }
-        if (pool.getTenantID() != null) {
-            poolBuilder.setTenantId(toUuid(pool.getTenantID()));
-        }
-        if (pool.getID() != null) {
-            poolBuilder.setUuid(toUuid(pool.getID()));
-        } else {
-            LOGGER.warn("Attempting to write neutron load balancer pool without UUID");
-        }
         return poolBuilder.build();
     }
 
     @Override
-    protected Pool toMd(String uuid) {
-        final PoolBuilder poolBuilder = new PoolBuilder();
-        poolBuilder.setUuid(toUuid(uuid));
-        return poolBuilder.build();
-    }
-
     protected NeutronLoadBalancerPool fromMd(Pool pool) {
         final NeutronLoadBalancerPool answer = new NeutronLoadBalancerPool();
+        fromMdBaseAttributes(pool, answer);
         if (pool.isAdminStateUp() != null) {
             answer.setLoadBalancerPoolAdminStateIsUp(pool.isAdminStateUp());
         }
         if (pool.getHealthmonitorId() != null) {
-            answer.setNeutronLoadBalancerPoolHealthMonitorID(pool.getHealthmonitorId().getValue());
+            answer.setLoadBalancerPoolHealthMonitorID(pool.getHealthmonitorId().getValue());
         }
         if (pool.getLbAlgorithm() != null) {
             answer.setLoadBalancerPoolLbAlgorithm(pool.getLbAlgorithm());
         }
         if (pool.getListeners() != null) {
-            final List<Neutron_ID> ids = new ArrayList<Neutron_ID>();
+            final List<NeutronID> ids = new ArrayList<>();
             for (final Uuid id : pool.getListeners()) {
-                ids.add(new Neutron_ID(id.getValue()));
+                ids.add(new NeutronID(id.getValue()));
             }
             answer.setLoadBalancerPoolListeners(ids);
         }
         if (pool.getMembers() != null) {
-            final List<NeutronLoadBalancerPoolMember> members = new ArrayList<NeutronLoadBalancerPoolMember>();
+            final List<NeutronLoadBalancerPoolMember> members = new ArrayList<>();
             for (final Member member : pool.getMembers().getMember()) {
                 members.add(fromMemberMd(member));
             }
             answer.setLoadBalancerPoolMembers(members);
         }
-        if (pool.getName() != null) {
-            answer.setLoadBalancerPoolName(pool.getName());
-        }
         if (pool.getProtocol() != null) {
             answer.setLoadBalancerPoolProtocol(PROTOCOL_MAP.get(pool.getProtocol()));
         }
         if (pool.getSessionPersistence() != null) {
-            final NeutronLoadBalancer_SessionPersistence sessionPersistence =
-                    new NeutronLoadBalancer_SessionPersistence();
+            NeutronLoadBalancerSessionPersistence sessionPersistence = new NeutronLoadBalancerSessionPersistence();
             sessionPersistence.setCookieName(pool.getSessionPersistence().getCookieName());
             sessionPersistence.setType(pool.getSessionPersistence().getType());
 
             answer.setLoadBalancerSessionPersistence(sessionPersistence);
         }
-        if (pool.getTenantId() != null) {
-            answer.setTenantID(pool.getTenantId());
-        }
-        if (pool.getUuid() != null) {
-            answer.setID(pool.getUuid().getValue());
-        }
         return answer;
     }
 
-    public boolean neutronLoadBalancerPoolMemberExists(String poolUuid, String uuid) {
+    @Override
+    public boolean neutronLoadBalancerPoolMemberExists(String poolUuid, String uuid) throws ReadFailedException {
         final Member member = readMemberMd(createMemberInstanceIdentifier(toMd(poolUuid), toMemberMd(uuid)));
         if (member == null) {
             return false;
@@ -182,7 +157,9 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         return true;
     }
 
-    public NeutronLoadBalancerPoolMember getNeutronLoadBalancerPoolMember(String poolUuid, String uuid) {
+    @Override
+    public NeutronLoadBalancerPoolMember getNeutronLoadBalancerPoolMember(String poolUuid, String uuid)
+            throws ReadFailedException {
         final Member member = readMemberMd(createMemberInstanceIdentifier(toMd(poolUuid), toMemberMd(uuid)));
         if (member == null) {
             return null;
@@ -190,23 +167,26 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         return fromMemberMd(member);
     }
 
-    public List<NeutronLoadBalancerPoolMember> getAllNeutronLoadBalancerPoolMembers(String poolUuid) {
-        final Set<NeutronLoadBalancerPoolMember> allLoadBalancerPoolMembers = new HashSet<
-                NeutronLoadBalancerPoolMember>();
+    @Override
+    public List<NeutronLoadBalancerPoolMember> getAllNeutronLoadBalancerPoolMembers(String poolUuid)
+            throws ReadFailedException {
+        final Set<NeutronLoadBalancerPoolMember> allLoadBalancerPoolMembers = new HashSet<>();
         final Members members = readMd(createMembersInstanceIdentifier(toMd(poolUuid)));
         if (members != null) {
             for (final Member member : members.getMember()) {
                 allLoadBalancerPoolMembers.add(fromMemberMd(member));
             }
         }
-        LOGGER.debug("Exiting getLoadBalancerPoolMembers, Found {} OpenStackLoadBalancerPoolMember",
+        LOG.debug("Exiting getLoadBalancerPoolMembers, Found {} OpenStackLoadBalancerPoolMember",
                 allLoadBalancerPoolMembers.size());
-        final List<NeutronLoadBalancerPoolMember> ans = new ArrayList<NeutronLoadBalancerPoolMember>();
+        final List<NeutronLoadBalancerPoolMember> ans = new ArrayList<>();
         ans.addAll(allLoadBalancerPoolMembers);
         return ans;
     }
 
-    public boolean addNeutronLoadBalancerPoolMember(String poolUuid, NeutronLoadBalancerPoolMember input) {
+    @Override
+    public boolean addNeutronLoadBalancerPoolMember(String poolUuid, NeutronLoadBalancerPoolMember input)
+            throws OperationFailedException {
         if (neutronLoadBalancerPoolMemberExists(poolUuid, input.getID())) {
             return false;
         }
@@ -214,15 +194,18 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         return true;
     }
 
-    public boolean removeNeutronLoadBalancerPoolMember(String poolUuid, String uuid) {
+    @Override
+    public boolean removeNeutronLoadBalancerPoolMember(String poolUuid, String uuid) throws OperationFailedException {
         if (!neutronLoadBalancerPoolMemberExists(poolUuid, uuid)) {
             return false;
         }
-        return removeMemberMd(toMd(poolUuid), toMemberMd(uuid));
+        removeMemberMd(toMd(poolUuid), toMemberMd(uuid));
+        return true;
     }
 
+    @Override
     public boolean updateNeutronLoadBalancerPoolMember(String poolUuid, String uuid,
-            NeutronLoadBalancerPoolMember delta) {
+            NeutronLoadBalancerPoolMember delta) throws OperationFailedException {
         if (!neutronLoadBalancerPoolMemberExists(poolUuid, uuid)) {
             return false;
         }
@@ -230,22 +213,25 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         return true;
     }
 
-    public boolean neutronLoadBalancerPoolMemberInUse(String poolUuid, String loadBalancerPoolMemberID) {
+    @Override
+    public boolean neutronLoadBalancerPoolMemberInUse(String poolUuid, String loadBalancerPoolMemberID)
+            throws ReadFailedException {
         return !neutronLoadBalancerPoolMemberExists(poolUuid, loadBalancerPoolMemberID);
     }
 
     protected InstanceIdentifier<Member> createMemberInstanceIdentifier(Pool pool, Member item) {
-        return InstanceIdentifier.create(Neutron.class).child(Pools.class).child(Pool.class, pool.getKey())
-                .child(Members.class).child(Member.class, item.getKey());
+        return InstanceIdentifier.create(Neutron.class).child(Pools.class).child(Pool.class, pool.key())
+                .child(Members.class).child(Member.class, item.key());
     }
 
     protected InstanceIdentifier<Members> createMembersInstanceIdentifier(Pool pool) {
-        return InstanceIdentifier.create(Neutron.class).child(Pools.class).child(Pool.class, pool.getKey())
+        return InstanceIdentifier.create(Neutron.class).child(Pools.class).child(Pool.class, pool.key())
                 .child(Members.class);
     }
 
-    static NeutronLoadBalancerPoolMember fromMemberMd(Member member) {
+    protected NeutronLoadBalancerPoolMember fromMemberMd(Member member) {
         final NeutronLoadBalancerPoolMember answer = new NeutronLoadBalancerPoolMember();
+        fromMdIds(member, answer);
         if (member.isAdminStateUp() != null) {
             answer.setPoolMemberAdminStateIsUp(member.isAdminStateUp());
         }
@@ -255,16 +241,9 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         if (member.getProtocolPort() != null) {
             answer.setPoolMemberProtoPort(member.getProtocolPort());
         }
-        if (member.getUuid() != null) {
-            answer.setID(member.getUuid().getValue());
-            answer.setPoolID(member.getUuid().getValue());
-        }
         if (member.getSubnetId() != null) {
             answer.setPoolMemberSubnetID(member.getSubnetId().getValue());
         }
-        if (member.getTenantId() != null) {
-            answer.setTenantID(member.getTenantId());
-        }
         if (member.getWeight() != null) {
             answer.setPoolMemberWeight(member.getWeight());
         }
@@ -272,7 +251,7 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
     }
 
     protected Member toMemberMd(NeutronLoadBalancerPoolMember member) {
-        final MemberBuilder memberBuilder = new MemberBuilder();
+        final MemberBuilder memberBuilder = toMdIds(member, MemberBuilder.class);
         memberBuilder.setAdminStateUp(member.getPoolMemberAdminStateIsUp());
         if (member.getPoolMemberAddress() != null) {
             final IpAddress ipAddress = new IpAddress(member.getPoolMemberAddress().toCharArray());
@@ -281,79 +260,56 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         if (member.getPoolMemberProtoPort() != null) {
             memberBuilder.setProtocolPort(member.getPoolMemberProtoPort());
         }
-        if (member.getID() != null) {
-            memberBuilder.setUuid(toUuid(member.getID()));
-        }
         if (member.getPoolMemberSubnetID() != null) {
             memberBuilder.setSubnetId(toUuid(member.getPoolMemberSubnetID()));
         }
-        if (member.getTenantID() != null) {
-            memberBuilder.setTenantId(toUuid(member.getTenantID()));
-        }
         if (member.getPoolMemberWeight() != null) {
             memberBuilder.setWeight(member.getPoolMemberWeight());
         }
         return memberBuilder.build();
     }
 
-    protected Member toMemberMd(String uuid) {
+    private Member toMemberMd(String uuid) {
         final MemberBuilder memberBuilder = new MemberBuilder();
         memberBuilder.setUuid(toUuid(uuid));
         return memberBuilder.build();
     }
 
-    protected <
-            T extends org.opendaylight.yangtools.yang.binding.DataObject> T readMemberMd(InstanceIdentifier<T> path) {
+    private <T extends DataObject> T readMemberMd(InstanceIdentifier<T> path) throws ReadFailedException {
         T result = null;
-        final ReadOnlyTransaction transaction = getDataBroker().newReadOnlyTransaction();
-        final CheckedFuture<Optional<T>,
-                ReadFailedException> future = transaction.read(LogicalDatastoreType.CONFIGURATION, path);
-        if (future != null) {
-            Optional<T> optional;
-            try {
+        try (ReadOnlyTransaction transaction = getDataBroker().newReadOnlyTransaction()) {
+            final CheckedFuture<Optional<T>, ReadFailedException> future = transaction
+                    .read(LogicalDatastoreType.CONFIGURATION, path);
+            if (future != null) {
+                Optional<T> optional;
                 optional = future.checkedGet();
                 if (optional.isPresent()) {
                     result = optional.get();
                 }
-            } catch (final ReadFailedException e) {
-                LOGGER.warn("Failed to read {}", path, e);
             }
         }
-        transaction.close();
         return result;
     }
 
-    protected boolean addMemberMd(Pool pool, NeutronLoadBalancerPoolMember neutronObject) {
+    private void addMemberMd(Pool pool, NeutronLoadBalancerPoolMember neutronObject)
+            throws TransactionCommitFailedException {
         // TODO think about adding existence logic
-        return updateMemberMd(pool, neutronObject);
+        updateMemberMd(pool, neutronObject);
     }
 
-    protected boolean updateMemberMd(Pool pool, NeutronLoadBalancerPoolMember neutronObject) {
+    private void updateMemberMd(Pool pool, NeutronLoadBalancerPoolMember neutronObject)
+            throws TransactionCommitFailedException {
         final WriteTransaction transaction = getDataBroker().newWriteOnlyTransaction();
         final Member item = toMemberMd(neutronObject);
         final InstanceIdentifier<Member> iid = createMemberInstanceIdentifier(pool, item);
         transaction.put(LogicalDatastoreType.CONFIGURATION, iid, item, true);
-        final CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
-        try {
-            future.get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOGGER.warn("Transation failed ", e);
-            return false;
-        }
-        return true;
+        transaction.submit().checkedGet();
     }
 
-    protected boolean removeMemberMd(Pool pool, Member item) {
+    private void removeMemberMd(Pool pool, Member item) throws TransactionCommitFailedException {
         final WriteTransaction transaction = getDataBroker().newWriteOnlyTransaction();
         final InstanceIdentifier<Member> iid = createMemberInstanceIdentifier(pool, item);
         transaction.delete(LogicalDatastoreType.CONFIGURATION, iid);
-        final CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
-        try {
-            future.get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOGGER.warn("Transation failed ", e);
-            return false;
-        }
-        return true;
+        transaction.submit().checkedGet();
     }
 }