X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=tapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Ftapi%2Fconnectivity%2FTapiConnectivityImpl.java;h=320ae6f885e17c722659daafdaeb76aba7030b21;hb=2f5d0456526325091bdef21785cd9db32e6bab0c;hp=6172e5435badae9fb21f69356ab6e1dd58aa6530;hpb=e4106d346bc8313726b154af4d30e3cc875b4706;p=transportpce.git diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java index 6172e5435..320ae6f88 100644 --- a/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java +++ b/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java @@ -7,45 +7,86 @@ */ package org.opendaylight.transportpce.tapi.connectivity; +import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; import java.util.UUID; +import java.util.concurrent.ExecutionException; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.OperationResult; -import org.opendaylight.transportpce.tapi.utils.GenericServiceEndpoint; -import org.opendaylight.transportpce.tapi.utils.MappingUtils; +import org.opendaylight.transportpce.common.ResponseCodes; +import org.opendaylight.transportpce.common.network.NetworkTransactionService; +import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler; +import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler; +import org.opendaylight.transportpce.tapi.utils.TapiContext; import org.opendaylight.transportpce.tapi.validation.CreateConnectivityServiceValidation; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.OrgOpenroadmServiceService; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInput; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.TapiConnectivityService; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityServiceInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityServiceOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.Connection; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.ServiceInterfacePointBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.output.ServiceBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OrgOpenroadmServiceService; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionEndPointDetailsInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionEndPointDetailsOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ServiceType; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.TapiConnectivityService; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.UpdateConnectivityServiceInput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.UpdateConnectivityServiceOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraint; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraintBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.CapacityBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.ServiceInterfacePointBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.output.ServiceBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connection.details.output.ConnectionBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.Service; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.ServiceKey; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.Rpc; +import org.opendaylight.yangtools.yang.common.ErrorTag; +import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; @@ -55,119 +96,318 @@ import org.slf4j.LoggerFactory; * Top level service interface providing main TAPI Connectivity services. */ public class TapiConnectivityImpl implements TapiConnectivityService { - + private final NetworkTransactionService networkTransactionService; private static final Logger LOG = LoggerFactory.getLogger(TapiConnectivityImpl.class); private OrgOpenroadmServiceService serviceHandler; + private final TapiContext tapiContext; + private final ConnectivityUtils connectivityUtils; + private TapiPceNotificationHandler pceListenerImpl; + private TapiRendererNotificationHandler rendererListenerImpl; - public TapiConnectivityImpl(OrgOpenroadmServiceService serviceHandler) { + public TapiConnectivityImpl(OrgOpenroadmServiceService serviceHandler, TapiContext tapiContext, + ConnectivityUtils connectivityUtils, TapiPceNotificationHandler pceListenerImpl, + TapiRendererNotificationHandler rendererListenerImpl, + NetworkTransactionService nts) { LOG.info("inside TapiImpl constructor"); this.serviceHandler = serviceHandler; + this.tapiContext = tapiContext; + this.connectivityUtils = connectivityUtils; + this.pceListenerImpl = pceListenerImpl; + this.rendererListenerImpl = rendererListenerImpl; + this.networkTransactionService = nts; } @Override public ListenableFuture> createConnectivityService( - CreateConnectivityServiceInput input) { + CreateConnectivityServiceInput input) { + // TODO: later version of TAPI models include Name as an input parameter in connectivity.yang LOG.info("RPC create-connectivity received: {}", input.getEndPoint()); + Uuid serviceUuid = new Uuid(UUID.randomUUID().toString()); + this.pceListenerImpl.setInput(input); + this.pceListenerImpl.setServiceUuid(serviceUuid); + this.rendererListenerImpl.setServiceUuid(serviceUuid); + ListenableFuture> output = null; OperationResult validationResult = CreateConnectivityServiceValidation.validateCreateConnectivityServiceRequest( - input); + input); if (validationResult.isSuccess()) { LOG.info("input parameter of RPC create-connectivity are being handled"); - // check uuid of SIP in the map - Map map = MappingUtils.getMap(); - - if (map.containsKey(input.getEndPoint().values().stream().findFirst().get() - .getServiceInterfacePoint().getServiceInterfacePointUuid()) - && map.containsKey(input.getEndPoint().values().stream().skip(1).findFirst().get() - .getServiceInterfacePoint() - .getServiceInterfacePointUuid())) { - ServiceCreateInput sci = ConnectivityUtils.buildServiceCreateInput( - map.get(input.getEndPoint().values().stream().findFirst().get() - .getServiceInterfacePoint() - .getServiceInterfacePointUuid()), - map.get(input.getEndPoint().values().stream().skip(1).findFirst().get() - .getServiceInterfacePoint() - .getServiceInterfacePointUuid())); - ListenableFuture> output = this.serviceHandler.serviceCreate(sci); + // check uuid of SIP in tapi context + Map sipMap = this.tapiContext.getTapiContext() + .getServiceInterfacePoint(); + if (sipMap == null) { + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "SIP list is empty") + .buildFuture(); + } + if (sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().findFirst() + .orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid())) + && sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().skip(1) + .findFirst().orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))) { + LOG.info("SIPs found in sipMap"); + // TODO: differentiate between OTN service and GbE service in TAPI + ServiceCreateInput sci = this.connectivityUtils.createORServiceInput(input, serviceUuid); + if (sci == null) { + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Couldnt map Service create input") + .buildFuture(); + } + LOG.info("Service Create input = {}", sci); + output = this.serviceHandler.serviceCreate(sci); if (!output.isDone()) { - return RpcResultBuilder.failed().buildFuture(); + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Service create RPC failed") + .buildFuture(); } } else { LOG.error("Unknown UUID"); + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "SIPs do not exist in tapi context") + .buildFuture(); } - } - - Map endPointList = new HashMap<>(); - EndPoint endpoint1 = new EndPointBuilder() - .setLocalId(UUID.randomUUID().toString()) - .setServiceInterfacePoint(new ServiceInterfacePointBuilder().setServiceInterfacePointUuid(new Uuid(UUID - .randomUUID().toString())).build()) - .build(); - EndPoint endpoint2 = new EndPointBuilder() - .setLocalId(UUID.randomUUID().toString()) - .setServiceInterfacePoint(new ServiceInterfacePointBuilder().setServiceInterfacePointUuid(new Uuid(UUID - .randomUUID().toString())).build()) - .build(); - endPointList.put(endpoint1.key(), endpoint1); - endPointList.put(endpoint2.key(), endpoint2); - Connection connection = new ConnectionBuilder().setConnectionUuid(new Uuid(UUID.randomUUID().toString())) + try { + if (output == null) { + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Failed to create service") + .buildFuture(); + } + LOG.info("Service create request was successful"); + if (output.get().getResult().getConfigurationResponseCommon().getResponseCode() + .equals(ResponseCodes.RESPONSE_FAILED)) { + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Failed to create service") + .buildFuture(); + } + LOG.info("Output of service request = {}", output.get().getResult()); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Error checking response code of service create", e); + } + // Connections and states should be created/updated when the pce and renderer are done :) + Map endPointList = createEndPoints(input.getEndPoint()); + Name name = new NameBuilder() + .setValueName("Connectivity Service Name") + .setValue(serviceUuid.getValue()) .build(); + ConnectivityConstraint conConstr = new ConnectivityConstraintBuilder() + .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY) + .setServiceLevel(input.getConnectivityConstraint().getServiceLevel()).build(); + ConnectivityService service = new ConnectivityServiceBuilder() - .setUuid(new Uuid(UUID.randomUUID().toString())) + .setUuid(serviceUuid) + .setAdministrativeState(AdministrativeState.LOCKED) + .setOperationalState(OperationalState.DISABLED) + .setLifecycleState(LifecycleState.PLANNED) + .setLayerProtocolName(input.getLayerProtocolName()) + .setConnectivityConstraint(conConstr) + .setDirection(ForwardingDirection.BIDIRECTIONAL) + .setName(Map.of(name.key(), name)) + .setConnection(new HashMap<>()) + .setEndPoint(endPointList) .build(); - Name serviceName = new NameBuilder().setValueName("Service Name").setValue("SENDATE Service 1").build(); - CreateConnectivityServiceOutput output = new CreateConnectivityServiceOutputBuilder() - .setService(new ServiceBuilder(service) - .setUuid(new Uuid(UUID.randomUUID().toString())) - .setName(Map.of(serviceName.key(), serviceName)) - .setServiceLayer(input.getEndPoint().values().stream().findFirst().get().getLayerProtocolName()) - .setEndPoint(endPointList) - .setConnection(Map.of(connection.key(), connection)) - .build()) - .build(); - return RpcResultBuilder.success(output).buildFuture(); + // add to tapi context + this.tapiContext.updateConnectivityContext(Map.of(service.key(), service), new HashMap<>()); + LOG.info("Created locked service in Datastore. Waiting for PCE and Renderer to complete tasks..."); + // return ConnectivityServiceCreateOutput + return RpcResultBuilder.success(new CreateConnectivityServiceOutputBuilder() + .setService(new ServiceBuilder(service).build()).build()).buildFuture(); } @Override public ListenableFuture> getConnectivityServiceDetails( - GetConnectivityServiceDetailsInput input) { + GetConnectivityServiceDetailsInput input) { // TODO Auto-generated method stub - return null; + Uuid serviceUuid = input.getUuid(); + ConnectivityService service = this.tapiContext.getConnectivityService(serviceUuid); + if (service == null) { + LOG.error("Service {} doesnt exist in tapi context", input.getUuid()); + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Service doesnt exist in datastore") + .buildFuture(); + } + return RpcResultBuilder.success(new GetConnectivityServiceDetailsOutputBuilder().setService( + new org.opendaylight.yang.gen.v1.urn + .onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.details.output.ServiceBuilder( + service).build()).build()).buildFuture(); } @Override public ListenableFuture> updateConnectivityService( - UpdateConnectivityServiceInput input) { - // TODO Auto-generated method stub - return null; + UpdateConnectivityServiceInput input) { + // TODO Auto-generated method stub. More complicated as it depends on what needs to be updated... left aside + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, ErrorTag.OPERATION_NOT_SUPPORTED, "RPC not implemented yet") + .buildFuture(); } @Override public ListenableFuture> getConnectionDetails( - GetConnectionDetailsInput input) { + GetConnectionDetailsInput input) { // TODO Auto-generated method stub - return null; + Uuid connectionUuid = input.getUuid(); + Connection connection = this.tapiContext.getConnection(connectionUuid); + if (connection == null) { + LOG.error("Connection {} doesnt exist in tapi context", input.getUuid()); + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Connection doesnt exist in datastore") + .buildFuture(); + } + return RpcResultBuilder.success(new GetConnectionDetailsOutputBuilder().setConnection( + new ConnectionBuilder(connection).build()).build()).buildFuture(); } @Override public ListenableFuture> deleteConnectivityService( - DeleteConnectivityServiceInput input) { - //TODO Auto-generated method stub - return null; + DeleteConnectivityServiceInput input) { + // TODO Auto-generated method stub + // TODO add try + String serviceName = null; + try { + serviceName = getNameFromUuid(input.getUuid(), "Service").iterator().next(); + } catch (ExecutionException e) { + LOG.error("Service {} to be deleted not found in the DataStore", e.getMessage()); + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Failed to delete Service") + .buildFuture(); + } + if (input.getUuid() != null) { + try { + Uuid serviceUuid = input.getUuid(); + this.tapiContext.deleteConnectivityService(serviceUuid); + ListenableFuture> output = + this.serviceHandler.serviceDelete(new ServiceDeleteInputBuilder() + .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder() + .setServiceName(serviceName) + .setTailRetention(ServiceDeleteReqInfo.TailRetention.No) + .build()) + .setSdncRequestHeader(new SdncRequestHeaderBuilder() + .setRequestId("request-1") + .setNotificationUrl("notification url") + .setRequestSystemId("appname") + .setRpcAction(RpcActions.ServiceDelete) + .build()) + .build()); + RpcResult rpcResult = output.get(); + if (!rpcResult.getResult().getConfigurationResponseCommon().getResponseCode() + .equals(ResponseCodes.RESPONSE_FAILED)) { + LOG.info("Service is being deleted and devices are being rolled back"); + return RpcResultBuilder.success(new DeleteConnectivityServiceOutputBuilder().build()).buildFuture(); + } + LOG.error("Failed to delete service. Deletion process failed"); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Failed to delete service.", e); + } + } + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "Failed to delete Service") + .buildFuture(); } @Override public ListenableFuture> getConnectivityServiceList( - GetConnectivityServiceListInput input) { + GetConnectivityServiceListInput input) { // TODO Auto-generated method stub - return null; + Map connMap = this.tapiContext.getConnectivityServices(); + if (connMap == null) { + LOG.error("No services in tapi context"); + return RpcResultBuilder.failed() + .withError(ErrorType.RPC, "No services exist in datastore") + .buildFuture(); + } + + Map serviceMap = new HashMap<>(); + for (ConnectivityService connectivityService: connMap.values()) { + Service service = new org.opendaylight.yang.gen.v1.urn + .onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.ServiceBuilder( + connectivityService).build(); + serviceMap.put(service.key(), service); + } + return RpcResultBuilder.success(new GetConnectivityServiceListOutputBuilder().setService(serviceMap) + .build()).buildFuture(); } @Override public ListenableFuture> getConnectionEndPointDetails( - GetConnectionEndPointDetailsInput input) { - // TODO Auto-generated method stub + GetConnectionEndPointDetailsInput input) { +// TODO: Leveraging previous code, provide TAPI2.4 compliant implementation for this function + LOG.error("Method getConnectionEndPointDetails not currently implemented"); return null; } + + public ImmutableClassToInstanceMap> registerRPCs() { + return ImmutableClassToInstanceMap.>builder() + .put(CreateConnectivityService.class, this::createConnectivityService) + .put(GetConnectivityServiceDetails.class, this::getConnectivityServiceDetails) + .put(UpdateConnectivityService.class, this::updateConnectivityService) + .put(GetConnectionDetails.class, this::getConnectionDetails) + .put(DeleteConnectivityService.class, this::deleteConnectivityService) + .put(GetConnectivityServiceList.class, this::getConnectivityServiceList) + .put(GetConnectionEndPointDetails.class, this::getConnectionEndPointDetails) + .build(); + } + + private Map createEndPoints( + Map endPoints) { + Map endPointMap = new HashMap<>(); + for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121 + .create.connectivity.service.input.EndPoint ep: endPoints.values()) { + EndPoint endpoint = new EndPointBuilder() + .setServiceInterfacePoint(new ServiceInterfacePointBuilder() + .setServiceInterfacePointUuid(ep.getServiceInterfacePoint().getServiceInterfacePointUuid()) + .build()) + .setName(ep.getName()) + .setAdministrativeState(ep.getAdministrativeState()) + .setDirection(ep.getDirection()) + .setLifecycleState(ep.getLifecycleState()) + .setOperationalState(ep.getOperationalState()) + .setLayerProtocolName(ep.getLayerProtocolName()) + // TODO: implement bandwidth profile + .setCapacity(new CapacityBuilder() + .setTotalSize(new TotalSizeBuilder().build()) +// .setBandwidthProfile(new BandwidthProfileBuilder().build()) + .build()) + .setProtectionRole(ep.getProtectionRole()) + .setRole(ep.getRole()) + .setLocalId(ep.getLocalId()) + .build(); + endPointMap.put(endpoint.key(), endpoint); + } + return endPointMap; + } + + public List getNameFromUuid(Uuid uuid, String typeOfNode) throws ExecutionException { + Map nameMap = new HashMap<>(); + if ("service".equals(typeOfNode)) { + ConnectivityService conServ = null; + InstanceIdentifier nodeIID = InstanceIdentifier.builder(Context.class) + .augmentation( + org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class) + .child(ConnectivityContext.class) + .child(ConnectivityService.class, new ConnectivityServiceKey(uuid)) + .build(); + ListenableFuture> conServFuture = + this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID); + try { + conServ = conServFuture.get().orElseThrow(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + //TODO: investigate on how to throw Interrupted exception (generate a check violation error) + } catch (ExecutionException e) { + throw new ExecutionException("Unable to get from mdsal service: " + nodeIID + .firstKeyOf(ConnectivityService.class).getUuid().getValue(), e); + } catch (NoSuchElementException e) { + return null; + } + nameMap = conServ.getName(); + } + + List nameList = new ArrayList<>(); + for (Map.Entry entry : nameMap.entrySet()) { + nameList.add(entry.getValue().getValueName()); + } + return nameList; + } }