Don't use NotificationListener (TapiProvider)
[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.nio.charset.StandardCharsets;
13 import java.util.HashMap;
14 import java.util.Map;
15 import java.util.UUID;
16 import java.util.concurrent.ExecutionException;
17 import org.opendaylight.transportpce.common.OperationResult;
18 import org.opendaylight.transportpce.common.ResponseCodes;
19 import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler;
20 import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler;
21 import org.opendaylight.transportpce.tapi.utils.TapiContext;
22 import org.opendaylight.transportpce.tapi.validation.CreateConnectivityServiceValidation;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OrgOpenroadmServiceService;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.BandwidthProfileBuilder;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityService;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutput;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutputBuilder;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityService;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInput;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceOutput;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceOutputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetails;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsInput;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsOutput;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsOutputBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetails;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsInput;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsOutput;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsOutputBuilder;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetails;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsInput;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsOutput;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsOutputBuilder;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceList;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListInput;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListOutput;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListOutputBuilder;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ServiceType;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.TapiConnectivityService;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityService;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityServiceInput;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityServiceOutput;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPoint;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointBuilder;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.CapacityBuilder;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.ServiceInterfacePointBuilder;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.output.ServiceBuilder;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connection.details.output.ConnectionBuilder;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connection.end.point.details.output.ConnectionEndPointBuilder;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.list.output.Service;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.list.output.ServiceKey;
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
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         LOG.info("inside TapiImpl constructor");
112         this.serviceHandler = serviceHandler;
113         this.tapiContext = tapiContext;
114         this.connectivityUtils = connectivityUtils;
115         this.pceListenerImpl = pceListenerImpl;
116         this.rendererListenerImpl = rendererListenerImpl;
117     }
118
119     @Override
120     public ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> createConnectivityService(
121             CreateConnectivityServiceInput input) {
122         // TODO: later version of TAPI models include Name as an input parameter in connectivity.yang
123         LOG.info("RPC create-connectivity received: {}", input.getEndPoint());
124         Uuid serviceUuid = new Uuid(UUID.randomUUID().toString());
125         this.pceListenerImpl.setInput(input);
126         this.pceListenerImpl.setServiceUuid(serviceUuid);
127         this.rendererListenerImpl.setServiceUuid(serviceUuid);
128         ListenableFuture<RpcResult<ServiceCreateOutput>> output = null;
129         OperationResult validationResult = CreateConnectivityServiceValidation.validateCreateConnectivityServiceRequest(
130                 input);
131         if (validationResult.isSuccess()) {
132             LOG.info("input parameter of RPC create-connectivity are being handled");
133             // check uuid of SIP in tapi context
134             Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap = this.tapiContext.getTapiContext()
135                     .getServiceInterfacePoint();
136             if (sipMap == null) {
137                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
138                     .withError(ErrorType.RPC, "SIP list is empty")
139                     .buildFuture();
140             }
141             if (sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().findFirst()
142                         .orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))
143                     && sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().skip(1)
144                         .findFirst().orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))) {
145                 LOG.info("SIPs found in sipMap");
146                 // TODO: differentiate between OTN service and GbE service in TAPI
147                 ServiceCreateInput sci = this.connectivityUtils.createORServiceInput(input, serviceUuid);
148                 if (sci == null) {
149                     return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
150                         .withError(ErrorType.RPC, "Couldnt map Service create input")
151                         .buildFuture();
152                 }
153                 LOG.info("Service Create input = {}", sci);
154                 output = this.serviceHandler.serviceCreate(sci);
155                 if (!output.isDone()) {
156                     return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
157                         .withError(ErrorType.RPC, "Service create RPC failed")
158                         .buildFuture();
159                 }
160             } else {
161                 LOG.error("Unknown UUID");
162                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
163                     .withError(ErrorType.RPC, "SIPs do not exist in tapi context")
164                     .buildFuture();
165             }
166         }
167         try {
168             if (output == null) {
169                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
170                     .withError(ErrorType.RPC, "Failed to create service")
171                     .buildFuture();
172             }
173             LOG.info("Service create request was successful");
174             if (output.get().getResult().getConfigurationResponseCommon().getResponseCode()
175                     .equals(ResponseCodes.RESPONSE_FAILED)) {
176                 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
177                     .withError(ErrorType.RPC, "Failed to create service")
178                     .buildFuture();
179             }
180             LOG.info("Output of service request = {}", output.get().getResult());
181         } catch (InterruptedException | ExecutionException e) {
182             LOG.error("Error checking response code of service create", e);
183         }
184         // Connections and states should be created/updated when the pce and renderer are done :)
185         Map<EndPointKey, EndPoint> endPointList = createEndPoints(input.getEndPoint());
186         Name name = new NameBuilder()
187             .setValueName("Connectivity Service Name")
188             .setValue(serviceUuid.getValue())
189             .build();
190         ConnectivityService service = new ConnectivityServiceBuilder()
191             .setUuid(serviceUuid)
192             .setAdministrativeState(AdministrativeState.LOCKED)
193             .setOperationalState(OperationalState.DISABLED)
194             .setLifecycleState(LifecycleState.PLANNED)
195             .setServiceLayer(input.getConnectivityConstraint().getServiceLayer())
196             .setServiceLevel(input.getConnectivityConstraint().getServiceLevel())
197             .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
198             .setConnectivityDirection(ForwardingDirection.BIDIRECTIONAL)
199             .setName(Map.of(name.key(), name))
200             .setConnection(new HashMap<>())
201             .setEndPoint(endPointList)
202             .build();
203         // add to tapi context
204         this.tapiContext.updateConnectivityContext(Map.of(service.key(), service), new HashMap<>());
205         LOG.info("Created locked service in Datastore. Waiting for PCE and Renderer to complete tasks...");
206         // return ConnectivityServiceCreateOutput
207         return RpcResultBuilder.success(new CreateConnectivityServiceOutputBuilder()
208             .setService(new ServiceBuilder(service).build()).build()).buildFuture();
209     }
210
211
212     @Override
213     public ListenableFuture<RpcResult<GetConnectivityServiceDetailsOutput>> getConnectivityServiceDetails(
214             GetConnectivityServiceDetailsInput input) {
215         // TODO Auto-generated method stub
216         Uuid serviceUuid = getUuidFromIput(input.getServiceIdOrName());
217         ConnectivityService service = this.tapiContext.getConnectivityService(serviceUuid);
218         if (service == null) {
219             LOG.error("Service {} doesnt exist in tapi context", input.getServiceIdOrName());
220             return RpcResultBuilder.<GetConnectivityServiceDetailsOutput>failed()
221                 .withError(ErrorType.RPC, "Service doesnt exist in datastore")
222                 .buildFuture();
223         }
224         return RpcResultBuilder.success(new GetConnectivityServiceDetailsOutputBuilder().setService(
225             new org.opendaylight.yang.gen.v1.urn
226                 .onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.details.output.ServiceBuilder(
227                     service).build()).build()).buildFuture();
228     }
229
230     @Override
231     public ListenableFuture<RpcResult<UpdateConnectivityServiceOutput>> updateConnectivityService(
232             UpdateConnectivityServiceInput input) {
233         // TODO Auto-generated method stub. More complicated as it depends on what needs to be updated... left aside
234         return RpcResultBuilder.<UpdateConnectivityServiceOutput>failed()
235             .withError(ErrorType.RPC, ErrorTag.OPERATION_NOT_SUPPORTED, "RPC not implemented yet")
236             .buildFuture();
237     }
238
239     @Override
240     public ListenableFuture<RpcResult<GetConnectionDetailsOutput>> getConnectionDetails(
241             GetConnectionDetailsInput input) {
242         // TODO Auto-generated method stub
243         Uuid connectionUuid = getUuidFromIput(input.getConnectionIdOrName());
244         Connection connection = this.tapiContext.getConnection(connectionUuid);
245         if (connection == null) {
246             LOG.error("Connection {} doesnt exist in tapi context", input.getConnectionIdOrName());
247             return RpcResultBuilder.<GetConnectionDetailsOutput>failed()
248                 .withError(ErrorType.RPC, "Connection doesnt exist in datastore")
249                 .buildFuture();
250         }
251         return RpcResultBuilder.success(new GetConnectionDetailsOutputBuilder().setConnection(
252                 new ConnectionBuilder(connection).build()).build()).buildFuture();
253     }
254
255     @Override
256     public ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> deleteConnectivityService(
257             DeleteConnectivityServiceInput input) {
258         //TODO Auto-generated method stub
259         // TODO add try
260         if (input.getServiceIdOrName() != null) {
261             try {
262                 Uuid serviceUuid = getUuidFromIput(input.getServiceIdOrName());
263                 this.tapiContext.deleteConnectivityService(serviceUuid);
264                 ListenableFuture<RpcResult<ServiceDeleteOutput>> output =
265                     this.serviceHandler.serviceDelete(new ServiceDeleteInputBuilder()
266                         .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
267                             .setServiceName(input.getServiceIdOrName())
268                             .setTailRetention(ServiceDeleteReqInfo.TailRetention.No)
269                             .build())
270                         .setSdncRequestHeader(new SdncRequestHeaderBuilder()
271                             .setRequestId("request-1")
272                             .setNotificationUrl("notification url")
273                             .setRequestSystemId("appname")
274                             .setRpcAction(RpcActions.ServiceDelete)
275                             .build())
276                         .build());
277                 RpcResult<ServiceDeleteOutput> rpcResult = output.get();
278                 if (!rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()
279                         .equals(ResponseCodes.RESPONSE_FAILED)) {
280                     LOG.info("Service is being deleted and devices are being rolled back");
281                     return RpcResultBuilder.success(new DeleteConnectivityServiceOutputBuilder().build()).buildFuture();
282                 }
283                 LOG.error("Failed to delete service. Deletion process failed");
284             } catch (InterruptedException | ExecutionException e) {
285                 LOG.error("Failed to delete service.", e);
286             }
287         }
288         return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
289             .withError(ErrorType.RPC, "Failed to delete Service")
290             .buildFuture();
291     }
292
293     @Override
294     public ListenableFuture<RpcResult<GetConnectivityServiceListOutput>> getConnectivityServiceList(
295             GetConnectivityServiceListInput input) {
296         // TODO Auto-generated method stub
297         Map<ConnectivityServiceKey, ConnectivityService> connMap = this.tapiContext.getConnectivityServices();
298         if (connMap == null) {
299             LOG.error("No services in tapi context");
300             return RpcResultBuilder.<GetConnectivityServiceListOutput>failed()
301                 .withError(ErrorType.RPC, "No services exist in datastore")
302                 .buildFuture();
303         }
304
305         Map<ServiceKey, Service> serviceMap = new HashMap<>();
306         for (ConnectivityService connectivityService: connMap.values()) {
307             Service service = new org.opendaylight.yang.gen.v1.urn
308                 .onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.list.output.ServiceBuilder(
309                     connectivityService).build();
310             serviceMap.put(service.key(), service);
311         }
312         return RpcResultBuilder.success(new GetConnectivityServiceListOutputBuilder().setService(serviceMap)
313             .build()).buildFuture();
314     }
315
316     @Override
317     public ListenableFuture<RpcResult<GetConnectionEndPointDetailsOutput>> getConnectionEndPointDetails(
318             GetConnectionEndPointDetailsInput input) {
319         // TODO Auto-generated method stub
320         Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
321         Uuid nodeUuid = getUuidFromIput(input.getNodeIdOrName());
322         Uuid nepUuid = getUuidFromIput(input.getNepIdOrName());
323         Uuid cepUuid = getUuidFromIput(input.getCepIdOrName());
324         ConnectionEndPoint cep = this.tapiContext.getTapiCEP(topoUuid, nodeUuid, nepUuid, cepUuid);
325         if (cep == null) {
326             LOG.error("Cep doesnt exist in tapi context");
327             return RpcResultBuilder.<GetConnectionEndPointDetailsOutput>failed()
328                 .withError(ErrorType.RPC, "No cep with given Uuid exists in datastore")
329                 .buildFuture();
330         }
331         return RpcResultBuilder.success(new GetConnectionEndPointDetailsOutputBuilder().setConnectionEndPoint(
332             new ConnectionEndPointBuilder(cep).build()).build()).buildFuture();
333     }
334
335     public ImmutableClassToInstanceMap<Rpc<?, ?>> registerRPCs() {
336         return ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
337             .put(CreateConnectivityService.class, this::createConnectivityService)
338             .put(GetConnectivityServiceDetails.class, this::getConnectivityServiceDetails)
339             .put(UpdateConnectivityService.class, this::updateConnectivityService)
340             .put(GetConnectionDetails.class, this::getConnectionDetails)
341             .put(DeleteConnectivityService.class, this::deleteConnectivityService)
342             .put(GetConnectivityServiceList.class, this::getConnectivityServiceList)
343             .put(GetConnectionEndPointDetails.class, this::getConnectionEndPointDetails)
344             .build();
345     }
346
347     private Map<EndPointKey, EndPoint> createEndPoints(
348         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210
349                 .create.connectivity.service.input.EndPointKey,
350             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210
351                 .create.connectivity.service.input.EndPoint> endPoints) {
352         Map<EndPointKey, EndPoint> endPointMap = new HashMap<>();
353         for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210
354                 .create.connectivity.service.input.EndPoint ep: endPoints.values()) {
355             EndPoint endpoint = new EndPointBuilder()
356                 .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
357                     .setServiceInterfacePointUuid(ep.getServiceInterfacePoint().getServiceInterfacePointUuid())
358                     .build())
359                 .setName(ep.getName())
360                 .setAdministrativeState(ep.getAdministrativeState())
361                 .setDirection(ep.getDirection())
362                 .setLifecycleState(ep.getLifecycleState())
363                 .setOperationalState(ep.getOperationalState())
364                 .setLayerProtocolName(ep.getLayerProtocolName())
365              // TODO: implement bandwidth profile
366                 .setCapacity(new CapacityBuilder()
367                     .setTotalSize(new TotalSizeBuilder().build())
368                     .setBandwidthProfile(new BandwidthProfileBuilder().build())
369                     .build())
370                 .setProtectionRole(ep.getProtectionRole())
371                 .setRole(ep.getRole())
372                 .setLocalId(ep.getLocalId())
373                 .build();
374             endPointMap.put(endpoint.key(), endpoint);
375         }
376         return endPointMap;
377     }
378
379     private Uuid getUuidFromIput(String serviceIdOrName) {
380         try {
381             UUID.fromString(serviceIdOrName);
382             LOG.info("Given attribute {} is a UUID", serviceIdOrName);
383             return new Uuid(serviceIdOrName);
384         } catch (IllegalArgumentException e) {
385             LOG.info("Given attribute {} is not a UUID", serviceIdOrName);
386             return new Uuid(UUID.nameUUIDFromBytes(serviceIdOrName.getBytes(StandardCharsets.UTF_8)).toString());
387         }
388     }
389 }