From a59f5607eaf196e032990b3ca962f2378e45fa52 Mon Sep 17 00:00:00 2001 From: subhash kumar singh Date: Fri, 16 Feb 2018 13:01:15 +0000 Subject: Impl Verify feature for CLI Implement verify feature for CLI. So that command developer will come up with his mocking file and can use framework to develope the command. Change-Id: I0ac22aaa7284626de60c66e56e83bb75ec9d773d Issue-ID: CLI-74 Signed-off-by: subhash kumar singh --- .../main/java/org/onap/cli/fw/cmd/OnapCommand.java | 18 ++- .../org/onap/cli/fw/conf/OnapCommandConstants.java | 20 +++ .../cli/fw/registrar/OnapCommandRegistrar.java | 71 +++++----- .../onap/cli/fw/schema/OnapCommandSchemaInfo.java | 9 +- .../cli/fw/schema/OnapCommandSchemaLoader.java | 23 +--- .../cli/fw/utils/OnapCommandDiscoveryUtils.java | 151 +++++++++++++++++---- .../open-cli-schema/default_input_parameters.yaml | 10 ++ .../onap/cli/fw/utils/OnapCommandUtilsTest.java | 2 +- 8 files changed, 215 insertions(+), 89 deletions(-) (limited to 'framework') diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommand.java index 29a29ce3..2a5956cc 100644 --- a/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommand.java +++ b/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommand.java @@ -16,11 +16,13 @@ package org.onap.cli.fw.cmd; +import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.onap.cli.fw.conf.OnapCommandConstants; import org.onap.cli.fw.error.OnapCommandException; @@ -32,12 +34,16 @@ import org.onap.cli.fw.output.OnapCommandResult; import org.onap.cli.fw.output.OnapCommandResultAttribute; import org.onap.cli.fw.output.OnapCommandResultAttributeScope; import org.onap.cli.fw.output.OnapCommandResultType; +import org.onap.cli.fw.schema.OnapCommandSchemaInfo; import org.onap.cli.fw.schema.OnapCommandSchemaLoader; import org.onap.cli.fw.schema.OnapCommandSchemaMerger; +import org.onap.cli.fw.utils.OnapCommandDiscoveryUtils; import org.onap.cli.fw.utils.OnapCommandHelperUtils; import org.onap.cli.fw.utils.OnapCommandUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; /** * Oclip Command. @@ -149,7 +155,6 @@ public abstract class OnapCommand { return this.initializeSchema(schema, false); } - public List initializeSchema(String schema, boolean validate) throws OnapCommandException { this.setSchemaName(schema); @@ -178,6 +183,13 @@ public abstract class OnapCommand { } } + protected void preRun() throws OnapCommandException { + LOG.debug("CMD: " + this.getName() + "pre run."); + } + + protected void postRun() throws OnapCommandException { + LOG.debug("CMD: " + this.getName() + "post run."); + } /** * Oclip command execute with given parameters on service. Before calling this method, its mandatory to set all * parameters value. @@ -238,10 +250,13 @@ public abstract class OnapCommand { } } + preRun(); + this.run(); LOG.info("OUTPUT: " + this.cmdResult.getRecords()); + postRun(); return this.cmdResult; } @@ -270,6 +285,5 @@ public abstract class OnapCommand { public String printHelp() throws OnapCommandHelpFailed { return OnapCommandHelperUtils.help(this); } - // (mrkanag) Add toString for all command, parameter, result, etc objects in JSON format } diff --git a/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConstants.java b/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConstants.java index 23d42f87..c2bfc1d5 100644 --- a/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConstants.java +++ b/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConstants.java @@ -148,6 +148,26 @@ public class OnapCommandConstants { public static final String SAMPLE_GEN_ENABLED = "cli.sample.gen.enable"; public static final String SAMPLE_GEN_TARGET_FOLDER = "cli.sample.gen.target"; + public static final String VERIFY_SAMPLES_DIRECTORY = "open-cli-sample"; + public static final String VERIFY_SAMPLES_FILE_PATTERN = VERIFY_SAMPLES_DIRECTORY + YAML_PATTERN; + public static final String VERIFY_SAMPLES_MOCK_PATTERN = VERIFY_SAMPLES_DIRECTORY + JSON_PATTERN; + public static final String VERIFY_SAMPLES = "samples"; + public static final String VERIFY_CMD_NAME = "name"; + public static final String VERIFY_CMD_VERSION = "version"; + public static final String VERIFY_OUPUT = "output"; + public static final String VERIFY_INPUT = "input"; + public static final String VERIFY_MOCO = "moco"; + public static final String VERIFY_SAMPLE_FILE_ID = "samplefileid"; + public static final String VERIFY_SAMPLE_ID = "sampleid"; + public static final String VERIFY_RESULT_PASS = "pass"; + public static final String VERIFY_RESULT_FAIL = "fail"; + public static final String VERIFY_CONTEXT_PARAM = "context"; + + + + public static final String VERIFY_LONG_OPTION = "--verify"; + public static final String VERIFY_SHORT_OPTION = "-V"; + private OnapCommandConstants() { } diff --git a/framework/src/main/java/org/onap/cli/fw/registrar/OnapCommandRegistrar.java b/framework/src/main/java/org/onap/cli/fw/registrar/OnapCommandRegistrar.java index 6564628d..15a086c7 100644 --- a/framework/src/main/java/org/onap/cli/fw/registrar/OnapCommandRegistrar.java +++ b/framework/src/main/java/org/onap/cli/fw/registrar/OnapCommandRegistrar.java @@ -16,13 +16,6 @@ package org.onap.cli.fw.registrar; -import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import org.apache.commons.io.IOUtils; import org.onap.cli.fw.cmd.OnapCommand; import org.onap.cli.fw.conf.OnapCommandConfig; @@ -48,6 +41,13 @@ import org.onap.cli.fw.utils.OnapCommandUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * Oclip Command registrar provides a common place, where every command would get registered automatically when its @@ -93,11 +93,11 @@ public class OnapCommandRegistrar { public void setProfile(String profileName, List includes, List excludes) { this.paramCache.setProfile(profileName); - for (String profile: includes) { + for (String profile : includes) { this.paramCache.includeProfile(profile); } - for (String profile: excludes) { + for (String profile : excludes) { this.paramCache.excludeProfile(profile); } } @@ -111,12 +111,9 @@ public class OnapCommandRegistrar { /** * Register the command into registrar and throws OnapInvalidCommandRegistration for invalid command. * - * @param name - * Command Name - * @param cmd - * Command Class - * @throws OnapCommandInvalidRegistration - * Invalid registration exception + * @param name Command Name + * @param cmd Command Class + * @throws OnapCommandInvalidRegistration Invalid registration exception * @throws OnapCommandRegistrationProductInfoMissing */ private void register(String name, String version, Class cmd) throws OnapCommandInvalidRegistration, OnapCommandRegistrationProductInfoMissing { @@ -135,16 +132,15 @@ public class OnapCommandRegistrar { private OnapCommandRegistrar() { this.enabledProductVersion = System.getenv(OnapCommandConstants.OPEN_CLI_PRODUCT_IN_USE_ENV_NAME); - if (this.enabledProductVersion == null) { - this.enabledProductVersion = OnapCommandConfig.getPropertyValue(OnapCommandConstants.OPEN_CLI_PRODUCT_NAME); + if (this.enabledProductVersion == null) { + this.enabledProductVersion = OnapCommandConfig.getPropertyValue(OnapCommandConstants.OPEN_CLI_PRODUCT_NAME); } } /** * Get global registrar. * - * @throws OnapCommandException - * exception + * @throws OnapCommandException exception */ public static OnapCommandRegistrar getRegistrar() throws OnapCommandException { if (registrar == null) { @@ -177,7 +173,7 @@ public class OnapCommandRegistrar { return cmds; } - for (String cmd: this.registry.keySet()) { + for (String cmd : this.registry.keySet()) { if (cmd.split(":")[1].equalsIgnoreCase(version)) { cmds.add(cmd.split(":")[0]); } @@ -213,8 +209,7 @@ public class OnapCommandRegistrar { * Returns command details. * * @return map - * @throws OnapCommandException - * exception + * @throws OnapCommandException exception */ public List listCommandInfo() throws OnapCommandException { return OnapCommandDiscoveryUtils.discoverSchemas(); @@ -223,11 +218,9 @@ public class OnapCommandRegistrar { /** * Get the OnapCommand, which CLI main would use to find the command based on the command name. * - * @param cmdName - * Name of command + * @param cmdName Name of command * @return OnapCommand - * @throws OnapCommandException - * Exception + * @throws OnapCommandException Exception */ public OnapCommand get(String cmdName) throws OnapCommandException { return this.get(cmdName, this.getEnabledProductVersion()); @@ -236,13 +229,10 @@ public class OnapCommandRegistrar { /** * Get the OnapCommand, which CLI main would use to find the command based on the command name. * - * @param cmdName - * Name of command - * @param version - * product version + * @param cmdName Name of command + * @param version product version * @return OnapCommand - * @throws OnapCommandException - * Exception + * @throws OnapCommandException Exception */ public OnapCommand get(String cmdName, String version) throws OnapCommandException { Class cls = registry.get(cmdName + ":" + version); @@ -293,9 +283,9 @@ public class OnapCommandRegistrar { } //First check if there is an specific plugin exist, otherwise check for profile plugin - if (plugins.containsKey(schema.getSchemaName())) { - this.register(schema.getCmdName(), schema.getProduct(), plugins.get(schema.getSchemaName())); - } else if (plugins.containsKey(schema.getSchemaProfile())) { + if (plugins.containsKey(schema.getSchemaName())) { + this.register(schema.getCmdName(), schema.getProduct(), plugins.get(schema.getSchemaName())); + } else if (plugins.containsKey(schema.getSchemaProfile())) { this.register(schema.getCmdName(), schema.getProduct(), plugins.get(schema.getSchemaProfile())); } else { LOG.info("Ignoring schema " + schema.getSchemaURI()); @@ -315,7 +305,7 @@ public class OnapCommandRegistrar { } String buildTime = OnapCommandHelperUtils.findLastBuildTime(); - if (buildTime!= null && !buildTime.isEmpty()) { + if (buildTime != null && !buildTime.isEmpty()) { buildTime = " [" + buildTime + "]"; } else { buildTime = ""; @@ -341,8 +331,7 @@ public class OnapCommandRegistrar { * Provides the help message in tabular format for all commands registered in this registrar. * * @return string - * @throws OnapCommandHelpFailed - * Help cmd failed + * @throws OnapCommandHelpFailed Help cmd failed */ public String getHelp() throws OnapCommandHelpFailed { return this.getHelp(false); @@ -387,7 +376,7 @@ public class OnapCommandRegistrar { OnapCommand cmd; try { if (!isEnabledProductVersionOnly) { - String []cmdVer = cmdName.split(":"); + String[] cmdVer = cmdName.split(":"); cmd = this.get(cmdVer[0], cmdVer[1]); attr.getValues().add(cmdVer[0]); attrVer.getValues().add(cmdVer[1]); @@ -409,4 +398,8 @@ public class OnapCommandRegistrar { throw new OnapCommandHelpFailed(e); } } + + public List> getTestSuite(String cmd) throws OnapCommandException { + return OnapCommandDiscoveryUtils.createTestSuite(cmd, enabledProductVersion); + } } diff --git a/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaInfo.java b/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaInfo.java index 67675480..af444b8f 100644 --- a/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaInfo.java +++ b/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaInfo.java @@ -19,6 +19,9 @@ package org.onap.cli.fw.schema; import org.onap.cli.fw.cmd.OnapCommandType; import org.onap.cli.fw.conf.OnapCommandConstants; +import java.util.ArrayList; +import java.util.List; + /** * OnapCommandSchemaInfo is used in discovery caching. * @@ -39,6 +42,8 @@ public class OnapCommandSchemaInfo { private String product; + private List sampleFiles = new ArrayList(); + /** * OCS version */ @@ -118,5 +123,7 @@ public class OnapCommandSchemaInfo { this.ignore = ignore; } - + public List getSampleFiles() { + return sampleFiles; + } } diff --git a/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaLoader.java b/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaLoader.java index 439eb970..628ddf3a 100644 --- a/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaLoader.java +++ b/framework/src/main/java/org/onap/cli/fw/schema/OnapCommandSchemaLoader.java @@ -67,6 +67,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.io.FileUtils; import org.onap.cli.fw.cmd.OnapCommand; import org.onap.cli.fw.cmd.OnapCommandType; import org.onap.cli.fw.conf.OnapCommandConfig; @@ -524,26 +525,8 @@ public class OnapCommandSchemaLoader { /** * Get schema map. * - * @param resource - * resource obj - * @return map - * @throws OnapCommandInvalidSchema - * exception - */ - public static Map loadSchema(Resource resource) throws OnapCommandInvalidSchema { - try { - return loadSchema(resource.getInputStream(), resource.getFilename()); - } catch (IOException e) { - throw new OnapCommandInvalidSchema(resource.getFilename(), e); - } - - } - - /** - * Get schema map. - * - * @param resource - * resource obj + * @param stream + * @param schemaName * @return map * @throws OnapCommandInvalidSchema * exception diff --git a/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandDiscoveryUtils.java b/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandDiscoveryUtils.java index b878503a..2b3cf941 100644 --- a/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandDiscoveryUtils.java +++ b/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandDiscoveryUtils.java @@ -16,33 +16,13 @@ package org.onap.cli.fw.utils; -import static org.onap.cli.fw.conf.OnapCommandConstants.DATA_DIRECTORY; -import static org.onap.cli.fw.conf.OnapCommandConstants.DATA_PATH_JSON_PATTERN; -import static org.onap.cli.fw.conf.OnapCommandConstants.DISCOVERY_FILE; -import static org.onap.cli.fw.conf.OnapCommandConstants.NAME; -import static org.onap.cli.fw.conf.OnapCommandConstants.OPEN_CLI_SCHEMA_VERSION; -import static org.onap.cli.fw.conf.OnapCommandConstants.SCHEMA_DIRECTORY; -import static org.onap.cli.fw.conf.OnapCommandConstants.SCHEMA_PATH_PATERN; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.ServiceLoader; -import java.util.Map.Entry; - +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.FileUtils; import org.onap.cli.fw.cmd.OnapCommand; import org.onap.cli.fw.conf.OnapCommandConfig; import org.onap.cli.fw.conf.OnapCommandConstants; -import org.onap.cli.fw.error.OnapCommandDiscoveryFailed; -import org.onap.cli.fw.error.OnapCommandException; -import org.onap.cli.fw.error.OnapCommandInstantiationFailed; -import org.onap.cli.fw.error.OnapCommandInvalidSchema; +import org.onap.cli.fw.error.*; +import org.onap.cli.fw.registrar.OnapCommandRegistrar; import org.onap.cli.fw.schema.OnapCommandSchemaInfo; import org.onap.cli.fw.schema.OnapCommandSchemaLoader; import org.springframework.core.io.Resource; @@ -50,7 +30,13 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.yaml.snakeyaml.Yaml; -import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +import static org.onap.cli.fw.conf.OnapCommandConstants.*; public class OnapCommandDiscoveryUtils { @@ -248,7 +234,7 @@ public class OnapCommandDiscoveryUtils { for (Resource resource : res) { try { - resourceMap = OnapCommandSchemaLoader.loadSchema(resource); + resourceMap = loadYaml(resource); } catch (OnapCommandException e) { OnapCommandUtils.LOG.error("Ignores invalid schema " + resource.getURI().toString(), e); continue; @@ -297,9 +283,34 @@ public class OnapCommandDiscoveryUtils { throw new OnapCommandDiscoveryFailed(SCHEMA_DIRECTORY, e); } + try { + Resource[] samples = findResources(OnapCommandConstants.VERIFY_SAMPLES_FILE_PATTERN); + for (Resource sample : samples) { + updateSchemaInfoWithSample(sample, extSchemas); + } + } catch (IOException e) { + throw new OnapCommandDiscoveryFailed(OnapCommandConstants.VERIFY_SAMPLES_DIRECTORY, e); + } + return extSchemas; } + private static void updateSchemaInfoWithSample(Resource sampleResourse, + List schemaInfos) throws OnapCommandInvalidSchema, IOException { + Map infoMap = loadSchema(sampleResourse); + String cmdName = (String) infoMap.get(OnapCommandConstants.VERIFY_CMD_NAME); + String version = (String) infoMap.get(OnapCommandConstants.VERIFY_CMD_VERSION); + + Optional optSchemaInfo = schemaInfos.stream() + .filter(e -> e.getCmdName().equals(cmdName) && e.getProduct().equals(version)) + .findFirst(); + + if (optSchemaInfo.isPresent()) { + OnapCommandSchemaInfo onapCommandSchemaInfo = optSchemaInfo.get(); + onapCommandSchemaInfo.getSampleFiles().add(sampleResourse.getFilename()); + } + } + /** * Discover the Oclip commands. * @@ -329,4 +340,92 @@ public class OnapCommandDiscoveryUtils { } } + + public static List> createTestSuite(String cmd, String version) throws OnapCommandException { + + ArrayList> testSamples = new ArrayList(); + + List resources = new ArrayList(); + OnapCommandSchemaInfo schemaInfo = getSchemaInfo(cmd, version); + + List sampleFiles = new ArrayList(); + if (schemaInfo != null && !schemaInfo.getSampleFiles().isEmpty()) { + sampleFiles.addAll(schemaInfo.getSampleFiles()); + } + + for (String sampleFile : sampleFiles) { + try { + Resource resource = OnapCommandDiscoveryUtils.findResource(sampleFile, + OnapCommandConstants.VERIFY_SAMPLES_FILE_PATTERN); + resources.add(resource); + } catch (IOException e) { + throw new OnapCommandInvalidSample("Sample file does not exist : " + sampleFile , e); + } + } + + for (Resource resource : resources) { + + Map stringMap = OnapCommandDiscoveryUtils.loadYaml(resource); + Map> samples = (Map>) stringMap + .get(OnapCommandConstants.VERIFY_SAMPLES); + + for (String sampleId : samples.keySet()) { + + Map sample = samples.get(sampleId); + + List inputArgs = new ArrayList(); + inputArgs.add(cmd); + if (sample.get(OnapCommandConstants.VERIFY_INPUT) != null) { + inputArgs.addAll(Arrays.asList(sample.get(OnapCommandConstants.VERIFY_INPUT).trim().split(" "))); + } + inputArgs.add(OnapCommandConstants.VERIFY_LONG_OPTION); + + HashMap map = new HashMap(); + map.put(OnapCommandConstants.VERIFY_INPUT, inputArgs); + map.put(OnapCommandConstants.VERIFY_OUPUT, sample.get(OnapCommandConstants.VERIFY_OUPUT)); + map.put(OnapCommandConstants.VERIFY_MOCO, sample.get(OnapCommandConstants.VERIFY_MOCO)); + map.put(OnapCommandConstants.VERIFY_SAMPLE_FILE_ID, resource.getFilename()); + map.put(OnapCommandConstants.VERIFY_SAMPLE_ID, sampleId); + testSamples.add(map); + } + } + return testSamples; + } + + /** + * Get schema map. + * + * @param resource + * resource obj + * @return map + * @throws OnapCommandInvalidSchema + * exception + */ + public static Map loadYaml(Resource resource) throws OnapCommandInvalidSchema { + Map values = null; + try { + values = (Map) new Yaml().load(resource.getInputStream()); + } catch (Exception e) { + throw new OnapCommandInvalidSchema(resource.getFilename(), e); + } + return values; + } + + /** + * Get schema map. + * + * @param filePath + * @return map + * @throws OnapCommandInvalidSchema + * exception + */ + public static Map loadYaml(String filePath) throws OnapCommandInvalidSchema { + Map values = null; + try { + values = (Map) new Yaml().load(FileUtils.readFileToString(new File(filePath))); + } catch (Exception e) { + throw new OnapCommandInvalidSchema(filePath, e); + } + return values; + } } diff --git a/framework/src/main/resources/open-cli-schema/default_input_parameters.yaml b/framework/src/main/resources/open-cli-schema/default_input_parameters.yaml index 1dbeedb4..652401e3 100644 --- a/framework/src/main/resources/open-cli-schema/default_input_parameters.yaml +++ b/framework/src/main/resources/open-cli-schema/default_input_parameters.yaml @@ -43,10 +43,20 @@ parameters: long_option: no-title default_value: false is_default_param: true + - name: verify + type: bool + description: verify the command using available command sample file and mocking file + short_option: V + long_option: verify + default_value: false + is_default_param: true + is_include: false + is_optional: true - name: context type: map description: command context short_option: D long_option: context is_default_param: true + is_optional: true is_optional: true \ No newline at end of file diff --git a/framework/src/test/java/org/onap/cli/fw/utils/OnapCommandUtilsTest.java b/framework/src/test/java/org/onap/cli/fw/utils/OnapCommandUtilsTest.java index 6b465c09..1d7c2422 100644 --- a/framework/src/test/java/org/onap/cli/fw/utils/OnapCommandUtilsTest.java +++ b/framework/src/test/java/org/onap/cli/fw/utils/OnapCommandUtilsTest.java @@ -183,7 +183,7 @@ public class OnapCommandUtilsTest { } Map map = OnapCommandUtils.getInputMap(cmd.getParameters()); - assertTrue(map.size() == 17); + assertTrue(map.size() == 18); } @Test -- cgit 1.2.3-korg