Technical debt - Service handler Sonar issues
[transportpce.git] / servicehandler / src / main / java / org / opendaylight / transportpce / servicehandler / service / RendererServiceWrapper.java
1 /*
2  * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.transportpce.servicehandler.service;
9
10 import com.google.common.util.concurrent.FutureCallback;
11 import com.google.common.util.concurrent.Futures;
12 import com.google.common.util.concurrent.ListenableFuture;
13 import com.google.common.util.concurrent.ListeningExecutorService;
14 import com.google.common.util.concurrent.MoreExecutors;
15 import java.util.concurrent.Executors;
16 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
17 import org.opendaylight.transportpce.common.ResponseCodes;
18 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
19 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceDeleteInput;
20 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceDeleteInputBuilder;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceDeleteOutput;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceDeleteOutputBuilder;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev171017.ServiceRpcResultSh;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev171017.ServiceRpcResultShBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ServiceNotificationTypes;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.configuration.response.common.ConfigurationResponseCommon;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.configuration.response.common.ConfigurationResponseCommonBuilder;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.TempServiceDeleteInput;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services;
30 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.RpcStatusEx;
31 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.handler.header.ServiceHandlerHeader;
32 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.handler.header.ServiceHandlerHeaderBuilder;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 /**
37  * Class to call RendererServiceOperations.
38  *
39  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
40  *
41  */
42 public class RendererServiceWrapper {
43
44     private static final Logger LOG = LoggerFactory.getLogger(RendererServiceWrapper.class);
45     private final RendererServiceOperations rendererServiceOperations;
46     private final NotificationPublishService notificationPublishService;
47     private ServiceRpcResultSh notification = null;
48     private final ListeningExecutorService executor;
49
50     public RendererServiceWrapper(RendererServiceOperations rendererServiceOperations,
51             NotificationPublishService notificationPublishService) {
52         this.rendererServiceOperations = rendererServiceOperations;
53         this.notificationPublishService = notificationPublishService;
54         this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
55     }
56
57     private void sendNotifications(ServiceRpcResultSh notif) {
58         try {
59             notificationPublishService.putNotification(notif);
60         } catch (InterruptedException e) {
61             LOG.info("notification offer rejected : ", e);
62         }
63     }
64
65     public ServiceDeleteOutput performRenderer(ServiceDeleteInput serviceDeleteInput,
66             ServiceNotificationTypes notifType, Services service) {
67         if (validateParams(serviceDeleteInput.getServiceName(), serviceDeleteInput.getServiceHandlerHeader(), false)) {
68             return performRenderer(serviceDeleteInput.getServiceName(), serviceDeleteInput.getServiceHandlerHeader(),
69                     ServiceNotificationTypes.ServiceDeleteResult, service);
70         } else {
71             return returnRendererFailed();
72         }
73     }
74
75     public ServiceDeleteOutput performRenderer(TempServiceDeleteInput tempServiceDeleteInput,
76             ServiceNotificationTypes notifType) {
77         String commonId = tempServiceDeleteInput.getCommonId();
78         if (validateParams(commonId, null, true)) {
79             ServiceHandlerHeader serviceHandler = new ServiceHandlerHeaderBuilder().setRequestId(commonId).build();
80             return performRenderer(tempServiceDeleteInput.getCommonId(), serviceHandler,
81                     ServiceNotificationTypes.ServiceDeleteResult, null);
82         } else {
83             return returnRendererFailed();
84         }
85     }
86
87     private ServiceDeleteOutput performRenderer(String serviceName, ServiceHandlerHeader serviceHandlerHeader,
88             ServiceNotificationTypes notifType, Services service) {
89         notification = new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName(serviceName)
90                 .setStatus(RpcStatusEx.Pending)
91                 .setStatusMessage("Service compliant, submitting temp service delete Request ...").build();
92         sendNotifications(notification);
93         FutureCallback<ServiceDeleteOutput> rendererCallback =
94                 new ServiceDeleteOutputFutureCallback(notifType, serviceName);
95         ServiceDeleteInput serviceDeleteInput = createRendererRequestInput(serviceName, serviceHandlerHeader);
96         ListenableFuture<ServiceDeleteOutput> renderer =
97                 this.rendererServiceOperations.serviceDelete(serviceDeleteInput, service);
98         Futures.addCallback(renderer, rendererCallback, executor);
99         ConfigurationResponseCommon value =
100                 new ConfigurationResponseCommonBuilder().setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
101                         .setRequestId(serviceDeleteInput.getServiceHandlerHeader().getRequestId())
102                         .setResponseCode(ResponseCodes.RESPONSE_OK)
103                         .setResponseMessage("Renderer service delete in progress").build();
104         return new ServiceDeleteOutputBuilder().setConfigurationResponseCommon(value).build();
105     }
106
107     private ServiceDeleteInput createRendererRequestInput(String serviceName,
108             ServiceHandlerHeader serviceHandlerHeader) {
109         LOG.info("Mapping ServiceDeleteInput or TempServiceDelete to Renderer requests");
110         return new ServiceDeleteInputBuilder().setServiceHandlerHeader(serviceHandlerHeader).setServiceName(serviceName)
111                 .build();
112     }
113
114     private static ServiceDeleteOutput returnRendererFailed() {
115         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
116                 .setAckFinalIndicator(ResponseCodes.FINAL_ACK_YES).setResponseCode(ResponseCodes.RESPONSE_FAILED)
117                 .setResponseMessage("Renderer service delete failed !").build();
118         return new ServiceDeleteOutputBuilder().setConfigurationResponseCommon(configurationResponseCommon).build();
119     }
120
121     private Boolean validateParams(String serviceName, ServiceHandlerHeader serviceHandlerHeader, boolean temp) {
122         boolean result = true;
123         if (!checkString(serviceName)) {
124             result = false;
125             LOG.error("Service Name (common-id for Temp service) is not set");
126         } else if (!temp && (serviceHandlerHeader == null)) {
127             LOG.error("Service serviceHandlerHeader 'request-id' is not set");
128             result = false;
129         }
130         return result;
131     }
132
133     private static boolean checkString(String value) {
134         return ((value != null) && (value.compareTo("") != 0));
135     }
136
137     private final class ServiceDeleteOutputFutureCallback implements FutureCallback<ServiceDeleteOutput> {
138         private final ServiceNotificationTypes notifType;
139         private final String serviceName;
140         String message = "";
141         ServiceRpcResultSh notification = null;
142
143         private ServiceDeleteOutputFutureCallback(ServiceNotificationTypes notifType, String serviceName) {
144             this.notifType = notifType;
145             this.serviceName = serviceName;
146         }
147
148         @Override
149         public void onSuccess(ServiceDeleteOutput response) {
150             if (response != null) {
151                 /**
152                  * If PCE reply is received before timer expiration with a positive result, a
153                  * service is created with admin and operational status 'down'.
154                  */
155                 message = "Renderer replied to service delete Request !";
156                 LOG.info("Renderer replied to service delete Request : {}", response);
157                 notification = new ServiceRpcResultShBuilder().setNotificationType(notifType)
158                         .setServiceName(serviceName).setStatus(RpcStatusEx.Successful).setStatusMessage(message)
159                         .build();
160                 sendNotifications(notification);
161             } else {
162                 message = "Renderer service delete failed ";
163                 notification = new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName("")
164                         .setStatus(RpcStatusEx.Failed).setStatusMessage(message).build();
165                 sendNotifications(notification);
166             }
167         }
168
169         @Override
170         public void onFailure(Throwable arg0) {
171             LOG.error("Renderer service delete failed !");
172             notification = new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName(serviceName)
173                     .setStatus(RpcStatusEx.Failed)
174                     .setStatusMessage("Renderer service delete request failed  : " + arg0.getMessage()).build();
175             sendNotifications(notification);
176         }
177     }
178 }
179