diff options
Diffstat (limited to 'appc-provider')
38 files changed, 6463 insertions, 859 deletions
diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderClient.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderClient.java index d4d18d8b9..965961ca4 100644 --- a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderClient.java +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderClient.java @@ -24,9 +24,9 @@ package org.onap.appc.provider; -import org.onap.appc.util.StringHelper; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; +import org.onap.appc.util.StringHelper; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; import org.osgi.framework.BundleContext; @@ -34,37 +34,34 @@ import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.slf4j.MDC; -import static com.att.eelf.configuration.Configuration.*; - -import java.util.Properties; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Properties; import java.util.TimeZone; public class AppcProviderClient { - private static EELFLogger LOG = EELFManager.getInstance().getApplicationLogger(); - private static EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); + private final EELFLogger LOG = EELFManager.getInstance().getApplicationLogger(); + private final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); private SvcLogicService svcLogic = null; public AppcProviderClient() { BundleContext bctx = FrameworkUtil.getBundle(SvcLogicService.class).getBundleContext(); - //Handle BundleContext returning null + // Handle BundleContext returning null if (bctx == null){ - LOG.warn("Cannot find bundle context for " + SvcLogicService.NAME); - } - else{ - // Get SvcLogicService reference - ServiceReference sref = bctx.getServiceReference(SvcLogicService.NAME); - if (sref != null) { - svcLogic = (SvcLogicService) bctx.getService(sref); - - } else { - LOG.warn("Cannot find service reference for " + SvcLogicService.NAME); - - } + LOG.warn("Cannot find bundle context for " + SvcLogicService.NAME); + } else { + // Get SvcLogicService reference + ServiceReference sref = bctx.getServiceReference(SvcLogicService.NAME); + if (sref != null) { + svcLogic = (SvcLogicService) bctx.getService(sref); + + } else { + LOG.warn("Cannot find service reference for " + SvcLogicService.NAME); + + } } } @@ -83,29 +80,26 @@ public class AppcProviderClient { TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); df.setTimeZone(tz); - String startTimeStr = df.format(new Date()); long endTime = System.currentTimeMillis(); long duration = endTime - startTime; - String endTimeStr = String.valueOf(endTime); String durationStr = String.valueOf(duration); String endTimeStrUTC = df.format(new Date()); MDC.put("EndTimestamp", endTimeStrUTC); MDC.put("ElapsedTime", durationStr); MDC.put("TargetEntity", "sli"); MDC.put("TargetServiceName", "execute"); - MDC.put("ClassName", "org.onap.appc.provider.AppcProviderClient"); + MDC.put("ClassName", "org.onap.appc.provider.AppcProviderClient"); LOG.debug("Parameters passed to SLI: " + StringHelper.propertiesToString(parms)); metricsLogger.info("Parameters passed to SLI: " + StringHelper.propertiesToString(parms)); Properties respProps = svcLogic.execute(module, rpc, version, mode, parms); - + /* * Set End time for Metrics Logger */ endTime = System.currentTimeMillis(); duration = endTime - startTime; - endTimeStr = String.valueOf(endTime); durationStr = String.valueOf(duration); endTimeStrUTC = df.format(new Date()); MDC.put("EndTimestamp", endTimeStrUTC); diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderLcm.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderLcm.java index 66e8909bd..7d755cd81 100644 --- a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderLcm.java +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/AppcProviderLcm.java @@ -26,13 +26,19 @@ package org.onap.appc.provider; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; -import com.att.eelf.i18n.EELFResourceManager; import com.google.common.util.concurrent.Futures; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditOutputBuilder; @@ -60,6 +66,9 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigScaleoutOu import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateOutputBuilder; @@ -75,6 +84,18 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.LockOutputBuilde import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildOutputBuilder; @@ -90,9 +111,15 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SnapshotOutputBu import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SoftwareUploadInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SoftwareUploadOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SoftwareUploadOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopOutputBuilder; @@ -108,53 +135,59 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.TestOutputBuilde import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UnlockInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UnlockOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UnlockOutputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutput; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationInput; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutput; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder; -import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.onap.appc.Constants; import org.onap.appc.configuration.Configuration; import org.onap.appc.configuration.ConfigurationFactory; -import org.onap.appc.domainmodel.lcm.ActionLevel; -import org.onap.appc.domainmodel.lcm.ResponseContext; -import org.onap.appc.exceptions.APPCException; -import org.onap.appc.executor.objects.LCMCommandStatus; -import org.onap.appc.executor.objects.Params; import org.onap.appc.i18n.Msg; import org.onap.appc.logging.LoggingConstants; import org.onap.appc.logging.LoggingUtils; +import org.onap.appc.provider.lcm.service.AbstractBaseUtils; +import org.onap.appc.provider.lcm.service.ActionStatusService; +import org.onap.appc.provider.lcm.service.QueryService; +import org.onap.appc.provider.lcm.service.QuiesceTrafficService; +import org.onap.appc.provider.lcm.service.ResumeTrafficService; +import org.onap.appc.provider.lcm.service.UpgradeService; +import org.onap.appc.provider.lcm.service.RebootService; +import org.onap.appc.provider.lcm.service.RequestExecutor; +import org.onap.appc.provider.lcm.service.VolumeService; import org.onap.appc.provider.lcm.util.RequestInputBuilder; import org.onap.appc.provider.lcm.util.ValidationService; -import org.onap.appc.requesthandler.RequestHandler; import org.onap.appc.requesthandler.objects.RequestHandlerInput; import org.onap.appc.requesthandler.objects.RequestHandlerOutput; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; import java.text.ParseException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.Collection; -public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { + +public class AppcProviderLcm + extends AbstractBaseUtils + implements AutoCloseable, AppcProviderLcmService { private Configuration configuration = ConfigurationFactory.getConfiguration(); private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class); private final ExecutorService executor; - private final String COMMON_ERROR_MESSAGE_TEMPLATE = "Error processing %s input : %s"; - /** * The ODL data store broker. Provides access to a conceptual data tree store and also provides the ability to * subscribe for changes to data under a given branch of the tree. @@ -224,7 +257,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { /** * Rebuilds a specific VNF * - * @see AppcProviderLcmService#rebuild(RebuildInput) + * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#rebuild(RebuildInput) */ @Override public Future<RpcResult<RebuildOutput>> rebuild(RebuildInput input) { @@ -233,19 +266,14 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { RebuildOutputBuilder outputBuilder = new RebuildOutputBuilder(); String action = Action.Rebuild.toString() ; String rpcName = Action.Rebuild.name().toLowerCase(); - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -258,8 +286,10 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { outputBuilder.setStatus(status); RpcResult<RebuildOutput> result = RpcResultBuilder.<RebuildOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); + } + /** * Restarts a specific VNF * @@ -272,8 +302,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { RestartOutputBuilder outputBuilder = new RestartOutputBuilder(); String action = Action.Restart.toString() ; String rpcName = Action.Restart.name().toLowerCase(); - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { RequestHandlerInput request = new RequestInputBuilder().requestContext() @@ -285,10 +314,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { .build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -304,9 +332,50 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } /** + * Start Application + * + * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#startApplication(StartApplicationInput) + */ + @Override + public Future<RpcResult<StartApplicationOutput>> startApplication(StartApplicationInput input) { + logger.debug("Input received : " + input.toString()); + + StartApplicationOutputBuilder outputBuilder = new StartApplicationOutputBuilder(); + String action = Action.StartApplication.toString() ; + String rpcName = Action.StartApplication.name().toLowerCase(); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + if(null == status) { + try { + RequestHandlerInput request = new RequestInputBuilder().requestContext() + .commonHeader(input.getCommonHeader()) + .actionIdentifiers(input.getActionIdentifiers()) + .payload(input.getPayload()) + .action(action) + .rpcName(rpcName) + .build(); + + status = buildStatusWithDispatcherOutput(executeRequest(request)); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); + } catch (ParseException e) { + status = buildStatusWithParseException(e); + + LoggingUtils.logErrorMessage( + LoggingConstants.TargetNames.APPC_PROVIDER, + String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()), + this.getClass().getName()); + + } + } + outputBuilder.setCommonHeader(input.getCommonHeader()); + outputBuilder.setStatus(status); + RpcResult<StartApplicationOutput> result = RpcResultBuilder.<StartApplicationOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + /** * Migrates a specific VNF * - * @see AppcProviderLcmService#migrate(MigrateInput) + * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#migrate(MigrateInput) */ @Override public Future<RpcResult<MigrateOutput>> migrate(MigrateInput input) { @@ -315,19 +384,14 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { MigrateOutputBuilder outputBuilder = new MigrateOutputBuilder(); String action = Action.Migrate.toString() ; String rpcName = Action.Migrate.name().toLowerCase(); - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -342,10 +406,11 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { return Futures.immediateFuture(result); } + /** * Evacuates a specific VNF * - * @see AppcProviderLcmService#evacuate(EvacuateInput) + * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#evacuate(EvacuateInput) */ @Override public Future<RpcResult<EvacuateOutput>> evacuate(EvacuateInput input) { @@ -361,7 +426,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -380,7 +445,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { /** * Evacuates a specific VNF * - * @see AppcProviderLcmService#snapshot(SnapshotInput) + * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#snapshot(SnapshotInput) */ @Override public Future<RpcResult<SnapshotOutput>> snapshot(SnapshotInput input) { @@ -389,21 +454,15 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { SnapshotOutputBuilder outputBuilder = new SnapshotOutputBuilder(); String action = Action.Snapshot.toString() ; String rpcName = Action.Snapshot.name().toLowerCase(); - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); String identityUrl = input.getIdentityUrl(); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName) - .additionalContext("identity-url", identityUrl).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).additionalContext("identity-url", identityUrl).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -423,22 +482,16 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { RollbackOutputBuilder outputBuilder = new RollbackOutputBuilder(); String rpcName = Action.Rollback.toString() ; - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName); String identityUrl = input.getIdentityUrl(); String snapshotId = input.getSnapshotId(); if(null == status) { try { - 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(); + 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(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -459,19 +512,14 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { SyncOutputBuilder outputBuilder = new SyncOutputBuilder(); String action = Action.Sync.toString() ; String rpcName = Action.Sync.name().toLowerCase(); - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -486,92 +534,120 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { return Futures.immediateFuture(result); } - private Status buildParsingErrorStatus(ParseException e){ - LCMCommandStatus requestParsingFailure = LCMCommandStatus.REQUEST_PARSING_FAILED; - String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString(); - Params params = new Params().addParam("errorMsg", errorMessage); - return buildStatus(requestParsingFailure.getResponseCode(), requestParsingFailure.getFormattedMessage(params)); + @Override + public Future<RpcResult<QueryOutput>> query(QueryInput input) { + logger.debug(String.format("LCM query received input: %s", input.toString())); + QueryOutputBuilder outputBuilder = new QueryService().process(input); + RpcResult<QueryOutput> result = + RpcResultBuilder.<QueryOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); } - private Status buildStatus(Integer code,String message){ - StatusBuilder status = new StatusBuilder(); - status.setCode(code); - status.setMessage(message); - return status.build(); + @Override + public Future<RpcResult<RebootOutput>> reboot(RebootInput input) { + logger.debug(String.format("LCM reboot received input: %s", input.toString())); + RebootOutputBuilder outputBuilder = new RebootService().process(input); + RpcResult<RebootOutput> result = + RpcResultBuilder.<RebootOutput>status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); } - private Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){ - Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode(); - String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage(); - return buildStatus(statusCode, statusMessage); + @Override + public Future<RpcResult<AttachVolumeOutput>> attachVolume(AttachVolumeInput input) { + logger.debug(String.format("LCM attachVolume received input: %s", input.toString())); + AttachVolumeOutputBuilder outputBuilder = new VolumeService(true).attachVolume(input); + RpcResult<AttachVolumeOutput> result = + RpcResultBuilder.<AttachVolumeOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); } - private RequestHandlerOutput createErrorRequestHandlerObj(RequestHandlerInput request, - LCMCommandStatus cmdStatus, - Msg msg, - Exception e) { - final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); - final String reason = EELFResourceManager.format(msg, e, - appName, e.getClass().getSimpleName(), "", e.getMessage()); - - RequestHandlerOutput requestHandlerOutput = new RequestHandlerOutput(); - final ResponseContext responseContext = new ResponseContext(); - requestHandlerOutput.setResponseContext(responseContext); - responseContext.setCommonHeader(request.getRequestContext().getCommonHeader()); - - String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString(); - Params params = new Params().addParam("errorMsg", errorMessage); - responseContext.setStatus(cmdStatus.toStatus(params)); - - LoggingUtils.logErrorMessage( - LoggingConstants.TargetNames.APPC_PROVIDER, - reason, - this.getClass().getName()); - - return requestHandlerOutput; + @Override + public Future<RpcResult<DetachVolumeOutput>> detachVolume(DetachVolumeInput input) { + logger.debug(String.format("LCM detachVolume received input: %s", input.toString())); + DetachVolumeOutputBuilder outputBuilder = new VolumeService(false).detachVolume(input); + RpcResult<DetachVolumeOutput> result = + RpcResultBuilder.<DetachVolumeOutput>status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); } - private RequestHandler getRequestHandler(ActionLevel actionLevel){ - final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext(); - if (context != null) { - String filter = null; - try { - filter = "(level=" + actionLevel.name() + ")"; - Collection<ServiceReference<RequestHandler>> serviceReferences = context.getServiceReferences(RequestHandler.class, filter); - if (serviceReferences.size() != 1) { - logger.error("Cannot find service reference for " + RequestHandler.class.getName()); - throw new RuntimeException(); - } - ServiceReference<RequestHandler> serviceReference = serviceReferences.iterator().next(); - return context.getService(serviceReference); - } catch (InvalidSyntaxException e) { - logger.error("Cannot find service reference for " + RequestHandler.class.getName() + ": Invalid Syntax " + filter, e); - throw new RuntimeException(e); - } - } - return null; + @Override + public Future<RpcResult<QuiesceTrafficOutput>> quiesceTraffic(QuiesceTrafficInput input) { + logger.debug(String.format("LCM quiesce received input: %s", input.toString())); + QuiesceTrafficOutputBuilder outputBuilder = new QuiesceTrafficService().process(input); + RpcResult<QuiesceTrafficOutput> result = + RpcResultBuilder.<QuiesceTrafficOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); } @Override + public Future<RpcResult<ResumeTrafficOutput>> resumeTraffic(ResumeTrafficInput input) { + logger.debug(String.format("LCM resume received input: %s", input.toString())); + ResumeTrafficOutputBuilder outputBuilder = new ResumeTrafficService().process(input); + RpcResult<ResumeTrafficOutput> result = + RpcResultBuilder.<ResumeTrafficOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + @Override + public Future<RpcResult<UpgradePreCheckOutput>> upgradePreCheck(UpgradePreCheckInput input) { + logger.debug(String.format("LCM upgradeprecheck received input: %s", input.toString())); + UpgradePreCheckOutputBuilder outputBuilder = new UpgradeService("upgradePre").upgradePreCheck(input); + RpcResult<UpgradePreCheckOutput> result = + RpcResultBuilder.<UpgradePreCheckOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + @Override + public Future<RpcResult<UpgradeSoftwareOutput>> upgradeSoftware(UpgradeSoftwareInput input) { + logger.debug(String.format("LCM upgradesoftware received input: %s", input.toString())); + UpgradeSoftwareOutputBuilder outputBuilder = new UpgradeService("upgradeSoft").upgradeSoftware(input); + RpcResult<UpgradeSoftwareOutput> result = + RpcResultBuilder.<UpgradeSoftwareOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + @Override + public Future<RpcResult<UpgradePostCheckOutput>> upgradePostCheck(UpgradePostCheckInput input) { + logger.debug(String.format("LCM upgradepostcheck received input: %s", input.toString())); + UpgradePostCheckOutputBuilder outputBuilder = new UpgradeService("upgradePost").upgradePostCheck(input); + RpcResult<UpgradePostCheckOutput> result = + RpcResultBuilder.<UpgradePostCheckOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + @Override + public Future<RpcResult<UpgradeBackupOutput>> upgradeBackup(UpgradeBackupInput input) { + logger.debug(String.format("LCM backup received input: %s", input.toString())); + UpgradeBackupOutputBuilder outputBuilder = new UpgradeService("upgradeBackup").upgradeBackup(input); + RpcResult<UpgradeBackupOutput> result = + RpcResultBuilder.<UpgradeBackupOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + @Override + public Future<RpcResult<UpgradeBackoutOutput>> upgradeBackout(UpgradeBackoutInput input) { + logger.debug(String.format("LCM backout received input: %s", input.toString())); + UpgradeBackoutOutputBuilder outputBuilder = new UpgradeService("upgradeBackout").upgradeBackout(input); + RpcResult<UpgradeBackoutOutput> result = + RpcResultBuilder.<UpgradeBackoutOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + @Override public Future<RpcResult<TerminateOutput>> terminate(TerminateInput input) { logger.debug("Input received : " + input.toString()); TerminateOutputBuilder outputBuilder = new TerminateOutputBuilder(); - String action = Action.Terminate.toString() ; - String rpcName = Action.Terminate.name().toLowerCase(); - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Action myAction = Action.Terminate; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -583,8 +659,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } outputBuilder.setCommonHeader(input.getCommonHeader()); outputBuilder.setStatus(status); - RpcResult<TerminateOutput> result = - RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build(); + RpcResult<TerminateOutput> result = RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); } @@ -592,21 +667,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigureOutput>> configure(ConfigureInput input) { logger.debug("Input received : " + input.toString()); ConfigureOutputBuilder outputBuilder = new ConfigureOutputBuilder(); - String action = Action.Configure.toString() ; - String rpcName = "configure"; - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Action myAction = Action.Configure; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -617,8 +688,15 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } outputBuilder.setCommonHeader(input.getCommonHeader()); outputBuilder.setStatus(status); - RpcResult<ConfigureOutput> result = - RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build(); + RpcResult<ConfigureOutput> result = RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build(); + return Futures.immediateFuture(result); + } + + @Override + public Future<RpcResult<ActionStatusOutput>> actionStatus(ActionStatusInput input) { + logger.debug(String.format("Input received : %s", input.toString())); + ActionStatusOutputBuilder outputBuilder = (new ActionStatusService()).queryStatus(input); + RpcResult<ActionStatusOutput> result = RpcResultBuilder.<ActionStatusOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); } @@ -626,21 +704,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigModifyOutput>> configModify(ConfigModifyInput input) { logger.debug("Input received : " + input.toString()); ConfigModifyOutputBuilder outputBuilder = new ConfigModifyOutputBuilder(); - String action = Action.ConfigModify.toString() ; - String rpcName = "config-modify"; - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Action myAction = Action.ConfigModify; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -651,8 +725,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } outputBuilder.setCommonHeader(input.getCommonHeader()); outputBuilder.setStatus(status); - RpcResult<ConfigModifyOutput> result = - RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build(); + RpcResult<ConfigModifyOutput> result = RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); } @@ -660,21 +733,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigScaleoutOutput>> configScaleout(ConfigScaleoutInput input) { logger.debug("Input received : " + input.toString()); ConfigScaleoutOutputBuilder outputBuilder = new ConfigScaleoutOutputBuilder(); - String action = Action.ConfigScaleOut.toString() ; - String rpcName = "config-scaleout"; - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Action myAction = Action.ConfigScaleOut; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -685,8 +754,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } outputBuilder.setCommonHeader(input.getCommonHeader()); outputBuilder.setStatus(status); - RpcResult<ConfigScaleoutOutput> result = - RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build(); + RpcResult<ConfigScaleoutOutput> result = RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); } @@ -694,21 +762,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigRestoreOutput>> configRestore(ConfigRestoreInput input) { logger.debug("Input received : " + input.toString()); ConfigRestoreOutputBuilder outputBuilder = new ConfigRestoreOutputBuilder(); - String action = Action.ConfigRestore.toString() ; - String rpcName = "config-restore"; - Status status = - ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); + Action myAction = Action.ConfigRestore; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -719,8 +783,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } outputBuilder.setCommonHeader(input.getCommonHeader()); outputBuilder.setStatus(status); - RpcResult<ConfigRestoreOutput> result = - RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build(); + RpcResult<ConfigRestoreOutput> result = RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); } @@ -728,8 +791,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<TestOutput>> test(TestInput input) { logger.debug("Input received : " + input.toString()); TestOutputBuilder outputBuilder = new TestOutputBuilder(); - String action = Action.Test.toString() ; - String rpcName = Action.Test.name().toLowerCase(); + Action myAction = Action.Test; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -737,7 +801,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -757,8 +821,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<StopOutput>> stop(StopInput input) { logger.debug("Input received : " + input.toString()); StopOutputBuilder outputBuilder = new StopOutputBuilder(); - String action = Action.Stop.toString() ; - String rpcName = Action.Stop.name().toLowerCase(); + Action myAction = Action.Stop; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -766,7 +831,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -784,15 +849,16 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { /** * Starts a specific VNF * - * @see AppcProviderLcmService#start(StartInput) + * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#start(StartInput) */ @Override public Future<RpcResult<StartOutput>> start(StartInput input) { logger.debug("Input received : " + input.toString()); StartOutputBuilder outputBuilder = new StartOutputBuilder(); - String action = Action.Start.toString() ; - String rpcName = Action.Start.name().toLowerCase(); + Action myAction = Action.Start; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -805,7 +871,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -825,8 +891,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<AuditOutput>> audit(AuditInput input) { logger.debug("Input received : " + input.toString()); AuditOutputBuilder outputBuilder = new AuditOutputBuilder(); - String action = Action.Audit.toString(); - String rpcName = Action.Audit.name().toLowerCase(); + Action myAction = Action.Audit; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -834,7 +901,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -853,8 +920,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<SoftwareUploadOutput>> softwareUpload(SoftwareUploadInput input) { logger.debug("Input received : " + input.toString()); SoftwareUploadOutputBuilder outputBuilder = new SoftwareUploadOutputBuilder(); - String action = Action.SoftwareUpload.toString() ; - String rpcName = convertActionNameToUrl(action); + Action myAction = Action.SoftwareUpload; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -863,7 +931,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -882,8 +950,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<HealthCheckOutput>> healthCheck(HealthCheckInput input) { logger.debug("Input received : " + input.toString()); HealthCheckOutputBuilder outputBuilder = new HealthCheckOutputBuilder(); - String action = Action.HealthCheck.toString() ; - String rpcName = convertActionNameToUrl(action); + Action myAction = Action.HealthCheck; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -891,7 +960,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -910,8 +979,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<LiveUpgradeOutput>> liveUpgrade(LiveUpgradeInput input) { logger.debug("Input received : " + input.toString()); LiveUpgradeOutputBuilder outputBuilder = new LiveUpgradeOutputBuilder(); - String action = Action.LiveUpgrade.toString() ; - String rpcName = convertActionNameToUrl(action); + Action myAction = Action.LiveUpgrade; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -919,7 +989,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -939,8 +1009,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<LockOutput>> lock(LockInput input) { logger.debug("Input received : " + input.toString()); LockOutputBuilder outputBuilder = new LockOutputBuilder(); - String action = Action.Lock.toString() ; - String rpcName = Action.Lock.name().toLowerCase(); + Action myAction = Action.Lock; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -948,7 +1019,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -968,8 +1039,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<UnlockOutput>> unlock(UnlockInput input) { logger.debug("Input received : " + input.toString()); UnlockOutputBuilder outputBuilder = new UnlockOutputBuilder(); - String action = Action.Unlock.toString() ; - String rpcName = Action.Unlock.name().toLowerCase(); + Action myAction = Action.Unlock; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -977,7 +1049,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -996,23 +1068,24 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<CheckLockOutput>> checkLock(CheckLockInput input) { logger.debug("Input received : " + input.toString()); CheckLockOutputBuilder outputBuilder = new CheckLockOutputBuilder(); - String action = Action.CheckLock.toString(); - String rpcName = Action.CheckLock.name().toLowerCase(); + Action myAction = Action.CheckLock; + String action = myAction.toString(); + String rpcName = getRpcName(myAction); RequestHandlerOutput requestHandlerOutput = null; - Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), - input.getAction(), action); + Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), + action); if (null == status) { try { RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input - .getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action) - .rpcName(rpcName).build(); + .getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName + (rpcName).build(); requestHandlerOutput = executeRequest(request); status = buildStatusWithDispatcherOutput(requestHandlerOutput); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", - input.getActionIdentifiers(), status.getCode(), status.getMessage())); + logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input + .getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -1021,14 +1094,15 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { } } + outputBuilder.setCommonHeader(input.getCommonHeader()); outputBuilder.setStatus(status); if (requestHandlerOutput != null && requestHandlerOutput.getResponseContext().getStatus().getCode() == 400) { outputBuilder.setLocked(CheckLockOutput.Locked.valueOf(requestHandlerOutput.getResponseContext() .getAdditionalContext().get("locked").toUpperCase())); } - RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput>status(true) - .withResult(outputBuilder.build()).build(); + RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput>status(true).withResult(outputBuilder + .build()).build(); return Futures.immediateFuture(result); } @@ -1036,16 +1110,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigBackupOutput>> configBackup(ConfigBackupInput input) { logger.debug("Input received : " + input.toString()); ConfigBackupOutputBuilder outputBuilder = new ConfigBackupOutputBuilder(); - String action = Action.ConfigBackup.toString() ; - String rpcName = Action.ConfigBackup.name().toLowerCase(); + Action myAction = Action.ConfigBackup; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -1065,8 +1140,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigBackupDeleteOutput>> configBackupDelete(ConfigBackupDeleteInput input) { logger.debug("Input received : " + input.toString()); ConfigBackupDeleteOutputBuilder outputBuilder = new ConfigBackupDeleteOutputBuilder(); - String action = Action.ConfigBackupDelete.toString() ; - String rpcName = Action.ConfigBackupDelete.name().toLowerCase(); + Action myAction = Action.ConfigBackupDelete; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -1074,7 +1150,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -1094,8 +1170,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { public Future<RpcResult<ConfigExportOutput>> configExport(ConfigExportInput input) { logger.debug("Input received : " + input.toString()); ConfigExportOutputBuilder outputBuilder = new ConfigExportOutputBuilder(); - String action = Action.ConfigExport.toString() ; - String rpcName = Action.ConfigExport.name().toLowerCase(); + Action myAction = Action.ConfigExport; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { @@ -1103,7 +1180,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -1117,55 +1194,22 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { RpcResult<ConfigExportOutput> result = RpcResultBuilder.<ConfigExportOutput> status(true).withResult(outputBuilder.build()).build(); return Futures.immediateFuture(result); } - @Override - public Future<RpcResult<StartApplicationOutput>> startApplication(StartApplicationInput input) { - logger.debug("Input received : " + input.toString()); - StartApplicationOutputBuilder outputBuilder = new StartApplicationOutputBuilder(); - String action = Action.StartApplication.toString() ; - String rpcName = Action.StartApplication.name().toLowerCase(); - Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); - if(null == status) { - try { - RequestHandlerInput request = new RequestInputBuilder().requestContext() - .commonHeader(input.getCommonHeader()) - .actionIdentifiers(input.getActionIdentifiers()) - .payload(input.getPayload()) - .action(action) - .rpcName(rpcName) - .build(); - status = buildStatusWithDispatcherOutput(executeRequest(request)); - logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); - } catch (ParseException e) { - status = buildParsingErrorStatus(e); - - LoggingUtils.logErrorMessage( - LoggingConstants.TargetNames.APPC_PROVIDER, - String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()), - this.getClass().getName()); - - } - } - outputBuilder.setCommonHeader(input.getCommonHeader()); - outputBuilder.setStatus(status); - RpcResult<StartApplicationOutput> result = RpcResultBuilder.<StartApplicationOutput> status(true).withResult(outputBuilder.build()).build(); - return Futures.immediateFuture(result); - } - @Override public Future<RpcResult<StopApplicationOutput>> stopApplication(StopApplicationInput input){ logger.debug("Input received : " + input.toString()); StopApplicationOutputBuilder outputBuilder = new StopApplicationOutputBuilder(); - String action = Action.StopApplication.toString() ; - String rpcName = Action.StopApplication.name().toLowerCase(); + Action myAction = Action.StopApplication; + String action = myAction.toString() ; + String rpcName = getRpcName(myAction); Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action); if(null == status) { try { - RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build(); + RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build(); status = buildStatusWithDispatcherOutput(executeRequest(request)); logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage())); } catch (ParseException e) { - status = buildParsingErrorStatus(e); + status = buildStatusWithParseException(e); LoggingUtils.logErrorMessage( LoggingConstants.TargetNames.APPC_PROVIDER, @@ -1180,29 +1224,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService { return Futures.immediateFuture(result); } - private String convertActionNameToUrl(String action) { - String regex = "([a-z])([A-Z]+)"; - String replacement = "$1-$2"; - return action.replaceAll(regex, replacement) - .toLowerCase(); - } - RequestHandlerOutput executeRequest(RequestHandlerInput request){ - RequestHandler handler = getRequestHandler(request.getRequestContext().getActionLevel()); - RequestHandlerOutput requestHandlerOutput; - if (handler != null) { - try { - requestHandlerOutput = handler.handleRequest(request); - } catch (Exception e) { - logger.info("UNEXPECTED FAILURE while executing " + request.getRequestContext().getAction().name()); - requestHandlerOutput = createErrorRequestHandlerObj(request, - LCMCommandStatus.UNEXPECTED_ERROR, Msg.EXCEPTION_CALLING_DG, e); - } - } else { - String errorMsg = "LCM request cannot be processed at the moment because APPC isn't running"; - requestHandlerOutput = createErrorRequestHandlerObj(request, - LCMCommandStatus.REJECTED, Msg.REQUEST_HANDLER_UNAVAILABLE, new APPCException(errorMsg)); - } - return requestHandlerOutput; + return new RequestExecutor().executeRequest(request); } } diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/AbstractMockHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/AbstractMockHelper.java new file mode 100644 index 000000000..7c3f96022 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/AbstractMockHelper.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.provider.lcm.service.AbstractBaseUtils; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.util.Properties; + +/** + * Mock Helper abstract class + * provide common methods for all mock services + */ +public class AbstractMockHelper extends AbstractBaseUtils { + protected RequestHandlerOutput requestHandlerOutput = new RequestHandlerOutput(); + protected Properties properties = new Properties(); + protected Status status; + + public AbstractMockHelper() { + requestHandlerOutput.setResponseContext(new ResponseContext()); + } + + /** + * Get request handling status + * @return Status of this class + */ + public Status getStatus() { + return status; + } + + /** + * Set output Status to RequestHandlerOutput and return requestHandlerOutput. + * @return RequestHandlerOutput + */ + protected RequestHandlerOutput setOutputStatus() { + org.onap.appc.domainmodel.lcm.Status outputStatus = new org.onap.appc.domainmodel.lcm.Status(); + outputStatus.setCode(status.getCode()); + outputStatus.setMessage(status.getMessage()); + requestHandlerOutput.getResponseContext().setStatus(outputStatus); + return requestHandlerOutput; + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockQuiesceHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockQuiesceHelper.java new file mode 100644 index 000000000..205249b13 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockQuiesceHelper.java @@ -0,0 +1,103 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import org.onap.appc.util.JsonUtil; +import java.io.IOException; + +import java.util.Map; + + +/** + * This class is here because LCM quiesce backend is not implemented. + * Hence this class is here to mock the handling response of LCM quiesce REST API. + * + * When backend is implemented, this file should be removed. + */ +public class MockQuiesceHelper extends AbstractMockHelper { + private final String MOCK_QUIESCE_DIR = "/tmp/lcm/quiescetraffic"; + private final String PAUSE = "pause"; + + public RequestHandlerOutput quiesceTraffic(RequestHandlerInput input) { + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The quiesce-traffic command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + String vnfPath = String.format("%s/%s", MOCK_QUIESCE_DIR, vnfId); + if (!isDirectoryExist(vnfPath)) { + status = buildStatusForVnfId(LCMCommandStatus.VNF_NOT_FOUND, vnfId); + return setOutputStatus(); + } + + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String pausePath = String.format("%s/%s", vnfPath, PAUSE); + if (isDirectoryExist(pausePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("VNF %s is already quiesced", vnfId)); + return setOutputStatus(); + } + + File pauseDir = new File(pausePath); + boolean success = pauseDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.ACCEPTED) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to quiesce traffic VNF %s", vnfId)); + + return setOutputStatus(); + } + + private boolean mockConditionExists() { + return isDirectoryExist(MOCK_QUIESCE_DIR); + } + + private boolean isDirectoryExist(String path) { + return Files.isDirectory(Paths.get(path)); + } + + private Map<String, String> getJsonMap(String jsonString) { + try { + return JsonUtil.convertJsonStringToFlatMap(jsonString); + } catch (IOException e) { + logger.error(String.format("MockQuiesceHelper got exception when convert json map for (%s)", jsonString), e); + } + return null; + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockRebootHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockRebootHelper.java new file mode 100644 index 000000000..1f2fb593c --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockRebootHelper.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * This class is here because LCM reboot backend is not implemented. + * Hence this class is here to mock the handling response of LCM reboot REST API. + * <p> + * When backend is implemented, this file should be removed. + */ +public class MockRebootHelper extends AbstractMockHelper { + private final String MOCK_REBOOT_FILENAME = "/tmp/lcm/reboot"; + + /** + * Process service request through reading the mockFile. + * If the file doesn't exist, it will return "The reboot command is not supported" + * Otherwise, it will build an accepted result. + * + * @param requestHandlerInput of the input + * @return RequestHandlerOutput + */ + public RequestHandlerOutput reboot(RequestHandlerInput requestHandlerInput) { + File file = new File(MOCK_REBOOT_FILENAME); + if (!file.exists()) { + // when mock file does not exist, return generic service not supported + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, "The reboot command is not supported"); + } else { + try { + properties.load(new FileInputStream(MOCK_REBOOT_FILENAME)); + status = buildStatusWithoutParams(LCMCommandStatus.ACCEPTED); + } catch (IOException e) { + // when loading propertes from mock file failed, return with associated message + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("cannot load properties from %s", MOCK_REBOOT_FILENAME)); + } + } + + return setOutputStatus(); + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockRequestExecutor.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockRequestExecutor.java new file mode 100644 index 000000000..9763e098d --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockRequestExecutor.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.onap.appc.domainmodel.lcm.VNFOperation; +import org.onap.appc.provider.lcm.mock.query.MockQueryHelper; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +/** + * Mock Request executor which mocks backend implementation + * for the set of LCM commands which do not have backend support. + */ +public class MockRequestExecutor { + + private final EELFLogger logger = EELFManager.getInstance().getLogger(MockRequestExecutor.class); + + /** + * Execute the request. + * @param request of the RequestHandlerInput + * @return RequestHandlerOutput if mock is supported, otherwise return null. + */ + public RequestHandlerOutput executeRequest(RequestHandlerInput requestHandlerInput) { + VNFOperation vnfOperation = requestHandlerInput.getRequestContext().getAction(); + switch (vnfOperation) { + case Query: + logger.debug("Proceed with mock helper for query VNF"); + return new MockQueryHelper().query(requestHandlerInput); + case Reboot: + logger.debug("Proceed with mock helper for reboot VM"); + return new MockRebootHelper().reboot(requestHandlerInput); + default: + // do nothing + } + return null; + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockResumeHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockResumeHelper.java new file mode 100644 index 000000000..49364fb3d --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockResumeHelper.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; + +/** + * This class is here because LCM resume backend is not implemented. + * Hence this class is here to mock the handling response of LCM resume REST API. + * + * When backend is implemented, this file should be removed. + */ +public class MockResumeHelper extends AbstractMockHelper { + private final String MOCK_RESUME_DIR = "/tmp/lcm/resumetraffic"; + private final String RESUME = "resume"; + + public RequestHandlerOutput resumeTraffic(RequestHandlerInput input) { + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The resume-traffic command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + String vnfPath = String.format("%s/%s", MOCK_RESUME_DIR, vnfId); + if (!isDirectoryExist(vnfPath)) { + status = buildStatusForVnfId(LCMCommandStatus.VNF_NOT_FOUND, vnfId); + return setOutputStatus(); + } + + String resumePath = String.format("%s/%s", vnfPath, RESUME); + if (isDirectoryExist(resumePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("VNF %s is already resumed", vnfId)); + return setOutputStatus(); + } + + File resumeDir = new File(resumePath); + boolean success = resumeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.ACCEPTED) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to resume traffic VNF %s", vnfId)); + + return setOutputStatus(); + } + + private boolean mockConditionExists() { + return isDirectoryExist(MOCK_RESUME_DIR); + } + + private boolean isDirectoryExist(String path) { + return Files.isDirectory(Paths.get(path)); + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockUpgradeHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockUpgradeHelper.java new file mode 100644 index 000000000..c04de54bc --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockUpgradeHelper.java @@ -0,0 +1,229 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.onap.appc.util.JsonUtil; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; + +/** + * This class is here because LCM upgrade actions are not implemented. + * Hence this class is here to mock the handling response of LCM upgrade actions REST API. + * + * When backend is implemented, this file should be removed. + */ +public class MockUpgradeHelper extends AbstractMockHelper { + private final String MOCK_UPGRADE_DIR = "/tmp/lcm/upgrade"; + private final String UPGRADE = "upgrade"; + + public RequestHandlerOutput upgradePreCheck(RequestHandlerInput input) { + + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The upgrade-pre-check command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String upgradePath = String.format(MOCK_UPGRADE_DIR+"/%s-%s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version")); + + if (isDirectoryExist(upgradePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("UpgradeCheck from %s to %s is already happened to VNF %s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version"), vnfId)); + return setOutputStatus(); + } + + File upgradeDir = new File(upgradePath); + boolean success = upgradeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to upgradePreCheck for VNF %s", vnfId)); + + return setOutputStatus(); + } + + public RequestHandlerOutput upgradePostCheck(RequestHandlerInput input) { + + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The upgrade-post-check command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String upgradePath = String.format(MOCK_UPGRADE_DIR+"/%s/%s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version")); + + if (isDirectoryExist(upgradePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("UpgradePostcheck from %s to %s is already happened to VNF %s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version"), vnfId)); + return setOutputStatus(); + } + + File upgradeDir = new File(upgradePath); + boolean success = upgradeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to upgradePostCheck for %s ", vnfId)); + + return setOutputStatus(); + } + + public RequestHandlerOutput upgradeSoftware(RequestHandlerInput input) { + + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The upgrade-software command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String upgradePath = String.format(MOCK_UPGRADE_DIR+"/%s/%s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version")); + + if (isDirectoryExist(upgradePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("UpgradeSoftware from %s to %s is already happened to VNF %s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version"), vnfId)); + return setOutputStatus(); + } + + File upgradeDir = new File(upgradePath); + boolean success = upgradeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to upgradeSoftware for VNF %s", vnfId)); + + return setOutputStatus(); + } + + public RequestHandlerOutput upgradeBackup(RequestHandlerInput input) { + + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The upgrade-backup command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String upgradePath = String.format(MOCK_UPGRADE_DIR+"/%s/%s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version")); + + if (isDirectoryExist(upgradePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("UpgradeBackup from %s to %s is already happened to VNF %s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version"), vnfId)); + return setOutputStatus(); + } + + File upgradeDir = new File(upgradePath); + boolean success = upgradeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to upgradeBackup for VNF %s", vnfId)); + + return setOutputStatus(); + } + + public RequestHandlerOutput upgradeBackout(RequestHandlerInput input) { + + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The upgrade-backout command is not supported"); + return setOutputStatus(); + } + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String upgradePath = String.format(MOCK_UPGRADE_DIR+"/%s/%s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version")); + + if (isDirectoryExist(upgradePath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("UpgradeBackout from %s to %s is already happened to VNF %s", jsonMap.get("existing-software-version"),jsonMap.get("new-software-version"), vnfId)); + return setOutputStatus(); + } + + File upgradeDir = new File(upgradePath); + boolean success = upgradeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to upgradebackout for VNF %s", vnfId)); + + return setOutputStatus(); + } + + private boolean mockConditionExists() { + return isDirectoryExist(MOCK_UPGRADE_DIR); + } + + private boolean isDirectoryExist(String path) { + return Files.isDirectory(Paths.get(path)); + } + + private Map<String, String> getJsonMap(String jsonString) { + try { + return JsonUtil.convertJsonStringToFlatMap(jsonString); + } catch (IOException e) { + logger.error(String.format("MockUpgradeHelper got exception when convert json map for (%s)", jsonString), e); + } + return null; + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockVolumeHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockVolumeHelper.java new file mode 100644 index 000000000..562d376b0 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/MockVolumeHelper.java @@ -0,0 +1,140 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock; + +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.onap.appc.util.JsonUtil; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; + +/** + * This class is here because LCM attachVolume and detachVolume backends are not implemented. + * Hence this class is here to mock the handling response of LCM attachVolume and detachVolume REST API. + * + * When backend is implemented, this file should be removed. + */ +public class MockVolumeHelper extends AbstractMockHelper { + private final String MOCK_VOLUME_DIR = "/tmp/lcm/volume"; + private final String VOLUME_ID_KEY = "volumeAttachment.volumeId"; + + public RequestHandlerOutput attachVolume(RequestHandlerInput input) { + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The attach-volume command is not supported"); + return setOutputStatus(); + } + + String vserverId = input.getRequestContext().getActionIdentifiers().getVserverId(); + String vserverPath = String.format("%s/%s", MOCK_VOLUME_DIR, vserverId); + if (!isDirectoryExist(vserverPath)) { + status = buildStatusForId(LCMCommandStatus.VSERVER_NOT_FOUND, vserverId); + return setOutputStatus(); + } + + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String volumeId = jsonMap.get(VOLUME_ID_KEY); + String volumeIdPath = String.format("%s/%s", vserverPath, volumeId); + if (isDirectoryExist(volumeIdPath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Volume %s is already attached to VM %s", volumeId, vserverId)); + return setOutputStatus(); + } + + File volumeDir = new File(volumeIdPath); + boolean success = volumeDir.mkdir(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to attach volume %s to VM %s", volumeId, vserverId)); + + return setOutputStatus(); + } + + public RequestHandlerOutput detachVolume(RequestHandlerInput input) { + if (!mockConditionExists()) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + "The detach-volume command is not supported"); + return setOutputStatus(); + } + + String vserverId = input.getRequestContext().getActionIdentifiers().getVserverId(); + String vserverPath = String.format("%s/%s", MOCK_VOLUME_DIR, vserverId); + if (!isDirectoryExist(vserverPath)) { + status = buildStatusForId(LCMCommandStatus.VSERVER_NOT_FOUND, vserverId); + return setOutputStatus(); + } + + Map<String, String> jsonMap = getJsonMap(input.getRequestContext().getPayload()); + if (jsonMap == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, "payload reading failed"); + return setOutputStatus(); + } + + String volumeId = jsonMap.get(VOLUME_ID_KEY); + String volumeIdPath = String.format("%s/%s", vserverPath, volumeId); + if (!isDirectoryExist(volumeIdPath)) { + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Volume %s is not attached to VM %s", volumeId, vserverId)); + return setOutputStatus(); + } + + File volumeDir = new File(volumeIdPath); + boolean success = volumeDir.delete(); + status = success ? + buildStatusWithoutParams(LCMCommandStatus.SUCCESS) : + buildStatusForErrorMsg(LCMCommandStatus.REJECTED, + String.format("Failed to attach volume %s to VM %s", volumeId, vserverId)); + + return setOutputStatus(); + } + + private boolean mockConditionExists() { + return isDirectoryExist(MOCK_VOLUME_DIR); + } + + private boolean isDirectoryExist(String path) { + return Files.isDirectory(Paths.get(path)); + } + + private Map<String, String> getJsonMap(String jsonString) { + try { + return JsonUtil.convertJsonStringToFlatMap(jsonString); + } catch (IOException e) { + logger.error(String.format("MockVolumeHelper got exception when convert json map for (%s)", jsonString), e); + } + return null; + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/query/MockQueryHelper.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/query/MockQueryHelper.java new file mode 100644 index 000000000..7e6f84e03 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/query/MockQueryHelper.java @@ -0,0 +1,165 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.mock.query; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.VmState; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.VmStatus; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.query.output.QueryResults; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.query.output.QueryResultsBuilder; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.provider.lcm.mock.AbstractMockHelper; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This class is here because LCM query backend is not implemented. + * Hence this class is here to mock the handling response of LCM query REST API. + * + * When backend is implemented, this file should be removed. + */ +public class MockQueryHelper extends AbstractMockHelper { + private final String MOCK_QUERY_FILENAME = "/tmp/lcm/query"; + + /** VF_STATE value are listed at https://wiki.openstack.org/wiki/VMState#vm_state */ + private final Map<VmState, List<String>> VF_STATE_MAP = new HashMap<VmState, List<String>>() { + { + put(VmState.Inactive, Arrays.asList( + "INITIALIZED", + "PAUSED", + "SUSPENDED", + "STOPPED", + "SOFT_DELETED", + "HARD_DELETED", + "ERROR")); + put(VmState.Active, Arrays.asList( + "ACTIVE", + "RESCUED", + "RESIZED")); + put(VmState.Standby, Arrays.asList( + "STANDBY" + )); + } + }; + + private final EELFLogger logger = EELFManager.getInstance().getLogger(MockQueryHelper.class); + + /** + * Process service request through reading the mockFile. File should contain: + * - VNF_IDS: the list of VNF IDs, separated by comma + * - VMS_<a VNF id>: the list of VMs of the VNF ID, separated by comma + * - STATE_<a VM id>: the state of the VM + * - STATUS_<a VM id>: the status of the VMl + * @param input of RequestHandleInput which contains the VNF ID + * @return RequestHandlerOutput + */ + public RequestHandlerOutput query(RequestHandlerInput input) { + File file = new File(MOCK_QUERY_FILENAME); + if (!file.exists()) { + // when mock file does not exist, return generic service not supported + status = buildStatusForErrorMsg(LCMCommandStatus.REJECTED, "The query command is not supported"); + return setOutputStatus(); + } + + logger.debug(String.format("MockQueryHelper loading property from file %s", MOCK_QUERY_FILENAME)); + try { + properties.load(new FileInputStream(MOCK_QUERY_FILENAME)); + } catch (IOException e) { + // when loading propertes from mock file failed, return with associated message + status = buildStatusForErrorMsg( + LCMCommandStatus.REJECTED, "cannot load properties from " + MOCK_QUERY_FILENAME); + return setOutputStatus(); + } + + String key = "VNF_IDS"; + List<String> vnfIds = + Arrays.asList(properties.getProperty(key, "").split(DELIMITER_COMMA)); + logger.debug(String.format("MockQueryHelper got vnfId %s", vnfIds.toString())); + + String vnfId = input.getRequestContext().getActionIdentifiers().getVnfId(); + if (!vnfIds.contains(vnfId)) { + status = buildStatusForVnfId(LCMCommandStatus.VNF_NOT_FOUND, vnfId); + return setOutputStatus(); + } + + key = "VMS_" + vnfId; + List<String> vmIds = + Arrays.asList(properties.getProperty(key, "").split(DELIMITER_COMMA)); + logger.debug(String.format("MockQueryHelper got vmId %s", vmIds.toString())); + + List<QueryResults> queryResultList = new ArrayList<>(); + VmState vfState; + VmStatus vfStatus; + boolean found = false; + for (String vmId : vmIds) { + // state + vfState = VmState.Unknown; + key = "STATE_" + vmId; + String stateProp = properties.getProperty(key, "").toUpperCase(); + for (Map.Entry<VmState, List<String>> aEntry: VF_STATE_MAP.entrySet()) { + if (aEntry.getValue().contains(stateProp)) { + vfState = aEntry.getKey(); + break; + } + } + + // status + vfStatus = VmStatus.Unknown; + key = "STATUS_" + vmId; + String statusProp = properties.getProperty(key, "unknown").toLowerCase(); + for (VmStatus otherVfStatus : VmStatus.values()) { + if (statusProp.equalsIgnoreCase(otherVfStatus.name())) { + vfStatus = otherVfStatus; + } + } + + QueryResultsBuilder queryResultBuilder = new QueryResultsBuilder(); + queryResultBuilder.setVserverId(vmId); + queryResultBuilder.setVmState(vfState); + queryResultBuilder.setVmStatus(vfStatus); + queryResultList.add(queryResultBuilder.build()); + found = true; + } + + if (found) { + status = buildStatusWithoutParams(LCMCommandStatus.SUCCESS); + requestHandlerOutput.getResponseContext().setPayloadObject(queryResultList); + } else { + status = buildStatusForErrorMsg(LCMCommandStatus.VNF_NOT_FOUND, "no detailss for vnfId"); + } + + return setOutputStatus(); + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/query/query b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/query/query new file mode 100644 index 000000000..671e77cd0 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/mock/query/query @@ -0,0 +1,47 @@ +################################################################################################## +# +# Mock data file for LCM command Query +# +# To use me when the backend implementation is not available, +# copy me to /tmp/lcm directory on the APPC server +# +# Mock data structure: +# VNF_IDS: stores all the mocked vnfIds, separated by comma. +# for per vnfId: +# VMS_<vnfId>: stores all the mocked vmIds of the specific vnfId, spearated by comma. +# for each vmId: +# STATE_<vmId>: stores VM state of the specific vmId. +# VM state found at https://wiki.openstack.org/wiki/VMState#vm_state +# STATUS_<vmId>: stores VM sattus of the specific vmId. +# +################################################################################################## +VNF_IDS=vSCP,vSBG + +VMS_vSCP=smp001,smp002,fex001,fex002,bex001,bex002,bex003,bex004,bex005,nee001 +STATE_smp001=ACTIVE +STATE_smp002=RESCUED +STATE_fex001=PAUSED +STATE_fex002=SUSPENDED +STATE_bex001=STOPPED +STATE_bex002=HARD_DELETED +STATE_bex003=RESIZED +STATE_bex004=ERROR +STATE_bex005=SOFT_DELETED +# left out for UNKNOWN value +#STATE_nee001 + +STATUS_smp001=healthy +STATUS_smp002=unhealthy +STATUS_fex001=healthy +STATUS_fex002=healthy +STATUS_bex001=unhealthy +STATUS_bex002=unhealthy +STATUS_bex003=unhealthy +STATUS_bex004=unhealthy +STATUS_bex005=unhealthy +# left out for UNKNOWN value +#STATUS_nee001 + +VMS_vSBG=vm001 +STATE_vm001=STANDBY +STATUS_vm001=healthy
\ No newline at end of file diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/AbstractBaseService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/AbstractBaseService.java new file mode 100644 index 000000000..ccf244532 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/AbstractBaseService.java @@ -0,0 +1,280 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.apache.commons.lang.StringUtils; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.logging.LoggingConstants; +import org.onap.appc.logging.LoggingUtils; +import org.onap.appc.provider.lcm.util.RequestInputBuilder; +import org.onap.appc.provider.lcm.util.ValidationService; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.text.ParseException; +import java.util.EnumSet; + +public abstract class AbstractBaseService extends AbstractBaseUtils { + /** + * The list of ActionIdentifier keys.<br> + * The extra space in the front of the keyName is for better REST API response output. + */ + enum ACTID_KEYS { + SERVICE_INSTANCE_ID(" service-instance-id"), + VF_MODULE_ID(" vf-module-id"), + VNF_ID(" vnf-id"), + VNFC_NAME(" vnfc-name"), + VSERVER_ID(" vserver-id"); + + String keyName; + + ACTID_KEYS(String keyName) { + this.keyName = keyName; + } + + String getKeyName() { + return keyName; + } + } + + String rpcName; + Action expectedAction; + + Status status; + + protected AbstractBaseService(){}; + /** + * Constructor + * + * @param theAction of the expected Action for this service + */ + protected AbstractBaseService(Action theAction) { + expectedAction = theAction; + rpcName = getRpcName(theAction); + } + + + /** + * Validate Input: <br> + * - using ValidationService to do common validation <br> + * - validate Action matches the expected Action <br> + * - validate existence of ActionIdentifier <br> + * + * @param commonHeader of the input + * @param action of the input + * @param actionIdentifiers of the input + * @return null if validation passed, otherwise, return Status with validation failure details. + */ + Status validateInput(CommonHeader commonHeader, Action action, ActionIdentifiers actionIdentifiers) { + // common validation + Status validatedStatus = ValidationService.getInstance().validateInput(commonHeader, action, rpcName); + if (validatedStatus != null) { + return validatedStatus; + } + + // action validation + if (action != expectedAction) { + validatedStatus = buildStatusForErrorMsg(LCMCommandStatus.INVALID_INPUT_PARAMETER, "action"); + return validatedStatus; + } + + // action identifier + if (actionIdentifiers == null) { + validatedStatus = buildStatusForParamName( + LCMCommandStatus.MISSING_MANDATORY_PARAMETER, "action-identifiers"); + } + + return validatedStatus; + } + + /** + * Validate input as well as VNF ID in actionIdentifier + * + * @param commonHeader of the input + * @param action of the input + * @param actionIdentifiers of the input + * @return null if validation passed, otherwise, return Status with validation failure details. + */ + Status validateVnfId(CommonHeader commonHeader, Action action, ActionIdentifiers actionIdentifiers) { + Status validatedStatus = validateInput(commonHeader, action, actionIdentifiers); + if (validatedStatus != null) { + return validatedStatus; + } + + validatedStatus = validateMustHaveParamValue(actionIdentifiers.getVnfId(), "vnf-id"); + if (validatedStatus == null) { + validatedStatus = validateExcludedActIds(actionIdentifiers, EnumSet.of(ACTID_KEYS.VNF_ID)); + } + + return validatedStatus; + } + + /** + * Validate input as well as VSERVER ID in actionIdentifier + * + * @param commonHeader of the input + * @param action of the input + * @param actionIdentifiers of the input + * @return null if validation passed, otherwise, return Status with validation failure details. + */ + Status validateVserverId(CommonHeader commonHeader, Action action, ActionIdentifiers actionIdentifiers) { + Status validatedStatus = validateInput(commonHeader, action, actionIdentifiers); + if (validatedStatus != null) { + return validatedStatus; + } + + validatedStatus = validateMustHaveParamValue(actionIdentifiers.getVserverId(), "vserver-id"); + if (validatedStatus == null) { + validatedStatus = validateExcludedActIds(actionIdentifiers, EnumSet.of(ACTID_KEYS.VSERVER_ID)); + } + + return validatedStatus; + } + + /** + * Validate a value of the must have parameter + * @param value the value of the parameter + * @param keyName the key name of the parameter + * @return null if validation passed, otherwise, return Status with validation failure details. + */ + Status validateMustHaveParamValue(String value, String keyName) { + Status validatedStatus = null; + if (StringUtils.isEmpty(value)) { + if (value == null) { + validatedStatus = buildStatusForParamName(LCMCommandStatus.MISSING_MANDATORY_PARAMETER, keyName); + } else { + validatedStatus = buildStatusForErrorMsg(LCMCommandStatus.INVALID_INPUT_PARAMETER, keyName); + } + } + return validatedStatus; + } + + /** + * Validate the excluded Action Identifier to ensure they do not exist. + * Set Status if any error occurs. + * + * @param actionIdentifiers of the to be validated object + * @param exclusionKeys of a list of ACTID_KEYS should be ignored in this validation + * @return null if validation passed, otherwise, return Status with validation failure details. + */ + Status validateExcludedActIds(ActionIdentifiers actionIdentifiers, EnumSet<ACTID_KEYS> exclusionKeys) { + StringBuilder names = new StringBuilder(); + boolean append = false; + for (ACTID_KEYS key : ACTID_KEYS.values()) { + if (exclusionKeys.contains(key)) { + continue; + } + + switch (key) { + case SERVICE_INSTANCE_ID: + append = actionIdentifiers.getServiceInstanceId() != null; + break; + case VF_MODULE_ID: + append = actionIdentifiers.getVfModuleId() != null; + break; + case VSERVER_ID: + append = actionIdentifiers.getVserverId() != null; + break; + case VNFC_NAME: + append = actionIdentifiers.getVnfcName() != null; + break; + case VNF_ID: + append = actionIdentifiers.getVnfId() != null; + break; + default: + append = false; + } + + if (append) { + names.append(key.getKeyName()).append(DELIMITER_COMMA); + } + } + + Status validatedStatus = null; + int namesLength = names.length(); + if (namesLength != 0) { + names.setLength(namesLength - 1); + validatedStatus = buildStatusForErrorMsg(LCMCommandStatus.INVALID_INPUT_PARAMETER, names.toString()); + } + + return validatedStatus; + } + + /** + * Get RequestHandlerInput + * @param commonHeader of the input + * @param actionIdentifiers of the input + * @param payload of the input + * @param callerClassName String of this.getClass().getName() of the call class + * @return the newly built RequestHandlerInput if no error occured, otherwise, return null. + */ + RequestHandlerInput getRequestHandlerInput(CommonHeader commonHeader, + ActionIdentifiers actionIdentifiers, + Payload payload, + String callerClassName) { + + try { + RequestInputBuilder requestInputBuilder = new RequestInputBuilder().requestContext() + .commonHeader(commonHeader) + .actionIdentifiers(actionIdentifiers) + .action(expectedAction.name()) + .rpcName(rpcName); + if (payload != null) { + requestInputBuilder = requestInputBuilder.payload(payload); + } + return requestInputBuilder.build(); + } catch (ParseException e) { + status = buildStatusWithParseException(e); + + LoggingUtils.logErrorMessage( + LoggingConstants.TargetNames.APPC_PROVIDER, + String.format(COMMON_ERROR_MESSAGE_TEMPLATE, expectedAction, e.getMessage()), + callerClassName); + } + return null; + } + + /** + * Execute the action through RequestExecutor + * @param requestHandlerInput contains everything about the action + */ + RequestHandlerOutput executeAction(RequestHandlerInput requestHandlerInput) { + RequestHandlerOutput requestHandlerOutput = null; + if (requestHandlerInput == null) { + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, + "executeAction with null RequestHandlerInput"); + } else { + RequestExecutor requestExecutor = new RequestExecutor(); + requestHandlerOutput = requestExecutor.executeRequest(requestHandlerInput); + status = buildStatusWithDispatcherOutput(requestHandlerOutput); + } + return requestHandlerOutput; + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/AbstractBaseUtils.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/AbstractBaseUtils.java new file mode 100644 index 000000000..d41c80805 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/AbstractBaseUtils.java @@ -0,0 +1,157 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.executor.objects.Params; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.text.ParseException; + +public class AbstractBaseUtils { + protected final String COMMON_ERROR_MESSAGE_TEMPLATE = "Error processing %s input : %s"; + protected final String DELIMITER_COMMA = ","; + + protected final EELFLogger logger = EELFManager.getInstance().getLogger(AbstractBaseService.class); + + /** + * Build a Status without parameter + * + * @param lcmCommandStatus for the Status code and message format + * @return the newly built Status + */ + protected Status buildStatusWithoutParams(LCMCommandStatus lcmCommandStatus) { + return buildStatus(lcmCommandStatus, null, null); + } + + /** + * Build a Status with "errorMsg" param key. + * + * @param lcmCommandStatus for the Status code and message format + * @param message String for the Status message variable + * @return the newly built Status + */ + protected Status buildStatusForErrorMsg(LCMCommandStatus lcmCommandStatus, String message) { + return buildStatus(lcmCommandStatus, message, "errorMsg"); + } + + /** + * Build a Status with "vnfId" param key. + * + * @param lcmCommandStatus for the Status code and message format + * @param message String for the Status message variable + * @return the newly build Status + */ + protected Status buildStatusForVnfId(LCMCommandStatus lcmCommandStatus, String message) { + return buildStatus(lcmCommandStatus, message, "vnfId"); + } + + /** + * Build a Status with "paramName" param key. + * + * @param lcmCommandStatus for the Status code and message format + * @param message String for the Status message variable + * @return the newly built Status + */ + protected Status buildStatusForParamName(LCMCommandStatus lcmCommandStatus, String message) { + return buildStatus(lcmCommandStatus, message, "paramName"); + } + + /** + * Build a Status with "id" param key. + * + * @param lcmCommandStatus for the Status code and message format + * @param message String for the Status message variable + * @return the newly build Status + */ + protected Status buildStatusForId(LCMCommandStatus lcmCommandStatus, String message) { + return buildStatus(lcmCommandStatus, message, "id"); + } + + /** + * Build a Status. + * + * @param lcmCommandStatus for the Status code and message format + * @param message String for the Status message variable + * @param key String for the LCMcommandStatus format + * @return the newly built Status + */ + Status buildStatus(LCMCommandStatus lcmCommandStatus, String message, String key) { + Params params = new Params().addParam(key, message); + String statusMsg = lcmCommandStatus.getFormattedMessage(params); + + return buildStatusWithCode(lcmCommandStatus.getResponseCode(), statusMsg); + } + + /** + * Build a Status with passed in code + * @param statusCode Integer of the status code + * @param statusMsg String of the status description + * @return the newly build Status + */ + private Status buildStatusWithCode(Integer statusCode, String statusMsg) { + StatusBuilder status = new StatusBuilder(); + status.setCode(statusCode); + status.setMessage(statusMsg); + return status.build(); + } + + /** + * Build a Status using ParseException + * @param e of the ParseException + * @return the newly built Status + */ + protected Status buildStatusWithParseException(ParseException e) { + String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString(); + return buildStatusForErrorMsg(LCMCommandStatus.REQUEST_PARSING_FAILED, errorMessage); + } + + /** + * Build a Status using RequestHandlerOutput + * @param requestHandlerOutput object which contains the status code and message for building the new status + * @return the newly built Status + */ + protected Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){ + Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode(); + String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage(); + return buildStatusWithCode(statusCode, statusMessage); + } + + /** + * Get RPC name from Action. When there 2 words in the Action, RPC name will be dash separated string. + * @param action of Action object + * @return RPC name of the Action + */ + protected String getRpcName(Action action) { + String regex = "([a-z])([A-Z]+)"; + String replacement = "$1-$2"; + return action.name().replaceAll(regex, replacement).toLowerCase(); + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/ActionStatusService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/ActionStatusService.java new file mode 100644 index 000000000..ede2b2837 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/ActionStatusService.java @@ -0,0 +1,114 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.apache.commons.lang.StringUtils; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.onap.appc.domainmodel.lcm.ActionLevel; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +/** + * Provide LCM command service for Query action status of a previously issue LCM command + */ +public class ActionStatusService extends AbstractBaseService { + + /** + * Constructor + */ + public ActionStatusService() { + super(Action.ActionStatus); + logger.debug("ActionStatusService starts"); + } + + /** + * Query action status + * @param input of the ActionStatusInput which contains the information about the previous LCM command + * @return ActionStatusOuputBuilder containing query results + */ + public ActionStatusOutputBuilder queryStatus(ActionStatusInput input) { + Payload outputPayload = null; + + validate(input); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + if (null == status) { + RequestHandlerInput requestHandlerInput = getRequestHandlerInput( + input.getCommonHeader(), actionIdentifiers, input.getPayload(), this.getClass().getName()); + if (requestHandlerInput != null) { + updateToMgmtActionLevel(requestHandlerInput); + + RequestHandlerOutput reqHandlerOutput = executeAction(requestHandlerInput); + + outputPayload = new RequestExecutor().getPayload(reqHandlerOutput); + } + } + + logger.info(String.format("ActionStatus execute of '%s' finished with status %s. Reason: %s", + actionIdentifiers, status == null ? "null" : status.getCode().toString(), + status == null ? "null" : status.getMessage())); + + ActionStatusOutputBuilder outputBuilder = new ActionStatusOutputBuilder(); + outputBuilder.setPayload(outputPayload); + outputBuilder.setCommonHeader(input.getCommonHeader()); + outputBuilder.setStatus(status); + return outputBuilder; + } + + /** + * Validate input for + * - commonHeader + * - Action in the input + * - ActionIdentifier and only has VNF ID + * - and payload exists and is not empty string + * @param input of the ActionStatusInput from the REST API + */ + void validate(ActionStatusInput input) { + status = validateVnfId(input.getCommonHeader(), input.getAction(), input.getActionIdentifiers()); + if (status != null) { + return; + } + + Payload payload = input.getPayload(); + if (payload == null) { + status = buildStatusForParamName(LCMCommandStatus.MISSING_MANDATORY_PARAMETER, "payload"); + } else if (StringUtils.isEmpty(payload.getValue())) { + status = buildStatusForParamName(LCMCommandStatus.INVALID_INPUT_PARAMETER, "payload"); + } + } + + /** + * Update request to MGMT action level + * @param request of the RequestHandlerInput + */ + void updateToMgmtActionLevel(RequestHandlerInput request) { + request.getRequestContext().setActionLevel(ActionLevel.MGMT); + } + +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/QueryService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/QueryService.java new file mode 100644 index 000000000..2ff6fcb1d --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/QueryService.java @@ -0,0 +1,91 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.query.output.QueryResults; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.util.List; + +/** + * Provide LCM command service for Query of VNF state/status + */ +public class QueryService extends AbstractBaseService { + private List<QueryResults> queryResultList; + + /** + * Constructor + */ + public QueryService() { + super(Action.Query); + logger.debug("QueryService starts"); + } + + /** + * Process the input for the query service + * @param input of QueryInput from the REST API input + * @return QueryOutputBuilder which has the query results + */ + public QueryOutputBuilder process(QueryInput input) { + validate(input); + if (status == null) { + proceedAction(input); + } + + QueryOutputBuilder outputBuilder = new QueryOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setQueryResults(queryResultList); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + /** + * Validate the input. + * Set Status if any error occurs. + * + * @param input of QueryInput from the REST API input + */ + void validate(QueryInput input) { + status = validateVnfId(input.getCommonHeader(), input.getAction(), input.getActionIdentifiers()); + } + + /** + * Proceed to action for the query service. + * + * @param input of QueryInput from the REST API input + */ + void proceedAction(QueryInput input) { + RequestHandlerInput requestHandlerInput = getRequestHandlerInput( + input.getCommonHeader(), input.getActionIdentifiers(), null, this.getClass().getName()); + if (requestHandlerInput != null) { + RequestHandlerOutput requestHandlerOutput = executeAction(requestHandlerInput); + queryResultList = (List<QueryResults>) requestHandlerOutput.getResponseContext().getPayloadObject(); + } + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/QuiesceTrafficService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/QuiesceTrafficService.java new file mode 100644 index 000000000..ee6bf8517 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/QuiesceTrafficService.java @@ -0,0 +1,124 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.util.JsonUtil; + +import java.io.IOException; +import java.util.Map; +/** + * Provide LCM command service for Quiesce VNF traffic + */ +public class QuiesceTrafficService extends AbstractBaseService { + + /** + * Constructor + */ + public QuiesceTrafficService() { + super(Action.QuiesceTraffic); + logger.debug("QuiesceTrafficService starts"); + } + + /** + * Process the quiesce request + * @param input of QuiesceTrafficInput from the REST API input + * @return QuiesceTrafficOutputBuilder which has the process results + */ + public QuiesceTrafficOutputBuilder process(QuiesceTrafficInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers, payload); + if (status == null) { + proceedAction(commonHeader,actionIdentifiers,payload); + } + + QuiesceTrafficOutputBuilder outputBuilder = new QuiesceTrafficOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + /** + * Validate the input. + * Set Status if any error occurs. + * + * @param input of QuiesceTrafficInput from the REST API input + */ + void validate(CommonHeader commonHeader, + Action action, + ActionIdentifiers actionIdentifiers, + Payload payload) { + status = validateVnfId(commonHeader, action, actionIdentifiers); + if (status != null) { + return; + } + + // validate payload + String keyName = "payload"; + if (payload == null) { + status = buildStatusForParamName(LCMCommandStatus.MISSING_MANDATORY_PARAMETER, keyName); + return; + } + String payloadString = payload.getValue(); + status = validateMustHaveParamValue(payloadString == null ? payloadString : payloadString.trim(), "payload"); + if (status != null) { + return; + } + + try { + Map<String, String> payloadMap = JsonUtil.convertJsonStringToFlatMap(payloadString); + validateMustHaveParamValue(payloadMap.get(keyName), keyName); + } catch (IOException e) { + logger.error(String.format("QuiesceTrafficService (%s) got IOException when converting payload", rpcName), e); + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, e.getMessage()); + } + } + + /** + * Proceed to action for the quiesce VNF traffic. + * + * @param input of QuiesceTrafficInput from the REST API input + */ + void proceedAction(CommonHeader commonHeader, + ActionIdentifiers actionIdentifiers, + Payload payload) { + RequestHandlerInput requestHandlerInput = getRequestHandlerInput(commonHeader, actionIdentifiers, payload, + this.getClass().getName()); + if (requestHandlerInput != null) { + executeAction(requestHandlerInput); + } + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/RebootService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/RebootService.java new file mode 100644 index 000000000..f1c2354d3 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/RebootService.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutputBuilder; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.util.JsonUtil; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * Provide LCM command service for rebooting virtual machine (VM) + */ +public class RebootService extends AbstractBaseService { + private final EELFLogger myLogger = EELFManager.getInstance().getLogger(RebootService.class); + private static final String REBOOT_TYPE_PARAMETER = "reboot-type"; + private final List<String> rebootTypeList = Arrays.asList("hard", "soft"); + + /** + * Constructor + */ + public RebootService() { + super(Action.Reboot); + } + + public RebootOutputBuilder process(RebootInput input) { + validate(input); + if (status == null) { + proceedAction(input); + } + + final RebootOutputBuilder outputBuilder = new RebootOutputBuilder(); + outputBuilder.setCommonHeader(input.getCommonHeader()); + outputBuilder.setStatus(status); + return outputBuilder; + } + + private void proceedAction(RebootInput input) { + RequestHandlerInput requestHandlerInput = getRequestHandlerInput( + input.getCommonHeader(), input.getActionIdentifiers(), input.getPayload(), this.getClass().getName()); + if (requestHandlerInput != null) { + executeAction(requestHandlerInput); + } + } + + private String getRebootType(RebootInput input) { + String rebootType = null; + if (input.getPayload() != null) { + Map<String, String> payloadMap; + try { + payloadMap = JsonUtil.convertJsonStringToFlatMap(input.getPayload().getValue()); + rebootType = payloadMap.get(REBOOT_TYPE_PARAMETER); + } catch (IOException e) { + myLogger.error("Error in converting payload of RebootInput", e.getMessage()); + } + } + + return rebootType; + } + + /** + * Validate the input. + * + * @param input of RebootInput from the REST API input + */ + private void validate(RebootInput input) { + status = validateVserverId(input.getCommonHeader(), input.getAction(), input.getActionIdentifiers()); + if (status != null) { + return; + } + + //reboot-type validation + final String rebootType = getRebootType(input); + if (null == rebootType) { + status = buildStatusForParamName(LCMCommandStatus.MISSING_MANDATORY_PARAMETER, REBOOT_TYPE_PARAMETER); + } else if (!rebootTypeList.contains(rebootType)) { + status = buildStatusForErrorMsg(LCMCommandStatus.INVALID_INPUT_PARAMETER, REBOOT_TYPE_PARAMETER); + } + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/RequestExecutor.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/RequestExecutor.java new file mode 100644 index 000000000..66872588f --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/RequestExecutor.java @@ -0,0 +1,178 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.att.eelf.i18n.EELFResourceManager; +import com.google.common.base.Strings; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.onap.appc.Constants; +import org.onap.appc.configuration.Configuration; +import org.onap.appc.configuration.ConfigurationFactory; +import org.onap.appc.domainmodel.lcm.ActionLevel; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.exceptions.APPCException; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.executor.objects.Params; +import org.onap.appc.i18n.Msg; +import org.onap.appc.logging.LoggingConstants; +import org.onap.appc.logging.LoggingUtils; +import org.onap.appc.provider.AppcProviderLcm; +import org.onap.appc.provider.lcm.mock.MockRequestExecutor; +import org.onap.appc.requesthandler.RequestHandler; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +import java.util.Collection; + +/** + * Provider LCM request executor + */ +public class RequestExecutor { + final String CANNOT_PROCESS = "LCM request cannot be processed at the moment because APPC isn't running"; + + private final Configuration configuration = ConfigurationFactory.getConfiguration(); + private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class); + + /** + * Execute the request. + * @param requestHandlerInput of the RequestHandlerInput + * @return RequestHandlerOutput + */ + public RequestHandlerOutput executeRequest(RequestHandlerInput requestHandlerInput) { + // TODO mock backend should be removed when backend implementation is done + RequestHandlerOutput requestHandlerOutput = new MockRequestExecutor().executeRequest(requestHandlerInput); + if (requestHandlerOutput != null) { + // mock support, return mock results + return requestHandlerOutput; + } + + RequestHandler handler = getRequestHandler(requestHandlerInput.getRequestContext().getActionLevel()); + if (handler == null) { + logger.debug("execute while requesthandler is null"); + requestHandlerOutput = createRequestHandlerOutput(requestHandlerInput, + LCMCommandStatus.REJECTED, Msg.REQUEST_HANDLER_UNAVAILABLE, new APPCException(CANNOT_PROCESS)); + } else { + try { + logger.debug("execute while requesthandler is not null"); + requestHandlerOutput = handler.handleRequest(requestHandlerInput); + } catch (Exception e) { + logger.info(String.format("UNEXPECTED FAILURE while executing %s action", + requestHandlerInput.getRequestContext().getAction().name())); + requestHandlerOutput = createRequestHandlerOutput(requestHandlerInput, + LCMCommandStatus.UNEXPECTED_ERROR, Msg.EXCEPTION_CALLING_DG, e); + } + } + return requestHandlerOutput; + } + + /** + * Get Request handler by ActionLevel + * @param actionLevel the ActionLevel + * @return RequestHandler if found, otherwise return null or throw RuntimeException + */ + RequestHandler getRequestHandler(ActionLevel actionLevel) { + final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext(); + if (context == null) { + return null; + } + + String filter = null; + try { + filter = "(level=" + actionLevel.name() + ")"; + Collection<ServiceReference<RequestHandler>> serviceReferences = + context.getServiceReferences(RequestHandler.class, filter); + if (serviceReferences.size() == 1) { + ServiceReference<RequestHandler> serviceReference = serviceReferences.iterator().next(); + return context.getService(serviceReference); + } + + logger.error(String.format("Cannot find service reference for %s", RequestHandler.class.getName())); + throw new RuntimeException(); + + } catch (InvalidSyntaxException e) { + logger.error(String.format("Cannot find service reference for %s: Invalid Syntax %s", + RequestHandler.class.getName(), filter), e); + throw new RuntimeException(e); + } + } + + /** + * Create request handler output + * @param request of RequestHandlerInput + * @param cmdStatus of LCMCommandStatus + * @param msg of Msg for audit log + * @param e of the Exception + * @return generated RequestHandlerOutput based on the input + */ + RequestHandlerOutput createRequestHandlerOutput(RequestHandlerInput request, + LCMCommandStatus cmdStatus, + Msg msg, + Exception e) { + String errorMsg = e.getMessage() != null ? e.getMessage() : e.toString(); + Params params = new Params().addParam("errorMsg", errorMsg); + + final org.onap.appc.domainmodel.lcm.Status status = new org.onap.appc.domainmodel.lcm.Status(); + status.setMessage(cmdStatus.getFormattedMessage(params)); + status.setCode(cmdStatus.getResponseCode()); + + final ResponseContext responseContext = new ResponseContext(); + responseContext.setCommonHeader(request.getRequestContext().getCommonHeader()); + responseContext.setStatus(status); + + RequestHandlerOutput requestHandlerOutput = new RequestHandlerOutput(); + requestHandlerOutput.setResponseContext(responseContext); + + final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); + final String reason = EELFResourceManager.format( + msg, e, appName, e.getClass().getSimpleName(), "", e.getMessage()); + LoggingUtils.logErrorMessage( + LoggingConstants.TargetNames.APPC_PROVIDER, + reason, + this.getClass().getName()); + + return requestHandlerOutput; + } + + /** + * Get payload from passed in RequestHandlerOutput + * @param output of the RequestHandlerOutput + * @return If the passed in RequestHandlerOutput contains payload, return a Payload object of the payload. + * Otherwise, return null. + */ + public Payload getPayload(RequestHandlerOutput output) { + if (output.getResponseContext() == null + || Strings.isNullOrEmpty(output.getResponseContext().getPayload())) { + return null; + } + + return new Payload(output.getResponseContext().getPayload()); + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/ResumeTrafficService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/ResumeTrafficService.java new file mode 100644 index 000000000..53d038141 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/ResumeTrafficService.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.util.JsonUtil; + +import java.io.IOException; +import java.util.Map; +/** + * Provide LCM command service for Resume VNF traffic + */ +public class ResumeTrafficService extends AbstractBaseService { + + /** + * Constructor + */ + public ResumeTrafficService() { + super(Action.ResumeTraffic); + logger.debug("ResumeTrafficService starts"); + } + + /** + * Process the Resume request + * @param input of ResumeTrafficInput from the REST API input + * @return ResumeTrafficOutputBuilder which has the process results + */ + public ResumeTrafficOutputBuilder process(ResumeTrafficInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + + validate(commonHeader, input.getAction(), actionIdentifiers); + if (status == null) { + proceedAction(input); + } + + ResumeTrafficOutputBuilder outputBuilder = new ResumeTrafficOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + /** + * Validate the input. + * Set Status if any error occurs. + * + * @param input of ResumeTrafficInput from the REST API input + */ + void validate(CommonHeader commonHeader, + Action action, + ActionIdentifiers actionIdentifiers) { + status = validateVnfId(commonHeader, action, actionIdentifiers); + if (status != null) { + return; + } + } + + /** + * Proceed to action for the Resume VNF traffic. + * + * @param input of ResumeTrafficInput from the REST API input + */ + void proceedAction(ResumeTrafficInput input) { + RequestHandlerInput requestHandlerInput = getRequestHandlerInput( + input.getCommonHeader(), input.getActionIdentifiers(), null, this.getClass().getName()); + if (requestHandlerInput != null) { + executeAction(requestHandlerInput); + } + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/UpgradeService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/UpgradeService.java new file mode 100644 index 000000000..04f3954c5 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/UpgradeService.java @@ -0,0 +1,200 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.util.JsonUtil; + +import java.io.IOException; +import java.util.Map; + +/** + * Provide LCM command service for attach/detach a cinder to a VM + */ +public class UpgradeService extends AbstractBaseService { + /** + * Constructor + * + */ + public UpgradeService(String upgrade) { + switch(upgrade){ + case "upgradePre": + rpcName = getRpcName(Action.UpgradePreCheck); + expectedAction = Action.UpgradePreCheck; + break; + case "upgradePost": + rpcName = getRpcName(Action.UpgradePostCheck); + expectedAction = Action.UpgradePostCheck; + break; + case "upgradeSoft": + rpcName = getRpcName(Action.UpgradeSoftware); + expectedAction = Action.UpgradeSoftware; + break; + case "upgradeBackup": + rpcName = getRpcName(Action.UpgradeBackup); + expectedAction = Action.UpgradeBackup; + break; + case "upgradeBackout": + rpcName = getRpcName(Action.UpgradeBackout); + expectedAction = Action.UpgradeBackout; + break; + } + logger.debug("UpgradeService starts ", upgrade); + } + + public UpgradePreCheckOutputBuilder upgradePreCheck(UpgradePreCheckInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers, payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + UpgradePreCheckOutputBuilder outputBuilder = new UpgradePreCheckOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + + public UpgradeSoftwareOutputBuilder upgradeSoftware(UpgradeSoftwareInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers, payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + UpgradeSoftwareOutputBuilder outputBuilder = new UpgradeSoftwareOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + public UpgradePostCheckOutputBuilder upgradePostCheck(UpgradePostCheckInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers, payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + UpgradePostCheckOutputBuilder outputBuilder = new UpgradePostCheckOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + public UpgradeBackupOutputBuilder upgradeBackup(UpgradeBackupInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers, payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + UpgradeBackupOutputBuilder outputBuilder = new UpgradeBackupOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + public UpgradeBackoutOutputBuilder upgradeBackout(UpgradeBackoutInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers, payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + UpgradeBackoutOutputBuilder outputBuilder = new UpgradeBackoutOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + void validate(CommonHeader commonHeader, + Action action, + ActionIdentifiers actionIdentifiers, + Payload payload) { + status = validateVnfId(commonHeader, action, actionIdentifiers); + if (status != null) { + return; + } + + // validate payload + String keyName = "payload"; + if (payload == null) { + status = buildStatusForParamName(LCMCommandStatus.MISSING_MANDATORY_PARAMETER, keyName); + return; + } + String payloadString = payload.getValue(); + status = validateMustHaveParamValue( + payloadString == null ? payloadString : payloadString.trim(), "payload"); + if (status != null) { + return; + } + + try { + Map<String, String> payloadMap = JsonUtil.convertJsonStringToFlatMap(payloadString); + validateMustHaveParamValue(payloadMap.get(keyName), keyName); + } catch (IOException e) { + logger.error(String.format("UpgradeService (%s) got IOException when converting payload", rpcName), e); + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, e.getMessage()); + } + } + + void proceedAction(CommonHeader commonHeader, + ActionIdentifiers actionIdentifiers, + Payload payload) { + RequestHandlerInput requestHandlerInput = + getRequestHandlerInput(commonHeader, actionIdentifiers, payload, this.getClass().getName()); + if (requestHandlerInput != null) { + executeAction(requestHandlerInput); + } + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/VolumeService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/VolumeService.java new file mode 100644 index 000000000..74524a79e --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/service/VolumeService.java @@ -0,0 +1,165 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.util.JsonUtil; +import java.util.EnumSet; +import java.io.IOException; +import java.util.Map; + +/** + * Provide LCM command service for attach/detach a cinder to a VM + */ +public class VolumeService extends AbstractBaseService { + /** + * Constructor + * + * @param isAttachVolume boolean to indicate if this VolumeSerivce is created for attaching or detaching cinder + */ + public VolumeService(boolean isAttachVolume) { + super(isAttachVolume ? Action.AttachVolume : Action.DetachVolume); + logger.debug("VolumeService starts ", isAttachVolume); + } + + /** + * Attach a cinder to the VM volume + * + * @param input of AttachVolumeInput from the REST API input + * @return AttachVolumeOutputBuilder which has the details of the request results + */ + public AttachVolumeOutputBuilder attachVolume(AttachVolumeInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers,payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + AttachVolumeOutputBuilder outputBuilder = new AttachVolumeOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + /** + * Detach a cinder to the VM volume + * + * @param input of DetachVolumeInput from the REST API input + * @return DetachVolumeOutputBuilder which has the details of the request results + */ + public DetachVolumeOutputBuilder detachVolume(DetachVolumeInput input) { + CommonHeader commonHeader = input.getCommonHeader(); + ActionIdentifiers actionIdentifiers = input.getActionIdentifiers(); + Payload payload = input.getPayload(); + + validate(commonHeader, input.getAction(), actionIdentifiers,payload); + if (status == null) { + proceedAction(commonHeader, actionIdentifiers, payload); + } + + DetachVolumeOutputBuilder outputBuilder = new DetachVolumeOutputBuilder(); + outputBuilder.setStatus(status); + outputBuilder.setCommonHeader(input.getCommonHeader()); + return outputBuilder; + } + + void validate(CommonHeader commonHeader, + Action action, + ActionIdentifiers actionIdentifiers, + Payload payload) { + status = validateVserverIdVnfId(commonHeader, action, actionIdentifiers); + if (status != null) { + return; + } + + // validate payload + String keyName = "payload"; + if (payload == null) { + status = buildStatusForParamName(LCMCommandStatus.MISSING_MANDATORY_PARAMETER, keyName); + return; + } + String payloadString = payload.getValue(); + status = validateMustHaveParamValue( + payloadString == null ? payloadString : payloadString.trim(), "payload"); + if (status != null) { + return; + } + + try { + Map<String, String> payloadMap = JsonUtil.convertJsonStringToFlatMap(payloadString); + validateMustHaveParamValue(payloadMap.get(keyName), keyName); + } catch (IOException e) { + logger.error(String.format("VolumeService (%s) got IOException when converting payload", rpcName), e); + status = buildStatusForErrorMsg(LCMCommandStatus.UNEXPECTED_ERROR, e.getMessage()); + } + } + + Status validateVserverIdVnfId(CommonHeader commonHeader, Action action, ActionIdentifiers actionIdentifiers ) { + Status validatedStatus = validateInput(commonHeader, action, actionIdentifiers); + + if (validatedStatus != null) { + return validatedStatus; + } + + validatedStatus = validateMustHaveParamValue(actionIdentifiers.getVserverId(), "vserver-id"); + if (validatedStatus == null) { + validatedStatus = validateMustHaveParamValue(actionIdentifiers.getVserverId(), "vnf-id"); + logger.debug("check for vnf-id"); + } + if (validatedStatus == null) { + validatedStatus = validateExcludedActIds(actionIdentifiers, EnumSet.of(ACTID_KEYS.VSERVER_ID, ACTID_KEYS.VNF_ID)); + } + logger.debug("check for ActIds"); + return validatedStatus; + } + /** + * Proceed to action for the attach or detach volume. + * @param commonHeader of the input + * @param actionIdentifiers of the input + * @param payload of the input + */ + void proceedAction(CommonHeader commonHeader, + ActionIdentifiers actionIdentifiers, + Payload payload) { + RequestHandlerInput requestHandlerInput = + getRequestHandlerInput(commonHeader, actionIdentifiers, payload, this.getClass().getName()); + if (requestHandlerInput != null) { + executeAction(requestHandlerInput); + } + } +} diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/RequestInputBuilder.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/RequestInputBuilder.java index 979c834de..56f094565 100644 --- a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/RequestInputBuilder.java +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/RequestInputBuilder.java @@ -28,12 +28,11 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.TimeZone; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags; -import org.onap.appc.domainmodel.lcm.Flags.Mode; import org.onap.appc.domainmodel.lcm.ActionLevel; import org.onap.appc.domainmodel.lcm.RequestContext; import org.onap.appc.domainmodel.lcm.VNFOperation; @@ -44,16 +43,13 @@ import com.att.eelf.configuration.EELFManager; public class RequestInputBuilder { - private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger(); + private final EELFLogger logger = EELFManager.getInstance().getApplicationLogger(); private static final String FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; private RequestContext requestContext; private String rpcName; - public RequestInputBuilder() { - } - public RequestInputBuilder requestContext() { this.requestContext = new RequestContext(); @@ -99,7 +95,7 @@ public class RequestInputBuilder { SimpleDateFormat format = new SimpleDateFormat(FORMAT); format.setLenient(false); format.setTimeZone(TimeZone.getTimeZone("UTC")); - header.setTimestamp(format.parse(commonHeader.getTimestamp().getValue()).toInstant()); + header.setTimestamp(format.parse(commonHeader.getTimestamp().getValue())); }else{ throw new ParseException("Missing mandatory parameter : timestamp " , 0); } @@ -113,23 +109,21 @@ public class RequestInputBuilder { header.setSubRequestId(commonHeader.getSubRequestId()); Flags inFlags = commonHeader.getFlags(); - boolean force = false; - Mode mode = null; - int ttl = 0; + org.onap.appc.domainmodel.lcm.Flags flags = new org.onap.appc.domainmodel.lcm.Flags(); if (inFlags != null) { - if (null != inFlags.getForce()) { - force = Boolean.parseBoolean(inFlags.getForce().toString().toLowerCase()); + if(null != inFlags.getForce()) { + flags.setForce(Boolean.parseBoolean(inFlags.getForce().toString().toLowerCase())); } - if (null != inFlags.getMode()) { - mode = Mode.valueOf(inFlags.getMode().name()); + if(null!=inFlags.getMode()) { + flags.setMode(inFlags.getMode().name()); } - if (null != inFlags.getTtl()) { - ttl = inFlags.getTtl(); + if(null!= inFlags.getTtl()) { + flags.setTtl(inFlags.getTtl()); } } - this.requestContext.getCommonHeader().setFlags(new org.onap.appc.domainmodel.lcm.Flags(mode, force, ttl)); + this.requestContext.getCommonHeader().setFlags(flags); return this; } @@ -143,7 +137,7 @@ public class RequestInputBuilder { actionIds.setVfModuleId(actionIdentifiers.getVfModuleId()); this.requestContext.setActionIdentifiers(actionIds); - ActionLevel actionLevel = readActionLevel(actionIds); + ActionLevel actionLevel=ActionLevel.VNF; this.requestContext.setActionLevel(actionLevel); return this; }else{ @@ -151,12 +145,4 @@ public class RequestInputBuilder { } } - private ActionLevel readActionLevel(org.onap.appc.domainmodel.lcm.ActionIdentifiers actionIds) { - if(!StringUtils.isEmpty(actionIds.getVserverId())){ - return ActionLevel.VM; - } - return ActionLevel.VNF; - } - - } diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/ValidationService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/ValidationService.java index 69e100b57..fc53e8ebd 100644 --- a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/ValidationService.java +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/lcm/util/ValidationService.java @@ -38,10 +38,6 @@ import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.att.eelf.i18n.EELFResourceManager; -import javax.swing.*; - - - public class ValidationService { private static class ValidationServiceHolder { @@ -49,46 +45,62 @@ public class ValidationService { } private final EELFLogger logger = EELFManager.getInstance().getLogger(ValidationService.class); - private Configuration configuration = ConfigurationFactory.getConfiguration(); public static ValidationService getInstance(){ return ValidationServiceHolder.INSTANCE; } - public Status validateInput (CommonHeader commonHeader, Action action , String rpcName) { - String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); - String reason ; - StringBuilder paramName = new StringBuilder(""); - if (!isEmpty(commonHeader) && !isEmpty(commonHeader.getApiVer())&& !isEmpty(commonHeader.getTimestamp()) && !isEmpty(commonHeader.getRequestId()) && !isEmpty(action) && !isEmpty(commonHeader.getOriginatorId())){ - if(!action.toString().equalsIgnoreCase(rpcName)) logger.warn("action in input request '" + action.toString() + "' is different from endpoint '" + rpcName + "'"); + public Status validateInput(CommonHeader commonHeader, Action action , String rpcName) { + if (!isEmpty(commonHeader) + && !isEmpty(commonHeader.getApiVer()) + && !isEmpty(commonHeader.getTimestamp()) + && !isEmpty(commonHeader.getRequestId()) + && !isEmpty(commonHeader.getOriginatorId()) + && !isEmpty(action)) { return null; - } else{ - if(isEmpty(commonHeader)){ - paramName.append("common-header"); - }else{ - if (isEmpty(commonHeader.getApiVer())) paramName.append("api-ver"); - if (isEmpty(commonHeader.getTimestamp())) paramName.append(isEmpty(paramName) ? "timestamp" : " , timestamp" ); - if (isEmpty(commonHeader.getRequestId())) paramName.append(isEmpty(paramName) ? "request-id" : " , request-id" ); - if (isEmpty(commonHeader.getOriginatorId())) paramName.append(isEmpty(paramName) ? "originator-id" : " , originator-id" ); - } - if (isEmpty(action)) paramName.append(isEmpty(paramName) ? "action" : " , action" ); } + StringBuilder paramName = new StringBuilder(); + if(isEmpty(commonHeader)){ + paramName.append("common-header"); + } else { + if (isEmpty(commonHeader.getApiVer())) { + paramName.append("api-ver"); + } + if (isEmpty(commonHeader.getTimestamp())) { + paramName.append(isEmpty(paramName) ? "timestamp" : " , timestamp"); + } + if (isEmpty(commonHeader.getRequestId())) { + paramName.append(isEmpty(paramName) ? "request-id" : " , request-id"); + } + if (isEmpty(commonHeader.getOriginatorId())) { + paramName.append(isEmpty(paramName) ? "originator-id" : " , originator-id"); + } + } + if (isEmpty(action)) { + paramName.append(isEmpty(paramName) ? "action" : " , action"); + } - - reason = EELFResourceManager.format(Msg.NULL_OR_INVALID_ARGUMENT, appName, rpcName, paramName.toString() , ""); logger.info("Mandatory parameter/s" + paramName.toString() + " is/are missing"); + String reason = EELFResourceManager.format( + Msg.NULL_OR_INVALID_ARGUMENT, + configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME), + rpcName, + paramName.toString(), + ""); logger.error(reason); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.MISSING_MANDATORY_PARAMETER; Params params = new Params().addParam("paramName", paramName.toString()); + StatusBuilder status = new StatusBuilder(); status.setCode(lcmCommandStatus.getResponseCode()); status.setMessage(lcmCommandStatus.getFormattedMessage(params)); return status.build(); } - private boolean isEmpty (Object object){ - return (null == object || "".equalsIgnoreCase(object.toString())); + private boolean isEmpty(Object object) { + return null == object || "".equalsIgnoreCase(object.toString()); } } diff --git a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/topology/TopologyService.java b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/topology/TopologyService.java index ea1d3f1ee..35258ed49 100644 --- a/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/topology/TopologyService.java +++ b/appc-provider/appc-provider-bundle/src/main/java/org/onap/appc/provider/topology/TopologyService.java @@ -80,12 +80,10 @@ public class TopologyService { /** * The loggers we are using */ - // private static EELFLogger logger = LoggerFactory.getLogger(TopologyService.class); - private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger(); - private static EELFLogger securityLogger = EELFManager.getInstance().getSecurityLogger(); - private static EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - private static EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - private static EELFLogger performanceLogger = EELFManager.getInstance().getPerformanceLogger(); + private final EELFLogger logger = EELFManager.getInstance().getApplicationLogger(); + private final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); + private final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); + private final EELFLogger performanceLogger = EELFManager.getInstance().getPerformanceLogger(); /** * The provider we are servicing @@ -112,80 +110,20 @@ public class TopologyService { this.provider = provider; } - // /** - // * Processes the topology request - // * - // * @param input - // * The request to be processed - // * @return The result of processing - // */ - // public RpcResult<TopologyOperationOutput> process(TopologyOperationInput input) { - // RpcResult<TopologyOperationOutput> response; - // - // String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); - // logger.info(String.format("%s:topology operations called...", appName)); - // - // /* - // * Properties used to pass information to the DG - // */ - // Properties properties = new Properties(); - // - // if (input == null || input.getTopologyRequest().getVmId() == null) { - // String msg = - // String.format("%s: topology operation failed, invalid input. Null or empty argument '%s'", appName, - // "vm_id"); - // logger.debug(msg); - // response = generateTopologyOperationResponse(Boolean.FALSE, "UNKNOWN", msg, "UNDEFINED"); - // } else { - // // CommonRequestHeader crh = input.getCommonRequestHeader(); - // TopologyHeader hdr = input.getTopologyHeader(); - // TopologyRequest req = input.getTopologyRequest(); - // - // // String requestId = crh.getServiceRequestId(); - // String requestId = hdr.getSvcRequestId(); - // properties.put(Constants.CONTEXT_REQID, requestId); - // - // String infomsg = String.format("Topology request '%s' (%s) received.", requestId, hdr.getSvcAction()); - // - // // switch (req.getSvcAction()) { - // switch (hdr.getSvcAction()) { - // case Restart: - // properties.put(Constants.CONTEXT_SERVICE, Constants.SERVICE_RESTART); - // response = restart(input, properties); - // logger.info(infomsg); - // break; - // - // case Rebuild: - // properties.put(Constants.CONTEXT_SERVICE, Constants.SERVICE_REBUILD); - // response = rebuild(input, properties); - // logger.info(infomsg); - // break; - // - // default: - // String msg = String.format("Invalid request type [%s] for request id [%s]", req, requestId); - // response = generateTopologyOperationResponse(Boolean.FALSE, requestId, msg, "N/A"); - // } - // } - // - // return response; - // } - /** - * Restart a VM - * + * Modify configuration + * * @param hdr * The common request header - * @param vnf - * The identification of the VNF resource to be operated upon - * @return The rpc result of the restart operation + * @param data + * The payload of the configuration + * @return The rpc result of the operation */ public RpcResult<ModifyConfigOutput> modifyConfig(CommonRequestHeader hdr, ConfigPayload data) { long startTime = System.currentTimeMillis(); TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); df.setTimeZone(tz); - // String startTimeStr = String.valueOf(startTime); - String startTimeStr = df.format(new Date()); String requestId = hdr.getServiceRequestId(); //MDC.clear(); @@ -227,10 +165,6 @@ public class TopologyService { properties.put("org.onap.appc.configURL", url); properties.put("org.onap.appc.configJson", data.getConfigJson()); - //UUID identityUrl = vnf.getIdentityUrl(); - //if (identityUrl != null) { - // properties.put(Constants.CONTEXT_IDENTITY_URL, identityUrl.getValue()); - //} /* * Attempt to call the DG with the appropriate properties */ @@ -261,9 +195,7 @@ public class TopologyService { requestId, statusStr, startTime, endTime, duration, requestId, reason)); // Status must be set to true to indicate that our return is expected - RpcResult<ModifyConfigOutput> rpcResult = - RpcResultBuilder.<ModifyConfigOutput> status(true).withResult(rob.build()).build(); - return rpcResult; + return RpcResultBuilder.<ModifyConfigOutput> status(true).withResult(rob.build()).build(); } @@ -354,9 +286,7 @@ public class TopologyService { requestId, statusStr, startTime, endTime, duration, requestId, reason)); // Status must be set to true to indicate that our return is expected - RpcResult<MigrateOutput> rpcResult = - RpcResultBuilder.<MigrateOutput> status(true).withResult(mob.build()).build(); - return rpcResult; + return RpcResultBuilder.<MigrateOutput> status(true).withResult(mob.build()).build(); } /** @@ -373,8 +303,6 @@ public class TopologyService { TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); df.setTimeZone(tz); - // String startTimeStr = String.valueOf(startTime); - String startTimeStr = df.format(new Date()); String requestId = hdr.getServiceRequestId(); //MDC.clear(); @@ -441,9 +369,7 @@ public class TopologyService { requestId, statusStr, startTime, endTime, duration, requestId, reason)); // Status must be set to true to indicate that our return is expected - RpcResult<RestartOutput> rpcResult = - RpcResultBuilder.<RestartOutput> status(true).withResult(rob.build()).build(); - return rpcResult; + return RpcResultBuilder.<RestartOutput> status(true).withResult(rob.build()).build(); } /** @@ -530,9 +456,7 @@ public class TopologyService { requestId, statusStr, startTime, endTime, duration, requestId, reason)); // Status must be set to true to indicate that our return is expected - RpcResult<RebuildOutput> rpcResult = - RpcResultBuilder.<RebuildOutput> status(true).withResult(rob.build()).build(); - return rpcResult; + return RpcResultBuilder.<RebuildOutput> status(true).withResult(rob.build()).build(); } /** @@ -549,8 +473,6 @@ public class TopologyService { TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); df.setTimeZone(tz); - // String startTimeStr = String.valueOf(startTime); - String startTimeStr = df.format(new Date()); String requestId = hdr.getServiceRequestId(); //MDC.clear(); @@ -617,9 +539,7 @@ public class TopologyService { requestId, statusStr, startTime, endTime, duration, requestId, reason)); // Status must be set to true to indicate that our return is expected - RpcResult<SnapshotOutput> rpcResult = - RpcResultBuilder.<SnapshotOutput> status(true).withResult(sob.build()).build(); - return rpcResult; + return RpcResultBuilder.<SnapshotOutput> status(true).withResult(sob.build()).build(); } /**************************************************/ @@ -690,9 +610,7 @@ public class TopologyService { vob.setStatMsg(tempstring2); // Status must be set to true to indicate that our return is expected - RpcResult<VmstatuscheckOutput> rpcResult = - RpcResultBuilder.<VmstatuscheckOutput> status(true).withResult(vob.build()).build(); - return rpcResult; + return RpcResultBuilder.<VmstatuscheckOutput> status(true).withResult(vob.build()).build(); } /*************************************************/ @@ -726,7 +644,7 @@ public class TopologyService { logger.debug(String.format("Calling Graph %s", graphName)); metricsLogger.info(String.format("Calling Graph %s", graphName)); - boolean success = false; + boolean success; String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); AppcProviderClient svcLogicClient = new AppcProviderClient(); try { @@ -748,7 +666,7 @@ public class TopologyService { if (respProps.containsKey(Constants.ATTRIBUTE_ERROR_CODE)) { // || respProps.containsKey(Constants.ATTRIBUTE_ERROR_MESSAGE)) { String errorCodeProperty = respProps.getProperty(Constants.ATTRIBUTE_ERROR_CODE).trim(); - int errorCode = 200; + int errorCode; try { errorCode = Integer.parseInt(errorCodeProperty); if (errorCode >= 300) { diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/AppcProviderLcmTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/AppcProviderLcmTest.java index f25df9c44..064f5679f 100644 --- a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/AppcProviderLcmTest.java +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/AppcProviderLcmTest.java @@ -9,15 +9,15 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * ECOMP is a trademark and service mark of AT&T Intellectual Property. * ============LICENSE_END========================================================= */ @@ -36,6 +36,9 @@ import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.CheckLockInput; @@ -54,6 +57,9 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigScaleoutIn import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigScaleoutOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.HealthCheckInput; @@ -64,6 +70,33 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.LockInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.LockOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildInput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildOutput; import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RestartInput; @@ -100,6 +133,7 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBui import org.opendaylight.yangtools.yang.common.RpcResult; import org.onap.appc.domainmodel.lcm.ResponseContext; import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.provider.lcm.service.*; import org.onap.appc.provider.lcm.util.ValidationService; import org.onap.appc.requesthandler.objects.RequestHandlerOutput; import org.osgi.framework.FrameworkUtil; @@ -122,13 +156,16 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.whenNew; /** * Integration Test class for AppcProviderLcm. */ @RunWith(PowerMockRunner.class) -@PrepareForTest({FrameworkUtil.class, AppcProviderLcm.class, ValidationService.class}) +@PrepareForTest({FrameworkUtil.class, AppcProviderLcm.class, QueryService.class, VolumeService.class, + QuiesceTrafficService.class, ValidationService.class}) public class AppcProviderLcmTest extends AbstractDataBrokerTest { private Status successStatus = new StatusBuilder().setCode(400).setMessage("success").build(); private Status failStatus = new StatusBuilder().setCode(401).setMessage("failure").build(); @@ -1091,6 +1128,183 @@ public class AppcProviderLcmTest extends AbstractDataBrokerTest { verify(appcProviderLcm, times(1)).executeRequest(any()); } + @Test + public void testQuery() throws Exception { + QueryInput mockInput = mock(QueryInput.class); + QueryOutput mockOutput = mock(QueryOutput.class); + QueryOutputBuilder mockQueryOutputBuilder = mock(QueryOutputBuilder.class); + QueryService mockQuery = mock(QueryService.class); + + whenNew(QueryService.class).withNoArguments().thenReturn(mockQuery); + when(mockQuery.process(mockInput)).thenReturn(mockQueryOutputBuilder); + when(mockQueryOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<QueryOutput>> results = appcProviderLcm.query(mockInput); + verify(mockQuery, times(1)).process(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testReboot() throws Exception { + RebootInput mockInput = mock(RebootInput.class); + RebootOutput mockOutput = mock(RebootOutput.class); + RebootOutputBuilder mockRebootOutputBuilder = mock(RebootOutputBuilder.class); + RebootService mockReboot = mock(RebootService.class); + + whenNew(RebootService.class).withNoArguments().thenReturn(mockReboot); + when(mockReboot.process(mockInput)).thenReturn(mockRebootOutputBuilder); + when(mockRebootOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<RebootOutput>> results = appcProviderLcm.reboot(mockInput); + verify(mockReboot, times(1)).process(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testAttachVolume() throws Exception { + AttachVolumeInput mockInput = mock(AttachVolumeInput.class); + AttachVolumeOutput mockOutput = mock(AttachVolumeOutput.class); + AttachVolumeOutputBuilder mockOutputBuilder = mock(AttachVolumeOutputBuilder.class); + VolumeService mockVolumeService = mock(VolumeService.class); + + whenNew(VolumeService.class).withArguments(true).thenReturn(mockVolumeService); + when(mockVolumeService.attachVolume(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<AttachVolumeOutput>> results = appcProviderLcm.attachVolume(mockInput); + verify(mockVolumeService, times(1)).attachVolume(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testDetachVolume() throws Exception { + DetachVolumeInput mockInput = mock(DetachVolumeInput.class); + DetachVolumeOutput mockOutput = mock(DetachVolumeOutput.class); + DetachVolumeOutputBuilder mockOutputBuilder = mock(DetachVolumeOutputBuilder.class); + VolumeService mockVolumeService = mock(VolumeService.class); + + whenNew(VolumeService.class).withArguments(false).thenReturn(mockVolumeService); + when(mockVolumeService.detachVolume(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<DetachVolumeOutput>> results = appcProviderLcm.detachVolume(mockInput); + verify(mockVolumeService, times(1)).detachVolume(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testQuiesceTraffic() throws Exception { + QuiesceTrafficInput mockInput = mock(QuiesceTrafficInput.class); + QuiesceTrafficOutput mockOutput = mock(QuiesceTrafficOutput.class); + QuiesceTrafficOutputBuilder mockOutputBuilder = mock(QuiesceTrafficOutputBuilder.class); + QuiesceTrafficService mockService = mock(QuiesceTrafficService.class); + + whenNew(QuiesceTrafficService.class).withNoArguments().thenReturn(mockService); + when(mockService.process(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<QuiesceTrafficOutput>> results = appcProviderLcm.quiesceTraffic(mockInput); + verify(mockService, times(1)).process(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testResumeTraffic() throws Exception { + ResumeTrafficInput mockInput = mock(ResumeTrafficInput.class); + ResumeTrafficOutput mockOutput = mock(ResumeTrafficOutput.class); + ResumeTrafficOutputBuilder mockOutputBuilder = mock(ResumeTrafficOutputBuilder.class); + ResumeTrafficService mockService = mock(ResumeTrafficService.class); + + whenNew(ResumeTrafficService.class).withNoArguments().thenReturn(mockService); + when(mockService.process(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<ResumeTrafficOutput>> results = appcProviderLcm.resumeTraffic(mockInput); + verify(mockService, times(1)).process(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testUpgradePreCheck() throws Exception { + UpgradePreCheckInput mockInput = mock(UpgradePreCheckInput.class); + UpgradePreCheckOutput mockOutput = mock(UpgradePreCheckOutput.class); + UpgradePreCheckOutputBuilder mockOutputBuilder = mock(UpgradePreCheckOutputBuilder.class); + UpgradeService mockService = mock(UpgradeService.class); + + whenNew(UpgradeService.class).withAnyArguments().thenReturn(mockService); + when(mockService.upgradePreCheck(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<UpgradePreCheckOutput>> results = appcProviderLcm.upgradePreCheck(mockInput); + verify(mockService, times(1)).upgradePreCheck(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + + @Test + public void testUpgradePostCheck() throws Exception { + UpgradePostCheckInput mockInput = mock(UpgradePostCheckInput.class); + UpgradePostCheckOutput mockOutput = mock(UpgradePostCheckOutput.class); + UpgradePostCheckOutputBuilder mockOutputBuilder = mock(UpgradePostCheckOutputBuilder.class); + UpgradeService mockService = mock(UpgradeService.class); + + whenNew(UpgradeService.class).withAnyArguments().thenReturn(mockService); + when(mockService.upgradePostCheck(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<UpgradePostCheckOutput>> results = appcProviderLcm.upgradePostCheck(mockInput); + verify(mockService, times(1)).upgradePostCheck(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testUpgradeSoftware() throws Exception { + UpgradeSoftwareInput mockInput = mock(UpgradeSoftwareInput.class); + UpgradeSoftwareOutput mockOutput = mock(UpgradeSoftwareOutput.class); + UpgradeSoftwareOutputBuilder mockOutputBuilder = mock(UpgradeSoftwareOutputBuilder.class); + UpgradeService mockService = mock(UpgradeService.class); + + whenNew(UpgradeService.class).withAnyArguments().thenReturn(mockService); + when(mockService.upgradeSoftware(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<UpgradeSoftwareOutput>> results = appcProviderLcm.upgradeSoftware(mockInput); + verify(mockService, times(1)).upgradeSoftware(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testUpgradeBackup() throws Exception { + UpgradeBackupInput mockInput = mock(UpgradeBackupInput.class); + UpgradeBackupOutput mockOutput = mock(UpgradeBackupOutput.class); + UpgradeBackupOutputBuilder mockOutputBuilder = mock(UpgradeBackupOutputBuilder.class); + UpgradeService mockService = mock(UpgradeService.class); + + whenNew(UpgradeService.class).withAnyArguments().thenReturn(mockService); + when(mockService.upgradeBackup(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<UpgradeBackupOutput>> results = appcProviderLcm.upgradeBackup(mockInput); + verify(mockService, times(1)).upgradeBackup(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + + @Test + public void testUpgradeBackout() throws Exception { + UpgradeBackoutInput mockInput = mock(UpgradeBackoutInput.class); + UpgradeBackoutOutput mockOutput = mock(UpgradeBackoutOutput.class); + UpgradeBackoutOutputBuilder mockOutputBuilder = mock(UpgradeBackoutOutputBuilder.class); + UpgradeService mockService = mock(UpgradeService.class); + + whenNew(UpgradeService.class).withAnyArguments().thenReturn(mockService); + when(mockService.upgradeBackout(mockInput)).thenReturn(mockOutputBuilder); + when(mockOutputBuilder.build()).thenReturn(mockOutput); + + Future<RpcResult<UpgradeBackoutOutput>> results = appcProviderLcm.upgradeBackout(mockInput); + verify(mockService, times(1)).upgradeBackout(mockInput); + Assert.assertEquals("Should return mockOutput", mockOutput, results.get().getResult()); + } + @After public void tearDown() throws Exception { if (appcProviderLcm != null) { @@ -1098,6 +1312,7 @@ public class AppcProviderLcmTest extends AbstractDataBrokerTest { } } + private ActionIdentifiers newActionIdentifier(String vnfId, String vnfcId, String vserverId) { ActionIdentifiersBuilder actionIdentifiersBuilder = new ActionIdentifiersBuilder(); actionIdentifiersBuilder.setVnfId(vnfId); @@ -1115,4 +1330,4 @@ public class AppcProviderLcmTest extends AbstractDataBrokerTest { "Z")); return commonHeaderBuilder.build(); } -}
\ No newline at end of file +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/AbstractBaseServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/AbstractBaseServiceTest.java new file mode 100644 index 000000000..012b840bb --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/AbstractBaseServiceTest.java @@ -0,0 +1,212 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ZULU; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.executor.objects.Params; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.reflect.Whitebox; + +import java.util.EnumSet; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; + +public class AbstractBaseServiceTest { + private Action expectedAction = Action.Query; + private String rpcName = expectedAction.name().toLowerCase(); + + private CommonHeader commonHeader = mock(CommonHeader.class); + private ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + private testAbc testAbstractBaseService; + + class testAbc extends AbstractBaseService { + public testAbc() { + super(AbstractBaseServiceTest.this.expectedAction); + } + } + + @Before + public void setUp() throws Exception { + testAbstractBaseService = spy(new testAbc()); + } + + @Test + public void testConstructor() throws Exception { + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) Whitebox.getInternalState(testAbstractBaseService, "expectedAction")); + Assert.assertEquals("Should have action-status RPC name", rpcName, + (Whitebox.getInternalState(testAbstractBaseService, "rpcName")).toString()); + } + + @Test + public void testValidateInput() throws Exception { + // test commonHeader error + Status status = testAbstractBaseService.validateInput(commonHeader, Action.Query, null); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(commonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(commonHeader).getApiVer(); + Mockito.doReturn("originator Id").when(commonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(commonHeader).getRequestId(); + + // test invalid action + status = testAbstractBaseService.validateInput(commonHeader, Action.AttachVolume, null); + Assert.assertEquals("Should return invalid parameter for action", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test null actionIdentifier + status = testAbstractBaseService.validateInput(commonHeader, Action.Query, null); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test validation passed + status = testAbstractBaseService.validateInput(commonHeader, Action.Query, mockAI); + Assert.assertTrue("Should have null status", status == null); + } + + @Test + public void testValidateVnfId() throws Exception { + // Skip test input validation, as it is all done in testValidateInput + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(commonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(commonHeader).getApiVer(); + Mockito.doReturn("originator Id").when(commonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(commonHeader).getRequestId(); + + // test null VNF ID + Status status = testAbstractBaseService.validateVnfId(commonHeader, Action.Query, mockAI); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty VNF_ID + Mockito.doReturn("").when(mockAI).getVnfId(); + status = testAbstractBaseService.validateVnfId(commonHeader, Action.Query, mockAI); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test calling validateExcludeActId + Mockito.doReturn("vnfId").when(mockAI).getVnfId(); + status = testAbstractBaseService.validateVnfId(commonHeader, Action.Query, mockAI); + Assert.assertTrue("Should have null status", status == null); + } + + @Test + public void testValidateVserverId() throws Exception { + // Skip test input validation, as it is all done in testValidateInput + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(commonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(commonHeader).getApiVer(); + Mockito.doReturn("originator Id").when(commonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(commonHeader).getRequestId(); + + // test null VNF ID + Status status = testAbstractBaseService.validateVserverId(commonHeader, Action.Query, mockAI); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty VNF_ID + Mockito.doReturn("").when(mockAI).getVserverId(); + status = testAbstractBaseService.validateVserverId(commonHeader, Action.Query, mockAI); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test calling validateExcludeActId + Mockito.doReturn("vserverId").when(mockAI).getVserverId(); + status = testAbstractBaseService.validateVserverId(commonHeader, Action.Query, mockAI); + Assert.assertTrue("Should have null status", status == null); + } + + @Test + public void testValidateExcludedActIds() throws Exception { + EnumSet<AbstractBaseService.ACTID_KEYS> exclutionKeys = EnumSet.of(AbstractBaseService.ACTID_KEYS.VNF_ID); + Status status = testAbstractBaseService.validateExcludedActIds(mockAI, exclutionKeys); + Assert.assertTrue("Should have not error", status == null); + + Integer expectedErrorCode = Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()); + Mockito.doReturn("vnfc name").when(mockAI).getVnfcName(); + status = testAbstractBaseService.validateExcludedActIds(mockAI, exclutionKeys); + Assert.assertEquals("Should have error for vnfc name", expectedErrorCode, status.getCode()); + + Mockito.doReturn(null).when(mockAI).getVnfcName(); + Mockito.doReturn("vserver Id").when(mockAI).getVserverId(); + status = testAbstractBaseService.validateExcludedActIds(mockAI, exclutionKeys); + Assert.assertEquals("Should have error for vserver Id", expectedErrorCode, status.getCode()); + + Mockito.doReturn(null).when(mockAI).getVserverId(); + Mockito.doReturn("vf module Id").when(mockAI).getVfModuleId(); + status = testAbstractBaseService.validateExcludedActIds(mockAI, exclutionKeys); + Assert.assertEquals("Should have error for vf module Id", expectedErrorCode, status.getCode()); + + Mockito.doReturn(null).when(mockAI).getServiceInstanceId(); + Mockito.doReturn("service instance Id").when(mockAI).getServiceInstanceId(); + status = testAbstractBaseService.validateExcludedActIds(mockAI, exclutionKeys); + Assert.assertEquals("Should have error for service instance Id", expectedErrorCode, status.getCode()); + + Mockito.doReturn("vnfc name").when(mockAI).getVnfcName(); + Mockito.doReturn("vserver Id").when(mockAI).getVserverId(); + Mockito.doReturn("vf module Id").when(mockAI).getVfModuleId(); + Mockito.doReturn("vnf Id").when(mockAI).getVnfId(); + status = testAbstractBaseService.validateExcludedActIds(mockAI, exclutionKeys); + Assert.assertEquals("Should have error code", expectedErrorCode, status.getCode()); + Assert.assertEquals("Should have error message", + LCMCommandStatus.INVALID_INPUT_PARAMETER.getFormattedMessage(getMsgParams(exclutionKeys)), + status.getMessage()); + } + + @Test + public void testExecuteAction() throws Exception { + RequestHandlerOutput output = testAbstractBaseService.executeAction(null); + Assert.assertTrue("Should return null RequestHandlerOutput", output == null); + Status status = Whitebox.getInternalState(testAbstractBaseService, "status"); + Assert.assertEquals("Should have error code", + Integer.valueOf(LCMCommandStatus.UNEXPECTED_ERROR.getResponseCode()), status.getCode()); + } + + private Params getMsgParams(EnumSet<AbstractBaseService.ACTID_KEYS> exclutionKeys) { + StringBuilder msgBuilder = new StringBuilder(); + for (QueryService.ACTID_KEYS aKey : AbstractBaseService.ACTID_KEYS.values()) { + if (exclutionKeys.contains(aKey)) { + continue; + } + msgBuilder.append(aKey.getKeyName()).append(testAbstractBaseService.DELIMITER_COMMA); + } + String msg = msgBuilder.toString(); + return new Params().addParam("errorMsg", msg.substring(0, msg.length() -1)); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/AbstractBaseUtilsTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/AbstractBaseUtilsTest.java new file mode 100644 index 000000000..c5322886c --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/AbstractBaseUtilsTest.java @@ -0,0 +1,204 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.executor.objects.Params; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; + +import java.text.ParseException; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class AbstractBaseUtilsTest { + + private AbstractBaseUtilsTest.testAbc testAbstractBaseUtils; + + class testAbc extends AbstractBaseUtils { + // no content needed + } + + @Before + public void setUp() throws Exception { + testAbstractBaseUtils = spy(new AbstractBaseUtilsTest.testAbc()); + } + + private void validateStatusResult(Params params, LCMCommandStatus lcmCommandStatus, Status status) { + Assert.assertEquals(String.format("Should return proper code of %s", lcmCommandStatus.toString()), + Integer.valueOf(lcmCommandStatus.getResponseCode()), status.getCode()); + Assert.assertEquals(String.format("Should return proper message of $s", lcmCommandStatus.toString()), + lcmCommandStatus.getFormattedMessage(params), status.getMessage()); + } + + @Test + public void testBuildStatusWithoutParams() throws Exception { + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.ACCEPTED; + Status status = testAbstractBaseUtils.buildStatusWithoutParams(lcmCommandStatus); + validateStatusResult(null, lcmCommandStatus, status); + } + + @Test + public void testBuildStatusForErrorMsg() throws Exception { + String key = "errorMsg"; + String msg = "testing"; + Params params = new Params().addParam(key, msg); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.INVALID_INPUT_PARAMETER; + Status status = testAbstractBaseUtils.buildStatusForErrorMsg(lcmCommandStatus, msg); + verify(testAbstractBaseUtils, times(1)).buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + } + + + @Test + public void testBuildStatusForVnfId() throws Exception { + String key = "vnfId"; + String msg = "testing"; + Params params = new Params().addParam(key, msg); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.VNF_NOT_FOUND; + Status status = testAbstractBaseUtils.buildStatusForVnfId(lcmCommandStatus, msg); + verify(testAbstractBaseUtils, times(1)).buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + } + + @Test + public void testBuildStatusForParamName() throws Exception { + String key = "paramName"; + String msg = "testing"; + Params params = new Params().addParam(key, msg); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.MISSING_MANDATORY_PARAMETER; + Status status = testAbstractBaseUtils.buildStatusForParamName(lcmCommandStatus, msg); + verify(testAbstractBaseUtils, times(1)).buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + } + + @Test + public void testBuildStatusForId() throws Exception { + String key = "id"; + String msg = "testing"; + Params params = new Params().addParam(key, msg); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.VSERVER_NOT_FOUND; + Status status = testAbstractBaseUtils.buildStatusForId(lcmCommandStatus, msg); + verify(testAbstractBaseUtils, times(1)).buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + } + + @Test + public void testBuildStatus() throws Exception { + String key = "errorMsg"; + String msg = "testing"; + Params params = new Params().addParam(key, msg); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.UNEXPECTED_ERROR; + Status status = testAbstractBaseUtils.buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + + key = "vnfId"; + params = new Params().addParam(key, msg); + lcmCommandStatus = LCMCommandStatus.VNF_NOT_FOUND; + status = testAbstractBaseUtils.buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + + key = "paramName"; + params = new Params().addParam(key, msg); + lcmCommandStatus = LCMCommandStatus.MISSING_MANDATORY_PARAMETER; + status = testAbstractBaseUtils.buildStatus(lcmCommandStatus, msg, key); + validateStatusResult(params, lcmCommandStatus, status); + } + + @Test + public void testBuildStatusWithParseException() throws Exception { + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.REQUEST_PARSING_FAILED; + String key = "errorMsg"; + String exceptionMsg = null; + + ParseException parseException = new ParseException(exceptionMsg, 0); + Params params = new Params().addParam(key, parseException.toString()); + Status status = testAbstractBaseUtils.buildStatusWithParseException(parseException); + validateStatusResult(params, lcmCommandStatus, status); + + exceptionMsg = "testing message"; + parseException = new ParseException(exceptionMsg, 0); + params = new Params().addParam(key, exceptionMsg); + status = testAbstractBaseUtils.buildStatusWithParseException(parseException); + validateStatusResult(params, lcmCommandStatus, status); + } + + @Test + public void testBuildStatusWithDispatcherOutput() throws Exception { + RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); + + ResponseContext mockContext = mock(ResponseContext.class); + Mockito.doReturn(mockContext).when(mockOutput).getResponseContext(); + + org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); + Mockito.doReturn(mockStatus).when(mockContext).getStatus(); + + Integer resultCode = new Integer(401); + String resultMsg = "testing result message"; + Mockito.doReturn(resultCode).when(mockStatus).getCode(); + Mockito.doReturn(resultMsg).when(mockStatus).getMessage(); + + Status status = testAbstractBaseUtils.buildStatusWithDispatcherOutput(mockOutput); + Assert.assertEquals("Should return result code", resultCode, status.getCode()); + Assert.assertEquals("Should return result message", resultMsg, status.getMessage()); + } + + @Test + public void testGetRpcName() throws Exception { + Assert.assertEquals("Should return action-status", + "action-status", testAbstractBaseUtils.getRpcName(Action.ActionStatus)); + Assert.assertEquals("Should return query", + "query", testAbstractBaseUtils.getRpcName(Action.Query)); + Assert.assertEquals("Should return reboot", + "reboot", testAbstractBaseUtils.getRpcName(Action.Reboot)); + Assert.assertEquals("Should return attach-volume", + "attach-volume", testAbstractBaseUtils.getRpcName(Action.AttachVolume)); + Assert.assertEquals("Should return detach-volume", + "detach-volume", testAbstractBaseUtils.getRpcName(Action.DetachVolume)); + Assert.assertEquals("Should return quiesce-traffic", + "quiesce-traffic", testAbstractBaseUtils.getRpcName(Action.QuiesceTraffic)); + Assert.assertEquals("Should return resume-traffic", + "resume-traffic", testAbstractBaseUtils.getRpcName(Action.ResumeTraffic)); + Assert.assertEquals("Should return upgrade-pre-check", + "upgrade-pre-check", testAbstractBaseUtils.getRpcName(Action.UpgradePreCheck)); + Assert.assertEquals("Should return upgrade-post-check", + "upgrade-post-check", testAbstractBaseUtils.getRpcName(Action.UpgradePostCheck)); + Assert.assertEquals("Should return upgrade-software", + "upgrade-software", testAbstractBaseUtils.getRpcName(Action.UpgradeSoftware)); + Assert.assertEquals("Should return upgrade-backup", + "upgrade-backup", testAbstractBaseUtils.getRpcName(Action.UpgradeBackup)); + Assert.assertEquals("Should return upgrade-backout", + "upgrade-backout", testAbstractBaseUtils.getRpcName(Action.UpgradeBackout)); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/ActionStatusServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/ActionStatusServiceTest.java new file mode 100644 index 000000000..66fffeac7 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/ActionStatusServiceTest.java @@ -0,0 +1,197 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ZULU; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.onap.appc.domainmodel.lcm.ActionLevel; +import org.onap.appc.domainmodel.lcm.RequestContext; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.domainmodel.lcm.Status; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.provider.lcm.util.RequestInputBuilder; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.text.ParseException; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.whenNew; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ActionStatusService.class, RequestExecutor.class, RequestInputBuilder.class,}) +public class ActionStatusServiceTest { + private RequestHandlerInput mockRequestHandlerInput = mock(RequestHandlerInput.class); + private RequestContext mockRequestContext = mock(RequestContext.class); + private RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); + private ResponseContext mockResponseContext = mock(ResponseContext.class); + + private ActionStatusService actionStatusService; + + @Before + public void setUp() throws Exception { + Mockito.doReturn(mockRequestContext).when(mockRequestHandlerInput).getRequestContext(); + actionStatusService = spy(new ActionStatusService()); + } + + @Test + public void testConstructor() throws Exception { + Assert.assertEquals("Should have proper ACTION", Action.ActionStatus, + (Action) Whitebox.getInternalState(actionStatusService, "expectedAction")); + Assert.assertEquals("Should have action-status RPC name", "action-status", + (Whitebox.getInternalState(actionStatusService, "rpcName")).toString()); + } + + @Test + public void testQueryStatus() throws Exception { + // =========== test input validation ============ + CommonHeader mockCommonHeader = mock(CommonHeader.class); + ActionStatusInput mockInput = mock(ActionStatusInput.class); + + Mockito.doReturn(mockCommonHeader).when(mockInput).getCommonHeader(); + // test commonHeader error + ActionStatusOutputBuilder output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); + Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("originator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + // test invalid action + Mockito.doReturn(Action.Query).when(mockInput).getAction(); + output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("Should return invalid parameter for action", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + // test null actionIdentifier + Mockito.doReturn(Action.ActionStatus).when(mockInput).getAction(); + output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + // test missing VNF ID + ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + Mockito.doReturn(mockAI).when(mockInput).getActionIdentifiers(); + output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + // test invalid VNF ID + Mockito.doReturn("").when(mockAI).getVnfId(); + output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("Should return invalid parameter for action", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + // test null payload + Mockito.doReturn("test VNF ID").when(mockAI).getVnfId(); + output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + // test payload with empty string + Payload mockPayload = mock(Payload.class); + Mockito.doReturn(mockPayload).when(mockInput).getPayload(); + output = actionStatusService.queryStatus(mockInput); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), + output.getStatus().getCode()); + + // test validation passed + Mockito.doReturn("testing payload").when(mockPayload).getValue(); + + // =========== test success ============ + RequestExecutor mockExecutor = mock(RequestExecutor.class); + whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); + Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); + Mockito.doReturn(mockPayload).when(mockExecutor).getPayload(mockOutput); + + Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); + + Integer statusCode = 400; + Status mockStatus = mock(Status.class); + Mockito.doReturn(statusCode).when(mockStatus).getCode(); + Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); + + output = actionStatusService.queryStatus(mockInput); + Mockito.verify(actionStatusService, times(1)).buildStatusWithDispatcherOutput(mockOutput); + Mockito.verify(mockExecutor, times(1)).getPayload(mockOutput); + Assert.assertTrue("Should have payload", output.getPayload() != null); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("Should return proper code", statusCode, output.getStatus().getCode()); + + // =========== test parserException ============ + RequestInputBuilder mockInputBuilder = mock(RequestInputBuilder.class); + whenNew(RequestInputBuilder.class).withNoArguments().thenReturn(mockInputBuilder); + Mockito.doReturn(mockInputBuilder).when(mockInputBuilder).requestContext(); + ParseException parserException = new ParseException("testing exception", 0); + Mockito.doThrow(parserException).when(mockInputBuilder).commonHeader(mockCommonHeader); + + output = actionStatusService.queryStatus(mockInput); + Mockito.verify(actionStatusService, times(1)).buildStatusWithParseException(parserException); + Assert.assertEquals("Should have commonHeader", mockCommonHeader, output.getCommonHeader()); + Assert.assertEquals("Should return request failed", + Integer.valueOf(LCMCommandStatus.REQUEST_PARSING_FAILED.getResponseCode()), + output.getStatus().getCode()); + } + + @Test + public void testUpdateToMgmtActionLevel() throws Exception { + actionStatusService.updateToMgmtActionLevel(mockRequestHandlerInput); + Mockito.verify(mockRequestContext, times(1)).setActionLevel(ActionLevel.MGMT); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/QueryServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/QueryServiceTest.java new file mode 100644 index 000000000..be3370fd9 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/QueryServiceTest.java @@ -0,0 +1,175 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.internal.util.reflection.Whitebox; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ZULU; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.query.output.QueryResults; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({QueryService.class, RequestExecutor.class}) +public class QueryServiceTest { + private final Action myAction = Action.Query; + + private QueryInput mockInput = mock(QueryInput.class); + private CommonHeader mockCommonHeader = mock(CommonHeader.class); + private ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + + private QueryService queryService; + + @Before + public void setUp() throws Exception { + queryService = spy(new QueryService()); + + Mockito.doReturn(mockCommonHeader).when(mockInput).getCommonHeader(); + } + + @Test + public void testConstructor() throws Exception { + Assert.assertEquals("Should have proper ACTION", myAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(queryService, "expectedAction")); + Assert.assertEquals("Should have query RPC name", myAction.name().toLowerCase(), + (org.powermock.reflect.Whitebox.getInternalState(queryService, "rpcName")).toString()); + } + + @Test + public void testProcess() throws Exception { + // test error occurs in validation + QueryOutputBuilder queryOutputBuilder = queryService.process(mockInput); + Mockito.verify(queryService, times(0)).proceedAction(mockInput); + Assert.assertTrue("Should have commonHeader",queryOutputBuilder.getCommonHeader() != null); + Assert.assertTrue("Should not have queryResults",queryOutputBuilder.getQueryResults() == null); + Assert.assertEquals("should return missing parameter status", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), + queryOutputBuilder.getStatus().getCode()); + + // to make validation pass + ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); + Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + Mockito.doReturn(myAction).when(mockInput).getAction(); + Mockito.doReturn(mockAI).when(mockInput).getActionIdentifiers(); + Mockito.doReturn("vnfId").when(mockAI).getVnfId(); + + // test processAction return with error + queryOutputBuilder = queryService.process(mockInput); + Mockito.verify(queryService, times(1)).proceedAction(mockInput); + Assert.assertTrue("Should have commonHeader",queryOutputBuilder.getCommonHeader() != null); + Assert.assertTrue("Should not have queryResults",queryOutputBuilder.getQueryResults() == null); + Assert.assertEquals("should return rejected status", + Integer.valueOf(LCMCommandStatus.REJECTED.getResponseCode()), + queryOutputBuilder.getStatus().getCode()); + + // test processAction return without error + RequestExecutor mockExecutor = mock(RequestExecutor.class); + whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); + + RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); + Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); + + ResponseContext mockResponseContext = mock(ResponseContext.class); + Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); + + List<QueryResults> results = new ArrayList<>(); + QueryResults mockResult = mock(QueryResults.class); + results.add(mockResult); + Mockito.doReturn(results).when(mockResponseContext).getPayloadObject(); + + org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); + Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); + Mockito.doReturn(successCode).when(mockStatus).getCode(); + Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); + + queryOutputBuilder = queryService.process(mockInput); + Assert.assertTrue("Should have commonHeader",queryOutputBuilder.getCommonHeader() != null); + Assert.assertEquals("Should have queryResults", results, queryOutputBuilder.getQueryResults()); + Assert.assertEquals("should return success status", successCode, queryOutputBuilder.getStatus().getCode()); + } + + @Test + public void testValidate() throws Exception { + // test commonHeader error + queryService.validate(mockInput); + Status status = (Status) Whitebox.getInternalState(queryService, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + Mockito.verify(queryService, times(0)).buildStatusForParamName(any(), any()); + Mockito.verify(queryService, times(0)).buildStatusForErrorMsg(any(), any()); + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + // test empty ActionIdentifier + Mockito.doReturn(mockAI).when(mockInput).getActionIdentifiers(); + Mockito.doReturn(myAction).when(mockInput).getAction(); + queryService.validate(mockInput); + status = (Status) Whitebox.getInternalState(queryService, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty VNF_ID + Mockito.doReturn("").when(mockAI).getVnfId(); + queryService.validate(mockInput); + status = (Status) Whitebox.getInternalState(queryService, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test calling validateExcludeActId + Mockito.doReturn("vnfId").when(mockAI).getVnfId(); + queryService.validate(mockInput); + Mockito.verify(queryService, times(1)).validateExcludedActIds(any(), any()); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/QuiesceTrafficServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/QuiesceTrafficServiceTest.java new file mode 100644 index 000000000..b6dc15ce3 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/QuiesceTrafficServiceTest.java @@ -0,0 +1,186 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.internal.util.reflection.Whitebox; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({QuiesceTrafficService.class, RequestExecutor.class}) +public class QuiesceTrafficServiceTest { + private final Action myAction = Action.QuiesceTraffic; + private final String PAYLOAD_STRING = "{\"A\":\"A-value\",\"B\":{\"C\":\"B.C-value\",\"D\":\"B.D-value\"}}"; + private QuiesceTrafficInput mockInput = mock(QuiesceTrafficInput.class); + private CommonHeader mockCommonHeader = mock(CommonHeader.class); + private ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + private Payload mockPayload = mock(Payload.class); + + private QuiesceTrafficService quiesceServiceAction; + @Before + public void setUp() throws Exception { + quiesceServiceAction = spy(new QuiesceTrafficService()); + } + + + @Test + public void testConstructor() throws Exception { + Action expectedAction = Action.QuiesceTraffic; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(quiesceServiceAction, "expectedAction")); + Assert.assertEquals("Should have quiesce-traffic RPC name", "quiesce-traffic", + (org.powermock.reflect.Whitebox.getInternalState(quiesceServiceAction, "rpcName")).toString()); + } + +// @Test +// public void testProcess() throws Exception { +// // test error occurs in validation +// QuiesceTrafficOutputBuilder outputBuilder = quiesceServiceAction.process(mockInput); +// Mockito.verify(quiesceServiceAction, times(0)).proceedAction(any(),any(),any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it",outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// // to make validation pass +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(myAction).when(mockInput).getAction(); +// Mockito.doReturn(mockAI).when(mockInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test processAction return with error +// outputBuilder = quiesceServiceAction.process(mockInput); +// Mockito.verify(quiesceServiceAction, times(1)).proceedAction(any(),any(),any()); +// Assert.assertTrue("Should have commonHeader",outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(LCMCommandStatus.REJECTED.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // test processAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = quiesceServiceAction.process(mockInput); +// Assert.assertTrue("Should have commonHeader",outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", successCode, outputBuilder.getStatus().getCode()); +// } + + @Test + public void testValidate() throws Exception { + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI,mockPayload); + Status status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + Mockito.verify(quiesceServiceAction, times(0)).buildStatusForParamName(any(), any()); + Mockito.verify(quiesceServiceAction, times(0)).buildStatusForErrorMsg(any(), any()); + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + // test empty action + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI,mockPayload); + status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("Should return missing parameter for action", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty ActionIdentifier + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI,mockPayload); + status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test Invalid VNF_ID + Mockito.doReturn("").when(mockAI).getVnfId(); + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI,mockPayload); + status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test null payload + Mockito.doReturn("vnfId").when(mockAI).getVnfId(); + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI, null); + Mockito.verify(quiesceServiceAction, times(1)).validateExcludedActIds(any(), any()); + status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty payload + + Mockito.doReturn("").when(mockPayload).getValue(); + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test space payload + Mockito.doReturn(" ").when(mockPayload).getValue(); + quiesceServiceAction.validate(mockCommonHeader, Action.QuiesceTraffic, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(quiesceServiceAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/RebootServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/RebootServiceTest.java new file mode 100644 index 000000000..fffebf944 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/RebootServiceTest.java @@ -0,0 +1,153 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ZULU; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import static org.mockito.Mockito.times; + +@RunWith(PowerMockRunner.class) +public class RebootServiceTest { + private final String vserverId = "vserverId"; + + @Mock + private RebootService rebootService; + @Mock + private RebootInput rebootInput; + @Mock + private ActionIdentifiers actionIdentifiers; + @Mock + private org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader commonHeader; + + private Payload payload; + + @Before + public void setUp() throws Exception { + rebootService = new RebootService(); + payload = new Payload("{\"reboot-type\":\"hard\"}"); + + PowerMockito.doReturn(actionIdentifiers).when(rebootInput).getActionIdentifiers(); + PowerMockito.doReturn(payload).when(rebootInput).getPayload(); + PowerMockito.doReturn(commonHeader).when(rebootInput).getCommonHeader(); + PowerMockito.doReturn(new ZULU("2017-09-05T16:55:55.807Z")).when(commonHeader).getTimestamp(); + PowerMockito.doReturn("2.00").when(commonHeader).getApiVer(); + PowerMockito.doReturn("demo-lcm-stop-id#1").when(commonHeader).getRequestId(); + PowerMockito.doReturn("demo-lcm-stop-id#2").when(commonHeader).getSubRequestId(); + PowerMockito.doReturn("originator-id").when(commonHeader).getOriginatorId(); + PowerMockito.doReturn(Action.Reboot).when(rebootInput).getAction(); + } + + @Test + public void testConstructor() throws Exception { + Action expectedAction = Action.Reboot; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(rebootService, "expectedAction")); + Assert.assertEquals("Should have reboot RPC name", expectedAction.name().toLowerCase(), + (org.powermock.reflect.Whitebox.getInternalState(rebootService, "rpcName")).toString()); + } + + @Test + public void testProcessAccepted() throws Exception { + PowerMockito.doReturn(vserverId).when(actionIdentifiers).getVserverId(); + RebootOutputBuilder process = rebootService.process(rebootInput); + PowerMockito.verifyPrivate(rebootService, times(1)).invoke("validate", rebootInput); + Assert.assertNotNull(process.getCommonHeader()); + Assert.assertNotNull(process.getStatus()); + } + + @Test + public void testProcessError() throws Exception { + RebootOutputBuilder process = rebootService.process(rebootInput); + PowerMockito.verifyPrivate(rebootService, times(1)) + .invoke("validate", rebootInput); + Assert.assertNotNull(process.getStatus()); + } + + @Test + public void testValidateSuccess() throws Exception { + PowerMockito.doReturn(vserverId).when(actionIdentifiers).getVserverId(); + Status validate = Whitebox.invokeMethod(rebootService, "validate", rebootInput); + Assert.assertNull(validate); + } + + @Test + public void testValidateMissingVserverId() throws Exception { + PowerMockito.doReturn("").when(actionIdentifiers).getVserverId(); + Whitebox.invokeMethod(rebootService, "validate", rebootInput); + Status status = Whitebox.getInternalState(rebootService, "status"); + Assert.assertNotNull(status); + } + + @Test + public void testValidateWrongAction() throws Exception { + PowerMockito.doReturn(Action.Audit).when(rebootInput).getAction(); + PowerMockito.doReturn("").when(actionIdentifiers).getVserverId(); + Whitebox.invokeMethod(rebootService, "validate", rebootInput); + Status status = Whitebox.getInternalState(rebootService, "status"); + Assert.assertNotNull(status); + } + + @Test + public void testValidateMissingActionIdentifier() throws Exception { + PowerMockito.doReturn(actionIdentifiers).when(rebootInput).getActionIdentifiers(); + Whitebox.invokeMethod(rebootService, "validate", rebootInput); + Status status = Whitebox.getInternalState(rebootService, "status"); + Assert.assertNotNull(status); + } + + @Test + public void testValidateMissingRebootType() throws Exception { + Payload payload = new Payload("{}"); + PowerMockito.doReturn(payload).when(rebootInput).getPayload(); + PowerMockito.doReturn(vserverId).when(actionIdentifiers).getVserverId(); + Whitebox.invokeMethod(rebootService, "validate", rebootInput); + Status status = Whitebox.getInternalState(rebootService, "status"); + Assert.assertNotNull(status); + } + + @Test + public void testValidateWrongRebootType() throws Exception { + Payload payload = new Payload("{\"reboot-type\":\"1\"}"); + PowerMockito.doReturn(payload).when(rebootInput).getPayload(); + PowerMockito.doReturn(vserverId).when(actionIdentifiers).getVserverId(); + Whitebox.invokeMethod(rebootService, "validate", rebootInput); + Status status = Whitebox.getInternalState(rebootService, "status"); + Assert.assertNotNull(status); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/RequestExecutorTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/RequestExecutorTest.java new file mode 100644 index 000000000..a2001809e --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/RequestExecutorTest.java @@ -0,0 +1,252 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.onap.appc.domainmodel.lcm.ActionLevel; +import org.onap.appc.domainmodel.lcm.CommonHeader; +import org.onap.appc.domainmodel.lcm.RequestContext; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.domainmodel.lcm.Status; +import org.onap.appc.domainmodel.lcm.VNFOperation; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.executor.objects.Params; +import org.onap.appc.i18n.Msg; +import org.onap.appc.requesthandler.RequestHandler; +import org.onap.appc.requesthandler.objects.RequestHandlerInput; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.Collection; +import java.util.Iterator; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({FrameworkUtil.class}) +public class RequestExecutorTest { + private final VNFOperation vnfOperation = VNFOperation.ActionStatus; + private final ActionLevel actionLevel = ActionLevel.MGMT; + + private Bundle mockBundle = mock(Bundle.class); + private BundleContext mockBundleContext = mock(BundleContext.class); + + private RequestHandlerInput mockInput = mock(RequestHandlerInput.class); + private RequestContext mockRequestContext = mock(RequestContext.class); + private CommonHeader mockCommonHeader = mock(CommonHeader.class); + private RequestHandler mockHandler = mock(RequestHandler.class); + + private RequestExecutor requestExecutor; + + @Before + public void setUp() throws Exception { + mockStatic(FrameworkUtil.class); + PowerMockito.when(FrameworkUtil.getBundle(any())).thenReturn(mockBundle); + + Mockito.doReturn(mockRequestContext).when(mockInput).getRequestContext(); + Mockito.doReturn(mockCommonHeader).when(mockRequestContext).getCommonHeader(); + + requestExecutor = spy(new RequestExecutor()); + } + + @Test + public void testExecuteRequest() throws Exception { + // test RequestHandler is null + Mockito.doReturn(null).when(mockBundle).getBundleContext(); + Mockito.doReturn(actionLevel).when(mockRequestContext).getActionLevel(); + Mockito.doReturn(vnfOperation).when(mockRequestContext).getAction(); + + Params params = new Params().addParam("errorMsg", requestExecutor.CANNOT_PROCESS); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.REJECTED; + Msg msg = Msg.REQUEST_HANDLER_UNAVAILABLE; + + RequestHandlerOutput output = requestExecutor.executeRequest(mockInput); + ResponseContext responseContext = output.getResponseContext(); + Status status = responseContext.getStatus(); + Assert.assertEquals("Should have rejected status code", + lcmCommandStatus.getResponseCode(), status.getCode()); + Assert.assertEquals("Should have rejected CANNOT_PROCESS status message", + lcmCommandStatus.getFormattedMessage(params), status.getMessage()); + Assert.assertEquals("Should have the same commonHeader", + mockCommonHeader, responseContext.getCommonHeader()); + Mockito.verify(requestExecutor, times(1)).getRequestHandler(any()); + Mockito.verify(requestExecutor, times(1)) + .createRequestHandlerOutput(any(), any(), any(), any()); + + // to get RequestHandler + ServiceReference<RequestHandler> mockSvcRefs = mock(ServiceReference.class); + Iterator mockIterator = mock(Iterator.class); + Mockito.doReturn(mockSvcRefs).when(mockIterator).next(); + + Collection<ServiceReference<RequestHandler>> mockSvcRefCollection = mock(Collection.class); + Mockito.doReturn(1).when(mockSvcRefCollection).size(); + Mockito.doReturn(mockIterator).when(mockSvcRefCollection).iterator(); + + Mockito.doReturn(mockBundleContext).when(mockBundle).getBundleContext(); + Mockito.doReturn(mockSvcRefCollection).when(mockBundleContext) + .getServiceReferences(eq(RequestHandler.class), anyString()); + + Mockito.doReturn(mockHandler).when(mockBundleContext).getService(mockSvcRefs); + + // Skip test RequestHandler.quiesce throws exception as it does not throw exception + + // test normal return + RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); + Mockito.doReturn(mockOutput).when(mockHandler).handleRequest(mockInput); + output = requestExecutor.executeRequest(mockInput); + Assert.assertEquals("Should return mockOuput", mockOutput, output); + } + + @Test + public void testGetRequestHandler() throws Exception { + // test null BundleContext + Mockito.doReturn(null).when(mockBundle).getBundleContext(); + RequestHandler requestHandler = requestExecutor.getRequestHandler(actionLevel); + Assert.assertTrue("Should return null", requestHandler == null); + + // test successful returning RequestHandler + ServiceReference<RequestHandler> mockSvcRefs = mock(ServiceReference.class); + Iterator mockIterator = mock(Iterator.class); + Mockito.doReturn(mockSvcRefs).when(mockIterator).next(); + + Collection<ServiceReference<RequestHandler>> mockSvcRefCollection = mock(Collection.class); + Mockito.doReturn(1).when(mockSvcRefCollection).size(); + Mockito.doReturn(mockIterator).when(mockSvcRefCollection).iterator(); + + Mockito.doReturn(mockBundleContext).when(mockBundle).getBundleContext(); + Mockito.doReturn(mockSvcRefCollection).when(mockBundleContext) + .getServiceReferences(eq(RequestHandler.class), anyString()); + + Mockito.doReturn(mockHandler).when(mockBundleContext).getService(mockSvcRefs); + + requestHandler = requestExecutor.getRequestHandler(actionLevel); + Assert.assertEquals("Should return RequestHandler", mockHandler, requestHandler); + } + + @Test(expected = RuntimeException.class) + public void testGetRequesetHandlerWithInvalidSyntaxException() throws Exception { + Mockito.doReturn(mockBundleContext).when(mockBundle).getBundleContext(); + Mockito.doThrow(new InvalidSyntaxException("testing message", "testing filter")) + .when(mockBundleContext).getServiceReferences(eq(RequestHandler.class), anyString()); + + requestExecutor.getRequestHandler(actionLevel); + } + + + @Test(expected = RuntimeException.class) + public void testGetRequesetHandlerWithCannotFoundSvc() throws Exception { + Collection<ServiceReference<RequestHandler>> mockSvcRefCollection = mock(Collection.class); + Mockito.doReturn(2).when(mockSvcRefCollection).size(); + + Mockito.doReturn(mockBundleContext).when(mockBundle).getBundleContext(); + Mockito.doReturn(mockSvcRefCollection).when(mockBundleContext) + .getServiceReferences(eq(RequestHandler.class), anyString()); + + requestExecutor.getRequestHandler(actionLevel); + } + + @Test + public void testCreateRequestHandlerOutput() throws Exception { + // test exception without message + Exception testException = new Exception(); + Params params = new Params().addParam("errorMsg", testException.toString()); + LCMCommandStatus lcmCommandStatus = LCMCommandStatus.REJECTED; + Msg msg = Msg.REQUEST_HANDLER_UNAVAILABLE; + + RequestHandlerOutput output = + requestExecutor.createRequestHandlerOutput(mockInput, lcmCommandStatus, msg, testException); + ResponseContext responseContext = output.getResponseContext(); + Status status = responseContext.getStatus(); + Assert.assertEquals("Should have the same status code", + lcmCommandStatus.getResponseCode(), status.getCode()); + Assert.assertEquals("Should have the proper exception to String status message", + lcmCommandStatus.getFormattedMessage(params), status.getMessage()); + Assert.assertEquals("Should have the same commonHeader", + mockCommonHeader, responseContext.getCommonHeader()); + + // test exception with message + testException = new Exception("testing exception"); + params = new Params().addParam("errorMsg", testException.getMessage()); + lcmCommandStatus = LCMCommandStatus.UNEXPECTED_ERROR; + msg = Msg.EXCEPTION_CALLING_DG; + + output = + requestExecutor.createRequestHandlerOutput(mockInput, lcmCommandStatus, msg, testException); + responseContext = output.getResponseContext(); + status = responseContext.getStatus(); + Assert.assertEquals("Should have the same status code", + lcmCommandStatus.getResponseCode(), status.getCode()); + Assert.assertEquals("Should have the proper exception to String status message", + lcmCommandStatus.getFormattedMessage(params), status.getMessage()); + Assert.assertEquals("Should have the same commonHeader", + mockCommonHeader, responseContext.getCommonHeader()); + } + + @Test + public void testGetPayload() throws Exception { + RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); + ResponseContext mockResponseContext = mock(ResponseContext.class); + // test null response context + Mockito.doReturn(null).when(mockOutput).getResponseContext(); + Assert.assertTrue("Should return null with null requestContext", + requestExecutor.getPayload(mockOutput) == null); + + // test null payload + Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); + Mockito.doReturn(null).when(mockResponseContext).getPayload(); + Assert.assertTrue("Should return null with null payload", + requestExecutor.getPayload(mockOutput) == null); + + // test empty payload + Mockito.doReturn("").when(mockResponseContext).getPayload(); + Assert.assertTrue("Should return null with empty payload", + requestExecutor.getPayload(mockOutput) == null); + + // test proper payload + String testingPayload = "testing payload"; + Mockito.doReturn(testingPayload).when(mockResponseContext).getPayload(); + Payload payload = requestExecutor.getPayload(mockOutput); + Assert.assertEquals("Should return null with empty payload", testingPayload, payload.getValue()); + } + +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/ResumeTrafficServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/ResumeTrafficServiceTest.java new file mode 100644 index 000000000..2ea7ee0d2 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/ResumeTrafficServiceTest.java @@ -0,0 +1,162 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.internal.util.reflection.Whitebox; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ResumeTrafficService.class, RequestExecutor.class}) +public class ResumeTrafficServiceTest { + private final Action myAction = Action.ResumeTraffic; + + private ResumeTrafficInput mockInput = mock(ResumeTrafficInput.class); + private CommonHeader mockCommonHeader = mock(CommonHeader.class); + private ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + + private ResumeTrafficService resumeServiceAction; + @Before + public void setUp() throws Exception { + resumeServiceAction = spy(new ResumeTrafficService()); + } + + + @Test + public void testConstructor() throws Exception { + Action expectedAction = Action.ResumeTraffic; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(resumeServiceAction, "expectedAction")); + Assert.assertEquals("Should have resume-traffic RPC name", "resume-traffic", + (org.powermock.reflect.Whitebox.getInternalState(resumeServiceAction, "rpcName")).toString()); + } + +// @Test +// public void testProcess() throws Exception { +// // test error occurs in validation +// ResumeTrafficOutputBuilder outputBuilder = resumeServiceAction.process(mockInput); +// Mockito.verify(resumeServiceAction, times(0)).proceedAction(any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it",outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockInput).getCommonHeader(); +// +// // to make validation pass +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(myAction).when(mockInput).getAction(); +// Mockito.doReturn(mockAI).when(mockInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test processAction return with error +// outputBuilder = resumeServiceAction.process(mockInput); +// Mockito.verify(resumeServiceAction, times(1)).proceedAction(any()); +// Assert.assertTrue("Should have commonHeader",outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(LCMCommandStatus.REJECTED.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // test processAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = resumeServiceAction.process(mockInput); +// Assert.assertTrue("Should have commonHeader",outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", successCode, outputBuilder.getStatus().getCode()); +// } + + @Test + public void testValidate() throws Exception { + resumeServiceAction.validate(mockCommonHeader, Action.ResumeTraffic, mockAI); + Status status = (Status) Whitebox.getInternalState(resumeServiceAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + Mockito.verify(resumeServiceAction, times(0)).buildStatusForParamName(any(), any()); + Mockito.verify(resumeServiceAction, times(0)).buildStatusForErrorMsg(any(), any()); + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + // test empty action + resumeServiceAction.validate(mockCommonHeader, Action.ResumeTraffic, mockAI); + status = (Status) Whitebox.getInternalState(resumeServiceAction, "status"); + Assert.assertEquals("Should return missing parameter for action", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty ActionIdentifier + resumeServiceAction.validate(mockCommonHeader, Action.ResumeTraffic, mockAI); + status = (Status) Whitebox.getInternalState(resumeServiceAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test Invalid VNF_ID + Mockito.doReturn("").when(mockAI).getVnfId(); + resumeServiceAction.validate(mockCommonHeader, Action.ResumeTraffic, mockAI); + status = (Status) Whitebox.getInternalState(resumeServiceAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + } + +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/UpgradeServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/UpgradeServiceTest.java new file mode 100644 index 000000000..3247a0e94 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/UpgradeServiceTest.java @@ -0,0 +1,686 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.internal.util.reflection.Whitebox; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.*; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({UpgradeService.class, RequestExecutor.class}) +public class UpgradeServiceTest { + private final String PAYLOAD_STRING = "{\"A\":\"A-value\",\"B\":{\"C\":\"B.C-value\",\"D\":\"B.D-value\"}}"; + private UpgradePreCheckInput mockUpgradePreInput = mock(UpgradePreCheckInput.class); + private UpgradePostCheckInput mockUpgradePostInput = mock(UpgradePostCheckInput.class); + private UpgradeSoftwareInput mockUpgradeSoftInput = mock(UpgradeSoftwareInput.class); + private UpgradeBackupInput mockUpgradeBackupInput = mock(UpgradeBackupInput.class); + private UpgradeBackoutInput mockUpgradeBackoutInput = mock(UpgradeBackoutInput.class); + private CommonHeader mockCommonHeader = mock(CommonHeader.class); + private ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + private Payload mockPayload = mock(Payload.class); + + private UpgradeService upgradePreAction; + private UpgradeService upgradePostAction; + private UpgradeService upgradeSoftAction; + private UpgradeService upgradeBackupAction; + private UpgradeService upgradeBackoutAction; + + @Before + public void setUp() throws Exception { + upgradePreAction = spy(new UpgradeService("upgradePre")); + upgradePostAction = spy(new UpgradeService("upgradePost")); + upgradeSoftAction = spy(new UpgradeService("upgradeSoft")); + upgradeBackupAction = spy(new UpgradeService("upgradeBackup")); + upgradeBackoutAction = spy(new UpgradeService("upgradeBackout")); + } + + @Test + public void testConstructor() throws Exception { + Action expectedAction = Action.UpgradePreCheck; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(upgradePreAction, "expectedAction")); + Assert.assertEquals("Should have upgrade-precheck RPC name", "upgrade-pre-check", + (org.powermock.reflect.Whitebox.getInternalState(upgradePreAction, "rpcName")).toString()); + + expectedAction = Action.UpgradePostCheck; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(upgradePostAction, "expectedAction")); + Assert.assertEquals("Should have upgrade-postcheck RPC name","upgrade-post-check", + (org.powermock.reflect.Whitebox.getInternalState(upgradePostAction, "rpcName")).toString()); + + expectedAction = Action.UpgradeSoftware; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(upgradeSoftAction, "expectedAction")); + Assert.assertEquals("Should have upgrade-software RPC name", "upgrade-software", + (org.powermock.reflect.Whitebox.getInternalState(upgradeSoftAction, "rpcName")).toString()); + + expectedAction = Action.UpgradeBackup; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(upgradeBackupAction, "expectedAction")); + Assert.assertEquals("Should have upgrade-backup RPC name","upgrade-backup", + (org.powermock.reflect.Whitebox.getInternalState(upgradeBackupAction, "rpcName")).toString()); + + expectedAction = Action.UpgradeBackout; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(upgradeBackoutAction, "expectedAction")); + Assert.assertEquals("Should have upgrade-backout RPC name","upgrade-backout", + (org.powermock.reflect.Whitebox.getInternalState(upgradeBackoutAction, "rpcName")).toString()); + + } + +// @Test +// public void testUpgradePreCheck() throws Exception { +// // test error occurs in validation +// UpgradePreCheckOutputBuilder outputBuilder = upgradePreAction.upgradePreCheck(mockUpgradePreInput); +// //Mockito.verify(upgradePreAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockUpgradePreInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockUpgradePreInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.UpgradePreCheck).when(mockUpgradePreInput).getAction(); +// Mockito.doReturn(mockAI).when(mockUpgradePreInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test proceedAction return with error +// outputBuilder = upgradePreAction.upgradePreCheck(mockUpgradePreInput); +// //Mockito.verify(upgradePreAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = upgradePreAction.upgradePreCheck(mockUpgradePreInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// new Integer(302), outputBuilder.getStatus().getCode()); +// } +// +// @Test +// public void testUpgradePostCheck() throws Exception { +// // test error occurs in validation +// UpgradePostCheckOutputBuilder outputBuilder = upgradePostAction.upgradePostCheck(mockUpgradePostInput); +// // Mockito.verify(upgradePostAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockUpgradePostInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockUpgradePostInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.UpgradePostCheck).when(mockUpgradePostInput).getAction(); +// Mockito.doReturn(mockAI).when(mockUpgradePostInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test proceedAction return with error +// outputBuilder = upgradePostAction.upgradePostCheck(mockUpgradePostInput); +// // Mockito.verify(upgradePostAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(302), +// outputBuilder.getStatus().getCode()); +// +// // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus();; +// +// outputBuilder = upgradePostAction.upgradePostCheck(mockUpgradePostInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// new Integer(302), outputBuilder.getStatus().getCode()); +// } +// @Test +// public void testUpgradeSoftware() throws Exception { +// // test error occurs in validation +// UpgradeSoftwareOutputBuilder outputBuilder = upgradeSoftAction.upgradeSoftware(mockUpgradeSoftInput); +// //Mockito.verify(upgradeSoftAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockUpgradeSoftInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockUpgradeSoftInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.UpgradeSoftware).when(mockUpgradeSoftInput).getAction(); +// Mockito.doReturn(mockAI).when(mockUpgradeSoftInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test proceedAction return with error +// outputBuilder = upgradeSoftAction.upgradeSoftware(mockUpgradeSoftInput); +// //Mockito.verify(upgradeSoftAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(302), +// outputBuilder.getStatus().getCode()); +// +// // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = upgradeSoftAction.upgradeSoftware(mockUpgradeSoftInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// new Integer(302), outputBuilder.getStatus().getCode()); +// } +// @Test +// public void testUpgradeBackup() throws Exception { +// // test error occurs in validation +// UpgradeBackupOutputBuilder outputBuilder = upgradeBackupAction.upgradeBackup(mockUpgradeBackupInput); +// //Mockito.verify(upgradeBackupAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockUpgradeBackupInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockUpgradeBackupInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.UpgradeBackup).when(mockUpgradeBackupInput).getAction(); +// Mockito.doReturn(mockAI).when(mockUpgradeBackupInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test proceedAction return with error +// outputBuilder = upgradeBackupAction.upgradeBackup(mockUpgradeBackupInput); +// //Mockito.verify(upgradeBackupAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(302), +// outputBuilder.getStatus().getCode()); +// +// // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = upgradeBackupAction.upgradeBackup(mockUpgradeBackupInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// new Integer(302), outputBuilder.getStatus().getCode()); +// } +// +// @Test +// public void testUpgradeBackout() throws Exception { +// // test error occurs in validation +// UpgradeBackoutOutputBuilder outputBuilder = upgradeBackoutAction.upgradeBackout(mockUpgradeBackoutInput); +// //Mockito.verify(upgradeBackoutAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockUpgradeBackoutInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockUpgradeBackoutInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.UpgradeBackup).when(mockUpgradeBackupInput).getAction(); +// Mockito.doReturn(mockAI).when(mockUpgradeBackupInput).getActionIdentifiers(); +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test proceedAction return with error +// outputBuilder = upgradeBackoutAction.upgradeBackout(mockUpgradeBackoutInput); +// //Mockito.verify(upgradeBackoutAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(302), +// outputBuilder.getStatus().getCode()); +// +// // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = upgradeBackoutAction.upgradeBackout(mockUpgradeBackoutInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// new Integer(302), outputBuilder.getStatus().getCode()); +// } +//} + +// @Test +// public void testValidateForPreCheckAction() throws Exception { +// // test commonHeader error +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, mockPayload); +// Status status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// //Mockito.verify(upgradePreAction, times(0)).buildStatusForParamName(any(), any()); +// // Mockito.verify(upgradePreAction, times(0)).buildStatusForErrorMsg(any(), any()); +// +// ZULU mockTimeStamp = mock(ZULU.class); +// Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// // test Invalid action +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("Should return invalid parameter for action", +// Integer.valueOf(302), status.getCode()); +// +// // test empty ActionIdentifier +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// +// // test empty VSERVER_ID +// Mockito.doReturn("").when(mockAI).getVnfId(); +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test null payload +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, null); +// //Mockito.verify(upgradePreAction, times(1)).validateExcludedActIds(any(), any()); +// status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// +// // test empty payload +// Mockito.doReturn("").when(mockPayload).getValue(); +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test space payload +// Mockito.doReturn(" ").when(mockPayload).getValue(); +// upgradePreAction.validate(mockCommonHeader, Action.UpgradePreCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePreAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// } +// +// @Test +// public void testValidateForUpgradePostAction() throws Exception { +// // test commonHeader error +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, mockPayload); +// Status status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// // Mockito.verify(upgradePostAction, times(0)).buildStatusForParamName(any(), any()); +// //Mockito.verify(upgradePostAction, times(0)).buildStatusForErrorMsg(any(), any()); +// +// ZULU mockTimeStamp = mock(ZULU.class); +// Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// // test Invalid action +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("Should return invalid parameter for action", +// Integer.valueOf(302), status.getCode()); +// +// // test empty ActionIdentifier +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// +// // test empty VSERVER_ID +// Mockito.doReturn("").when(mockAI).getVnfId(); +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test null payload +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, null); +// //Mockito.verify(upgradePostAction, times(1)).validateExcludedActIds(any(), any()); +// status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty payload +// Mockito.doReturn("").when(mockPayload).getValue(); +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test space payload +// Mockito.doReturn(" ").when(mockPayload).getValue(); +// upgradePostAction.validate(mockCommonHeader, Action.UpgradePostCheck, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradePostAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// } +// @Test +// public void testValidateForUpgradeBackoutAction() throws Exception { +// // test commonHeader error +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, mockPayload); +// Status status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// //Mockito.verify(upgradeBackoutAction, times(0)).buildStatusForParamName(any(), any()); +// // Mockito.verify(upgradeBackoutAction, times(0)).buildStatusForErrorMsg(any(), any()); +// +// ZULU mockTimeStamp = mock(ZULU.class); +// Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// // test Invalid action +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("Should return invalid parameter for action", +// Integer.valueOf(302), status.getCode()); +// +// // test empty ActionIdentifier +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty VSERVER_ID +// Mockito.doReturn("").when(mockAI).getVnfId(); +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test null payload +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, null); +// // Mockito.verify(upgradeBackoutAction, times(1)).validateExcludedActIds(any(), any()); +// status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty payload +// Mockito.doReturn("").when(mockPayload).getValue(); +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test space payload +// Mockito.doReturn(" ").when(mockPayload).getValue(); +// upgradeBackoutAction.validate(mockCommonHeader, Action.UpgradeBackout, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackoutAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// } +// +// @Test +// public void testValidateForUpgradeSoftwareAction() throws Exception { +// // test commonHeader error +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, mockPayload); +// Status status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// //Mockito.verify(upgradeSoftAction, times(0)).buildStatusForParamName(any(), any()); +// //Mockito.verify(upgradeSoftAction, times(0)).buildStatusForErrorMsg(any(), any()); +// +// ZULU mockTimeStamp = mock(ZULU.class); +// Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// // test Invalid action +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("Should return invalid parameter for action", +// Integer.valueOf(302), status.getCode()); +// +// // test empty ActionIdentifier +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty VSERVER_ID +// Mockito.doReturn("").when(mockAI).getVnfId(); +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test null payload +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, null); +// //Mockito.verify(upgradeSoftAction, times(1)).validateExcludedActIds(any(), any()); +// status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty payload +// Mockito.doReturn("").when(mockPayload).getValue(); +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test space payload +// Mockito.doReturn(" ").when(mockPayload).getValue(); +// upgradeSoftAction.validate(mockCommonHeader, Action.UpgradeSoftware, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeSoftAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// } +// +// @Test +// public void testValidateForUpgradeBackupAction() throws Exception { +// // test commonHeader error +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, mockPayload); +// Status status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); +// //Mockito.verify(upgradeBackupAction, times(0)).buildStatusForParamName(any(), any()); +// //Mockito.verify(upgradeBackupAction, times(0)).buildStatusForErrorMsg(any(), any()); +// +// ZULU mockTimeStamp = mock(ZULU.class); +// Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// // test Invalid action +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("Should return invalid parameter for action", +// Integer.valueOf(302), status.getCode()); +// +// // test empty ActionIdentifier +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty VSERVER_ID +// Mockito.doReturn("").when(mockAI).getVnfId(); +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// Mockito.doReturn("vnfId").when(mockAI).getVnfId(); +// +// // test null payload +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, null); +// //Mockito.verify(upgradeBackupAction, times(1)).validateExcludedActIds(any(), any()); +// status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("should return missing parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test empty payload +// Mockito.doReturn("").when(mockPayload).getValue(); +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// +// // test space payload +// Mockito.doReturn(" ").when(mockPayload).getValue(); +// upgradeBackupAction.validate(mockCommonHeader, Action.UpgradeBackup, mockAI, mockPayload); +// status = (Status) Whitebox.getInternalState(upgradeBackupAction, "status"); +// Assert.assertEquals("should return invalid parameter", +// Integer.valueOf(302), status.getCode()); +// } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/VolumeServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/VolumeServiceTest.java new file mode 100644 index 000000000..0140dabd9 --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/service/VolumeServiceTest.java @@ -0,0 +1,320 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.service; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.internal.util.reflection.Whitebox; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeInput; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Payload; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ZULU; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.action.identifiers.ActionIdentifiers; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.domainmodel.lcm.ResponseContext; +import org.onap.appc.executor.objects.LCMCommandStatus; +import org.onap.appc.requesthandler.objects.RequestHandlerOutput; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({VolumeService.class, RequestExecutor.class}) +public class VolumeServiceTest { + private final String PAYLOAD_STRING = "{\"A\":\"A-value\",\"B\":{\"C\":\"B.C-value\",\"D\":\"B.D-value\"}}"; + private AttachVolumeInput mockAttachInput = mock(AttachVolumeInput.class); + private DetachVolumeInput mockDetachInput = mock(DetachVolumeInput.class); + private CommonHeader mockCommonHeader = mock(CommonHeader.class); + private ActionIdentifiers mockAI = mock(ActionIdentifiers.class); + private Payload mockPayload = mock(Payload.class); + + private VolumeService volumeServiceForAttachAction; + private VolumeService volumeServiceForDetachAction; + + @Before + public void setUp() throws Exception { + volumeServiceForAttachAction = spy(new VolumeService(true)); + volumeServiceForDetachAction = spy(new VolumeService(false)); + } + + @Test + public void testConstructor() throws Exception { + Action expectedAction = Action.AttachVolume; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(volumeServiceForAttachAction, "expectedAction")); + Assert.assertEquals("Should have attach-volume RPC name", "attach-volume", + (org.powermock.reflect.Whitebox.getInternalState(volumeServiceForAttachAction, "rpcName")).toString()); + + expectedAction = Action.DetachVolume; + Assert.assertEquals("Should have proper ACTION", expectedAction, + (Action) org.powermock.reflect.Whitebox.getInternalState(volumeServiceForDetachAction, "expectedAction")); + Assert.assertEquals("Should have detach-volume RPC name","detach-volume", + (org.powermock.reflect.Whitebox.getInternalState(volumeServiceForDetachAction, "rpcName")).toString()); + } + +// @Test +// public void testAttachVolume() throws Exception { +// // test error occurs in validation +// AttachVolumeOutputBuilder outputBuilder = volumeServiceForAttachAction.attachVolume(mockAttachInput); +// Mockito.verify(volumeServiceForAttachAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockAttachInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockAttachInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.AttachVolume).when(mockAttachInput).getAction(); +// Mockito.doReturn(mockAI).when(mockAttachInput).getActionIdentifiers(); +// Mockito.doReturn("vserverId").when(mockAI).getVserverId(); + + // test proceedAction return with error +// outputBuilder = volumeServiceForAttachAction.attachVolume(mockAttachInput); +// Mockito.verify(volumeServiceForAttachAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(LCMCommandStatus.REJECTED.getResponseCode()), +// outputBuilder.getStatus().getCode()); + + // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus(); +// +// outputBuilder = volumeServiceForAttachAction.attachVolume(mockAttachInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// successCode, outputBuilder.getStatus().getCode()); +// } + +// @Test +// public void testDetachVolumn() throws Exception { +// // test error occurs in validation +// DetachVolumeOutputBuilder outputBuilder = volumeServiceForDetachAction.detachVolume(mockDetachInput); +// Mockito.verify(volumeServiceForDetachAction, times(0)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should not have commonHeader as we did not mock it", +// outputBuilder.getCommonHeader() == null); +// Assert.assertEquals("should return missing parameter status", +// Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), +// outputBuilder.getStatus().getCode()); +// +// // make validation pass +// Mockito.doReturn(mockCommonHeader).when(mockDetachInput).getCommonHeader(); +// Mockito.doReturn(mockPayload).when(mockDetachInput).getPayload(); +// Mockito.doReturn(PAYLOAD_STRING).when(mockPayload).getValue(); +// +// ZULU zuluTimeStamp = new ZULU("2017-06-29T21:44:00.35Z"); +// Mockito.doReturn(zuluTimeStamp).when(mockCommonHeader).getTimestamp(); +// Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); +// Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); +// Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); +// +// Mockito.doReturn(Action.DetachVolume).when(mockDetachInput).getAction(); +// Mockito.doReturn(mockAI).when(mockDetachInput).getActionIdentifiers(); +// Mockito.doReturn("vserverId").when(mockAI).getVserverId(); + + // test proceedAction return with error +// outputBuilder = volumeServiceForDetachAction.detachVolume(mockDetachInput); +// Mockito.verify(volumeServiceForDetachAction, times(1)).proceedAction(any(), any(), any()); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return rejected status", +// Integer.valueOf(LCMCommandStatus.REJECTED.getResponseCode()), +// outputBuilder.getStatus().getCode()); + + // test proceedAction return without error +// RequestExecutor mockExecutor = mock(RequestExecutor.class); +// whenNew(RequestExecutor.class).withNoArguments().thenReturn(mockExecutor); +// +// RequestHandlerOutput mockOutput = mock(RequestHandlerOutput.class); +// Mockito.doReturn(mockOutput).when(mockExecutor).executeRequest(any()); +// +// ResponseContext mockResponseContext = mock(ResponseContext.class); +// Mockito.doReturn(mockResponseContext).when(mockOutput).getResponseContext(); +// +// org.onap.appc.domainmodel.lcm.Status mockStatus = mock(org.onap.appc.domainmodel.lcm.Status.class); +// Integer successCode = Integer.valueOf(LCMCommandStatus.SUCCESS.getResponseCode()); +// Mockito.doReturn(successCode).when(mockStatus).getCode(); +// Mockito.doReturn(mockStatus).when(mockResponseContext).getStatus();; +// +// outputBuilder = volumeServiceForDetachAction.detachVolume(mockDetachInput); +// Assert.assertTrue("Should have commonHeader", +// outputBuilder.getCommonHeader() != null); +// Assert.assertEquals("should return success status", +// successCode, outputBuilder.getStatus().getCode()); +// } + + @Test + public void testValidateForAttachAction() throws Exception { + // test commonHeader error + volumeServiceForAttachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, mockPayload); + Status status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + Mockito.verify(volumeServiceForDetachAction, times(0)).buildStatusForParamName(any(), any()); + Mockito.verify(volumeServiceForDetachAction, times(0)).buildStatusForErrorMsg(any(), any()); + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + // test Invalid action + volumeServiceForAttachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("Should return invalid parameter for action", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test empty ActionIdentifier + volumeServiceForAttachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty VSERVER_ID + Mockito.doReturn("").when(mockAI).getVserverId(); + volumeServiceForAttachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + Mockito.doReturn("vserverId").when(mockAI).getVserverId(); + + // test null payload + volumeServiceForAttachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, null); + Mockito.verify(volumeServiceForAttachAction, times(1)).validateExcludedActIds(any(), any()); + status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty payload + Mockito.doReturn("").when(mockPayload).getValue(); + volumeServiceForAttachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test space payload + Mockito.doReturn(" ").when(mockPayload).getValue(); + volumeServiceForAttachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForAttachAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + } + + @Test + public void testValidateForDetachAction() throws Exception { + // test commonHeader error + volumeServiceForDetachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, mockPayload); + Status status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + Mockito.verify(volumeServiceForDetachAction, times(0)).buildStatusForParamName(any(), any()); + Mockito.verify(volumeServiceForDetachAction, times(0)).buildStatusForErrorMsg(any(), any()); + + ZULU mockTimeStamp = mock(ZULU.class); + Mockito.doReturn(mockTimeStamp).when(mockCommonHeader).getTimestamp(); + Mockito.doReturn("api ver").when(mockCommonHeader).getApiVer(); + Mockito.doReturn("orignator Id").when(mockCommonHeader).getOriginatorId(); + Mockito.doReturn("request Id").when(mockCommonHeader).getRequestId(); + + // test Invalid action + volumeServiceForDetachAction.validate(mockCommonHeader, Action.AttachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("Should return invalid parameter for action", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test empty ActionIdentifier + volumeServiceForDetachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty VSERVER_ID + Mockito.doReturn("").when(mockAI).getVserverId(); + volumeServiceForDetachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + Mockito.doReturn("vserverId").when(mockAI).getVserverId(); + + // test null payload + volumeServiceForDetachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, null); + Mockito.verify(volumeServiceForDetachAction, times(1)).validateExcludedActIds(any(), any()); + status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("should return missing parameter", + Integer.valueOf(LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()), status.getCode()); + + // test empty payload + Mockito.doReturn("").when(mockPayload).getValue(); + volumeServiceForDetachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + + // test space payload + Mockito.doReturn(" ").when(mockPayload).getValue(); + volumeServiceForDetachAction.validate(mockCommonHeader, Action.DetachVolume, mockAI, mockPayload); + status = (Status) Whitebox.getInternalState(volumeServiceForDetachAction, "status"); + Assert.assertEquals("should return invalid parameter", + Integer.valueOf(LCMCommandStatus.INVALID_INPUT_PARAMETER.getResponseCode()), status.getCode()); + } +} diff --git a/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/util/ValidationServiceTest.java b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/util/ValidationServiceTest.java new file mode 100644 index 000000000..ed2adf3de --- /dev/null +++ b/appc-provider/appc-provider-bundle/src/test/java/org/onap/appc/provider/lcm/util/ValidationServiceTest.java @@ -0,0 +1,89 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.provider.lcm.util; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ZULU; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status; +import org.onap.appc.executor.objects.LCMCommandStatus; + +import static org.mockito.Mockito.mock; + +public class ValidationServiceTest { + private final Integer expectedErrorCode = Integer.valueOf( + LCMCommandStatus.MISSING_MANDATORY_PARAMETER.getResponseCode()); + @Before + public void setUp() throws Exception { + } + + @Test + public void getInstance() throws Exception { + Assert.assertEquals("Should always return the same instance", + ValidationService.getInstance(), ValidationService.getInstance()); + } + + @Test + public void validateInput() throws Exception { + Status status = ValidationService.getInstance().validateInput(null, null, null); + Assert.assertEquals("Should return error status", expectedErrorCode, status.getCode()); + Assert.assertTrue("Should include common-header in the message", + status.getMessage().contains("common-header")); + Assert.assertTrue("Should include action in the message", + status.getMessage().contains("action")); + + CommonHeader mockCommonHeader = mock(CommonHeader.class); + status = ValidationService.getInstance().validateInput(mockCommonHeader, Action.Query, "query"); + Assert.assertEquals("Should return error status", expectedErrorCode, status.getCode()); + Assert.assertFalse("Should not include action in the message", + status.getMessage().contains("action")); + + Mockito.when(mockCommonHeader.getApiVer()).thenReturn("testing API version"); + status = ValidationService.getInstance().validateInput(mockCommonHeader, Action.Query, "query"); + Assert.assertEquals("Should return error status", expectedErrorCode, status.getCode()); + Assert.assertFalse("Should not include api-ver in the message", + status.getMessage().contains("api-ver")); + + Mockito.when(mockCommonHeader.getOriginatorId()).thenReturn("testing originator id"); + status = ValidationService.getInstance().validateInput(mockCommonHeader, Action.Query, "query"); + Assert.assertEquals("Should return error status", expectedErrorCode, status.getCode()); + Assert.assertFalse("Should not include originator-id in the message", + status.getMessage().contains("originator-id")); + + Mockito.when(mockCommonHeader.getRequestId()).thenReturn("testing request id"); + status = ValidationService.getInstance().validateInput(mockCommonHeader, Action.Query, "query"); + Assert.assertEquals("Should return error status", expectedErrorCode, status.getCode()); + Assert.assertFalse("Should not include request-id in the message", + status.getMessage().contains("request-id")); + + Mockito.when(mockCommonHeader.getTimestamp()).thenReturn(mock(ZULU.class)); + status = ValidationService.getInstance().validateInput(mockCommonHeader, Action.Query, "query"); + Assert.assertTrue("Should return success", status == null); + } +} diff --git a/appc-provider/appc-provider-model/src/main/yang/appc-provider-lcm.yang b/appc-provider/appc-provider-model/src/main/yang/appc-provider-lcm.yang index 8bcbd320c..58e379251 100644 --- a/appc-provider/appc-provider-model/src/main/yang/appc-provider-lcm.yang +++ b/appc-provider/appc-provider-model/src/main/yang/appc-provider-lcm.yang @@ -46,7 +46,9 @@ module appc-provider-lcm { namespace "org:onap:appc:lcm"; prefix appc-provider-lcm; organization "Copyright 2017 AT&T Intellectual Property."; - + contact + "Dewayne Hafenstein <dh868g@att.us.com>"; + description "Defines the services and request/response requirements for the ECOMP APP-C component."; @@ -67,8 +69,6 @@ module appc-provider-lcm { * APP-C controller functions. **********************************************************************************/ - - typedef ZULU { description "Define a common definition of a time stamp (expressed as a formatted string) as follows yyyy-MM-ddTHH:mm:ss.SSSSSSSSZ"; @@ -112,19 +112,42 @@ module appc-provider-lcm { enum "ConfigExport"; enum "StopApplication"; enum "StartApplication"; + enum "QuiesceTraffic"; + enum "ResumeTraffic"; + enum "UpgradePreCheck"; + enum "UpgradeSoftware"; + enum "UpgradePostCheck"; + enum "UpgradeBackup"; + enum "UpgradeBackout"; + enum "ActionStatus"; + enum "Query"; + enum "Reboot"; + enum "AttachVolume"; + enum "DetachVolume"; + } description "The action to be taken by APP-C, e.g. Restart, Rebuild, Migrate"; } - /********************************************************************************** - * All requests will include this standard header - * - * The standard request header is used to define a correlation identification for - * the request that is returned on all responses. This correlation identifier - * (called the service-request-id) is meaningful to the caller and is included on - * all responses from the services. - **********************************************************************************/ - + typedef vm-state { + description "The state of a VM"; + type enumeration { + enum "active"; + enum "standby"; + enum "inactive"; + enum "unknown"; + } + } + + typedef vm-status { + description "The status of a VM"; + type enumeration { + enum "healthy"; + enum "unhealthy"; + enum "unknown"; + } + } + /********************************************************************************** * Basic manipulation of a VNF (or VM) will typically include querying the current @@ -137,23 +160,21 @@ module appc-provider-lcm { /********************************************************************************** + * All requests will include this standard header + * + * The standard request header is used to define a correlation identification for + * the request that is returned on all responses. This correlation identifier + * (called the service-request-id) is meaningful to the caller and is included on + * all responses from the services. + **********************************************************************************/ + + /********************************************************************************** * All responses will include this standard header * * The standard response header includes the time of completion as well as a * success|failure indication **********************************************************************************/ - - - /********************************************************************************** - * All requests/response will include this standard header - * - * The standard common header is used to define a correlation identification for - * the request that is returned on all responses. - **********************************************************************************/ - - - grouping common-header { description "A common header for all APP-C requests"; container common-header { @@ -202,22 +223,24 @@ module appc-provider-lcm { } - /********************************************************************************** - * Flags are generic flags that apply to any and all commands, all are optional - * force = TRUE/FALSE - Execute command even if target is in unstable (i.e. locked, transiting, etc) state. Specific behaviour of forced commands varies, but implies cancellation of previous command and an override by the new command. The FALSE value is used by default. - * ttl = <0....N> - The timeout value for command execution, expressed in seconds - * mode = EXCLUSIVE/NORMAL - defines execution mode as follows: - * - EXCLUSIVE ? on encountering an exclusive command, the APP-C will: - * * Cease accepting additional command requests - * * Complete execution of outstanding commands - * * Execute the exclusive command to completion - * * Optionally report the result of the command - * * Optionally resume command acceptance and processing - * - NORMAL - Obverse of EXCLUSIVE, the default one. - **********************************************************************************/ + /********************************************************************************** + * Flags are generic flags that apply to any and all commands, all are optional + * force = TRUE/FALSE - Execute command even if target is in unstable (i.e. locked, transiting, etc) + * state. Specific behaviour of forced commands varies, but implies cancellation + * of previous command and an override by the new command. The FALSE value is + * used by default. + * ttl = <0....N> - The timeout value for command execution, expressed in seconds + * mode = EXCLUSIVE/NORMAL - defines execution mode as follows: + * - EXCLUSIVE ? on encountering an exclusive command, the APP-C will: + * * Cease accepting additional command requests + * * Complete execution of outstanding commands + * * Execute the exclusive command to completion + * * Optionally report the result of the command + * * Optionally resume command acceptance and processing + * - NORMAL - Obverse of EXCLUSIVE, the default one. + **********************************************************************************/ container flags { - description "Flags are generic flags that apply to any and all commands, all - are optional"; + description "Flags are generic flags that apply to any and all commands, all are optional"; leaf mode { type enumeration { enum "EXCLUSIVE"; @@ -242,9 +265,9 @@ module appc-provider-lcm { type uint16; mandatory false; } - } } } + } grouping action-identifiers { @@ -295,9 +318,13 @@ module appc-provider-lcm { grouping status { - description "The specific response codes are to be aligned with SDC reference doc (main table removed to avoid duplication and digression from main table). See SDC and ECOMP Distribution Consumer Interface Agreement"; + description "The specific response codes are to be aligned with SDC reference doc + (main table removed to avoid duplication and digression from main table). + See SDC and ECOMP Distribution Consumer Interface Agreement"; container status { - description "The specific response codes are to be aligned with SDC reference doc (main table removed to avoid duplication and digression from main table). See SDC and ECOMP Distribution Consumer Interface Agreement"; + description "The specific response codes are to be aligned with SDC reference doc + (main table removed to avoid duplication and digression from main table). + See SDC and ECOMP Distribution Consumer Interface Agreement"; leaf code { description "Response code"; type uint16; @@ -311,164 +338,328 @@ module appc-provider-lcm { } } + typedef lcm-action-status { + type enumeration { + enum "IN_PROGRESS"; + enum "SUCCESSFUL"; + enum "FAILED"; + enum "NOT_FOUND"; + enum "ABORTED"; + enum "MULTIPLE_REQUESTS_FOUND"; + } + description "The status of the requested LCM action"; + } + /********************************************************************************** + * Define the restart service + **********************************************************************************/ + rpc restart { + description "An operation to restart a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + /********************************************************************************** + * Define the rebuild service + **********************************************************************************/ + rpc rebuild { + description "An operation to rebuild a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + + /********************************************************************************** + * Define the migrate service + **********************************************************************************/ + rpc migrate { + description "An operation to migrate a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + /********************************************************************************** + * Define the evacuate service + **********************************************************************************/ + rpc evacuate { + description "An operation to evacuate a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } /********************************************************************************** - * Define the restart service - **********************************************************************************/ - rpc restart { - description "An operation to restart a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } + * Define the snapshot service + **********************************************************************************/ + rpc snapshot { + description "An operation to create a snapshot of a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + leaf identity-url { + type string; + mandatory true; + } + } + output { + uses common-header; + uses status; + leaf snapshot-id { + type string; + } + } + } + /********************************************************************************** + * Define the VNF quiesce traffic service + **********************************************************************************/ + rpc quiesce-traffic { + description "An operation to stop traffic gracefully on the VF. + It stops traffic gracefully without stopping the application"; + input { + uses common-header; + leaf action { + type action; + mandatory true; } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } - /********************************************************************************** - * Define the rebuild service - **********************************************************************************/ - rpc rebuild { - description "An operation to rebuild a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } + /********************************************************************************** + * Define the VNF resume traffic service + **********************************************************************************/ + rpc resume-traffic { + description "An operation to resume traffic gracefully on the VF. + It resumes traffic gracefully without stopping the application"; + input { + uses common-header; + leaf action { + type action; + mandatory true; } + uses action-identifiers; + } + output { + uses common-header; + uses status; + } + } - /********************************************************************************** - * Define the migrate service - **********************************************************************************/ - rpc migrate { - description "An operation to migrate a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } + /********************************************************************************** + * Define the VNF UpgradePreCheck service + **********************************************************************************/ + rpc upgrade-pre-check { + description "An operation to check that the VNF has the correct software version needed for a software upgrade."; + input { + uses common-header; + leaf action { + type action; + mandatory true; } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } - /********************************************************************************** - * Define the evacuate service - **********************************************************************************/ - rpc evacuate { - description "An operation to evacuate a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } + /********************************************************************************** + * Define the VNF UpgradeSoftware service + **********************************************************************************/ + rpc upgrade-software { + description "An operation to upgrade the target VNF to a new version and expected that the VNF is in a quiesced status ."; + input { + uses common-header; + leaf action { + type action; + mandatory true; } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } + /********************************************************************************** + * Define the VNF UpgradePostCheck service + **********************************************************************************/ + rpc upgrade-post-check { + description "An operation to check the VNF upgrade has been successful completed and all processes are running properly."; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } - /********************************************************************************** - * Define the snapshot service - **********************************************************************************/ - rpc snapshot { - description "An operation to create a snapshot of a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - leaf identity-url { - type string; - mandatory true; - } + /********************************************************************************** + * Define the VNF UpgradeBackup service + **********************************************************************************/ + rpc upgrade-backup { + description "An operation to do full backup of the VNF data prior to an upgrade."; + input { + uses common-header; + leaf action { + type action; + mandatory true; } - output { - uses common-header; - uses status; - leaf snapshot-id { - type string; - } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } + /********************************************************************************** + * Define the VNF UpgradeBackout service + **********************************************************************************/ + rpc upgrade-backout { + description "An operation does a backout after an UpgradeSoftware is completed (either successfully or unsuccessfully)."; + input { + uses common-header; + leaf action { + type action; + mandatory true; } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; } + } - /********************************************************************************** - * Define the rollback service - **********************************************************************************/ - rpc rollback { - description "An operation to rollback to particular snapshot of a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - leaf identity-url { - type string; - mandatory true; - } - leaf snapshot-id { - type string; - mandatory true; - } + /********************************************************************************** + * Define the rollback service + **********************************************************************************/ + rpc rollback { + description "An operation to rollback to particular snapshot of a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; } - output { - uses common-header; - uses status; + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + leaf identity-url { + type string; + mandatory true; + } + leaf snapshot-id { + type string; + mandatory true; } } + output { + uses common-header; + uses status; + } + } /********************************************************************************** @@ -476,7 +667,7 @@ module appc-provider-lcm { **********************************************************************************/ - /********************************************************************************** + /********************************************************************************** * Define the sync service **********************************************************************************/ rpc sync { @@ -553,7 +744,13 @@ module appc-provider-lcm { } rpc config-modify { - description "Use the ModifyConfig command when a full configuration cycle is either not required or is considered too costly. The ModifyConfig LCM action affects only a subset of the total configuration data of a VNF. The set of configuration parameters to be affected is a subset of the total configuration data of the target VNF type. The payload block must contain the configuration parameters to be modified and their values. A successful modify returns a success response. A failed modify returns a failure response and the specific failure messages in the response payload block"; + description "Use the ModifyConfig command when a full configuration cycle is either not required + or is considered too costly. The ModifyConfig LCM action affects only a subset of the + total configuration data of a VNF. The set of configuration parameters to be affected + is a subset of the total configuration data of the target VNF type. The payload Stop + Application must contain the configuration parameters to be modified and their values. + A successful modify returns a success response. A failed modify returns a failure + response and the specific failure messages in the response payload Stop Application"; input { uses common-header; leaf action { @@ -627,8 +824,8 @@ module appc-provider-lcm { } /********************************************************************************** - * Define the test service - **********************************************************************************/ + * Define the test service + **********************************************************************************/ rpc test { description "An operation to test the configurations of a virtual network function (or VM)"; input { @@ -649,197 +846,194 @@ module appc-provider-lcm { } } - /********************************************************************************** - * Define the stop service - **********************************************************************************/ - rpc stop { - description "An operation to stop the configurations of a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } + /********************************************************************************** + * Define the stop service + **********************************************************************************/ + rpc stop { + description "An operation to stop the configurations of a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; } - output { - uses common-header; - uses status; + uses action-identifiers; + leaf payload { + type payload; + mandatory false; } } + output { + uses common-header; + uses status; + } + } - rpc start { - description "An operation to start a virtual network function (or VM)"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } + rpc start { + description "An operation to start a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; } - output { - uses common-header; - uses status; + uses action-identifiers; + leaf payload { + type payload; + mandatory false; } } + output { + uses common-header; + uses status; + } + } - /********************************************************************************** - * Define the audit service - **********************************************************************************/ - rpc audit { - description "An operation to audit the configurations of a virtual network function (or VM)"; - input { - uses common-header; + /********************************************************************************** + * Define the audit service + **********************************************************************************/ + rpc audit { + description "An operation to audit the configurations of a virtual network function (or VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + leaf payload { + type payload; + mandatory false; + } + } + } + + /********************************************************************************** + * Define the SoftwareUpload vSCP service + **********************************************************************************/ + rpc software-upload { + description "An operation to upload a new version of vSCP image to vSCP for updating it"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + + /********************************************************************************** + * Define the PreHealthCheck vSCP service + **********************************************************************************/ + rpc health-check { + description "An operation to perform health check of vSCP prior its upgrading"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + + + /********************************************************************************** + * Define the Upgrade vSCP service + **********************************************************************************/ + rpc live-upgrade { + description "An operation to perform upgrade of vSCP"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + + + /********************************************************************************** + * Define the VNF lock service + **********************************************************************************/ + rpc lock { + description "An operation to perform VNF lock operation"; + input { + uses common-header; leaf action { - type action; - mandatory true; + type action; + mandatory true; } uses action-identifiers; leaf payload { type payload; mandatory false; } - } - output { - uses common-header; - uses status; - leaf payload { - type payload; - mandatory false; - } - } - } - - /********************************************************************************** - * Define the SoftwareUpload vSCP service - **********************************************************************************/ - rpc software-upload { - description "An operation to upload a new version of vSCP image to vSCP for updating it"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } } output { uses common-header; uses status; } - } - - - - /********************************************************************************** - * Define the PreHealthCheck vSCP service - **********************************************************************************/ - rpc health-check { - description "An operation to perform health check of vSCP prior its upgrading"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - - } - } - + } /********************************************************************************** - * Define the Upgrade vSCP service - **********************************************************************************/ - rpc live-upgrade { - description "An operation to perform upgrade of vSCP"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } + * Define the VNF unlock service + **********************************************************************************/ + rpc unlock { + description "An operation to perform VNF unlock operation"; + input { + uses common-header; + leaf action { + type action; + mandatory true; } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } - - /********************************************************************************** - * Define the VNF lock service - **********************************************************************************/ - rpc lock { - description "An operation to perform VNF lock operation"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } - } - - /********************************************************************************** - * Define the VNF unlock service - **********************************************************************************/ - rpc unlock { - description "An operation to perform VNF unlock operation"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } - } - output { - uses common-header; - uses status; - } - } - - /********************************************************************************** + /********************************************************************************** * Define the VNF check lock service **********************************************************************************/ rpc check-lock { @@ -877,6 +1071,10 @@ module appc-provider-lcm { mandatory true; } uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } } output { uses common-header; @@ -943,28 +1141,168 @@ module appc-provider-lcm { uses common-header; uses status; } - } + } + /********************************************************************************** + * Define the VNF Start Application service + **********************************************************************************/ rpc start-application { - description "An operation to Start Application traffic to a virtual network function"; - input { - uses common-header; - leaf action { - type action; - mandatory true; - } - uses action-identifiers; - leaf payload { - type payload; - mandatory false; - } + description "An operation to perform VNF Start Application operation"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + + + /********************************************************************************** + * Gets the current state of the previously submitted LCM request + **********************************************************************************/ + rpc action-status { + description "An operation to get the current state of the previously submitted LCM request"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + leaf payload { + type payload; + } + } + } + + /********************************************************************************** + * Define the VNF Query service + **********************************************************************************/ + rpc query { + description "An operation to query the status of a targe VNF. + Returns information on each VM, including state (active or standby) + and status (healthy or unhealthy)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + } + output { + uses common-header; + uses status; + list query-results { + leaf vserver-id { + description "Identifier of a VM"; + type string; + mandatory true; } - output { - uses common-header; - uses status; + leaf vm-state { + description "The state of the VM"; + type vm-state; + mandatory true; + } + leaf vm-status { + description "the status of the VM"; + type vm-status; + mandatory true; } - } + } + } + } + /********************************************************************************** - * Additional RPCs added here... + * Define the Reboot service + **********************************************************************************/ + rpc reboot { + description "An operation to reboot a specified virtual machine (VM)"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory false; + } + } + output { + uses common-header; + uses status; + } + } + + /********************************************************************************** + * Define the VM attach volume service **********************************************************************************/ + rpc attach-volume { + description "An operation to attach a cinder volume to a VM"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } + + /********************************************************************************** + * Define the VM detach volume service + **********************************************************************************/ + rpc detach-volume { + description "An operation to detach a cinder volume from a VM"; + input { + uses common-header; + leaf action { + type action; + mandatory true; + } + uses action-identifiers; + leaf payload { + type payload; + mandatory true; + } + } + output { + uses common-header; + uses status; + } + } + + + + /********************************************************************************** + * Additional RPCs added here... + **********************************************************************************/ } diff --git a/appc-provider/appc-provider-model/src/main/yang/appc-provider.yang b/appc-provider/appc-provider-model/src/main/yang/appc-provider.yang index d89573b4d..4a194e360 100644 --- a/appc-provider/appc-provider-model/src/main/yang/appc-provider.yang +++ b/appc-provider/appc-provider-model/src/main/yang/appc-provider.yang @@ -254,7 +254,7 @@ module appc-provider { } leaf request-id { - description "UUID for the request ID. An OSS/BSS identifier for the request that caused the current action. Multiple API calls may be made with the same request-id The request-id shall be recorded throughout the operations on a single request"; + description "UUID for the request ID. An OSS/BSS identifier for the request that caused the current action. Multiple API calls may be made with the same request-id. The request-id shall be recorded throughout the operations on a single request"; type string; mandatory true; } @@ -606,8 +606,8 @@ module appc-provider { } } - - /********************************************************************************** + + /********************************************************************************** * Define the snapshot service **********************************************************************************/ rpc snapshot { |