Merge dev/fluorine work across to master
[unimgr.git] / impl / src / main / java / org / opendaylight / unimgr / mef / nrp / impl / connectivityservice / DeleteConnectivityAction.java
index 31e906ac5d1ae7bffa1864d4745d28f23f8fd2a4..ca112441e0b7d5812b274fc2e1b87cd30964b3db 100644 (file)
@@ -9,34 +9,38 @@
 package org.opendaylight.unimgr.mef.nrp.impl.connectivityservice;
 
 import java.text.MessageFormat;
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 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.unimgr.mef.nrp.api.ActivationDriver;
 import org.opendaylight.unimgr.mef.nrp.api.EndPoint;
 import org.opendaylight.unimgr.mef.nrp.common.NrpDao;
+import org.opendaylight.unimgr.mef.nrp.common.TapiUtils;
 import org.opendaylight.unimgr.mef.nrp.impl.ActivationTransaction;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.DeleteConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.DeleteConnectivityServiceOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.DeleteConnectivityServiceOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connection.Route;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.delete.connectivity.service.output.Service;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.delete.connectivity.service.output.ServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.ServiceInterfacePointRef;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.DeleteConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.DeleteConnectivityServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.DeleteConnectivityServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connection.Route;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.delete.connectivity.service.output.Service;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.delete.connectivity.service.output.ServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.node.OwnedNodeEdgePoint;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -45,6 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
