2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.openecomp.appc.provider;
 
  24 import java.text.ParseException;
 
  25 import java.util.concurrent.ExecutorService;
 
  26 import java.util.concurrent.Executors;
 
  27 import java.util.concurrent.Future;
 
  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.openecomp.appc.rev160108.Action;
 
  34 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService;
 
  35 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AuditInput;
 
  36 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AuditOutput;
 
  37 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AuditOutputBuilder;
 
  38 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.CheckLockInput;
 
  39 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.CheckLockOutput;
 
  40 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.CheckLockOutputBuilder;
 
  41 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.EvacuateInput;
 
  42 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.EvacuateOutput;
 
  43 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.EvacuateOutputBuilder;
 
  44 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.HealthCheckInput;
 
  45 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.HealthCheckOutput;
 
  46 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.HealthCheckOutputBuilder;
 
  47 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LiveUpgradeInput;
 
  48 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LiveUpgradeOutput;
 
  49 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LiveUpgradeOutputBuilder;
 
  50 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LockInput;
 
  51 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LockOutput;
 
  52 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LockOutputBuilder;
 
  53 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.MigrateInput;
 
  54 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.MigrateOutput;
 
  55 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.MigrateOutputBuilder;
 
  56 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.ModifyConfigInput;
 
  57 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.ModifyConfigOutput;
 
  58 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.ModifyConfigOutputBuilder;
 
  59 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RebuildInput;
 
  60 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RebuildOutput;
 
  61 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RebuildOutputBuilder;
 
  62 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RestartInput;
 
  63 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RestartOutput;
 
  64 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RestartOutputBuilder;
 
  65 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RollbackInput;
 
  66 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RollbackOutput;
 
  67 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RollbackOutputBuilder;
 
  68 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SnapshotInput;
 
  69 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SnapshotOutput;
 
  70 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SnapshotOutputBuilder;
 
  71 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SoftwareUploadInput;
 
  72 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SoftwareUploadOutput;
 
  73 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SoftwareUploadOutputBuilder;
 
  74 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.StopInput;
 
  75 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.StopOutput;
 
  76 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.StopOutputBuilder;
 
  77 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SyncInput;
 
  78 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SyncOutput;
 
  79 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SyncOutputBuilder;
 
  80 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TerminateInput;
 
  81 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TerminateOutput;
 
  82 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TerminateOutputBuilder;
 
  83 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TestInput;
 
  84 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TestOutput;
 
  85 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TestOutputBuilder;
 
  86 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.UnlockInput;
 
  87 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.UnlockOutput;
 
  88 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.UnlockOutputBuilder;
 
  89 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.status.Status;
 
  90 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.status.StatusBuilder;
 
  91 import org.opendaylight.yangtools.yang.common.RpcResult;
 
  92 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
  93 import org.openecomp.appc.Constants;
 
  94 import org.openecomp.appc.configuration.Configuration;
 
  95 import org.openecomp.appc.configuration.ConfigurationFactory;
 
  96 import org.openecomp.appc.domainmodel.lcm.ResponseContext;
 
  97 import org.openecomp.appc.domainmodel.lcm.RuntimeContext;
 
  98 import org.openecomp.appc.executor.objects.LCMCommandStatus;
 
  99 import org.openecomp.appc.executor.objects.Params;
 
 100 import org.openecomp.appc.i18n.Msg;
 
 101 import org.openecomp.appc.logging.LoggingConstants;
 
 102 import org.openecomp.appc.logging.LoggingUtils;
 
 103 import org.openecomp.appc.provider.lcm.util.RequestInputBuilder;
 
 104 import org.openecomp.appc.provider.lcm.util.ValidationService;
 
 105 import org.openecomp.appc.requesthandler.RequestHandler;
 
 106 import org.openecomp.appc.requesthandler.objects.RequestHandlerInput;
 
 107 import org.openecomp.appc.requesthandler.objects.RequestHandlerOutput;
 
 108 import com.att.eelf.configuration.EELFLogger;
 
 109 import com.att.eelf.configuration.EELFManager;
 
 110 import com.att.eelf.i18n.EELFResourceManager;
 
 111 import org.osgi.framework.BundleContext;
 
 112 import org.osgi.framework.FrameworkUtil;
 
 113 import org.osgi.framework.ServiceReference;
 
 115 import com.google.common.util.concurrent.Futures;
 
 116 import org.slf4j.MDC;
 
 119 public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
 
 121     private Configuration configuration = ConfigurationFactory.getConfiguration();
 
 122     private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class);
 
 124     private final ExecutorService executor;
 
 126     private final String COMMON_ERROR_MESSAGE_TEMPLATE =  "Error processing %s input : %s";
 
 129      * The ODL data store broker. Provides access to a conceptual data tree store and also provides the ability to
 
 130      * subscribe for changes to data under a given branch of the tree.
 
 132     protected DataBroker dataBroker;
 
 135      * ODL Notification Service that provides publish/subscribe capabilities for YANG modeled notifications.
 
 137     protected NotificationProviderService notificationService;
 
 140      * Provides a registry for Remote Procedure Call (RPC) service implementations. The RPCs are defined in YANG models.
 
 142     protected RpcProviderRegistry rpcRegistry;
 
 145      * Represents our RPC implementation registration
 
 147     protected BindingAwareBroker.RpcRegistration<AppcProviderLcmService> rpcRegistration;
 
 152      * @param notificationProviderService
 
 153      * @param rpcProviderRegistry
 
 158     public AppcProviderLcm(DataBroker dataBroker, NotificationProviderService notificationProviderService,
 
 159                            RpcProviderRegistry rpcProviderRegistry) {
 
 161         String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
 
 162         logger.info(Msg.COMPONENT_INITIALIZING, appName, "provider");
 
 164         executor = Executors.newFixedThreadPool(1);
 
 165         this.dataBroker = dataBroker;
 
 166         this.notificationService = notificationProviderService;
 
 167         this.rpcRegistry = rpcProviderRegistry;
 
 169         if (this.rpcRegistry != null) {
 
 170             rpcRegistration = rpcRegistry.addRpcImplementation(AppcProviderLcmService.class, this);
 
 173         logger.info(Msg.COMPONENT_INITIALIZED, appName, "provider");
 
 177      * Implements the close of the service
 
 179      * @see java.lang.AutoCloseable#close()
 
 181     @SuppressWarnings("nls")
 
 183     public void close() throws Exception {
 
 184         String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
 
 185         logger.info(Msg.COMPONENT_TERMINATING, appName, "provider");
 
 187         if (rpcRegistration != null) {
 
 188             rpcRegistration.close();
 
 190         logger.info(Msg.COMPONENT_TERMINATED, appName, "provider");
 
 195      * Rebuilds a specific VNF
 
 197      * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#rebuild(RebuildInput)
 
 200     public Future<RpcResult<RebuildOutput>> rebuild(RebuildInput input) {
 
 201         logger.debug("Input received : " + input.toString());
 
 203         RebuildOutputBuilder outputBuilder = new RebuildOutputBuilder();
 
 204         String action = Action.Rebuild.toString() ;
 
 205         String rpcName = Action.Rebuild.name().toLowerCase();
 
 206         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 209                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 210                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 211                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 212             } catch (ParseException e) {
 
 213                 status = buildParsingErrorStatus(e);
 
 215                 LoggingUtils.logErrorMessage(
 
 216                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 217                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 218                         this.getClass().getName());
 
 222         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 223         outputBuilder.setStatus(status);
 
 224         RpcResult<RebuildOutput> result = RpcResultBuilder.<RebuildOutput> status(true).withResult(outputBuilder.build()).build();
 
 225         return Futures.immediateFuture(result);
 
 231      * Restarts a specific VNF
 
 233      * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#restart(RestartInput)
 
 236     public Future<RpcResult<RestartOutput>> restart(RestartInput input) {
 
 237         logger.debug("Input received : " + input.toString());
 
 239         RestartOutputBuilder outputBuilder = new RestartOutputBuilder();
 
 240         String action = Action.Restart.toString() ;
 
 241         String rpcName = Action.Restart.name().toLowerCase();
 
 242         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 245                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 246                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 247                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 248             } catch (ParseException e) {
 
 249                 status = buildParsingErrorStatus(e);
 
 251                 LoggingUtils.logErrorMessage(
 
 252                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 253                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 254                         this.getClass().getName());
 
 258         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 259         outputBuilder.setStatus(status);
 
 260         RpcResult<RestartOutput> result = RpcResultBuilder.<RestartOutput> status(true).withResult(outputBuilder.build()).build();
 
 261         return Futures.immediateFuture(result);
 
 266      * Migrates a specific VNF
 
 268      * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#migrate(MigrateInput)
 
 271     public Future<RpcResult<MigrateOutput>> migrate(MigrateInput input) {
 
 272         logger.debug("Input received : " + input.toString());
 
 274         MigrateOutputBuilder outputBuilder = new MigrateOutputBuilder();
 
 275         String action = Action.Migrate.toString() ;
 
 276         String rpcName = Action.Migrate.name().toLowerCase();
 
 277         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 280                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 281                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 282                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 283             } catch (ParseException e) {
 
 284                 status = buildParsingErrorStatus(e);
 
 286                 LoggingUtils.logErrorMessage(
 
 287                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 288                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 289                         this.getClass().getName());
 
 293         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 294         outputBuilder.setStatus(status);
 
 295         RpcResult<MigrateOutput> result = RpcResultBuilder.<MigrateOutput> status(true).withResult(outputBuilder.build()).build();
 
 296         return Futures.immediateFuture(result);
 
 301      * Evacuates a specific VNF
 
 303      * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#evacuate(EvacuateInput)
 
 306     public Future<RpcResult<EvacuateOutput>> evacuate(EvacuateInput input) {
 
 307         logger.debug("Input received : " + input.toString());
 
 309         EvacuateOutputBuilder outputBuilder = new EvacuateOutputBuilder();
 
 310         String action = Action.Evacuate.toString() ;
 
 311         String rpcName = Action.Evacuate.name().toLowerCase();
 
 312         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 315                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 316                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 317                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 318             } catch (ParseException e) {
 
 319                 status = buildParsingErrorStatus(e);
 
 321                 LoggingUtils.logErrorMessage(
 
 322                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 323                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 324                         this.getClass().getName());
 
 328         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 329         outputBuilder.setStatus(status);
 
 330         RpcResult<EvacuateOutput> result = RpcResultBuilder.<EvacuateOutput> status(true).withResult(outputBuilder.build()).build();
 
 331         return Futures.immediateFuture(result);
 
 336      * Evacuates a specific VNF
 
 338      * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#snapshot(SnapshotInput)
 
 341     public Future<RpcResult<SnapshotOutput>> snapshot(SnapshotInput input) {
 
 342         logger.debug("Input received : " + input.toString());
 
 344         SnapshotOutputBuilder outputBuilder = new SnapshotOutputBuilder();
 
 345         String action = Action.Snapshot.toString() ;
 
 346         String rpcName = Action.Snapshot.name().toLowerCase();
 
 347         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 348         String identityUrl = input.getIdentityUrl();
 
 351                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).additionalContext("identity-url", identityUrl).build();
 
 352                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 353                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 354             } catch (ParseException e) {
 
 355                 status = buildParsingErrorStatus(e);
 
 357                 LoggingUtils.logErrorMessage(
 
 358                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 359                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 360                         this.getClass().getName());
 
 363         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 364         outputBuilder.setStatus(status);
 
 365         RpcResult<SnapshotOutput> result = RpcResultBuilder.<SnapshotOutput> status(true).withResult(outputBuilder.build()).build();
 
 366         return Futures.immediateFuture(result);
 
 370     public Future<RpcResult<RollbackOutput>> rollback(RollbackInput input) {
 
 371         logger.debug("Input received : " + input.toString());
 
 373         RollbackOutputBuilder outputBuilder = new RollbackOutputBuilder();
 
 374         String rpcName = Action.Rollback.toString() ;
 
 375         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName);
 
 376         String identityUrl =  input.getIdentityUrl();
 
 377         String snapshotId = input.getSnapshotId();
 
 380                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).additionalContext("identity-url", identityUrl).additionalContext("snapshot-id", snapshotId).action(rpcName).build();
 
 381                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 382                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 383             } catch (ParseException e) {
 
 384                 status = buildParsingErrorStatus(e);
 
 386                 LoggingUtils.logErrorMessage(
 
 387                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 388                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, rpcName, e.getMessage()),
 
 389                         this.getClass().getName());
 
 393         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 394         outputBuilder.setStatus(status);
 
 395         RpcResult<RollbackOutput> result = RpcResultBuilder.<RollbackOutput> status(true).withResult(outputBuilder.build()).build();
 
 396         return Futures.immediateFuture(result);
 
 400     public Future<RpcResult<SyncOutput>> sync(SyncInput input) {
 
 401         logger.debug("Input received : " + input.toString());
 
 402         SyncOutputBuilder outputBuilder = new SyncOutputBuilder();
 
 403         String action = Action.Sync.toString() ;
 
 404         String rpcName = Action.Sync.name().toLowerCase();
 
 405         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 408                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
 
 409                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 410                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 411             } catch (ParseException e) {
 
 412                 status = buildParsingErrorStatus(e);
 
 414                 LoggingUtils.logErrorMessage(
 
 415                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 416                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 417                         this.getClass().getName());
 
 421         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 422         outputBuilder.setStatus(status);
 
 423         RpcResult<SyncOutput> result = RpcResultBuilder.<SyncOutput> status(true).withResult(outputBuilder.build()).build();
 
 424         return Futures.immediateFuture(result);
 
 427     private Status buildParsingErrorStatus(ParseException e){
 
 428         LCMCommandStatus requestParsingFailure = LCMCommandStatus.REQUEST_PARSING_FAILED;
 
 429         String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
 
 430         Params params = new Params().addParam("errorMsg", errorMessage);
 
 431         return buildStatus(requestParsingFailure.getResponseCode(), requestParsingFailure.getFormattedMessage(params));
 
 434     private Status buildStatus(Integer code,String message){
 
 435         StatusBuilder status = new StatusBuilder();
 
 436         status.setCode(code);
 
 437         status.setMessage(message);
 
 438         return status.build();
 
 441     private Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){
 
 442         Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode();
 
 443         String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage();
 
 444         return  buildStatus(statusCode, statusMessage);
 
 447     private RequestHandlerOutput executeRequest(RequestHandlerInput request){
 
 449         RequestHandler handler = getRequestHandler();
 
 450         RequestHandlerOutput requestHandlerOutput=null;
 
 452             requestHandlerOutput = handler.handleRequest(request);
 
 453         } catch (Exception e) {
 
 455             final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
 
 456             final String reason = EELFResourceManager.format(Msg.EXCEPTION_CALLING_DG, e, appName, e.getClass().getSimpleName(), "", e.getMessage());
 
 458             logger.info("UNEXPECTED FAILURE while executing " + request.getRequestContext().getAction().name());
 
 461             final ResponseContext responseContext = new ResponseContext();
 
 462             requestHandlerOutput = new RequestHandlerOutput();
 
 463             requestHandlerOutput.setResponseContext(responseContext);
 
 464             responseContext.setCommonHeader(request.getRequestContext().getCommonHeader());
 
 465             final org.openecomp.appc.domainmodel.lcm.Status status = new org.openecomp.appc.domainmodel.lcm.Status();
 
 467             responseContext.setStatus(status);
 
 469             String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
 
 470             Params params = new Params().addParam("errorMsg", errorMessage);
 
 471             status.setCode(LCMCommandStatus.UNEXPECTED_ERROR.getResponseCode());
 
 472             status.setMessage(LCMCommandStatus.UNEXPECTED_ERROR.getFormattedMessage(params));
 
 473             LoggingUtils.logErrorMessage(
 
 474                     LoggingConstants.TargetNames.APPC_PROVIDER,
 
 476                     this.getClass().getName());
 
 480         return requestHandlerOutput;
 
 483     private RequestHandler getRequestHandler(){
 
 484         RequestHandler handler ;
 
 485         final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext();
 
 486         final ServiceReference reference = context.getServiceReference(RequestHandler.class.getName());
 
 488         if (reference != null) {
 
 489             handler = (RequestHandler) context.getService(reference);
 
 491             logger.error("Cannot find service reference for " + RequestHandler.class.getName());
 
 492             throw new RuntimeException();
 
 499     public Future<RpcResult<TerminateOutput>> terminate(TerminateInput input) {
 
 500         logger.debug("Input received : " + input.toString());
 
 501         TerminateOutputBuilder outputBuilder = new TerminateOutputBuilder();
 
 502         String action = Action.Terminate.toString() ;
 
 503         String rpcName = Action.Terminate.name().toLowerCase();
 
 504         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 507                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 508                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 509                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 510             } catch (ParseException e) {
 
 512                 status = buildParsingErrorStatus(e);
 
 514                 LoggingUtils.logErrorMessage(
 
 515                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 516                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 517                         this.getClass().getName());
 
 522         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 523         outputBuilder.setStatus(status);
 
 524         RpcResult<TerminateOutput> result = RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build();
 
 525         return Futures.immediateFuture(result);
 
 531     public Future<RpcResult<ModifyConfigOutput>> modifyConfig(ModifyConfigInput input) {
 
 532         logger.debug("Input received : " + input.toString());
 
 533         ModifyConfigOutputBuilder outputBuilder = new ModifyConfigOutputBuilder();
 
 534         String action = Action.ModifyConfig.toString() ;
 
 535         String rpcName = "modify-config";
 
 536         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 539                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 540                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 541                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 542             } catch (ParseException e) {
 
 543                 status = buildParsingErrorStatus(e);
 
 545                 LoggingUtils.logErrorMessage(
 
 546                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 547                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 548                         this.getClass().getName());
 
 552         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 553         outputBuilder.setStatus(status);
 
 554         RpcResult<ModifyConfigOutput> result = RpcResultBuilder.<ModifyConfigOutput> status(true).withResult(outputBuilder.build()).build();
 
 555         return Futures.immediateFuture(result);
 
 559     public Future<RpcResult<TestOutput>> test(TestInput input) {
 
 560         logger.debug("Input received : " + input.toString());
 
 561         TestOutputBuilder outputBuilder = new TestOutputBuilder();
 
 562         String action = Action.Test.toString() ;
 
 563         String rpcName = Action.Test.name().toLowerCase();
 
 564         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 567                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 568                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 569                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 570             } catch (ParseException e) {
 
 571                 status = buildParsingErrorStatus(e);
 
 573                 LoggingUtils.logErrorMessage(
 
 574                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 575                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 576                         this.getClass().getName());
 
 580         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 581         outputBuilder.setStatus(status);
 
 582         RpcResult<TestOutput> result = RpcResultBuilder.<TestOutput> status(true).withResult(outputBuilder.build()).build();
 
 583         return Futures.immediateFuture(result);
 
 588     public Future<RpcResult<StopOutput>> stop(StopInput input) {
 
 589         logger.debug("Input received : " + input.toString());
 
 590         StopOutputBuilder outputBuilder = new StopOutputBuilder();
 
 591         String action = Action.Stop.toString() ;
 
 592         String rpcName = Action.Stop.name().toLowerCase();
 
 593         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 596                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 597                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 598                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 599             } catch (ParseException e) {
 
 600                 status = buildParsingErrorStatus(e);
 
 602                 LoggingUtils.logErrorMessage(
 
 603                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 604                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 605                         this.getClass().getName());
 
 609         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 610         outputBuilder.setStatus(status);
 
 611         RpcResult<StopOutput> result = RpcResultBuilder.<StopOutput> status(true).withResult(outputBuilder.build()).build();
 
 612         return Futures.immediateFuture(result);
 
 616     public Future<RpcResult<AuditOutput>> audit(AuditInput input) {
 
 617         logger.debug("Input received : " + input.toString());
 
 618         AuditOutputBuilder outputBuilder = new AuditOutputBuilder();
 
 619         String action = Action.Audit.toString();
 
 620         String rpcName = Action.Audit.name().toLowerCase();
 
 621         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 624                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
 
 625                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 626                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 627             } catch (ParseException e) {
 
 628                 status = buildParsingErrorStatus(e);
 
 630                 LoggingUtils.logErrorMessage(
 
 631                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 632                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 633                         this.getClass().getName());
 
 637         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 638         outputBuilder.setStatus(status);
 
 639         RpcResult<AuditOutput> result = RpcResultBuilder.<AuditOutput> status(true).withResult(outputBuilder.build()).build();
 
 640         return Futures.immediateFuture(result);
 
 644     public Future<RpcResult<SoftwareUploadOutput>> softwareUpload(SoftwareUploadInput input) {
 
 645         logger.debug("Input received : " + input.toString());
 
 646         SoftwareUploadOutputBuilder outputBuilder = new SoftwareUploadOutputBuilder();
 
 647         String action = Action.SoftwareUpload.toString() ;
 
 648         String rpcName = convertActionNameToUrl(action);
 
 649         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 652                 RequestHandlerInput request = new RequestInputBuilder().
 
 653                         requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 654                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 655                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 656             } catch (ParseException e) {
 
 657                 status = buildParsingErrorStatus(e);
 
 659                 LoggingUtils.logErrorMessage(
 
 660                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 661                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 662                         this.getClass().getName());
 
 666         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 667         outputBuilder.setStatus(status);
 
 668         RpcResult<SoftwareUploadOutput> result = RpcResultBuilder.<SoftwareUploadOutput> status(true).withResult(outputBuilder.build()).build();
 
 669         return Futures.immediateFuture(result);
 
 673     public Future<RpcResult<HealthCheckOutput>> healthCheck(HealthCheckInput input) {
 
 674         logger.debug("Input received : " + input.toString());
 
 675         HealthCheckOutputBuilder outputBuilder = new HealthCheckOutputBuilder();
 
 676         String action = Action.HealthCheck.toString() ;
 
 677         String rpcName = convertActionNameToUrl(action);
 
 678         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 681                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 682                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 683                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 684             } catch (ParseException e) {
 
 685                 status = buildParsingErrorStatus(e);
 
 687                 LoggingUtils.logErrorMessage(
 
 688                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 689                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 690                         this.getClass().getName());
 
 694         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 695         outputBuilder.setStatus(status);
 
 696         RpcResult<HealthCheckOutput> result = RpcResultBuilder.<HealthCheckOutput> status(true).withResult(outputBuilder.build()).build();
 
 697         return Futures.immediateFuture(result);
 
 701     public Future<RpcResult<LiveUpgradeOutput>> liveUpgrade(LiveUpgradeInput input) {
 
 702         logger.debug("Input received : " + input.toString());
 
 703         LiveUpgradeOutputBuilder outputBuilder = new LiveUpgradeOutputBuilder();
 
 704         String action = Action.LiveUpgrade.toString() ;
 
 705         String rpcName = convertActionNameToUrl(action);
 
 706         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 709                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 710                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 711                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 712             } catch (ParseException e) {
 
 713                 status = buildParsingErrorStatus(e);
 
 715                 LoggingUtils.logErrorMessage(
 
 716                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 717                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 718                         this.getClass().getName());
 
 722         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 723         outputBuilder.setStatus(status);
 
 724         RpcResult<LiveUpgradeOutput> result = RpcResultBuilder.<LiveUpgradeOutput> status(true).withResult(outputBuilder.build()).build();
 
 725         return Futures.immediateFuture(result);
 
 730     public Future<RpcResult<LockOutput>> lock(LockInput input) {
 
 731         logger.debug("Input received : " + input.toString());
 
 732         LockOutputBuilder outputBuilder = new LockOutputBuilder();
 
 733         String action = Action.Lock.toString() ;
 
 734         String rpcName = Action.Lock.name().toLowerCase();
 
 735         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 738                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 739                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 740                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 741             } catch (ParseException e) {
 
 742                 status = buildParsingErrorStatus(e);
 
 744                 LoggingUtils.logErrorMessage(
 
 745                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 746                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 747                         this.getClass().getName());
 
 751         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 752         outputBuilder.setStatus(status);
 
 753         RpcResult<LockOutput> result = RpcResultBuilder.<LockOutput> status(true).withResult(outputBuilder.build()).build();
 
 754         return Futures.immediateFuture(result);
 
 759     public Future<RpcResult<UnlockOutput>> unlock(UnlockInput input) {
 
 760         logger.debug("Input received : " + input.toString());
 
 761         UnlockOutputBuilder outputBuilder = new UnlockOutputBuilder();
 
 762         String action = Action.Unlock.toString() ;
 
 763         String rpcName = Action.Unlock.name().toLowerCase();
 
 764         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 767                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
 
 768                 status = buildStatusWithDispatcherOutput(executeRequest(request));
 
 769                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 770             } catch (ParseException e) {
 
 771                 status = buildParsingErrorStatus(e);
 
 773                 LoggingUtils.logErrorMessage(
 
 774                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 775                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 776                         this.getClass().getName());
 
 780         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 781         outputBuilder.setStatus(status);
 
 782         RpcResult<UnlockOutput> result = RpcResultBuilder.<UnlockOutput> status(true).withResult(outputBuilder.build()).build();
 
 783         return Futures.immediateFuture(result);
 
 787     public Future<RpcResult<CheckLockOutput>> checkLock(CheckLockInput input) {
 
 788         logger.debug("Input received : " + input.toString());
 
 789         CheckLockOutputBuilder outputBuilder = new CheckLockOutputBuilder();
 
 790         String action = Action.CheckLock.toString() ;
 
 791         String rpcName = Action.CheckLock.name().toLowerCase();
 
 792         RequestHandlerOutput requestHandlerOutput=null;
 
 793         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
 
 796                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
 
 797                 requestHandlerOutput=executeRequest(request);
 
 799                 status = buildStatusWithDispatcherOutput(requestHandlerOutput);
 
 800                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
 
 801             } catch (ParseException e) {
 
 802                 status = buildParsingErrorStatus(e);
 
 804                 LoggingUtils.logErrorMessage(
 
 805                         LoggingConstants.TargetNames.APPC_PROVIDER,
 
 806                         String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
 
 807                         this.getClass().getName());
 
 811         outputBuilder.setCommonHeader(input.getCommonHeader());
 
 812         outputBuilder.setStatus(status);
 
 813         if(requestHandlerOutput.getResponseContext().getStatus().getCode() == 400) {
 
 814             outputBuilder.setLocked(CheckLockOutput.Locked.valueOf(requestHandlerOutput.getResponseContext().getAdditionalContext().get("locked").toUpperCase()));
 
 816         RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput> status(true).withResult(outputBuilder.build()).build();
 
 817         return Futures.immediateFuture(result);
 
 820     private String convertActionNameToUrl(String action) {
 
 821         String regex = "([a-z])([A-Z]+)";
 
 822         String replacement = "$1-$2";
 
 823         return action.replaceAll(regex, replacement)