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 java.text.ParseException;
28 import java.util.Collection;
29 import java.util.concurrent.ExecutorService;
30 import java.util.concurrent.Executors;
31 import java.util.concurrent.Future;
33 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
34 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
35 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
36 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
37 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.CommonHeader;
38 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.*;
39 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.Status;
40 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.StatusBuilder;
41 import org.opendaylight.yangtools.yang.common.RpcResult;
42 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
43 import org.openecomp.appc.Constants;
44 import org.openecomp.appc.configuration.Configuration;
45 import org.openecomp.appc.configuration.ConfigurationFactory;
46 import org.openecomp.appc.domainmodel.lcm.ActionLevel;
47 import org.openecomp.appc.domainmodel.lcm.ResponseContext;
48 import org.openecomp.appc.domainmodel.lcm.RuntimeContext;
49 import org.openecomp.appc.executor.objects.LCMCommandStatus;
50 import org.openecomp.appc.executor.objects.Params;
51 import org.openecomp.appc.i18n.Msg;
52 import org.openecomp.appc.logging.LoggingConstants;
53 import org.openecomp.appc.logging.LoggingUtils;
54 import org.openecomp.appc.provider.lcm.util.RequestInputBuilder;
55 import org.openecomp.appc.provider.lcm.util.ValidationService;
56 import org.openecomp.appc.requesthandler.RequestHandler;
57 import org.openecomp.appc.requesthandler.objects.RequestHandlerInput;
58 import org.openecomp.appc.requesthandler.objects.RequestHandlerOutput;
59 import com.att.eelf.configuration.EELFLogger;
60 import com.att.eelf.configuration.EELFManager;
61 import com.att.eelf.i18n.EELFResourceManager;
62 import org.osgi.framework.BundleContext;
63 import org.osgi.framework.FrameworkUtil;
64 import org.osgi.framework.InvalidSyntaxException;
65 import org.osgi.framework.ServiceReference;
67 import com.google.common.util.concurrent.Futures;
71 public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
73 private Configuration configuration = ConfigurationFactory.getConfiguration();
74 private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class);
76 private final ExecutorService executor;
78 private final String COMMON_ERROR_MESSAGE_TEMPLATE = "Error processing %s input : %s";
81 * The ODL data store broker. Provides access to a conceptual data tree store and also provides the ability to
82 * subscribe for changes to data under a given branch of the tree.
84 protected DataBroker dataBroker;
87 * ODL Notification Service that provides publish/subscribe capabilities for YANG modeled notifications.
89 protected NotificationProviderService notificationService;
92 * Provides a registry for Remote Procedure Call (RPC) service implementations. The RPCs are defined in YANG models.
94 protected RpcProviderRegistry rpcRegistry;
97 * Represents our RPC implementation registration
99 protected BindingAwareBroker.RpcRegistration<AppcProviderLcmService> rpcRegistration;
104 * @param notificationProviderService
105 * @param rpcProviderRegistry
110 public AppcProviderLcm(DataBroker dataBroker, NotificationProviderService notificationProviderService,
111 RpcProviderRegistry rpcProviderRegistry) {
113 String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
114 logger.info(Msg.COMPONENT_INITIALIZING, appName, "provider-lcm");
116 executor = Executors.newFixedThreadPool(1);
117 this.dataBroker = dataBroker;
118 this.notificationService = notificationProviderService;
119 this.rpcRegistry = rpcProviderRegistry;
121 if (this.rpcRegistry != null) {
122 rpcRegistration = rpcRegistry.addRpcImplementation(AppcProviderLcmService.class, this);
125 logger.info(Msg.COMPONENT_INITIALIZED, appName, "provider");
129 * Implements the close of the service
131 * @see java.lang.AutoCloseable#close()
133 @SuppressWarnings("nls")
135 public void close() throws Exception {
136 String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
137 logger.info(Msg.COMPONENT_TERMINATING, appName, "provider");
139 if (rpcRegistration != null) {
140 rpcRegistration.close();
142 logger.info(Msg.COMPONENT_TERMINATED, appName, "provider");
147 * Rebuilds a specific VNF
149 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#rebuild(RebuildInput)
152 public Future<RpcResult<RebuildOutput>> rebuild(RebuildInput input) {
153 logger.debug("Input received : " + input.toString());
155 RebuildOutputBuilder outputBuilder = new RebuildOutputBuilder();
156 String action = Action.Rebuild.toString() ;
157 String rpcName = Action.Rebuild.name().toLowerCase();
158 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
161 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
162 status = buildStatusWithDispatcherOutput(executeRequest(request));
163 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
164 } catch (ParseException e) {
165 status = buildParsingErrorStatus(e);
167 LoggingUtils.logErrorMessage(
168 LoggingConstants.TargetNames.APPC_PROVIDER,
169 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
170 this.getClass().getName());
174 outputBuilder.setCommonHeader(input.getCommonHeader());
175 outputBuilder.setStatus(status);
176 RpcResult<RebuildOutput> result = RpcResultBuilder.<RebuildOutput> status(true).withResult(outputBuilder.build()).build();
177 return Futures.immediateFuture(result);
183 * Restarts a specific VNF
185 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.AppcProviderLcmService#restart(RestartInput)
188 public Future<RpcResult<RestartOutput>> restart(RestartInput input) {
189 logger.debug("Input received : " + input.toString());
191 RestartOutputBuilder outputBuilder = new RestartOutputBuilder();
192 String action = Action.Restart.toString() ;
193 String rpcName = Action.Restart.name().toLowerCase();
194 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
197 RequestHandlerInput request = new RequestInputBuilder().requestContext()
198 .commonHeader(input.getCommonHeader())
199 .actionIdentifiers(input.getActionIdentifiers())
200 .payload(input.getPayload())
205 status = buildStatusWithDispatcherOutput(executeRequest(request));
206 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
207 } catch (ParseException e) {
208 status = buildParsingErrorStatus(e);
210 LoggingUtils.logErrorMessage(
211 LoggingConstants.TargetNames.APPC_PROVIDER,
212 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
213 this.getClass().getName());
217 outputBuilder.setCommonHeader(input.getCommonHeader());
218 outputBuilder.setStatus(status);
219 RpcResult<RestartOutput> result = RpcResultBuilder.<RestartOutput> status(true).withResult(outputBuilder.build()).build();
220 return Futures.immediateFuture(result);
225 * Migrates a specific VNF
227 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#migrate(MigrateInput)
230 public Future<RpcResult<MigrateOutput>> migrate(MigrateInput input) {
231 logger.debug("Input received : " + input.toString());
233 MigrateOutputBuilder outputBuilder = new MigrateOutputBuilder();
234 String action = Action.Migrate.toString() ;
235 String rpcName = Action.Migrate.name().toLowerCase();
236 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
239 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
240 status = buildStatusWithDispatcherOutput(executeRequest(request));
241 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
242 } catch (ParseException e) {
243 status = buildParsingErrorStatus(e);
245 LoggingUtils.logErrorMessage(
246 LoggingConstants.TargetNames.APPC_PROVIDER,
247 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
248 this.getClass().getName());
252 outputBuilder.setCommonHeader(input.getCommonHeader());
253 outputBuilder.setStatus(status);
254 RpcResult<MigrateOutput> result = RpcResultBuilder.<MigrateOutput> status(true).withResult(outputBuilder.build()).build();
255 return Futures.immediateFuture(result);
260 * Evacuates a specific VNF
262 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#evacuate(EvacuateInput)
265 public Future<RpcResult<EvacuateOutput>> evacuate(EvacuateInput input) {
266 logger.debug("Input received : " + input.toString());
268 EvacuateOutputBuilder outputBuilder = new EvacuateOutputBuilder();
269 String action = Action.Evacuate.toString() ;
270 String rpcName = Action.Evacuate.name().toLowerCase();
271 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
274 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
275 status = buildStatusWithDispatcherOutput(executeRequest(request));
276 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
277 } catch (ParseException e) {
278 status = buildParsingErrorStatus(e);
280 LoggingUtils.logErrorMessage(
281 LoggingConstants.TargetNames.APPC_PROVIDER,
282 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
283 this.getClass().getName());
287 outputBuilder.setCommonHeader(input.getCommonHeader());
288 outputBuilder.setStatus(status);
289 RpcResult<EvacuateOutput> result = RpcResultBuilder.<EvacuateOutput> status(true).withResult(outputBuilder.build()).build();
290 return Futures.immediateFuture(result);
295 * Evacuates a specific VNF
297 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#snapshot(SnapshotInput)
300 public Future<RpcResult<SnapshotOutput>> snapshot(SnapshotInput input) {
301 logger.debug("Input received : " + input.toString());
303 SnapshotOutputBuilder outputBuilder = new SnapshotOutputBuilder();
304 String action = Action.Snapshot.toString() ;
305 String rpcName = Action.Snapshot.name().toLowerCase();
306 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
307 String identityUrl = input.getIdentityUrl();
310 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).additionalContext("identity-url", identityUrl).build();
311 status = buildStatusWithDispatcherOutput(executeRequest(request));
312 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
313 } catch (ParseException e) {
314 status = buildParsingErrorStatus(e);
316 LoggingUtils.logErrorMessage(
317 LoggingConstants.TargetNames.APPC_PROVIDER,
318 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
319 this.getClass().getName());
322 outputBuilder.setCommonHeader(input.getCommonHeader());
323 outputBuilder.setStatus(status);
324 RpcResult<SnapshotOutput> result = RpcResultBuilder.<SnapshotOutput> status(true).withResult(outputBuilder.build()).build();
325 return Futures.immediateFuture(result);
329 public Future<RpcResult<RollbackOutput>> rollback(RollbackInput input) {
330 logger.debug("Input received : " + input.toString());
332 RollbackOutputBuilder outputBuilder = new RollbackOutputBuilder();
333 String rpcName = Action.Rollback.toString() ;
334 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName);
335 String identityUrl = input.getIdentityUrl();
336 String snapshotId = input.getSnapshotId();
339 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();
340 status = buildStatusWithDispatcherOutput(executeRequest(request));
341 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
342 } catch (ParseException e) {
343 status = buildParsingErrorStatus(e);
345 LoggingUtils.logErrorMessage(
346 LoggingConstants.TargetNames.APPC_PROVIDER,
347 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, rpcName, e.getMessage()),
348 this.getClass().getName());
352 outputBuilder.setCommonHeader(input.getCommonHeader());
353 outputBuilder.setStatus(status);
354 RpcResult<RollbackOutput> result = RpcResultBuilder.<RollbackOutput> status(true).withResult(outputBuilder.build()).build();
355 return Futures.immediateFuture(result);
359 public Future<RpcResult<SyncOutput>> sync(SyncInput input) {
360 logger.debug("Input received : " + input.toString());
361 SyncOutputBuilder outputBuilder = new SyncOutputBuilder();
362 String action = Action.Sync.toString() ;
363 String rpcName = Action.Sync.name().toLowerCase();
364 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
367 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
368 status = buildStatusWithDispatcherOutput(executeRequest(request));
369 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
370 } catch (ParseException e) {
371 status = buildParsingErrorStatus(e);
373 LoggingUtils.logErrorMessage(
374 LoggingConstants.TargetNames.APPC_PROVIDER,
375 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
376 this.getClass().getName());
380 outputBuilder.setCommonHeader(input.getCommonHeader());
381 outputBuilder.setStatus(status);
382 RpcResult<SyncOutput> result = RpcResultBuilder.<SyncOutput> status(true).withResult(outputBuilder.build()).build();
383 return Futures.immediateFuture(result);
386 private Status buildParsingErrorStatus(ParseException e){
387 LCMCommandStatus requestParsingFailure = LCMCommandStatus.REQUEST_PARSING_FAILED;
388 String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
389 Params params = new Params().addParam("errorMsg", errorMessage);
390 return buildStatus(requestParsingFailure.getResponseCode(), requestParsingFailure.getFormattedMessage(params));
393 private Status buildStatus(Integer code,String message){
394 StatusBuilder status = new StatusBuilder();
395 status.setCode(code);
396 status.setMessage(message);
397 return status.build();
400 private Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){
401 Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode();
402 String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage();
403 return buildStatus(statusCode, statusMessage);
406 private RequestHandlerOutput executeRequest(RequestHandlerInput request){
408 RequestHandler handler = getRequestHandler(request.getRequestContext().getActionLevel());
409 RequestHandlerOutput requestHandlerOutput;
411 requestHandlerOutput = handler.handleRequest(request);
412 } catch (Exception e) {
414 final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
415 final String reason = EELFResourceManager.format(Msg.EXCEPTION_CALLING_DG, e, appName, e.getClass().getSimpleName(), "", e.getMessage());
417 logger.info("UNEXPECTED FAILURE while executing " + request.getRequestContext().getAction().name());
420 final ResponseContext responseContext = new ResponseContext();
421 requestHandlerOutput = new RequestHandlerOutput();
422 requestHandlerOutput.setResponseContext(responseContext);
423 responseContext.setCommonHeader(request.getRequestContext().getCommonHeader());
424 String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
425 Params params = new Params().addParam("errorMsg", errorMessage);
426 responseContext.setStatus(LCMCommandStatus.UNEXPECTED_ERROR.toStatus(params));
428 LoggingUtils.logErrorMessage(
429 LoggingConstants.TargetNames.APPC_PROVIDER,
431 this.getClass().getName());
435 return requestHandlerOutput;
438 private RequestHandler getRequestHandler(ActionLevel actionLevel){
439 RequestHandler handler ;
440 final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext();
441 String filter = "(level=" + actionLevel.name() + ")";
443 Collection<ServiceReference<RequestHandler>> serviceReferences = context.getServiceReferences(RequestHandler.class, filter);
444 if (serviceReferences.size() != 1) {
445 logger.error("Cannot find service reference for " + RequestHandler.class.getName());
446 throw new RuntimeException();
448 ServiceReference<RequestHandler> serviceReference = serviceReferences.iterator().next();
449 handler = context.getService(serviceReference);
450 } catch (InvalidSyntaxException e) {
451 logger.error("Cannot find service reference for " + RequestHandler.class.getName() + ": Invalid Syntax " + filter, e);
452 throw new RuntimeException(e);
459 public Future<RpcResult<TerminateOutput>> terminate(TerminateInput input) {
460 logger.debug("Input received : " + input.toString());
461 TerminateOutputBuilder outputBuilder = new TerminateOutputBuilder();
462 String action = Action.Terminate.toString() ;
463 String rpcName = Action.Terminate.name().toLowerCase();
464 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
467 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
468 status = buildStatusWithDispatcherOutput(executeRequest(request));
469 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
470 } catch (ParseException e) {
472 status = buildParsingErrorStatus(e);
474 LoggingUtils.logErrorMessage(
475 LoggingConstants.TargetNames.APPC_PROVIDER,
476 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
477 this.getClass().getName());
482 outputBuilder.setCommonHeader(input.getCommonHeader());
483 outputBuilder.setStatus(status);
484 RpcResult<TerminateOutput> result = RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build();
485 return Futures.immediateFuture(result);
489 public Future<RpcResult<ConfigureOutput>> configure(ConfigureInput input) {
490 logger.debug("Input received : " + input.toString());
491 ConfigureOutputBuilder outputBuilder = new ConfigureOutputBuilder();
492 String action = Action.Configure.toString() ;
493 String rpcName = "configure";
494 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
497 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
498 status = buildStatusWithDispatcherOutput(executeRequest(request));
499 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
500 } catch (ParseException e) {
501 status = buildParsingErrorStatus(e);
503 LoggingUtils.logErrorMessage(
504 LoggingConstants.TargetNames.APPC_PROVIDER,
505 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
506 this.getClass().getName());
510 outputBuilder.setCommonHeader(input.getCommonHeader());
511 outputBuilder.setStatus(status);
512 RpcResult<ConfigureOutput> result = RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build();
513 return Futures.immediateFuture(result);
517 public Future<RpcResult<ConfigModifyOutput>> configModify(ConfigModifyInput input) {
518 logger.debug("Input received : " + input.toString());
519 ConfigModifyOutputBuilder outputBuilder = new ConfigModifyOutputBuilder();
520 String action = Action.ConfigModify.toString() ;
521 String rpcName = "config-modify";
522 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
525 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
526 status = buildStatusWithDispatcherOutput(executeRequest(request));
527 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
528 } catch (ParseException e) {
529 status = buildParsingErrorStatus(e);
531 LoggingUtils.logErrorMessage(
532 LoggingConstants.TargetNames.APPC_PROVIDER,
533 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
534 this.getClass().getName());
538 outputBuilder.setCommonHeader(input.getCommonHeader());
539 outputBuilder.setStatus(status);
540 RpcResult<ConfigModifyOutput> result = RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build();
541 return Futures.immediateFuture(result);
545 public Future<RpcResult<ConfigScaleoutOutput>> configScaleout(ConfigScaleoutInput input) {
546 logger.debug("Input received : " + input.toString());
547 ConfigScaleoutOutputBuilder outputBuilder = new ConfigScaleoutOutputBuilder();
548 String action = Action.ConfigScaleOut.toString() ;
549 String rpcName = "config-scaleout";
550 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
553 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
554 status = buildStatusWithDispatcherOutput(executeRequest(request));
555 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
556 } catch (ParseException e) {
557 status = buildParsingErrorStatus(e);
559 LoggingUtils.logErrorMessage(
560 LoggingConstants.TargetNames.APPC_PROVIDER,
561 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
562 this.getClass().getName());
566 outputBuilder.setCommonHeader(input.getCommonHeader());
567 outputBuilder.setStatus(status);
568 RpcResult<ConfigScaleoutOutput> result = RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build();
569 return Futures.immediateFuture(result);
573 public Future<RpcResult<ConfigRestoreOutput>> configRestore(ConfigRestoreInput input) {
574 logger.debug("Input received : " + input.toString());
575 ConfigRestoreOutputBuilder outputBuilder = new ConfigRestoreOutputBuilder();
576 String action = Action.ConfigRestore.toString() ;
577 String rpcName = "config-restore";
578 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
581 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
582 status = buildStatusWithDispatcherOutput(executeRequest(request));
583 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
584 } catch (ParseException e) {
585 status = buildParsingErrorStatus(e);
587 LoggingUtils.logErrorMessage(
588 LoggingConstants.TargetNames.APPC_PROVIDER,
589 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
590 this.getClass().getName());
594 outputBuilder.setCommonHeader(input.getCommonHeader());
595 outputBuilder.setStatus(status);
596 RpcResult<ConfigRestoreOutput> result = RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build();
597 return Futures.immediateFuture(result);
601 public Future<RpcResult<TestOutput>> test(TestInput input) {
602 logger.debug("Input received : " + input.toString());
603 TestOutputBuilder outputBuilder = new TestOutputBuilder();
604 String action = Action.Test.toString() ;
605 String rpcName = Action.Test.name().toLowerCase();
606 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
609 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
610 status = buildStatusWithDispatcherOutput(executeRequest(request));
611 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
612 } catch (ParseException e) {
613 status = buildParsingErrorStatus(e);
615 LoggingUtils.logErrorMessage(
616 LoggingConstants.TargetNames.APPC_PROVIDER,
617 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
618 this.getClass().getName());
622 outputBuilder.setCommonHeader(input.getCommonHeader());
623 outputBuilder.setStatus(status);
624 RpcResult<TestOutput> result = RpcResultBuilder.<TestOutput> status(true).withResult(outputBuilder.build()).build();
625 return Futures.immediateFuture(result);
630 public Future<RpcResult<StopOutput>> stop(StopInput input) {
631 logger.debug("Input received : " + input.toString());
632 StopOutputBuilder outputBuilder = new StopOutputBuilder();
633 String action = Action.Stop.toString() ;
634 String rpcName = Action.Stop.name().toLowerCase();
635 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
638 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
639 status = buildStatusWithDispatcherOutput(executeRequest(request));
640 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
641 } catch (ParseException e) {
642 status = buildParsingErrorStatus(e);
644 LoggingUtils.logErrorMessage(
645 LoggingConstants.TargetNames.APPC_PROVIDER,
646 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
647 this.getClass().getName());
651 outputBuilder.setCommonHeader(input.getCommonHeader());
652 outputBuilder.setStatus(status);
653 RpcResult<StopOutput> result = RpcResultBuilder.<StopOutput> status(true).withResult(outputBuilder.build()).build();
654 return Futures.immediateFuture(result);
658 * Starts a specific VNF
660 * @see org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AppcProviderLcmService#start(StartInput)
663 public Future<RpcResult<StartOutput>> start(StartInput input) {
664 logger.debug("Input received : " + input.toString());
666 StartOutputBuilder outputBuilder = new StartOutputBuilder();
667 String action = Action.Start.toString() ;
668 String rpcName = Action.Start.name().toLowerCase();
669 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
672 RequestHandlerInput request = new RequestInputBuilder().requestContext()
673 .commonHeader(input.getCommonHeader())
674 .actionIdentifiers(input.getActionIdentifiers())
675 .payload(input.getPayload())
677 .rpcName(rpcName).build();
678 status = buildStatusWithDispatcherOutput(executeRequest(request));
679 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
680 } catch (ParseException e) {
681 status = buildParsingErrorStatus(e);
683 LoggingUtils.logErrorMessage(
684 LoggingConstants.TargetNames.APPC_PROVIDER,
685 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
686 this.getClass().getName());
690 outputBuilder.setCommonHeader(input.getCommonHeader());
691 outputBuilder.setStatus(status);
692 RpcResult<StartOutput> result = RpcResultBuilder.<StartOutput> status(true).withResult(outputBuilder.build()).build();
693 return Futures.immediateFuture(result);
698 public Future<RpcResult<AuditOutput>> audit(AuditInput input) {
699 logger.debug("Input received : " + input.toString());
700 AuditOutputBuilder outputBuilder = new AuditOutputBuilder();
701 String action = Action.Audit.toString();
702 String rpcName = Action.Audit.name().toLowerCase();
703 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
706 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
707 status = buildStatusWithDispatcherOutput(executeRequest(request));
708 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
709 } catch (ParseException e) {
710 status = buildParsingErrorStatus(e);
712 LoggingUtils.logErrorMessage(
713 LoggingConstants.TargetNames.APPC_PROVIDER,
714 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
715 this.getClass().getName());
719 outputBuilder.setCommonHeader(input.getCommonHeader());
720 outputBuilder.setStatus(status);
721 RpcResult<AuditOutput> result = RpcResultBuilder.<AuditOutput> status(true).withResult(outputBuilder.build()).build();
722 return Futures.immediateFuture(result);
726 public Future<RpcResult<SoftwareUploadOutput>> softwareUpload(SoftwareUploadInput input) {
727 logger.debug("Input received : " + input.toString());
728 SoftwareUploadOutputBuilder outputBuilder = new SoftwareUploadOutputBuilder();
729 String action = Action.SoftwareUpload.toString() ;
730 String rpcName = convertActionNameToUrl(action);
731 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
734 RequestHandlerInput request = new RequestInputBuilder().
735 requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
736 status = buildStatusWithDispatcherOutput(executeRequest(request));
737 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
738 } catch (ParseException e) {
739 status = buildParsingErrorStatus(e);
741 LoggingUtils.logErrorMessage(
742 LoggingConstants.TargetNames.APPC_PROVIDER,
743 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
744 this.getClass().getName());
748 outputBuilder.setCommonHeader(input.getCommonHeader());
749 outputBuilder.setStatus(status);
750 RpcResult<SoftwareUploadOutput> result = RpcResultBuilder.<SoftwareUploadOutput> status(true).withResult(outputBuilder.build()).build();
751 return Futures.immediateFuture(result);
755 public Future<RpcResult<HealthCheckOutput>> healthCheck(HealthCheckInput input) {
756 logger.debug("Input received : " + input.toString());
757 HealthCheckOutputBuilder outputBuilder = new HealthCheckOutputBuilder();
758 String action = Action.HealthCheck.toString() ;
759 String rpcName = convertActionNameToUrl(action);
760 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
763 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
764 status = buildStatusWithDispatcherOutput(executeRequest(request));
765 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
766 } catch (ParseException e) {
767 status = buildParsingErrorStatus(e);
769 LoggingUtils.logErrorMessage(
770 LoggingConstants.TargetNames.APPC_PROVIDER,
771 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
772 this.getClass().getName());
776 outputBuilder.setCommonHeader(input.getCommonHeader());
777 outputBuilder.setStatus(status);
778 RpcResult<HealthCheckOutput> result = RpcResultBuilder.<HealthCheckOutput> status(true).withResult(outputBuilder.build()).build();
779 return Futures.immediateFuture(result);
783 public Future<RpcResult<LiveUpgradeOutput>> liveUpgrade(LiveUpgradeInput input) {
784 logger.debug("Input received : " + input.toString());
785 LiveUpgradeOutputBuilder outputBuilder = new LiveUpgradeOutputBuilder();
786 String action = Action.LiveUpgrade.toString() ;
787 String rpcName = convertActionNameToUrl(action);
788 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
791 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
792 status = buildStatusWithDispatcherOutput(executeRequest(request));
793 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
794 } catch (ParseException e) {
795 status = buildParsingErrorStatus(e);
797 LoggingUtils.logErrorMessage(
798 LoggingConstants.TargetNames.APPC_PROVIDER,
799 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
800 this.getClass().getName());
804 outputBuilder.setCommonHeader(input.getCommonHeader());
805 outputBuilder.setStatus(status);
806 RpcResult<LiveUpgradeOutput> result = RpcResultBuilder.<LiveUpgradeOutput> status(true).withResult(outputBuilder.build()).build();
807 return Futures.immediateFuture(result);
812 public Future<RpcResult<LockOutput>> lock(LockInput input) {
813 logger.debug("Input received : " + input.toString());
814 LockOutputBuilder outputBuilder = new LockOutputBuilder();
815 String action = Action.Lock.toString() ;
816 String rpcName = Action.Lock.name().toLowerCase();
817 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
820 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
821 status = buildStatusWithDispatcherOutput(executeRequest(request));
822 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
823 } catch (ParseException e) {
824 status = buildParsingErrorStatus(e);
826 LoggingUtils.logErrorMessage(
827 LoggingConstants.TargetNames.APPC_PROVIDER,
828 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
829 this.getClass().getName());
833 outputBuilder.setCommonHeader(input.getCommonHeader());
834 outputBuilder.setStatus(status);
835 RpcResult<LockOutput> result = RpcResultBuilder.<LockOutput> status(true).withResult(outputBuilder.build()).build();
836 return Futures.immediateFuture(result);
841 public Future<RpcResult<UnlockOutput>> unlock(UnlockInput input) {
842 logger.debug("Input received : " + input.toString());
843 UnlockOutputBuilder outputBuilder = new UnlockOutputBuilder();
844 String action = Action.Unlock.toString() ;
845 String rpcName = Action.Unlock.name().toLowerCase();
846 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
849 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
850 status = buildStatusWithDispatcherOutput(executeRequest(request));
851 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
852 } catch (ParseException e) {
853 status = buildParsingErrorStatus(e);
855 LoggingUtils.logErrorMessage(
856 LoggingConstants.TargetNames.APPC_PROVIDER,
857 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
858 this.getClass().getName());
862 outputBuilder.setCommonHeader(input.getCommonHeader());
863 outputBuilder.setStatus(status);
864 RpcResult<UnlockOutput> result = RpcResultBuilder.<UnlockOutput> status(true).withResult(outputBuilder.build()).build();
865 return Futures.immediateFuture(result);
869 public Future<RpcResult<CheckLockOutput>> checkLock(CheckLockInput input) {
870 logger.debug("Input received : " + input.toString());
871 CheckLockOutputBuilder outputBuilder = new CheckLockOutputBuilder();
872 String action = Action.CheckLock.toString() ;
873 String rpcName = Action.CheckLock.name().toLowerCase();
874 RequestHandlerOutput requestHandlerOutput=null;
875 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
878 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
879 requestHandlerOutput=executeRequest(request);
881 status = buildStatusWithDispatcherOutput(requestHandlerOutput);
882 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
883 } catch (ParseException e) {
884 status = buildParsingErrorStatus(e);
886 LoggingUtils.logErrorMessage(
887 LoggingConstants.TargetNames.APPC_PROVIDER,
888 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
889 this.getClass().getName());
893 outputBuilder.setCommonHeader(input.getCommonHeader());
894 outputBuilder.setStatus(status);
895 if(requestHandlerOutput.getResponseContext().getStatus().getCode() == 400) {
896 outputBuilder.setLocked(CheckLockOutput.Locked.valueOf(requestHandlerOutput.getResponseContext().getAdditionalContext().get("locked").toUpperCase()));
898 RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput> status(true).withResult(outputBuilder.build()).build();
899 return Futures.immediateFuture(result);
903 public Future<RpcResult<ConfigBackupOutput>> configBackup(ConfigBackupInput input) {
904 logger.debug("Input received : " + input.toString());
905 ConfigBackupOutputBuilder outputBuilder = new ConfigBackupOutputBuilder();
906 String action = Action.ConfigBackup.toString() ;
907 String rpcName = Action.ConfigBackup.name().toLowerCase();
908 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
911 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
912 status = buildStatusWithDispatcherOutput(executeRequest(request));
913 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
914 } catch (ParseException e) {
915 status = buildParsingErrorStatus(e);
917 LoggingUtils.logErrorMessage(
918 LoggingConstants.TargetNames.APPC_PROVIDER,
919 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
920 this.getClass().getName());
924 outputBuilder.setCommonHeader(input.getCommonHeader());
925 outputBuilder.setStatus(status);
926 RpcResult<ConfigBackupOutput> result = RpcResultBuilder.<ConfigBackupOutput> status(true).withResult(outputBuilder.build()).build();
927 return Futures.immediateFuture(result);
932 public Future<RpcResult<ConfigBackupDeleteOutput>> configBackupDelete(ConfigBackupDeleteInput input) {
933 logger.debug("Input received : " + input.toString());
934 ConfigBackupDeleteOutputBuilder outputBuilder = new ConfigBackupDeleteOutputBuilder();
935 String action = Action.ConfigBackupDelete.toString() ;
936 String rpcName = Action.ConfigBackupDelete.name().toLowerCase();
937 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
940 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
941 status = buildStatusWithDispatcherOutput(executeRequest(request));
942 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
943 } catch (ParseException e) {
944 status = buildParsingErrorStatus(e);
946 LoggingUtils.logErrorMessage(
947 LoggingConstants.TargetNames.APPC_PROVIDER,
948 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
949 this.getClass().getName());
953 outputBuilder.setCommonHeader(input.getCommonHeader());
954 outputBuilder.setStatus(status);
955 RpcResult<ConfigBackupDeleteOutput> result = RpcResultBuilder.<ConfigBackupDeleteOutput> status(true).withResult(outputBuilder.build()).build();
956 return Futures.immediateFuture(result);
961 public Future<RpcResult<ConfigExportOutput>> configExport(ConfigExportInput input) {
962 logger.debug("Input received : " + input.toString());
963 ConfigExportOutputBuilder outputBuilder = new ConfigExportOutputBuilder();
964 String action = Action.ConfigExport.toString() ;
965 String rpcName = Action.ConfigExport.name().toLowerCase();
966 Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
969 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
970 status = buildStatusWithDispatcherOutput(executeRequest(request));
971 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
972 } catch (ParseException e) {
973 status = buildParsingErrorStatus(e);
975 LoggingUtils.logErrorMessage(
976 LoggingConstants.TargetNames.APPC_PROVIDER,
977 String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
978 this.getClass().getName());
982 outputBuilder.setCommonHeader(input.getCommonHeader());
983 outputBuilder.setStatus(status);
984 RpcResult<ConfigExportOutput> result = RpcResultBuilder.<ConfigExportOutput> status(true).withResult(outputBuilder.build()).build();
985 return Futures.immediateFuture(result);
988 private String convertActionNameToUrl(String action) {
989 String regex = "([a-z])([A-Z]+)";
990 String replacement = "$1-$2";
991 return action.replaceAll(regex, replacement)