diff options
Diffstat (limited to 'appc-provider/appc-provider-bundle/src')
36 files changed, 5756 insertions, 490 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); + } +} |