2 * Copyright © 2018 Orange, Inc. and others. All rights reserved.
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
8 package org.opendaylight.transportpce.tapi.connectivity;
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;
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;
96 * Top level service interface providing main TAPI Connectivity services.
98 public class TapiConnectivityImpl implements TapiConnectivityService {
99 private final NetworkTransactionService networkTransactionService;
100 private static final Logger LOG = LoggerFactory.getLogger(TapiConnectivityImpl.class);
102 private OrgOpenroadmServiceService serviceHandler;
103 private final TapiContext tapiContext;
104 private final ConnectivityUtils connectivityUtils;
105 private TapiPceNotificationHandler pceListenerImpl;
106 private TapiRendererNotificationHandler rendererListenerImpl;
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;
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(
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")
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);
151 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
152 .withError(ErrorType.RPC, "Couldnt map Service create input")
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")
163 LOG.error("Unknown UUID");
164 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
165 .withError(ErrorType.RPC, "SIPs do not exist in tapi context")
170 if (output == null) {
171 return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
172 .withError(ErrorType.RPC, "Failed to create service")
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")
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);
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())
192 ConnectivityConstraint conConstr = new ConnectivityConstraintBuilder()
193 .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
194 .setServiceLevel(input.getConnectivityConstraint().getServiceLevel()).build();
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)
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();
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")
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();
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")
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")
255 return RpcResultBuilder.success(new GetConnectionDetailsOutputBuilder().setConnection(
256 new ConnectionBuilder(connection).build()).build()).buildFuture();
260 public ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> deleteConnectivityService(
261 DeleteConnectivityServiceInput input) {
262 // TODO Auto-generated method stub
264 String serviceName = null;
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")
273 if (input.getUuid() != null) {
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)
283 .setSdncRequestHeader(new SdncRequestHeaderBuilder()
284 .setRequestId("request-1")
285 .setNotificationUrl("notification url")
286 .setRequestSystemId("appname")
287 .setRpcAction(RpcActions.ServiceDelete)
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();
296 LOG.error("Failed to delete service. Deletion process failed");
297 } catch (InterruptedException | ExecutionException e) {
298 LOG.error("Failed to delete service.", e);
301 return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
302 .withError(ErrorType.RPC, "Failed to delete Service")
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")
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);
325 return RpcResultBuilder.success(new GetConnectivityServiceListOutputBuilder().setService(serviceMap)
326 .build()).buildFuture();
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");
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)
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())
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())
372 .setProtectionRole(ep.getProtectionRole())
373 .setRole(ep.getRole())
374 .setLocalId(ep.getLocalId())
376 endPointMap.put(endpoint.key(), endpoint);
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)
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))
391 ListenableFuture<Optional<ConnectivityService>> conServFuture =
392 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID);
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) {
404 nameMap = conServ.getName();
407 List<String> nameList = new ArrayList<>();
408 for (Map.Entry<NameKey, Name> entry : nameMap.entrySet()) {
409 nameList.add(entry.getValue().getValueName());