Merge "Implement GRPC download cab."
authorDan Timoney <dtimoney@att.com>
Mon, 16 Sep 2019 14:24:59 +0000 (14:24 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 16 Sep 2019 14:24:59 +0000 (14:24 +0000)
cds-ui/client/src/app/common/utility/zipfile-extraction.component.ts
cds-ui/client/src/app/feature-modules/blueprint/modify-template/editor/editor.component.ts
components/scripts/python/ccsdk_netconf/common.py
components/scripts/python/ccsdk_netconf/netconfclient.py
docs/designtime.rst
docs/installation.rst
ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/internal/scripts/InternalSimpleCli.kt
ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/CliExecutorExtensions.kt
ms/blueprintsprocessor/modules/commons/db-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/db/service/BlueprintProcessorCatalogServiceImpl.kt
ms/blueprintsprocessor/modules/commons/db-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/db/service/ControllerBlueprintCatalogServiceImpl.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/scripts/BluePrintCompilerCache.kt

index fcadee8..279405a 100644 (file)
@@ -39,11 +39,21 @@ export class ZipfileExtractionComponent implements OnInit {
   private entryDefinition: string;
   validfile: boolean = false;
   uploadedFileName: string;
-
+  filesData: any = [];
+  
   constructor(private loader: LoaderService) { }
 
   ngOnInit() {
   }
+
+  create() {
+    this.filesData.forEach((path) => {
+      let index = path.name.indexOf("/");
+      let name = path.name.slice(index + 1, path.name.length);
+      this.zipFile.file(name, path.data);
+    });
+  }
+
   async buildFileViewData(zip) {
     this.validfile = false;
     this.paths = [];
index 08f1ca1..9367c06 100644 (file)
@@ -244,9 +244,39 @@ export class EditorComponent implements OnInit {
     })
     this.fileExtension = this.selectedFile.substr(this.selectedFile.lastIndexOf('.') + 1);
     this.setEditorMode();
-    if(this.options == '3')
-    {
-      this.editorReadOnly= true;
+    if (this.options == '3') {
+      this.editorReadOnly = true;
+    }
+  }
+
+  setEditorMode() {
+    switch (this.fileExtension) {
+      case "xml":
+        this.mode = 'xml';
+        break;
+      case "py":
+        this.mode = 'python';
+        break;
+      case "kts":
+        this.mode = 'kotlin';
+        break;
+      case "kt":
+        this.mode = 'kotlin';
+        break;
+      case "txt":
+        this.mode = 'text';
+        break;
+      case "meta":
+        this.mode = 'text';
+        break;
+      case "vtl":
+        this.mode = 'velocity';
+        break;
+      case "properties":
+        this.mode = 'properties';
+        break;
+      default:
+        this.mode = 'json';
     }
   }
 
@@ -256,7 +286,6 @@ export class EditorComponent implements OnInit {
       .then(blob => {
         const formData = new FormData();
         formData.append("file", blob);
-        // this.editorService.enrich("/enrich-blueprint/", formData)
         this.editorService.enrich(formData)
           .subscribe(
             (response) => {
@@ -276,8 +305,6 @@ export class EditorComponent implements OnInit {
       });
   }
 
-
-
   saveToBackend() {
     this.create();
     this.zipFile.generateAsync({ type: "blob" })
@@ -346,30 +373,7 @@ export class EditorComponent implements OnInit {
     this.editorService.downloadCBA("/" + this.artifactName + "/" + this.artifactVersion);
   }
 
-  setEditorMode() {
-    switch (this.fileExtension) {
-      case "xml":
-        this.mode = 'xml';
-        break;
-      case "py":
-        this.mode = 'python';
-        break;
-      case "kts":
-        this.mode = 'kotlin';
-        break;
-      case "txt":
-        this.mode = 'text';
-        break;
-      case "meta":
-        this.mode = 'text';
-        break;
-      case "vtl":
-        this.mode = 'velocity';
-        break;
-      default:
-        this.mode = 'json';
-    }
-  }
+  
 
   selectFolder(node) {
     this.currentFilePath = '';
index 66c7a98..457d460 100644 (file)
@@ -12,6 +12,7 @@
 #  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.
+from netconf_constant import *
 from org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution import ResourceResolutionExtensionsKt
 
 
@@ -21,9 +22,45 @@ class ResolutionHelper:
         self.component_function = component_function
 
     def resolve_and_generate_message_from_template_prefix(self, artifact_prefix):
+        """Get the template resolved in the current workflow execution by the artifact prefix
+
+        :param artifact_prefix:
+        :return: template
+        """
         return ResourceResolutionExtensionsKt.contentFromResolvedArtifact(self.component_function, artifact_prefix)
 
     def retrieve_resolved_template_from_database(self, key, artifact_template):
+        """Get the template resolved and stored with resolution-key and matching with the artifact name
+
+        :param key:
+        :param artifact_template:
+        :return:
+        """
         return ResourceResolutionExtensionsKt.storedContentFromResolvedArtifact(self.component_function, key,
                                                                                 artifact_template)
 
+    def set_execution_attribute_response_data(self, response_data):
+        """For the current node execution, set the attribute value of response-data
+
+        :param response_data:
+        :return:
+        """
+        self.component_function.setAttribute(ATTRIBUTE_RESPONSE_DATA, response_data)
+
+    def get_node_template_attribute(self, node_template_name, attribute_key):
+        """get attribute value for a specific node template of the current workflow
+
+        :param node_template_name:
+        :param attribute_key:
+        :return: JsonNode
+        """
+        self.component_function.getNodeTemplateAttribute(node_template_name, attribute_key)
+
+    def get_input_value(self, key):
+        """Get input value of the current node template execution
+
+        :param key:
+        :return: JsonNode
+        """
+        self.component_function.bluePrintRuntimeService.getInputValue(key)
+
index 74ac7e3..2d48293 100644 (file)
@@ -63,6 +63,3 @@ class NetconfClient:
     def get(self, filter_content):
         device_response = self.netconf_rpc_client.get(filter_content)
         return device_response
-
-    def set_execution_attribute_response_data(self, response_data):
-        self.component_function.setAttribute(ATTRIBUTE_RESPONSE_DATA, response_data)
index 68da0a1..ac0af51 100644 (file)
@@ -16,7 +16,7 @@ Prerequisite
 
 * Gather the cloud parameters:
 
-instantiation:
+Instantiation:
 ~~~~~~~~~~~~~~
 
 Have the HEAT template along with the HEAT environment file (or) Have the Helm chart along with the Values.yaml file
@@ -40,7 +40,7 @@ While doing so, identify the resources using the same process to be resolved; fo
 
 
 Services:
-=========
+--------
 
 .. toctree::
    :maxdepth: 1
index 2f9ce48..ef51fa0 100644 (file)
@@ -2,6 +2,10 @@
 .. http://creativecommons.org/licenses/by/4.0
 .. Copyright (C) 2019 IBM.
 
+
+User Guide
+==========
+
 Installation
 ------------
 
@@ -63,4 +67,22 @@ Result
    replicaset.apps/cds-cds-6bd674dc77                     1         1         1         2m
    replicaset.apps/cds-controller-blueprints-545bbf98cf   1         1         1         2m
    NAME                          DESIRED   CURRENT   AGE
-   statefulset.apps/cds-cds-db   1         1         2m
\ No newline at end of file
+   statefulset.apps/cds-cds-db   1         1         2m
+   
+   
+   
+Running CDS UI:
+---------------
+
+Client:
+~~~~~~~
+Install Node.js and angularCLI. Refer https://angular.io/guide/quickstart
+npm install in the directory cds/cds-ui/client
+npm run build - to build UI module 
+
+
+Loopback Server:
+~~~~~~~~~~~~~~~~
+
+npm install in the directory cds/cds-ui/server
+npm start should bring you the CDS UI page in your local machine with the link https://127.0.0.1:3000/
\ No newline at end of file
index cf27cc2..15365e1 100644 (file)
 package internal.scripts
 
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.cli.executor.cliDeviceInfo
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.cli.executor.getSshClientService
 import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
 import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.ComponentScriptExecutor
-import org.onap.ccsdk.cds.blueprintsprocessor.ssh.sshClientService
 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
-import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService
+
 import org.slf4j.LoggerFactory
 
 open class TestCliScriptFunction : AbstractScriptComponentFunction() {
@@ -54,10 +55,10 @@ open class Check : AbstractScriptComponentFunction() {
 
     override suspend fun processNB(executionRequest: ExecutionServiceInput) {
         // Get the Device Information from the DSL Model
-        val deviceInformation = bluePrintRuntimeService.resolveDSLExpression("device-properties")
+        val deviceInformation = cliDeviceInfo("device-properties")
 
         // Get the Client Service
-        val sshClientService = BluePrintDependencyService.sshClientService(deviceInformation)
+        val sshClientService = getSshClientService(deviceInformation)
 
         sshClientService.startSessionNB()
 
index bc9b710..ad95759 100644 (file)
 
 package org.onap.ccsdk.cds.blueprintsprocessor.functions.cli.executor
 
+import com.fasterxml.jackson.databind.JsonNode
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractComponentFunction
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.service.BlueprintSshClientService
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.sshClientService
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService
+
 /**
  * Register the CLI module exposed dependency
  */
+fun AbstractComponentFunction.cliDeviceInfo(requirementName: String): JsonNode {
+    return bluePrintRuntimeService.resolveDSLExpression(requirementName)
+}
+
+fun AbstractComponentFunction.getSshClientService(cliDeviceInfo: JsonNode): BlueprintSshClientService {
+    return BluePrintDependencyService.sshClientService(cliDeviceInfo)
+}
 
index 9ce45d1..3e0f351 100755 (executable)
@@ -117,6 +117,10 @@ class BlueprintProcessorCatalogServiceImpl(bluePrintRuntimeValidatorService: Blu
             blueprintModelRepository.deleteByArtifactNameAndArtifactVersion(artifactName, artifactVersion)
             val deployFile =
                     normalizedPathName(bluePrintLoadConfiguration.blueprintDeployPath, artifactName, artifactVersion)
+
+            val cacheKey = BluePrintFileUtils.compileCacheKey(deployFile)
+            BluePrintCompileCache.cleanClassLoader(cacheKey)
+
             deleteNBDir(deployFile).let {
                 if (it) log.info("Deleted deployed blueprint model :$artifactName::$artifactVersion")
                 else log.info("Fail to delete deployed blueprint model :$artifactName::$artifactVersion")
index 66b5d00..4c02fda 100755 (executable)
@@ -21,14 +21,13 @@ package org.onap.ccsdk.cds.blueprintsprocessor.db.service
 import org.onap.ccsdk.cds.blueprintsprocessor.db.primary.domain.BlueprintModel
 import org.onap.ccsdk.cds.blueprintsprocessor.db.primary.domain.BlueprintModelContent
 import org.onap.ccsdk.cds.blueprintsprocessor.db.primary.repository.BlueprintModelRepository
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
+import org.onap.ccsdk.cds.controllerblueprints.core.*
 import org.onap.ccsdk.cds.controllerblueprints.core.common.ApplicationConstants
 import org.onap.ccsdk.cds.controllerblueprints.core.config.BluePrintLoadConfiguration
 import org.onap.ccsdk.cds.controllerblueprints.core.data.ErrorCode
-import org.onap.ccsdk.cds.controllerblueprints.core.deleteDir
 import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintValidatorService
-import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPath
+import org.onap.ccsdk.cds.controllerblueprints.core.scripts.BluePrintCompileCache
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintFileUtils
 import org.slf4j.LoggerFactory
 import org.springframework.dao.DataIntegrityViolationException
 import org.springframework.stereotype.Service
@@ -85,6 +84,12 @@ class ControllerBlueprintCatalogServiceImpl(bluePrintDesignTimeValidatorService:
             throw BluePrintException("Not a valid Archive file(${archiveFile.absolutePath})")
         }
 
+        // cleanup up deploy folder for the Blueprint
+        val blueprintDeploy = normalizedPathName(bluePrintLoadConfiguration.blueprintDeployPath,
+                                    artifactName, artifactVersion)
+        val cacheKey = BluePrintFileUtils.compileCacheKey(blueprintDeploy)
+        BluePrintCompileCache.cleanClassLoader(cacheKey)
+
         blueprintModelRepository.findByArtifactNameAndArtifactVersion(artifactName!!, artifactVersion!!)?.let {
             log.info("Overwriting blueprint model :$artifactName::$artifactVersion")
             blueprintModelRepository.deleteByArtifactNameAndArtifactVersion(artifactName, artifactVersion)
index fa6b0ab..f90e27f 100644 (file)
@@ -39,6 +39,10 @@ object BluePrintCompileCache {
 
     fun cleanClassLoader(key: String) {
         if(hasClassLoader(key)){
+            // Make sure to close all classloader loaded resources before we let go of it.
+            // This fixes a Delete failure message on filesystem that keeps locks on opened jars;
+            // like Windows and NFS.
+            classLoaderCache.get(key).close()
             classLoaderCache.invalidate(key)
             log.info("Cleaned compiled cache($key)")
         }else{