Fix bug service-create
[transportpce.git] / servicehandler / src / main / java / org / opendaylight / transportpce / servicehandler / impl / ServicehandlerImpl.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.impl;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.time.OffsetDateTime;
12 import java.time.ZoneOffset;
13 import java.time.format.DateTimeFormatter;
14 import java.util.Optional;
15 import org.opendaylight.mdsal.binding.api.DataBroker;
16 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
17 import org.opendaylight.transportpce.common.OperationResult;
18 import org.opendaylight.transportpce.common.ResponseCodes;
19 import org.opendaylight.transportpce.pce.service.PathComputationService;
20 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
21 import org.opendaylight.transportpce.servicehandler.DowngradeConstraints;
22 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
23 import org.opendaylight.transportpce.servicehandler.ServiceInput;
24 import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
25 import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
26 import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
27 import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
28 import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
29 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
30 import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
31 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
32 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
33 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddOpenroadmOperationalModesToCatalogInput;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddOpenroadmOperationalModesToCatalogOutput;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddSpecificOperationalModesToCatalogInput;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddSpecificOperationalModesToCatalogOutput;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.EquipmentNotificationInput;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.EquipmentNotificationOutput;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.NetworkReOptimizationInput;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.NetworkReOptimizationOutput;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelCreateInput;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelCreateOutput;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelRequestCancelInput;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelRequestCancelOutput;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateBulkInput;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateBulkOutput;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateComplexResultNotificationRequestInput;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateComplexResultNotificationRequestOutput;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateResultNotificationRequestInput;
61 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateResultNotificationRequestOutput;
62 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteComplexResultNotificationRequestInput;
63 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteComplexResultNotificationRequestOutput;
64 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
65 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
66 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
67 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteResultNotificationRequestInput;
68 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteResultNotificationRequestOutput;
69 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckBulkInput;
70 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckBulkOutput;
71 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
72 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckOutput;
73 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureBulkInput;
74 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureBulkOutput;
75 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
76 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureOutput;
77 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureResultNotificationRequestInput;
78 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureResultNotificationRequestOutput;
79 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmInput;
80 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmOutput;
81 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmResultNotificationRequestInput;
82 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmResultNotificationRequestOutput;
83 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
84 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutput;
85 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput;
86 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationOutput;
87 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationResultNotificationRequestInput;
88 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationResultNotificationRequestOutput;
89 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionInput;
90 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionOutput;
91 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionResultNotificationRequestInput;
92 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionResultNotificationRequestOutput;
93 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollInput;
94 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollOutput;
95 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollResultNotificationRequestInput;
96 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollResultNotificationRequestOutput;
97 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceSrlgGetInput;
98 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceSrlgGetOutput;
99 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateBulkInput;
100 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateBulkOutput;
101 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
102 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutput;
103 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
104 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutput;
105 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfo.TailRetention;
106 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
107 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
108 import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
109 import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder;
110 import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder;
111 import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder;
112 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
113 import org.opendaylight.yangtools.yang.common.RpcResult;
114 import org.slf4j.Logger;
115 import org.slf4j.LoggerFactory;
116
117
118 /**
119  * Top level service interface providing main OpenROADM controller services.
120  */
121 public class ServicehandlerImpl implements OrgOpenroadmServiceService {
122     private static final Logger LOG = LoggerFactory.getLogger(ServicehandlerImpl.class);
123     private static final String PUBLISHER = "ServiceHandler";
124     private static final String TEMP_SERVICE_CREATE_MSG = "tempServiceCreate: {}";
125     private static final String TEMP_SERVICE_DELETE_MSG = "tempServiceDelete: {}";
126     private static final String SERVICE_RESTORATION_MSG = "serviceRestoration: {}";
127     private static final String SERVICE_RECONFIGURE_MSG = "serviceReconfigure: {}";
128     private static final String SERVICE_FEASIBILITY_CHECK_MSG = "serviceFeasibilityCheck: {}";
129     private static final String SERVICE_DELETE_MSG = "serviceDelete: {}";
130     private static final String SERVICE_CREATE_MSG = "serviceCreate: {}";
131
132     private DataBroker db;
133     private ServiceDataStoreOperations serviceDataStoreOperations;
134     private PCEServiceWrapper pceServiceWrapper;
135     private RendererServiceWrapper rendererServiceWrapper;
136     private PceListenerImpl pceListenerImpl;
137     private RendererListenerImpl rendererListenerImpl;
138     private NetworkModelListenerImpl networkModelListenerImpl;
139     private NotificationPublishService notificationPublishService;
140
141     //TODO: remove private request fields as they are in global scope
142
143     public ServicehandlerImpl(DataBroker databroker, PathComputationService pathComputationService,
144             RendererServiceOperations rendererServiceOperations, NotificationPublishService notificationPublishService,
145             PceListenerImpl pceListenerImpl, RendererListenerImpl rendererListenerImpl,
146             NetworkModelListenerImpl networkModelListenerImpl, ServiceDataStoreOperations serviceDataStoreOperations) {
147         this.db = databroker;
148         this.serviceDataStoreOperations = serviceDataStoreOperations;
149         this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService);
150         this.rendererServiceWrapper = new RendererServiceWrapper(rendererServiceOperations, notificationPublishService);
151         this.pceListenerImpl = pceListenerImpl;
152         this.rendererListenerImpl = rendererListenerImpl;
153         this.networkModelListenerImpl = networkModelListenerImpl;
154         this.notificationPublishService =  notificationPublishService;
155     }
156
157
158     // This is class is public so that these messages can be accessed from Junit (avoid duplications).
159     public static final class LogMessages {
160
161         public static final String PCE_CALLING;
162         public static final String ABORT_PCE_FAILED;
163         public static final String PCE_FAILED;
164         public static final String ABORT_SERVICE_NON_COMPLIANT;
165         public static final String SERVICE_NON_COMPLIANT;
166         public static final String RENDERER_DELETE_FAILED;
167         public static final String ABORT_VALID_FAILED;
168
169         // Static blocks are generated once and spare memory.
170         static {
171             PCE_CALLING = "Calling PCE";
172             ABORT_PCE_FAILED = "Aborting: PCE calculation failed ";
173             PCE_FAILED = "PCE calculation failed";
174             ABORT_SERVICE_NON_COMPLIANT = "Aborting: non-compliant service ";
175             SERVICE_NON_COMPLIANT = "non-compliant service";
176             RENDERER_DELETE_FAILED = "Renderer service delete failed";
177             ABORT_VALID_FAILED = "Aborting: validation of service create request failed";
178         }
179
180         public static String serviceInDS(String serviceName) {
181             return "Service '" + serviceName + "' already exists in datastore";
182         }
183
184         public static String serviceNotInDS(String serviceName) {
185             return "Service '" + serviceName + "' does not exist in datastore";
186         }
187
188         public static String serviceInService(String serviceName) {
189             return "Service '" + serviceName + "' is in 'inService' state";
190         }
191
192         private LogMessages() {
193         }
194     }
195
196     @Override
197     public ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreate(ServiceCreateInput input) {
198         LOG.info("RPC serviceCreate received");
199         // Validation
200         OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
201                 new ServiceInput(input), RpcActions.ServiceCreate);
202         if (!validationResult.isSuccess()) {
203             LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
204             return ModelMappingUtils.createCreateServiceReply(
205                     input, ResponseCodes.FINAL_ACK_YES,
206                     validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
207         }
208         //Check any presence of services with the same name
209         String serviceName = input.getServiceName();
210         if (this.serviceDataStoreOperations.getService(serviceName).isPresent()) {
211             LOG.warn(SERVICE_CREATE_MSG, LogMessages.serviceInDS(serviceName));
212             return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
213                     LogMessages.serviceInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
214         }
215         this.pceListenerImpl.setInput(new ServiceInput(input));
216         this.pceListenerImpl.setServiceReconfigure(false);
217         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
218         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
219         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
220         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
221         LOG.debug(SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
222         PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
223         if (output == null) {
224             LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
225             sendNbiNotification(new PublishNotificationProcessServiceBuilder()
226                     .setServiceName(serviceName)
227                     .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
228                     .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
229                     .setCommonId(input.getCommonId())
230                     .setConnectionType(input.getConnectionType())
231                     .setResponseFailed(LogMessages.ABORT_PCE_FAILED)
232                     .setMessage("ServiceCreate request failed ...")
233                     .setOperationalState(State.Degraded)
234                     .setPublisherName(PUBLISHER)
235                     .build());
236             return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
237                     LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
238         }
239         LOG.info("RPC serviceCreate in progress...");
240         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
241         return ModelMappingUtils.createCreateServiceReply(
242                 input, common.getAckFinalIndicator(),
243                 common.getResponseMessage(), common.getResponseCode());
244     }
245
246     @Override
247     public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
248         String serviceName = input.getServiceDeleteReqInfo().getServiceName();
249         LOG.info("RPC serviceDelete request received for {}", serviceName);
250
251         /*
252          * Upon receipt of service-deleteService RPC, service header and sdnc-request
253          * header compliance are verified.
254          */
255         ComplianceCheckResult serviceHandlerCheckResult =
256             ServicehandlerComplianceCheck.check(
257                 input.getServiceDeleteReqInfo().getServiceName(),
258                 input.getSdncRequestHeader(), null, RpcActions.ServiceDelete, false, true);
259         if (!serviceHandlerCheckResult.hasPassed()) {
260             LOG.warn(SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
261             return ModelMappingUtils.createDeleteServiceReply(
262                     input, ResponseCodes.FINAL_ACK_YES,
263                     LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
264         }
265
266         //Check presence of service to be deleted
267         Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
268         Services service;
269         if (serviceOpt.isEmpty()) {
270             LOG.warn(SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(serviceName));
271             return ModelMappingUtils.createDeleteServiceReply(
272                     input, ResponseCodes.FINAL_ACK_YES,
273                     LogMessages.serviceNotInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
274         }
275         service = serviceOpt.get();
276         LOG.debug("serviceDelete: Service '{}' found in datastore", serviceName);
277         this.pceListenerImpl.setInput(new ServiceInput(input));
278         this.pceListenerImpl.setServiceReconfigure(false);
279         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
280         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
281         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
282         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
283         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
284                 serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
285         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
286             this.rendererServiceWrapper.performRenderer(
287                 serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, service);
288
289         if (output == null) {
290             LOG.error(SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
291             sendNbiNotification(new PublishNotificationProcessServiceBuilder()
292                     .setServiceName(service.getServiceName())
293                     .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
294                     .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
295                     .setCommonId(service.getCommonId())
296                     .setConnectionType(service.getConnectionType())
297                     .setMessage("ServiceDelete request failed ...")
298                     .setOperationalState(State.InService)
299                     .setResponseFailed(LogMessages.RENDERER_DELETE_FAILED)
300                     .setPublisherName(PUBLISHER)
301                     .build());
302             return ModelMappingUtils.createDeleteServiceReply(
303                     input, ResponseCodes.FINAL_ACK_YES,
304                     LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
305         }
306
307         LOG.debug("RPC serviceDelete in progress...");
308         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
309         return ModelMappingUtils.createDeleteServiceReply(
310                 input, common.getAckFinalIndicator(),
311                 common.getResponseMessage(), common.getResponseCode());
312     }
313
314     @Override
315     public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceFeasibilityCheck(
316             ServiceFeasibilityCheckInput input) {
317         LOG.info("RPC serviceFeasibilityCheck received");
318         // Validation
319         ServiceInput serviceInput = new ServiceInput(input);
320         OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(serviceInput,
321                 RpcActions.ServiceFeasibilityCheck);
322         if (! validationResult.isSuccess()) {
323             LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_VALID_FAILED);
324             return ModelMappingUtils.createCreateServiceReply(
325                     input, ResponseCodes.FINAL_ACK_YES,
326                     validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
327         }
328         this.pceListenerImpl.setInput(new ServiceInput(input));
329         this.pceListenerImpl.setServiceReconfigure(false);
330         this.pceListenerImpl.setServiceFeasiblity(true);
331         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
332         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
333         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
334         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
335         LOG.debug(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.PCE_CALLING);
336         PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
337         if (output == null) {
338             LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_PCE_FAILED);
339             return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
340                     LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
341         }
342         LOG.info("RPC serviceFeasibilityCheck in progress...");
343         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
344         return ModelMappingUtils.createCreateServiceReply(
345                 input, common.getAckFinalIndicator(),
346                 common.getResponseMessage(), common.getResponseCode());
347     }
348
349     @Override
350     public ListenableFuture<RpcResult<ServiceReconfigureOutput>> serviceReconfigure(ServiceReconfigureInput input) {
351         String serviceName = input.getServiceName();
352         LOG.info("RPC serviceReconfigure received for {}", serviceName);
353         Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
354         if (servicesObject.isEmpty()) {
355             LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.serviceNotInDS(serviceName));
356             return ModelMappingUtils.createCreateServiceReply(
357                 input,
358                 LogMessages.serviceNotInDS(serviceName));
359         }
360         LOG.debug("Service '{}' found in datastore", serviceName);
361         OperationResult validationResult = ServiceCreateValidation
362                 .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceReconfigure);
363         if (!validationResult.isSuccess()) {
364             LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.ABORT_VALID_FAILED);
365             return ModelMappingUtils.createCreateServiceReply(
366                     input,
367                     validationResult.getResultMessage());
368         }
369         this.pceListenerImpl.setInput(new ServiceInput(input));
370         this.pceListenerImpl.setServiceReconfigure(true);
371         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
372         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
373         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
374         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
375         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
376                 .ServiceDeleteInput serviceDeleteInput =
377                         ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
378         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
379                 .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
380                         ServiceNotificationTypes.ServiceDeleteResult, null);
381         if (output == null) {
382             LOG.error(SERVICE_RECONFIGURE_MSG, LogMessages.RENDERER_DELETE_FAILED);
383             return ModelMappingUtils.createCreateServiceReply(
384                     input,
385                     LogMessages.RENDERER_DELETE_FAILED);
386                     //TODO check if RpcStatus.Successful is really expected here
387         }
388         LOG.info("RPC serviceReconfigure in progress...");
389         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
390         return ModelMappingUtils.createCreateServiceReply(
391                 input,
392                 common.getResponseMessage());
393     }
394
395     @Override
396     public ListenableFuture<RpcResult<ServiceRestorationOutput>> serviceRestoration(ServiceRestorationInput input) {
397         String serviceName = input.getServiceName();
398         LOG.info("RPC serviceRestoration received for {}", serviceName);
399         Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
400
401         if (!servicesObject.isPresent()) {
402             LOG.warn(SERVICE_RESTORATION_MSG, LogMessages.serviceNotInDS(serviceName));
403             return ModelMappingUtils.createRestoreServiceReply(
404                     LogMessages.serviceNotInDS(serviceName));
405         }
406
407         Services service = servicesObject.get();
408         State state = service.getOperationalState();
409
410         if (state == State.InService) {
411             LOG.error(SERVICE_RESTORATION_MSG, LogMessages.serviceInService(serviceName));
412             return ModelMappingUtils.createRestoreServiceReply(
413                     LogMessages.serviceInService(serviceName));
414         }
415
416         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
417         OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
418         DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
419         SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
420                 .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
421                 .setRequestId(service.getSdncRequestHeader().getRequestId())
422                 .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
423                 .setRpcAction(RpcActions.ServiceDelete);
424         ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
425                 .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
426                     .setServiceName(serviceName)
427                     .setDueDate(datetime)
428                     .setTailRetention(TailRetention.No).build())
429                 .setSdncRequestHeader(sdncBuilder.build());
430         ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
431         serviceInput.setServiceAEnd(service.getServiceAEnd());
432         serviceInput.setServiceZEnd(service.getServiceZEnd());
433         serviceInput.setConnectionType(service.getConnectionType());
434         HardConstraints hardConstraints = service.getHardConstraints();
435         if (hardConstraints == null) {
436             LOG.warn("service '{}' HardConstraints is not set !", serviceName);
437         } else {
438             SoftConstraints softConstraints = service.getSoftConstraints();
439             if (softConstraints == null) {
440                 LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
441                 serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
442             } else {
443                 LOG.info("converting hard constraints to soft constraints ...");
444                 serviceInput.setSoftConstraints(
445                         DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
446             }
447             serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
448         }
449         this.pceListenerImpl.setInput(serviceInput);
450         this.pceListenerImpl.setServiceReconfigure(true);
451         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
452         this.rendererListenerImpl.setServiceInput(serviceInput);
453         this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
454         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
455         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
456             .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
457                     new ServiceInput(deleteInputBldr.build()));
458         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
459             .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
460                 ServiceNotificationTypes.ServiceDeleteResult, null);
461         if (output == null) {
462             LOG.error(SERVICE_RESTORATION_MSG, LogMessages.RENDERER_DELETE_FAILED);
463             return ModelMappingUtils.createRestoreServiceReply(LogMessages.RENDERER_DELETE_FAILED);
464         }
465         LOG.info("RPC serviceRestore in progress...");
466         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
467         return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage());
468
469     }
470
471     @Override
472     public ListenableFuture<RpcResult<EquipmentNotificationOutput>>
473             equipmentNotification(EquipmentNotificationInput input) {
474         // TODO Auto-generated method stub
475         return null;
476     }
477
478     @Override
479     public ListenableFuture<RpcResult<ServiceRerouteConfirmOutput>>
480             serviceRerouteConfirm(ServiceRerouteConfirmInput input) {
481         // TODO Auto-generated method stub
482         return null;
483     }
484
485     @Override
486     public ListenableFuture<RpcResult<ServiceRerouteOutput>> serviceReroute(ServiceRerouteInput input) {
487         String serviceName = input.getServiceName();
488         LOG.info("RPC serviceReroute received for {}", serviceName);
489         Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
490         if (servicesObject.isEmpty()) {
491             LOG.warn("serviceReroute: {}", LogMessages.serviceNotInDS(serviceName));
492             return ModelMappingUtils.createRerouteServiceReply(
493                     input, ResponseCodes.FINAL_ACK_NO,
494                     LogMessages.serviceNotInDS(serviceName));
495         }
496         Services service = servicesObject.get();
497         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
498         OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
499         DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
500         SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
501                 .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
502                 .setRequestId(service.getSdncRequestHeader().getRequestId())
503                 .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
504                 .setRpcAction(RpcActions.ServiceDelete);
505         ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
506                 .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
507                     .setServiceName(serviceName).setDueDate(datetime)
508                     .setTailRetention(TailRetention.No).build())
509                 .setSdncRequestHeader(sdncBuilder.build());
510         ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
511         serviceInput.setServiceAEnd(service.getServiceAEnd());
512         serviceInput.setServiceZEnd(service.getServiceZEnd());
513         serviceInput.setConnectionType(service.getConnectionType());
514         this.pceListenerImpl.setInput(serviceInput);
515         this.pceListenerImpl.setServiceReconfigure(true);
516         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
517         this.rendererListenerImpl.setServiceInput(serviceInput);
518         this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
519         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
520         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
521             .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
522                     new ServiceInput(deleteInputBldr.build()));
523         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
524             .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
525                 ServiceNotificationTypes.ServiceDeleteResult, null);
526         if (output == null) {
527             LOG.error("serviceReroute: {}", LogMessages.RENDERER_DELETE_FAILED);
528             return ModelMappingUtils.createRerouteServiceReply(
529                     input, ResponseCodes.FINAL_ACK_YES,
530                     LogMessages.RENDERER_DELETE_FAILED);
531         }
532         LOG.info("RPC ServiceReroute in progress...");
533         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
534         return ModelMappingUtils.createRerouteServiceReply(
535                 input, common.getAckFinalIndicator(),
536                 common.getResponseMessage());
537     }
538
539     @Override
540     public ListenableFuture<RpcResult<ServiceReversionOutput>> serviceReversion(ServiceReversionInput input) {
541         // TODO Auto-generated method stub
542         return null;
543     }
544
545     @Override
546     public ListenableFuture<RpcResult<ServiceRollOutput>> serviceRoll(ServiceRollInput input) {
547         // TODO Auto-generated method stub
548         return null;
549     }
550
551     @Override
552     public ListenableFuture<RpcResult<NetworkReOptimizationOutput>>
553             networkReOptimization(NetworkReOptimizationInput input) {
554         // TODO Auto-generated method stub
555         return null;
556     }
557
558     @Override
559     public ListenableFuture<RpcResult<TempServiceDeleteOutput>> tempServiceDelete(TempServiceDeleteInput input) {
560         String commonId = input.getCommonId();
561         LOG.info("RPC temp serviceDelete request received for {}", commonId);
562
563         /*
564          * Upon receipt of service-deleteService RPC, service header and sdnc-request
565          * header compliance are verified.
566          */
567         LOG.debug("checking Service Compliance ...");
568         ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.check(
569                 commonId, null, null, RpcActions.ServiceDelete, false, false
570             );
571         if (!serviceHandlerCheckResult.hasPassed()) {
572             LOG.warn(TEMP_SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
573             return ModelMappingUtils.createDeleteServiceReply(
574                     input, ResponseCodes.FINAL_ACK_YES,
575                     LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
576         }
577
578         //Check presence of service to be deleted
579         LOG.debug("service common-id '{}' is compliant", commonId);
580         Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services>
581                 service =
582             this.serviceDataStoreOperations.getTempService(commonId);
583         if (service.isEmpty()) {
584             LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(commonId));
585             return ModelMappingUtils.createDeleteServiceReply(
586                     input, ResponseCodes.FINAL_ACK_YES,
587                     LogMessages.serviceNotInDS(commonId), ResponseCodes.RESPONSE_FAILED);
588         }
589
590         LOG.info("Service '{}' present in datastore !", commonId);
591         this.pceListenerImpl.setInput(new ServiceInput(input));
592         this.pceListenerImpl.setServiceReconfigure(false);
593         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
594         this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
595         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
596         this.rendererListenerImpl.setTempService(true);
597         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
598         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
599                 this.rendererServiceWrapper.performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult);
600         if (output == null) {
601             LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
602             return ModelMappingUtils.createDeleteServiceReply(
603                     input, ResponseCodes.FINAL_ACK_YES,
604                     LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
605         }
606         LOG.info("RPC tempServiceDelete in progress...");
607         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
608         return ModelMappingUtils.createDeleteServiceReply(
609                 input, common.getAckFinalIndicator(),
610                 common.getResponseMessage(), common.getResponseCode());
611     }
612
613     @Override
614     public ListenableFuture<RpcResult<TempServiceCreateOutput>> tempServiceCreate(TempServiceCreateInput input) {
615         LOG.info("RPC tempServiceCreate received");
616         // Validation
617         OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
618                 new ServiceInput(input), RpcActions.TempServiceCreate);
619         if (! validationResult.isSuccess()) {
620             LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
621             return ModelMappingUtils.createCreateServiceReply(
622                     input, ResponseCodes.FINAL_ACK_YES,
623                     validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
624         }
625
626         // Starting service create operation
627         LOG.debug(TEMP_SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
628         this.pceListenerImpl.setInput(new ServiceInput(input));
629         this.pceListenerImpl.setServiceReconfigure(false);
630         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
631         this.pceListenerImpl.setTempService(true);
632         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
633         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
634         this.rendererListenerImpl.setTempService(true);
635         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
636         PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
637         if (output == null) {
638             LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
639             return ModelMappingUtils.createCreateServiceReply(
640                     input, ResponseCodes.FINAL_ACK_YES,
641                     LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
642         }
643         LOG.info("RPC tempServiceCreate in progress...");
644         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
645         return ModelMappingUtils.createCreateServiceReply(
646                 input, common.getAckFinalIndicator(),
647                 common.getResponseMessage(), common.getResponseCode());
648     }
649
650     @Override
651     public ListenableFuture<RpcResult<
652         ServiceDeleteComplexResultNotificationRequestOutput>> serviceDeleteComplexResultNotificationRequest(
653             ServiceDeleteComplexResultNotificationRequestInput input) {
654         // TODO Auto-generated method stub
655         return null;
656     }
657
658     @Override
659     public ListenableFuture<RpcResult<
660         ServiceCreateResultNotificationRequestOutput>> serviceCreateResultNotificationRequest(
661             ServiceCreateResultNotificationRequestInput input) {
662         // TODO Auto-generated method stub
663         return null;
664     }
665
666     @Override
667     public ListenableFuture<RpcResult<
668         ServiceDeleteResultNotificationRequestOutput>> serviceDeleteResultNotificationRequest(
669             ServiceDeleteResultNotificationRequestInput input) {
670         // TODO Auto-generated method stub
671         return null;
672     }
673
674     @Override
675     public ListenableFuture<RpcResult<
676         ServiceCreateComplexResultNotificationRequestOutput>> serviceCreateComplexResultNotificationRequest(
677             ServiceCreateComplexResultNotificationRequestInput input) {
678         // TODO Auto-generated method stub
679         return null;
680     }
681
682     @Override
683     public ListenableFuture<RpcResult<ServiceFeasibilityCheckBulkOutput>> serviceFeasibilityCheckBulk(
684         ServiceFeasibilityCheckBulkInput input) {
685         // TODO Auto-generated method stub
686         return null;
687     }
688
689     /**
690      * Send notification to NBI notification in order to publish message.
691      * @param service PublishNotificationService
692      */
693     private void sendNbiNotification(PublishNotificationProcessService service) {
694         try {
695             notificationPublishService.putNotification(service);
696         } catch (InterruptedException e) {
697             LOG.warn("Cannot send notification to nbi", e);
698             Thread.currentThread().interrupt();
699         }
700     }
701
702
703     @Override
704     public ListenableFuture<RpcResult<ServiceCreateBulkOutput>> serviceCreateBulk(ServiceCreateBulkInput input) {
705         // TODO Auto-generated method stub
706         return null;
707     }
708
709     @Override
710     public ListenableFuture<RpcResult<TempServiceCreateBulkOutput>> tempServiceCreateBulk(
711         TempServiceCreateBulkInput input) {
712         // TODO Auto-generated method stub
713         return null;
714     }
715
716     @Override
717     public ListenableFuture<RpcResult<ServiceRollResultNotificationRequestOutput>> serviceRollResultNotificationRequest(
718         ServiceRollResultNotificationRequestInput input) {
719         // TODO Auto-generated method stub
720         return null;
721     }
722
723     @Override
724     public ListenableFuture<RpcResult<ServiceReconfigureBulkOutput>> serviceReconfigureBulk(
725         ServiceReconfigureBulkInput input) {
726         // TODO Auto-generated method stub
727         return null;
728     }
729
730     @Override
731     public ListenableFuture<RpcResult<ServiceReconfigureResultNotificationRequestOutput>>
732             serviceReconfigureResultNotificationRequest(ServiceReconfigureResultNotificationRequestInput input) {
733         // TODO Auto-generated method stub
734         return null;
735     }
736
737     @Override
738     public ListenableFuture<RpcResult<ServiceRestorationResultNotificationRequestOutput>>
739             serviceRestorationResultNotificationRequest(ServiceRestorationResultNotificationRequestInput input) {
740         // TODO Auto-generated method stub
741         return null;
742     }
743
744     @Override
745     public ListenableFuture<RpcResult<ServiceReversionResultNotificationRequestOutput>>
746             serviceReversionResultNotificationRequest(ServiceReversionResultNotificationRequestInput input) {
747         // TODO Auto-generated method stub
748         return null;
749     }
750
751     @Override
752     public ListenableFuture<RpcResult<ServiceRerouteConfirmResultNotificationRequestOutput>>
753             serviceRerouteConfirmResultNotificationRequest(ServiceRerouteConfirmResultNotificationRequestInput input) {
754         // TODO Auto-generated method stub
755         return null;
756     }
757
758     @Override
759     public ListenableFuture<RpcResult<OpticalTunnelCreateOutput>> opticalTunnelCreate(OpticalTunnelCreateInput input) {
760         // TODO Auto-generated method stub
761         return null;
762     }
763
764     @Override
765     public ListenableFuture<RpcResult<OpticalTunnelRequestCancelOutput>> opticalTunnelRequestCancel(
766             OpticalTunnelRequestCancelInput input) {
767         // TODO Auto-generated method stub
768         return null;
769     }
770
771     @Override
772     public ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
773             addOpenroadmOperationalModesToCatalog(AddOpenroadmOperationalModesToCatalogInput input) {
774         // TODO Auto-generated method stub
775         return null;
776     }
777
778     @Override
779     public ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> addSpecificOperationalModesToCatalog(
780             AddSpecificOperationalModesToCatalogInput input) {
781         // TODO Auto-generated method stub
782         return null;
783     }
784
785     @Override
786     public ListenableFuture<RpcResult<ServiceSrlgGetOutput>> serviceSrlgGet(ServiceSrlgGetInput input) {
787         // TODO Auto-generated method stub
788         return null;
789     }
790 }