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