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.provider;
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
29 import com.att.eelf.i18n.EELFResourceManager;
30 import com.google.common.util.concurrent.Futures;
31 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
33 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
34 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
35 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.AppcProviderLcmService;
36 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.AuditInput;
37 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.AuditOutput;
38 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.AuditOutputBuilder;
39 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.CheckLockInput;
40 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.CheckLockOutput;
41 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.CheckLockOutputBuilder;
42 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigBackupDeleteInput;
43 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigBackupDeleteOutput;
44 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigBackupDeleteOutputBuilder;
45 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigBackupInput;
46 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigBackupOutput;
47 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigBackupOutputBuilder;
48 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigExportInput;
49 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigExportOutput;
50 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigExportOutputBuilder;
51 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigModifyInput;
52 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigModifyOutput;
53 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigModifyOutputBuilder;
54 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigRestoreInput;
55 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigRestoreOutput;
56 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigRestoreOutputBuilder;
57 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigScaleoutInput;
58 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigScaleoutOutput;
59 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigScaleoutOutputBuilder;
60 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigureInput;
61 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigureOutput;
62 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.ConfigureOutputBuilder;
63 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.EvacuateInput;
64 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.EvacuateOutput;
65 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.EvacuateOutputBuilder;
66 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.HealthCheckInput;
67 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.HealthCheckOutput;
68 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.HealthCheckOutputBuilder;
69 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.LiveUpgradeInput;
70 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.LiveUpgradeOutput;
71 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.LiveUpgradeOutputBuilder;
72 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.LockInput;
73 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.LockOutput;
74 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.LockOutputBuilder;
75 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.MigrateInput;
76 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.MigrateOutput;
77 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.MigrateOutputBuilder;
78 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RebuildInput;
79 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RebuildOutput;
80 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RebuildOutputBuilder;
81 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RestartInput;
82 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RestartOutput;
83 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RestartOutputBuilder;
84 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RollbackInput;
85 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RollbackOutput;
86 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.RollbackOutputBuilder;
87 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SnapshotInput;
88 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SnapshotOutput;
89 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SnapshotOutputBuilder;
90 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SoftwareUploadInput;
91 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SoftwareUploadOutput;
92 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SoftwareUploadOutputBuilder;
93 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StartInput;
94 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StartOutput;
95 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StartOutputBuilder;
96 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StopInput;
97 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StopOutput;
98 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StopOutputBuilder;
99 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SyncInput;
100 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SyncOutput;
101 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.SyncOutputBuilder;
102 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.TerminateInput;
103 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.TerminateOutput;
104 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.TerminateOutputBuilder;
105 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.TestInput;
106 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.TestOutput;
107 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.TestOutputBuilder;
108 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.UnlockInput;
109 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.UnlockOutput;
110 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.UnlockOutputBuilder;
111 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StartApplicationOutput;
112 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StartApplicationOutputBuilder;
113 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StartApplicationInput;
114 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StopApplicationOutput;
115 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StopApplicationOutputBuilder;
116 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.StopApplicationInput;
117 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.Status;
118 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.StatusBuilder;
119 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.Action;
120 import org.opendaylight.yangtools.yang.common.RpcResult;
121 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
122 import org.openecomp.appc.Constants;
123 import org.openecomp.appc.configuration.Configuration;
124 import org.openecomp.appc.configuration.ConfigurationFactory;
125 import org.openecomp.appc.domainmodel.lcm.ResponseContext;
126 import org.openecomp.appc.exceptions.APPCException;
127 import org.openecomp.appc.executor.objects.LCMCommandStatus;
128 import org.openecomp.appc.executor.objects.Params;
129 import org.openecomp.appc.i18n.Msg;
130 import org.openecomp.appc.logging.LoggingConstants;
131 import org.openecomp.appc.logging.LoggingUtils;
132 import org.openecomp.appc.provider.lcm.util.RequestInputBuilder;
133 import org.openecomp.appc.provider.lcm.util.ValidationService;
134 import org.openecomp.appc.requesthandler.RequestHandler;
135 import org.openecomp.appc.requesthandler.objects.RequestHandlerInput;
136 import org.openecomp.appc.requesthandler.objects.RequestHandlerOutput;
137 import org.osgi.framework.BundleContext;
138 import org.osgi.framework.FrameworkUtil;
139 import org.osgi.framework.ServiceReference;
141 import java.text.ParseException;
142 import java.util.concurrent.ExecutorService;
143 import java.util.concurrent.Executors;
144 import java.util.concurrent.Future;
146 public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
148 private Configuration configuration = ConfigurationFactory.getConfiguration();
149 private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class);
151 private final ExecutorService executor;
153 private final String COMMON_ERROR_MESSAGE_TEMPLATE = "Error processing %s input : %s";
156 * The ODL data store broker. Provides access to a conceptual data tree store and also provides the ability to
157 * subscribe for changes to data under a given branch of the tree.
159 protected DataBroker dataBroker;
162 * ODL Notification Service that provides publish/subscribe capabilities for YANG modeled notifications.
164 protected NotificationProviderService notificationService;
167 * Provides a registry for Remote Procedure Call (RPC) service implementations. The RPCs are defined in YANG models.
169 protected RpcProviderRegistry rpcRegistry;
172 * Represents our RPC implementation registration
174 protected BindingAwareBroker.RpcRegistration<AppcProviderLcmService> rpcRegistration;
179 * @param notificationProviderService
180 * @param rpcProviderRegistry
185 public AppcProviderLcm(DataBroker dataBroker, NotificationProviderService notificationProviderService,
186 RpcProviderRegistry rpcProviderRegistry) {
188 String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
189 logger.info(Msg.COMPONENT_INITIALIZING, appName, "provider-lcm");
191 executor = Executors.newFixedThreadPool(1);
192 this.dataBroker = dataBroker;
193 this.notificationService = notificationProviderService;
194 this.rpcRegistry = rpcProviderRegistry;
196 if (this.rpcRegistry != null) {
197 rpcRegistration = rpcRegistry.addRpcImplementation(AppcProviderLcmService.class, this);
200 logger.info(Msg.COMPONENT_INITIALIZED, appName, "provider");
204 * Implements the close of the service
206 * @see java.lang.AutoCloseable#close()
208 @SuppressWarnings("nls")
210 public void close() throws Exception {
211 String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
212 logger.info(Msg.COMPONENT_TERMINATING, appName, "provider");
214 if (rpcRegistration != null) {
215 rpcRegistration.close();
217 logger.info(Msg.COMPONENT_TERMINATED, appName, "provider");
222 * Rebuilds a specific VNF
224 * @see AppcProviderLcmService#rebuild(RebuildInput)
227 public Future<RpcResult<RebuildOutput>> rebuild(RebuildInput input) {
228 logger.debug("Input received : " + input.toString());
230 RebuildOutputBuilder outputBuilder = new RebuildOutputBuilder();
231 String action = Action.Rebuild.toString() ;
232 String rpcName = Action.Rebuild.name().toLowerCase();
234 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
237 RequestHandlerInput request = new RequestInputBuilder().requestContext()
238 .commonHeader(input.getCommonHeader())
239 .actionIdentifiers(input.getActionIdentifiers())
240 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
241 status = buildStatusWithDispatcherOutput(executeRequest(request));
242 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
243 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
244 } catch (ParseException e) {
245 status = buildParsingErrorStatus(e);
247 LoggingUtils.logErrorMessage(
248 LoggingConstants.TargetNames.APPC_PROVIDER,
249 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
250 this.getClass().getName());
254 outputBuilder.setCommonHeader(input.getCommonHeader());
255 outputBuilder.setStatus(status);
256 RpcResult<RebuildOutput> result = RpcResultBuilder.<RebuildOutput> status(true).withResult(outputBuilder.build()).build();
257 return Futures.immediateFuture(result);
261 * Restarts a specific VNF
263 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.AppcProviderLcmService#restart(RestartInput)
266 public Future<RpcResult<RestartOutput>> restart(RestartInput input) {
267 logger.debug("Input received : " + input.toString());
269 RestartOutputBuilder outputBuilder = new RestartOutputBuilder();
270 String action = Action.Restart.toString() ;
271 String rpcName = Action.Restart.name().toLowerCase();
273 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
276 RequestHandlerInput request = new RequestInputBuilder().requestContext()
277 .commonHeader(input.getCommonHeader())
278 .actionIdentifiers(input.getActionIdentifiers())
279 .payload(input.getPayload())
284 status = buildStatusWithDispatcherOutput(executeRequest(request));
285 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
286 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
287 } catch (ParseException e) {
288 status = buildParsingErrorStatus(e);
290 LoggingUtils.logErrorMessage(
291 LoggingConstants.TargetNames.APPC_PROVIDER,
292 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
293 this.getClass().getName());
297 outputBuilder.setCommonHeader(input.getCommonHeader());
298 outputBuilder.setStatus(status);
299 RpcResult<RestartOutput> result = RpcResultBuilder.<RestartOutput> status(true).withResult(outputBuilder.build()).build();
300 return Futures.immediateFuture(result);
304 * Migrates a specific VNF
306 * @see AppcProviderLcmService#migrate(MigrateInput)
309 public Future<RpcResult<MigrateOutput>> migrate(MigrateInput input) {
310 logger.debug("Input received : " + input.toString());
312 MigrateOutputBuilder outputBuilder = new MigrateOutputBuilder();
313 String action = Action.Migrate.toString() ;
314 String rpcName = Action.Migrate.name().toLowerCase();
316 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
319 RequestHandlerInput request = new RequestInputBuilder().requestContext()
320 .commonHeader(input.getCommonHeader())
321 .actionIdentifiers(input.getActionIdentifiers())
322 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
323 status = buildStatusWithDispatcherOutput(executeRequest(request));
324 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
325 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
326 } catch (ParseException e) {
327 status = buildParsingErrorStatus(e);
329 LoggingUtils.logErrorMessage(
330 LoggingConstants.TargetNames.APPC_PROVIDER,
331 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
332 this.getClass().getName());
336 outputBuilder.setCommonHeader(input.getCommonHeader());
337 outputBuilder.setStatus(status);
338 RpcResult<MigrateOutput> result = RpcResultBuilder.<MigrateOutput> status(true).withResult(outputBuilder.build()).build();
339 return Futures.immediateFuture(result);
343 * Evacuates a specific VNF
345 * @see AppcProviderLcmService#evacuate(EvacuateInput)
348 public Future<RpcResult<EvacuateOutput>> evacuate(EvacuateInput input) {
349 logger.debug("Input received : " + input.toString());
351 EvacuateOutputBuilder outputBuilder = new EvacuateOutputBuilder();
352 String action = Action.Evacuate.toString() ;
353 String rpcName = Action.Evacuate.name().toLowerCase();
354 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
357 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
358 status = buildStatusWithDispatcherOutput(executeRequest(request));
359 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
360 } catch (ParseException e) {
361 status = buildParsingErrorStatus(e);
363 LoggingUtils.logErrorMessage(
364 LoggingConstants.TargetNames.APPC_PROVIDER,
365 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
366 this.getClass().getName());
370 outputBuilder.setCommonHeader(input.getCommonHeader());
371 outputBuilder.setStatus(status);
372 RpcResult<EvacuateOutput> result = RpcResultBuilder.<EvacuateOutput> status(true).withResult(outputBuilder.build()).build();
373 return Futures.immediateFuture(result);
378 * Evacuates a specific VNF
380 * @see AppcProviderLcmService#snapshot(SnapshotInput)
383 public Future<RpcResult<SnapshotOutput>> snapshot(SnapshotInput input) {
384 logger.debug("Input received : " + input.toString());
386 SnapshotOutputBuilder outputBuilder = new SnapshotOutputBuilder();
387 String action = Action.Snapshot.toString() ;
388 String rpcName = Action.Snapshot.name().toLowerCase();
390 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
391 String identityUrl = input.getIdentityUrl();
394 RequestHandlerInput request = new RequestInputBuilder().requestContext()
395 .commonHeader(input.getCommonHeader())
396 .actionIdentifiers(input.getActionIdentifiers())
397 .payload(input.getPayload()).action(action).rpcName(rpcName)
398 .additionalContext("identity-url", identityUrl).build();
399 status = buildStatusWithDispatcherOutput(executeRequest(request));
400 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
401 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
402 } catch (ParseException e) {
403 status = buildParsingErrorStatus(e);
405 LoggingUtils.logErrorMessage(
406 LoggingConstants.TargetNames.APPC_PROVIDER,
407 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
408 this.getClass().getName());
411 outputBuilder.setCommonHeader(input.getCommonHeader());
412 outputBuilder.setStatus(status);
413 RpcResult<SnapshotOutput> result = RpcResultBuilder.<SnapshotOutput> status(true).withResult(outputBuilder.build()).build();
414 return Futures.immediateFuture(result);
418 public Future<RpcResult<RollbackOutput>> rollback(RollbackInput input) {
419 logger.debug("Input received : " + input.toString());
421 RollbackOutputBuilder outputBuilder = new RollbackOutputBuilder();
422 String rpcName = Action.Rollback.toString() ;
424 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName);
425 String identityUrl = input.getIdentityUrl();
426 String snapshotId = input.getSnapshotId();
429 RequestHandlerInput request = new RequestInputBuilder().requestContext()
430 .commonHeader(input.getCommonHeader())
431 .actionIdentifiers(input.getActionIdentifiers())
432 .payload(input.getPayload()).additionalContext("identity-url", identityUrl)
433 .additionalContext("snapshot-id", snapshotId).action(rpcName).build();
434 status = buildStatusWithDispatcherOutput(executeRequest(request));
435 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
436 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
437 } catch (ParseException e) {
438 status = buildParsingErrorStatus(e);
440 LoggingUtils.logErrorMessage(
441 LoggingConstants.TargetNames.APPC_PROVIDER,
442 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, rpcName, e.getMessage()),
443 this.getClass().getName());
447 outputBuilder.setCommonHeader(input.getCommonHeader());
448 outputBuilder.setStatus(status);
449 RpcResult<RollbackOutput> result = RpcResultBuilder.<RollbackOutput> status(true).withResult(outputBuilder.build()).build();
450 return Futures.immediateFuture(result);
454 public Future<RpcResult<SyncOutput>> sync(SyncInput input) {
455 logger.debug("Input received : " + input.toString());
456 SyncOutputBuilder outputBuilder = new SyncOutputBuilder();
457 String action = Action.Sync.toString() ;
458 String rpcName = Action.Sync.name().toLowerCase();
460 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
463 RequestHandlerInput request = new RequestInputBuilder().requestContext()
464 .commonHeader(input.getCommonHeader())
465 .actionIdentifiers(input.getActionIdentifiers())
466 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
467 status = buildStatusWithDispatcherOutput(executeRequest(request));
468 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
469 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
470 } catch (ParseException e) {
471 status = buildParsingErrorStatus(e);
473 LoggingUtils.logErrorMessage(
474 LoggingConstants.TargetNames.APPC_PROVIDER,
475 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
476 this.getClass().getName());
480 outputBuilder.setCommonHeader(input.getCommonHeader());
481 outputBuilder.setStatus(status);
482 RpcResult<SyncOutput> result = RpcResultBuilder.<SyncOutput> status(true).withResult(outputBuilder.build()).build();
483 return Futures.immediateFuture(result);
486 private Status buildParsingErrorStatus(ParseException e){
487 LCMCommandStatus requestParsingFailure = LCMCommandStatus.REQUEST_PARSING_FAILED;
488 String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
489 Params params = new Params().addParam("errorMsg", errorMessage);
490 return buildStatus(requestParsingFailure.getResponseCode(), requestParsingFailure.getFormattedMessage(params));
493 private Status buildStatus(Integer code,String message){
494 StatusBuilder status = new StatusBuilder();
495 status.setCode(code);
496 status.setMessage(message);
497 return status.build();
500 private Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){
501 Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode();
502 String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage();
503 return buildStatus(statusCode, statusMessage);
506 private RequestHandlerOutput executeRequest(RequestHandlerInput request){
507 RequestHandler handler = getRequestHandler();
508 RequestHandlerOutput requestHandlerOutput;
509 if (handler != null) {
511 requestHandlerOutput = handler.handleRequest(request);
512 } catch (Exception e) {
513 logger.info("UNEXPECTED FAILURE while executing " + request.getRequestContext().getAction().name());
514 requestHandlerOutput = createErrorRequestHandlerObj(request,
515 LCMCommandStatus.UNEXPECTED_ERROR, Msg.EXCEPTION_CALLING_DG, e);
518 String errorMsg = "LCM request cannot be processed at the moment because APPC isn't running";
519 requestHandlerOutput = createErrorRequestHandlerObj(request,
520 LCMCommandStatus.REJECTED, Msg.REQUEST_HANDLER_UNAVAILABLE, new APPCException(errorMsg));
522 return requestHandlerOutput;
525 private RequestHandlerOutput createErrorRequestHandlerObj(RequestHandlerInput request,
526 LCMCommandStatus cmdStatus,
529 final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
530 final String reason = EELFResourceManager.format(msg, e,
531 appName, e.getClass().getSimpleName(), "", e.getMessage());
533 RequestHandlerOutput requestHandlerOutput = new RequestHandlerOutput();
534 final ResponseContext responseContext = new ResponseContext();
535 requestHandlerOutput.setResponseContext(responseContext);
536 responseContext.setCommonHeader(request.getRequestContext().getCommonHeader());
538 String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
539 Params params = new Params().addParam("errorMsg", errorMessage);
540 responseContext.setStatus(cmdStatus.toStatus(params));
542 LoggingUtils.logErrorMessage(
543 LoggingConstants.TargetNames.APPC_PROVIDER,
545 this.getClass().getName());
547 return requestHandlerOutput;
550 private RequestHandler getRequestHandler(){
551 final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext();
552 if (context == null) {
556 final ServiceReference reference = context.getServiceReference(RequestHandler.class.getName());
557 if (reference == null) {
558 logger.error("Cannot find service reference for " + RequestHandler.class.getName());
559 throw new RuntimeException();
562 return (RequestHandler) context.getService(reference);
566 public Future<RpcResult<TerminateOutput>> terminate(TerminateInput input) {
567 logger.debug("Input received : " + input.toString());
568 TerminateOutputBuilder outputBuilder = new TerminateOutputBuilder();
569 String action = Action.Terminate.toString() ;
570 String rpcName = Action.Terminate.name().toLowerCase();
572 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
575 RequestHandlerInput request = new RequestInputBuilder().requestContext()
576 .commonHeader(input.getCommonHeader())
577 .actionIdentifiers(input.getActionIdentifiers())
578 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
579 status = buildStatusWithDispatcherOutput(executeRequest(request));
580 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
581 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
582 } catch (ParseException e) {
584 status = buildParsingErrorStatus(e);
586 LoggingUtils.logErrorMessage(
587 LoggingConstants.TargetNames.APPC_PROVIDER,
588 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
589 this.getClass().getName());
594 outputBuilder.setCommonHeader(input.getCommonHeader());
595 outputBuilder.setStatus(status);
596 RpcResult<TerminateOutput> result =
597 RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build();
598 return Futures.immediateFuture(result);
602 public Future<RpcResult<ConfigureOutput>> configure(ConfigureInput input) {
603 logger.debug("Input received : " + input.toString());
604 ConfigureOutputBuilder outputBuilder = new ConfigureOutputBuilder();
605 String action = Action.Configure.toString() ;
606 String rpcName = "configure";
608 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
611 RequestHandlerInput request = new RequestInputBuilder().requestContext()
612 .commonHeader(input.getCommonHeader())
613 .actionIdentifiers(input.getActionIdentifiers())
614 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
615 status = buildStatusWithDispatcherOutput(executeRequest(request));
616 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
617 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
618 } catch (ParseException e) {
619 status = buildParsingErrorStatus(e);
621 LoggingUtils.logErrorMessage(
622 LoggingConstants.TargetNames.APPC_PROVIDER,
623 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
624 this.getClass().getName());
628 outputBuilder.setCommonHeader(input.getCommonHeader());
629 outputBuilder.setStatus(status);
630 RpcResult<ConfigureOutput> result =
631 RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build();
632 return Futures.immediateFuture(result);
636 public Future<RpcResult<ConfigModifyOutput>> configModify(ConfigModifyInput input) {
637 logger.debug("Input received : " + input.toString());
638 ConfigModifyOutputBuilder outputBuilder = new ConfigModifyOutputBuilder();
639 String action = Action.ConfigModify.toString() ;
640 String rpcName = "config-modify";
642 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
645 RequestHandlerInput request = new RequestInputBuilder().requestContext()
646 .commonHeader(input.getCommonHeader())
647 .actionIdentifiers(input.getActionIdentifiers())
648 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
649 status = buildStatusWithDispatcherOutput(executeRequest(request));
650 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
651 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
652 } catch (ParseException e) {
653 status = buildParsingErrorStatus(e);
655 LoggingUtils.logErrorMessage(
656 LoggingConstants.TargetNames.APPC_PROVIDER,
657 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
658 this.getClass().getName());
662 outputBuilder.setCommonHeader(input.getCommonHeader());
663 outputBuilder.setStatus(status);
664 RpcResult<ConfigModifyOutput> result =
665 RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build();
666 return Futures.immediateFuture(result);
670 public Future<RpcResult<ConfigScaleoutOutput>> configScaleout(ConfigScaleoutInput input) {
671 logger.debug("Input received : " + input.toString());
672 ConfigScaleoutOutputBuilder outputBuilder = new ConfigScaleoutOutputBuilder();
673 String action = Action.ConfigScaleOut.toString() ;
674 String rpcName = "config-scaleout";
676 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
679 RequestHandlerInput request = new RequestInputBuilder().requestContext()
680 .commonHeader(input.getCommonHeader())
681 .actionIdentifiers(input.getActionIdentifiers())
682 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
683 status = buildStatusWithDispatcherOutput(executeRequest(request));
684 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
685 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
686 } catch (ParseException e) {
687 status = buildParsingErrorStatus(e);
689 LoggingUtils.logErrorMessage(
690 LoggingConstants.TargetNames.APPC_PROVIDER,
691 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
692 this.getClass().getName());
696 outputBuilder.setCommonHeader(input.getCommonHeader());
697 outputBuilder.setStatus(status);
698 RpcResult<ConfigScaleoutOutput> result =
699 RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build();
700 return Futures.immediateFuture(result);
704 public Future<RpcResult<ConfigRestoreOutput>> configRestore(ConfigRestoreInput input) {
705 logger.debug("Input received : " + input.toString());
706 ConfigRestoreOutputBuilder outputBuilder = new ConfigRestoreOutputBuilder();
707 String action = Action.ConfigRestore.toString() ;
708 String rpcName = "config-restore";
710 ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
713 RequestHandlerInput request = new RequestInputBuilder().requestContext()
714 .commonHeader(input.getCommonHeader())
715 .actionIdentifiers(input.getActionIdentifiers())
716 .payload(input.getPayload()).action(action).rpcName(rpcName).build();
717 status = buildStatusWithDispatcherOutput(executeRequest(request));
718 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
719 input.getActionIdentifiers(), status.getCode(), status.getMessage()));
720 } catch (ParseException e) {
721 status = buildParsingErrorStatus(e);
723 LoggingUtils.logErrorMessage(
724 LoggingConstants.TargetNames.APPC_PROVIDER,
725 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
726 this.getClass().getName());
730 outputBuilder.setCommonHeader(input.getCommonHeader());
731 outputBuilder.setStatus(status);
732 RpcResult<ConfigRestoreOutput> result =
733 RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build();
734 return Futures.immediateFuture(result);
738 public Future<RpcResult<TestOutput>> test(TestInput input) {
739 logger.debug("Input received : " + input.toString());
740 TestOutputBuilder outputBuilder = new TestOutputBuilder();
741 String action = Action.Test.toString() ;
742 String rpcName = Action.Test.name().toLowerCase();
743 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
746 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
747 status = buildStatusWithDispatcherOutput(executeRequest(request));
748 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
749 } catch (ParseException e) {
750 status = buildParsingErrorStatus(e);
752 LoggingUtils.logErrorMessage(
753 LoggingConstants.TargetNames.APPC_PROVIDER,
754 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
755 this.getClass().getName());
759 outputBuilder.setCommonHeader(input.getCommonHeader());
760 outputBuilder.setStatus(status);
761 RpcResult<TestOutput> result = RpcResultBuilder.<TestOutput> status(true).withResult(outputBuilder.build()).build();
762 return Futures.immediateFuture(result);
767 public Future<RpcResult<StopOutput>> stop(StopInput input) {
768 logger.debug("Input received : " + input.toString());
769 StopOutputBuilder outputBuilder = new StopOutputBuilder();
770 String action = Action.Stop.toString() ;
771 String rpcName = Action.Stop.name().toLowerCase();
772 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
775 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
776 status = buildStatusWithDispatcherOutput(executeRequest(request));
777 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
778 } catch (ParseException e) {
779 status = buildParsingErrorStatus(e);
781 LoggingUtils.logErrorMessage(
782 LoggingConstants.TargetNames.APPC_PROVIDER,
783 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
784 this.getClass().getName());
788 outputBuilder.setCommonHeader(input.getCommonHeader());
789 outputBuilder.setStatus(status);
790 RpcResult<StopOutput> result = RpcResultBuilder.<StopOutput> status(true).withResult(outputBuilder.build()).build();
791 return Futures.immediateFuture(result);
795 * Starts a specific VNF
797 * @see AppcProviderLcmService#start(StartInput)
800 public Future<RpcResult<StartOutput>> start(StartInput input) {
801 logger.debug("Input received : " + input.toString());
803 StartOutputBuilder outputBuilder = new StartOutputBuilder();
804 String action = Action.Start.toString() ;
805 String rpcName = Action.Start.name().toLowerCase();
806 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
809 RequestHandlerInput request = new RequestInputBuilder().requestContext()
810 .commonHeader(input.getCommonHeader())
811 .actionIdentifiers(input.getActionIdentifiers())
812 .payload(input.getPayload())
814 .rpcName(rpcName).build();
815 status = buildStatusWithDispatcherOutput(executeRequest(request));
816 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
817 } catch (ParseException e) {
818 status = buildParsingErrorStatus(e);
820 LoggingUtils.logErrorMessage(
821 LoggingConstants.TargetNames.APPC_PROVIDER,
822 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
823 this.getClass().getName());
827 outputBuilder.setCommonHeader(input.getCommonHeader());
828 outputBuilder.setStatus(status);
829 RpcResult<StartOutput> result = RpcResultBuilder.<StartOutput> status(true).withResult(outputBuilder.build()).build();
830 return Futures.immediateFuture(result);
835 public Future<RpcResult<AuditOutput>> audit(AuditInput input) {
836 logger.debug("Input received : " + input.toString());
837 AuditOutputBuilder outputBuilder = new AuditOutputBuilder();
838 String action = Action.Audit.toString();
839 String rpcName = Action.Audit.name().toLowerCase();
840 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
843 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
844 status = buildStatusWithDispatcherOutput(executeRequest(request));
845 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
846 } catch (ParseException e) {
847 status = buildParsingErrorStatus(e);
849 LoggingUtils.logErrorMessage(
850 LoggingConstants.TargetNames.APPC_PROVIDER,
851 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
852 this.getClass().getName());
856 outputBuilder.setCommonHeader(input.getCommonHeader());
857 outputBuilder.setStatus(status);
858 RpcResult<AuditOutput> result = RpcResultBuilder.<AuditOutput> status(true).withResult(outputBuilder.build()).build();
859 return Futures.immediateFuture(result);
863 public Future<RpcResult<SoftwareUploadOutput>> softwareUpload(SoftwareUploadInput input) {
864 logger.debug("Input received : " + input.toString());
865 SoftwareUploadOutputBuilder outputBuilder = new SoftwareUploadOutputBuilder();
866 String action = Action.SoftwareUpload.toString() ;
867 String rpcName = convertActionNameToUrl(action);
868 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
871 RequestHandlerInput request = new RequestInputBuilder().
872 requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
873 status = buildStatusWithDispatcherOutput(executeRequest(request));
874 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
875 } catch (ParseException e) {
876 status = buildParsingErrorStatus(e);
878 LoggingUtils.logErrorMessage(
879 LoggingConstants.TargetNames.APPC_PROVIDER,
880 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
881 this.getClass().getName());
885 outputBuilder.setCommonHeader(input.getCommonHeader());
886 outputBuilder.setStatus(status);
887 RpcResult<SoftwareUploadOutput> result = RpcResultBuilder.<SoftwareUploadOutput> status(true).withResult(outputBuilder.build()).build();
888 return Futures.immediateFuture(result);
892 public Future<RpcResult<HealthCheckOutput>> healthCheck(HealthCheckInput input) {
893 logger.debug("Input received : " + input.toString());
894 HealthCheckOutputBuilder outputBuilder = new HealthCheckOutputBuilder();
895 String action = Action.HealthCheck.toString() ;
896 String rpcName = convertActionNameToUrl(action);
897 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
900 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
901 status = buildStatusWithDispatcherOutput(executeRequest(request));
902 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
903 } catch (ParseException e) {
904 status = buildParsingErrorStatus(e);
906 LoggingUtils.logErrorMessage(
907 LoggingConstants.TargetNames.APPC_PROVIDER,
908 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
909 this.getClass().getName());
913 outputBuilder.setCommonHeader(input.getCommonHeader());
914 outputBuilder.setStatus(status);
915 RpcResult<HealthCheckOutput> result = RpcResultBuilder.<HealthCheckOutput> status(true).withResult(outputBuilder.build()).build();
916 return Futures.immediateFuture(result);
920 public Future<RpcResult<LiveUpgradeOutput>> liveUpgrade(LiveUpgradeInput input) {
921 logger.debug("Input received : " + input.toString());
922 LiveUpgradeOutputBuilder outputBuilder = new LiveUpgradeOutputBuilder();
923 String action = Action.LiveUpgrade.toString() ;
924 String rpcName = convertActionNameToUrl(action);
925 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
928 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
929 status = buildStatusWithDispatcherOutput(executeRequest(request));
930 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
931 } catch (ParseException e) {
932 status = buildParsingErrorStatus(e);
934 LoggingUtils.logErrorMessage(
935 LoggingConstants.TargetNames.APPC_PROVIDER,
936 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
937 this.getClass().getName());
941 outputBuilder.setCommonHeader(input.getCommonHeader());
942 outputBuilder.setStatus(status);
943 RpcResult<LiveUpgradeOutput> result = RpcResultBuilder.<LiveUpgradeOutput> status(true).withResult(outputBuilder.build()).build();
944 return Futures.immediateFuture(result);
949 public Future<RpcResult<LockOutput>> lock(LockInput input) {
950 logger.debug("Input received : " + input.toString());
951 LockOutputBuilder outputBuilder = new LockOutputBuilder();
952 String action = Action.Lock.toString() ;
953 String rpcName = Action.Lock.name().toLowerCase();
954 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
957 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
958 status = buildStatusWithDispatcherOutput(executeRequest(request));
959 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
960 } catch (ParseException e) {
961 status = buildParsingErrorStatus(e);
963 LoggingUtils.logErrorMessage(
964 LoggingConstants.TargetNames.APPC_PROVIDER,
965 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
966 this.getClass().getName());
970 outputBuilder.setCommonHeader(input.getCommonHeader());
971 outputBuilder.setStatus(status);
972 RpcResult<LockOutput> result = RpcResultBuilder.<LockOutput> status(true).withResult(outputBuilder.build()).build();
973 return Futures.immediateFuture(result);
978 public Future<RpcResult<UnlockOutput>> unlock(UnlockInput input) {
979 logger.debug("Input received : " + input.toString());
980 UnlockOutputBuilder outputBuilder = new UnlockOutputBuilder();
981 String action = Action.Unlock.toString() ;
982 String rpcName = Action.Unlock.name().toLowerCase();
983 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
986 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
987 status = buildStatusWithDispatcherOutput(executeRequest(request));
988 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
989 } catch (ParseException e) {
990 status = buildParsingErrorStatus(e);
992 LoggingUtils.logErrorMessage(
993 LoggingConstants.TargetNames.APPC_PROVIDER,
994 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
995 this.getClass().getName());
999 outputBuilder.setCommonHeader(input.getCommonHeader());
1000 outputBuilder.setStatus(status);
1001 RpcResult<UnlockOutput> result = RpcResultBuilder.<UnlockOutput> status(true).withResult(outputBuilder.build()).build();
1002 return Futures.immediateFuture(result);
1006 public Future<RpcResult<CheckLockOutput>> checkLock(CheckLockInput input) {
1007 logger.debug("Input received : " + input.toString());
1008 CheckLockOutputBuilder outputBuilder = new CheckLockOutputBuilder();
1009 String action = Action.CheckLock.toString() ;
1010 String rpcName = Action.CheckLock.name().toLowerCase();
1011 RequestHandlerOutput requestHandlerOutput=null;
1012 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
1013 if(null == status) {
1015 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
1016 requestHandlerOutput=executeRequest(request);
1018 status = buildStatusWithDispatcherOutput(requestHandlerOutput);
1019 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
1020 } catch (ParseException e) {
1021 status = buildParsingErrorStatus(e);
1023 LoggingUtils.logErrorMessage(
1024 LoggingConstants.TargetNames.APPC_PROVIDER,
1025 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
1026 this.getClass().getName());
1030 outputBuilder.setCommonHeader(input.getCommonHeader());
1031 outputBuilder.setStatus(status);
1032 if(requestHandlerOutput.getResponseContext().getStatus().getCode() == 400) {
1033 outputBuilder.setLocked(CheckLockOutput.Locked.valueOf(requestHandlerOutput.getResponseContext().getAdditionalContext().get("locked").toUpperCase()));
1035 RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput> status(true).withResult(outputBuilder.build()).build();
1036 return Futures.immediateFuture(result);
1040 public Future<RpcResult<ConfigBackupOutput>> configBackup(ConfigBackupInput input) {
1041 logger.debug("Input received : " + input.toString());
1042 ConfigBackupOutputBuilder outputBuilder = new ConfigBackupOutputBuilder();
1043 String action = Action.ConfigBackup.toString() ;
1044 String rpcName = Action.ConfigBackup.name().toLowerCase();
1045 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
1046 if(null == status) {
1048 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
1049 status = buildStatusWithDispatcherOutput(executeRequest(request));
1050 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
1051 } catch (ParseException e) {
1052 status = buildParsingErrorStatus(e);
1054 LoggingUtils.logErrorMessage(
1055 LoggingConstants.TargetNames.APPC_PROVIDER,
1056 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
1057 this.getClass().getName());
1061 outputBuilder.setCommonHeader(input.getCommonHeader());
1062 outputBuilder.setStatus(status);
1063 RpcResult<ConfigBackupOutput> result = RpcResultBuilder.<ConfigBackupOutput> status(true).withResult(outputBuilder.build()).build();
1064 return Futures.immediateFuture(result);
1069 public Future<RpcResult<ConfigBackupDeleteOutput>> configBackupDelete(ConfigBackupDeleteInput input) {
1070 logger.debug("Input received : " + input.toString());
1071 ConfigBackupDeleteOutputBuilder outputBuilder = new ConfigBackupDeleteOutputBuilder();
1072 String action = Action.ConfigBackupDelete.toString() ;
1073 String rpcName = Action.ConfigBackupDelete.name().toLowerCase();
1074 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
1075 if(null == status) {
1077 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
1078 status = buildStatusWithDispatcherOutput(executeRequest(request));
1079 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
1080 } catch (ParseException e) {
1081 status = buildParsingErrorStatus(e);
1083 LoggingUtils.logErrorMessage(
1084 LoggingConstants.TargetNames.APPC_PROVIDER,
1085 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
1086 this.getClass().getName());
1090 outputBuilder.setCommonHeader(input.getCommonHeader());
1091 outputBuilder.setStatus(status);
1092 RpcResult<ConfigBackupDeleteOutput> result = RpcResultBuilder.<ConfigBackupDeleteOutput> status(true).withResult(outputBuilder.build()).build();
1093 return Futures.immediateFuture(result);
1098 public Future<RpcResult<ConfigExportOutput>> configExport(ConfigExportInput input) {
1099 logger.debug("Input received : " + input.toString());
1100 ConfigExportOutputBuilder outputBuilder = new ConfigExportOutputBuilder();
1101 String action = Action.ConfigExport.toString() ;
1102 String rpcName = Action.ConfigExport.name().toLowerCase();
1103 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
1104 if(null == status) {
1106 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
1107 status = buildStatusWithDispatcherOutput(executeRequest(request));
1108 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
1109 } catch (ParseException e) {
1110 status = buildParsingErrorStatus(e);
1112 LoggingUtils.logErrorMessage(
1113 LoggingConstants.TargetNames.APPC_PROVIDER,
1114 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
1115 this.getClass().getName());
1119 outputBuilder.setCommonHeader(input.getCommonHeader());
1120 outputBuilder.setStatus(status);
1121 RpcResult<ConfigExportOutput> result = RpcResultBuilder.<ConfigExportOutput> status(true).withResult(outputBuilder.build()).build();
1122 return Futures.immediateFuture(result);
1125 public Future<RpcResult<StartApplicationOutput>> startApplication(StartApplicationInput input) {
1126 logger.debug("Input received : " + input.toString());
1128 StartApplicationOutputBuilder outputBuilder = new StartApplicationOutputBuilder();
1129 String action = Action.StartApplication.toString() ;
1130 String rpcName = Action.StartApplication.name().toLowerCase();
1131 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
1132 if(null == status) {
1134 RequestHandlerInput request = new RequestInputBuilder().requestContext()
1135 .commonHeader(input.getCommonHeader())
1136 .actionIdentifiers(input.getActionIdentifiers())
1137 .payload(input.getPayload())
1142 status = buildStatusWithDispatcherOutput(executeRequest(request));
1143 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
1144 } catch (ParseException e) {
1145 status = buildParsingErrorStatus(e);
1147 LoggingUtils.logErrorMessage(
1148 LoggingConstants.TargetNames.APPC_PROVIDER,
1149 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
1150 this.getClass().getName());
1154 outputBuilder.setCommonHeader(input.getCommonHeader());
1155 outputBuilder.setStatus(status);
1156 RpcResult<StartApplicationOutput> result = RpcResultBuilder.<StartApplicationOutput> status(true).withResult(outputBuilder.build()).build();
1157 return Futures.immediateFuture(result);
1160 public Future<RpcResult<StopApplicationOutput>> stopApplication(StopApplicationInput input){
1161 logger.debug("Input received : " + input.toString());
1162 StopApplicationOutputBuilder outputBuilder = new StopApplicationOutputBuilder();
1163 String action = Action.StopApplication.toString() ;
1164 String rpcName = Action.StopApplication.name().toLowerCase();
1165 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
1166 if(null == status) {
1168 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
1169 status = buildStatusWithDispatcherOutput(executeRequest(request));
1170 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
1171 } catch (ParseException e) {
1172 status = buildParsingErrorStatus(e);
1174 LoggingUtils.logErrorMessage(
1175 LoggingConstants.TargetNames.APPC_PROVIDER,
1176 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
1177 this.getClass().getName());
1181 outputBuilder.setCommonHeader(input.getCommonHeader());
1182 outputBuilder.setStatus(status);
1183 RpcResult<StopApplicationOutput> result = RpcResultBuilder.<StopApplicationOutput> status(true).withResult(outputBuilder.build()).build();
1184 return Futures.immediateFuture(result);
1187 private String convertActionNameToUrl(String action) {
1188 String regex = "([a-z])([A-Z]+)";
1189 String replacement = "$1-$2";
1190 return action.replaceAll(regex, replacement)