From a4cd2403a5a171d6ab6aa6b1b0b1aae83345121b Mon Sep 17 00:00:00 2001 From: Kanagaraj Manickam k00365106 Date: Tue, 29 Aug 2017 18:15:10 +0530 Subject: Add versioning for command By allowing to add version to the YAML, helps to create same command for multiple versions of product say onap 1.0, 1.1 CLI-37 Change-Id: Ic3982ea912045ff4f422fcf093cbd98ecd99716d Signed-off-by: Kanagaraj Manickam k00365106 --- .../src/main/java/org/onap/cli/fw/OnapCommand.java | 10 ++ .../java/org/onap/cli/fw/OnapCommandRegistrar.java | 110 +++++++++++++++------ .../java/org/onap/cli/fw/OnapCommandSchema.java | 7 ++ .../java/org/onap/cli/fw/ad/OnapAuthClient.java | 10 +- .../onap/cli/fw/cmd/OnapSchemaRefreshCommand.java | 2 +- .../onap/cli/fw/cmd/OnapSchemaValidateCommand.java | 2 +- .../main/java/org/onap/cli/fw/conf/Constants.java | 5 +- .../org/onap/cli/fw/conf/OnapCommandConfg.java | 37 ++++--- .../org/onap/cli/fw/error/OnapCommandNotFound.java | 5 +- .../OnapCommandRegistrationVersionMissing.java | 30 ++++++ .../java/org/onap/cli/fw/utils/ExternalSchema.java | 31 ++++++ .../org/onap/cli/fw/utils/OnapCommandUtils.java | 23 ++++- .../resources/onap-cli-schema/schema-refresh.yaml | 27 +++++ .../resources/onap-cli-schema/schema-validate.yaml | 38 +++++++ framework/src/main/resources/onap.properties | 6 +- framework/src/main/resources/schema-refresh.yaml | 26 ----- framework/src/main/resources/schema-validate.yaml | 37 ------- .../org/onap/cli/cmd/sample/OnapCommandSample.java | 2 +- .../org/onap/cli/fw/OnapCommandRegistrarTest.java | 20 ++-- .../onap/cli/fw/error/OnapCommandErrorTest.java | 6 +- .../onap/cli/fw/utils/OnapCommandUtilsTest.java | 6 +- .../cli/fw/utils/OpenCommandRegistrarTest.java | 4 +- .../onap-cli-schema/sample-test1-schema-http.yaml | 1 + framework/src/test/resources/onap-test-schema.yaml | 1 + framework/src/test/resources/onap.properties | 56 +++++++++++ ...e-test-invalid-schema-duplicate-longoption.yaml | 1 + .../sample-test-invalid-schema-duplicate-name.yaml | 1 + ...-test-invalid-schema-duplicate-shortoption.yaml | 1 + .../test/resources/sample-test-invalid-schema.yaml | 3 +- .../sample-test-schema-auth-required.yaml | 1 + .../test/resources/sample-test-schema-http.yaml | 1 + .../test/resources/sample-test-schema-swagger.yaml | 1 + .../src/test/resources/sample-test-schema.yaml | 1 + 33 files changed, 371 insertions(+), 141 deletions(-) create mode 100644 framework/src/main/java/org/onap/cli/fw/error/OnapCommandRegistrationVersionMissing.java create mode 100644 framework/src/main/resources/onap-cli-schema/schema-refresh.yaml create mode 100644 framework/src/main/resources/onap-cli-schema/schema-validate.yaml delete mode 100644 framework/src/main/resources/schema-refresh.yaml delete mode 100644 framework/src/main/resources/schema-validate.yaml create mode 100644 framework/src/test/resources/onap.properties (limited to 'framework') diff --git a/framework/src/main/java/org/onap/cli/fw/OnapCommand.java b/framework/src/main/java/org/onap/cli/fw/OnapCommand.java index 08cbc3bc..c65ca9a8 100644 --- a/framework/src/main/java/org/onap/cli/fw/OnapCommand.java +++ b/framework/src/main/java/org/onap/cli/fw/OnapCommand.java @@ -58,6 +58,8 @@ public abstract class OnapCommand { private String cmdSchemaName; + private String cmdVersion; + private OnapService onapService = new OnapService(); private List cmdParameters = new ArrayList<>(); @@ -324,4 +326,12 @@ public abstract class OnapCommand { return OnapCommandUtils.help(this); } // (mrkanag) Add toString for all command, parameter, result, etc objects in JSON format + + public void setVersion(String version) { + this.cmdVersion = version; + } + + public String getVersion() { + return this.cmdVersion; + } } diff --git a/framework/src/main/java/org/onap/cli/fw/OnapCommandRegistrar.java b/framework/src/main/java/org/onap/cli/fw/OnapCommandRegistrar.java index 567e0381..ca875b35 100644 --- a/framework/src/main/java/org/onap/cli/fw/OnapCommandRegistrar.java +++ b/framework/src/main/java/org/onap/cli/fw/OnapCommandRegistrar.java @@ -16,6 +16,14 @@ package org.onap.cli.fw; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.onap.cli.fw.cmd.OnapHttpCommand; import org.onap.cli.fw.conf.Constants; import org.onap.cli.fw.conf.OnapCommandConfg; @@ -24,6 +32,7 @@ import org.onap.cli.fw.error.OnapCommandHelpFailed; import org.onap.cli.fw.error.OnapCommandInvalidRegistration; import org.onap.cli.fw.error.OnapCommandNotFound; import org.onap.cli.fw.error.OnapCommandRegistrationFailed; +import org.onap.cli.fw.error.OnapCommandRegistrationVersionMissing; import org.onap.cli.fw.output.OnapCommandResult; import org.onap.cli.fw.output.OnapCommandResultAttribute; import org.onap.cli.fw.output.OnapCommandResultAttributeScope; @@ -32,24 +41,17 @@ import org.onap.cli.fw.output.ResultType; import org.onap.cli.fw.utils.ExternalSchema; import org.onap.cli.fw.utils.OnapCommandUtils; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Onap Command registrar provides a common place, where every command would get registered automatically when its * loaded into JVM. * */ public class OnapCommandRegistrar { - /* - * static { //Start the AOP for logging new OnapCommandLogger(); } - */ + private Map> registry = new HashMap<>(); + private Set availableProductVersions = new HashSet<>(); + private static OnapCommandRegistrar registrar = null; /** @@ -61,9 +63,15 @@ public class OnapCommandRegistrar { * Command Class * @throws OnapCommandInvalidRegistration * Invalid registration exception + * @throws OnapCommandRegistrationVersionMissing */ - public void register(String name, Class cmd) throws OnapCommandInvalidRegistration { - this.registry.put(name, cmd); + public void register(String name, String version, Class cmd) throws OnapCommandInvalidRegistration, OnapCommandRegistrationVersionMissing { + if (version == null || version.isEmpty()) { + throw new OnapCommandRegistrationVersionMissing(name); + } + + this.registry.put(name + ":" + version, cmd); + this.availableProductVersions.add(version); } /** @@ -91,6 +99,27 @@ public class OnapCommandRegistrar { return this.registry.keySet(); } + /** + * Get the list of discovered commands for a given product version in registrar. + * + * @return set + */ + public Set listCommandsForEnabledProductVersion() { + String version = OnapCommandConfg.getEnabledProductVersion(); + + Set cmds = new HashSet<>(); + if (!this.availableProductVersions.contains(version)) { + return cmds; + } + + for (String cmd: this.registry.keySet()) { + if (cmd.split(":")[1].equalsIgnoreCase(version)) { + cmds.add(cmd.split(":")[0]); + } + } + return cmds; + } + /** * Returns map of command to schema. * @@ -103,7 +132,7 @@ public class OnapCommandRegistrar { List schemas = OnapCommandUtils.findAllExternalSchemas(); if (schemas != null) { for (ExternalSchema schema : schemas) { - map.put(schema.getCmdName(), schema.getSchemaName()); + map.put(schema.getCmdName() + ":" + schema.getCmdVersion(), schema.getSchemaName()); } } if (this.registry != null) { @@ -127,19 +156,23 @@ public class OnapCommandRegistrar { * Exception */ public OnapCommand get(String cmdName) throws OnapCommandException { - OnapCommand cmd; - Class cls = registry.get(cmdName); + return this.get(cmdName, OnapCommandConfg.getEnabledProductVersion()); + } + + private OnapCommand get(String cmdName, String version) throws OnapCommandException { + Class cls = registry.get(cmdName + ":" + version); if (cls == null) { - throw new OnapCommandNotFound(cmdName); + throw new OnapCommandNotFound(cmdName, version); } + OnapCommand cmd; try { Constructor constr = cls.getConstructor(); cmd = (OnapCommand) constr.newInstance(); String schemaName; if (cmd.getClass().equals(OnapHttpCommand.class)) { // NOSONAR - schemaName = OnapCommandUtils.loadExternalSchemaFromJson(cmdName).getSchemaName(); + schemaName = OnapCommandUtils.loadExternalSchemaFromJson(cmdName, version).getSchemaName(); } else { schemaName = this.getSchemaFileName(cls); } @@ -152,13 +185,13 @@ public class OnapCommandRegistrar { return cmd; } - private void autoDiscover() throws OnapCommandInvalidRegistration { + private void autoDiscover() throws OnapCommandInvalidRegistration, OnapCommandRegistrationVersionMissing { List> cmds = OnapCommandUtils.findOnapCommands(); for (Class cmd : cmds) { if (cmd.isAnnotationPresent(OnapCommandSchema.class)) { OnapCommandSchema ano = cmd.getAnnotation(OnapCommandSchema.class); - this.register(ano.name(), cmd); + this.register(ano.name(), ano.version(), cmd); } } } @@ -166,15 +199,14 @@ public class OnapCommandRegistrar { private void autoDiscoverHttpSchemas() throws OnapCommandException { List schemas = OnapCommandUtils.loadExternalSchemasFromJson(); for (ExternalSchema schema : schemas) { - this.register(schema.getCmdName(), OnapHttpCommand.class); + if (schema.isHttp()) { + this.register(schema.getCmdName(), schema.getCmdVersion(), OnapHttpCommand.class); + } } } private String getSchemaFileName(Class cmd) { OnapCommandSchema ano = (OnapCommandSchema) cmd.getAnnotation(OnapCommandSchema.class); - if (ano.schema().isEmpty()) { - return "onap-" + ano.name() + "-schema.yaml"; - } return ano.schema(); } @@ -188,7 +220,18 @@ public class OnapCommandRegistrar { if (version == null) { version = OnapCommandConfg.getVersion(); } - return version; + + String configuredProductVersion = OnapCommandConfg.getEnabledProductVersion(); + + String errorNote = ""; + if (!this.availableProductVersions.contains(configuredProductVersion)) { + errorNote = "** CUATION: Please configure the enabled product version to use one of " + this.availableProductVersions.toString() + + ".\nTo enable a product version, set env variable CLI_PRODUCT_VERSION or cli.product.version in onap.properties"; + } + return "CLI version : " + version + "\n" + + "Available product versions: " + this.availableProductVersions.toString() + "\n" + + "Enabled product version : " + configuredProductVersion + "\n" + + errorNote; } /** @@ -209,6 +252,12 @@ public class OnapCommandRegistrar { attr.setScope(OnapCommandResultAttributeScope.SHORT); help.getRecords().add(attr); + OnapCommandResultAttribute attrVer = new OnapCommandResultAttribute(); + attrVer.setName(Constants.PRODUCT_VERSION.toUpperCase()); + attrVer.setDescription(Constants.DESCRIPTION); + attrVer.setScope(OnapCommandResultAttributeScope.SHORT); + help.getRecords().add(attrVer); + OnapCommandResultAttribute attrSrv = new OnapCommandResultAttribute(); attrSrv.setName(Constants.SERVICE.toUpperCase()); attrSrv.setDescription(Constants.SERVICE); @@ -224,18 +273,19 @@ public class OnapCommandRegistrar { for (String cmdName : OnapCommandUtils.sort(this.listCommands())) { OnapCommand cmd; try { - cmd = this.get(cmdName); + String []cmdVer = cmdName.split(":"); + cmd = this.get(cmdVer[0], cmdVer[1]); + attr.getValues().add(cmdVer[0]); + attrVer.getValues().add(cmdVer[1]); + attrSrv.getValues().add(cmd.printVersion()); + attrDesc.getValues().add(cmd.getDescription()); } catch (OnapCommandException e) { throw new OnapCommandHelpFailed(e); } - - attr.getValues().add(cmd.getName()); - attrSrv.getValues().add(cmd.printVersion()); - attrDesc.getValues().add(cmd.getDescription()); } try { - return "\n\nOnap sub-commands:\n" + help.print(); + return "\n\nOnap sub-commands:\n" + help.print() + "\n" + this.getVersion(); } catch (OnapCommandException e) { throw new OnapCommandHelpFailed(e); } diff --git a/framework/src/main/java/org/onap/cli/fw/OnapCommandSchema.java b/framework/src/main/java/org/onap/cli/fw/OnapCommandSchema.java index 853d3583..471ab057 100644 --- a/framework/src/main/java/org/onap/cli/fw/OnapCommandSchema.java +++ b/framework/src/main/java/org/onap/cli/fw/OnapCommandSchema.java @@ -39,6 +39,13 @@ public @interface OnapCommandSchema { */ String name(); + /** + * Command version + * + * @return + */ + String version(); + /** * Schema file name placed under class path * diff --git a/framework/src/main/java/org/onap/cli/fw/ad/OnapAuthClient.java b/framework/src/main/java/org/onap/cli/fw/ad/OnapAuthClient.java index e9d495c6..458a7587 100644 --- a/framework/src/main/java/org/onap/cli/fw/ad/OnapAuthClient.java +++ b/framework/src/main/java/org/onap/cli/fw/ad/OnapAuthClient.java @@ -54,8 +54,6 @@ public class OnapAuthClient { private OnapService service = new OnapService(); - private String authType = OnapCommandConfg.getAuthType(); - private Map paramMap = new HashMap<>(); public OnapAuthClient(OnapCredentials creds, boolean debug, OnapService service, List params) throws OnapCommandHttpFailure, OnapCommandInvalidParameterValue { @@ -64,7 +62,6 @@ public class OnapAuthClient { for (OnapCommandParameter param : params) { paramMap.put(param.getName(), param.getValue().toString()); } - this.authType = service.getAuthType(); this.http = new OnapHttpConnection(creds.getHostUrl().startsWith("https"), debug); } @@ -88,15 +85,14 @@ public class OnapAuthClient { return; } - if (this.authType.equalsIgnoreCase(Constants.AUTH_BASIC)) { + if (this.service.getAuthType().equalsIgnoreCase(Constants.AUTH_BASIC)) { String authToken = BasicScheme.authenticate(new UsernamePasswordCredentials( creds.getUsername(), creds.getPassword()), "UTF-8", false).getValue(); Map mapHeaders = OnapCommandConfg.getBasicCommonHeaders(this.paramMap); - if(this.service.getName() != null){ - mapHeaders.putAll(OnapCommandConfg.getServiceHeaders(this.service.getName(), this.paramMap)); - } + mapHeaders.putAll(OnapCommandConfg.getServiceHeaders(this.service.getName(), this.paramMap)); mapHeaders.put(OnapCommandConfg.getXAuthTokenName(), authToken); + this.http.setCommonHeaders(mapHeaders); return; } diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaRefreshCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaRefreshCommand.java index 57432751..81cdfca2 100644 --- a/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaRefreshCommand.java +++ b/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaRefreshCommand.java @@ -30,7 +30,7 @@ import java.util.List; * Refresh external schema. * */ -@OnapCommandSchema(name = "schema-refresh", schema = "schema-refresh.yaml") +@OnapCommandSchema(name = "schema-refresh", version="0.0", schema = "schema-refresh.yaml") public class OnapSchemaRefreshCommand extends OnapCommand { @Override diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaValidateCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaValidateCommand.java index b1811483..140ac818 100644 --- a/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaValidateCommand.java +++ b/framework/src/main/java/org/onap/cli/fw/cmd/OnapSchemaValidateCommand.java @@ -29,7 +29,7 @@ import java.util.Map; /** * Validate schema command. */ -@OnapCommandSchema(name = "schema-validate", schema = "schema-validate.yaml") +@OnapCommandSchema(name = "schema-validate", version="0.0", schema = "schema-validate.yaml") public class OnapSchemaValidateCommand extends OnapCommand { @Override diff --git a/framework/src/main/java/org/onap/cli/fw/conf/Constants.java b/framework/src/main/java/org/onap/cli/fw/conf/Constants.java index e9b158e7..980b94d3 100644 --- a/framework/src/main/java/org/onap/cli/fw/conf/Constants.java +++ b/framework/src/main/java/org/onap/cli/fw/conf/Constants.java @@ -129,6 +129,8 @@ public class Constants { public static final String CONF = "onap.properties"; public static final String ONAP_IGNORE_AUTH = "cli.ignore_auth"; public static final String ONAP_CLI_VERSION = "cli.version"; + public static final String ONAP_CLI_PRODUCT_VERSION = "cli.product.version"; + public static final String ONAP_CLI_PRODUCT_VERSION_ENV_NAME = "CLI_PRODUCT_VERSION"; public static final String HTTP_API_KEY_USE_COOKIES = "cli.http.api_key_use_cookies"; public static final String EXCLUDE_PARAMS_INTERNAL_CMD = "cli.exclude_params_internal_cmd"; public static final String NO_AUTH_DISABLE_INCLUDE_PARAMS_EXTERNAL_CMD = "cli.no_auth_disable_include_params_external_cmd"; @@ -146,7 +148,7 @@ public class Constants { public static final String EXTERNAL_JSON_PATTERN = "/**/*.json"; public static final String EXTERNAL_SCHEMA_PATH_PATERN = EXTERNAL_SCHEMA_DIRECTORY + EXTERNAL_YAML_PATTERN; public static final String EXTERNAL_DISCOVERY_DIRECTORY = "data"; - public static final String EXTERNAL_DISCOVERY_FILE = "external-schema.json"; + public static final String EXTERNAL_DISCOVERY_FILE = "cli-schema.json"; public static final String EXTERNAL_DISCOVERY_DIRECTORY_PATTERN = EXTERNAL_DISCOVERY_DIRECTORY + EXTERNAL_JSON_PATTERN; @@ -177,6 +179,7 @@ public class Constants { public static final String DEFAULT_SCHEMA_FILE_NAME = "default_input_parameters.yaml"; + public static final String PRODUCT_VERSION = "product version"; // Error message public static final String SCHEMA_INVALID_DEFAULT_PARAMS_SECTION = "Invalid default_parameter section"; public static final String SCHEMA_FILE_EMPTY = "The schema file cann't be null or empty"; diff --git a/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfg.java b/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfg.java index 479431f2..5ca0589f 100644 --- a/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfg.java +++ b/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfg.java @@ -68,6 +68,14 @@ public final class OnapCommandConfg { return prps.getProperty(Constants.ONAP_CLI_VERSION); } + public static String getEnabledProductVersion() { + String version = System.getenv(Constants.ONAP_CLI_PRODUCT_VERSION_ENV_NAME); + if (version == null) { + version = prps.getProperty(Constants.ONAP_CLI_PRODUCT_VERSION); + } + return version; + } + /** * checks if cookies based auth. * @@ -103,22 +111,25 @@ public final class OnapCommandConfg { private static Map getHeaderValues(String headerKey, Map paramMap) { Map mapHeaders = new HashMap (); - Arrays.stream(prps.getProperty(headerKey) // NOSONAR - .split(",")).map(String::trim).forEach(header -> { - String headerName = prps.getProperty(headerKey+ "." + header); - String headerValue = prps.getProperty(headerKey + "." + header + ".value", null); - if (headerValue != null) { - headerValue = headerValue.replaceAll("uuid", UUID.randomUUID().toString()); - if (headerValue.contains("${")) { - String param = headerValue.substring(headerValue.indexOf("${")+2 ,headerValue.indexOf("}")); - String pattern = "${"+param+"}"; - headerValue = headerValue.replace(pattern, paramMap.getOrDefault(param, param)); + if (prps.containsKey(headerKey)) { + Arrays.stream(prps.getProperty(headerKey) // NOSONAR + .split(",")).map(String::trim).forEach(header -> { + String headerName = prps.getProperty(headerKey+ "." + header); + String headerValue = prps.getProperty(headerKey + "." + header + ".value", null); + if (headerValue != null) { + headerValue = headerValue.replaceAll("uuid", UUID.randomUUID().toString()); + if (headerValue.contains("${")) { + String param = headerValue.substring(headerValue.indexOf("${")+2 ,headerValue.indexOf("}")); + String pattern = "${"+param+"}"; + headerValue = headerValue.replace(pattern, paramMap.getOrDefault(param, param)); + } } - } - mapHeaders.put(headerName, headerValue); - }); + mapHeaders.put(headerName, headerValue); + }); + } return mapHeaders; } + public static Map getBasicCommonHeaders(Map paramMap) { return getHeaderValues(Constants.SERVICE_AUTH_BASIC_HTTP_HEADERS, paramMap); } diff --git a/framework/src/main/java/org/onap/cli/fw/error/OnapCommandNotFound.java b/framework/src/main/java/org/onap/cli/fw/error/OnapCommandNotFound.java index 172d60bb..4a070fb3 100644 --- a/framework/src/main/java/org/onap/cli/fw/error/OnapCommandNotFound.java +++ b/framework/src/main/java/org/onap/cli/fw/error/OnapCommandNotFound.java @@ -24,7 +24,8 @@ public class OnapCommandNotFound extends OnapCommandException { private static final long serialVersionUID = 6676137916079057963L; - public OnapCommandNotFound(String cmdName) { - super("0x0011", "Command " + cmdName + " is not registered"); + public OnapCommandNotFound(String cmdName, String version) { + super("0x0011", "Command " + cmdName + " is not available for product version " + version + + ". so please check command name or product version set in env variable CLI_PRODUCT_VERSION or cli.product.version in onap.properties"); } } diff --git a/framework/src/main/java/org/onap/cli/fw/error/OnapCommandRegistrationVersionMissing.java b/framework/src/main/java/org/onap/cli/fw/error/OnapCommandRegistrationVersionMissing.java new file mode 100644 index 00000000..2bad5a4c --- /dev/null +++ b/framework/src/main/java/org/onap/cli/fw/error/OnapCommandRegistrationVersionMissing.java @@ -0,0 +1,30 @@ +/* + * Copyright 2017 Huawei Technologies Co., Ltd. + * + * 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. + */ + +package org.onap.cli.fw.error; + +/** + * Command Not registered in Onap Command Registrar as version missing. + * + */ +public class OnapCommandRegistrationVersionMissing extends OnapCommandException { + + private static final long serialVersionUID = 5513297861129088463L; + + public OnapCommandRegistrationVersionMissing(String cmdName) { + super("0x0031", "Command " + cmdName + " version is missing"); + } +} diff --git a/framework/src/main/java/org/onap/cli/fw/utils/ExternalSchema.java b/framework/src/main/java/org/onap/cli/fw/utils/ExternalSchema.java index e9f19673..12f217ce 100644 --- a/framework/src/main/java/org/onap/cli/fw/utils/ExternalSchema.java +++ b/framework/src/main/java/org/onap/cli/fw/utils/ExternalSchema.java @@ -19,8 +19,11 @@ package org.onap.cli.fw.utils; public class ExternalSchema { private String schemaName; + private String schemaURI; private String cmdName; + private String cmdVersion; private String version; + private String http = "false"; public String getSchemaName() { return schemaName; @@ -46,4 +49,32 @@ public class ExternalSchema { this.version = version; } + public String getCmdVersion() { + return cmdVersion; + } + + public void setCmdVersion(String cmdVersion) { + this.cmdVersion = cmdVersion; + } + + public String getSchemaURI() { + return schemaURI; + } + + public void setSchemaURI(String schemaURI) { + this.schemaURI = schemaURI; + } + + public String getHttp() { + return http; + } + + public void setHttp(String internal) { + this.http = internal; + } + + public boolean isHttp() { + return this.getHttp().equals("true"); + } + } diff --git a/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandUtils.java b/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandUtils.java index 625c644b..b31b75cf 100644 --- a/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandUtils.java +++ b/framework/src/main/java/org/onap/cli/fw/utils/OnapCommandUtils.java @@ -25,6 +25,7 @@ import org.onap.cli.fw.ad.OnapCredentials; import org.onap.cli.fw.ad.OnapService; import org.onap.cli.fw.cmd.OnapHttpCommand; import org.onap.cli.fw.cmd.OnapSwaggerCommand; +import org.onap.cli.fw.conf.Constants; import org.onap.cli.fw.conf.OnapCommandConfg; import org.onap.cli.fw.error.OnapCommandDiscoveryFailed; import org.onap.cli.fw.error.OnapCommandException; @@ -372,6 +373,13 @@ public class OnapCommandUtils { } break; + case VERSION: + Object version = values.get(key); + if (version != null) { + cmd.setVersion(version.toString()); + } + break; + case DESCRIPTION: Object description = values.get(key); if (description != null) { @@ -1482,7 +1490,11 @@ public class OnapCommandUtils { for (Entry entry : resultMap.entrySet()) { String key = entry.getKey(); - resultsProcessed.put(key, replaceLineFromOutputResults(resultMap.get(key), resultHttp)); + try { + resultsProcessed.put(key, replaceLineFromOutputResults(resultMap.get(key), resultHttp)); + } catch(OnapCommandResultEmpty e) { + // pass // NOSONAR + } } return resultsProcessed; @@ -1508,9 +1520,14 @@ public class OnapCommandUtils { if (resourceMap != null && resourceMap.size() > 0) { ExternalSchema schema = new ExternalSchema(); schema.setSchemaName(resource.getFilename()); + schema.setSchemaURI(resource.getURI().toString()); schema.setCmdName((String) resourceMap.get(NAME)); Object obj = resourceMap.get(ONAP_CMD_SCHEMA_VERSION); schema.setVersion(obj.toString()); + schema.setCmdVersion(resourceMap.get(Constants.VERSION).toString()); + if (resourceMap.get(Constants.HTTP) != null) { + schema.setHttp("true"); + } extSchemas.add(schema); } } @@ -1672,12 +1689,12 @@ public class OnapCommandUtils { * @throws OnapCommandDiscoveryFailed * exception */ - public static ExternalSchema loadExternalSchemaFromJson(String cmd) throws OnapCommandException { + public static ExternalSchema loadExternalSchemaFromJson(String cmd, String version) throws OnapCommandException { List list = loadExternalSchemasFromJson(); ExternalSchema schemaStr = null; if (list != null) { for (ExternalSchema schema : list) { - if (cmd.equals(schema.getCmdName())) { + if (cmd.equals(schema.getCmdName()) && version.equals(schema.getCmdVersion())) { schemaStr = schema; break; } diff --git a/framework/src/main/resources/onap-cli-schema/schema-refresh.yaml b/framework/src/main/resources/onap-cli-schema/schema-refresh.yaml new file mode 100644 index 00000000..56492502 --- /dev/null +++ b/framework/src/main/resources/onap-cli-schema/schema-refresh.yaml @@ -0,0 +1,27 @@ +onap_cmd_schema_version: 1.0 +name: schema-refresh +description: Onap command to refresh schemas stored in onap_cli_schema folders. +version: 0.0 +service: + auth: none + name: onap-cli + version: 1.0.0 +results: + direction: landscape + attributes: + - name: sl-no + description: Serial Number + scope: short + type: string + - name: command + description: Command name + scope: short + type: string + - name: schema + description: Schema name + scope: short + type: string + - name: version + description: Schema version + scope: short + type: string \ No newline at end of file diff --git a/framework/src/main/resources/onap-cli-schema/schema-validate.yaml b/framework/src/main/resources/onap-cli-schema/schema-validate.yaml new file mode 100644 index 00000000..a4c1fd29 --- /dev/null +++ b/framework/src/main/resources/onap-cli-schema/schema-validate.yaml @@ -0,0 +1,38 @@ +onap_cmd_schema_version: 1.0 +name: schema-validate +description: Onap command to validate schema +version: 0.0 +service: + auth: none + name: onap-cli + version: 1.0.0 +default_parameters: + exclude: + - onap-username + - onap-password + - host-url + - no-auth +parameters: + - name: schema-location + type: url + description: Schema file location + short_option: l + long_option: schema-location + is_optional: false + - name: internal-schema + type: bool + description: Validate existing schema file + short_option: i + long_option: internal-schema + is_optional: false +results: + direction: landscape + attributes: + - name: sl-no + description: Serial Number of error + scope: short + type: string + - name: error + description: Schema validation error + scope: short + type: string \ No newline at end of file diff --git a/framework/src/main/resources/onap.properties b/framework/src/main/resources/onap.properties index 9d59f1e2..9e6b34bd 100644 --- a/framework/src/main/resources/onap.properties +++ b/framework/src/main/resources/onap.properties @@ -12,7 +12,6 @@ cli.no_auth_disable_include_params_external_cmd=onap-username,onap-password,host cli.no_auth_enable_exclude_params_external_cmd=onap-username,onap-password,no-auth cli.no_auth_enable_include_params_external_cmd=host-url -cli.service.auth=aaf cli.http.basic.common_headers=x-auth-token,x-transaction-id,x-app-id cli.http.basic.common_headers.x-auth-token=Authorization cli.http.basic.common_headers.x-transaction-id=X-TransactionId @@ -29,7 +28,7 @@ cli.http.basic.common_headers.sdc.user-id.value=${onap-username} #cli.service.auth=aaf #schema validation -cli.schema.top_level_params_list=onap_cmd_schema_version,name,description,service,parameters,results,http +cli.schema.top_level_params_list=onap_cmd_schema_version,name,version,description,service,parameters,results,http cli.schema.top_level_mandatory_list=onap_cmd_schema_version cli.schema.service_params_list=name,version,auth,mode @@ -52,3 +51,6 @@ cli.schema.http_methods=post,get,delete,put,head cli.schema.boolean_values=true,false cli.schema.auth_values=none,basic cli.schema.mode_values=direct,catalog + +#product version +cli.product.version=cli-1.0 diff --git a/framework/src/main/resources/schema-refresh.yaml b/framework/src/main/resources/schema-refresh.yaml deleted file mode 100644 index 59f2496c..00000000 --- a/framework/src/main/resources/schema-refresh.yaml +++ /dev/null @@ -1,26 +0,0 @@ -onap_cmd_schema_version: 1.0 -name: schema-refresh -description: Onap command to refresh schemas stored in onap_cli_schema folders. -service: - auth: none - name: onap-cli - version: 1.0.0 -results: - direction: landscape - attributes: - - name: sl-no - description: Serial Number - scope: short - type: string - - name: command - description: Command name - scope: short - type: string - - name: schema - description: Schema name - scope: short - type: string - - name: version - description: Schema version - scope: short - type: string \ No newline at end of file diff --git a/framework/src/main/resources/schema-validate.yaml b/framework/src/main/resources/schema-validate.yaml deleted file mode 100644 index 76945793..00000000 --- a/framework/src/main/resources/schema-validate.yaml +++ /dev/null @@ -1,37 +0,0 @@ -onap_cmd_schema_version: 1.0 -name: schema-validate -description: Onap command to validate schema -service: - auth: none - name: onap-cli - version: 1.0.0 -default_parameters: - exclude: - - onap-username - - onap-password - - host-url - - no-auth -parameters: - - name: schema-location - type: url - description: Schema file location - short_option: l - long_option: schema-location - is_optional: false - - name: internal-schema - type: bool - description: Validate existing schema file - short_option: i - long_option: internal-schema - is_optional: false -results: - direction: landscape - attributes: - - name: sl-no - description: Serial Number of error - scope: short - type: string - - name: error - description: Schema validation error - scope: short - type: string \ No newline at end of file diff --git a/framework/src/test/java/org/onap/cli/cmd/sample/OnapCommandSample.java b/framework/src/test/java/org/onap/cli/cmd/sample/OnapCommandSample.java index 69714ad7..16c92185 100644 --- a/framework/src/test/java/org/onap/cli/cmd/sample/OnapCommandSample.java +++ b/framework/src/test/java/org/onap/cli/cmd/sample/OnapCommandSample.java @@ -25,7 +25,7 @@ import org.onap.cli.fw.error.OnapCommandExecutionFailed; * This command helps to test the Command functionalities. * */ -@OnapCommandSchema(name = "sample-test", schema = "sample-test-schema.yaml") +@OnapCommandSchema(name = "sample-test", version="cli-1.0", schema = "sample-test-schema.yaml") public class OnapCommandSample extends OnapCommand { public OnapCommandSample() { diff --git a/framework/src/test/java/org/onap/cli/fw/OnapCommandRegistrarTest.java b/framework/src/test/java/org/onap/cli/fw/OnapCommandRegistrarTest.java index a076eee6..840a75d7 100644 --- a/framework/src/test/java/org/onap/cli/fw/OnapCommandRegistrarTest.java +++ b/framework/src/test/java/org/onap/cli/fw/OnapCommandRegistrarTest.java @@ -50,7 +50,7 @@ public class OnapCommandRegistrarTest { if (!file.exists()) { file.mkdir(); } else { - File f1 = new File(path + "/external-schema.json"); + File f1 = new File(path + "/cli-schema.json"); f1.delete(); } } @@ -60,7 +60,7 @@ public class OnapCommandRegistrarTest { public void registerTest() throws OnapCommandException { OnapCommand test = new OnapCommandTest(); Class cmd = (Class) test.getClass(); - registerar.register("Test", cmd); + registerar.register("Test", "cli-1.0", cmd); OnapCommand cc = registerar.get("Test"); assertTrue(cmd == cc.getClass()); @@ -71,7 +71,7 @@ public class OnapCommandRegistrarTest { public void cmdTestSchema() throws OnapCommandException { OnapCommand test = new OnapCommandTest(); Class cmd = (Class) test.getClass(); - registerar.register("Test", cmd); + registerar.register("Test", "cli-1.0", cmd); OnapCommand cc = registerar.get("Test"); } @@ -82,14 +82,16 @@ public class OnapCommandRegistrarTest { registerar.get("Test1"); fail("This should have thrown an exception"); } catch (OnapCommandNotFound e) { - assertEquals(e.getMessage(), "0x0011::Command Test1 is not registered"); + //pass // NOSONAR + } catch (Exception e) { + fail("This should have thrown an OnapCommandNotFound exception"); } } @Test public void onapCommandRegistrationFailedTest() throws OnapCommandException { - @OnapCommandSchema(name = "Test2", schema = "sample-test-schema.yaml") + @OnapCommandSchema(name = "Test2", version= "cli-1.0", schema = "sample-test-schema.yaml") class Test extends OnapCommand { @Override @@ -102,7 +104,7 @@ public class OnapCommandRegistrarTest { OnapCommand com = new Test(); Class cmd = (Class) com.getClass(); try { - registerar.register("Test2", cmd); + registerar.register("Test2", "cli-1.0", cmd); registerar.get("Test2"); fail("This should have thrown an exception"); } catch (OnapCommandRegistrationFailed e) { @@ -116,7 +118,7 @@ public class OnapCommandRegistrarTest { OnapCommand test = new OnapCommandTest1(); Class cmd = (Class) test.getClass(); registerar = new OnapCommandRegistrar(); - registerar.register("test1", cmd); + registerar.register("test1", "cli-1.0", cmd); String help = registerar.getHelp(); assertNotNull(help); } @@ -139,7 +141,7 @@ public class OnapCommandRegistrarTest { } } -@OnapCommandSchema(name = OnapCommandTest.CMD_NAME, schema = "sample-test-schema.yaml") +@OnapCommandSchema(name = OnapCommandTest.CMD_NAME, version = "cli-1.0", schema = "sample-test-schema.yaml") class OnapCommandTest extends OnapCommand { public OnapCommandTest() { @@ -154,7 +156,7 @@ class OnapCommandTest extends OnapCommand { } -@OnapCommandSchema(name = OnapCommandTest1.CMD_NAME, schema = "test-schema.yaml") +@OnapCommandSchema(name = OnapCommandTest1.CMD_NAME, version = "cli-1.0", schema = "test-schema.yaml") class OnapCommandTest1 extends OnapCommand { public OnapCommandTest1() { diff --git a/framework/src/test/java/org/onap/cli/fw/error/OnapCommandErrorTest.java b/framework/src/test/java/org/onap/cli/fw/error/OnapCommandErrorTest.java index 1d0c1a6b..0a388e5f 100644 --- a/framework/src/test/java/org/onap/cli/fw/error/OnapCommandErrorTest.java +++ b/framework/src/test/java/org/onap/cli/fw/error/OnapCommandErrorTest.java @@ -190,9 +190,11 @@ public class OnapCommandErrorTest { @Test public void onapCommandNotFoundTest() { - OnapCommandNotFound failed = new OnapCommandNotFound("Test"); + OnapCommandNotFound failed = new OnapCommandNotFound("Test", "1.0"); - assertEquals("0x0011::Command Test is not registered", failed.getMessage()); + assertEquals("0x0011::Command Test is not available for product version 1.0." + + " so please check command name or product version set in env variable CLI_PRODUCT_VERSION or" + + " cli.product.version in onap.properties", failed.getMessage()); } @Test 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 064576d8..5a992c6f 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 @@ -434,14 +434,14 @@ public class OnapCommandUtilsTest { } - @OnapCommandSchema(name = "sample-test", schema = "sample-test-schema.yaml") + @OnapCommandSchema(name = "sample-test", version = "cli-1.0", schema = "sample-test-schema.yaml") class OnapCommandSample extends OnapCommand { @Override protected void run() throws OnapCommandException { } } - @OnapCommandSchema(name = "sample-swagger-test", schema = "sample-test-schema-swagger.yaml") + @OnapCommandSchema(name = "sample-swagger-test", version = "cli-1.0", schema = "sample-test-schema-swagger.yaml") class OnapSwaggerBasedCommandSample extends OnapSwaggerCommand { @Override @@ -449,7 +449,7 @@ public class OnapCommandUtilsTest { } } - @OnapCommandSchema(name = "sample-http-test", schema = "sample-test-schema-http.yaml") + @OnapCommandSchema(name = "sample-http-test", version = "cli-1.0", schema = "sample-test-schema-http.yaml") class OnapHttpCommandSample extends OnapHttpCommand { @Override diff --git a/framework/src/test/java/org/onap/cli/fw/utils/OpenCommandRegistrarTest.java b/framework/src/test/java/org/onap/cli/fw/utils/OpenCommandRegistrarTest.java index fa73ea6e..f7ba2355 100644 --- a/framework/src/test/java/org/onap/cli/fw/utils/OpenCommandRegistrarTest.java +++ b/framework/src/test/java/org/onap/cli/fw/utils/OpenCommandRegistrarTest.java @@ -34,9 +34,9 @@ public class OpenCommandRegistrarTest { public void test() throws OnapCommandException { OnapCommandRegistrar registrar = OnapCommandRegistrar.getRegistrar(); OnapCommand cmd = registrar.get("sample-test"); - registrar.listCommands(); - registrar.getAllCommandToSchemaMap(); cmd.printVersion(); + registrar.listCommands(); + } } diff --git a/framework/src/test/resources/onap-cli-schema/sample-test1-schema-http.yaml b/framework/src/test/resources/onap-cli-schema/sample-test1-schema-http.yaml index 18a7bb16..0da1d22e 100644 --- a/framework/src/test/resources/onap-cli-schema/sample-test1-schema-http.yaml +++ b/framework/src/test/resources/onap-cli-schema/sample-test1-schema-http.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test1 description: Onap sample command to test the command features +version: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/onap-test-schema.yaml b/framework/src/test/resources/onap-test-schema.yaml index aa656064..0a2f5c47 100644 --- a/framework/src/test/resources/onap-test-schema.yaml +++ b/framework/src/test/resources/onap-test-schema.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +verion: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/onap.properties b/framework/src/test/resources/onap.properties new file mode 100644 index 00000000..9e6b34bd --- /dev/null +++ b/framework/src/test/resources/onap.properties @@ -0,0 +1,56 @@ +cli.ignore_auth=false +cli.version=1.0 +cli.http.api_key_use_cookies=true + +cli.service_name=onap-cli +cli.api_gateway=msb +cli.auth_service=auth + +# service section +cli.exclude_params_internal_cmd=onap-username,onap-password,host-url,no-auth +cli.no_auth_disable_include_params_external_cmd=onap-username,onap-password,host-url,no-auth +cli.no_auth_enable_exclude_params_external_cmd=onap-username,onap-password,no-auth +cli.no_auth_enable_include_params_external_cmd=host-url + +cli.http.basic.common_headers=x-auth-token,x-transaction-id,x-app-id +cli.http.basic.common_headers.x-auth-token=Authorization +cli.http.basic.common_headers.x-transaction-id=X-TransactionId +cli.http.basic.common_headers.x-transaction-id.value=req-uuid +cli.http.basic.common_headers.x-app-id=X-FromAppId +cli.http.basic.common_headers.x-app-id.value=onap-cli + +# Service specific headers +cli.http.basic.common_headers.sdc=user-id +cli.http.basic.common_headers.sdc.user-id=USER_ID +cli.http.basic.common_headers.sdc.user-id.value=${onap-username} + +#TODO mrkanag add support for aaf like defined above for basic +#cli.service.auth=aaf + +#schema validation +cli.schema.top_level_params_list=onap_cmd_schema_version,name,version,description,service,parameters,results,http +cli.schema.top_level_mandatory_list=onap_cmd_schema_version + +cli.schema.service_params_list=name,version,auth,mode +cli.schema.service_params_mandatory_list=name,version + +cli.schema.input_params_list=name,description,type,short_option,long_option, is_optional,default_value,is_secured +cli.schema.input_params_mandatory_list=name,description,type + +cli.schema.result_params_list=name,description,scope,type,is_secured +cli.schema.result_params_mandatory_list=name, description, type + +cli.schema.http_sections=request,success_codes,result_map,sample_response +cli.schema.http_mandatory_sections=equest, success_codes + +cli.schema.http_request_params=uri,method,body,headers,queries,multipart_entity_name +cli.schema.http_request_mandatory_params=uri,method + +cli.schema.http_methods=post,get,delete,put,head + +cli.schema.boolean_values=true,false +cli.schema.auth_values=none,basic +cli.schema.mode_values=direct,catalog + +#product version +cli.product.version=cli-1.0 diff --git a/framework/src/test/resources/sample-test-invalid-schema-duplicate-longoption.yaml b/framework/src/test/resources/sample-test-invalid-schema-duplicate-longoption.yaml index 8761bb30..a18aacc0 100644 --- a/framework/src/test/resources/sample-test-invalid-schema-duplicate-longoption.yaml +++ b/framework/src/test/resources/sample-test-invalid-schema-duplicate-longoption.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +version: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/sample-test-invalid-schema-duplicate-name.yaml b/framework/src/test/resources/sample-test-invalid-schema-duplicate-name.yaml index df4ed316..375f4548 100644 --- a/framework/src/test/resources/sample-test-invalid-schema-duplicate-name.yaml +++ b/framework/src/test/resources/sample-test-invalid-schema-duplicate-name.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +version: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/sample-test-invalid-schema-duplicate-shortoption.yaml b/framework/src/test/resources/sample-test-invalid-schema-duplicate-shortoption.yaml index 519f6e3b..9c501452 100644 --- a/framework/src/test/resources/sample-test-invalid-schema-duplicate-shortoption.yaml +++ b/framework/src/test/resources/sample-test-invalid-schema-duplicate-shortoption.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +version: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/sample-test-invalid-schema.yaml b/framework/src/test/resources/sample-test-invalid-schema.yaml index ed21772c..fc301bbd 100644 --- a/framework/src/test/resources/sample-test-invalid-schema.yaml +++ b/framework/src/test/resources/sample-test-invalid-schema.yaml @@ -1,11 +1,12 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +version: cli-1.0 service: name: sample version: v1 parameters: - -- name: bool-param + - name: bool-param type: bool description: Onap boolean param, by default its always false. short_option: b diff --git a/framework/src/test/resources/sample-test-schema-auth-required.yaml b/framework/src/test/resources/sample-test-schema-auth-required.yaml index 4df6445a..408c74c7 100644 --- a/framework/src/test/resources/sample-test-schema-auth-required.yaml +++ b/framework/src/test/resources/sample-test-schema-auth-required.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +version: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/sample-test-schema-http.yaml b/framework/src/test/resources/sample-test-schema-http.yaml index 7bbf6775..56a0a536 100644 --- a/framework/src/test/resources/sample-test-schema-http.yaml +++ b/framework/src/test/resources/sample-test-schema-http.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-create-http description: Register microservice into Onap +version: onap-1.0 service: name: msb version: v1 diff --git a/framework/src/test/resources/sample-test-schema-swagger.yaml b/framework/src/test/resources/sample-test-schema-swagger.yaml index c88ddb7a..b9944363 100644 --- a/framework/src/test/resources/sample-test-schema-swagger.yaml +++ b/framework/src/test/resources/sample-test-schema-swagger.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test-swagger description: Sample swagger command test. +version: cli-1.0 service: name: sample version: v1 diff --git a/framework/src/test/resources/sample-test-schema.yaml b/framework/src/test/resources/sample-test-schema.yaml index dbb5cbed..2f021779 100644 --- a/framework/src/test/resources/sample-test-schema.yaml +++ b/framework/src/test/resources/sample-test-schema.yaml @@ -1,6 +1,7 @@ onap_cmd_schema_version: 1.0 name: sample-test description: Onap sample command to test the command features +version: onap-1.0 service: name: sample version: v1 -- cgit 1.2.3-korg