diff options
author | Itohan Ukponmwan <itohan.ukponmwan@intel.com> | 2019-08-05 16:30:20 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2019-08-05 16:30:20 +0000 |
commit | 55f55f93890a2c4745ee89505cc889f54ba3c3dd (patch) | |
tree | 5eb804de9b3907b38621a3f5d8169ae3f6a64c21 /framework/src/main | |
parent | d53b78f51ed1a37f13163fe0ffd77ebd1c7f6f6f (diff) | |
parent | b9d85a33892c99949aff8e3471eb0fdc039d44aa (diff) |
Merge changes I816a1dbb,Ice38da57,I1217d391,I07d22e81,I0ddcdc1c, ...
* changes:
Add integration support
Update framework
Add vf model add artifact command
Add service model artifact add command
Add VF model checkout command
Add VF checkin command
Add sdc service resource property set
Add sdc consumer-show command
Add sdc consumer create command
Add ID output in service-model commands
Update open-cli.properties
Update the sample command OCS YAML
Add product into service and schema list
Update the version format
Update the README
Set SNAPSHOT versioning
clean-up stale onap profiles
Ignore python build artifacts from git
Diffstat (limited to 'framework/src/main')
28 files changed, 523 insertions, 71 deletions
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 b814ba82..d73df4fb 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 @@ -39,6 +39,7 @@ import org.onap.cli.fw.schema.OnapCommandSchemaLoader; import org.onap.cli.fw.schema.OnapCommandSchemaMerger; import org.onap.cli.fw.store.OnapCommandArtifactStore; import org.onap.cli.fw.store.OnapCommandArtifactStore.Artifact; +import org.onap.cli.fw.store.OnapCommandExecutionStore.ExecutionStoreContext; import org.onap.cli.fw.utils.OnapCommandHelperUtils; import org.onap.cli.fw.utils.OnapCommandUtils; import org.slf4j.Logger; @@ -73,6 +74,8 @@ public abstract class OnapCommand { private boolean isRpc = false; + private ExecutionStoreContext executionStoreContext; + public boolean isRpc() { return isRpc; } @@ -234,6 +237,7 @@ public abstract class OnapCommand { protected void postRun() throws OnapCommandException { log.debug(this.getName() + " POST-RUN"); } + /** * Oclip command execute with given parameters on service. Before calling this method, its mandatory to set all * parameters value. @@ -314,6 +318,8 @@ public abstract class OnapCommand { log.info("OUTPUT: " + this.cmdResult.getRecords()); postRun(); + + return this.cmdResult; } @@ -343,4 +349,12 @@ public abstract class OnapCommand { return OnapCommandHelperUtils.help(this); } // (mrkanag) Add toString for all command, parameter, result, etc objects in JSON format + + public void setExecutionContext(ExecutionStoreContext executionStoreContext) { + this.executionStoreContext = executionStoreContext; + } + + public ExecutionStoreContext getExecutionContext() { + return this.executionStoreContext; + } } diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommandType.java b/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommandType.java index 34ccc760..e874a14e 100644 --- a/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommandType.java +++ b/framework/src/main/java/org/onap/cli/fw/cmd/OnapCommandType.java @@ -27,8 +27,7 @@ public enum OnapCommandType { AUTH, CATALOG, - CMD, - SYSTEM; + CMD; /** * Get parameter type. @@ -46,8 +45,6 @@ public enum OnapCommandType { return CATALOG; } else if (CMD.name().equalsIgnoreCase(name)) { return CMD; - } else if (SYSTEM.name().equalsIgnoreCase(name)) { - return SYSTEM; } else { throw new OnapCommandInvalidCommandType(name); } diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowDebugCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowDebugCommand.java new file mode 100644 index 00000000..e6be04aa --- /dev/null +++ b/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowDebugCommand.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019 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.cmd.execution; + +import org.onap.cli.fw.cmd.OnapCommand; +import org.onap.cli.fw.error.OnapCommandException; +import org.onap.cli.fw.schema.OnapCommandSchema; +import org.onap.cli.fw.store.OnapCommandExecutionStore; + +@OnapCommandSchema(schema = "execution-show-debug.yaml") +public class OnapCommandExceutionShowDebugCommand extends OnapCommand { + + @Override + protected void run() throws OnapCommandException { + String executionId = getParametersMap().get("execution-id").getValue().toString(); + this.getResult().setOutput(OnapCommandExecutionStore.getStore().showExecutionDebug(executionId)); + } + + +} diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowErrCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowErrCommand.java new file mode 100644 index 00000000..bd3ff9ec --- /dev/null +++ b/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowErrCommand.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019 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.cmd.execution; + +import org.onap.cli.fw.cmd.OnapCommand; +import org.onap.cli.fw.error.OnapCommandException; +import org.onap.cli.fw.schema.OnapCommandSchema; +import org.onap.cli.fw.store.OnapCommandExecutionStore; + +@OnapCommandSchema(schema = "execution-show-err.yaml") +public class OnapCommandExceutionShowErrCommand extends OnapCommand { + + @Override + protected void run() throws OnapCommandException { + String executionId = getParametersMap().get("execution-id").getValue().toString(); + this.getResult().setOutput(OnapCommandExecutionStore.getStore().showExecutionErr(executionId)); + } + + +} diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowOutCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowOutCommand.java new file mode 100644 index 00000000..878ceb13 --- /dev/null +++ b/framework/src/main/java/org/onap/cli/fw/cmd/execution/OnapCommandExceutionShowOutCommand.java @@ -0,0 +1,32 @@ +/* + * Copyright 2019 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.cmd.execution; + +import org.onap.cli.fw.cmd.OnapCommand; +import org.onap.cli.fw.error.OnapCommandException; +import org.onap.cli.fw.schema.OnapCommandSchema; +import org.onap.cli.fw.store.OnapCommandExecutionStore; + +@OnapCommandSchema(schema = "execution-show-out.yaml") +public class OnapCommandExceutionShowOutCommand extends OnapCommand { + + @Override + protected void run() throws OnapCommandException { + String executionId = getParametersMap().get("execution-id").getValue().toString(); + this.getResult().setOutput(OnapCommandExecutionStore.getStore().showExecutionOut(executionId)); + } +} diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/product/OnapServiceListCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/product/OnapServiceListCommand.java index 010cdc19..fa4f60b9 100644 --- a/framework/src/main/java/org/onap/cli/fw/cmd/product/OnapServiceListCommand.java +++ b/framework/src/main/java/org/onap/cli/fw/cmd/product/OnapServiceListCommand.java @@ -73,6 +73,7 @@ public class OnapServiceListCommand extends OnapCommand { } for (String service : rslt.getOrDefault(product, new HashSet<String>())) { + this.getResult().getRecordsMap().get("product").getValues().add(product); this.getResult().getRecordsMap().get("service").getValues().add(service); this.getResult().getRecordsMap().get("description").getValues().add( serviceDescs.containsKey(service) ? serviceDescs.get(service) : ""); diff --git a/framework/src/main/java/org/onap/cli/fw/cmd/schema/OnapSchemaListCommand.java b/framework/src/main/java/org/onap/cli/fw/cmd/schema/OnapSchemaListCommand.java index ef22e4af..5046f44a 100644 --- a/framework/src/main/java/org/onap/cli/fw/cmd/schema/OnapSchemaListCommand.java +++ b/framework/src/main/java/org/onap/cli/fw/cmd/schema/OnapSchemaListCommand.java @@ -47,6 +47,7 @@ public class OnapSchemaListCommand extends OnapCommand { if (service.length() > 0 && !service.equalsIgnoreCase(schema.getService())) { continue; } + this.getResult().getRecordsMap().get("product").getValues().add(schema.getProduct()); this.getResult().getRecordsMap().get("command").getValues().add(schema.getCmdName()); this.getResult().getRecordsMap().get("schema").getValues().add(schema.getSchemaName()); this.getResult().getRecordsMap().get("service").getValues().add(schema.getService()); diff --git a/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfig.java b/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfig.java index c59521e0..b395177f 100644 --- a/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfig.java +++ b/framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfig.java @@ -22,6 +22,8 @@ import java.util.Map.Entry; import java.util.Properties; import java.util.stream.Collectors; +import org.onap.cli.fw.utils.OnapCommandUtils; + /** * Oclip command constants. * @@ -38,7 +40,8 @@ public final class OnapCommandConfig { } static { - loadProperties(prps, OnapCommandConstants.CONF); + addProperties(OnapCommandConstants.CONF); + for (String prpFile: getCommaSeparatedList(OnapCommandConstants.OPEN_CLI_PLUGIN_PRPS)) { addProperties(prpFile); } @@ -57,7 +60,7 @@ public final class OnapCommandConfig { loadProperties(ps, fileName); for (Entry<Object, Object> entry: ps.entrySet()) { - prps.put(entry.getKey(), entry.getValue()); + prps.put(entry.getKey(), OnapCommandUtils.replaceLineForSpecialValues(entry.getValue().toString())); } } 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 56183399..53018025 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 @@ -36,14 +36,13 @@ public class OnapCommandConstants { public static final String RESULT_PARAMS_LIST = "cli.schema.base.results.sections"; public static final String RESULT_PARAMS_MANDATORY_LIST = "cli.schema.base.results.sections.mandatory"; public static final String BOOLEAN_VALUE = "cli.schema.boolean_values"; - public static final String COMMAND_TYPE_VALUES = "cli.schema.command.type"; public static final String SCHEMA_TYPES_SUPPORTED = "cli.schema.profile.available"; public static final String OPEN_CLI_PRODUCT_NAME = "cli.product_name"; public static final String OPEN_CLI_PLUGIN_PRPS = "cli.schema.profile.confs"; public static final String OPEN_CLI_DATA_DIR = "cli.data.dir"; public static final String OPEN_CLI_ARTIFACT_DIR = "cli.artifact.dir"; - + public static final String OPEN_CLI_GRPC_CLIENT_TIMEOUT = "cli.grpc.client.timeout"; //schema public static final String OPEN_CLI_SCHEMA_VERSION = "open_cli_schema_version"; public static final String OPEN_CLI_SCHEMA_VERSION_VALUE_1_0 = "1.0"; @@ -151,6 +150,7 @@ public class OnapCommandConstants { public static final String SPL_ENTRY_UUID = "uuid"; public static final String SPL_ENTRY_ENV = "env:"; public static final String SPL_ENTRY_FILE = "file:"; + public static final String SPL_ENTRY_MD5 = "md5:"; public static final String VERSION_INFO = "version.info"; public static final String VERSION_INFO_PLACE_HOLDER_VERSION = "__VERSION__"; diff --git a/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameter.java b/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameter.java index 618c321c..3b13c9f8 100644 --- a/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameter.java +++ b/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameter.java @@ -288,7 +288,12 @@ public class OnapCommandParameter { public void setValue(Object value) throws OnapCommandInvalidParameterValue { this.rawValue = value; - if (OnapCommandParameterType.URL.equals(parameterType) && !value.toString().isEmpty() && !value.toString().startsWith("http") + if (OnapCommandParameterType.URL.equals(parameterType) && + !value.toString().isEmpty() && + !value.toString().startsWith("http") && + !value.toString().startsWith("ftp") && + !value.toString().startsWith("mqtt") && + !value.toString().startsWith("tcp") && !value.toString().startsWith("/")) { value = "/" + value; } else if (OnapCommandParameterType.ARRAY.equals(parameterType)) { diff --git a/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameterType.java b/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameterType.java index 391383d4..b6860b3c 100644 --- a/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameterType.java +++ b/framework/src/main/java/org/onap/cli/fw/input/OnapCommandParameterType.java @@ -23,7 +23,7 @@ import org.onap.cli.fw.error.OnapCommandInvalidParameterType; * */ public enum OnapCommandParameterType { - STRING, JSON, YAML, TEXT, URL, UUID, + STRING, BYTE, JSON, YAML, TEXT, URL, UUID, DIGIT, BOOL, ARRAY, @@ -42,6 +42,8 @@ public enum OnapCommandParameterType { public static OnapCommandParameterType get(String name) throws OnapCommandInvalidParameterType { if (JSON.name().equalsIgnoreCase(name)) { return JSON; + } else if (BYTE.name().equalsIgnoreCase(name)) { + return BYTE; } else if (YAML.name().equalsIgnoreCase(name)) { return YAML; } else if (STRING.name().equalsIgnoreCase(name)) { 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 d7937527..fdacbd1e 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 @@ -431,8 +431,8 @@ public class OnapCommandRegistrar { } } - public List<Map<String, ?>> getTestSuite(String cmd) throws OnapCommandException { - return OnapCommandDiscoveryUtils.createTestSuite(cmd, enabledProductVersion); + public List<Map<String, ?>> getTestSuite(String cmd, String product) throws OnapCommandException { + return OnapCommandDiscoveryUtils.createTestSuite(cmd, product); } public String getHost() { 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 fe191f5b..7d2cec92 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 @@ -344,7 +344,7 @@ public class OnapCommandSchemaLoader { case IS_OPTIONAL: if (validate && !OnapCommandUtils.validateBoolean(String.valueOf(parameter.get(key2)))) { exceptionList.add(OnapCommandUtils.invalidBooleanValueMessage(parameter.get(NAME), - IS_SECURED, parameter.get(key2))); + IS_OPTIONAL, parameter.get(key2))); } if (BOOLEAN_TRUE.equalsIgnoreCase(String.valueOf(parameter.get(key2)))) { @@ -510,6 +510,7 @@ public class OnapCommandSchemaLoader { break; } } + return exceptionList; } diff --git a/framework/src/main/java/org/onap/cli/fw/store/OnapCommandExecutionStore.java b/framework/src/main/java/org/onap/cli/fw/store/OnapCommandExecutionStore.java index 4fc2508a..d09e4304 100644 --- a/framework/src/main/java/org/onap/cli/fw/store/OnapCommandExecutionStore.java +++ b/framework/src/main/java/org/onap/cli/fw/store/OnapCommandExecutionStore.java @@ -19,7 +19,6 @@ package org.onap.cli.fw.store; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -29,7 +28,6 @@ import java.util.Map; import java.util.TimeZone; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.onap.cli.fw.conf.OnapCommandConfig; import org.onap.cli.fw.conf.OnapCommandConstants; import org.onap.cli.fw.error.OnapCommandExecutionFailed; @@ -54,7 +52,7 @@ public class OnapCommandExecutionStore { private static SearchMode SEARCH_MODE = SearchMode.file; public static class ExecutionStoreContext { - + private String requestId; private String executionId; private String storePath; public String getExecutionId() { @@ -71,6 +69,13 @@ public class OnapCommandExecutionStore { this.storePath = storePath; return this; } + public String getRequestId() { + return requestId; + } + public ExecutionStoreContext setRequestId(String requestId) { + this.requestId = requestId; + return this; + } } public static class Execution { @@ -185,63 +190,113 @@ public class OnapCommandExecutionStore { public ExecutionStoreContext storeExectutionStart( String requestId, String product, String service, String cmd, String profile, String input) { + ExecutionStoreContext context = new ExecutionStoreContext(); + context.setRequestId(requestId); + String executionId = requestId + "-" + System.currentTimeMillis(); + context.setExecutionId(executionId); String storePath = getBasePath() + File.separator + executionId + SEPARATOR + product + SEPARATOR + service + SEPARATOR + cmd + (profile != null ? (SEPARATOR + profile) : "" ); + try { File dir = new File(storePath); FileUtils.forceMkdir(dir); + context.setStorePath(dir.getAbsolutePath()); if (product != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "product"), product); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "product"), product); if (service != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "service"), service); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "service"), service); if (cmd != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "command"), cmd); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "command"), cmd); - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "requestId"), requestId); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "requestId"), requestId); - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "executionId"), executionId); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "executionId"), executionId); if (input != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "input"), input); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "input"), input); if (profile != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "profile"), profile); - FileUtils.touch(new File(dir.getAbsolutePath() + File.separator + "in-progress")); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "profile"), profile); + + FileUtils.touch(new File(context.getStorePath() + File.separator + "stdout")); + FileUtils.touch(new File(context.getStorePath() + File.separator + "stderr")); + FileUtils.touch(new File(context.getStorePath() + File.separator + "debug")); + + FileUtils.touch(new File(context.getStorePath() + File.separator + "in-progress")); } catch (IOException e) { log.error("Failed to store the execution start details " + storePath); } - return new ExecutionStoreContext().setExecutionId(executionId).setStorePath(storePath); + return context; } public void storeExectutionEnd( - ExecutionStoreContext execContext, - String output, String error, boolean passed) { + ExecutionStoreContext context, + String output, String error, String debug, boolean passed) { try { - File dir = new File(execContext.getStorePath()); - FileUtils.forceMkdir(dir); - if (output != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "output"), output); + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "output"), output); if (error != null) - FileUtils.writeStringToFile(new File(dir.getAbsolutePath() + File.separator + "error"), error); - + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "error"), error); + if (debug != null) + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "debug"), debug); if (passed) - FileUtils.touch(new File(dir.getAbsolutePath() + File.separator + "completed")); + FileUtils.touch(new File(context.getStorePath() + File.separator + "completed")); else - FileUtils.touch(new File(dir.getAbsolutePath() + File.separator + "failed")); + FileUtils.touch(new File(context.getStorePath() + File.separator + "failed")); + + new File(context.getStorePath() + File.separator + "in-progress").delete(); + } catch (IOException e) { + log.error("Failed to store the execution end details " + context.storePath); + } + } + + public void storeExectutionProgress( + ExecutionStoreContext context, + String output, String error, String debug) { + + try { + if (output != null) + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "output"), output); + if (error != null) + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "error"), error); + if (debug != null) + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "debug"), debug); + } catch (IOException e) { + log.error("Failed to store the execution end details " + context.storePath); + } + } + + public void storeExectutionDebug( + ExecutionStoreContext context, + String debug) { - new File(dir.getAbsolutePath() + File.separator + "in-progress").delete(); + try { + if (debug != null) { + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "debug"), debug); + } } catch (IOException e) { - log.error("Failed to store the execution end details " + execContext.storePath); + log.error("Failed to store the execution debug details " + context.storePath); } } + public void storeExectutionOutput( + ExecutionStoreContext context, + String output) { + + try { + if (output != null) { + FileUtils.writeStringToFile(new File(context.getStorePath() + File.separator + "output"), output); + } + } catch (IOException e) { + log.error("Failed to store the execution output details " + context.storePath); + } + } public List<OnapCommandExecutionStore.Execution> listExecutions(Map<String, String> search) throws OnapCommandExecutionFailed { List <OnapCommandExecutionStore.Execution> list = new ArrayList<>(); @@ -342,7 +397,8 @@ public class OnapCommandExecutionStore { return exectuion; } - public Execution getExecution(String executionId) throws OnapCommandExecutionNotFound, OnapCommandExecutionFailed { + + private File getExecutionDir(String executionId) throws OnapCommandExecutionNotFound { File []f = new File(getBasePath()).listFiles(new FilenameFilter() { @Override @@ -356,10 +412,37 @@ public class OnapCommandExecutionStore { throw new OnapCommandExecutionNotFound(executionId); } + return f[0]; + } + + public String showExecutionOut(String executionId) throws OnapCommandExecutionNotFound { + try { + return FileUtils.readFileToString(new File (this.getExecutionDir(executionId).getAbsolutePath() + File.separator + "stdout")); + } catch (IOException e) { + return ""; + } + } + + public String showExecutionErr(String executionId) throws OnapCommandExecutionNotFound { + try { + return FileUtils.readFileToString(new File (this.getExecutionDir(executionId).getAbsolutePath() + File.separator + "stderr")); + } catch (IOException e) { + return ""; + } + } + + public String showExecutionDebug(String executionId) throws OnapCommandExecutionNotFound { + try { + return FileUtils.readFileToString(new File (this.getExecutionDir(executionId).getAbsolutePath() + File.separator + "debug")); + } catch (IOException e) { + return ""; + } + } + public Execution getExecution(String executionId) throws OnapCommandExecutionNotFound, OnapCommandExecutionFailed { try { - return this.makeExecution(f[0].getAbsolutePath()); + return this.makeExecution(this.getExecutionDir(executionId).getAbsolutePath()); } catch (IOException e) { throw new OnapCommandExecutionFailed(e, "Failed to retrieve the execution"); } } -} +}
\ No newline at end of file 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 7c1f18f6..a94087ec 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 @@ -508,7 +508,6 @@ public class OnapCommandDiscoveryUtils { Map<String, String> sample = samples.get(sampleId); List<String> inputArgs = new ArrayList(); - inputArgs.add(cmd); if (sample.get(OnapCommandConstants.VERIFY_INPUT) != null) { inputArgs.addAll(Arrays.asList(sample.get(OnapCommandConstants.VERIFY_INPUT).trim().split(" "))); } 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 e279fa0b..96f864e0 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 @@ -31,6 +31,8 @@ import java.util.Map.Entry; import java.util.Set; import java.util.UUID; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.onap.cli.fw.cmd.OnapCommand; import org.onap.cli.fw.conf.OnapCommandConfig; @@ -185,6 +187,49 @@ public class OnapCommandUtils { * @return */ public static String replaceLineForSpecialValues(String lineSpl) { + return replaceLineForSpecialValues(lineSpl, new HashMap<String, String>()); + } + + /** + * + * @param lineSpl + * @param values Value for the given entry already known by the caller. + * @return + */ + public static String replaceLineFromResults(String line, Map <String, String> values) { + String resultLine = ""; + + if (!line.contains("$r{")) { + return line; + } + + int currentIdx = 0; + while (currentIdx < line.length()) { + int idxS = line.indexOf("$r{", currentIdx); + if (idxS == -1) { + resultLine += line.substring(currentIdx); + break; + } + int idxE = line.indexOf("}", idxS); + String attr = line.substring(idxS + 3, idxE); + attr = attr.trim(); + + String value = ""; + + if (values.get(attr) != null) { + value = values.get(attr); + } else { + value = attr; + } + + resultLine += line.substring(currentIdx, idxS) + value; + currentIdx = idxE + 1; + } + + return resultLine; + } + + public static String replaceLineForSpecialValues(String lineSpl, Map <String, String> values) { String resultSpl = ""; if (!lineSpl.contains("$s{")) { @@ -232,8 +277,20 @@ public class OnapCommandUtils { //exist. value = ""; } + } else if (splEntry.startsWith(OnapCommandConstants.SPL_ENTRY_MD5)) { + //start to read after md5:entryname + String entryName = splEntry.substring(4); + String content = values.get(entryName); + if (content != null) + value = OnapCommandUtils.md5(content); + else + value = splEntry; } else { - value = splEntry; + if (values.get(splEntry) != null) { + value = values.get(splEntry); + } else { + value = splEntry; + } } } @@ -271,7 +328,11 @@ public class OnapCommandUtils { || OnapCommandParameterType.JSON.equals(param.getParameterType()) || OnapCommandParameterType.YAML.equals(param.getParameterType())) { // ignore the front and back double quotes in json body - result += line.substring(currentIdx, idxS - 1) + params.get(paramName).getValue().toString(); + String va_ = params.get(paramName).getValue().toString(); + if (idxS > 0) + result += line.substring(currentIdx, idxS - 1) + va_; + else + result += va_; currentIdx = idxE + 2; } else if (OnapCommandParameterType.MAP.equals(param.getParameterType())) { try { @@ -366,6 +427,12 @@ public class OnapCommandUtils { } } + public static String md5(String content) { + String md5 = DigestUtils.md5Hex(content); + + byte[] encodeBase64 = Base64.encodeBase64(md5.getBytes()); + return new String(encodeBase64); + } } diff --git a/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java b/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java index eb335837..db7245c7 100644 --- a/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java +++ b/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java @@ -17,18 +17,18 @@ package org.onap.cli.fw.utils; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.concurrent.TimeUnit; import org.apache.commons.io.IOUtils; -import org.onap.cli.fw.cmd.OnapCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,8 +43,9 @@ public class ProcessRunner { private int exitCode = -1; private String output; private String error; - private Map<String, Object> results; - + private long timeout = 0; + private OutputStream stdout; + private OutputStream stderr; public ProcessRunner(String []cmd, String []env, String cwd) { this.cmd = cmd; @@ -55,6 +56,14 @@ public class ProcessRunner { this.env = env; } + public void setTimeout(long timeout) { + this.timeout = timeout; + } + + public long getTimeout() { + return this.timeout; + } + public void overrideToUnix() { this.shell = UNIX_SHELL; } @@ -82,9 +91,13 @@ public class ProcessRunner { @SuppressWarnings("unchecked") public void run() throws InterruptedException, IOException { Process p = null; + final StringWriter writerOutput = new StringWriter(); final StringWriter writerError = new StringWriter(); + final OutputStream stdout = this.getStdout(); + final OutputStream stderr = this.getStderr(); + if (this.cmd.length == 1) { p = Runtime.getRuntime().exec(this.shell + this.cmd[0], this.env, null); } else { @@ -98,7 +111,10 @@ public class ProcessRunner { new Thread(new Runnable() { public void run() { try { - IOUtils.copy(p1.getInputStream(), writerOutput); + if (stdout != null) { + IOUtils.copy(p1.getInputStream(), stdout); + } + else IOUtils.copy(p1.getInputStream(), writerOutput); } catch (IOException e) { } } @@ -107,21 +123,32 @@ public class ProcessRunner { new Thread(new Runnable() { public void run() { try { - IOUtils.copy(p1.getErrorStream(), writerError); + if (stderr != null) { + IOUtils.copy(p1.getErrorStream(), stderr); + } + else IOUtils.copy(p1.getErrorStream(), writerError); } catch (IOException e) { } } }).start(); - //mrkanag: handle the case if the given cmd does not exist - p.waitFor(1, TimeUnit.MINUTES); - this.exitCode = p.exitValue(); + boolean completed = p.waitFor(this.getTimeout(), TimeUnit.MILLISECONDS); + if (completed) { + this.exitCode = p.exitValue(); + } + this.output = writerOutput.toString(); this.error = writerError.toString(); log.debug("CMD: " + Arrays.asList(this.cmd).toString() + "\nWORKING_DIR: " + this.cwd + "\nENV: " + ((this.env == null) ? this.env : Arrays.asList(this.env).toString()) + "\nOUTPUT: " + this.output + "\nERROR: " + this.error + "\nEXIT_CODE: " + this.exitCode); p.destroy(); + + if (!completed) { + throw new RuntimeException("TIMEOUT:: cmd:" + Arrays.asList(this.cmd).toString()); + } else { + + } } public String streamToString(InputStream stream) throws IOException { @@ -152,4 +179,32 @@ public class ProcessRunner { public String getError() { return this.error; } + + public OutputStream getStdout() { + return stdout; + } + + public void setStdout(OutputStream stdout) { + this.stdout = stdout; + } + + public OutputStream getStderr() { + return stderr; + } + + public void setStderr(OutputStream stderr) { + this.stderr = stderr; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("COMMAND: " + this.shell + " " + Arrays.asList(this.cmd)); + sb.append("\nCWD: " + new File(this.cwd).getAbsolutePath()); + sb.append("\nTIMEOUT: " + this.timeout); + sb.append("\nEXIT-CODE: " + this.getExitCode()); + sb.append("\nENVIRONMENTS: " + Arrays.asList(this.env)); + + return sb.toString(); + } }
\ No newline at end of file diff --git a/framework/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand b/framework/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand index 547d7872..7ca9c783 100644 --- a/framework/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand +++ b/framework/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand @@ -16,8 +16,13 @@ org.onap.cli.fw.cmd.schema.OnapSchemaValidateCommand org.onap.cli.fw.cmd.schema.OnapSchemaRefreshCommand org.onap.cli.fw.cmd.schema.OnapSchemaListCommand org.onap.cli.fw.cmd.schema.OnapSchemaShowCommand -#org.onap.cli.fw.cmd.schema.OnapSchemaSwitchCommand +org.onap.cli.fw.cmd.schema.OnapSchemaSwitchCommand + org.onap.cli.fw.cmd.product.OnapProductsListCommand org.onap.cli.fw.cmd.product.OnapServiceListCommand + org.onap.cli.fw.cmd.execution.OnapCommandExceutionListCommand org.onap.cli.fw.cmd.execution.OnapCommandExceutionShowCommand +org.onap.cli.fw.cmd.execution.OnapCommandExceutionShowDebugCommand +org.onap.cli.fw.cmd.execution.OnapCommandExceutionShowOutCommand +org.onap.cli.fw.cmd.execution.OnapCommandExceutionShowErrCommand 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 d1a074d7..f3d5e89d 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 @@ -72,4 +72,4 @@ parameters: short_option: D long_option: context is_default_param: true - is_optional: true
\ No newline at end of file + is_optional: true diff --git a/framework/src/main/resources/open-cli-schema/execution/execution-show-debug.yaml b/framework/src/main/resources/open-cli-schema/execution/execution-show-debug.yaml new file mode 100644 index 00000000..6e968747 --- /dev/null +++ b/framework/src/main/resources/open-cli-schema/execution/execution-show-debug.yaml @@ -0,0 +1,38 @@ +# Copyright 2018 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. + +open_cli_schema_version: 1.0 +name: execution-show-debug +description: Show the command execution debug information + +info: + product: open-cli + service: execution + type: cmd + author: Kanagaraj Manickam kanagaraj.manickam@huawei.com + +parameters: + - name: execution-id + type: string + description: Execution id + short_option: l + long_option: execution-id + is_optional: false + - name: format + type: string + description: Output formats, supported formats such as table, csv, json, yaml + short_option: f + long_option: format + default_value: text + is_default_param: true
\ No newline at end of file diff --git a/framework/src/main/resources/open-cli-schema/execution/execution-show-err.yaml b/framework/src/main/resources/open-cli-schema/execution/execution-show-err.yaml new file mode 100644 index 00000000..13ad274e --- /dev/null +++ b/framework/src/main/resources/open-cli-schema/execution/execution-show-err.yaml @@ -0,0 +1,38 @@ +# Copyright 2018 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. + +open_cli_schema_version: 1.0 +name: execution-show-err +description: Show the command execution console error information + +info: + product: open-cli + service: execution + type: cmd + author: Kanagaraj Manickam kanagaraj.manickam@huawei.com + +parameters: + - name: execution-id + type: string + description: Execution id + short_option: l + long_option: execution-id + is_optional: false + - name: format + type: string + description: Output formats, supported formats such as table, csv, json, yaml + short_option: f + long_option: format + default_value: text + is_default_param: true
\ No newline at end of file diff --git a/framework/src/main/resources/open-cli-schema/execution/execution-show-out.yaml b/framework/src/main/resources/open-cli-schema/execution/execution-show-out.yaml new file mode 100644 index 00000000..5b74f7aa --- /dev/null +++ b/framework/src/main/resources/open-cli-schema/execution/execution-show-out.yaml @@ -0,0 +1,38 @@ +# Copyright 2018 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. + +open_cli_schema_version: 1.0 +name: execution-show-out +description: Show the command execution console output information + +info: + product: open-cli + service: execution + type: cmd + author: Kanagaraj Manickam kanagaraj.manickam@huawei.com + +parameters: + - name: execution-id + type: string + description: Execution id + short_option: l + long_option: execution-id + is_optional: false + - name: format + type: string + description: Output formats, supported formats such as table, csv, json, yaml + short_option: f + long_option: format + default_value: text + is_default_param: true
\ No newline at end of file diff --git a/framework/src/main/resources/open-cli-schema/execution/execution-show.yaml b/framework/src/main/resources/open-cli-schema/execution/execution-show.yaml index 7b4bd599..a29775e0 100644 --- a/framework/src/main/resources/open-cli-schema/execution/execution-show.yaml +++ b/framework/src/main/resources/open-cli-schema/execution/execution-show.yaml @@ -14,7 +14,7 @@ open_cli_schema_version: 1.0 name: execution-show -description: Show the complete executions for the given request id +description: Show the complete executions for the given execution id info: product: open-cli diff --git a/framework/src/main/resources/open-cli-schema/open-cli-registry.yaml b/framework/src/main/resources/open-cli-schema/open-cli-registry.yaml index 9b988b4e..395cb01e 100644 --- a/framework/src/main/resources/open-cli-schema/open-cli-registry.yaml +++ b/framework/src/main/resources/open-cli-schema/open-cli-registry.yaml @@ -30,11 +30,5 @@ services: description: Product and service searching abilities - name: schema description: OCS schema management - - name: profile - description: Profile management - - name: artifact - description: Artifact management - name: execution description: Execution management - - name: rpc - description: RPC management across OCLIP
\ No newline at end of file diff --git a/framework/src/main/resources/open-cli-schema/product/service-list.yaml b/framework/src/main/resources/open-cli-schema/product/service-list.yaml index 8a84b257..81699309 100644 --- a/framework/src/main/resources/open-cli-schema/product/service-list.yaml +++ b/framework/src/main/resources/open-cli-schema/product/service-list.yaml @@ -33,6 +33,10 @@ parameters: results: direction: landscape attributes: + - name: product + description: Product name + scope: short + type: string - name: service description: Service name scope: short diff --git a/framework/src/main/resources/open-cli-schema/schema/schema-list.yaml b/framework/src/main/resources/open-cli-schema/schema/schema-list.yaml index 4f971ce2..72833d39 100644 --- a/framework/src/main/resources/open-cli-schema/schema/schema-list.yaml +++ b/framework/src/main/resources/open-cli-schema/schema/schema-list.yaml @@ -38,6 +38,14 @@ parameters: results: direction: landscape attributes: + - name: product + description: Product name + scope: short + type: string + - name: service + description: Service name + scope: short + type: string - name: command description: Command name scope: short @@ -46,10 +54,6 @@ results: description: Schema name scope: long type: string - - name: service - description: Service name - scope: short - type: string - name: ocs-version description: Schema version scope: short diff --git a/framework/src/main/resources/open-cli.properties b/framework/src/main/resources/open-cli.properties index e0ca44a8..259fd227 100644 --- a/framework/src/main/resources/open-cli.properties +++ b/framework/src/main/resources/open-cli.properties @@ -13,10 +13,13 @@ # limitations under the License. cli.product_name=open-cli -cli.version=2.0.5 +cli.version=3.0.0 cli.discover_always=false -cli.data.dir=data -cli.artifact.dir=d:/temp/OCLIP +cli.data.dir=./data +cli.artifact.dir=./data/artifacts +cli.tmp.dir=./data/tmp +#timeout in seconds +cli.grpc.client.timeout=60 #schema validation cli.schema.base.sections=open_cli_schema_version,name,description,parameters,results,info @@ -36,10 +39,10 @@ cli.schema.command.type=cmd,auth,catalog # moco properties cli.sample.gen.enable=false -cli.sample.gen.target=. +cli.sample.gen.target=./open-cli-sample # mrkanag Move this to db, once exteranl command registration is supported in place of discovery -cli.schema.profile.available= +cli.schema.profile.available=http,snmp,cmd #other properties to load (it should be hanled when plugins are made as externally register-able #when command plugin management support is enabled in oclip diff --git a/framework/src/main/resources/version.info b/framework/src/main/resources/version.info index edfa61d6..3b8aedf9 100644 --- a/framework/src/main/resources/version.info +++ b/framework/src/main/resources/version.info @@ -1,4 +1,4 @@ -CLI version : __VERSION__ +Version : __VERSION__ Available products: __AVAILABLE_PRODUCT_VERSIONS__ Enabled product : __ENABLED_PRODUCT_VERSIONS__ |