Add junit coverage to RequestInfoBuilder class
[appc.git] / appc-oam / appc-oam-bundle / src / main / java / org / onap / appc / oam / AppcOam.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2017 Amdocs
8  * =============================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * 
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  * ============LICENSE_END=========================================================
23  */
24
25 package org.onap.appc.oam;
26
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
29 import com.google.common.util.concurrent.Futures;
30 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
31 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
32 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
33 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
34 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.AppcOamService;
35 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.AppcState;
36 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.GetAppcStateOutput;
37 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.GetAppcStateOutputBuilder;
38 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.GetMetricsOutput;
39 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.GetMetricsOutputBuilder;
40 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.MaintenanceModeInput;
41 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.MaintenanceModeOutput;
42 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.MaintenanceModeOutputBuilder;
43 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.RestartInput;
44 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.RestartOutput;
45 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.RestartOutputBuilder;
46 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.StartInput;
47 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.StartOutput;
48 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.StartOutputBuilder;
49 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.StopInput;
50 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.StopOutput;
51 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.StopOutputBuilder;
52 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.common.header.CommonHeader;
53 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.get.metrics.output.Metrics;
54 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.get.metrics.output.MetricsBuilder;
55 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.get.metrics.output.metrics.KpiValues;
56 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.get.metrics.output.metrics.KpiValuesBuilder;
57 import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.status.Status;
58 import org.opendaylight.yangtools.yang.common.RpcError;
59 import org.opendaylight.yangtools.yang.common.RpcResult;
60 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
61 import org.onap.appc.exceptions.APPCException;
62 import org.onap.appc.i18n.Msg;
63 import org.onap.appc.metricservice.MetricRegistry;
64 import org.onap.appc.metricservice.MetricService;
65 import org.onap.appc.metricservice.metric.Metric;
66 import org.onap.appc.oam.processor.OamMmodeProcessor;
67 import org.onap.appc.oam.processor.OamRestartProcessor;
68 import org.onap.appc.oam.processor.OamStartProcessor;
69 import org.onap.appc.oam.processor.OamStopProcessor;
70 import org.onap.appc.oam.util.AsyncTaskHelper;
71 import org.onap.appc.oam.util.ConfigurationHelper;
72 import org.onap.appc.oam.util.OperationHelper;
73 import org.onap.appc.oam.util.StateHelper;
74 import org.onap.appc.statemachine.impl.readers.AppcOamMetaDataReader.AppcOperation;
75
76 import java.util.ArrayList;
77 import java.util.List;
78 import java.util.Map;
79 import java.util.concurrent.Future;
80
81 /**
82  * RPC class of APP-C OAM API.
83  * <p>Implement all the RPCs defined in AppcOamService through yang model definition.
84  * <p>All RPC methods' JAVADOC are using "inheritDoc" to use the description from the yang model file.
85  */
86 public class AppcOam implements AutoCloseable, AppcOamService {
87     /**
88      * Invalid state message format with fliexible operation, appc name and state values
89      */
90     public final static String INVALID_STATE_MESSAGE_FORMAT = "%s API is not allowed when %s is in the %s state.";
91
92     private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcOam.class);
93
94     private boolean isMetricEnabled = false;
95
96     /**
97      * Represents our RPC implementation registration
98      */
99     private BindingAwareBroker.RpcRegistration<AppcOamService> rpcRegistration;
100
101
102     /**
103      * The yang rpc names with value mapping to AppcOperation
104      */
105     public enum RPC {
106         maintenance_mode(AppcOperation.MaintenanceMode),
107         start(AppcOperation.Start),
108         stop(AppcOperation.Stop),
109         restart(AppcOperation.Restart);
110
111         AppcOperation appcOperation;
112
113         RPC(AppcOperation appcOperation) {
114             this.appcOperation = appcOperation;
115         }
116
117         public AppcOperation getAppcOperation() {
118             return appcOperation;
119         }
120     }
121
122     private AsyncTaskHelper asyncTaskHelper;
123     private ConfigurationHelper configurationHelper;
124     private OperationHelper operationHelper;
125     private StateHelper stateHelper;
126
127     /**
128      * APP-C OAM contructor
129      *
130      * @param dataBroker                  object of The ODL data store broker. Provides access to a conceptual data
131      *                                    tree store
132      *                                    and also provides the ability to subscribe for changes to data under a
133      *                                    given branch
134      *                                    of the tree. Not used in this class.
135      * @param notificationProviderService object of ODL Notification Service that provides publish/subscribe
136      *                                    capabilities for YANG modeled notifications. Not used in this class.
137      * @param rpcProviderRegistry         object of RpcProviderResigstry. Used to register our RPCs.
138      */
139     @SuppressWarnings({"unused", "nls"})
140     public AppcOam(DataBroker dataBroker,
141                    NotificationProviderService notificationProviderService,
142                    RpcProviderRegistry rpcProviderRegistry) {
143
144         configurationHelper = new ConfigurationHelper(logger);
145         String appName = configurationHelper.getAppcName();
146         logger.info(Msg.COMPONENT_INITIALIZING, appName, "oam");
147
148         if (rpcProviderRegistry != null) {
149             rpcRegistration = rpcProviderRegistry.addRpcImplementation(AppcOamService.class, this);
150         }
151
152         isMetricEnabled = configurationHelper.isMetricEnabled();
153
154         initHelpers();
155
156         logger.info(Msg.COMPONENT_INITIALIZED, appName, "oam");
157     }
158
159     /**
160      * Initialize helper classes.
161      * <p>Note: ConfigurationHelper initializetion is in included here
162      * because it is needed for extracting the AppName used in the debug logs within the constructor.
163      */
164     private void initHelpers() {
165         operationHelper = new OperationHelper();
166         asyncTaskHelper = new AsyncTaskHelper(logger);
167         stateHelper = new StateHelper(logger, configurationHelper);
168     }
169
170     /**
171      * Implements the close of the service
172      *
173      * @see AutoCloseable#close()
174      */
175     @SuppressWarnings("nls")
176     @Override
177     public void close() throws Exception {
178         String appName = configurationHelper.getAppcName();
179         logger.info(Msg.COMPONENT_TERMINATING, appName, "oam");
180
181         asyncTaskHelper.close();
182
183         if (rpcRegistration != null) {
184             rpcRegistration.close();
185         }
186         logger.info(Msg.COMPONENT_TERMINATED, appName, "oam");
187     }
188
189     /**
190      * {@inheritDoc}
191      */
192     @Override
193     public Future<RpcResult<GetMetricsOutput>> getMetrics() {
194
195         if (!isMetricEnabled) {
196             logger.error("Metric Service not enabled returning failure");
197             RpcResult<GetMetricsOutput> result = RpcResultBuilder.<GetMetricsOutput>
198                     status(false).withError(RpcError.ErrorType.APPLICATION, "Metric Service not enabled").build();
199             return Futures.immediateFuture(result);
200         }
201
202         MetricService metricService;
203         try {
204             metricService = operationHelper.getService(MetricService.class);
205         } catch (APPCException e) {
206             logger.error("MetricService not found", e);
207             RpcResult<GetMetricsOutput> result = RpcResultBuilder.<GetMetricsOutput>
208                     status(false).withError(RpcError.ErrorType.APPLICATION, "Metric Service not found").build();
209             return Futures.immediateFuture(result);
210         }
211
212         Map<String, MetricRegistry> allMetricRegitry = metricService.getAllRegistry();
213         if (allMetricRegitry == null || allMetricRegitry.isEmpty()) {
214             logger.error("No metrics registered returning failure");
215             RpcResult<GetMetricsOutput> result = RpcResultBuilder.<GetMetricsOutput>
216                     status(false).withError(RpcError.ErrorType.APPLICATION, "No metrics Registered").build();
217             return Futures.immediateFuture(result);
218         }
219
220         List<Metrics> metricsList = new ArrayList<>();
221
222         logger.debug("Iterating metric registry list");
223         for (MetricRegistry metricRegistry : allMetricRegitry.values()) {
224             logger.debug("Iterating metric registry :" + metricRegistry.toString());
225             Metric[] metrics = metricRegistry.metrics();
226             if (metrics != null && metrics.length > 0) {
227                 logger.debug("Iterating though metrics in registry");
228                 for (Metric metric : metrics) {
229                     logger.debug("Iterating though metrics: " + metric.name());
230                     MetricsBuilder metricsBuilder = new MetricsBuilder();
231                     metricsBuilder.setKpiName(metric.name());
232                     metricsBuilder.setLastResetTime(metric.getLastModified());
233                     List<KpiValues> kpiList = new ArrayList<>();
234                     Map<String, String> metricsOutput = metric.getMetricsOutput();
235                     for (Map.Entry<String, String> kpi : metricsOutput.entrySet()) {
236                         KpiValuesBuilder kpiValuesBuilder = new KpiValuesBuilder();
237                         kpiValuesBuilder.setName(kpi.getKey());
238                         kpiValuesBuilder.setValue(kpi.getValue());
239                         kpiList.add(kpiValuesBuilder.build());
240                     }
241                     metricsBuilder.setKpiValues(kpiList);
242                     metricsList.add(metricsBuilder.build());
243                 }
244             }
245         }
246
247         GetMetricsOutputBuilder outputBuilder = new GetMetricsOutputBuilder();
248         outputBuilder.setMetrics(metricsList);
249         RpcResult<GetMetricsOutput> result = RpcResultBuilder.<GetMetricsOutput>
250                 status(true).withResult(outputBuilder.build()).build();
251         return Futures.immediateFuture(result);
252     }
253
254     /**
255      * {@inheritDoc}
256      */
257     @Override
258     public Future<RpcResult<StopOutput>> stop(StopInput stopInput) {
259         logger.debug("Entering Stop with Input : " + stopInput);
260         final CommonHeader commonHeader = stopInput.getCommonHeader();
261
262         OamStopProcessor oamStopProcessor =
263                 new OamStopProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
264         Status status = oamStopProcessor.processRequest(stopInput);
265
266         StopOutputBuilder stopOutputBuilder = new StopOutputBuilder();
267         stopOutputBuilder.setStatus(status);
268         stopOutputBuilder.setCommonHeader(commonHeader);
269         return RpcResultBuilder.success(stopOutputBuilder.build()).buildFuture();
270     }
271
272     /**
273      * {@inheritDoc}
274      */
275     @Override
276     public Future<RpcResult<RestartOutput>> restart(RestartInput input) {
277         logger.debug("Entering restart with Input : " + input);
278         final CommonHeader commonHeader = input.getCommonHeader();
279
280         OamRestartProcessor oamRestartProcessor =
281                 new OamRestartProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
282         Status status = oamRestartProcessor.processRequest(input);
283
284         RestartOutputBuilder restartOutputBuilder = new RestartOutputBuilder();
285         restartOutputBuilder.setStatus(status);
286         restartOutputBuilder.setCommonHeader(commonHeader);
287
288         return RpcResultBuilder.success(restartOutputBuilder.build()).buildFuture();
289     }
290
291     /**
292      * {@inheritDoc}
293      */
294     @Override
295     public Future<RpcResult<MaintenanceModeOutput>> maintenanceMode(MaintenanceModeInput maintenanceModeInput) {
296         logger.debug("Entering MaintenanceMode with Input : " + maintenanceModeInput);
297         final CommonHeader commonHeader = maintenanceModeInput.getCommonHeader();
298
299         OamMmodeProcessor oamMmodeProcessor =
300                 new OamMmodeProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
301         Status status = oamMmodeProcessor.processRequest(maintenanceModeInput);
302
303         MaintenanceModeOutputBuilder maintenanceModeOutputBuilder = new MaintenanceModeOutputBuilder();
304         maintenanceModeOutputBuilder.setStatus(status);
305         maintenanceModeOutputBuilder.setCommonHeader(commonHeader);
306         return RpcResultBuilder.success(maintenanceModeOutputBuilder.build()).buildFuture();
307     }
308
309     /**
310      * {@inheritDoc}
311      */
312     @Override
313     public Future<RpcResult<GetAppcStateOutput>> getAppcState() {
314         AppcState appcState = stateHelper.getCurrentOamYangState();
315
316         GetAppcStateOutputBuilder builder = new GetAppcStateOutputBuilder();
317         builder.setState(appcState);
318         return RpcResultBuilder.success(builder.build()).buildFuture();
319     }
320
321     /**
322      * {@inheritDoc}
323      */
324     @Override
325     public Future<RpcResult<StartOutput>> start(StartInput startInput) {
326         logger.debug("Input received : " + startInput);
327         final CommonHeader commonHeader = startInput.getCommonHeader();
328
329         OamStartProcessor oamStartProcessor =
330                 new OamStartProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
331         Status status = oamStartProcessor.processRequest(startInput);
332
333         StartOutputBuilder startOutputBuilder = new StartOutputBuilder();
334         startOutputBuilder.setStatus(status);
335         startOutputBuilder.setCommonHeader(commonHeader);
336         StartOutput startOutput = startOutputBuilder.build();
337         return RpcResultBuilder.success(startOutput).buildFuture();
338     }
339 }