Service-notification handling for PCE
[transportpce.git] / servicehandler / src / main / java / org / opendaylight / transportpce / servicehandler / service / PCEServiceWrapper.java
1 /*
2  * Copyright © 2017 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.servicehandler.service;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11
12 import java.util.concurrent.ExecutionException;
13
14 import org.opendaylight.transportpce.pce.service.PathComputationService;
15 import org.opendaylight.transportpce.servicehandler.MappingConstraints;
16 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
17 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.CancelResourceReserveInput;
18 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.CancelResourceReserveInputBuilder;
19 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.PathComputationRequestInput;
20 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.PathComputationRequestInputBuilder;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.PathComputationRequestOutput;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.ServiceEndpoint;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.sdnc.request.header.SdncRequestHeader;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceCreateInput;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.TempServiceCreateInput;
26 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev171017.RoutingConstraintsSp.PceMetric;
27 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev171017.routing.constraints.sp.HardConstraints;
28 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev171017.routing.constraints.sp.SoftConstraints;
29 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev171016.service.handler.header.ServiceHandlerHeaderBuilder;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 public class PCEServiceWrapper {
34
35     private static final Logger LOG = LoggerFactory.getLogger(PCEServiceWrapper.class);
36
37     private final PathComputationService pathComputationService;
38
39     public PCEServiceWrapper(PathComputationService pathComputationService) {
40         this.pathComputationService = pathComputationService;
41     }
42
43     public PathComputationRequestOutput performPCE(ServiceCreateInput serviceCreateInput, boolean reserveResource) {
44         return performPCE(serviceCreateInput.getHardConstraints(), serviceCreateInput.getSoftConstraints(),
45                 serviceCreateInput.getServiceName(), serviceCreateInput.getSdncRequestHeader(),
46                 serviceCreateInput.getServiceAEnd(), serviceCreateInput.getServiceZEnd(), reserveResource);
47     }
48
49     public PathComputationRequestOutput performPCE(TempServiceCreateInput tempServiceCreateInput,
50             boolean reserveResource) {
51         return performPCE(tempServiceCreateInput.getHardConstraints(), tempServiceCreateInput.getSoftConstraints(),
52                 tempServiceCreateInput.getCommonId(), tempServiceCreateInput.getSdncRequestHeader(),
53                 tempServiceCreateInput.getServiceAEnd(), tempServiceCreateInput.getServiceZEnd(), reserveResource);
54     }
55
56     private PathComputationRequestOutput performPCE(org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains
57             .rev161014.routing.constraints.HardConstraints hardConstraints, org.opendaylight.yang.gen.v1.http.org
58             .openroadm.routing.constrains.rev161014.routing.constraints.SoftConstraints softConstraints,
59             String serviceName, SdncRequestHeader sdncRequestHeader, ServiceEndpoint serviceAEnd,
60             ServiceEndpoint serviceZEnd, boolean reserveResource) {
61         MappingConstraints mappingConstraints = new MappingConstraints(hardConstraints, softConstraints);
62         mappingConstraints.serviceToServicePathConstarints();
63         PathComputationRequestInput pathComputationRequestInput =
64                 createPceRequestInput(serviceName, sdncRequestHeader,mappingConstraints.getServicePathHardConstraints(),
65                         mappingConstraints.getServicePathSoftConstraints(), reserveResource, serviceAEnd,
66                         serviceZEnd);
67         LOG.debug("Calling path computation.");
68         ListenableFuture<PathComputationRequestOutput> pathComputationRequestOutput
69                 = this.pathComputationService.pathComputationRequest(pathComputationRequestInput);
70         LOG.debug("Path computation done.");
71         PathComputationRequestOutput output = null;
72         try {
73             output = pathComputationRequestOutput.get();
74         } catch (InterruptedException | ExecutionException e) {
75             LOG.error("PCE RPC path computation failed !");
76         }
77         return output;
78     }
79
80     private PathComputationRequestInput createPceRequestInput(String serviceName,
81             SdncRequestHeader serviceHandler, HardConstraints hardConstraints,
82             SoftConstraints softConstraints, Boolean reserveResource, ServiceEndpoint serviceAEnd,
83             ServiceEndpoint serviceZEnd) {
84         LOG.info("Mapping ServiceCreateInput or ServiceFeasibilityCheckInput or serviceReconfigureInput to PCE"
85                 + "requests");
86         ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
87         if (serviceHandler != null) {
88             serviceHandlerHeader.setRequestId(serviceHandler.getRequestId());
89         }
90         return new PathComputationRequestInputBuilder()
91             .setServiceName(serviceName)
92             .setResourceReserve(reserveResource)
93             .setServiceHandlerHeader(serviceHandlerHeader.build())
94             .setHardConstraints(hardConstraints)
95             .setSoftConstraints(softConstraints)
96             .setPceMetric(PceMetric.TEMetric)
97             .setServiceAEnd(ModelMappingUtils.createServiceAEnd(serviceAEnd))
98             .setServiceZEnd(ModelMappingUtils.createServiceZEnd(serviceZEnd))
99             .build();
100     }
101
102     private CancelResourceReserveInput mappingCancelResourceReserve(String serviceName,
103                                                                     SdncRequestHeader sdncRequestHeader) {
104         LOG.debug("Mapping ServiceCreateInput or ServiceFeasibilityCheckInput or serviceReconfigureInput to PCE"
105                 + "requests");
106         ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
107         if (sdncRequestHeader != null) {
108             serviceHandlerHeader.setRequestId(sdncRequestHeader.getRequestId());
109         }
110         CancelResourceReserveInputBuilder cancelResourceReserveInput = new CancelResourceReserveInputBuilder()
111                 .setServiceName(serviceName)
112                 .setServiceHandlerHeader(serviceHandlerHeader.build());
113         return cancelResourceReserveInput.build();
114     }
115
116 }