Merge changes I04980c0b,Ib74e699a,I6ca86692,Ida6061da,Iea661424, ...
[transportpce.git] / servicehandler / src / main / java / org / opendaylight / transportpce / servicehandler / ModelMappingUtils.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;
9
10 import com.google.common.collect.ImmutableMap;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
13 import java.util.HashMap;
14 import java.util.Map;
15 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
16 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEnd;
17 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEndBuilder;
18 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEnd;
19 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEndBuilder;
20 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInputBuilder;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.response.parameters.ResponseParametersBuilder;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.TransportAssignmentBuilder;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.McTtpBuilder;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.NmcCtp;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.NmcCtpBuilder;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.NmcCtpKey;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.LifecycleState;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU0;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU1;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2e;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU3;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODUCn;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODUflexCbr;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODUflexFlexe;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODUflexGfp;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODUflexImp;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU0;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU1;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU2;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU2e;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU3;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU4;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTUCn;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTUflex;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OduRateIdentity;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OtuRateIdentity;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInput;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutput;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutputBuilder;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInput;
61 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutput;
62 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutputBuilder;
63 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
64 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
65 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutputBuilder;
66 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
67 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
68 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutputBuilder;
69 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
70 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutput;
71 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutputBuilder;
72 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
73 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutput;
74 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutputBuilder;
75 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
76 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput;
77 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutputBuilder;
78 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput;
79 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutput;
80 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutputBuilder;
81 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
82 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput;
83 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutputBuilder;
84 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
85 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutput;
86 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutputBuilder;
87 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
88 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
89 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesKey;
90 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.services.SupportingServiceHierarchy;
91 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.services.SupportingServiceHierarchyBuilder;
92 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.services.SupportingServiceHierarchyKey;
93 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirection;
94 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
95 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirection;
96 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirectionBuilder;
97 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
98 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescriptionBuilder;
99 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
100 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsBuilder;
101 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey;
102 import org.opendaylight.yangtools.yang.common.RpcResult;
103 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
104 import org.slf4j.Logger;
105 import org.slf4j.LoggerFactory;
106
107 public final class ModelMappingUtils {
108     private static final Logger LOG = LoggerFactory.getLogger(ModelMappingUtils.class);
109
110     private static final ImmutableMap<String, OduRateIdentity> ODU_RATE_MAP =
111         ImmutableMap.<String, OduRateIdentity>builder()
112             .put("ODU0", ODU0.VALUE)
113             .put("ODU1", ODU1.VALUE)
114             .put("ODU2", ODU2.VALUE)
115             .put("ODU2e", ODU2e.VALUE)
116             .put("ODU3", ODU3.VALUE)
117             .put("ODU4", ODU4.VALUE)
118             .put("ODUCn", ODUCn.VALUE)
119             .put("ODUflexCbr", ODUflexCbr.VALUE)
120             .put("ODUflexFlexe", ODUflexFlexe.VALUE)
121             .put("ODUflexGfp", ODUflexGfp.VALUE)
122             .put("ODUflexImp", ODUflexImp.VALUE)
123             .build();
124
125     private static final ImmutableMap<String, OtuRateIdentity> OTU_RATE_MAP =
126         ImmutableMap.<String, OtuRateIdentity>builder()
127             .put("OTU0", OTU0.VALUE)
128             .put("OTU1", OTU1.VALUE)
129             .put("OTU2", OTU2.VALUE)
130             .put("OTU2e", OTU2e.VALUE)
131             .put("OTU3", OTU3.VALUE)
132             .put("OTU4", OTU4.VALUE)
133             .put("OTUCn", OTUCn.VALUE)
134             .put("OTUflex", OTUflex.VALUE)
135             .build();
136
137     private ModelMappingUtils() {
138     }
139
140     public static ServiceImplementationRequestInput createServiceImplementationRequest(
141             ServiceInput input,
142             PathDescription pathDescription) {
143         return new ServiceImplementationRequestInputBuilder()
144             .setConnectionType(input.getConnectionType())
145             .setServiceName(
146                 input.isServiceReconfigure()
147                     ? input.getNewServiceName()
148                     : input.getServiceName())
149             .setServiceAEnd(
150                 new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
151                         .service.implementation.request.input.ServiceAEndBuilder()
152                     .setServiceFormat(input.getServiceAEnd().getServiceFormat())
153                     .setServiceRate(input.getServiceAEnd().getServiceRate())
154                     .setOtuServiceRate(getOtuServiceRate(input.getServiceAEnd().getOtuServiceRate()))
155                     .setOduServiceRate(getOduServiceRate(input.getServiceAEnd().getOduServiceRate()))
156                     .setClli(input.getServiceAEnd().getClli())
157                     .setNodeId(new NodeIdType(input.getServiceAEnd().getNodeId().getValue()).getValue())
158                     .setTxDirection(
159                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
160                                 .service.endpoint.sp.TxDirectionBuilder()
161                             .setPort(
162                                 input.getServiceAEnd().getTxDirection().values().stream().findFirst().orElseThrow()
163                                     .getPort())
164                             .build())
165                     .setRxDirection(
166                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
167                                 .service.endpoint.sp.RxDirectionBuilder()
168                             .setPort(
169                                 input.getServiceAEnd().getRxDirection().values().stream().findFirst().orElseThrow()
170                                     .getPort())
171                             .build())
172                     .build())
173             .setServiceZEnd(
174                 new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
175                         .service.implementation.request.input.ServiceZEndBuilder()
176                     .setServiceFormat(input.getServiceZEnd().getServiceFormat())
177                     .setServiceRate(input.getServiceZEnd().getServiceRate())
178                     .setOtuServiceRate(getOtuServiceRate(input.getServiceZEnd().getOtuServiceRate()))
179                     .setOduServiceRate(getOduServiceRate(input.getServiceZEnd().getOduServiceRate()))
180                     .setClli(input.getServiceZEnd().getClli())
181                     .setNodeId(new NodeIdType(input.getServiceZEnd().getNodeId().getValue()).getValue())
182                     .setTxDirection(
183                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
184                                 .service.endpoint.sp.TxDirectionBuilder()
185                             .setPort(
186                                 input.getServiceZEnd().getTxDirection().values().stream().findFirst().orElseThrow()
187                                     .getPort())
188                             .build())
189                     .setRxDirection(
190                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
191                                 .service.endpoint.sp.RxDirectionBuilder()
192                             .setPort(
193                                 input.getServiceZEnd().getRxDirection().values().stream().findFirst().orElseThrow()
194                                     .getPort())
195                             .build())
196                     .build())
197             .setConnectionType(input.getConnectionType())
198             .setServiceHandlerHeader(
199                 new ServiceHandlerHeaderBuilder().setRequestId(input.getSdncRequestHeader().getRequestId()).build())
200             .setPathDescription(
201                 new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
202                         .service.implementation.request.input.PathDescriptionBuilder()
203                     .setAToZDirection(pathDescription.getAToZDirection())
204                     .setZToADirection(pathDescription.getZToADirection())
205                     .build())
206             .build();
207     }
208
209     private static OduRateIdentity getOduServiceRate(OduRateIdentity oduServiceRate) {
210         if (oduServiceRate == null || !ODU_RATE_MAP.containsKey(oduServiceRate.toString())) {
211             LOG.error("ODU rate {} not recognized", oduServiceRate);
212             return null;
213         }
214         return ODU_RATE_MAP.get(oduServiceRate.toString());
215     }
216
217     private static OtuRateIdentity getOtuServiceRate(OtuRateIdentity otuServiceRate) {
218         if (otuServiceRate == null || !OTU_RATE_MAP.containsKey(otuServiceRate.toString())) {
219             LOG.error("OTU rate {} not recognized", otuServiceRate);
220             return null;
221         }
222         return OTU_RATE_MAP.get(otuServiceRate.toString());
223     }
224
225     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
226             .ServiceDeleteInput createServiceDeleteInput(ServiceInput serviceInput) {
227         return new ServiceDeleteInputBuilder()
228             .setServiceName(serviceInput.getServiceName())
229             .setServiceHandlerHeader(
230                 new ServiceHandlerHeaderBuilder()
231                     .setRequestId(serviceInput.getSdncRequestHeader().getRequestId())
232                     .build())
233             .build();
234     }
235
236     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
237             .ServiceDeleteInput createServiceDeleteInput(
238                 ServiceRerouteInput serviceRerouteinput,
239                 Services services) {
240         return new ServiceDeleteInputBuilder()
241             .setServiceName(serviceRerouteinput.getServiceName())
242             .setServiceHandlerHeader(
243                 new ServiceHandlerHeaderBuilder()
244                     .setRequestId(services.getSdncRequestHeader().getRequestId())
245                     .build())
246             .build();
247     }
248
249     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
250             .ServiceDeleteInput createServiceDeleteInput(
251                 ServiceRestorationInput serviceRestorationInput,
252                 Services services) {
253         return new ServiceDeleteInputBuilder()
254             .setServiceName(serviceRestorationInput.getServiceName())
255             .setServiceHandlerHeader(
256                 new ServiceHandlerHeaderBuilder()
257                     .setRequestId(services.getSdncRequestHeader().getRequestId())
258                     .build())
259             .build();
260     }
261
262     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
263             .ServiceDeleteInput createServiceDeleteInput(ServiceReconfigureInput serviceReconfigureInput) {
264         String serviceName = serviceReconfigureInput.getServiceName();
265         return new ServiceDeleteInputBuilder()
266             .setServiceName(serviceName)
267             .setServiceHandlerHeader(
268                 new ServiceHandlerHeaderBuilder().setRequestId(serviceName + "-reconfigure").build())
269             .build();
270     }
271
272     public static ServiceAEnd createServiceAEnd(ServiceEndpoint serviceAEnd) {
273         return new ServiceAEndBuilder()
274             .setClli(serviceAEnd.getClli())
275             .setNodeId(serviceAEnd.getNodeId().getValue())
276             .setRxDirection(createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst().orElseThrow()))
277             .setServiceFormat(serviceAEnd.getServiceFormat())
278             .setServiceRate(serviceAEnd.getServiceRate())
279             .setTxDirection(createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow()))
280             .build();
281     }
282
283     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
284             .path.computation.reroute.request.input.ServiceAEnd createServiceAEndReroute(ServiceEndpoint serviceAEnd) {
285         return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
286                     .path.computation.reroute.request.input.ServiceAEndBuilder()
287                 .setClli(serviceAEnd.getClli())
288                 .setNodeId(serviceAEnd.getNodeId().getValue())
289                 .setRxDirection(createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst()
290                         .orElseThrow()))
291                 .setServiceFormat(serviceAEnd.getServiceFormat())
292                 .setServiceRate(serviceAEnd.getServiceRate())
293                 .setTxDirection(createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst()
294                         .orElseThrow()))
295                 .build();
296     }
297
298     public static ServiceZEnd createServiceZEnd(ServiceEndpoint serviceZEnd) {
299         return new ServiceZEndBuilder()
300             .setClli(serviceZEnd.getClli())
301             .setNodeId(serviceZEnd.getNodeId().getValue())
302             .setRxDirection(createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst().orElseThrow()))
303             .setServiceFormat(serviceZEnd.getServiceFormat())
304             .setServiceRate(serviceZEnd.getServiceRate())
305             .setTxDirection(createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow()))
306             .build();
307     }
308
309     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
310             .path.computation.reroute.request.input.ServiceZEnd createServiceZEndReroute(ServiceEndpoint serviceZEnd) {
311         return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
312                     .path.computation.reroute.request.input.ServiceZEndBuilder()
313                 .setClli(serviceZEnd.getClli())
314                 .setNodeId(serviceZEnd.getNodeId().getValue())
315                 .setRxDirection(createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst()
316                         .orElseThrow()))
317                 .setServiceFormat(serviceZEnd.getServiceFormat())
318                 .setServiceRate(serviceZEnd.getServiceRate())
319                 .setTxDirection(createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst()
320                         .orElseThrow()))
321                 .build();
322     }
323
324     public static RxDirection createRxDirection(
325             org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
326                 .service.endpoint.RxDirection rxDirection) {
327         return new RxDirectionBuilder().setPort(rxDirection.getPort()).build();
328     }
329
330     public static TxDirection createTxDirection(
331             org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
332                 .service.endpoint.TxDirection txDirection) {
333         return new TxDirectionBuilder().setPort(txDirection.getPort()).build();
334     }
335
336     public static ListenableFuture<RpcResult<ServiceDeleteOutput>> createDeleteServiceReply(
337             ServiceDeleteInput input, String finalAck, String message, String responseCode) {
338         return RpcResultBuilder
339             .success(
340                 new ServiceDeleteOutputBuilder()
341                     .setConfigurationResponseCommon(
342                         new ConfigurationResponseCommonBuilder()
343                             .setAckFinalIndicator(finalAck)
344                             .setResponseMessage(message)
345                             .setResponseCode(responseCode)
346                             .setRequestId(
347                                 input.getSdncRequestHeader() == null
348                                     ? null
349                                     : input.getSdncRequestHeader().getRequestId())
350                             .build())
351                     .build())
352             .buildFuture();
353     }
354
355     public static ListenableFuture<RpcResult<TempServiceDeleteOutput>> createDeleteServiceReply(
356             TempServiceDeleteInput input, String finalAck, String message, String responseCode) {
357         return RpcResultBuilder
358             .success(
359                 new TempServiceDeleteOutputBuilder()
360                     .setConfigurationResponseCommon(
361                         new ConfigurationResponseCommonBuilder()
362                             .setAckFinalIndicator(finalAck)
363                             .setResponseMessage(message)
364                             .setResponseCode(responseCode)
365                             .setRequestId(null)
366                             .build())
367                     .build())
368             .buildFuture();
369     }
370
371     public static ListenableFuture<RpcResult<ServiceCreateOutput>> createCreateServiceReply(
372             ServiceCreateInput input, String finalAck, String message, String responseCode) {
373         return RpcResultBuilder
374             .success(
375                 new ServiceCreateOutputBuilder()
376                     .setConfigurationResponseCommon(
377                         new ConfigurationResponseCommonBuilder()
378                             .setAckFinalIndicator(finalAck)
379                             .setResponseMessage(message)
380                             .setResponseCode(responseCode)
381                             .setRequestId(
382                                 input.getSdncRequestHeader() == null
383                                     ? null
384                                     : input.getSdncRequestHeader().getRequestId())
385                             .build())
386                     .setResponseParameters(new ResponseParametersBuilder().build())
387                     .build())
388             .buildFuture();
389     }
390
391     public static ListenableFuture<RpcResult<TempServiceCreateOutput>> createCreateServiceReply(
392             TempServiceCreateInput input, String finalAck, String message, String responseCode) {
393         return RpcResultBuilder
394             .success(
395                 new TempServiceCreateOutputBuilder()
396                     .setConfigurationResponseCommon(
397                         new ConfigurationResponseCommonBuilder()
398                             .setAckFinalIndicator(finalAck)
399                              .setResponseMessage(message)
400                             .setResponseCode(responseCode)
401                             .setRequestId(
402                                 input.getSdncRequestHeader() == null
403                                     ? null
404                                     : input.getSdncRequestHeader().getRequestId())
405                             .build())
406                     .setResponseParameters(new ResponseParametersBuilder().build())
407                     .build())
408             .buildFuture();
409     }
410
411     public static ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> createCreateServiceReply(
412             ServiceFeasibilityCheckInput input, String finalAck, String message, String responseCode) {
413         return RpcResultBuilder
414             .success(
415                 new ServiceFeasibilityCheckOutputBuilder()
416                     .setConfigurationResponseCommon(
417                         new ConfigurationResponseCommonBuilder()
418                             .setAckFinalIndicator(finalAck)
419                             .setResponseMessage(message)
420                             .setResponseCode(responseCode)
421                             .setRequestId(
422                                 input.getSdncRequestHeader() == null
423                                     ? null
424                                     : input.getSdncRequestHeader().getRequestId())
425                             .build())
426                     .setResponseParameters(new ResponseParametersBuilder().build())
427                     .build())
428             .buildFuture();
429     }
430
431     public static ListenableFuture<RpcResult<ServiceReconfigureOutput>> createCreateServiceReply(
432             ServiceReconfigureInput input, String message) {
433         return RpcResultBuilder
434             .success(
435                 new ServiceReconfigureOutputBuilder()
436                     .setConfigurationResponseCommon(
437                         new ConfigurationResponseCommonBuilder()
438                             .setResponseMessage(message)
439                             .build())
440                     .build())
441             .buildFuture();
442     }
443
444     public static ListenableFuture<RpcResult<ServiceRerouteOutput>> createRerouteServiceReply(
445             ServiceRerouteInput input, String finalAckYes, String message, String responseCode) {
446         return RpcResultBuilder
447             .success(
448                 new ServiceRerouteOutputBuilder()
449                     .setConfigurationResponseCommon(
450                         new ConfigurationResponseCommonBuilder()
451                              .setAckFinalIndicator(finalAckYes)
452                              .setResponseCode(responseCode)
453                              .setResponseMessage(message)
454                              .build())
455                     .setHardConstraints(null)
456                     .setSoftConstraints(null)
457                     .build())
458             .buildFuture();
459     }
460
461     public static ListenableFuture<RpcResult<ServiceRestorationOutput>> createRestoreServiceReply(String message) {
462         return RpcResultBuilder
463             .success(
464                 new ServiceRestorationOutputBuilder()
465                     .setConfigurationResponseCommon(
466                         new ConfigurationResponseCommonBuilder()
467                             .setResponseMessage(message)
468                             .build())
469                     .build())
470             .buildFuture();
471     }
472
473     public static Services mappingServices(
474             ServiceCreateInput serviceCreateInput,
475             ServiceReconfigureInput serviceReconfigureInput) {
476         if (serviceCreateInput != null) {
477             return new ServicesBuilder()
478                 .setServiceName(serviceCreateInput.getServiceName())
479                 .setAdministrativeState(AdminStates.OutOfService)
480                 .setOperationalState(State.OutOfService)
481                 .setCommonId(serviceCreateInput.getCommonId())
482                 .setConnectionType(serviceCreateInput.getConnectionType())
483                 .setCustomer(serviceCreateInput.getCustomer())
484                 .setCustomerContact(serviceCreateInput.getCustomerContact())
485                 .setServiceResiliency(serviceCreateInput.getServiceResiliency())
486                 .setHardConstraints(serviceCreateInput.getHardConstraints())
487                 .setSoftConstraints(serviceCreateInput.getSoftConstraints())
488                 .setSdncRequestHeader(serviceCreateInput.getSdncRequestHeader())
489                 .setLifecycleState(LifecycleState.Planned)
490                 .setServiceAEnd(
491                     new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
492                             .service.ServiceAEndBuilder(serviceCreateInput.getServiceAEnd())
493                         .build())
494                 .setServiceZEnd(
495                     new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
496                             .service.ServiceZEndBuilder(serviceCreateInput.getServiceZEnd())
497                         .build())
498                 .build();
499         }
500         if (serviceReconfigureInput != null) {
501             return new ServicesBuilder()
502                 .setServiceName(serviceReconfigureInput.getServiceName())
503                 .setAdministrativeState(AdminStates.OutOfService)
504                 .setOperationalState(State.OutOfService)
505                 .setCommonId(serviceReconfigureInput.getCommonId())
506                 .setConnectionType(serviceReconfigureInput.getConnectionType())
507                 .setCustomer(serviceReconfigureInput.getCustomer())
508                 .setCustomerContact(serviceReconfigureInput.getCustomerContact())
509                 .setHardConstraints(serviceReconfigureInput.getHardConstraints())
510                 .setSoftConstraints(serviceReconfigureInput.getSoftConstraints())
511                 .setLifecycleState(LifecycleState.Planned)
512                 .setServiceAEnd(
513                     new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
514                             .service.ServiceAEndBuilder(serviceReconfigureInput.getServiceAEnd())
515                         .build())
516                 .setServiceZEnd(
517                     new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
518                             .service.ServiceZEndBuilder(serviceReconfigureInput.getServiceZEnd())
519                         .build())
520                 .build();
521         }
522         //FIXME: Because of Silicon, we cannot have empty key.
523         //it's this case possible ? There is a Junit test covering null
524         //temporary workaround as now there is a null key check done by yangtools.
525         //Functional review is needed
526         LOG.warn("ServiceCreateInput and ServiceReconfigureInput are null");
527         return new ServicesBuilder().withKey(new ServicesKey("unknown")).build();
528     }
529
530     public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
531             .temp.service.list.Services mappingServices(TempServiceCreateInput tempServiceCreateInput,
532                                                         PathDescription pathDescription) {
533         Map<SupportingServiceHierarchyKey, SupportingServiceHierarchy> supportingServiceHierarchyMap = new HashMap<>();
534         Map<NmcCtpKey, NmcCtp> nmcCtpMap = new HashMap<>();
535         SupportingServiceHierarchyKey supportingServiceHierarchyKey = new SupportingServiceHierarchyKey(
536                 tempServiceCreateInput.getCommonId());
537         // TODO: here we assume the A-Z and Z-A has parameters
538         LOG.info("Min and Max frequencies are {} {}", pathDescription.getAToZDirection().getAToZMinFrequency(),
539                 pathDescription.getAToZDirection().getAToZMinFrequency());
540         nmcCtpMap.put(
541             new NmcCtpKey("1"),
542             new NmcCtpBuilder()
543                 .setId("1")
544                 .setFrequency(pathDescription.getAToZDirection().getCentralFrequency())
545                 .setWidth(pathDescription.getAToZDirection().getWidth())
546                 .build());
547         supportingServiceHierarchyMap.put(
548             supportingServiceHierarchyKey,
549             new SupportingServiceHierarchyBuilder().setServiceIdentifier(tempServiceCreateInput.getCommonId())
550                 .setTransportAssignment(
551                     new TransportAssignmentBuilder()
552                         .setMcTtp(
553                             new McTtpBuilder()
554                                 .setMaxFreq(pathDescription.getAToZDirection().getAToZMaxFrequency())
555                                 .setMinFreq(pathDescription.getAToZDirection().getAToZMinFrequency())
556                                 .build())
557                         .setNmcCtp(nmcCtpMap)
558                         .build())
559                 .build());
560         return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
561                 .temp.service.list.ServicesBuilder()
562             .setServiceName(tempServiceCreateInput.getCommonId())
563             .setAdministrativeState(AdminStates.OutOfService)
564             .setOperationalState(State.OutOfService)
565             .setCommonId(tempServiceCreateInput.getCommonId())
566             .setConnectionType(tempServiceCreateInput.getConnectionType())
567             .setCustomer(tempServiceCreateInput.getCustomer())
568             .setCustomerContact(tempServiceCreateInput.getCustomerContact())
569             .setHardConstraints(tempServiceCreateInput.getHardConstraints())
570             .setSoftConstraints(tempServiceCreateInput.getSoftConstraints())
571             .setSdncRequestHeader(tempServiceCreateInput.getSdncRequestHeader())
572             .setLifecycleState(LifecycleState.Planned)
573             .setServiceAEnd(
574                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
575                     .service.ServiceAEndBuilder(tempServiceCreateInput.getServiceAEnd()).build())
576             .setServiceZEnd(
577                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
578                     .service.ServiceZEndBuilder(tempServiceCreateInput.getServiceZEnd()).build())
579             .setSupportingServiceHierarchy(supportingServiceHierarchyMap)
580             .build();
581     }
582
583     public static ServicePaths mappingServicePaths(ServiceInput serviceInput, PathComputationRequestOutput output) {
584         if (serviceInput == null) {
585             //FIXME: Because of Silicon, we cannot have empty key.
586             //it's this case possible ? There is a Junit test covering null
587             //temporary workaround as now there is a null key check done by yangtools.
588             //Functional review is needed
589             LOG.warn("ServiceInput is null");
590             return new ServicePathsBuilder().withKey(new ServicePathsKey("unknown")).build();
591         }
592
593         ServicePathsBuilder servicePathBuilder =
594             new ServicePathsBuilder()
595                 .setServiceAEnd(
596                     new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
597                             .service.path.ServiceAEndBuilder()
598                         .setServiceFormat(serviceInput.getServiceAEnd().getServiceFormat())
599                         .setServiceRate(serviceInput.getServiceAEnd().getServiceRate())
600                         .setClli(serviceInput.getServiceAEnd().getClli())
601                         .setNodeId(new NodeIdType(serviceInput.getServiceAEnd().getNodeId().getValue()).getValue())
602                         .setTxDirection(
603                             new org.opendaylight.yang.gen.v1
604                                     .http.org.transportpce.b.c._interface.service.types.rev220118
605                                         .service.endpoint.sp.TxDirectionBuilder()
606                                 .setPort(
607                                     serviceInput.getServiceAEnd().getTxDirection()
608                                         .values().stream().findFirst().orElseThrow().getPort())
609                                 .build())
610                         .setRxDirection(
611                             new org.opendaylight.yang.gen.v1
612                                     .http.org.transportpce.b.c._interface.service.types.rev220118
613                                         .service.endpoint.sp.RxDirectionBuilder()
614                                 .setPort(
615                                     serviceInput.getServiceAEnd().getRxDirection()
616                                         .values().stream().findFirst().orElseThrow().getPort())
617                                 .build())
618                         .build())
619                 .setServiceZEnd(
620                     new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
621                             .service.path.ServiceZEndBuilder()
622                         .setServiceFormat(serviceInput.getServiceZEnd().getServiceFormat())
623                         .setServiceRate(serviceInput.getServiceZEnd().getServiceRate())
624                         .setClli(serviceInput.getServiceZEnd().getClli())
625                         .setNodeId(new NodeIdType(serviceInput.getServiceZEnd().getNodeId().getValue()).getValue())
626                         .setTxDirection(
627                             new org.opendaylight.yang.gen.v1
628                                     .http.org.transportpce.b.c._interface.service.types.rev220118
629                                         .service.endpoint.sp.TxDirectionBuilder()
630                                 .setPort(
631                                     serviceInput.getServiceZEnd().getTxDirection()
632                                         .values().stream().findFirst().orElseThrow().getPort())
633                                 .build())
634                         .setRxDirection(
635                             new org.opendaylight.yang.gen.v1
636                                     .http.org.transportpce.b.c._interface.service.types.rev220118
637                                         .service.endpoint.sp.RxDirectionBuilder()
638                                 .setPort(
639                                     serviceInput.getServiceZEnd().getRxDirection()
640                                         .values().stream().findFirst().orElseThrow().getPort())
641                                 .build())
642                         .build())
643                 .setServicePathName(serviceInput.getServiceName())
644                 .setServiceHandlerHeader(
645                     new ServiceHandlerHeaderBuilder()
646                         .setRequestId(serviceInput.getSdncRequestHeader()
647                         .getRequestId())
648                         .build());
649         if (serviceInput.getHardConstraints() != null) {
650             servicePathBuilder.setHardConstraints(serviceInput.getHardConstraints());
651         }
652         if (serviceInput.getSoftConstraints() != null) {
653             servicePathBuilder.setSoftConstraints(serviceInput.getSoftConstraints());
654         }
655
656         if (output.getResponseParameters().getPathDescription() != null) {
657             servicePathBuilder.setPathDescription(
658                 new PathDescriptionBuilder(output.getResponseParameters().getPathDescription()).build());
659         }
660         return servicePathBuilder.build();
661     }
662
663
664     @SuppressFBWarnings(
665         value = "PZLA_PREFER_ZERO_LENGTH_ARRAYS",
666         justification = "not relevant to return and zero length array as we need real pos")
667     public static int[] findTheLongestSubstring(String s1, String s2) {
668         if ((s1 == null) || (s2 == null)) {
669             return null;
670         }
671         int[][] dp = new int[s1.length() + 1][s2.length() + 1];
672         int maxLen = 0;
673         int endPos = 0;
674         for (int i = 1; i < dp.length; i++) {
675             for (int j = 1; j < dp[0].length; j++) {
676                 char ch1 = s1.charAt(i - 1);
677                 char ch2 = s2.charAt(j - 1);
678                 if (ch1 == ch2) {
679                     dp[i][j] = dp[i - 1][j - 1] + 1;
680                     if (dp[i][j] >= maxLen) {
681                         maxLen = dp[i][j];
682                         endPos = i;
683                     }
684                 }
685             }
686         }
687         return new int[] { endPos - maxLen, endPos };
688     }
689
690     public static ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
691         addOpenroadmServiceReply(AddOpenroadmOperationalModesToCatalogInput input, String finalAck,
692                                  String message,String responseCode) {
693         return RpcResultBuilder
694             .success(
695                 new AddOpenroadmOperationalModesToCatalogOutputBuilder()
696                     .setConfigurationResponseCommon(
697                         new ConfigurationResponseCommonBuilder()
698                                 .setAckFinalIndicator(finalAck)
699                                 .setResponseMessage(message)
700                             .setResponseCode(responseCode)
701                                 .setRequestId(
702                                         input.getSdncRequestHeader() == null
703                                                 ? null
704                                                 : input.getSdncRequestHeader().getRequestId())
705                             .build())
706                     .build())
707             .buildFuture();
708     }
709
710     public static ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>>
711         addSpecificOpenroadmServiceReply(AddSpecificOperationalModesToCatalogInput input, String finalAck,
712                                          String message,String responseCode) {
713         return RpcResultBuilder
714                 .success(
715                         new AddSpecificOperationalModesToCatalogOutputBuilder()
716                                 .setConfigurationResponseCommon(
717                                         new ConfigurationResponseCommonBuilder()
718                                                 .setAckFinalIndicator(finalAck)
719                                                 .setResponseMessage(message)
720                                                 .setResponseCode(responseCode)
721                                                 .setRequestId(
722                                                         input.getSdncRequestHeader() == null
723                                                                 ? null
724                                                                 : input.getSdncRequestHeader().getRequestId())
725                                                 .build())
726                                 .build())
727                 .buildFuture();
728     }
729
730 }