2 * Copyright © 2017 Orange, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.transportpce.servicehandler.impl;
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.rev211013.PublishNotificationProcessService;
109 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessServiceBuilder;
110 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.process.service.ServiceAEndBuilder;
111 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.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;
119 * Top level service interface providing main OpenROADM controller services.
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: {}";
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;
141 //TODO: remove private request fields as they are in global scope
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;
158 // This is class is public so that these messages can be accessed from Junit (avoid duplications).
159 public static final class LogMessages {
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;
169 // Static blocks are generated once and spare memory.
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";
180 public static String serviceInDS(String serviceName) {
181 return "Service '" + serviceName + "' already exists in datastore";
184 public static String serviceNotInDS(String serviceName) {
185 return "Service '" + serviceName + "' does not exist in datastore";
188 public static String serviceInService(String serviceName) {
189 return "Service '" + serviceName + "' is in 'inService' state";
192 private LogMessages() {
197 public ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreate(ServiceCreateInput input) {
198 LOG.info("RPC serviceCreate received");
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);
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);
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)
236 return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
237 LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
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());
247 public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
248 String serviceName = input.getServiceDeleteReqInfo().getServiceName();
249 LOG.info("RPC serviceDelete request received for {}", serviceName);
252 * Upon receipt of service-deleteService RPC, service header and sdnc-request
253 * header compliance are verified.
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);
266 //Check presence of service to be deleted
267 Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
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);
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);
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)
302 return ModelMappingUtils.createDeleteServiceReply(
303 input, ResponseCodes.FINAL_ACK_YES,
304 LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
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());
315 public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceFeasibilityCheck(
316 ServiceFeasibilityCheckInput input) {
317 LOG.info("RPC serviceFeasibilityCheck received");
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);
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);
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());
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(
358 LogMessages.serviceNotInDS(serviceName));
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(
367 validationResult.getResultMessage());
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(
385 LogMessages.RENDERER_DELETE_FAILED);
386 //TODO check if RpcStatus.Successful is really expected here
388 LOG.info("RPC serviceReconfigure in progress...");
389 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
390 return ModelMappingUtils.createCreateServiceReply(
392 common.getResponseMessage());
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);
401 if (!servicesObject.isPresent()) {
402 LOG.warn(SERVICE_RESTORATION_MSG, LogMessages.serviceNotInDS(serviceName));
403 return ModelMappingUtils.createRestoreServiceReply(
404 LogMessages.serviceNotInDS(serviceName));
407 Services service = servicesObject.get();
408 State state = service.getOperationalState();
410 if (state == State.InService) {
411 LOG.error(SERVICE_RESTORATION_MSG, LogMessages.serviceInService(serviceName));
412 return ModelMappingUtils.createRestoreServiceReply(
413 LogMessages.serviceInService(serviceName));
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);
438 SoftConstraints softConstraints = service.getSoftConstraints();
439 if (softConstraints == null) {
440 LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
441 serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
443 LOG.info("converting hard constraints to soft constraints ...");
444 serviceInput.setSoftConstraints(
445 DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
447 serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
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);
465 LOG.info("RPC serviceRestore in progress...");
466 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
467 return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage());
472 public ListenableFuture<RpcResult<EquipmentNotificationOutput>>
473 equipmentNotification(EquipmentNotificationInput input) {
474 // TODO Auto-generated method stub
479 public ListenableFuture<RpcResult<ServiceRerouteConfirmOutput>>
480 serviceRerouteConfirm(ServiceRerouteConfirmInput input) {
481 // TODO Auto-generated method stub
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));
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);
532 LOG.info("RPC ServiceReroute in progress...");
533 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
534 return ModelMappingUtils.createRerouteServiceReply(
535 input, common.getAckFinalIndicator(),
536 common.getResponseMessage());
540 public ListenableFuture<RpcResult<ServiceReversionOutput>> serviceReversion(ServiceReversionInput input) {
541 // TODO Auto-generated method stub
546 public ListenableFuture<RpcResult<ServiceRollOutput>> serviceRoll(ServiceRollInput input) {
547 // TODO Auto-generated method stub
552 public ListenableFuture<RpcResult<NetworkReOptimizationOutput>>
553 networkReOptimization(NetworkReOptimizationInput input) {
554 // TODO Auto-generated method stub
559 public ListenableFuture<RpcResult<TempServiceDeleteOutput>> tempServiceDelete(TempServiceDeleteInput input) {
560 String commonId = input.getCommonId();
561 LOG.info("RPC temp serviceDelete request received for {}", commonId);
564 * Upon receipt of service-deleteService RPC, service header and sdnc-request
565 * header compliance are verified.
567 LOG.debug("checking Service Compliance ...");
568 ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.check(
569 commonId, null, null, RpcActions.ServiceDelete, false, false
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);
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>
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);
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);
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());
614 public ListenableFuture<RpcResult<TempServiceCreateOutput>> tempServiceCreate(TempServiceCreateInput input) {
615 LOG.info("RPC tempServiceCreate received");
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);
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);
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());
651 public ListenableFuture<RpcResult<
652 ServiceDeleteComplexResultNotificationRequestOutput>> serviceDeleteComplexResultNotificationRequest(
653 ServiceDeleteComplexResultNotificationRequestInput input) {
654 // TODO Auto-generated method stub
659 public ListenableFuture<RpcResult<
660 ServiceCreateResultNotificationRequestOutput>> serviceCreateResultNotificationRequest(
661 ServiceCreateResultNotificationRequestInput input) {
662 // TODO Auto-generated method stub
667 public ListenableFuture<RpcResult<
668 ServiceDeleteResultNotificationRequestOutput>> serviceDeleteResultNotificationRequest(
669 ServiceDeleteResultNotificationRequestInput input) {
670 // TODO Auto-generated method stub
675 public ListenableFuture<RpcResult<
676 ServiceCreateComplexResultNotificationRequestOutput>> serviceCreateComplexResultNotificationRequest(
677 ServiceCreateComplexResultNotificationRequestInput input) {
678 // TODO Auto-generated method stub
683 public ListenableFuture<RpcResult<ServiceFeasibilityCheckBulkOutput>> serviceFeasibilityCheckBulk(
684 ServiceFeasibilityCheckBulkInput input) {
685 // TODO Auto-generated method stub
690 * Send notification to NBI notification in order to publish message.
691 * @param service PublishNotificationService
693 private void sendNbiNotification(PublishNotificationProcessService service) {
695 notificationPublishService.putNotification(service);
696 } catch (InterruptedException e) {
697 LOG.warn("Cannot send notification to nbi", e);
698 Thread.currentThread().interrupt();
704 public ListenableFuture<RpcResult<ServiceCreateBulkOutput>> serviceCreateBulk(ServiceCreateBulkInput input) {
705 // TODO Auto-generated method stub
710 public ListenableFuture<RpcResult<TempServiceCreateBulkOutput>> tempServiceCreateBulk(
711 TempServiceCreateBulkInput input) {
712 // TODO Auto-generated method stub
717 public ListenableFuture<RpcResult<ServiceRollResultNotificationRequestOutput>> serviceRollResultNotificationRequest(
718 ServiceRollResultNotificationRequestInput input) {
719 // TODO Auto-generated method stub
724 public ListenableFuture<RpcResult<ServiceReconfigureBulkOutput>> serviceReconfigureBulk(
725 ServiceReconfigureBulkInput input) {
726 // TODO Auto-generated method stub
731 public ListenableFuture<RpcResult<ServiceReconfigureResultNotificationRequestOutput>>
732 serviceReconfigureResultNotificationRequest(ServiceReconfigureResultNotificationRequestInput input) {
733 // TODO Auto-generated method stub
738 public ListenableFuture<RpcResult<ServiceRestorationResultNotificationRequestOutput>>
739 serviceRestorationResultNotificationRequest(ServiceRestorationResultNotificationRequestInput input) {
740 // TODO Auto-generated method stub
745 public ListenableFuture<RpcResult<ServiceReversionResultNotificationRequestOutput>>
746 serviceReversionResultNotificationRequest(ServiceReversionResultNotificationRequestInput input) {
747 // TODO Auto-generated method stub
752 public ListenableFuture<RpcResult<ServiceRerouteConfirmResultNotificationRequestOutput>>
753 serviceRerouteConfirmResultNotificationRequest(ServiceRerouteConfirmResultNotificationRequestInput input) {
754 // TODO Auto-generated method stub
759 public ListenableFuture<RpcResult<OpticalTunnelCreateOutput>> opticalTunnelCreate(OpticalTunnelCreateInput input) {
760 // TODO Auto-generated method stub
765 public ListenableFuture<RpcResult<OpticalTunnelRequestCancelOutput>> opticalTunnelRequestCancel(
766 OpticalTunnelRequestCancelInput input) {
767 // TODO Auto-generated method stub
772 public ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
773 addOpenroadmOperationalModesToCatalog(AddOpenroadmOperationalModesToCatalogInput input) {
774 // TODO Auto-generated method stub
779 public ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> addSpecificOperationalModesToCatalog(
780 AddSpecificOperationalModesToCatalogInput input) {
781 // TODO Auto-generated method stub
786 public ListenableFuture<RpcResult<ServiceSrlgGetOutput>> serviceSrlgGet(ServiceSrlgGetInput input) {
787 // TODO Auto-generated method stub