6bdd8a229171e677a2cac7084ad4f31a63e0fcbf
[transportpce.git] / servicehandler / src / main / java / org / opendaylight / transportpce / servicehandler / impl / ServiceDeleteImpl.java
1 /*
2  * Copyright © 2024 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.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;
39
40
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";
45
46     private ServiceDataStoreOperations serviceDataStoreOperations;
47     private PceListener pceListener;
48     private RendererListener rendererListener;
49     private NetworkListener networkListener;
50     private RendererServiceWrapper rendererServiceWrapper;
51     private NotificationPublishService notificationPublishService;
52
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;
63     }
64
65     @Override
66     public ListenableFuture<RpcResult<ServiceDeleteOutput>> invoke(ServiceDeleteInput input) {
67         String serviceName = input.getServiceDeleteReqInfo().getServiceName();
68         LOG.info("RPC serviceDelete request received for {}", serviceName);
69         /*
70          * Upon receipt of service-deleteService RPC, service header and sdnc-request
71          * header compliance are verified.
72          */
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);
82         }
83         //Check presence of service to be deleted
84         Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
85         Services service;
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);
91         }
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)
119                     .build());
120             return ModelMappingUtils.createDeleteServiceReply(
121                     input, ResponseCodes.FINAL_ACK_YES,
122                     LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
123         }
124
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());
130     }
131
132     /**
133      * Send notification to NBI notification in order to publish message.
134      * @param service PublishNotificationService
135      */
136     private void sendNbiNotification(PublishNotificationProcessService service) {
137         try {
138             notificationPublishService.putNotification(service);
139         } catch (InterruptedException e) {
140             LOG.warn("Cannot send notification to nbi", e);
141             Thread.currentThread().interrupt();
142         }
143     }
144
145 }