2 * Copyright © 2024 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.util.Optional;
12 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
13 import org.opendaylight.transportpce.common.ResponseCodes;
14 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
15 import org.opendaylight.transportpce.servicehandler.ServiceInput;
16 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
17 import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
18 import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
19 import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
20 import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
21 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
22 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
23 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
32 import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
33 import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
34 import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
35 import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
36 import org.opendaylight.yangtools.yang.common.RpcResult;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
41 public class ServiceDeleteImpl implements ServiceDelete {
42 private static final Logger LOG = LoggerFactory.getLogger(ServiceDeleteImpl.class);
43 private static final String SERVICE_DELETE_MSG = "serviceDelete: {}";
44 private static final String PUBLISHER = "ServiceHandler";
46 private ServiceDataStoreOperations serviceDataStoreOperations;
47 private PceListener pceListener;
48 private RendererListener rendererListener;
49 private NetworkListener networkListener;
50 private RendererServiceWrapper rendererServiceWrapper;
51 private NotificationPublishService notificationPublishService;
53 public ServiceDeleteImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
54 final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
55 RendererServiceWrapper rendererServiceWrapper,
56 NotificationPublishService notificationPublishService) {
57 this.serviceDataStoreOperations = serviceDataStoreOperations;
58 this.pceListener = pceListener;
59 this.rendererListener = rendererListener;
60 this.networkListener = networkListener;
61 this.rendererServiceWrapper = rendererServiceWrapper;
62 this.notificationPublishService = notificationPublishService;
66 public ListenableFuture<RpcResult<ServiceDeleteOutput>> invoke(ServiceDeleteInput input) {
67 String serviceName = input.getServiceDeleteReqInfo().getServiceName();
68 LOG.info("RPC serviceDelete request received for {}", serviceName);
70 * Upon receipt of service-deleteService RPC, service header and sdnc-request
71 * header compliance are verified.
73 ComplianceCheckResult serviceHandlerCheckResult =
74 ServicehandlerComplianceCheck.check(
75 input.getServiceDeleteReqInfo().getServiceName(),
76 input.getSdncRequestHeader(), null, RpcActions.ServiceDelete, false, true);
77 if (!serviceHandlerCheckResult.hasPassed()) {
78 LOG.warn(SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
79 return ModelMappingUtils.createDeleteServiceReply(
80 input, ResponseCodes.FINAL_ACK_YES,
81 LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
83 //Check presence of service to be deleted
84 Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
86 if (serviceOpt.isEmpty()) {
87 LOG.warn(SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(serviceName));
88 return ModelMappingUtils.createDeleteServiceReply(
89 input, ResponseCodes.FINAL_ACK_YES,
90 LogMessages.serviceNotInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
92 service = serviceOpt.orElseThrow();
93 LOG.debug("serviceDelete: Service '{}' found in datastore", serviceName);
94 this.pceListener.setInput(new ServiceInput(input));
95 this.pceListener.setServiceReconfigure(false);
96 this.pceListener.setTempService(false);
97 this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
98 this.rendererListener.setTempService(false);
99 this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
100 this.rendererListener.setServiceInput(new ServiceInput(input));
101 this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
102 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
103 serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
104 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
105 this.rendererServiceWrapper.performRenderer(
106 serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, service);
107 if (output == null) {
108 LOG.error(SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
109 sendNbiNotification(new PublishNotificationProcessServiceBuilder()
110 .setServiceName(service.getServiceName())
111 .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
112 .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
113 .setCommonId(service.getCommonId())
114 .setConnectionType(service.getConnectionType())
115 .setMessage("ServiceDelete request failed ...")
116 .setOperationalState(State.InService)
117 .setResponseFailed(LogMessages.RENDERER_DELETE_FAILED)
118 .setPublisherName(PUBLISHER)
120 return ModelMappingUtils.createDeleteServiceReply(
121 input, ResponseCodes.FINAL_ACK_YES,
122 LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
125 LOG.debug("RPC serviceDelete in progress...");
126 ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
127 return ModelMappingUtils.createDeleteServiceReply(
128 input, common.getAckFinalIndicator(),
129 common.getResponseMessage(), common.getResponseCode());
133 * Send notification to NBI notification in order to publish message.
134 * @param service PublishNotificationService
136 private void sendNbiNotification(PublishNotificationProcessService service) {
138 notificationPublishService.putNotification(service);
139 } catch (InterruptedException e) {
140 LOG.warn("Cannot send notification to nbi", e);
141 Thread.currentThread().interrupt();