2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 * ============LICENSE_END=========================================================
25 package org.openecomp.appc.oam;
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.openecomp.appc.oam.rev170303.AppcOamService;
35 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.AppcState;
36 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.GetAppcStateOutput;
37 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.GetAppcStateOutputBuilder;
38 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.GetMetricsOutput;
39 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.GetMetricsOutputBuilder;
40 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.MaintenanceModeInput;
41 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.MaintenanceModeOutput;
42 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.MaintenanceModeOutputBuilder;
43 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.RestartInput;
44 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.RestartOutput;
45 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.RestartOutputBuilder;
46 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StartInput;
47 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StartOutput;
48 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StartOutputBuilder;
49 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StopInput;
50 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StopOutput;
51 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StopOutputBuilder;
52 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.common.header.CommonHeader;
53 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.get.metrics.output.Metrics;
54 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.get.metrics.output.MetricsBuilder;
55 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.get.metrics.output.metrics.KpiValues;
56 import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.get.metrics.output.metrics.KpiValuesBuilder;
57 import org.opendaylight.yang.gen.v1.org.openecomp.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.openecomp.appc.exceptions.APPCException;
62 import org.openecomp.appc.i18n.Msg;
63 import org.openecomp.appc.metricservice.MetricRegistry;
64 import org.openecomp.appc.metricservice.MetricService;
65 import org.openecomp.appc.metricservice.metric.Metric;
66 import org.openecomp.appc.oam.processor.OamMmodeProcessor;
67 import org.openecomp.appc.oam.processor.OamRestartProcessor;
68 import org.openecomp.appc.oam.processor.OamStartProcessor;
69 import org.openecomp.appc.oam.processor.OamStopProcessor;
70 import org.openecomp.appc.oam.util.AsyncTaskHelper;
71 import org.openecomp.appc.oam.util.ConfigurationHelper;
72 import org.openecomp.appc.oam.util.OperationHelper;
73 import org.openecomp.appc.oam.util.StateHelper;
74 import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader.AppcOperation;
76 import java.util.ArrayList;
77 import java.util.List;
79 import java.util.concurrent.Future;
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.
86 public class AppcOam implements AutoCloseable, AppcOamService {
88 * Invalid state message format with fliexible operation, appc name and state values
90 public final static String INVALID_STATE_MESSAGE_FORMAT = "%s API is not allowed when %s is in the %s state.";
92 private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcOam.class);
94 private boolean isMetricEnabled = false;
97 * Represents our RPC implementation registration
99 private BindingAwareBroker.RpcRegistration<AppcOamService> rpcRegistration;
103 * The yang rpc names with value mapping to AppcOperation
106 maintenance_mode(AppcOperation.MaintenanceMode),
107 start(AppcOperation.Start),
108 stop(AppcOperation.Stop),
109 restart(AppcOperation.Restart);
111 AppcOperation appcOperation;
113 RPC(AppcOperation appcOperation) {
114 this.appcOperation = appcOperation;
117 public AppcOperation getAppcOperation() {
118 return appcOperation;
122 private AsyncTaskHelper asyncTaskHelper;
123 private ConfigurationHelper configurationHelper;
124 private OperationHelper operationHelper;
125 private StateHelper stateHelper;
128 * APP-C OAM contructor
130 * @param dataBroker object of The ODL data store broker. Provides access to a conceptual data
132 * and also provides the ability to subscribe for changes to data under a
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.
139 @SuppressWarnings({"unused", "nls"})
140 public AppcOam(DataBroker dataBroker,
141 NotificationProviderService notificationProviderService,
142 RpcProviderRegistry rpcProviderRegistry) {
144 configurationHelper = new ConfigurationHelper(logger);
145 String appName = configurationHelper.getAppcName();
146 logger.info(Msg.COMPONENT_INITIALIZING, appName, "oam");
148 if (rpcProviderRegistry != null) {
149 rpcRegistration = rpcProviderRegistry.addRpcImplementation(AppcOamService.class, this);
152 isMetricEnabled = configurationHelper.isMetricEnabled();
156 logger.info(Msg.COMPONENT_INITIALIZED, appName, "oam");
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.
164 private void initHelpers() {
165 operationHelper = new OperationHelper();
166 asyncTaskHelper = new AsyncTaskHelper(logger);
167 stateHelper = new StateHelper(logger, configurationHelper);
171 * Implements the close of the service
173 * @see AutoCloseable#close()
175 @SuppressWarnings("nls")
177 public void close() throws Exception {
178 String appName = configurationHelper.getAppcName();
179 logger.info(Msg.COMPONENT_TERMINATING, appName, "oam");
181 asyncTaskHelper.close();
183 if (rpcRegistration != null) {
184 rpcRegistration.close();
186 logger.info(Msg.COMPONENT_TERMINATED, appName, "oam");
193 public Future<RpcResult<GetMetricsOutput>> getMetrics() {
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);
202 MetricService metricService;
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);
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);
220 List<Metrics> metricsList = new ArrayList<>();
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());
241 metricsBuilder.setKpiValues(kpiList);
242 metricsList.add(metricsBuilder.build());
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);
258 public Future<RpcResult<StopOutput>> stop(StopInput stopInput) {
259 logger.debug("Entering Stop with Input : " + stopInput);
260 final CommonHeader commonHeader = stopInput.getCommonHeader();
262 OamStopProcessor oamStopProcessor =
263 new OamStopProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
264 Status status = oamStopProcessor.processRequest(stopInput);
266 StopOutputBuilder stopOutputBuilder = new StopOutputBuilder();
267 stopOutputBuilder.setStatus(status);
268 stopOutputBuilder.setCommonHeader(commonHeader);
269 return RpcResultBuilder.success(stopOutputBuilder.build()).buildFuture();
276 public Future<RpcResult<RestartOutput>> restart(RestartInput input) {
277 logger.debug("Entering restart with Input : " + input);
278 final CommonHeader commonHeader = input.getCommonHeader();
280 OamRestartProcessor oamRestartProcessor =
281 new OamRestartProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
282 Status status = oamRestartProcessor.processRequest(input);
284 RestartOutputBuilder restartOutputBuilder = new RestartOutputBuilder();
285 restartOutputBuilder.setStatus(status);
286 restartOutputBuilder.setCommonHeader(commonHeader);
288 return RpcResultBuilder.success(restartOutputBuilder.build()).buildFuture();
295 public Future<RpcResult<MaintenanceModeOutput>> maintenanceMode(MaintenanceModeInput maintenanceModeInput) {
296 logger.debug("Entering MaintenanceMode with Input : " + maintenanceModeInput);
297 final CommonHeader commonHeader = maintenanceModeInput.getCommonHeader();
299 OamMmodeProcessor oamMmodeProcessor =
300 new OamMmodeProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
301 Status status = oamMmodeProcessor.processRequest(maintenanceModeInput);
303 MaintenanceModeOutputBuilder maintenanceModeOutputBuilder = new MaintenanceModeOutputBuilder();
304 maintenanceModeOutputBuilder.setStatus(status);
305 maintenanceModeOutputBuilder.setCommonHeader(commonHeader);
306 return RpcResultBuilder.success(maintenanceModeOutputBuilder.build()).buildFuture();
313 public Future<RpcResult<GetAppcStateOutput>> getAppcState() {
314 AppcState appcState = stateHelper.getCurrentOamYangState();
316 GetAppcStateOutputBuilder builder = new GetAppcStateOutputBuilder();
317 builder.setState(appcState);
318 return RpcResultBuilder.success(builder.build()).buildFuture();
325 public Future<RpcResult<StartOutput>> start(StartInput startInput) {
326 logger.debug("Input received : " + startInput);
327 final CommonHeader commonHeader = startInput.getCommonHeader();
329 OamStartProcessor oamStartProcessor =
330 new OamStartProcessor(logger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);
331 Status status = oamStartProcessor.processRequest(startInput);
333 StartOutputBuilder startOutputBuilder = new StartOutputBuilder();
334 startOutputBuilder.setStatus(status);
335 startOutputBuilder.setCommonHeader(commonHeader);
336 StartOutput startOutput = startOutputBuilder.build();
337 return RpcResultBuilder.success(startOutput).buildFuture();