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