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.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;
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 serviceNotInDS(String serviceName) {
181 return "Service '" + serviceName + "' does not exist in datastore";
184 public static String serviceInService(String serviceName) {
185 return "Service '" + serviceName + "' is in 'inService' state";
188 private LogMessages() {
193 public ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreate(ServiceCreateInput input) {
194 LOG.info("RPC serviceCreate received");
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);
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)
225 return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
226 LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
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());
236 public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
237 String serviceName = input.getServiceDeleteReqInfo().getServiceName();
238 LOG.info("RPC serviceDelete request received for {}", serviceName);
241 * Upon receipt of service-deleteService RPC, service header and sdnc-request
242 * header compliance are verified.
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);
255 //Check presence of service to be deleted
256 Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
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);
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);
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)
291 return ModelMappingUtils.createDeleteServiceReply(
292 input, ResponseCodes.FINAL_ACK_YES,
293 LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
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());
304 public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceFeasibilityCheck(
305 ServiceFeasibilityCheckInput input) {
306 LOG.info("RPC serviceFeasibilityCheck received");
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);
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);
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());
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(
347 LogMessages.serviceNotInDS(serviceName));
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(
356 validationResult.getResultMessage());
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(
374 LogMessages.RENDERER_DELETE_FAILED);
375 //TODO check if RpcStatus.Successful is really expected here
377 LOG.info("RPC serviceReconfigure in progress...");
378 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
379 return ModelMappingUtils.createCreateServiceReply(
381 common.getResponseMessage());
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);
390 if (!servicesObject.isPresent()) {
391 LOG.warn(SERVICE_RESTORATION_MSG, LogMessages.serviceNotInDS(serviceName));
392 return ModelMappingUtils.createRestoreServiceReply(
393 LogMessages.serviceNotInDS(serviceName));
396 Services service = servicesObject.get();
397 State state = service.getOperationalState();
399 if (state == State.InService) {
400 LOG.error(SERVICE_RESTORATION_MSG, LogMessages.serviceInService(serviceName));
401 return ModelMappingUtils.createRestoreServiceReply(
402 LogMessages.serviceInService(serviceName));
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);
427 SoftConstraints softConstraints = service.getSoftConstraints();
428 if (softConstraints == null) {
429 LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
430 serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
432 LOG.info("converting hard constraints to soft constraints ...");
433 serviceInput.setSoftConstraints(
434 DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
436 serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
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);
454 LOG.info("RPC serviceRestore in progress...");
455 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
456 return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage());
461 public ListenableFuture<RpcResult<EquipmentNotificationOutput>>
462 equipmentNotification(EquipmentNotificationInput input) {
463 // TODO Auto-generated method stub
468 public ListenableFuture<RpcResult<ServiceRerouteConfirmOutput>>
469 serviceRerouteConfirm(ServiceRerouteConfirmInput input) {
470 // TODO Auto-generated method stub
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));
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);
521 LOG.info("RPC ServiceReroute in progress...");
522 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
523 return ModelMappingUtils.createRerouteServiceReply(
524 input, common.getAckFinalIndicator(),
525 common.getResponseMessage());
529 public ListenableFuture<RpcResult<ServiceReversionOutput>> serviceReversion(ServiceReversionInput input) {
530 // TODO Auto-generated method stub
535 public ListenableFuture<RpcResult<ServiceRollOutput>> serviceRoll(ServiceRollInput input) {
536 // TODO Auto-generated method stub
541 public ListenableFuture<RpcResult<NetworkReOptimizationOutput>>
542 networkReOptimization(NetworkReOptimizationInput input) {
543 // TODO Auto-generated method stub
548 public ListenableFuture<RpcResult<TempServiceDeleteOutput>> tempServiceDelete(TempServiceDeleteInput input) {
549 String commonId = input.getCommonId();
550 LOG.info("RPC temp serviceDelete request received for {}", commonId);
553 * Upon receipt of service-deleteService RPC, service header and sdnc-request
554 * header compliance are verified.
556 LOG.debug("checking Service Compliance ...");
557 ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.check(
558 commonId, null, null, RpcActions.ServiceDelete, false, false
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);
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>
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);
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);
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());
603 public ListenableFuture<RpcResult<TempServiceCreateOutput>> tempServiceCreate(TempServiceCreateInput input) {
604 LOG.info("RPC tempServiceCreate received");
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);
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);
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());
640 public ListenableFuture<RpcResult<
641 ServiceDeleteComplexResultNotificationRequestOutput>> serviceDeleteComplexResultNotificationRequest(
642 ServiceDeleteComplexResultNotificationRequestInput input) {
643 // TODO Auto-generated method stub
648 public ListenableFuture<RpcResult<
649 ServiceCreateResultNotificationRequestOutput>> serviceCreateResultNotificationRequest(
650 ServiceCreateResultNotificationRequestInput input) {
651 // TODO Auto-generated method stub
656 public ListenableFuture<RpcResult<
657 ServiceDeleteResultNotificationRequestOutput>> serviceDeleteResultNotificationRequest(
658 ServiceDeleteResultNotificationRequestInput input) {
659 // TODO Auto-generated method stub
664 public ListenableFuture<RpcResult<
665 ServiceCreateComplexResultNotificationRequestOutput>> serviceCreateComplexResultNotificationRequest(
666 ServiceCreateComplexResultNotificationRequestInput input) {
667 // TODO Auto-generated method stub
672 public ListenableFuture<RpcResult<ServiceFeasibilityCheckBulkOutput>> serviceFeasibilityCheckBulk(
673 ServiceFeasibilityCheckBulkInput input) {
674 // TODO Auto-generated method stub
679 * Send notification to NBI notification in order to publish message.
680 * @param service PublishNotificationService
682 private void sendNbiNotification(PublishNotificationProcessService service) {
684 notificationPublishService.putNotification(service);
685 } catch (InterruptedException e) {
686 LOG.warn("Cannot send notification to nbi", e);
687 Thread.currentThread().interrupt();
693 public ListenableFuture<RpcResult<ServiceCreateBulkOutput>> serviceCreateBulk(ServiceCreateBulkInput input) {
694 // TODO Auto-generated method stub
699 public ListenableFuture<RpcResult<TempServiceCreateBulkOutput>> tempServiceCreateBulk(
700 TempServiceCreateBulkInput input) {
701 // TODO Auto-generated method stub
706 public ListenableFuture<RpcResult<ServiceRollResultNotificationRequestOutput>> serviceRollResultNotificationRequest(
707 ServiceRollResultNotificationRequestInput input) {
708 // TODO Auto-generated method stub
713 public ListenableFuture<RpcResult<ServiceReconfigureBulkOutput>> serviceReconfigureBulk(
714 ServiceReconfigureBulkInput input) {
715 // TODO Auto-generated method stub
720 public ListenableFuture<RpcResult<ServiceReconfigureResultNotificationRequestOutput>>
721 serviceReconfigureResultNotificationRequest(ServiceReconfigureResultNotificationRequestInput input) {
722 // TODO Auto-generated method stub
727 public ListenableFuture<RpcResult<ServiceRestorationResultNotificationRequestOutput>>
728 serviceRestorationResultNotificationRequest(ServiceRestorationResultNotificationRequestInput input) {
729 // TODO Auto-generated method stub
734 public ListenableFuture<RpcResult<ServiceReversionResultNotificationRequestOutput>>
735 serviceReversionResultNotificationRequest(ServiceReversionResultNotificationRequestInput input) {
736 // TODO Auto-generated method stub
741 public ListenableFuture<RpcResult<ServiceRerouteConfirmResultNotificationRequestOutput>>
742 serviceRerouteConfirmResultNotificationRequest(ServiceRerouteConfirmResultNotificationRequestInput input) {
743 // TODO Auto-generated method stub
748 public ListenableFuture<RpcResult<OpticalTunnelCreateOutput>> opticalTunnelCreate(OpticalTunnelCreateInput input) {
749 // TODO Auto-generated method stub
754 public ListenableFuture<RpcResult<OpticalTunnelRequestCancelOutput>> opticalTunnelRequestCancel(
755 OpticalTunnelRequestCancelInput input) {
756 // TODO Auto-generated method stub
761 public ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
762 addOpenroadmOperationalModesToCatalog(AddOpenroadmOperationalModesToCatalogInput input) {
763 // TODO Auto-generated method stub
768 public ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> addSpecificOperationalModesToCatalog(
769 AddSpecificOperationalModesToCatalogInput input) {
770 // TODO Auto-generated method stub
775 public ListenableFuture<RpcResult<ServiceSrlgGetOutput>> serviceSrlgGet(ServiceSrlgGetInput input) {
776 // TODO Auto-generated method stub