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.lcm.rev160108.common.header.CommonHeader;
34 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.*;
35 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.Status;
36 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.StatusBuilder;
37 import org.opendaylight.yangtools.yang.common.RpcResult;
38 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
39 import org.openecomp.appc.Constants;
40 import org.openecomp.appc.configuration.Configuration;
41 import org.openecomp.appc.configuration.ConfigurationFactory;
42 import org.openecomp.appc.domainmodel.lcm.ResponseContext;
43 import org.openecomp.appc.domainmodel.lcm.RuntimeContext;
44 import org.openecomp.appc.executor.objects.LCMCommandStatus;
45 import org.openecomp.appc.executor.objects.Params;
46 import org.openecomp.appc.i18n.Msg;
47 import org.openecomp.appc.logging.LoggingConstants;
48 import org.openecomp.appc.logging.LoggingUtils;
49 import org.openecomp.appc.provider.lcm.util.RequestInputBuilder;
50 import org.openecomp.appc.provider.lcm.util.ValidationService;
51 import org.openecomp.appc.requesthandler.RequestHandler;
52 import org.openecomp.appc.requesthandler.objects.RequestHandlerInput;
53 import org.openecomp.appc.requesthandler.objects.RequestHandlerOutput;
54 import com.att.eelf.configuration.EELFLogger;
55 import com.att.eelf.configuration.EELFManager;
56 import com.att.eelf.i18n.EELFResourceManager;
57 import org.osgi.framework.BundleContext;
58 import org.osgi.framework.FrameworkUtil;
59 import org.osgi.framework.ServiceReference;
61 import com.google.common.util.concurrent.Futures;
65 public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
67 private Configuration configuration = ConfigurationFactory.getConfiguration();
68 private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class);
70 private final ExecutorService executor;
72 private final String COMMON_ERROR_MESSAGE_TEMPLATE = "Error processing %s input : %s";
75 * The ODL data store broker. Provides access to a conceptual data tree store and also provides the ability to
76 * subscribe for changes to data under a given branch of the tree.
78 protected DataBroker dataBroker;
81 * ODL Notification Service that provides publish/subscribe capabilities for YANG modeled notifications.
83 protected NotificationProviderService notificationService;
86 * Provides a registry for Remote Procedure Call (RPC) service implementations. The RPCs are defined in YANG models.
88 protected RpcProviderRegistry rpcRegistry;
91 * Represents our RPC implementation registration
93 protected BindingAwareBroker.RpcRegistration<AppcProviderLcmService> rpcRegistration;
98 * @param notificationProviderService
99 * @param rpcProviderRegistry
104 public AppcProviderLcm(DataBroker dataBroker, NotificationProviderService notificationProviderService,
105 RpcProviderRegistry rpcProviderRegistry) {
107 String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
108 logger.info(Msg.COMPONENT_INITIALIZING, appName, "provider-lcm");
110 executor = Executors.newFixedThreadPool(1);
111 this.dataBroker = dataBroker;
112 this.notificationService = notificationProviderService;
113 this.rpcRegistry = rpcProviderRegistry;
115 if (this.rpcRegistry != null) {
116 rpcRegistration = rpcRegistry.addRpcImplementation(AppcProviderLcmService.class, this);
119 logger.info(Msg.COMPONENT_INITIALIZED, appName, "provider");
123 * Implements the close of the service
125 * @see java.lang.AutoCloseable#close()
127 @SuppressWarnings("nls")
129 public void close() throws Exception {
130 String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
131 logger.info(Msg.COMPONENT_TERMINATING, appName, "provider");
133 if (rpcRegistration != null) {
134 rpcRegistration.close();
136 logger.info(Msg.COMPONENT_TERMINATED, appName, "provider");
141 * Rebuilds a specific VNF
143 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#rebuild(RebuildInput)
146 public Future<RpcResult<RebuildOutput>> rebuild(RebuildInput input) {
147 logger.debug("Input received : " + input.toString());
149 RebuildOutputBuilder outputBuilder = new RebuildOutputBuilder();
150 String action = Action.Rebuild.toString() ;
151 String rpcName = Action.Rebuild.name().toLowerCase();
152 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
155 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
156 status = buildStatusWithDispatcherOutput(executeRequest(request));
157 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
158 } catch (ParseException e) {
159 status = buildParsingErrorStatus(e);
161 LoggingUtils.logErrorMessage(
162 LoggingConstants.TargetNames.APPC_PROVIDER,
163 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
164 this.getClass().getName());
168 outputBuilder.setCommonHeader(input.getCommonHeader());
169 outputBuilder.setStatus(status);
170 RpcResult<RebuildOutput> result = RpcResultBuilder.<RebuildOutput> status(true).withResult(outputBuilder.build()).build();
171 return Futures.immediateFuture(result);
177 * Restarts a specific VNF
179 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#restart(RestartInput)
182 public Future<RpcResult<RestartOutput>> restart(RestartInput input) {
183 logger.debug("Input received : " + input.toString());
185 RestartOutputBuilder outputBuilder = new RestartOutputBuilder();
186 String action = Action.Restart.toString() ;
187 String rpcName = Action.Restart.name().toLowerCase();
188 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
191 RequestHandlerInput request = new RequestInputBuilder().requestContext()
192 .commonHeader(input.getCommonHeader())
193 .actionIdentifiers(input.getActionIdentifiers())
194 .payload(input.getPayload())
199 status = buildStatusWithDispatcherOutput(executeRequest(request));
200 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
201 } catch (ParseException e) {
202 status = buildParsingErrorStatus(e);
204 LoggingUtils.logErrorMessage(
205 LoggingConstants.TargetNames.APPC_PROVIDER,
206 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
207 this.getClass().getName());
211 outputBuilder.setCommonHeader(input.getCommonHeader());
212 outputBuilder.setStatus(status);
213 RpcResult<RestartOutput> result = RpcResultBuilder.<RestartOutput> status(true).withResult(outputBuilder.build()).build();
214 return Futures.immediateFuture(result);
219 * Migrates a specific VNF
221 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#migrate(MigrateInput)
224 public Future<RpcResult<MigrateOutput>> migrate(MigrateInput input) {
225 logger.debug("Input received : " + input.toString());
227 MigrateOutputBuilder outputBuilder = new MigrateOutputBuilder();
228 String action = Action.Migrate.toString() ;
229 String rpcName = Action.Migrate.name().toLowerCase();
230 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
233 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
234 status = buildStatusWithDispatcherOutput(executeRequest(request));
235 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
236 } catch (ParseException e) {
237 status = buildParsingErrorStatus(e);
239 LoggingUtils.logErrorMessage(
240 LoggingConstants.TargetNames.APPC_PROVIDER,
241 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
242 this.getClass().getName());
246 outputBuilder.setCommonHeader(input.getCommonHeader());
247 outputBuilder.setStatus(status);
248 RpcResult<MigrateOutput> result = RpcResultBuilder.<MigrateOutput> status(true).withResult(outputBuilder.build()).build();
249 return Futures.immediateFuture(result);
254 * Evacuates a specific VNF
256 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#evacuate(EvacuateInput)
259 public Future<RpcResult<EvacuateOutput>> evacuate(EvacuateInput input) {
260 logger.debug("Input received : " + input.toString());
262 EvacuateOutputBuilder outputBuilder = new EvacuateOutputBuilder();
263 String action = Action.Evacuate.toString() ;
264 String rpcName = Action.Evacuate.name().toLowerCase();
265 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
268 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
269 status = buildStatusWithDispatcherOutput(executeRequest(request));
270 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
271 } catch (ParseException e) {
272 status = buildParsingErrorStatus(e);
274 LoggingUtils.logErrorMessage(
275 LoggingConstants.TargetNames.APPC_PROVIDER,
276 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
277 this.getClass().getName());
281 outputBuilder.setCommonHeader(input.getCommonHeader());
282 outputBuilder.setStatus(status);
283 RpcResult<EvacuateOutput> result = RpcResultBuilder.<EvacuateOutput> status(true).withResult(outputBuilder.build()).build();
284 return Futures.immediateFuture(result);
289 * Evacuates a specific VNF
291 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#snapshot(SnapshotInput)
294 public Future<RpcResult<SnapshotOutput>> snapshot(SnapshotInput input) {
295 logger.debug("Input received : " + input.toString());
297 SnapshotOutputBuilder outputBuilder = new SnapshotOutputBuilder();
298 String action = Action.Snapshot.toString() ;
299 String rpcName = Action.Snapshot.name().toLowerCase();
300 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
301 String identityUrl = input.getIdentityUrl();
304 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).additionalContext("identity-url", identityUrl).build();
305 status = buildStatusWithDispatcherOutput(executeRequest(request));
306 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
307 } catch (ParseException e) {
308 status = buildParsingErrorStatus(e);
310 LoggingUtils.logErrorMessage(
311 LoggingConstants.TargetNames.APPC_PROVIDER,
312 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
313 this.getClass().getName());
316 outputBuilder.setCommonHeader(input.getCommonHeader());
317 outputBuilder.setStatus(status);
318 RpcResult<SnapshotOutput> result = RpcResultBuilder.<SnapshotOutput> status(true).withResult(outputBuilder.build()).build();
319 return Futures.immediateFuture(result);
323 public Future<RpcResult<RollbackOutput>> rollback(RollbackInput input) {
324 logger.debug("Input received : " + input.toString());
326 RollbackOutputBuilder outputBuilder = new RollbackOutputBuilder();
327 String rpcName = Action.Rollback.toString() ;
328 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName);
329 String identityUrl = input.getIdentityUrl();
330 String snapshotId = input.getSnapshotId();
333 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();
334 status = buildStatusWithDispatcherOutput(executeRequest(request));
335 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
336 } catch (ParseException e) {
337 status = buildParsingErrorStatus(e);
339 LoggingUtils.logErrorMessage(
340 LoggingConstants.TargetNames.APPC_PROVIDER,
341 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, rpcName, e.getMessage()),
342 this.getClass().getName());
346 outputBuilder.setCommonHeader(input.getCommonHeader());
347 outputBuilder.setStatus(status);
348 RpcResult<RollbackOutput> result = RpcResultBuilder.<RollbackOutput> status(true).withResult(outputBuilder.build()).build();
349 return Futures.immediateFuture(result);
353 public Future<RpcResult<SyncOutput>> sync(SyncInput input) {
354 logger.debug("Input received : " + input.toString());
355 SyncOutputBuilder outputBuilder = new SyncOutputBuilder();
356 String action = Action.Sync.toString() ;
357 String rpcName = Action.Sync.name().toLowerCase();
358 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
361 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
362 status = buildStatusWithDispatcherOutput(executeRequest(request));
363 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
364 } catch (ParseException e) {
365 status = buildParsingErrorStatus(e);
367 LoggingUtils.logErrorMessage(
368 LoggingConstants.TargetNames.APPC_PROVIDER,
369 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
370 this.getClass().getName());
374 outputBuilder.setCommonHeader(input.getCommonHeader());
375 outputBuilder.setStatus(status);
376 RpcResult<SyncOutput> result = RpcResultBuilder.<SyncOutput> status(true).withResult(outputBuilder.build()).build();
377 return Futures.immediateFuture(result);
380 private Status buildParsingErrorStatus(ParseException e){
381 LCMCommandStatus requestParsingFailure = LCMCommandStatus.REQUEST_PARSING_FAILED;
382 String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
383 Params params = new Params().addParam("errorMsg", errorMessage);
384 return buildStatus(requestParsingFailure.getResponseCode(), requestParsingFailure.getFormattedMessage(params));
387 private Status buildStatus(Integer code,String message){
388 StatusBuilder status = new StatusBuilder();
389 status.setCode(code);
390 status.setMessage(message);
391 return status.build();
394 private Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){
395 Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode();
396 String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage();
397 return buildStatus(statusCode, statusMessage);
400 private RequestHandlerOutput executeRequest(RequestHandlerInput request){
402 RequestHandler handler = getRequestHandler();
403 RequestHandlerOutput requestHandlerOutput;
405 requestHandlerOutput = handler.handleRequest(request);
406 } catch (Exception e) {
408 final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
409 final String reason = EELFResourceManager.format(Msg.EXCEPTION_CALLING_DG, e, appName, e.getClass().getSimpleName(), "", e.getMessage());
411 logger.info("UNEXPECTED FAILURE while executing " + request.getRequestContext().getAction().name());
414 final ResponseContext responseContext = new ResponseContext();
415 requestHandlerOutput = new RequestHandlerOutput();
416 requestHandlerOutput.setResponseContext(responseContext);
417 responseContext.setCommonHeader(request.getRequestContext().getCommonHeader());
418 String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
419 Params params = new Params().addParam("errorMsg", errorMessage);
420 responseContext.setStatus(LCMCommandStatus.UNEXPECTED_ERROR.toStatus(params));
422 LoggingUtils.logErrorMessage(
423 LoggingConstants.TargetNames.APPC_PROVIDER,
425 this.getClass().getName());
429 return requestHandlerOutput;
432 private RequestHandler getRequestHandler(){
433 RequestHandler handler ;
434 final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext();
435 final ServiceReference reference = context.getServiceReference(RequestHandler.class.getName());
437 if (reference != null) {
438 handler = (RequestHandler) context.getService(reference);
440 logger.error("Cannot find service reference for " + RequestHandler.class.getName());
441 throw new RuntimeException();
448 public Future<RpcResult<TerminateOutput>> terminate(TerminateInput input) {
449 logger.debug("Input received : " + input.toString());
450 TerminateOutputBuilder outputBuilder = new TerminateOutputBuilder();
451 String action = Action.Terminate.toString() ;
452 String rpcName = Action.Terminate.name().toLowerCase();
453 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
456 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
457 status = buildStatusWithDispatcherOutput(executeRequest(request));
458 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
459 } catch (ParseException e) {
461 status = buildParsingErrorStatus(e);
463 LoggingUtils.logErrorMessage(
464 LoggingConstants.TargetNames.APPC_PROVIDER,
465 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
466 this.getClass().getName());
471 outputBuilder.setCommonHeader(input.getCommonHeader());
472 outputBuilder.setStatus(status);
473 RpcResult<TerminateOutput> result = RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build();
474 return Futures.immediateFuture(result);
478 public Future<RpcResult<ConfigureOutput>> configure(ConfigureInput input) {
479 logger.debug("Input received : " + input.toString());
480 ConfigureOutputBuilder outputBuilder = new ConfigureOutputBuilder();
481 String action = Action.Configure.toString() ;
482 String rpcName = "configure";
483 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
486 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
487 status = buildStatusWithDispatcherOutput(executeRequest(request));
488 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
489 } catch (ParseException e) {
490 status = buildParsingErrorStatus(e);
492 LoggingUtils.logErrorMessage(
493 LoggingConstants.TargetNames.APPC_PROVIDER,
494 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
495 this.getClass().getName());
499 outputBuilder.setCommonHeader(input.getCommonHeader());
500 outputBuilder.setStatus(status);
501 RpcResult<ConfigureOutput> result = RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build();
502 return Futures.immediateFuture(result);
506 public Future<RpcResult<ConfigModifyOutput>> configModify(ConfigModifyInput input) {
507 logger.debug("Input received : " + input.toString());
508 ConfigModifyOutputBuilder outputBuilder = new ConfigModifyOutputBuilder();
509 String action = Action.ConfigModify.toString() ;
510 String rpcName = "config-modify";
511 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
514 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
515 status = buildStatusWithDispatcherOutput(executeRequest(request));
516 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
517 } catch (ParseException e) {
518 status = buildParsingErrorStatus(e);
520 LoggingUtils.logErrorMessage(
521 LoggingConstants.TargetNames.APPC_PROVIDER,
522 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
523 this.getClass().getName());
527 outputBuilder.setCommonHeader(input.getCommonHeader());
528 outputBuilder.setStatus(status);
529 RpcResult<ConfigModifyOutput> result = RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build();
530 return Futures.immediateFuture(result);
534 public Future<RpcResult<ConfigScaleoutOutput>> configScaleout(ConfigScaleoutInput input) {
535 logger.debug("Input received : " + input.toString());
536 ConfigScaleoutOutputBuilder outputBuilder = new ConfigScaleoutOutputBuilder();
537 String action = Action.ConfigScaleOut.toString() ;
538 String rpcName = "config-scaleout";
539 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
542 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
543 status = buildStatusWithDispatcherOutput(executeRequest(request));
544 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
545 } catch (ParseException e) {
546 status = buildParsingErrorStatus(e);
548 LoggingUtils.logErrorMessage(
549 LoggingConstants.TargetNames.APPC_PROVIDER,
550 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
551 this.getClass().getName());
555 outputBuilder.setCommonHeader(input.getCommonHeader());
556 outputBuilder.setStatus(status);
557 RpcResult<ConfigScaleoutOutput> result = RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build();
558 return Futures.immediateFuture(result);
562 public Future<RpcResult<ConfigRestoreOutput>> configRestore(ConfigRestoreInput input) {
563 logger.debug("Input received : " + input.toString());
564 ConfigRestoreOutputBuilder outputBuilder = new ConfigRestoreOutputBuilder();
565 String action = Action.ConfigRestore.toString() ;
566 String rpcName = "config-restore";
567 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
570 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
571 status = buildStatusWithDispatcherOutput(executeRequest(request));
572 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
573 } catch (ParseException e) {
574 status = buildParsingErrorStatus(e);
576 LoggingUtils.logErrorMessage(
577 LoggingConstants.TargetNames.APPC_PROVIDER,
578 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
579 this.getClass().getName());
583 outputBuilder.setCommonHeader(input.getCommonHeader());
584 outputBuilder.setStatus(status);
585 RpcResult<ConfigRestoreOutput> result = RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build();
586 return Futures.immediateFuture(result);
590 public Future<RpcResult<TestOutput>> test(TestInput input) {
591 logger.debug("Input received : " + input.toString());
592 TestOutputBuilder outputBuilder = new TestOutputBuilder();
593 String action = Action.Test.toString() ;
594 String rpcName = Action.Test.name().toLowerCase();
595 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
598 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
599 status = buildStatusWithDispatcherOutput(executeRequest(request));
600 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
601 } catch (ParseException e) {
602 status = buildParsingErrorStatus(e);
604 LoggingUtils.logErrorMessage(
605 LoggingConstants.TargetNames.APPC_PROVIDER,
606 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
607 this.getClass().getName());
611 outputBuilder.setCommonHeader(input.getCommonHeader());
612 outputBuilder.setStatus(status);
613 RpcResult<TestOutput> result = RpcResultBuilder.<TestOutput> status(true).withResult(outputBuilder.build()).build();
614 return Futures.immediateFuture(result);
619 public Future<RpcResult<StopOutput>> stop(StopInput input) {
620 logger.debug("Input received : " + input.toString());
621 StopOutputBuilder outputBuilder = new StopOutputBuilder();
622 String action = Action.Stop.toString() ;
623 String rpcName = Action.Stop.name().toLowerCase();
624 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
627 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
628 status = buildStatusWithDispatcherOutput(executeRequest(request));
629 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
630 } catch (ParseException e) {
631 status = buildParsingErrorStatus(e);
633 LoggingUtils.logErrorMessage(
634 LoggingConstants.TargetNames.APPC_PROVIDER,
635 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
636 this.getClass().getName());
640 outputBuilder.setCommonHeader(input.getCommonHeader());
641 outputBuilder.setStatus(status);
642 RpcResult<StopOutput> result = RpcResultBuilder.<StopOutput> status(true).withResult(outputBuilder.build()).build();
643 return Futures.immediateFuture(result);
647 * Starts a specific VNF
649 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#start(StartInput)
652 public Future<RpcResult<StartOutput>> start(StartInput input) {
653 logger.debug("Input received : " + input.toString());
655 StartOutputBuilder outputBuilder = new StartOutputBuilder();
656 String action = Action.Start.toString() ;
657 String rpcName = Action.Start.name().toLowerCase();
658 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
661 RequestHandlerInput request = new RequestInputBuilder().requestContext()
662 .commonHeader(input.getCommonHeader())
663 .actionIdentifiers(input.getActionIdentifiers())
664 .payload(input.getPayload())
666 .rpcName(rpcName).build();
667 status = buildStatusWithDispatcherOutput(executeRequest(request));
668 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
669 } catch (ParseException e) {
670 status = buildParsingErrorStatus(e);
672 LoggingUtils.logErrorMessage(
673 LoggingConstants.TargetNames.APPC_PROVIDER,
674 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
675 this.getClass().getName());
679 outputBuilder.setCommonHeader(input.getCommonHeader());
680 outputBuilder.setStatus(status);
681 RpcResult<StartOutput> result = RpcResultBuilder.<StartOutput> status(true).withResult(outputBuilder.build()).build();
682 return Futures.immediateFuture(result);
687 public Future<RpcResult<AuditOutput>> audit(AuditInput input) {
688 logger.debug("Input received : " + input.toString());
689 AuditOutputBuilder outputBuilder = new AuditOutputBuilder();
690 String action = Action.Audit.toString();
691 String rpcName = Action.Audit.name().toLowerCase();
692 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
695 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
696 status = buildStatusWithDispatcherOutput(executeRequest(request));
697 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
698 } catch (ParseException e) {
699 status = buildParsingErrorStatus(e);
701 LoggingUtils.logErrorMessage(
702 LoggingConstants.TargetNames.APPC_PROVIDER,
703 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
704 this.getClass().getName());
708 outputBuilder.setCommonHeader(input.getCommonHeader());
709 outputBuilder.setStatus(status);
710 RpcResult<AuditOutput> result = RpcResultBuilder.<AuditOutput> status(true).withResult(outputBuilder.build()).build();
711 return Futures.immediateFuture(result);
715 public Future<RpcResult<SoftwareUploadOutput>> softwareUpload(SoftwareUploadInput input) {
716 logger.debug("Input received : " + input.toString());
717 SoftwareUploadOutputBuilder outputBuilder = new SoftwareUploadOutputBuilder();
718 String action = Action.SoftwareUpload.toString() ;
719 String rpcName = convertActionNameToUrl(action);
720 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
723 RequestHandlerInput request = new RequestInputBuilder().
724 requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
725 status = buildStatusWithDispatcherOutput(executeRequest(request));
726 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
727 } catch (ParseException e) {
728 status = buildParsingErrorStatus(e);
730 LoggingUtils.logErrorMessage(
731 LoggingConstants.TargetNames.APPC_PROVIDER,
732 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
733 this.getClass().getName());
737 outputBuilder.setCommonHeader(input.getCommonHeader());
738 outputBuilder.setStatus(status);
739 RpcResult<SoftwareUploadOutput> result = RpcResultBuilder.<SoftwareUploadOutput> status(true).withResult(outputBuilder.build()).build();
740 return Futures.immediateFuture(result);
744 public Future<RpcResult<HealthCheckOutput>> healthCheck(HealthCheckInput input) {
745 logger.debug("Input received : " + input.toString());
746 HealthCheckOutputBuilder outputBuilder = new HealthCheckOutputBuilder();
747 String action = Action.HealthCheck.toString() ;
748 String rpcName = convertActionNameToUrl(action);
749 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
752 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
753 status = buildStatusWithDispatcherOutput(executeRequest(request));
754 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
755 } catch (ParseException e) {
756 status = buildParsingErrorStatus(e);
758 LoggingUtils.logErrorMessage(
759 LoggingConstants.TargetNames.APPC_PROVIDER,
760 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
761 this.getClass().getName());
765 outputBuilder.setCommonHeader(input.getCommonHeader());
766 outputBuilder.setStatus(status);
767 RpcResult<HealthCheckOutput> result = RpcResultBuilder.<HealthCheckOutput> status(true).withResult(outputBuilder.build()).build();
768 return Futures.immediateFuture(result);
772 public Future<RpcResult<LiveUpgradeOutput>> liveUpgrade(LiveUpgradeInput input) {
773 logger.debug("Input received : " + input.toString());
774 LiveUpgradeOutputBuilder outputBuilder = new LiveUpgradeOutputBuilder();
775 String action = Action.LiveUpgrade.toString() ;
776 String rpcName = convertActionNameToUrl(action);
777 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
780 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
781 status = buildStatusWithDispatcherOutput(executeRequest(request));
782 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
783 } catch (ParseException e) {
784 status = buildParsingErrorStatus(e);
786 LoggingUtils.logErrorMessage(
787 LoggingConstants.TargetNames.APPC_PROVIDER,
788 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
789 this.getClass().getName());
793 outputBuilder.setCommonHeader(input.getCommonHeader());
794 outputBuilder.setStatus(status);
795 RpcResult<LiveUpgradeOutput> result = RpcResultBuilder.<LiveUpgradeOutput> status(true).withResult(outputBuilder.build()).build();
796 return Futures.immediateFuture(result);
801 public Future<RpcResult<LockOutput>> lock(LockInput input) {
802 logger.debug("Input received : " + input.toString());
803 LockOutputBuilder outputBuilder = new LockOutputBuilder();
804 String action = Action.Lock.toString() ;
805 String rpcName = Action.Lock.name().toLowerCase();
806 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
809 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
810 status = buildStatusWithDispatcherOutput(executeRequest(request));
811 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
812 } catch (ParseException e) {
813 status = buildParsingErrorStatus(e);
815 LoggingUtils.logErrorMessage(
816 LoggingConstants.TargetNames.APPC_PROVIDER,
817 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
818 this.getClass().getName());
822 outputBuilder.setCommonHeader(input.getCommonHeader());
823 outputBuilder.setStatus(status);
824 RpcResult<LockOutput> result = RpcResultBuilder.<LockOutput> status(true).withResult(outputBuilder.build()).build();
825 return Futures.immediateFuture(result);
830 public Future<RpcResult<UnlockOutput>> unlock(UnlockInput input) {
831 logger.debug("Input received : " + input.toString());
832 UnlockOutputBuilder outputBuilder = new UnlockOutputBuilder();
833 String action = Action.Unlock.toString() ;
834 String rpcName = Action.Unlock.name().toLowerCase();
835 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
838 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
839 status = buildStatusWithDispatcherOutput(executeRequest(request));
840 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
841 } catch (ParseException e) {
842 status = buildParsingErrorStatus(e);
844 LoggingUtils.logErrorMessage(
845 LoggingConstants.TargetNames.APPC_PROVIDER,
846 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
847 this.getClass().getName());
851 outputBuilder.setCommonHeader(input.getCommonHeader());
852 outputBuilder.setStatus(status);
853 RpcResult<UnlockOutput> result = RpcResultBuilder.<UnlockOutput> status(true).withResult(outputBuilder.build()).build();
854 return Futures.immediateFuture(result);
858 public Future<RpcResult<CheckLockOutput>> checkLock(CheckLockInput input) {
859 logger.debug("Input received : " + input.toString());
860 CheckLockOutputBuilder outputBuilder = new CheckLockOutputBuilder();
861 String action = Action.CheckLock.toString() ;
862 String rpcName = Action.CheckLock.name().toLowerCase();
863 RequestHandlerOutput requestHandlerOutput=null;
864 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
867 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
868 requestHandlerOutput=executeRequest(request);
870 status = buildStatusWithDispatcherOutput(requestHandlerOutput);
871 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
872 } catch (ParseException e) {
873 status = buildParsingErrorStatus(e);
875 LoggingUtils.logErrorMessage(
876 LoggingConstants.TargetNames.APPC_PROVIDER,
877 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
878 this.getClass().getName());
882 outputBuilder.setCommonHeader(input.getCommonHeader());
883 outputBuilder.setStatus(status);
884 if(requestHandlerOutput.getResponseContext().getStatus().getCode() == 400) {
885 outputBuilder.setLocked(CheckLockOutput.Locked.valueOf(requestHandlerOutput.getResponseContext().getAdditionalContext().get("locked").toUpperCase()));
887 RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput> status(true).withResult(outputBuilder.build()).build();
888 return Futures.immediateFuture(result);
892 public Future<RpcResult<ConfigBackupOutput>> configBackup(ConfigBackupInput input) {
893 logger.debug("Input received : " + input.toString());
894 ConfigBackupOutputBuilder outputBuilder = new ConfigBackupOutputBuilder();
895 String action = Action.ConfigBackup.toString() ;
896 String rpcName = Action.ConfigBackup.name().toLowerCase();
897 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
900 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).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<ConfigBackupOutput> result = RpcResultBuilder.<ConfigBackupOutput> status(true).withResult(outputBuilder.build()).build();
916 return Futures.immediateFuture(result);
921 public Future<RpcResult<ConfigBackupDeleteOutput>> configBackupDelete(ConfigBackupDeleteInput input) {
922 logger.debug("Input received : " + input.toString());
923 ConfigBackupDeleteOutputBuilder outputBuilder = new ConfigBackupDeleteOutputBuilder();
924 String action = Action.ConfigBackupDelete.toString() ;
925 String rpcName = Action.ConfigBackupDelete.name().toLowerCase();
926 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
929 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
930 status = buildStatusWithDispatcherOutput(executeRequest(request));
931 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
932 } catch (ParseException e) {
933 status = buildParsingErrorStatus(e);
935 LoggingUtils.logErrorMessage(
936 LoggingConstants.TargetNames.APPC_PROVIDER,
937 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
938 this.getClass().getName());
942 outputBuilder.setCommonHeader(input.getCommonHeader());
943 outputBuilder.setStatus(status);
944 RpcResult<ConfigBackupDeleteOutput> result = RpcResultBuilder.<ConfigBackupDeleteOutput> status(true).withResult(outputBuilder.build()).build();
945 return Futures.immediateFuture(result);
950 public Future<RpcResult<ConfigExportOutput>> configExport(ConfigExportInput input) {
951 logger.debug("Input received : " + input.toString());
952 ConfigExportOutputBuilder outputBuilder = new ConfigExportOutputBuilder();
953 String action = Action.ConfigExport.toString() ;
954 String rpcName = Action.ConfigExport.name().toLowerCase();
955 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
958 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
959 status = buildStatusWithDispatcherOutput(executeRequest(request));
960 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
961 } catch (ParseException e) {
962 status = buildParsingErrorStatus(e);
964 LoggingUtils.logErrorMessage(
965 LoggingConstants.TargetNames.APPC_PROVIDER,
966 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
967 this.getClass().getName());
971 outputBuilder.setCommonHeader(input.getCommonHeader());
972 outputBuilder.setStatus(status);
973 RpcResult<ConfigExportOutput> result = RpcResultBuilder.<ConfigExportOutput> status(true).withResult(outputBuilder.build()).build();
974 return Futures.immediateFuture(result);
977 private String convertActionNameToUrl(String action) {
978 String regex = "([a-z])([A-Z]+)";
979 String replacement = "$1-$2";
980 return action.replaceAll(regex, replacement)