2 * Copyright © 2017 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
9 package org.opendaylight.transportpce.servicehandler;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import com.google.common.util.concurrent.ListeningExecutorService;
13 import com.google.common.util.concurrent.MoreExecutors;
15 import java.util.concurrent.Callable;
16 import java.util.concurrent.CancellationException;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.Executors;
19 import java.util.concurrent.Future;
21 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.CancelResourceReserveInput;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.CancelResourceReserveInputBuilder;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.CancelResourceReserveOutput;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.PathComputationRequestInput;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.PathComputationRequestInputBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.PathComputationRequestOutput;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.StubpceService;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.path.computation.request.input.ServiceAEnd;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.path.computation.request.input.ServiceAEndBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.path.computation.request.input.ServiceZEnd;
32 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.path.computation.request.input.ServiceZEndBuilder;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.RpcActions;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.ServiceEndpoint;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.sdnc.request.header.SdncRequestHeader;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.sdnc.request.header.SdncRequestHeaderBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceCreateInput;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceFeasibilityCheckInput;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceReconfigureInput;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.service.list.Services;
41 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.RoutingConstraintsSp.PceMetric;
42 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.routing.constraints.sp.HardConstraints;
43 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.routing.constraints.sp.SoftConstraints;
44 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.RxDirection;
45 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.RxDirectionBuilder;
46 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.TxDirection;
47 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.TxDirectionBuilder;
48 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.handler.header.ServiceHandlerHeaderBuilder;
49 import org.opendaylight.yangtools.yang.common.RpcResult;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
55 * class for Mapping and Sending PCE requests : - path-computation-request -
56 * cancel-resource-reserve.
58 * @author <a href="mailto:martial.coulibaly@gfi.com">Martial Coulibaly</a> on behalf of Orange
61 public class MappingAndSendingPCRequest {
63 private static final Logger LOG = LoggerFactory.getLogger(MappingAndSendingPCRequest.class);
64 /** Permit to call PCE RPCs. */
65 private StubpceService service;
66 /** define procedure success (or not ). */
67 private Boolean success;
68 /** permit to call bundle service (PCE, Renderer, Servicehandler. */
69 private RpcProviderRegistry rpcRegistry;
70 PathComputationRequestInput pathComputationRequestInput = null;
71 CancelResourceReserveInput cancelResourceReserveInput = null;
72 HardConstraints hard = null;
73 SoftConstraints soft = null;
74 private ServiceAEnd serviceAEndSp;
75 private ServiceZEnd serviceZEndSp;
76 /** store all error messages. */
78 private final ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
81 * MappingAndSendingPCRequest Class constructor for RPC serviceReconfigure.
85 * @param serviceReconfigureInput
86 * serviceReconfigureInput
88 * Boolean to define resource reserve
90 public MappingAndSendingPCRequest(RpcProviderRegistry rpcRegistry, ServiceReconfigureInput serviceReconfigureInput,
91 Boolean resvResource) {
92 this.setRpcRegistry(rpcRegistry);
93 if (rpcRegistry != null) {
94 service = rpcRegistry.getRpcService(StubpceService.class);
96 endpointToEndpointStubpce(serviceReconfigureInput.getServiceAEnd(), serviceReconfigureInput.getServiceZEnd());
97 SdncRequestHeader head = new SdncRequestHeaderBuilder()
98 .setRequestId("reconfigure_" + serviceReconfigureInput.getServiceName())
99 .setRpcAction(RpcActions.ServiceReconfigure)
101 MappingConstraints map = new MappingConstraints(serviceReconfigureInput.getHardConstraints(),
102 serviceReconfigureInput.getSoftConstraints());
103 map.serviceToServicePathConstarints();
105 * mappingPCRequest(serviceReconfigureInput.getNewServiceName(),
106 * serviceReconfigureInput.getHardConstraints(),
107 * serviceReconfigureInput.getSoftConstraints(),head ,resvResource);
109 mappingPCRequest(serviceReconfigureInput.getNewServiceName(),serviceAEndSp, serviceZEndSp,
110 map.getServicePathHardConstraints(), map.getServicePathSoftConstraints(), head, resvResource);
116 * MappingAndSendingPCRequest Class constructor for RPC
117 * serviceFeasibilityCheck.
120 * RpcProviderRegistry
121 * @param serviceFeasibilityCheckInput
122 * ServiceFeasibilityCheckInput
123 * @param resvResource
124 * Boolean to reserve resource
126 public MappingAndSendingPCRequest(RpcProviderRegistry rpcRegistry,
127 ServiceFeasibilityCheckInput serviceFeasibilityCheckInput, Boolean resvResource) {
128 this.setRpcRegistry(rpcRegistry);
129 if (rpcRegistry != null) {
130 service = rpcRegistry.getRpcService(StubpceService.class);
132 endpointToEndpointStubpce(serviceFeasibilityCheckInput.getServiceAEnd(),
133 serviceFeasibilityCheckInput.getServiceZEnd());
134 MappingConstraints map = new MappingConstraints(serviceFeasibilityCheckInput.getHardConstraints(),
135 serviceFeasibilityCheckInput.getSoftConstraints());
136 map.serviceToServicePathConstarints();
137 mappingPCRequest("no name",serviceAEndSp, serviceZEndSp, map.getServicePathHardConstraints(),
138 map.getServicePathSoftConstraints(), serviceFeasibilityCheckInput.getSdncRequestHeader(),
145 * MappingAndSendingPCRequest Class constructor for RPC serviceCreate.
148 * RpcProviderRegistry
149 * @param serviceCreateInput
151 * @param resvResource
152 * Boolean to reserve resource
154 public MappingAndSendingPCRequest(RpcProviderRegistry rpcRegistry, ServiceCreateInput serviceCreateInput,
155 Boolean resvResource) {
156 this.setRpcRegistry(rpcRegistry);
157 if (rpcRegistry != null) {
158 service = rpcRegistry.getRpcService(StubpceService.class);
160 endpointToEndpointStubpce(serviceCreateInput.getServiceAEnd(), serviceCreateInput.getServiceZEnd());
161 MappingConstraints map = new MappingConstraints(serviceCreateInput.getHardConstraints(),
162 serviceCreateInput.getSoftConstraints());
163 map.serviceToServicePathConstarints();
164 mappingPCRequest(serviceCreateInput.getServiceName(),serviceAEndSp, serviceZEndSp,
165 map.getServicePathHardConstraints(), map.getServicePathSoftConstraints(),
166 serviceCreateInput.getSdncRequestHeader(), resvResource);
172 * MappingAndSendingPCRequest Class constructor for modify Service in ODL
176 * RpcProviderRegistry
179 * @param resvResource
180 * Boolean to reserve resource
182 public MappingAndSendingPCRequest(RpcProviderRegistry rpcRegistry, Services input, Boolean resvResource) {
183 this.setRpcRegistry(rpcRegistry);
184 if (rpcRegistry != null) {
185 service = rpcRegistry.getRpcService(StubpceService.class);
187 endpointToEndpointStubpce(input.getServiceAEnd(), input.getServiceZEnd());
188 MappingConstraints map = new MappingConstraints(input.getHardConstraints(), input.getSoftConstraints());
189 map.serviceToServicePathConstarints();
190 mappingPCRequest(input.getServiceName(),serviceAEndSp, serviceZEndSp, map.getServicePathHardConstraints(),
191 map.getServicePathSoftConstraints(), input.getSdncRequestHeader(), resvResource);
197 public void endpointToEndpointStubpce(ServiceEndpoint serviceAEnd, ServiceEndpoint serviceZEnd) {
198 LOG.info("Mapping Service Endpoint to Service Endpoint Stubpce");
199 TxDirection txDirection = null;
200 RxDirection rxDirection = null;
201 if (serviceAEnd != null && serviceZEnd != null) {
202 txDirection = new TxDirectionBuilder()
203 .setPort(serviceAEnd.getTxDirection().getPort())
205 rxDirection = new RxDirectionBuilder()
206 .setPort(serviceAEnd.getRxDirection().getPort())
208 serviceAEndSp = new ServiceAEndBuilder()
209 .setClli(serviceAEnd.getClli())
210 .setNodeId(serviceAEnd.getNodeId())
211 .setServiceFormat(serviceAEnd.getServiceFormat())
212 .setServiceRate(serviceAEnd.getServiceRate())
213 .setTxDirection(txDirection)
214 .setRxDirection(rxDirection)
217 txDirection = new TxDirectionBuilder()
218 .setPort(serviceZEnd.getTxDirection().getPort())
220 rxDirection = new RxDirectionBuilder()
221 .setPort(serviceZEnd.getRxDirection().getPort())
223 serviceZEndSp = new ServiceZEndBuilder()
224 .setClli(serviceZEnd.getClli())
225 .setNodeId(serviceZEnd.getNodeId())
226 .setServiceFormat(serviceZEnd.getServiceFormat())
227 .setServiceRate(serviceZEnd.getServiceRate())
228 .setTxDirection(txDirection)
229 .setRxDirection(rxDirection)
235 * Build pathComputationRequestInput or cancelResourceReserveInput with
236 * input parameters (serviceReconfigureInput or serviceFeasibilityCheckInput.
240 * @param zend Service ZEnd
241 * @param aend Service AEnd
242 * @param HardConstraints
244 * @param SoftConstraints
246 * @param SdncRequestHeader
251 private void mappingPCRequest(String serviceName, ServiceAEnd aend, ServiceZEnd zend,
252 HardConstraints hardConstraints, SoftConstraints softConstraints, org.opendaylight.yang.gen.v1.http.org
253 .openroadm.common.service.types.rev161014.sdnc.request.header.SdncRequestHeader sdncRequestHeader,
254 Boolean resvResource) {
256 LOG.info("Mapping ServiceCreateInput or ServiceFeasibilityCheckInput or serviceReconfigureInput "
257 + "to PCE requests");
259 HardConstraints serviceCreateHard = hardConstraints;
260 SoftConstraints serviceCreateSoft = softConstraints;
261 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.routing
262 .constraints.sp.HardConstraints pceHardConstraints = null;
263 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.routing
264 .constraints.sp.SoftConstraints pceSoftConstraints = null;
265 if (serviceCreateHard != null) {
266 pceHardConstraints = serviceCreateHard;
268 if (serviceCreateSoft != null) {
269 pceSoftConstraints = serviceCreateSoft;
272 ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
273 if (sdncRequestHeader != null) {
274 serviceHandlerHeader.setRequestId(sdncRequestHeader.getRequestId());
277 /** PathComputationRequestInput build */
278 pathComputationRequestInput = new PathComputationRequestInputBuilder()
279 .setServiceName(serviceName)
280 .setResourceReserve(resvResource)
281 .setServiceHandlerHeader(serviceHandlerHeader.build())
282 .setServiceAEnd(aend)
283 .setServiceZEnd(zend)
284 .setHardConstraints(pceHardConstraints)
285 .setSoftConstraints(pceSoftConstraints)
286 .setPceMetric(PceMetric.TEMetric).build();
288 /** CancelResourceReserveInput build */
289 cancelResourceReserveInput = new CancelResourceReserveInputBuilder().setServiceName(serviceName)
290 .setServiceHandlerHeader(serviceHandlerHeader.build()).build();
295 * Send cancelResourceReserve request to PCE.
297 * @return Boolean true if success, false else
299 public ListenableFuture<Boolean> cancelResourceReserve() {
301 return executor.submit(new Callable<Boolean>() {
303 public Boolean call() throws Exception {
304 Boolean output = false;
305 if (cancelResourceReserveInput != null) {
306 RpcResult<CancelResourceReserveOutput> pceOutputResult = null;
307 Future<RpcResult<CancelResourceReserveOutput>> pceOutputFuture = service
308 .cancelResourceReserve(cancelResourceReserveInput);
310 pceOutputResult = pceOutputFuture.get();
311 } catch (InterruptedException | CancellationException | ExecutionException e) {
312 setError("Did not receive the expected response from pce to cancelResourceReserve RPC "
315 pceOutputFuture.cancel(true);
318 if (pceOutputResult != null && pceOutputResult.isSuccessful()) {
319 LOG.info("PCE replied to CancelResource request !");
324 LOG.info("cancelResourceReserveInput parameter not valid !");
333 * Send pathComputationRequest request to PCE.
335 * @return Boolean true if success, false else
337 public ListenableFuture<Boolean> pathComputationRequest() {
338 LOG.info("In pathComputationRequest ...");
340 return executor.submit(new Callable<Boolean>() {
342 public Boolean call() throws Exception {
343 RpcResult<PathComputationRequestOutput> pceOutputResult = null;
344 Boolean output = false;
345 if (pathComputationRequestInput != null) {
346 LOG.info("pathComputationRequestInput : " + pathComputationRequestInput.toString());
347 Future<RpcResult<PathComputationRequestOutput>> pceOutputFuture = service
348 .pathComputationRequest(pathComputationRequestInput);
350 pceOutputResult = pceOutputFuture.get();
351 } catch (InterruptedException | CancellationException | ExecutionException e) {
352 setError("Did not receive the expected response from pce to pathComputationRequest RPC "
355 pceOutputFuture.cancel(true);
357 if (pceOutputResult != null && pceOutputResult.isSuccessful()) {
360 LOG.info("PCE replied to pathComputation request !");
363 LOG.info("pathComputationRequestInput parameter not valid !");
370 public Boolean getSuccess() {
374 public void setSuccess(Boolean success) {
375 this.success = success;
378 public String getError() {
382 public void setError(String error) {
386 public RpcProviderRegistry getRpcRegistry() {
390 public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
391 this.rpcRegistry = rpcRegistry;
394 public ServiceAEnd getServiceAEndSp() {
395 return serviceAEndSp;
398 public void setServiceAEndSp(ServiceAEnd serviceAEndSp) {
399 this.serviceAEndSp = serviceAEndSp;
402 public ServiceZEnd getServiceZEndSp() {
403 return serviceZEndSp;
406 public void setServiceZEndSp(ServiceZEnd serviceZEndSp) {
407 this.serviceZEndSp = serviceZEndSp;