+ * Delete connectivity implementation.
  * @author bartosz.michalik@amartus.com
  */
 public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnectivityServiceOutput>> {
@@ -55,7 +60,8 @@ public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnec
     private Uuid serviceId;
     private List<Uuid> connectionIds = new LinkedList<>();
 
-    DeleteConnectivityAction(TapiConnectivityServiceImpl tapiConnectivityService, DeleteConnectivityServiceInput input) {
+    DeleteConnectivityAction(TapiConnectivityServiceImpl tapiConnectivityService,
+                             DeleteConnectivityServiceInput input) {
         Objects.requireNonNull(tapiConnectivityService);
         Objects.requireNonNull(input);
         this.service = tapiConnectivityService;
@@ -63,7 +69,8 @@ public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnec
     }
 
     @Override
-    public RpcResult<DeleteConnectivityServiceOutput> call() throws Exception {
+    @SuppressWarnings("checkstyle:illegalcatch")
+    public RpcResult<DeleteConnectivityServiceOutput> call() {
         serviceId = new Uuid(input.getServiceIdOrName());
         NrpDao nrpDao = new NrpDao(service.getBroker().newReadOnlyTransaction());
 
@@ -72,17 +79,20 @@ public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnec
         if (cs == null) {
             return RpcResultBuilder
                     .<DeleteConnectivityServiceOutput>failed()
-                    .withError(RpcError.ErrorType.APPLICATION, MessageFormat.format("Service {0} does not exist", input.getServiceIdOrName()))
+                    .withError(RpcError.ErrorType.APPLICATION,
+                            MessageFormat.format("Service {0} does not exist", input.getServiceIdOrName()))
                     .build();
         }
-        Map<Uuid, LinkedList<EndPoint>> data = null;
+        Map<Uuid, LinkedList<EndPoint>> data;
         try {
             data = prepareData(cs, nrpDao);
         } catch (Exception e) {
             LOG.info("Service {} does not exists", input.getServiceIdOrName());
             return RpcResultBuilder
                     .<DeleteConnectivityServiceOutput>failed()
-                    .withError(RpcError.ErrorType.APPLICATION, MessageFormat.format("error while preparing data for service {0} ", input.getServiceIdOrName()))
+                    .withError(RpcError.ErrorType.APPLICATION,
+                            MessageFormat.format("error while preparing data for service {0} ",
+                                    input.getServiceIdOrName()))
                     .build();
         }
 
@@ -91,7 +101,7 @@ public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnec
         Service response = new ServiceBuilder(cs).build();
 
         try {
-            ActivationTransaction tx = prepareTransaction(data);
+            ActivationTransaction tx = prepareTransaction(data,nrpDao);
 
             if (tx != null) {
                 ActivationTransaction.Result txResult = tx.deactivate();
@@ -103,38 +113,49 @@ public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnec
                             .setService(new ServiceBuilder(response).build()).build();
                     return RpcResultBuilder.success(result).build();
                 } else {
-                    LOG.warn("CreateConnectivityService deactivation failed, reason = {}, request = {}", txResult.getMessage(), input);
+                    LOG.warn("CreateConnectivityService deactivation failed, reason = {}, request = {}",
+                            txResult.getMessage(), input);
                 }
             }
             throw new IllegalStateException("no transaction created for delete connectivity request");
         } catch (Exception e) {
-            LOG.warn("Exception in create connectivity service", e);
+            LOG.warn("Exception in delete connectivity service", e);
             return RpcResultBuilder
                     .<DeleteConnectivityServiceOutput>failed()
                     .build();
         }
     }
 
-    private void removeConnectivity() throws TransactionCommitFailedException {
-        WriteTransaction tx = service.getBroker().newWriteOnlyTransaction();
+    private void removeConnectivity()
+            throws TransactionCommitFailedException, InterruptedException, ExecutionException {
+
+        ReadWriteTransaction tx = service.getBroker().newReadWriteTransaction();
+        NrpDao nrpDao = new NrpDao(tx);
         InstanceIdentifier<Context1> conCtx = NrpDao.ctx().augmentation(Context1.class);
         LOG.debug("Removing connectivity service {}", serviceId.getValue());
-        tx.delete(LogicalDatastoreType.OPERATIONAL, conCtx.child(ConnectivityService.class, new ConnectivityServiceKey(serviceId)));
+        tx.delete(LogicalDatastoreType.OPERATIONAL, conCtx.child(ConnectivityService.class,
+                new ConnectivityServiceKey(serviceId)));
         connectionIds.forEach(csId -> {
             LOG.debug("Removing connection {}", csId.getValue());
-            tx.delete(LogicalDatastoreType.OPERATIONAL, conCtx.child(Connection.class, new ConnectionKey(csId)));
+            nrpDao.removeConnection(csId);
         });
         //TODO should be transactional with operations on deactivation
-        tx.submit().checkedGet();
+        tx.commit().get();
     }
 
-    private ActivationTransaction prepareTransaction(Map<Uuid, LinkedList<EndPoint>> data) {
+    private ActivationTransaction prepareTransaction(Map<Uuid, LinkedList<EndPoint>> data, NrpDao nrpDao) {
         assert data != null;
         ActivationTransaction tx = new ActivationTransaction();
         data.entrySet().stream().map(e -> {
-            Optional<ActivationDriver> driver = service.getDriverRepo().getDriver(e.getKey());
+            Optional<ActivationDriver> driver = Optional.empty();
+            try {
+                driver = service.getDriverRepo().getDriver(nrpDao.getActivationDriverId(e.getKey()));
+            } catch (ReadFailedException e1) {
+                LOG.warn("Unable to get activationDriverId for node {}",e.getKey(),e1);
+            }
             if (!driver.isPresent()) {
-                throw new IllegalStateException(MessageFormat.format("driver {} cannot be created", e.getKey()));
+                throw new IllegalStateException(MessageFormat
+                        .format("driver {} cannot be created", e.getKey()));
             }
             driver.get().initialize(e.getValue(), serviceId.getValue(), null);
             LOG.debug("driver {} added to deactivation transaction", driver.get());
@@ -160,26 +181,44 @@ public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnec
 
         return systemConnectionIds.stream().map(nrpDao::getConnection)
                 .flatMap(c -> {
-                    Uuid nodeId = c.getContainerNode();
+                    //XXX [bmi] add constraints checking (eg. NPE)
+                    final Uuid nodeId = c.getConnectionEndPoint().get(0).getNodeId();
+
                     return c.getConnectionEndPoint().stream().map(cep -> {
-                        Optional<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.service.EndPoint> optEndPoint = Optional.empty();
-                        if (cs.getEndPoint() != null) {
+                        Optional<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                                .connectivity.service.EndPoint> optEndPoint = Optional.empty();
+
+                        OwnedNodeEdgePoint nep = nrpDao.getNepByCep(cep);
+
+                        if (cs.getEndPoint() != null && nep.getMappedServiceInterfacePoint() != null) {
+
                             optEndPoint = cs.getEndPoint().stream()
-                                    .filter(endPoint1 -> endPoint1.getServiceInterfacePoint().getValue().contains(cep.getServerNodeEdgePoint().getValue()))
+                                    .filter(csEp -> {
+                                        Uuid csSip = csEp.getServiceInterfacePoint().getServiceInterfacePointId();
+                                        return nep.getMappedServiceInterfacePoint().stream()
+                                                .map(ServiceInterfacePointRef::getServiceInterfacePointId)
+                                                .anyMatch(mSip -> mSip.equals(csSip));
+                                    })
                                     .findFirst();
                         }
-                        org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.service.EndPoint endPoint =
-                                optEndPoint.isPresent() ? optEndPoint.get() : null;
-                        EndPoint ep = new EndPoint(endPoint, null).setSystemNepUuid(cep.getServerNodeEdgePoint());
+                        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                                .connectivity.service.EndPoint endPoint = optEndPoint.orElse(null);
+
+
+                        EndPoint ep = new EndPoint(endPoint, null)
+                                .setNepRef(TapiUtils.toSysNepRef(nodeId, nep.getUuid()));
                         return new Pair(nodeId, ep);
                     });
-                }).collect(Collectors.toMap(p -> p.getNodeId(), p -> new LinkedList<>(Arrays.asList(p.getEndPoint())), (ol, nl) -> {
-                    ol.addAll(nl);
-                    return ol;
-                }));
+                }).collect(Collectors
+                        .toMap(Pair::getNodeId, p -> new LinkedList<>(Collections.singletonList(p.getEndPoint())),
+                        (ol, nl) -> {
+                            ol.addAll(nl);
+                            return ol;
+                        }
+                ));
     }
 
-    private static  class Pair {
+    private static final class Pair {
         private final Uuid nodeId;
         private final EndPoint endPoint;