Fix few code issues
[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.rev220118.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 serviceNotInDS(String serviceName) {
181             return "Service '" + serviceName + "' does not exist in datastore";
182         }
183
184         public static String serviceInService(String serviceName) {
185             return "Service '" + serviceName + "' is in 'inService' state";
186         }
187
188         private LogMessages() {
189         }
190     }
191
192     @Override
193     public ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreate(ServiceCreateInput input) {
194         LOG.info("RPC serviceCreate received");
195         // Validation
196         OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
197                 new ServiceInput(input), RpcActions.ServiceCreate);
198         if (! validationResult.isSuccess()) {
199             LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
200             return ModelMappingUtils.createCreateServiceReply(
201                     input, ResponseCodes.FINAL_ACK_YES,
202                     validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
203         }
204         this.pceListenerImpl.setInput(new ServiceInput(input));
205         this.pceListenerImpl.setServiceReconfigure(false);
206         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
207         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
208         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
209         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
210         LOG.debug(SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
211         PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
212         if (output == null) {
213             LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
214             sendNbiNotification(new PublishNotificationProcessServiceBuilder()
215                     .setServiceName(input.getServiceName())
216                     .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
217                     .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
218                     .setCommonId(input.getCommonId())
219                     .setConnectionType(input.getConnectionType())
220                     .setResponseFailed(LogMessages.ABORT_PCE_FAILED)
221                     .setMessage("ServiceCreate request failed ...")
222                     .setOperationalState(State.Degraded)
223                     .setPublisherName(PUBLISHER)
224                     .build());
225             return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
226                     LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
227         }
228         LOG.info("RPC serviceCreate in progress...");
229         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
230         return ModelMappingUtils.createCreateServiceReply(
231                 input, common.getAckFinalIndicator(),
232                 common.getResponseMessage(), common.getResponseCode());
233     }
234
235     @Override
236     public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
237         String serviceName = input.getServiceDeleteReqInfo().getServiceName();
238         LOG.info("RPC serviceDelete request received for {}", serviceName);
239
240         /*
241          * Upon receipt of service-deleteService RPC, service header and sdnc-request
242          * header compliance are verified.
243          */
244         ComplianceCheckResult serviceHandlerCheckResult =
245             ServicehandlerComplianceCheck.check(
246                 input.getServiceDeleteReqInfo().getServiceName(),
247                 input.getSdncRequestHeader(), null, RpcActions.ServiceDelete, false, true);
248         if (!serviceHandlerCheckResult.hasPassed()) {
249             LOG.warn(SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
250             return ModelMappingUtils.createDeleteServiceReply(
251                     input, ResponseCodes.FINAL_ACK_YES,
252                     LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
253         }
254
255         //Check presence of service to be deleted
256         Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
257         Services service;
258         if (serviceOpt.isEmpty()) {
259             LOG.warn(SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(serviceName));
260             return ModelMappingUtils.createDeleteServiceReply(
261                     input, ResponseCodes.FINAL_ACK_YES,
262                     LogMessages.serviceNotInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
263         }
264         service = serviceOpt.get();
265         LOG.debug("serviceDelete: Service '{}' found in datastore", serviceName);
266         this.pceListenerImpl.setInput(new ServiceInput(input));
267         this.pceListenerImpl.setServiceReconfigure(false);
268         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
269         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
270         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
271         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
272         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
273                 serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
274         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
275             this.rendererServiceWrapper.performRenderer(
276                 serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, service);
277
278         if (output == null) {
279             LOG.error(SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
280             sendNbiNotification(new PublishNotificationProcessServiceBuilder()
281                     .setServiceName(service.getServiceName())
282                     .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
283                     .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
284                     .setCommonId(service.getCommonId())
285                     .setConnectionType(service.getConnectionType())
286                     .setMessage("ServiceDelete request failed ...")
287                     .setOperationalState(State.InService)
288                     .setResponseFailed(LogMessages.RENDERER_DELETE_FAILED)
289                     .setPublisherName(PUBLISHER)
290                     .build());
291             return ModelMappingUtils.createDeleteServiceReply(
292                     input, ResponseCodes.FINAL_ACK_YES,
293                     LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
294         }
295
296         LOG.debug("RPC serviceDelete in progress...");
297         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
298         return ModelMappingUtils.createDeleteServiceReply(
299                 input, common.getAckFinalIndicator(),
300                 common.getResponseMessage(), common.getResponseCode());
301     }
302
303     @Override
304     public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceFeasibilityCheck(
305             ServiceFeasibilityCheckInput input) {
306         LOG.info("RPC serviceFeasibilityCheck received");
307         // Validation
308         ServiceInput serviceInput = new ServiceInput(input);
309         OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(serviceInput,
310                 RpcActions.ServiceFeasibilityCheck);
311         if (! validationResult.isSuccess()) {
312             LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_VALID_FAILED);
313             return ModelMappingUtils.createCreateServiceReply(
314                     input, ResponseCodes.FINAL_ACK_YES,
315                     validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
316         }
317         this.pceListenerImpl.setInput(new ServiceInput(input));
318         this.pceListenerImpl.setServiceReconfigure(false);
319         this.pceListenerImpl.setServiceFeasiblity(true);
320         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
321         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
322         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
323         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
324         LOG.debug(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.PCE_CALLING);
325         PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
326         if (output == null) {
327             LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_PCE_FAILED);
328             return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
329                     LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
330         }
331         LOG.info("RPC serviceFeasibilityCheck in progress...");
332         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
333         return ModelMappingUtils.createCreateServiceReply(
334                 input, common.getAckFinalIndicator(),
335                 common.getResponseMessage(), common.getResponseCode());
336     }
337
338     @Override
339     public ListenableFuture<RpcResult<ServiceReconfigureOutput>> serviceReconfigure(ServiceReconfigureInput input) {
340         String serviceName = input.getServiceName();
341         LOG.info("RPC serviceReconfigure received for {}", serviceName);
342         Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
343         if (servicesObject.isEmpty()) {
344             LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.serviceNotInDS(serviceName));
345             return ModelMappingUtils.createCreateServiceReply(
346                 input,
347                 LogMessages.serviceNotInDS(serviceName));
348         }
349         LOG.debug("Service '{}' found in datastore", serviceName);
350         OperationResult validationResult = ServiceCreateValidation
351                 .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceReconfigure);
352         if (!validationResult.isSuccess()) {
353             LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.ABORT_VALID_FAILED);
354             return ModelMappingUtils.createCreateServiceReply(
355                     input,
356                     validationResult.getResultMessage());
357         }
358         this.pceListenerImpl.setInput(new ServiceInput(input));
359         this.pceListenerImpl.setServiceReconfigure(true);
360         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
361         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
362         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
363         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
364         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
365                 .ServiceDeleteInput serviceDeleteInput =
366                         ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
367         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
368                 .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
369                         ServiceNotificationTypes.ServiceDeleteResult, null);
370         if (output == null) {
371             LOG.error(SERVICE_RECONFIGURE_MSG, LogMessages.RENDERER_DELETE_FAILED);
372             return ModelMappingUtils.createCreateServiceReply(
373                     input,
374                     LogMessages.RENDERER_DELETE_FAILED);
375                     //TODO check if RpcStatus.Successful is really expected here
376         }
377         LOG.info("RPC serviceReconfigure in progress...");
378         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
379         return ModelMappingUtils.createCreateServiceReply(
380                 input,
381                 common.getResponseMessage());
382     }
383
384     @Override
385     public ListenableFuture<RpcResult<ServiceRestorationOutput>> serviceRestoration(ServiceRestorationInput input) {
386         String serviceName = input.getServiceName();
387         LOG.info("RPC serviceRestoration received for {}", serviceName);
388         Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
389
390         if (!servicesObject.isPresent()) {
391             LOG.warn(SERVICE_RESTORATION_MSG, LogMessages.serviceNotInDS(serviceName));
392             return ModelMappingUtils.createRestoreServiceReply(
393                     LogMessages.serviceNotInDS(serviceName));
394         }
395
396         Services service = servicesObject.get();
397         State state = service.getOperationalState();
398
399         if (state == State.InService) {
400             LOG.error(SERVICE_RESTORATION_MSG, LogMessages.serviceInService(serviceName));
401             return ModelMappingUtils.createRestoreServiceReply(
402                     LogMessages.serviceInService(serviceName));
403         }
404
405         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
406         OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
407         DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
408         SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
409                 .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
410                 .setRequestId(service.getSdncRequestHeader().getRequestId())
411                 .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
412                 .setRpcAction(RpcActions.ServiceDelete);
413         ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
414                 .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
415                     .setServiceName(serviceName)
416                     .setDueDate(datetime)
417                     .setTailRetention(TailRetention.No).build())
418                 .setSdncRequestHeader(sdncBuilder.build());
419         ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
420         serviceInput.setServiceAEnd(service.getServiceAEnd());
421         serviceInput.setServiceZEnd(service.getServiceZEnd());
422         serviceInput.setConnectionType(service.getConnectionType());
423         HardConstraints hardConstraints = service.getHardConstraints();
424         if (hardConstraints == null) {
425             LOG.warn("service '{}' HardConstraints is not set !", serviceName);
426         } else {
427             SoftConstraints softConstraints = service.getSoftConstraints();
428             if (softConstraints == null) {
429                 LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
430                 serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
431             } else {
432                 LOG.info("converting hard constraints to soft constraints ...");
433                 serviceInput.setSoftConstraints(
434                         DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
435             }
436             serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
437         }
438         this.pceListenerImpl.setInput(serviceInput);
439         this.pceListenerImpl.setServiceReconfigure(true);
440         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
441         this.rendererListenerImpl.setServiceInput(serviceInput);
442         this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
443         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
444         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
445             .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
446                     new ServiceInput(deleteInputBldr.build()));
447         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
448             .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
449                 ServiceNotificationTypes.ServiceDeleteResult, null);
450         if (output == null) {
451             LOG.error(SERVICE_RESTORATION_MSG, LogMessages.RENDERER_DELETE_FAILED);
452             return ModelMappingUtils.createRestoreServiceReply(LogMessages.RENDERER_DELETE_FAILED);
453         }
454         LOG.info("RPC serviceRestore in progress...");
455         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
456         return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage());
457
458     }
459
460     @Override
461     public ListenableFuture<RpcResult<EquipmentNotificationOutput>>
462             equipmentNotification(EquipmentNotificationInput input) {
463         // TODO Auto-generated method stub
464         return null;
465     }
466
467     @Override
468     public ListenableFuture<RpcResult<ServiceRerouteConfirmOutput>>
469             serviceRerouteConfirm(ServiceRerouteConfirmInput input) {
470         // TODO Auto-generated method stub
471         return null;
472     }
473
474     @Override
475     public ListenableFuture<RpcResult<ServiceRerouteOutput>> serviceReroute(ServiceRerouteInput input) {
476         String serviceName = input.getServiceName();
477         LOG.info("RPC serviceReroute received for {}", serviceName);
478         Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
479         if (servicesObject.isEmpty()) {
480             LOG.warn("serviceReroute: {}", LogMessages.serviceNotInDS(serviceName));
481             return ModelMappingUtils.createRerouteServiceReply(
482                     input, ResponseCodes.FINAL_ACK_NO,
483                     LogMessages.serviceNotInDS(serviceName));
484         }
485         Services service = servicesObject.get();
486         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
487         OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
488         DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
489         SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
490                 .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
491                 .setRequestId(service.getSdncRequestHeader().getRequestId())
492                 .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
493                 .setRpcAction(RpcActions.ServiceDelete);
494         ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
495                 .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
496                     .setServiceName(serviceName).setDueDate(datetime)
497                     .setTailRetention(TailRetention.No).build())
498                 .setSdncRequestHeader(sdncBuilder.build());
499         ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
500         serviceInput.setServiceAEnd(service.getServiceAEnd());
501         serviceInput.setServiceZEnd(service.getServiceZEnd());
502         serviceInput.setConnectionType(service.getConnectionType());
503         this.pceListenerImpl.setInput(serviceInput);
504         this.pceListenerImpl.setServiceReconfigure(true);
505         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
506         this.rendererListenerImpl.setServiceInput(serviceInput);
507         this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
508         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
509         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
510             .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
511                     new ServiceInput(deleteInputBldr.build()));
512         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
513             .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
514                 ServiceNotificationTypes.ServiceDeleteResult, null);
515         if (output == null) {
516             LOG.error("serviceReroute: {}", LogMessages.RENDERER_DELETE_FAILED);
517             return ModelMappingUtils.createRerouteServiceReply(
518                     input, ResponseCodes.FINAL_ACK_YES,
519                     LogMessages.RENDERER_DELETE_FAILED);
520         }
521         LOG.info("RPC ServiceReroute in progress...");
522         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
523         return ModelMappingUtils.createRerouteServiceReply(
524                 input, common.getAckFinalIndicator(),
525                 common.getResponseMessage());
526     }
527
528     @Override
529     public ListenableFuture<RpcResult<ServiceReversionOutput>> serviceReversion(ServiceReversionInput input) {
530         // TODO Auto-generated method stub
531         return null;
532     }
533
534     @Override
535     public ListenableFuture<RpcResult<ServiceRollOutput>> serviceRoll(ServiceRollInput input) {
536         // TODO Auto-generated method stub
537         return null;
538     }
539
540     @Override
541     public ListenableFuture<RpcResult<NetworkReOptimizationOutput>>
542             networkReOptimization(NetworkReOptimizationInput input) {
543         // TODO Auto-generated method stub
544         return null;
545     }
546
547     @Override
548     public ListenableFuture<RpcResult<TempServiceDeleteOutput>> tempServiceDelete(TempServiceDeleteInput input) {
549         String commonId = input.getCommonId();
550         LOG.info("RPC temp serviceDelete request received for {}", commonId);
551
552         /*
553          * Upon receipt of service-deleteService RPC, service header and sdnc-request
554          * header compliance are verified.
555          */
556         LOG.debug("checking Service Compliance ...");
557         ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.check(
558                 commonId, null, null, RpcActions.ServiceDelete, false, false
559             );
560         if (!serviceHandlerCheckResult.hasPassed()) {
561             LOG.warn(TEMP_SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
562             return ModelMappingUtils.createDeleteServiceReply(
563                     input, ResponseCodes.FINAL_ACK_YES,
564                     LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
565         }
566
567         //Check presence of service to be deleted
568         LOG.debug("service common-id '{}' is compliant", commonId);
569         Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services>
570                 service =
571             this.serviceDataStoreOperations.getTempService(commonId);
572         if (service.isEmpty()) {
573             LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(commonId));
574             return ModelMappingUtils.createDeleteServiceReply(
575                     input, ResponseCodes.FINAL_ACK_YES,
576                     LogMessages.serviceNotInDS(commonId), ResponseCodes.RESPONSE_FAILED);
577         }
578
579         LOG.info("Service '{}' present in datastore !", commonId);
580         this.pceListenerImpl.setInput(new ServiceInput(input));
581         this.pceListenerImpl.setServiceReconfigure(false);
582         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
583         this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
584         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
585         this.rendererListenerImpl.setTempService(true);
586         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
587         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
588                 this.rendererServiceWrapper.performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult);
589         if (output == null) {
590             LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
591             return ModelMappingUtils.createDeleteServiceReply(
592                     input, ResponseCodes.FINAL_ACK_YES,
593                     LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
594         }
595         LOG.info("RPC tempServiceDelete in progress...");
596         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
597         return ModelMappingUtils.createDeleteServiceReply(
598                 input, common.getAckFinalIndicator(),
599                 common.getResponseMessage(), common.getResponseCode());
600     }
601
602     @Override
603     public ListenableFuture<RpcResult<TempServiceCreateOutput>> tempServiceCreate(TempServiceCreateInput input) {
604         LOG.info("RPC tempServiceCreate received");
605         // Validation
606         OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
607                 new ServiceInput(input), RpcActions.TempServiceCreate);
608         if (! validationResult.isSuccess()) {
609             LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
610             return ModelMappingUtils.createCreateServiceReply(
611                     input, ResponseCodes.FINAL_ACK_YES,
612                     validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
613         }
614
615         // Starting service create operation
616         LOG.debug(TEMP_SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
617         this.pceListenerImpl.setInput(new ServiceInput(input));
618         this.pceListenerImpl.setServiceReconfigure(false);
619         this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
620         this.pceListenerImpl.setTempService(true);
621         this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
622         this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
623         this.rendererListenerImpl.setTempService(true);
624         this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
625         PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
626         if (output == null) {
627             LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
628             return ModelMappingUtils.createCreateServiceReply(
629                     input, ResponseCodes.FINAL_ACK_YES,
630                     LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
631         }
632         LOG.info("RPC tempServiceCreate in progress...");
633         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
634         return ModelMappingUtils.createCreateServiceReply(
635                 input, common.getAckFinalIndicator(),
636                 common.getResponseMessage(), common.getResponseCode());
637     }
638
639     @Override
640     public ListenableFuture<RpcResult<
641         ServiceDeleteComplexResultNotificationRequestOutput>> serviceDeleteComplexResultNotificationRequest(
642             ServiceDeleteComplexResultNotificationRequestInput input) {
643         // TODO Auto-generated method stub
644         return null;
645     }
646
647     @Override
648     public ListenableFuture<RpcResult<
649         ServiceCreateResultNotificationRequestOutput>> serviceCreateResultNotificationRequest(
650             ServiceCreateResultNotificationRequestInput input) {
651         // TODO Auto-generated method stub
652         return null;
653     }
654
655     @Override
656     public ListenableFuture<RpcResult<
657         ServiceDeleteResultNotificationRequestOutput>> serviceDeleteResultNotificationRequest(
658             ServiceDeleteResultNotificationRequestInput input) {
659         // TODO Auto-generated method stub
660         return null;
661     }
662
663     @Override
664     public ListenableFuture<RpcResult<
665         ServiceCreateComplexResultNotificationRequestOutput>> serviceCreateComplexResultNotificationRequest(
666             ServiceCreateComplexResultNotificationRequestInput input) {
667         // TODO Auto-generated method stub
668         return null;
669     }
670
671     @Override
672     public ListenableFuture<RpcResult<ServiceFeasibilityCheckBulkOutput>> serviceFeasibilityCheckBulk(
673         ServiceFeasibilityCheckBulkInput input) {
674         // TODO Auto-generated method stub
675         return null;
676     }
677
678     /**
679      * Send notification to NBI notification in order to publish message.
680      * @param service PublishNotificationService
681      */
682     private void sendNbiNotification(PublishNotificationProcessService service) {
683         try {
684             notificationPublishService.putNotification(service);
685         } catch (InterruptedException e) {
686             LOG.warn("Cannot send notification to nbi", e);
687             Thread.currentThread().interrupt();
688         }
689     }
690
691
692     @Override
693     public ListenableFuture<RpcResult<ServiceCreateBulkOutput>> serviceCreateBulk(ServiceCreateBulkInput input) {
694         // TODO Auto-generated method stub
695         return null;
696     }
697
698     @Override
699     public ListenableFuture<RpcResult<TempServiceCreateBulkOutput>> tempServiceCreateBulk(
700         TempServiceCreateBulkInput input) {
701         // TODO Auto-generated method stub
702         return null;
703     }
704
705     @Override
706     public ListenableFuture<RpcResult<ServiceRollResultNotificationRequestOutput>> serviceRollResultNotificationRequest(
707         ServiceRollResultNotificationRequestInput input) {
708         // TODO Auto-generated method stub
709         return null;
710     }
711
712     @Override
713     public ListenableFuture<RpcResult<ServiceReconfigureBulkOutput>> serviceReconfigureBulk(
714         ServiceReconfigureBulkInput input) {
715         // TODO Auto-generated method stub
716         return null;
717     }
718
719     @Override
720     public ListenableFuture<RpcResult<ServiceReconfigureResultNotificationRequestOutput>>
721             serviceReconfigureResultNotificationRequest(ServiceReconfigureResultNotificationRequestInput input) {
722         // TODO Auto-generated method stub
723         return null;
724     }
725
726     @Override
727     public ListenableFuture<RpcResult<ServiceRestorationResultNotificationRequestOutput>>
728             serviceRestorationResultNotificationRequest(ServiceRestorationResultNotificationRequestInput input) {
729         // TODO Auto-generated method stub
730         return null;
731     }
732
733     @Override
734     public ListenableFuture<RpcResult<ServiceReversionResultNotificationRequestOutput>>
735             serviceReversionResultNotificationRequest(ServiceReversionResultNotificationRequestInput input) {
736         // TODO Auto-generated method stub
737         return null;
738     }
739
740     @Override
741     public ListenableFuture<RpcResult<ServiceRerouteConfirmResultNotificationRequestOutput>>
742             serviceRerouteConfirmResultNotificationRequest(ServiceRerouteConfirmResultNotificationRequestInput input) {
743         // TODO Auto-generated method stub
744         return null;
745     }
746
747     @Override
748     public ListenableFuture<RpcResult<OpticalTunnelCreateOutput>> opticalTunnelCreate(OpticalTunnelCreateInput input) {
749         // TODO Auto-generated method stub
750         return null;
751     }
752
753     @Override
754     public ListenableFuture<RpcResult<OpticalTunnelRequestCancelOutput>> opticalTunnelRequestCancel(
755             OpticalTunnelRequestCancelInput input) {
756         // TODO Auto-generated method stub
757         return null;
758     }
759
760     @Override
761     public ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
762             addOpenroadmOperationalModesToCatalog(AddOpenroadmOperationalModesToCatalogInput input) {
763         // TODO Auto-generated method stub
764         return null;
765     }
766
767     @Override
768     public ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> addSpecificOperationalModesToCatalog(
769             AddSpecificOperationalModesToCatalogInput input) {
770         // TODO Auto-generated method stub
771         return null;
772     }
773
774     @Override
775     public ListenableFuture<RpcResult<ServiceSrlgGetOutput>> serviceSrlgGet(ServiceSrlgGetInput input) {
776         // TODO Auto-generated method stub
777         return null;
778     }
779 }