fix import extra separations
[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.rev171017.ServiceDeleteInput;
20 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017.ServiceDeleteInputBuilder;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017.ServiceDeleteOutput;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017.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.transportpce.b.c._interface.service.types.rev200128.RpcStatusEx;
30 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.handler.header.ServiceHandlerHeader;
31 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.handler.header.ServiceHandlerHeaderBuilder;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * Class to call RendererServiceOperations.
37  *
38  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
39  *
40  */
41 public class RendererServiceWrapper {
42
43     private static final Logger LOG = LoggerFactory.getLogger(RendererServiceWrapper.class);
44     private final RendererServiceOperations rendererServiceOperations;
45     private final NotificationPublishService notificationPublishService;
46     private ServiceRpcResultSh notification = null;
47     private final ListeningExecutorService executor;
48
49     public RendererServiceWrapper(RendererServiceOperations rendererServiceOperations,
50             NotificationPublishService notificationPublishService) {
51         this.rendererServiceOperations = rendererServiceOperations;
52         this.notificationPublishService = notificationPublishService;
53         this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
54     }
55
56     private void sendNotifications(ServiceRpcResultSh notif) {
57         try {
58             notificationPublishService.putNotification(notif);
59         } catch (InterruptedException e) {
60             LOG.info("notification offer rejected : ", e);
61         }
62     }
63
64     public ServiceDeleteOutput performRenderer(ServiceDeleteInput serviceDeleteInput,
65             ServiceNotificationTypes notifType) {
66         if (validateParams(serviceDeleteInput.getServiceName(), serviceDeleteInput.getServiceHandlerHeader(), false)) {
67             return performRenderer(serviceDeleteInput.getServiceName(), serviceDeleteInput.getServiceHandlerHeader(),
68                     ServiceNotificationTypes.ServiceDeleteResult);
69         } else {
70             return returnRendererFailed();
71         }
72     }
73
74     public ServiceDeleteOutput performRenderer(TempServiceDeleteInput tempServiceDeleteInput,
75             ServiceNotificationTypes notifType) {
76         String commonId = tempServiceDeleteInput.getCommonId();
77         if (validateParams(commonId, null, true)) {
78             ServiceHandlerHeader serviceHandler = new ServiceHandlerHeaderBuilder().setRequestId(commonId).build();
79             return performRenderer(tempServiceDeleteInput.getCommonId(), serviceHandler,
80                     ServiceNotificationTypes.ServiceDeleteResult);
81         } else {
82             return returnRendererFailed();
83         }
84     }
85
86     private ServiceDeleteOutput performRenderer(String serviceName, ServiceHandlerHeader serviceHandlerHeader,
87             ServiceNotificationTypes notifType) {
88         notification = new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName(serviceName)
89                 .setStatus(RpcStatusEx.Pending)
90                 .setStatusMessage("Service compliant, submitting temp service delete Request ...").build();
91         sendNotifications(notification);
92         FutureCallback<ServiceDeleteOutput> rendererCallback = new FutureCallback<ServiceDeleteOutput>() {
93
94             String message = "";
95             ServiceRpcResultSh notification = null;
96
97             @Override
98             public void onSuccess(ServiceDeleteOutput response) {
99                 if (response != null) {
100                     /**
101                      * If PCE reply is received before timer expiration with a positive result, a
102                      * service is created with admin and operational status 'down'.
103                      */
104                     message = "Renderer replied to service delete Request !";
105                     LOG.info("Renderer replied to service delete Request : {}", response);
106                     notification =
107                             new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName(serviceName)
108                                     .setStatus(RpcStatusEx.Successful).setStatusMessage(message).build();
109                     sendNotifications(notification);
110                 } else {
111                     message = "Renderer service delete failed ";
112                     notification = new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName("")
113                             .setStatus(RpcStatusEx.Failed).setStatusMessage(message).build();
114                     sendNotifications(notification);
115                 }
116             }
117
118             @Override
119             public void onFailure(Throwable arg0) {
120                 LOG.error("Renderer service delete failed !");
121                 notification = new ServiceRpcResultShBuilder().setNotificationType(notifType)
122                         .setServiceName(serviceName)
123                         .setStatus(RpcStatusEx.Failed)
124                         .setStatusMessage("Renderer service delete request failed  : " + arg0.getMessage()).build();
125                 sendNotifications(notification);
126             }
127         };
128         ServiceDeleteInput serviceDeleteInput = createRendererRequestInput(serviceName, serviceHandlerHeader);
129         ListenableFuture<ServiceDeleteOutput> renderer =
130                 this.rendererServiceOperations.serviceDelete(serviceDeleteInput);
131         Futures.addCallback(renderer, rendererCallback, executor);
132         ConfigurationResponseCommon value =
133                 new ConfigurationResponseCommonBuilder().setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
134                         .setRequestId(serviceDeleteInput.getServiceHandlerHeader().getRequestId())
135                         .setResponseCode(ResponseCodes.RESPONSE_OK)
136                         .setResponseMessage("Renderer service delete in progress").build();
137         return new ServiceDeleteOutputBuilder().setConfigurationResponseCommon(value).build();
138     }
139
140     private ServiceDeleteInput createRendererRequestInput(String serviceName,
141             ServiceHandlerHeader serviceHandlerHeader) {
142         LOG.info("Mapping ServiceDeleteInput or TempServiceDelete to Renderer requests");
143         return new ServiceDeleteInputBuilder().setServiceHandlerHeader(serviceHandlerHeader).setServiceName(serviceName)
144                 .build();
145     }
146
147     private static ServiceDeleteOutput returnRendererFailed() {
148         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
149                 .setAckFinalIndicator(ResponseCodes.FINAL_ACK_YES).setResponseCode(ResponseCodes.RESPONSE_FAILED)
150                 .setResponseMessage("Renderer service delete failed !").build();
151         return new ServiceDeleteOutputBuilder().setConfigurationResponseCommon(configurationResponseCommon).build();
152     }
153
154     private Boolean validateParams(String serviceName, ServiceHandlerHeader serviceHandlerHeader, boolean temp) {
155         boolean result = true;
156         if (!checkString(serviceName)) {
157             result = false;
158             LOG.error("Service Name (common-id for Temp service) is not set");
159         } else if (!temp && (serviceHandlerHeader == null)) {
160             LOG.error("Service serviceHandlerHeader 'request-id' is not set");
161             result = false;
162         }
163         return result;
164     }
165
166     private static boolean checkString(String value) {
167         return ((value != null) && (value.compareTo("") != 0));
168     }
169 }
170