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;
import org.slf4j.LoggerFactory;
/**
+ * Delete connectivity implementation.
* @author bartosz.michalik@amartus.com
*/
public class DeleteConnectivityAction implements Callable<RpcResult<DeleteConnectivityServiceOutput>> {
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;
}
@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());
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();
}
Service response = new ServiceBuilder(cs).build();
try {
- ActivationTransaction tx = prepareTransaction(data);
+ ActivationTransaction tx = prepareTransaction(data,nrpDao);
if (tx != null) {
ActivationTransaction.Result txResult = tx.deactivate();
.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());
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;