Migration to TAPI 2.4 Step2
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / connectivity / TapiConnectivityImpl.java
1 /*
2  * Copyright © 2018 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.transportpce.tapi.connectivity;
9
10 import com.google.common.collect.ImmutableClassToInstanceMap;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.NoSuchElementException;
17 import java.util.Optional;
18 import java.util.UUID;
19 import java.util.concurrent.ExecutionException;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.transportpce.common.OperationResult;
22 import org.opendaylight.transportpce.common.ResponseCodes;
23 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
24 import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler;
25 import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler;
26 import org.opendaylight.transportpce.tapi.utils.TapiContext;
27 import org.opendaylight.transportpce.tapi.validation.CreateConnectivityServiceValidation;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OrgOpenroadmServiceService;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityService;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutput;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutputBuilder;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityService;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInput;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutput;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutputBuilder;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetails;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsInput;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsOutput;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsOutputBuilder;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionEndPointDetails;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionEndPointDetailsInput;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionEndPointDetailsOutput;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetails;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsInput;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsOutput;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsOutputBuilder;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceList;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListInput;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListOutput;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListOutputBuilder;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ServiceType;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.TapiConnectivityService;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.UpdateConnectivityService;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.UpdateConnectivityServiceInput;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.UpdateConnectivityServiceOutput;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraint;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraintBuilder;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointBuilder;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.CapacityBuilder;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.ServiceInterfacePointBuilder;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.output.ServiceBuilder;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connection.details.output.ConnectionBuilder;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.Service;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.ServiceKey;
93 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
94 import org.opendaylight.yangtools.yang.binding.Rpc;
95 import org.opendaylight.yangtools.yang.common.ErrorTag;
96 import org.opendaylight.yangtools.yang.common.ErrorType;
97 import org.opendaylight.yangtools.yang.common.RpcResult;
98 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
99 import org.slf4j.Logger;
100 import org.slf4j.LoggerFactory;
101
102 /**
103  * Top level service interface providing main TAPI Connectivity services.
104  */
105 public class TapiConnectivityImpl implements TapiConnectivityService {
106     private final NetworkTransactionService networkTransactionService;
107     private static final Logger LOG = LoggerFactory.getLogger(TapiConnectivityImpl.class);
108
109     private OrgOpenroadmServiceService serviceHandler;
110     private final TapiContext tapiContext;
111     private final ConnectivityUtils connectivityUtils;
112     private TapiPceNotificationHandler pceListenerImpl;
113     private TapiRendererNotificationHandler rendererListenerImpl;
114
115     public TapiConnectivityImpl(OrgOpenroadmServiceService serviceHandler, TapiContext tapiContext,
116                                 ConnectivityUtils connectivityUtils, TapiPceNotificationHandler pceListenerImpl,
117                                 TapiRendererNotificationHandler rendererListenerImpl,
118                                 NetworkTransactionService nts) {
119         LOG.info("inside TapiImpl constructor");
120         this.serviceHandler = serviceHandler;
121         this.tapiContext = tapiContext;
122         this.connectivityUtils = connectivityUtils;
123         this.pceListenerImpl = pceListenerImpl;
124         this.rendererListenerImpl = rendererListenerImpl;
125         this.networkTransactionService = nts;
126     }
127
128     @Override
129     public ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> createConnectivityService(
130             CreateConnectivityServiceInput input) {
131         // TODO: later version of TAPI models include Name as an input parameter in connectivity.yang
132         LOG.info("RPC create-connectivity received: {}", input.getEndPoint());
133         Uuid serviceUuid = new Uuid(UUID.randomUUID().toString());
134         this.pceListenerImpl.setInput(input);
135         this.pceListenerImpl.setServiceUuid(serviceUuid);
136         this.rendererListenerImpl.setServiceUuid(serviceUuid);
137         ListenableFuture<RpcResult<ServiceCreateOutput>> output = null;
138         OperationResult validationResult = CreateConnectivityServiceValidation.validateCreateConnectivityServiceRequest(
139                 input);
140         if (validationResult.isSuccess()) {
141             LOG.info("input parameter of RPC create-connectivity are being handled");
142             // check uuid of SIP in tapi context
143             Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap = this.tapiContext.getTapiContext()
144                     .getServiceInterfacePoint();
145             if (sipMap == null) {
146                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
147                     .withError(ErrorType.RPC, "SIP list is empty")
148                     .buildFuture();
149             }
150             if (sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().findFirst()
151                         .orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))
152                     && sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().skip(1)
153                         .findFirst().orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))) {
154                 LOG.info("SIPs found in sipMap");
155                 // TODO: differentiate between OTN service and GbE service in TAPI
156                 ServiceCreateInput sci = this.connectivityUtils.createORServiceInput(input, serviceUuid);
157                 if (sci == null) {
158                     return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
159                         .withError(ErrorType.RPC, "Couldnt map Service create input")
160                         .buildFuture();
161                 }
162                 LOG.info("Service Create input = {}", sci);
163                 output = this.serviceHandler.serviceCreate(sci);
164                 if (!output.isDone()) {
165                     return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
166                         .withError(ErrorType.RPC, "Service create RPC failed")
167                         .buildFuture();
168                 }
169             } else {
170                 LOG.error("Unknown UUID");
171                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
172                     .withError(ErrorType.RPC, "SIPs do not exist in tapi context")
173                     .buildFuture();
174             }
175         }
176         try {
177             if (output == null) {
178                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
179                     .withError(ErrorType.RPC, "Failed to create service")
180                     .buildFuture();
181             }
182             LOG.info("Service create request was successful");
183             if (output.get().getResult().getConfigurationResponseCommon().getResponseCode()
184                     .equals(ResponseCodes.RESPONSE_FAILED)) {
185                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
186                     .withError(ErrorType.RPC, "Failed to create service")
187                     .buildFuture();
188             }
189             LOG.info("Output of service request = {}", output.get().getResult());
190         } catch (InterruptedException | ExecutionException e) {
191             LOG.error("Error checking response code of service create", e);
192         }
193         // Connections and states should be created/updated when the pce and renderer are done :)
194         Map<EndPointKey, EndPoint> endPointList = createEndPoints(input.getEndPoint());
195         Name name = new NameBuilder()
196             .setValueName("Connectivity Service Name")
197             .setValue(serviceUuid.getValue())
198             .build();
199         ConnectivityConstraint conConstr = new ConnectivityConstraintBuilder()
200             .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
201             .setServiceLevel(input.getConnectivityConstraint().getServiceLevel()).build();
202
203         ConnectivityService service = new ConnectivityServiceBuilder()
204             .setUuid(serviceUuid)
205             .setAdministrativeState(AdministrativeState.LOCKED)
206             .setOperationalState(OperationalState.DISABLED)
207             .setLifecycleState(LifecycleState.PLANNED)
208             .setLayerProtocolName(input.getLayerProtocolName())
209             .setConnectivityConstraint(conConstr)
210             .setDirection(ForwardingDirection.BIDIRECTIONAL)
211             .setName(Map.of(name.key(), name))
212             .setConnection(new HashMap<>())
213             .setEndPoint(endPointList)
214             .build();
215         // add to tapi context
216         this.tapiContext.updateConnectivityContext(Map.of(service.key(), service), new HashMap<>());
217         LOG.info("Created locked service in Datastore. Waiting for PCE and Renderer to complete tasks...");
218         // return ConnectivityServiceCreateOutput
219         return RpcResultBuilder.success(new CreateConnectivityServiceOutputBuilder()
220             .setService(new ServiceBuilder(service).build()).build()).buildFuture();
221     }
222
223     @Override
224     public ListenableFuture<RpcResult<GetConnectivityServiceDetailsOutput>> getConnectivityServiceDetails(
225             GetConnectivityServiceDetailsInput input) {
226         // TODO Auto-generated method stub
227         Uuid serviceUuid = input.getUuid();
228         ConnectivityService service = this.tapiContext.getConnectivityService(serviceUuid);
229         if (service == null) {
230             LOG.error("Service {} doesnt exist in tapi context", input.getUuid());
231             return RpcResultBuilder.<GetConnectivityServiceDetailsOutput>failed()
232                 .withError(ErrorType.RPC, "Service doesnt exist in datastore")
233                 .buildFuture();
234         }
235         return RpcResultBuilder.success(new GetConnectivityServiceDetailsOutputBuilder().setService(
236             new org.opendaylight.yang.gen.v1.urn
237                 .onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.details.output.ServiceBuilder(
238                     service).build()).build()).buildFuture();
239     }
240
241     @Override
242     public ListenableFuture<RpcResult<UpdateConnectivityServiceOutput>> updateConnectivityService(
243             UpdateConnectivityServiceInput input) {
244         // TODO Auto-generated method stub. More complicated as it depends on what needs to be updated... left aside
245         return RpcResultBuilder.<UpdateConnectivityServiceOutput>failed()
246             .withError(ErrorType.RPC, ErrorTag.OPERATION_NOT_SUPPORTED, "RPC not implemented yet")
247             .buildFuture();
248     }
249
250     @Override
251     public ListenableFuture<RpcResult<GetConnectionDetailsOutput>> getConnectionDetails(
252             GetConnectionDetailsInput input) {
253         // TODO Auto-generated method stub
254         Uuid connectionUuid = input.getUuid();
255         Connection connection = this.tapiContext.getConnection(connectionUuid);
256         if (connection == null) {
257             LOG.error("Connection {} doesnt exist in tapi context", input.getUuid());
258             return RpcResultBuilder.<GetConnectionDetailsOutput>failed()
259                 .withError(ErrorType.RPC, "Connection doesnt exist in datastore")
260                 .buildFuture();
261         }
262         return RpcResultBuilder.success(new GetConnectionDetailsOutputBuilder().setConnection(
263                 new ConnectionBuilder(connection).build()).build()).buildFuture();
264     }
265
266     @Override
267     public ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> deleteConnectivityService(
268             DeleteConnectivityServiceInput input) {
269         // TODO Auto-generated method stub
270         // TODO add try
271         String serviceName = null;
272         try {
273             serviceName = getNameFromUuid(input.getUuid(), "Service").iterator().next();
274         } catch (ExecutionException e) {
275             LOG.error("Service {} to be deleted not found in the DataStore", e.getMessage());
276             return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
277                 .withError(ErrorType.RPC, "Failed to delete Service")
278                 .buildFuture();
279         }
280         if (input.getUuid() != null) {
281             try {
282                 Uuid serviceUuid = input.getUuid();
283                 this.tapiContext.deleteConnectivityService(serviceUuid);
284                 ListenableFuture<RpcResult<ServiceDeleteOutput>> output =
285                     this.serviceHandler.serviceDelete(new ServiceDeleteInputBuilder()
286                         .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
287                             .setServiceName(serviceName)
288                             .setTailRetention(ServiceDeleteReqInfo.TailRetention.No)
289                             .build())
290                         .setSdncRequestHeader(new SdncRequestHeaderBuilder()
291                             .setRequestId("request-1")
292                             .setNotificationUrl("notification url")
293                             .setRequestSystemId("appname")
294                             .setRpcAction(RpcActions.ServiceDelete)
295                             .build())
296                         .build());
297                 RpcResult<ServiceDeleteOutput> rpcResult = output.get();
298                 if (!rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()
299                         .equals(ResponseCodes.RESPONSE_FAILED)) {
300                     LOG.info("Service is being deleted and devices are being rolled back");
301                     return RpcResultBuilder.success(new DeleteConnectivityServiceOutputBuilder().build()).buildFuture();
302                 }
303                 LOG.error("Failed to delete service. Deletion process failed");
304             } catch (InterruptedException | ExecutionException e) {
305                 LOG.error("Failed to delete service.", e);
306             }
307         }
308         return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
309             .withError(ErrorType.RPC, "Failed to delete Service")
310             .buildFuture();
311     }
312
313     @Override
314     public ListenableFuture<RpcResult<GetConnectivityServiceListOutput>> getConnectivityServiceList(
315             GetConnectivityServiceListInput input) {
316         // TODO Auto-generated method stub
317         Map<ConnectivityServiceKey, ConnectivityService> connMap = this.tapiContext.getConnectivityServices();
318         if (connMap == null) {
319             LOG.error("No services in tapi context");
320             return RpcResultBuilder.<GetConnectivityServiceListOutput>failed()
321                 .withError(ErrorType.RPC, "No services exist in datastore")
322                 .buildFuture();
323         }
324
325         Map<ServiceKey, Service> serviceMap = new HashMap<>();
326         for (ConnectivityService connectivityService: connMap.values()) {
327             Service service = new org.opendaylight.yang.gen.v1.urn
328                 .onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.ServiceBuilder(
329                     connectivityService).build();
330             serviceMap.put(service.key(), service);
331         }
332         return RpcResultBuilder.success(new GetConnectivityServiceListOutputBuilder().setService(serviceMap)
333             .build()).buildFuture();
334     }
335
336     @Override
337     public ListenableFuture<RpcResult<GetConnectionEndPointDetailsOutput>> getConnectionEndPointDetails(
338             GetConnectionEndPointDetailsInput input) {
339 // TODO:  Leveraging previous code, provide TAPI2.4 compliant implementation for this function
340         LOG.error("Method getConnectionEndPointDetails not currently implemented");
341         return null;
342     }
343
344     public ImmutableClassToInstanceMap<Rpc<?, ?>> registerRPCs() {
345         return ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
346             .put(CreateConnectivityService.class, this::createConnectivityService)
347             .put(GetConnectivityServiceDetails.class, this::getConnectivityServiceDetails)
348             .put(UpdateConnectivityService.class, this::updateConnectivityService)
349             .put(GetConnectionDetails.class, this::getConnectionDetails)
350             .put(DeleteConnectivityService.class, this::deleteConnectivityService)
351             .put(GetConnectivityServiceList.class, this::getConnectivityServiceList)
352             .put(GetConnectionEndPointDetails.class, this::getConnectionEndPointDetails)
353             .build();
354     }
355
356     private Map<EndPointKey, EndPoint> createEndPoints(
357         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
358                 .create.connectivity.service.input.EndPointKey,
359             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
360                 .create.connectivity.service.input.EndPoint> endPoints) {
361         Map<EndPointKey, EndPoint> endPointMap = new HashMap<>();
362         for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
363                 .create.connectivity.service.input.EndPoint ep: endPoints.values()) {
364             EndPoint endpoint = new EndPointBuilder()
365                 .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
366                     .setServiceInterfacePointUuid(ep.getServiceInterfacePoint().getServiceInterfacePointUuid())
367                     .build())
368                 .setName(ep.getName())
369                 .setAdministrativeState(ep.getAdministrativeState())
370                 .setDirection(ep.getDirection())
371                 .setLifecycleState(ep.getLifecycleState())
372                 .setOperationalState(ep.getOperationalState())
373                 .setLayerProtocolName(ep.getLayerProtocolName())
374              // TODO: implement bandwidth profile
375                 .setCapacity(new CapacityBuilder()
376                     .setTotalSize(new TotalSizeBuilder().build())
377 //                  .setBandwidthProfile(new BandwidthProfileBuilder().build())
378                     .build())
379                 .setProtectionRole(ep.getProtectionRole())
380                 .setRole(ep.getRole())
381                 .setLocalId(ep.getLocalId())
382                 .build();
383             endPointMap.put(endpoint.key(), endpoint);
384         }
385         return endPointMap;
386     }
387
388     public List<String> getNameFromUuid(Uuid uuid, String typeOfNode) throws ExecutionException {
389         Map<NameKey, Name> nameMap = new HashMap<>();
390         if ("service".equals(typeOfNode)) {
391             ConnectivityService conServ = null;
392             InstanceIdentifier<ConnectivityService> nodeIID = InstanceIdentifier.builder(Context.class)
393                 .augmentation(
394                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
395                 .child(ConnectivityContext.class)
396                 .child(ConnectivityService.class, new ConnectivityServiceKey(uuid))
397                 .build();
398             ListenableFuture<Optional<ConnectivityService>> conServFuture =
399                 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID);
400             try {
401                 conServ = conServFuture.get().orElseThrow();
402             } catch (InterruptedException e) {
403                 Thread.currentThread().interrupt();
404                 //TODO: investigate on how to throw Interrupted exception (generate a check violation error)
405             } catch (ExecutionException e) {
406                 throw new ExecutionException("Unable to get from mdsal service: " + nodeIID
407                     .firstKeyOf(ConnectivityService.class).getUuid().getValue(), e);
408             } catch (NoSuchElementException e) {
409                 return null;
410             }
411             nameMap = conServ.getName();
412         }
413
414         List<String> nameList = new ArrayList<>();
415         for (Map.Entry<NameKey, Name> entry : nameMap.entrySet()) {
416             nameList.add(entry.getValue().getValueName());
417         }
418         return nameList;
419     }
420 }