[sdc] 1710 rebase code 59/6159/1
authorMichael Lando <ml636r@att.com>
Sat, 22 Jul 2017 14:10:02 +0000 (17:10 +0300)
committerMichael Lando <ml636r@att.com>
Sat, 22 Jul 2017 14:10:02 +0000 (17:10 +0300)
Change-Id: Icedeac71c0a9d27518969effcd5d5519de9955a6
Signed-off-by: Michael Lando <ml636r@att.com>
34 files changed:
asdc-tests/src/main/java/org/openecomp/sdc/ci/tests/execute/devCI/HealthCheckAPI.java
asdctool/src/main/java/org/openecomp/sdc/asdctool/enums/SchemaZipFileEnum.java [new file with mode: 0644]
asdctool/src/main/java/org/openecomp/sdc/asdctool/main/SdcSchemaFileImport.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/HealthCheckBusinessLogic.java
catalog-be/src/main/resources/config/SDC.zip [deleted file]
catalog-be/src/main/resources/config/license.txt [new file with mode: 0644]
catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.yml [new file with mode: 0644]
catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.zip [new file with mode: 0644]
catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.yml [new file with mode: 0644]
catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.zip [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/tosca/SchemaFiles.java [new file with mode: 0644]
catalog-be/src/test/resources/yamlValidation/test-no-valid.yml [new file with mode: 0644]
catalog-be/src/test/resources/yamlValidation/testDir/test.txt [new file with mode: 0644]
catalog-be/src/test/resources/yamlValidation/testDir/test.yml [new file with mode: 0644]
catalog-be/src/test/resources/yamlValidation/testDir/test.zip [new file with mode: 0644]
catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/HealthCheckService.java
catalog-fe/src/main/resources/config/configuration.yaml
catalog-ui/src/app/directives/graphs-v2/common/style/component-instances-nodes-style.ts
catalog-ui/src/app/directives/graphs-v2/composition-graph/composition-graph.directive.ts
catalog-ui/src/app/directives/graphs-v2/image-creator/image-creator.service.ts
catalog-ui/src/app/models/graph/nodes/base-common-node.ts
catalog-ui/src/app/models/graph/nodes/composition-graph-nodes/composition-ci-node-base.ts
catalog-ui/src/app/models/graph/nodes/composition-graph-nodes/composition-ci-node-cp.ts
catalog-ui/src/app/models/graph/nodes/composition-graph-nodes/composition-ci-node-service.ts
catalog-ui/src/app/models/graph/nodes/composition-graph-nodes/composition-ci-node-vf.ts
catalog-ui/src/app/models/graph/nodes/composition-graph-nodes/composition-ci-node-vl.ts
catalog-ui/src/app/ng2/shared/search-bar/search-bar.component.ts
catalog-ui/src/app/utils/constants.ts
catalog-ui/src/third-party/cytoscape.js-edge-editation/CytoscapeEdgeEditation.js
common-app-api/src/main/java/org/openecomp/sdc/fe/config/Configuration.java
pom.xml
sdc-os-chef/sdc-backend/Dockerfile
sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/templates/default/FE-configuration.yaml.erb
sdc-os-chef/sdc-sanity/Dockerfile

index cb36619..5437b80 100644 (file)
@@ -50,6 +50,7 @@ public class HealthCheckAPI extends ComponentBaseTest {
         assertTrue("Amdocs health check ZU component is down or not exists", amdocsHCComponents.get(HealthCheckComponent.ZU) != null && amdocsHCComponents.get(HealthCheckComponent.ZU).equals(HealthCheckStatus.UP));
         assertTrue("Amdocs health check BE component is down or not exists", amdocsHCComponents.get(HealthCheckComponent.BE) != null && amdocsHCComponents.get(HealthCheckComponent.BE).equals(HealthCheckStatus.UP));
         assertTrue("Amdocs health check CAS component is down or not exists", amdocsHCComponents.get(HealthCheckComponent.CAS) != null && amdocsHCComponents.get(HealthCheckComponent.CAS).equals(HealthCheckStatus.UP));
+        assertTrue("Amdocs health check FE component is down or not exists", amdocsHCComponents.get(HealthCheckComponent.FE) != null && amdocsHCComponents.get(HealthCheckComponent.FE).equals(HealthCheckStatus.UP));
     }
     
     @Test
diff --git a/asdctool/src/main/java/org/openecomp/sdc/asdctool/enums/SchemaZipFileEnum.java b/asdctool/src/main/java/org/openecomp/sdc/asdctool/enums/SchemaZipFileEnum.java
new file mode 100644 (file)
index 0000000..6f4c602
--- /dev/null
@@ -0,0 +1,68 @@
+package org.openecomp.sdc.asdctool.enums;
+
+public enum SchemaZipFileEnum {
+       
+       DATA("data", "data-types", "dataTypes", "data_types", new String[]{}),
+       GROUPS("groups", "group-types", "groupTypes", "group_types", new String[]{"data.yml"}),
+       POLICIES("policies", "policy-types", "policyTypes","policy_types", new String[]{"data.yml"}),
+       RELATIONSHIPS("relationships","relationship-types","relationshipTypes", "relationship_types", new String[]{"capabilities.yml", "data.yml", "interfaces.yml"}),
+       ARTIFACTS("artifacts", "artifact-types", "artifactTypes", "artifact_types", new String[]{"data.yml"}),
+       CAPABILITIES("capabilities", "capability-types", "capabilityTypes", "capability_types" ,new String[]{"data.yml"}),
+       INTERFACES("interfaces", "interface-lifecycle-types", "interfaceLifecycleTypes", "interface_types", new String[]{"data.yml"});
+       
+       private String fileName;
+       private String sourceFolderName;
+       private String sourceFileName;
+       private String collectionTitle;
+       private String[] importFileList;
+
+       private SchemaZipFileEnum(String fileName, String sourceFolderName, String sourceFileName, String collectionTitle,
+                       String[] importFileList) {
+               this.fileName = fileName;
+               this.sourceFolderName = sourceFolderName;
+               this.sourceFileName = sourceFileName;
+               this.collectionTitle = collectionTitle;
+               this.importFileList = importFileList;
+       }
+
+       public String getFileName() {
+               return fileName;
+       }
+
+       public void setFileName(String fileName) {
+               this.fileName = fileName;
+       }
+
+       public String getSourceFolderName() {
+               return sourceFolderName;
+       }
+
+       public void setSourceFolderName(String sourceFolderName) {
+               this.sourceFolderName = sourceFolderName;
+       }
+
+       public String getSourceFileName() {
+               return sourceFileName;
+       }
+
+       public void setSourceFileName(String sourceFileName) {
+               this.sourceFileName = sourceFileName;
+       }
+
+       public String getCollectionTitle() {
+               return collectionTitle;
+       }
+
+       public void setCollectionTitle(String collectionTitle) {
+               this.collectionTitle = collectionTitle;
+       }
+
+       public String[] getImportFileList() {
+               return importFileList;
+       }
+
+       public void setImportFileList(String[] importFileList) {
+               this.importFileList = importFileList;
+       }
+       
+}
index efc34a7..50563a5 100644 (file)
 
 package org.openecomp.sdc.asdctool.main;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Files;
-import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 import org.apache.commons.codec.digest.DigestUtils;
+import org.openecomp.sdc.asdctool.enums.SchemaZipFileEnum;
 import org.openecomp.sdc.asdctool.impl.EsToCassandraDataMigrationConfig;
 import org.openecomp.sdc.be.config.ConfigurationManager;
 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
@@ -36,48 +47,101 @@ import org.openecomp.sdc.common.api.ConfigurationSource;
 import org.openecomp.sdc.common.impl.ExternalConfiguration;
 import org.openecomp.sdc.common.impl.FSConfigurationSource;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
 
 
 public class SdcSchemaFileImport {
        
        private static SdcSchemaFilesCassandraDao schemaFilesCassandraDao;
        
+       private static final String TOSCA_VERSION = "tosca_simple_yaml_1_1";
+               
+       private static String importToscaPath;
+       
+       private static byte[] buffer = new byte[1024];
+       
+       private static String YAML_EXTENSION = ".yml";
+       
+       private static String LICENSE_TXT;
+       
+       private static ZipOutputStream zos; 
+       
        public static void main(String[] args) throws Exception {
                
+               //Generation flow start - generating SDC from normatives
+               
                final String FILE_NAME = "SDC.zip";
                
                if (args == null || args.length < 4) {
                        usageAndExit();
                }
                
-               String pathAndFile = args[0];
+               importToscaPath = args[0];
                String sdcReleaseNum = args[1];
                String conformanceLevel = args[2];
                String appConfigDir = args[3];
-               
-               File file = new File(pathAndFile);
-               if(!file.exists()){
-                       System.out.println("The file or path does not exist");
-                       System.exit(1);
-               } else if(!file.isFile()){
-                       System.out.println("Specify the file name");
+                               
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+               zos = new ZipOutputStream(baos);
+       
+               //Initialize the license text
+               try {
+                       LICENSE_TXT = new String(Files.readAllBytes(Paths.get(appConfigDir + "\\license.txt")));
+               }
+               catch(Exception e)  {
+                       System.err.println("Couldn't read license.txt in location :" + appConfigDir);
                        System.exit(1);
                }
-
+               
+               //Loop over schema file list and create each yaml file from /import/tosca folder 
+               SchemaZipFileEnum[] schemaFileList = SchemaZipFileEnum.values();
+               for (SchemaZipFileEnum schemaZipFileEnum : schemaFileList) {
+                       try {
+                               //get the source yaml file
+                               String pathname = importToscaPath + "\\" + schemaZipFileEnum.getSourceFolderName() + "\\" +  schemaZipFileEnum.getSourceFileName() + YAML_EXTENSION;
+                               System.out.println("Processing file "+pathname+"....");
+                               InputStream input = new FileInputStream(new File(pathname));
+                               //Convert the content of file to yaml 
+                               Yaml yamlFileSource = new Yaml();
+                           Object content = yamlFileSource.load(input);
+                           
+                           createAndSaveSchemaFileYaml(schemaZipFileEnum, content);
+                       }
+                       catch(Exception e)  {
+                               System.err.println("Error in file creation : " + schemaZipFileEnum.getFileName() + ", " + e.getMessage());
+                               System.exit(1);
+                       }
+               }
+               
+               createAndSaveNodeSchemaFile();
+               
+       try  {
+               //close the ZipOutputStream
+               zos.close();
+               System.out.println("File SDC.zip creation successful");
+               
+       }       catch(Exception ex)  {
+               System.err.println("Failed to pack SDC.zip file, error: "+ex);
+               System.exit(1);
+       }
+       
+       //Generation flow end - generating SDC from normatives
+               
                AnnotationConfigApplicationContext context = initContext(appConfigDir);
                schemaFilesCassandraDao = (SdcSchemaFilesCassandraDao) context.getBean("sdc-schema-files-cassandra-dao");
                
-               Path path = Paths.get(pathAndFile);
-               byte[] fileBytes = Files.readAllBytes(path);
-               
+               byte[] fileBytes = baos.toByteArray();
+
                Date date = new Date();
                String md5Hex = DigestUtils.md5Hex(fileBytes);
                
                SdcSchemaFilesData schemeFileData = new SdcSchemaFilesData(sdcReleaseNum, date, conformanceLevel, FILE_NAME, fileBytes, md5Hex);
                CassandraOperationStatus saveSchemaFile = schemaFilesCassandraDao.saveSchemaFile(schemeFileData);
                
-               if(!saveSchemaFile.equals(CassandraOperationStatus.OK)){
-                       System.out.println("SdcSchemaFileImport failed cassandra error" + saveSchemaFile);
+               if(!saveSchemaFile.equals(CassandraOperationStatus.OK))  {
+                       System.err.println("SdcSchemaFileImport failed cassandra error" + saveSchemaFile);
                        System.exit(1);
                }
                
@@ -86,13 +150,107 @@ public class SdcSchemaFileImport {
                System.exit(0);
        }
        
-       private static void usageAndExit(){
+       public static void createAndSaveSchemaFileYaml(SchemaZipFileEnum schemaZipFileEnum, Object content) {   
+               createAndSaveSchemaFileYaml(schemaZipFileEnum.getFileName(), schemaZipFileEnum.getImportFileList(), schemaZipFileEnum.getCollectionTitle(), content);
+       }
+       
+       public static void createAndSaveSchemaFileYaml(String fileName, String[] importFileList, String collectionTitle, Object content) {
+           
+               //Initialize the snake yaml dumper option
+               DumperOptions options = new DumperOptions();
+               options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+               
+           //Create the new yaml
+               Yaml yaml = new Yaml(options);
+               yaml.setName(fileName);
+                
+               //Initialize the yaml contents
+               Map<String, Object> data = new LinkedHashMap<String, Object>();
+                                       
+               data.put("tosca_definitions_version", TOSCA_VERSION);
+               
+               if (importFileList.length > 0)  {
+                       data.put("imports", importFileList);
+               }
+               
+               data.put(collectionTitle, content);
+               
+               //Save the new yaml to file
+               try {
+               
+                       FileWriter writer;
+                       File file = File.createTempFile(fileName, YAML_EXTENSION);
+                       writer = new FileWriter(file);
+                       
+                       //Add the license as comment in top of file
+                       writer.write(LICENSE_TXT);
+                       
+                       yaml.dump(data, writer);
+                       
+                       writer.close();
+                       
+                       // begin writing a new ZIP entry, positions the stream to the start of the entry data
+                       ZipEntry entry = new ZipEntry(yaml.getName() + YAML_EXTENSION);
+                       zos.putNextEntry(entry);
+                       FileInputStream stream = new FileInputStream(file.getAbsolutePath());
+               int len;
+               while ((len = stream.read(buffer)) > 0) {
+                       zos.write(buffer, 0, len);
+               }
+               //close the InputStream
+               stream.close();
+               zos.closeEntry();
+               file.delete();
+               
+               } catch (IOException e) {
+                       System.out.println("Error in file creation : " + fileName + ", " + e.getMessage());
+                       System.exit(1);
+               }
+       }
+       
+       public static void createAndSaveNodeSchemaFile() throws IOException  {
+               
+               //Initialize the snake yaml dumper option
+               DumperOptions options = new DumperOptions();
+               options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+               
+               Map<String, Object> nodeTypeList = new LinkedHashMap<String, Object>();
+               
+               String[] importFileList = new String[]{"data.yml", "artifacts.yml", "capabilities.yml", "interfaces.yml", "relationships.yml"}; 
+               String collectionTitle = "node_types";
+               
+               //Create node.yaml - collect all types from normative-types and heat-types directories
+               String[] nodeTypesMainFolders = new String[]{"normative-types", "heat-types"};
+               
+               for (String nodeTypesMainFolder : nodeTypesMainFolders) {
+                       Files.walk(Paths.get(importToscaPath + "\\" + nodeTypesMainFolder))
+                     .filter(path -> path.getFileName().toString().toLowerCase().endsWith(YAML_EXTENSION))
+                     .forEach(yamlFile -> {
+                         try {
+                                               String path = yamlFile.toAbsolutePath().toString();
+                                               System.out.println("Processing node type file "+path+"...");
+                                               FileInputStream inputStream = new FileInputStream(path);
+                                       Yaml yaml = new Yaml();
+                                       Map<String, Object> load = (Map<String, Object>) yaml.load(inputStream);
+                                               Map<String, Object> nodeType = (Map<String, Object>) load.get(collectionTitle);
+                                               nodeTypeList.putAll(nodeType);
+                                               
+                                       } catch (Exception e) {
+                                               System.err.println("Error in opening file " + yamlFile.toAbsolutePath().toString());
+                                               System.exit(1);
+                                       }
+                     });
+               }
+               createAndSaveSchemaFileYaml("nodes", importFileList, collectionTitle, nodeTypeList);
+       }
+
+       private static void usageAndExit()  {
                SdcSchemaFileImportUsage();
                System.exit(1);
        }
        
-       private static void SdcSchemaFileImportUsage(){
-               System.out.println("Usage: <file dir/filename> <SDC release number> <Schema conformance level> <configuration dir>");
+       private static void SdcSchemaFileImportUsage()  {
+               System.err.println("Usage: <file dir/filename> <SDC release number> <Schema conformance level> <configuration dir>");
        }
        
        private static AnnotationConfigApplicationContext initContext(String appConfigDir) {
index 8a89377..fe9c848 100644 (file)
@@ -57,6 +57,7 @@ import org.openecomp.sdc.be.switchover.detector.SwitchoverDetector;
 import org.openecomp.sdc.common.api.HealthCheckInfo;
 import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckComponent;
 import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckStatus;
+import org.openecomp.sdc.common.api.HealthCheckWrapper;
 import org.openecomp.sdc.common.impl.ExternalConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -253,9 +254,9 @@ public class HealthCheckBusinessLogic {
        private List<HealthCheckInfo> getAmdocsHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
                HealthCheckStatus healthCheckStatus;
                String description;
-               Map<String, Object> amdocsHC = null;
                String version = null;
-               List<HealthCheckInfo> componentsInfo = null;
+               List<HealthCheckInfo> componentsInfo = new ArrayList<>();
+
                CloseableHttpClient httpClient = getHttpClient();
                String amdocsHealtchCheckUrl = buildHealthCheckUrl();
                HttpGet httpGet = new HttpGet(amdocsHealtchCheckUrl);
@@ -265,37 +266,45 @@ public class HealthCheckBusinessLogic {
                        beResponse = httpClient.execute(httpGet);
                        beStatus = beResponse.getStatusLine().getStatusCode();
 
-                       HttpEntity entity = beResponse.getEntity();
-                       String beJsonResponse = EntityUtils.toString(entity);
-                       Gson gson = new Gson();
-                       amdocsHC = gson.fromJson(beJsonResponse, Map.class);
-                       version = amdocsHC.get("sdcVersion") != null ? amdocsHC.get("sdcVersion").toString() : null;
-                       Object object = amdocsHC.get("componentsInfo");
-                       Type listType = new TypeToken<List<HealthCheckInfo>>(){}.getType();
-                       componentsInfo = gson.fromJson(object.toString(), listType);
+                       StringBuilder sb = new StringBuilder();
+
+                       if (beStatus == HttpStatus.SC_OK || beStatus == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
+                               HttpEntity entity = beResponse.getEntity();
+                               String beJsonResponse = EntityUtils.toString(entity);
+                               Gson gson = new Gson();
+                               HealthCheckWrapper healthCheckWrapper = gson.fromJson(beJsonResponse, HealthCheckWrapper.class);
+                               version = healthCheckWrapper.getSdcVersion();
+                               componentsInfo = healthCheckWrapper.getComponentsInfo();
+
+                               if (componentsInfo != null) {
+                                       componentsInfo.forEach(x -> {
+                                               if (x.getHealthCheckStatus() == HealthCheckStatus.DOWN) {
+                                                       sb.append("Component " + x.getHealthCheckComponent().name() + " is Down, ");
+                                               }
+                                       });
+                               } else {
+                                       componentsInfo.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, null));
+                               }
+                       }
 
                        if (beStatus != HttpStatus.SC_OK) {
                                healthCheckStatus = HealthCheckStatus.DOWN;
-                               StringBuilder sb = new StringBuilder();
-                               componentsInfo.forEach(x -> {
-                                       if (x.getHealthCheckStatus()==HealthCheckStatus.DOWN){
-                                               sb.append("Component "+x.getHealthCheckComponent().name()+" is Down,");
-                                       }
-                               });
                                //Removing the last comma
                                description = sb.length()>0 
                                                ? sb.substring(0, sb.length()-1) 
                                                                : "Onboarding is Down, specific reason unknown";//No Amdocs inner component returned DOWN, but the status of Amdocs HC is still DOWN.
+                               if (componentsInfo.size() == 0) {
+                                       componentsInfo.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, description));
+                               }
                        } else {
                                healthCheckStatus = HealthCheckStatus.UP;
                                description = "OK";
-
-
                        }
 
                } catch (Exception e) {
                        healthCheckStatus = HealthCheckStatus.DOWN;
                        description = "Onboarding unexpected response: " + e.getMessage();
+                       componentsInfo.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, description));
                } finally {
                        if (httpClient != null) {
                                try {
diff --git a/catalog-be/src/main/resources/config/SDC.zip b/catalog-be/src/main/resources/config/SDC.zip
deleted file mode 100644 (file)
index a4ff817..0000000
Binary files a/catalog-be/src/main/resources/config/SDC.zip and /dev/null differ
diff --git a/catalog-be/src/main/resources/config/license.txt b/catalog-be/src/main/resources/config/license.txt
new file mode 100644 (file)
index 0000000..0a4f362
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# 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.
+#
diff --git a/catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.yml b/catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.yml
new file mode 100644 (file)
index 0000000..7b7e640
--- /dev/null
@@ -0,0 +1,30 @@
+tosca.artifacts.Root:
+  description: This is the default (root) TOSCA Artifact Type definition that all other TOSCA base Artifact Types derive from.
+
+tosca.artifacts.Deployment.Image:
+  derived_from: tosca.artifacts.Deployment
+  description: This artifact type represents a parent type for any "image" which is an opaque packaging of a TOSCA Node's deployment (whether real or virtual) whose contents are typically already installed and pre-configured (i.e., "stateful") and prepared to be run on a known target container.
+
+tosca.artifacts.Implementation.Bash:
+  derived_from: tosca.artifacts.Implementation
+  description: This artifact type represents a Bash script type that contains Bash commands that can be executed on the Unix Bash shell.
+
+tosca.artifacts.Deployment.Image.VM:
+  derived_from: tosca.artifacts.Deployment
+  description: This artifact represents the parent type for all Virtual Machine (VM) image and container formatted deployment artifacts. These images contain a stateful capture of a machine (e.g., server) including operating system and installed software along with any configurations and can be run on another machine using a hypervisor which virtualizes typical server (i.e., hardware) resources.
+
+tosca.artifacts.Implementation.Python:
+  derived_from: tosca.artifacts.Implementation
+  description: This artifact type represents a Python file that contains Python language constructs that can be executed within a Python interpreter.
+
+tosca.artifacts.Deployment:
+  derived_from: tosca.artifacts.Root
+  description: This artifact type represents the parent type for all deployment artifacts in TOSCA. This class of artifacts typically represents a binary packaging of an application or service that is used to install/create or deploy it as part of a node's lifecycle.
+
+tosca.artifacts.File:
+  derived_from: tosca.artifacts.Root
+  description: This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type).
+
+tosca.artifacts.Implementation:
+  derived_from: tosca.artifacts.Root
+  description: This artifact type represents the parent type for all implementation artifacts in TOSCA. These artifacts are used to implement operations of TOSCA interfaces either directly (e.g., scripts) or indirectly (e.g., config. files).
diff --git a/catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.zip b/catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.zip
new file mode 100644 (file)
index 0000000..7a0a5d9
Binary files /dev/null and b/catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.zip differ
diff --git a/catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.yml b/catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.yml
new file mode 100644 (file)
index 0000000..5fb5390
--- /dev/null
@@ -0,0 +1,111 @@
+  tosca.relationships.Root:
+    description: This is the default (root) TOSCA Relationship Type definition that all other TOSCA Relationship Types derive from.
+    attributes:
+      tosca_id:
+        description: A unique identifier of the realized instance of a Relationship Template that derives from any TOSCA normative type.
+        type: string
+      tosca_name:
+        description: This attribute reflects the name of the Relationship Template as defined in the TOSCA service template. This name is not unique to the realized instance model of corresponding deployed application as each template in the model can result in one or more instances (e.g., scaled) when orchestrated to a provider environment.
+        type: string
+      state:
+        description: The state of the relationship instance.
+        type: string
+        default: initial
+    interfaces:
+      Configure:
+        type: tosca.interfaces.relationship.Configure        
+
+  tosca.relationships.RoutesTo:
+    derived_from: tosca.relationships.ConnectsTo
+    description: This type represents an intentional network routing between two Endpoints in different networks.
+    valid_target_types:
+    - tosca.capabilities.Endpoint
+
+  tosca.relationships.network.LinksTo:
+    derived_from: tosca.relationships.DependsOn
+    description: This relationship type represents an association relationship between Port and Network node types.
+    valid_target_types:
+    - tosca.capabilities.network.Linkable
+
+  tosca.relationships.AttachesTo:
+    derived_from: tosca.relationships.Root
+    description: This type represents an attachment relationship between two nodes. For example, an AttachesTo relationship type would be used for attaching a storage node to a Compute node.
+    valid_target_types:
+    - tosca.capabilities.Attachment
+    properties:
+      location:
+        description: 'The relative location (e.g., path on the file system), which
+          provides the root location to address an attached node. e.g., a mount point
+          / path such as ''/usr/data''. Note: The user must provide it and it cannot
+          be "root".'
+        type: string
+        constraints:
+        - min_length: 1
+      device:
+        description: The logical device name which for the attached device (which is represented by the target node in the model). e.g., '/dev/hda1'.
+        type: string
+        required: false
+    attributes:
+      device:
+        description: 'The logical name of the device as exposed to the instance. Note:
+          A runtime property that gets set when the model gets instantiated by the
+          orchestrator.'
+        type: string
+
+  tosca.relationships.network.BindsTo:
+    derived_from: tosca.relationships.DependsOn
+    description: This type represents a network association relationship between Port and Compute node types.
+    valid_target_types:
+    - tosca.capabilities.network.Bindable
+
+  tosca.relationships.HostedOn:
+    derived_from: tosca.relationships.Root
+    description: This type represents a hosting relationship between two nodes.
+    valid_target_types:
+    - tosca.capabilities.Container
+
+  tosca.relationships.DependsOn:
+    derived_from: tosca.relationships.Root
+    description: This type represents a general dependency relationship between two nodes.
+    valid_target_types:
+    - tosca.capabilities.Node
+
+  tosca.relationships.ConnectsTo:
+    derived_from: tosca.relationships.Root
+    description: This type represents a network connection relationship between two nodes.
+    valid_target_types:
+    - tosca.capabilities.Endpoint
+    properties:
+      credential:
+        type: tosca.datatypes.Credential
+        required: false
+
+  org.openecomp.relationships.VolumeAttachesTo:
+    derived_from: org.openecomp.relationships.AttachesTo
+    description: This type represents an attachment relationship for associating volume
+    properties:
+      volume_id:
+        description: The ID of the volume to be attached
+        type: string
+        status: SUPPORTED
+        required: true
+      instance_uuid:
+        description: The ID of the server to which the volume attaches
+        type: string
+        status: SUPPORTED
+        required: true
+    attributes:
+      show:
+        description: Detailed information about resource
+        type: string
+        status: SUPPORTED
+
+  org.openecomp.relationships.AttachesTo:
+    derived_from: tosca.relationships.AttachesTo
+    description: This type represents an attachment relationship
+    properties:
+      location:
+        description: The relative location (e.g., path on the file system), which provides the root location to address an attached node.
+        type: string
+        status: SUPPORTED
+        required: false
\ No newline at end of file
diff --git a/catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.zip b/catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.zip
new file mode 100644 (file)
index 0000000..dbb1ca0
Binary files /dev/null and b/catalog-be/src/main/resources/import/tosca/relationship-types/relationshipTypes.zip differ
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/SchemaFiles.java b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/SchemaFiles.java
new file mode 100644 (file)
index 0000000..fdfd1c7
--- /dev/null
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.tosca;
+
+import static org.junit.Assert.*;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+import org.yaml.snakeyaml.Yaml;
+
+public class SchemaFiles {
+       
+       @Test
+       public void testValidateYamlNormativeFiles(){
+               String importToscaPath = "src/main/resources/import/tosca";
+               assertTrue(checkValidYamlInFileTree(importToscaPath));
+       }
+       
+       @Test
+       public void testRainyYamlNormativeFiles(){
+               String importToscaPathTest = "src/test/resources/yamlValidation";
+               assertFalse(checkValidYamlInFileTree(importToscaPathTest));
+       }
+       
+       private boolean checkValidYamlInFileTree(String fileTree)  {
+               
+               try {
+                       List<Path> fileTreeYamlList = Files.walk(Paths.get(fileTree))
+                         .filter(path -> path.getFileName().toString().toLowerCase().endsWith(".yml"))
+                         .collect(Collectors.toList());
+                       
+                       for (Path yamlFile : fileTreeYamlList) {
+                               try {
+                                       FileInputStream inputStream = new FileInputStream(yamlFile.toAbsolutePath().toString());
+                               Yaml yaml = new Yaml();
+                               Object content = yaml.load(inputStream);
+                               } catch (Exception e) { 
+                                       System.out.println("Not valid yaml in file creation : " + yamlFile.toAbsolutePath().toString());
+                                       return false;
+                               }
+                       }
+               } catch (IOException e) {
+                       System.out.println("Error in reading file from folder : " + fileTree);
+                       return false;
+               }
+               return true;
+       }
+       
+       
+}
diff --git a/catalog-be/src/test/resources/yamlValidation/test-no-valid.yml b/catalog-be/src/test/resources/yamlValidation/test-no-valid.yml
new file mode 100644 (file)
index 0000000..335758e
--- /dev/null
@@ -0,0 +1,1199 @@
+    tosca.datatypes.Root:
+  description: The TOSCA root Data Type all other TOSCA base Data Types derive from
+
+integer:
+  derived_from: tosca.datatypes.Root
+
+string:
+  derived_from: tosca.datatypes.Root
+
+boolean:
+  derived_from: tosca.datatypes.Root
+
+float:
+  derived_from: tosca.datatypes.Root
+
+list:
+  derived_from: tosca.datatypes.Root
+
+map:
+  derived_from: tosca.datatypes.Root
+
+json:
+  derived_from: tosca.datatypes.Root
+
+scalar-unit:
+  derived_from: tosca.datatypes.Root
+
+scalar-unit.size:
+  derived_from: scalar-unit
+
+scalar-unit.time:
+  derived_from: scalar-unit
+
+scalar-unit.frequency:
+  derived_from: scalar-unit
+
+  
+tosca.datatypes.Credential: 
+  derived_from: tosca.datatypes.Root
+  properties: 
+    protocol: 
+      type: string
+      required: false
+    token_type: 
+      type: string
+      default: password
+    token: 
+      type: string
+    keys:
+      type: map
+      required: false
+      entry_schema:
+        type: string
+    user:
+      type: string
+      required: false
+
+tosca.datatypes.TimeInterval: 
+  derived_from: tosca.datatypes.Root
+  properties:
+    start_time: 
+      type: timestamp
+      required: true
+    end_time: 
+      type: timestamp
+      required: true
+
+tosca.datatypes.network.NetworkInfo:
+  derived_from: tosca.datatypes.Root
+  properties:  
+    network_name: 
+      type: string
+    network_id: 
+      type: string
+    addresses:
+      type: list
+      entry_schema:
+        type: string
+
+tosca.datatypes.network.PortInfo: 
+  derived_from: tosca.datatypes.Root
+  properties:  
+    port_name: 
+      type: string
+    port_id: 
+      type: string
+    network_id: 
+      type: string
+    mac_address: 
+      type: string
+    addresses:
+      type: list
+      entry_schema:
+        type: string
+
+tosca.datatypes.network.PortDef:
+  derived_from: integer
+  constraints: 
+    - in_range: [ 1, 65535 ]
+
+tosca.datatypes.network.PortSpec: 
+  derived_from: tosca.datatypes.Root
+  properties:  
+    protocol: 
+      type: string
+      required: true
+      default: tcp
+      constraints:
+        - valid_values: [ udp, tcp, igmp ]
+    target:  
+      type: tosca.datatypes.network.PortDef
+    target_range:
+      type: range 
+      constraints:
+        - in_range: [ 1, 65535 ]
+    source:
+      type: tosca.datatypes.network.PortDef
+    source_range:
+      type: range
+      constraints:
+        - in_range: [ 1, 65535 ]
+
+###################new Data Types Onboarding Integration##########################
+
+org.openecomp.datatypes.heat.network.AddressPair:
+  derived_from: tosca.datatypes.Root
+  description: MAC/IP address pairs
+  properties:
+    mac_address:
+      type: string
+      description: MAC address
+      required: false
+      status: SUPPORTED
+    ip_address:
+      type: string
+      description: IP address
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.network.subnet.HostRoute:
+  derived_from: tosca.datatypes.Root
+  description: Host route info for the subnet
+  properties:
+    destination:
+      type: string
+      description: The destination for static route
+      required: false
+      status: SUPPORTED
+    nexthop:
+      type: string
+      description: The next hop for the destination
+      required: false
+      status: SUPPORTED
+      
+org.openecomp.datatypes.heat.network.AllocationPool:
+  derived_from: tosca.datatypes.Root
+  description: The start and end addresses for the allocation pool
+  properties:
+    start:
+      type: string
+      description: Start address for the allocation pool
+      required: false
+      status: SUPPORTED
+    end:
+      type: string
+      description: End address for the allocation pool
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.network.neutron.Subnet:
+  derived_from: tosca.datatypes.Root
+  description: A subnet represents an IP address block that can be used for assigning IP addresses to virtual instances
+  properties:
+    tenant_id:
+      type: string
+      description: The ID of the tenant who owns the network
+      required: false
+      status: SUPPORTED
+    enable_dhcp:
+      type: boolean
+      description: Set to true if DHCP is enabled and false if DHCP is disabled
+      required: false
+      default: true
+      status: SUPPORTED
+    ipv6_address_mode:
+      type: string
+      description: IPv6 address mode
+      required: false
+      status: SUPPORTED
+      constraints:
+      - valid_values:
+        - dhcpv6-stateful
+        - dhcpv6-stateless
+        - slaac
+    ipv6_ra_mode:
+      type: string
+      description: IPv6 RA (Router Advertisement) mode
+      required: false
+      status: SUPPORTED
+      constraints:
+      - valid_values:
+        - dhcpv6-stateful
+        - dhcpv6-stateless
+        - slaac
+    value_specs:
+      type: map
+      description: Extra parameters to include in the request
+      required: false
+      default: {
+        }
+      status: SUPPORTED
+      entry_schema:
+        type: string
+    allocation_pools:
+       type: list
+       description: The start and end addresses for the allocation pools
+       required: false
+       status: SUPPORTED
+       entry_schema:
+         type: org.openecomp.datatypes.heat.network.AllocationPool
+    subnetpool:
+      type: string
+      description: The name or ID of the subnet pool
+      required: false
+      status: SUPPORTED
+    dns_nameservers:
+      type: list
+      description: A specified set of DNS name servers to be used
+      required: false
+      default: [
+        ]
+      status: SUPPORTED
+      entry_schema:
+        type: string     
+    host_routes:
+      type: list
+      description: The gateway IP address
+      required: false
+      status: SUPPORTED
+      entry_schema:
+        type: org.openecomp.datatypes.heat.network.subnet.HostRoute
+    ip_version:
+      type: integer
+      description: The gateway IP address
+      required: false
+      default: 4
+      status: SUPPORTED
+      constraints:
+      - valid_values:
+        - '4'
+        - '6'
+    name:
+      type: string
+      description: The name of the subnet
+      required: false
+      status: SUPPORTED
+    prefixlen:
+      type: integer
+      description: Prefix length for subnet allocation from subnet pool
+      required: false
+      status: SUPPORTED
+      constraints:
+      - greater_or_equal: 0
+    cidr:
+      type: string
+      description: The CIDR
+      required: false
+      status: SUPPORTED
+    gateway_ip:
+      type: string
+      description: The gateway IP address
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.novaServer.network.PortExtraProperties:
+  derived_from: tosca.datatypes.Root
+  description: Nova server network expand properties for port
+  properties:
+    port_security_enabled:
+      type: boolean
+      description: Flag to enable/disable port security on the port
+      required: false
+      status: SUPPORTED
+    mac_address:
+      type: string
+      description: MAC address to give to this port
+      required: false
+      status: SUPPORTED
+    admin_state_up:
+      type: boolean
+      description: The administrative state of this port
+      required: false
+      default: true
+      status: SUPPORTED
+    qos_policy:
+      type: string
+      description: The name or ID of QoS policy to attach to this port
+      required: false
+      status: SUPPORTED
+    allowed_address_pairs:
+      type: list
+      description: Additional MAC/IP address pairs allowed to pass through the port
+      required: false
+      status: SUPPORTED
+      entry_schema:
+        type: org.openecomp.datatypes.heat.network.AddressPair
+    binding:vnic_type:
+      type: string
+      description: The vnic type to be bound on the neutron port
+      required: false
+      status: SUPPORTED
+      constraints:
+      - valid_values:
+        - macvtap
+        - direct
+        - normal
+    value_specs:
+      type: map
+      description: Extra parameters to include in the request
+      required: false
+      default: {
+        }
+      status: SUPPORTED
+      entry_schema:
+        type: string
+
+org.openecomp.datatypes.heat.novaServer.network.AddressInfo:
+  derived_from: tosca.datatypes.network.NetworkInfo
+  description: Network addresses with corresponding port id
+  properties:
+    port_id:
+      type: string
+      description: Port id
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.neutron.port.FixedIps:
+  derived_from: tosca.datatypes.Root
+  description: subnet/ip_address
+  properties:
+    subnet:
+      type: string
+      description: Subnet in which to allocate the IP address for this port
+      required: false
+      status: SUPPORTED
+    ip_address:
+      type: string
+      description: IP address desired in the subnet for this port
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.FileInfo:
+  derived_from: tosca.datatypes.Root
+  description: Heat File Info
+  properties:
+    file:
+      type: string
+      description: The required URI string (relative or absolute) which can be used to locate the file
+      required: true
+      status: SUPPORTED
+    file_type:
+      type: string
+      description: The type of the file
+      required: true
+      status: SUPPORTED
+      constraints:
+      - valid_values:
+        - base
+        - env
+        - volume
+        - network
+
+org.openecomp.datatypes.heat.contrail.network.rule.PortPairs:
+    derived_from: tosca.datatypes.Root
+    description: source and destination port pairs
+    properties:
+      start_port:
+        type: string
+        description: Start port
+        required: false
+        status: SUPPORTED
+      end_port:
+        type: string
+        description: End port
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrail.network.rule.Rule:
+    derived_from: tosca.datatypes.Root
+    description: policy rule
+    properties:
+      src_ports:
+        type: list
+        description: Source ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs
+      protocol:
+        type: string
+        description: Protocol
+        required: false
+        status: SUPPORTED
+      dst_addresses:
+        type: list
+        description: Destination addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork
+      apply_service:
+        type: string
+        description: Service to apply
+        required: false
+        status: SUPPORTED
+      dst_ports:
+        type: list
+        description: Destination ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs
+      src_addresses:
+        type: list
+        description: Source addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork
+      direction:
+        type: string
+        description: Direction
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrail.network.rule.RuleList:
+    derived_from: tosca.datatypes.Root
+    description: list of policy rules
+    properties:
+      policy_rule:
+        type: list
+        description: Contrail network rule
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.Rule
+
+org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork:
+    derived_from: tosca.datatypes.Root
+    description: source and destination addresses
+    properties:
+      virtual_network:
+        type: string
+        description: Virtual network
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.network.neutron.SecurityRules.Rule:
+    derived_from: tosca.datatypes.Root
+    description: Rules Pairs
+    properties:
+      remote_group_id:
+        type: string
+        description: The remote group ID to be associated with this security group rule
+        required: false
+        status: SUPPORTED
+      protocol:
+        type: string
+        description: The protocol that is matched by the security group rule
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - tcp
+          - udp
+          - icmp
+      ethertype:
+        type: string
+        description: Ethertype of the traffic
+        required: false
+        default: IPv4
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - IPv4
+          - IPv6
+      port_range_max:
+        type: integer
+        description: 'The maximum port number in the range that is matched by the
+          security group rule. '
+        required: false
+        status: SUPPORTED
+        constraints:
+        - in_range:
+          - 0
+          - 65535
+      remote_ip_prefix:
+        type: string
+        description: The remote IP prefix (CIDR) to be associated with this security group rule
+        required: false
+        status: SUPPORTED
+      remote_mode:
+        type: string
+        description: Whether to specify a remote group or a remote IP prefix
+        required: false
+        default: remote_ip_prefix
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - remote_ip_prefix
+          - remote_group_id
+      direction:
+        type: string
+        description: The direction in which the security group rule is applied
+        required: false
+        default: ingress
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - egress
+          - ingress
+      port_range_min:
+        type: integer
+        description: The minimum port number in the range that is matched by the security group rule.
+        required: false
+        status: SUPPORTED
+        constraints:
+        - in_range:
+          - 0
+          - 65535
+
+org.openecomp.datatypes.heat.substitution.SubstitutionFiltering:
+    derived_from: tosca.datatypes.Root
+    description: Substitution Filter
+    properties:
+      substitute_service_template:
+        type: string
+        description: Substitute Service Template
+        required: true
+        status: SUPPORTED
+      index_value:
+        type: integer
+        description: Index value of the substitution service template runtime instance
+        required: false
+        default: 0
+        status: SUPPORTED
+        constraints:
+        - greater_or_equal: 0
+      count:
+        type: string
+        description: Count
+        required: false
+        default: 1
+        status: SUPPORTED
+      scaling_enabled:
+        type: boolean
+        description: Indicates whether service scaling is enabled
+        required: false
+        default: true
+        status: SUPPORTED
+      mandatory:
+        type: boolean
+        description: Mandatory
+        required: false
+        default: true
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence:
+    derived_from: tosca.datatypes.Root
+    description: network policy refs data sequence
+    properties:
+      network_policy_refs_data_sequence_major:
+        type: integer
+        description: Network Policy ref data sequence Major
+        required: false
+        status: SUPPORTED
+      network_policy_refs_data_sequence_minor:
+        type: integer
+        description: Network Policy ref data sequence Minor
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefData:
+    derived_from: tosca.datatypes.Root
+    description: network policy refs data
+    properties:
+      network_policy_refs_data_sequence:
+        type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence
+        description: Network Policy ref data sequence
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet:
+    derived_from: tosca.datatypes.Root
+    description: Network Ipam Ref Data Subnet
+    properties:
+      network_ipam_refs_data_ipam_subnets_subnet_ip_prefix_len:
+        type: string
+        description: Network ipam refs data ipam subnets ip prefix len
+        required: false
+        status: SUPPORTED
+      network_ipam_refs_data_ipam_subnets_subnet_ip_prefix:
+        type: string
+        description: Network ipam refs data ipam subnets ip prefix
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList:
+    derived_from: tosca.datatypes.Root
+    description: Network Ipam Ref Data Subnet List
+    properties:
+      network_ipam_refs_data_ipam_subnets_subnet:
+        type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet
+        description: Network ipam refs data ipam subnets
+        required: false
+        status: SUPPORTED
+      network_ipam_refs_data_ipam_subnets_addr_from_start:
+        type: string
+        description: Network ipam refs data ipam subnets addr from start
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.IpamRefData:
+    derived_from: tosca.datatypes.Root
+    description: Network Ipam Ref Data
+    properties:
+      network_ipam_refs_data_ipam_subnets:
+        type: list
+        description: Network ipam refs data ipam subnets
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork:
+    derived_from: tosca.datatypes.Root
+    description: source addresses
+    properties:
+      network_policy_entries_policy_rule_src_addresses_virtual_network:
+        type: string
+        description: Source addresses Virtual network
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork:
+    derived_from: tosca.datatypes.Root
+    description: destination addresses
+    properties:
+      network_policy_entries_policy_rule_dst_addresses_virtual_network:
+        type: string
+        description: Destination addresses Virtual network
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs:
+    derived_from: tosca.datatypes.Root
+    description: destination port pairs
+    properties:
+      network_policy_entries_policy_rule_dst_ports_start_port:
+        type: string
+        description: Start port
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_dst_ports_end_port:
+        type: string
+        description: End port
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs:
+    derived_from: tosca.datatypes.Root
+    description: source port pairs
+    properties:
+      network_policy_entries_policy_rule_src_ports_start_port:
+        type: string
+        description: Start port
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_src_ports_end_port:
+        type: string
+        description: End port
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList:
+    derived_from: tosca.datatypes.Root
+    description: Action List
+    properties:
+      network_policy_entries_policy_rule_action_list_simple_action:
+        type: string
+        description: Simple Action
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_action_list_apply_service:
+        type: list
+        description: Apply Service
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: string
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.Rule:
+    derived_from: tosca.datatypes.Root
+    description: policy rule
+    properties:
+      network_policy_entries_policy_rule_dst_addresses:
+        type: list
+        description: Destination addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork
+      network_policy_entries_policy_rule_dst_ports:
+        type: list
+        description: Destination ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs
+      network_policy_entries_policy_rule_protocol:
+        type: string
+        description: Protocol
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_src_addresses:
+        type: list
+        description: Source addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork
+      network_policy_entries_policy_rule_direction:
+        type: string
+        description: Direction
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_src_ports:
+        type: list
+        description: Source ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs
+      network_policy_entries_policy_rule_action_list:
+        type: org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList
+        description: Action list
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.network.rule.RuleList:
+    derived_from: tosca.datatypes.Root
+    description: list of policy rules
+    properties:
+      network_policy_entries_policy_rule:
+        type: list
+        description: Contrail network rule
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.Rule
+
+org.openecomp.datatypes.heat.network.contrail.port.StaticRoute:
+    derived_from: tosca.datatypes.Root
+    description: static route
+    properties:
+      prefix:
+        type: string
+        description: Route prefix
+        required: false
+        status: SUPPORTED
+      next_hop:
+        type: string
+        description: Next hop
+        required: false
+        status: SUPPORTED
+      next_hop_type:
+        type: string
+        description: Next hop type
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.network.contrail.AddressPair:
+    derived_from: tosca.datatypes.Root
+    description: Address Pair
+    properties:
+      address_mode:
+        type: string
+        description: Address mode active-active or active-standy
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - active-active
+          - active-standby
+      prefix:
+        type: string
+        description: IP address prefix
+        required: false
+        status: SUPPORTED
+      mac_address:
+        type: string
+        description: Mac address
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.network.contrail.InterfaceData:
+    derived_from: tosca.datatypes.Root
+    description: Interface Data
+    properties:
+      static_routes:
+        type: list
+        description: An ordered list of static routes to be added to this interface
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.contrail.port.StaticRoute
+      virtual_network:
+        type: string
+        description: Virtual Network for this interface
+        required: true
+        status: SUPPORTED
+      allowed_address_pairs:
+        type: list
+        description: List of allowed address pair for this interface
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.contrail.AddressPair
+      ip_address:
+        type: string
+        description: IP for this interface
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.machine.interface.Properties:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Interface Properties.
+    properties:
+      virtual_machine_interface_properties_service_interface_type:
+        type: string
+        description: Service Interface Type.
+        required: false
+        status: SUPPORTED
+
+org.openecomp.datatypes.Root:
+  derived_from: tosca.datatypes.Root
+  description: >
+    The ECOMP root Data Type all other Data Types derive from
+  properties:
+    supplemental_data:
+      type: map
+      entry_schema:
+        description: > 
+           A placeholder for missing properties that would be included in future ecomp model versions.
+           fromat <key>:<value>
+        type: string
+
+org.openecomp.datatypes.AssignmentRequirements:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    is_required:
+      description: |
+        "true" indicates that assignment is required
+      type: boolean
+      default: false
+      required: true
+    count:
+      description: number of assignments required
+      type: integer
+      required: false    
+      
+org.openecomp.datatypes.network.SubnetAssignments:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    ip_network_address_plan:
+      type: string
+      required: false
+      description: Reference to EIPAM, VLAN or other address plan ID used to assign subnets to this network 
+    dhcp_enabled:
+      type: boolean
+      required: false
+      description: \"true\" indicates the network has 1 or more policies
+    ip_version:
+      type: integer
+      constraints:
+        - valid_values: [4,6]
+      required: true
+      description: The IP version of the subnet
+    cidr_mask:
+      type: integer
+      required: true
+      description: The default subnet CIDR mask 
+    min_subnets_count:
+      type: integer
+      default: 1
+      required: true
+      description: Quantity of subnets that must be initially assigned
+
+org.openecomp.datatypes.network.IPv4SubnetAssignments:
+  derived_from: org.openecomp.datatypes.network.SubnetAssignments
+  properties:
+    use_ipv4:
+      type: boolean
+      required: true
+      description: Indicates IPv4 subnet assignments
+
+org.openecomp.datatypes.network.IPv6SubnetAssignments:
+  derived_from: org.openecomp.datatypes.network.SubnetAssignments
+  properties:
+    use_ipv6:
+      type: boolean
+      required: true
+      description: Indicates IPv6 subnet assignments
+
+org.openecomp.datatypes.network.NetworkAssignments:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    ecomp_generated_network_assignment:
+      type: boolean
+      required: true
+      default: false
+      description: >
+        \"true\" indicates that the network assignments will be auto-generated by ECOMP
+        \"false\" indicates operator-supplied Network assignments file upload is required (e.g. VID will present prompt to operator to upload operator-supplied Network assignments file).
+    is_shared_network:
+      type: boolean
+      required: true
+      description: \"true\" means this network is shared by multiple Openstack tenants
+    is_external_network:
+      type: boolean
+      required: true
+      default: false
+      description: >
+        \"true\" means this Contrail external network
+    ipv4_subnet_default_assignment:
+      type: org.openecomp.datatypes.network.IPv4SubnetAssignments
+      required: true
+      description: IPv4 defualt subnet assignments
+    ipv6_subnet_default_assignment:
+      type: org.openecomp.datatypes.network.IPv6SubnetAssignments
+      required: true
+      description: IPv6 defualt subnet assignments
+
+org.openecomp.datatypes.network.ProviderNetwork:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    is_provider_network:
+      type: boolean
+      required: true
+      description: \"true\" indicates that this a Neutron provider type of network 
+    physical_network_name:
+      type: string
+      required: false
+      constraints:
+        - valid_values: ["Physnet41", "Physnet42", "Physnet43", "Physnet44", "Physnet21", "Physnet22"]
+      description: >
+        Identifies the NUMA processor cluster to which this physical network interface belongs.
+        NUMA instance correlates to the first digit of the Physical Network Name suffix (e.g. \"01\" = NUMA 0, \"11\" = NUMA 1)
+    numa:
+      type: string
+      required: false
+      constraints:
+        - valid_values: ["NUMA 0", "NUMA 1"]
+      description: >
+        PNIC instance within the NUMA processor cluster
+        PNIC Instance correlates to the second digit of the Physical Network Name suffix (e.g. "01" = PNIC 1, "02" = "PNIC 2)
+    pnic_instance:
+      type: integer
+      required: false
+      description: PNIC instance within the NUMA processor cluster
+
+org.openecomp.datatypes.network.NetworkFlows:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    is_network_policy:
+      type: boolean
+      required: false
+      default: false
+      description: \"true\" indicates the network has 1 or more policies
+    network_policy:
+      type: string
+      required: false
+      description: "Identifies the specific Cloud network policy that must be applied to this network (source: from Policy Manager)."
+    is_bound_to_vpn:
+      type: boolean
+      required: false
+      default: false
+      description: \"true\" indicates the network has 1 or more vpn bindings
+    vpn_binding:
+      type: string
+      required: false
+      description: "Identifies the specific VPN Binding entry in A&AI that must be applied when creating this network (source: A&AI)"
+
+org.openecomp.datatypes.network.VlanRequirements:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    vlan_range_plan:
+      type: string
+      required: true
+      description: reference to a vlan range plan
+    vlan_type:
+      type: string
+      required: true
+      constraints:
+        - valid_values: ["c-tag", "s-tag"]
+      description: identifies the vlan type (e.g., c-tag)
+    vlan_count:
+      type: integer
+      required: true
+      description: identifies the number of vlan tags to assign to the CP from the plan
+
+org.openecomp.datatypes.network.IpRequirements:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    ip_version:
+      type: integer
+      required: true
+      constraints:
+        - valid_values:
+          - 4
+          - 6
+    ip_count:
+      description: identifies the number of ip address to assign to the CP from the plan
+      type: integer
+      required: false
+    floating_ip_count:
+      type: integer
+      required: false
+    subnet_role:
+      type: string
+      required: false
+    assingment_method:
+      type: string
+      required: true
+      constraints:
+        - valid_values:
+          - fixed
+          - dhcp
+    dhcp_enabled:
+      type: boolean
+      required: false
+    ip_count_required:
+      description: identifies the number of ip address to assign to the CP from the plan
+      type: org.openecomp.datatypes.AssignmentRequirements
+      required: false
+    floating_ip_count_required:
+      type: org.openecomp.datatypes.AssignmentRequirements
+      required: false 
+
+org.openecomp.datatypes.network.MacAssignments:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    mac_range_plan:
+      type: string
+      required: true
+      description: reference to a MAC address range plan
+    mac_count:
+      type: integer
+      required: true
+      description: identifies the number of MAC addresses to assign to the CP from the plan
+
+org.openecomp.datatypes.EcompHoming:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    ecomp_selected_instance_node_target:
+      type: boolean
+      required: true
+      default: false
+      description: >
+        \"true\" indicates that the target deployment node for this instance will be auto-selected by ECOMP
+        \"false\" indicates operator-supplied instance target deployment node required (e.g. VID will present a prompt to operator and collect the
+        operator-selected target node for the deployment of this Network instance).
+    homing_policy:
+      type: string
+      required: false
+      description: Referenc to a service level homing policy that ECOMP will use for instance deployment target node
+    instance_node_target:
+      type: string
+      required: false
+      description: Instance target deployment node
+
+org.openecomp.datatypes.EcompNaming:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    ecomp_generated_naming:
+      type: boolean
+      required: true
+      default: true
+      description: >
+        \"true\" indicates that the name for the instance will be auto-generated by ECOMP.
+        \"false\" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+    naming_policy:
+      type: string
+      required: false
+      description: Referenc to naming policy that ECOMP will use when the name is auto-generated
+
+org.openecomp.datatypes.network.MacRequirements:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+    mac_range_plan:
+      description: reference to a MAC address range plan
+      type: string
+      required: false
+    mac_count:
+      description: identifies the number of MAC addresses to assign to the CP from the plan
+      type: integer
+      required: false
+    mac_count_required:
+      description: identifies the number of MAC addresses to assign to the CP from the plan
+      type: org.openecomp.datatypes.AssignmentRequirements
+
+org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp:
+  derived_from: tosca.datatypes.Root
+  description: Virtual Machine Sub Interface Address Pair IP.
+  properties:
+    ip_prefix:
+      type: string
+      description: IP Prefix.
+      required: false
+      status: SUPPORTED
+    ip_prefix_len:
+      type: integer
+      description: IP Prefix Len.
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.MacAddress:
+  derived_from: tosca.datatypes.Root
+  description: Virtual Machine Sub Interface Mac Address.
+  properties:
+    mac_address:
+      type: list
+      description: Mac Addresses List.
+      required: false
+      status: SUPPORTED
+      entry_schema:
+        type: string
+
+org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.Properties:
+  derived_from: tosca.datatypes.Root
+  description: Virtual Machine Sub Interface VLAN Properties.
+  properties:
+    sub_interface_vlan_tag:
+      type: string
+      description: Sub Interface VLAN Tag.
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair:
+  derived_from: tosca.datatypes.Root
+  description: Virtual Machine Sub Interface Address Pair.
+  properties:
+    address_mode:
+      type: string
+      description: Address Mode.
+      required: false
+      status: SUPPORTED
+    ip:
+      type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp
+      description: IP.
+      required: false
+      status: SUPPORTED
+    mac:
+      type: string
+      description: Mac.
+      required: false
+      status: SUPPORTED
+
+org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairs:
+  derived_from: tosca.datatypes.Root
+  description: Virtual Machine Sub Interface Address Pairs.
+  properties:
+    allowed_address_pair:
+      type: list
+      description: Addresses pair List.
+      required: false
+      status: SUPPORTED
+      entry_schema:
+        type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair
+
+org.openecomp.datatypes.Naming:
+  derived_from: org.openecomp.datatypes.Root
+  properties:
+      ecomp_generated_naming:
+        description: |
+          "true" indicates that the name for the instance will be auto-generated by ECOMP. "false" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+        type: boolean
+        default: true
+        required: true
+      naming_policy:
+        description: Reference to naming policy that ECOMP will use when the name is auto-generated
+        type: string
+        required: false
+      instance_name:
+        description: indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+        type: string
+        required: false
+
+
diff --git a/catalog-be/src/test/resources/yamlValidation/testDir/test.txt b/catalog-be/src/test/resources/yamlValidation/testDir/test.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/catalog-be/src/test/resources/yamlValidation/testDir/test.yml b/catalog-be/src/test/resources/yamlValidation/testDir/test.yml
new file mode 100644 (file)
index 0000000..c949091
--- /dev/null
@@ -0,0 +1,206 @@
+tosca.capabilities.Root: 
+  description: The TOSCA root Capability Type all other TOSCA base Capability Types derive from
+tosca.capabilities.Attachment:
+  derived_from: tosca.capabilities.Root
+tosca.capabilities.Node:
+  derived_from: tosca.capabilities.Root
+tosca.capabilities.Container:
+  derived_from: tosca.capabilities.Root
+  properties:
+    num_cpus: 
+      type: integer
+      required: false
+      constraints:
+        - greater_or_equal: 1
+    cpu_frequency:
+      type: scalar-unit.frequency
+      required: false
+      constraints:
+        - greater_or_equal: 0.1 GHz
+    disk_size: 
+      type: scalar-unit.size
+      required: false
+      constraints:
+        - greater_or_equal: 0 MB
+    mem_size: 
+      type: scalar-unit.size
+      required: false
+      constraints:
+        - greater_or_equal: 0 MB
+tosca.capabilities.Endpoint:
+  derived_from: tosca.capabilities.Root
+  properties:
+    protocol:
+      type: string
+      default: tcp
+    port:
+      type: PortDef
+      required: false
+    secure:
+      type: boolean
+      default: false
+    url_path: 
+      type: string
+      required: false
+    port_name: 
+      type: string
+      required: false
+    network_name:
+      type: string
+      required: false 
+      default: PRIVATE
+    initiator:
+      type: string
+      default: source
+      constraints:
+        - valid_values: [ source, target, peer ]
+    ports:
+      type: map
+      required: false
+      constraints:
+        - min_length: 1
+      entry_schema:
+        type: PortSpec
+  attributes:
+    ip_address:
+      type: string
+tosca.capabilities.DatabaseEndpoint:
+  derived_from: tosca.capabilities.Endpoint
+tosca.capabilities.Endpoint.Public:
+  derived_from: tosca.capabilities.Endpoint
+  properties:
+    # Change the default network_name to use the first public network found
+    network_name: PUBLIC
+    floating:
+      description: > 
+        indicates that the public address should be allocated from a pool of floating IPs that are associated with the network.
+      type: boolean
+      default: false
+      status: experimental
+    dns_name:
+      description: The optional name to register with DNS 
+      type: string
+      required: false    
+      status: experimental
+tosca.capabilities.Endpoint.Admin:
+  derived_from: tosca.capabilities.Endpoint
+  # Change Endpoint secure indicator to true from its default of false
+  properties:
+    secure: true
+tosca.capabilities.Endpoint.Database:
+  derived_from: tosca.capabilities.Endpoint 
+tosca.capabilities.OperatingSystem:
+  derived_from: tosca.capabilities.Root
+  properties:
+    architecture:
+      type: string
+      required: false 
+    type:
+      type: string
+      required: false
+    distribution:
+      type: string
+      required: false
+    version:
+      type: version
+      required: false
+tosca.capabilities.Scalable:
+  derived_from: tosca.capabilities.Root
+  properties:
+    min_instances:
+      type: integer
+      default: 1
+    max_instances:
+      type: integer
+      default: 1
+    default_instances:
+      type: integer
+tosca.capabilities.network.Bindable:
+  derived_from: tosca.capabilities.Node
+
+
+tosca.capabilities.Container.Docker:
+  derived_from: tosca.capabilities.Container
+  properties:
+    version:
+      type: list
+      required: false
+      entry_schema: version
+    publish_all:
+      type: boolean
+      default: false
+      required: false
+    publish_ports:
+      type: list
+      entry_schema: PortSpec
+      required: false
+    expose_ports:
+      type: list
+      entry_schema: PortSpec
+      required: false
+    volumes:
+      type: list
+      entry_schema: string
+      required: false
+tosca.capabilities.network.Linkable:
+  derived_from: tosca.capabilities.Root
+org.openecomp.capabilities.AllottedResource:
+  derived_from: tosca.capabilities.Root
+tosca.capabilities.nfv.Metric:
+  derived_from: tosca.capabilities.Endpoint
+org.openecomp.capabilities.Metric:
+  derived_from: tosca.capabilities.nfv.Metric
+  description: A node type that includes the Metric capability indicates that it can be monitored.
+  properties:
+    unit:
+      type: string
+      description: Unit of the metric value
+      required: true
+      status: SUPPORTED
+    description:
+      type: string
+      description: Description of the metric
+      required: false
+      status: SUPPORTED
+    type:
+      type: string
+      description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+      required: true
+      status: SUPPORTED
+    category:
+      type: string
+      description: Category of the metric, for an example, compute, disk, network, storage and etc.
+      required: false
+      status: SUPPORTED
+  attributes:
+    value:
+      type: string
+      description: Runtime monitored value
+      status: SUPPORTED
+org.openecomp.capabilities.metric.Ceilometer:
+  derived_from: org.openecomp.capabilities.Metric
+  description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+  properties:
+    name:
+      type: string
+      description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+      required: true
+      status: SUPPORTED
+org.openecomp.capabilities.metric.SnmpPolling:
+  derived_from: org.openecomp.capabilities.Metric
+  description: A node type that includes the Metric capability indicates that it can be monitored using snmp polling.
+  properties:
+    oid:
+      type: string
+      description: Object Id of the metric
+      required: true
+      status: SUPPORTED
+org.openecomp.capabilities.metric.SnmpTrap:
+  derived_from: org.openecomp.capabilities.Metric
+  description: A node type that includes the Metric capability indicates that it can be monitored using snmp trap.
+  properties:
+    oid:
+      type: string
+      description: Object Id of the metric
+      required: true
+      status: SUPPORTED
diff --git a/catalog-be/src/test/resources/yamlValidation/testDir/test.zip b/catalog-be/src/test/resources/yamlValidation/testDir/test.zip
new file mode 100644 (file)
index 0000000..1742545
Binary files /dev/null and b/catalog-be/src/test/resources/yamlValidation/testDir/test.zip differ
index 4ef7c49..21a41b6 100644 (file)
@@ -23,6 +23,7 @@ package org.openecomp.sdc.fe.servlets;
 import java.io.IOException;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -32,6 +33,7 @@ import java.util.concurrent.TimeUnit;
 import javax.servlet.ServletContext;
 import javax.ws.rs.core.Response;
 
+import org.apache.http.HttpStatus;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
@@ -72,6 +74,7 @@ public class HealthCheckService {
        private static Logger log = LoggerFactory.getLogger(HealthCheckService.class.getName());
 
        private HealthStatus lastHealthStatus = new HealthStatus(500, "{}");
+       private final List<HealthCheckComponent> healthCheckFeComponents = Arrays.asList(HealthCheckComponent.ON_BOARDING);
 
        private class HealthCheckScheduledTask implements Runnable {
                @Override
@@ -191,9 +194,61 @@ public class HealthCheckService {
                String description = "OK";
                healthCheckWrapper.getComponentsInfo()
                                .add(new HealthCheckInfo(HealthCheckComponent.FE, HealthCheckStatus.UP, appVersion, description));
+
+               //add hosted components fe component
+               for (HealthCheckComponent component: healthCheckFeComponents) {
+                       List<HealthCheckInfo> feComponentsInfo = addHostedComponentsFeHealthCheck(component);
+                       HealthCheckInfo baseComponentHCInfo = healthCheckWrapper.getComponentsInfo().stream().filter(c -> c.getHealthCheckComponent() == component).findFirst().orElse(null);
+                       if (baseComponentHCInfo != null) {
+                               if (baseComponentHCInfo.getComponentsInfo() == null) {
+                                       baseComponentHCInfo.setComponentsInfo(new ArrayList<>());
+                               }
+                               baseComponentHCInfo.getComponentsInfo().addAll(feComponentsInfo);
+                       }
+               }
                return gson.toJson(healthCheckWrapper);
        }
 
+       private List<HealthCheckInfo> addHostedComponentsFeHealthCheck(HealthCheckComponent baseComponent) {
+               Configuration config = ((ConfigurationManager) context.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR))
+                               .getConfiguration();
+
+               String healthCheckUrl = null;
+               switch(baseComponent) {
+                       case ON_BOARDING:
+                               healthCheckUrl = buildOnboardingHealthCheckUrl(config);
+                               break;
+               }
+
+               String description;
+
+               if (healthCheckUrl != null) {
+                       Gson gson = new Gson();
+                       CloseableHttpClient httpClient = getHttpClient(config);
+                       HttpGet httpGet = new HttpGet(healthCheckUrl);
+                       CloseableHttpResponse beResponse;
+
+                       try {
+                               beResponse = httpClient.execute(httpGet);
+                               int beStatus = beResponse.getStatusLine().getStatusCode();
+                               if (beStatus == HttpStatus.SC_OK || beStatus == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
+                                       String beJsonResponse = EntityUtils.toString(beResponse.getEntity());
+                                       HealthCheckWrapper healthCheckWrapper = gson.fromJson(beJsonResponse, HealthCheckWrapper.class);
+                                       return healthCheckWrapper.getComponentsInfo();
+                               } else {
+                                       description = "Response code: " + beStatus;
+                               }
+                       } catch (Exception e) {
+                               log.error("Health Check error when trying to connect to " + baseComponent, e);
+                               description = e.getMessage();
+                       }
+               } else {
+                       description = "Incorrect Health Check Url";
+               }
+
+               return Arrays.asList(new HealthCheckInfo(HealthCheckComponent.FE, HealthCheckStatus.DOWN, null, description));
+       }
+
        private HealthCheckWrapper getBeDownCheckInfos() {
                List<HealthCheckInfo> healthCheckInfos = new ArrayList<HealthCheckInfo>();
                healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.FE, HealthCheckStatus.UP,
@@ -217,4 +272,16 @@ public class HealthCheckService {
                builder.setDefaultRequestConfig(requestBuilder.build());
                return builder.build();
        }
+
+       private String buildOnboardingHealthCheckUrl(Configuration config) {
+
+               Configuration.OnboardingConfig onboardingConfig = config.getOnboarding();
+
+               String protocol = onboardingConfig.getProtocol();
+               String host = onboardingConfig.getHost();
+               Integer port = onboardingConfig.getPort();
+               String uri = onboardingConfig.getHealthCheckUri();
+
+               return protocol + "://" + host + ":" + port + uri;
+       }
 }
index cd123ca..1eda94b 100644 (file)
@@ -26,6 +26,12 @@ requestTimeout: 10
 healthCheckSocketTimeoutInMs: 5000
 healthCheckIntervalInSeconds: 5
 
+onboarding:
+  protocol: http
+  host: localhost
+  port: 8181
+  healthCheckUri: "/onboarding/v1.0/healthcheck"
+
 identificationHeaderFields:
    -
         - &HTTP_IV_USER HTTP_IV_USER
index 6419759..7e21f82 100644 (file)
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-import {GraphColors} from "app/utils/constants";
+import { GraphColors, GraphUIObjects} from "app/utils/constants";
 import constant = require("lodash/constant");
 import {ImagesUrl} from "app/utils/constants";
 import {AngularJSBridge} from "app/services/angular-js-bridge-service";
@@ -61,11 +61,11 @@ export class ComponentInstanceNodesStyle {
                     'shape': 'rectangle',
                     'label': 'data(displayName)',
                     'background-image': 'data(img)',
-                    'width': 65,
-                    'height': 65,
+                    'width': GraphUIObjects.DEFAULT_RESOURCE_WIDTH,
+                    'height': GraphUIObjects.DEFAULT_RESOURCE_WIDTH,
                     'background-opacity': 0,
-                    "background-width": 65,
-                    "background-height": 65,
+                    "background-width": GraphUIObjects.DEFAULT_RESOURCE_WIDTH,
+                    "background-height": GraphUIObjects.DEFAULT_RESOURCE_WIDTH,
                     'text-valign': 'bottom',
                     'text-halign': 'center',
                     'background-fit': 'cover',
@@ -100,10 +100,10 @@ export class ComponentInstanceNodesStyle {
                     'shape': 'rectangle',
                     'label': 'data(displayName)',
                     'background-image': 'data(img)',
-                    'background-width': 21,
-                    'background-height': 21,
-                    'width': 21,
-                    'height': 21,
+                    'background-width': GraphUIObjects.SMALL_RESOURCE_WIDTH,
+                    'background-height': GraphUIObjects.SMALL_RESOURCE_WIDTH,
+                    'width': GraphUIObjects.SMALL_RESOURCE_WIDTH,
+                    'height': GraphUIObjects.SMALL_RESOURCE_WIDTH,
                     'text-valign': 'bottom',
                     'text-halign': 'center',
                     'background-opacity': 0,
@@ -118,10 +118,10 @@ export class ComponentInstanceNodesStyle {
                     'shape': 'rectangle',
                     'label': 'data(displayName)',
                     'background-image': 'data(img)',
-                    'background-width': 21,
-                    'background-height': 21,
-                    'width': 21,
-                    'height': 21,
+                    'background-width': GraphUIObjects.SMALL_RESOURCE_WIDTH,
+                    'background-height': GraphUIObjects.SMALL_RESOURCE_WIDTH,
+                    'width': GraphUIObjects.SMALL_RESOURCE_WIDTH,
+                    'height': GraphUIObjects.SMALL_RESOURCE_WIDTH,
                     'text-valign': 'bottom',
                     'text-halign': 'center',
                     'background-opacity': 0,
@@ -200,7 +200,7 @@ export class ComponentInstanceNodesStyle {
                 css: {
                     'shape': 'rectangle',
                     'background-image': (ele:Cy.Collection) => {
-                        return ele.data().initImage(ele)
+                        return ele.data().initUncertifiedImage(ele, GraphUIObjects.NODE_OVERLAP_MIN_SIZE)
                     },
                     "border-width": 0
                 }
index 9aa7941..8b3a59e 100644 (file)
@@ -158,7 +158,7 @@ export class CompositionGraph implements ng.IDirective {
             container: graphEl,
             style: ComponentInstanceNodesStyle.getCompositionGraphStyle(),
             zoomingEnabled: true,
-            maxZoom: 2.5,
+            maxZoom: 1.2,
             minZoom: .1,
             userZoomingEnabled: false,
             userPanningEnabled: true,
@@ -295,6 +295,10 @@ export class CompositionGraph implements ng.IDirective {
 
         //Zooms to fit all of the nodes in the collection passed in. If no nodes are passed in, will zoom to fit all nodes on graph
         scope.zoomAll = (nodes?:Cy.CollectionNodes) => {
+            if (!nodes || !nodes.length) {
+                nodes = this._cy.nodes();
+            }
+            
             scope.withSidebar = false;
             this._cy.animate({
                 fit: { eles: nodes, padding: 20 },
@@ -311,9 +315,7 @@ export class CompositionGraph implements ng.IDirective {
             }
         };
 
-        scope.highlightSearchMatches = (searchTerm: string) => {
-            if (searchTerm === undefined) return; //dont zoom & highlight if click on Search initially (searchTerm will be undefined). However, allow highlights to be cleared after subsequent search (searchTerm will be "")
-            
+        scope.highlightSearchMatches = (searchTerm: string) => {           
             this.NodesGraphUtils.highlightMatchingNodesByName(this._cy, searchTerm);
             let matchingNodes: Cy.CollectionNodes = this.NodesGraphUtils.getMatchingNodesByName(this._cy, searchTerm);
             scope.zoomAll(matchingNodes);
index 51a77d1..6d6291d 100644 (file)
@@ -31,7 +31,7 @@ export class ImageCreatorService {
         body.appendChild(this._canvas);
     }
 
-    getImageBase64(imageBaseUri:string, imageLayerUri:string):ng.IPromise<string> {
+    getImageBase64(imageBaseUri:string, imageLayerUri:string, nodeWidth:number, canvasWidth:number, handleSize:number):ng.IPromise<string> {
         let deferred = this.$q.defer();
         let imageBase = new Image();
         let imageLayer = new Image();
@@ -42,14 +42,15 @@ export class ImageCreatorService {
             if (imagesLoaded < 2) {
                 return;
             }
-            this._canvas.setAttribute('width', imageBase.width.toString());
-            this._canvas.setAttribute('height', imageBase.height.toString());
+            this._canvas.setAttribute('width', canvasWidth.toString());
+            this._canvas.setAttribute('height', canvasWidth.toString());
 
             let canvasCtx = this._canvas.getContext('2d');
             canvasCtx.clearRect(0, 0, this._canvas.width, this._canvas.height);
 
-            canvasCtx.drawImage(imageBase, 0, 0, imageBase.width, imageBase.height);
-            canvasCtx.drawImage(imageLayer, imageBase.width - imageLayer.width, 0, imageLayer.width, imageLayer.height);
+            //Note: params below are: image, x to start drawing at, y to start drawing at, num of x pixels to draw, num of y pixels to draw
+            canvasCtx.drawImage(imageBase, 0, canvasWidth - nodeWidth, nodeWidth, nodeWidth); //Draw the node: When nodeWidth == canvasWidth, we'll start at point 0,0. Otherwise, x starts at 0 (but will end before end of canvas) and y starts low enough that node img ends at bottom of canvas.
+            canvasCtx.drawImage(imageLayer, canvasWidth - handleSize, 0, handleSize, handleSize); //Draw the icon: icon should be drawn in top right corner
 
             let base64Image = this._canvas.toDataURL();
             deferred.resolve(base64Image);
index 153a182..fb43f46 100644 (file)
@@ -27,7 +27,8 @@ export abstract class CommonNodeBase {
 
     public displayName:string;
     public name:string;
-    public img:string;
+    public img: string;
+    public imgWidth: number;
     public certified:boolean;
     public isGroup:boolean;
     public imagesPath:string;
index 1e4a735..681cebc 100644 (file)
@@ -21,7 +21,7 @@
 import {ComponentInstance} from "../../../componentsInstances/componentInstance";
 import {CommonCINodeBase} from "../common-ci-node-base";
 import {ImageCreatorService} from "app/directives/graphs-v2/image-creator/image-creator.service";
-import {ImagesUrl} from "app/utils";
+import {ImagesUrl, GraphUIObjects} from "app/utils";
 import {AngularJSBridge} from "app/services";
 
 export interface ICompositionCiNodeBase {
@@ -51,13 +51,27 @@ export abstract class CompositionCiNodeBase extends CommonCINodeBase implements
 
     }
 
-    public initImage(node:Cy.Collection):string {
-
+    public initUncertifiedImage(node:Cy.Collection, nodeMinSize:number):string {
+        
+        let uncertifiedIconWidth:number = GraphUIObjects.HANDLE_SIZE;
+        let nodeWidth:number = node.data('imgWidth') || node.width();
+        let uncertifiedCanvasWidth: number = nodeWidth;
+        
+        if (nodeWidth < nodeMinSize) { //uncertified icon will overlap too much of the node, need to expand canvas.
+            uncertifiedCanvasWidth = nodeWidth + uncertifiedIconWidth/2; //expand canvas so that only half of the icon overlaps with the node
+        }
+        
         this.imageCreator.getImageBase64(this.imagesPath + ImagesUrl.RESOURCE_ICONS + this.componentInstance.icon + '.png',
-            this.imagesPath + ImagesUrl.RESOURCE_ICONS + 'uncertified.png')
+            this.imagesPath + ImagesUrl.RESOURCE_ICONS + 'uncertified.png', nodeWidth, uncertifiedCanvasWidth, uncertifiedIconWidth) 
             .then(imageBase64 => {
                 this.img = imageBase64;
-                node.style({'background-image': this.img});
+                node.style({
+                    'background-image': this.img,
+                    'background-width': uncertifiedCanvasWidth,
+                    'background-height': uncertifiedCanvasWidth,
+                    'width': uncertifiedCanvasWidth,
+                    'height': uncertifiedCanvasWidth
+                });
             });
 
         return this.img;
index 85534c7..cded0ea 100644 (file)
@@ -22,7 +22,7 @@ import {CompositionCiNodeBase} from "./composition-ci-node-base";
 import {ComponentInstance} from "../../../componentsInstances/componentInstance";
 import {ImageCreatorService} from "../../../../directives/graphs-v2/image-creator/image-creator.service";
 import {AngularJSBridge} from "../../../../services/angular-js-bridge-service";
-import {ImagesUrl} from "../../../../utils/constants";
+import { ImagesUrl, GraphUIObjects} from "../../../../utils/constants";
 
 export class CompositionCiNodeCp extends CompositionCiNodeBase {
 
@@ -35,6 +35,7 @@ export class CompositionCiNodeCp extends CompositionCiNodeBase {
     private initCp():void {
         let sdcConfig = AngularJSBridge.getAngularConfig();
         this.img = sdcConfig.imagesPath + ImagesUrl.RESOURCE_ICONS + this.componentInstance.icon + '.png';
+        this.imgWidth = GraphUIObjects.SMALL_RESOURCE_WIDTH;
         this.type = "basic-small-node";
         //if the cp from type cpEndPointInstances create with another template
         if (sdcConfig.cpEndPointInstances.indexOf(this.componentInstance.icon) > -1) {
index 3a9b845..81ee61a 100644 (file)
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-import {ImagesUrl} from "../../../../utils/constants";
+import { ImagesUrl, GraphUIObjects} from "../../../../utils/constants";
 import {ComponentInstance, CompositionCiNodeBase} from "../../../../models";
 import {ImageCreatorService} from "../../../../directives/graphs-v2/image-creator/image-creator.service";
 export class CompositionCiNodeService extends CompositionCiNodeBase {
@@ -32,6 +32,7 @@ export class CompositionCiNodeService extends CompositionCiNodeBase {
     private initService():void {
 
         this.img = this.imagesPath + ImagesUrl.SERVICE_ICONS + this.componentInstance.icon + '.png';
+        this.imgWidth = GraphUIObjects.DEFAULT_RESOURCE_WIDTH;
         this.classes = 'service-node'
         if (!this.certified) {
             this.classes = this.classes + ' not-certified';
index 5d37db3..005804c 100644 (file)
@@ -20,7 +20,7 @@
 import {CompositionCiNodeBase} from "./composition-ci-node-base";
 import {ComponentInstance} from "../../../componentsInstances/componentInstance";
 import {ImageCreatorService} from "../../../../directives/graphs-v2/image-creator/image-creator.service";
-import {ImagesUrl} from "../../../../utils/constants";
+import { ImagesUrl, GraphUIObjects} from "../../../../utils/constants";
 
 export class CompositionCiNodeVf extends CompositionCiNodeBase {
 
@@ -32,6 +32,7 @@ export class CompositionCiNodeVf extends CompositionCiNodeBase {
 
     private initVf():void {
         this.img = this.imagesPath + ImagesUrl.RESOURCE_ICONS + this.componentInstance.icon + '.png';
+        this.imgWidth = GraphUIObjects.DEFAULT_RESOURCE_WIDTH;
         this.classes = 'vf-node';
         if (!this.certified) {
             this.classes = this.classes + ' not-certified';
index db46e48..bf52ec0 100644 (file)
@@ -20,7 +20,7 @@
 import {ComponentInstance} from "../../../componentsInstances/componentInstance";
 import {ImageCreatorService} from "../../../../directives/graphs-v2/image-creator/image-creator.service";
 import {CompositionCiNodeBase} from "./composition-ci-node-base";
-import {ImagesUrl} from "../../../../utils/constants";
+import { ImagesUrl, GraphUIObjects} from "../../../../utils/constants";
 
 export class CompositionCiNodeVl extends CompositionCiNodeBase {
     private toolTipText:string;
@@ -47,6 +47,7 @@ export class CompositionCiNodeVl extends CompositionCiNodeBase {
             }
         }
         this.img = this.imagesPath + ImagesUrl.RESOURCE_ICONS + 'vl.png';
+        this.imgWidth = GraphUIObjects.SMALL_RESOURCE_WIDTH;
 
         this.classes = 'vl-node';
         if (!this.certified) {
index 2835d20..08bdf20 100644 (file)
@@ -15,7 +15,9 @@ export class SearchBarComponent {
     @Output() searchButtonClicked: EventEmitter<string> = new EventEmitter<string>();
 
     searchButtonClick = (): void => {
-        this.searchButtonClicked.emit(this.searchQuery);
+        if (this.searchQuery) { //do not allow empty search
+            this.searchButtonClicked.emit(this.searchQuery);
+        }
     }
 
     searchQueryChange = ($event): void => {
@@ -24,7 +26,7 @@ export class SearchBarComponent {
 
     private clearSearchQuery = (): void => {
         this.searchQuery = "";
-        this.searchButtonClick();
+        this.searchButtonClicked.emit(this.searchQuery);
     }
 }
 
index d239019..ffdf6fd 100644 (file)
@@ -188,6 +188,10 @@ export class GraphTransactionLogText {
 }
 
 export class GraphUIObjects {
+    public static HANDLE_SIZE = 18; 
+    public static NODE_OVERLAP_MIN_SIZE = 30; 
+    public static DEFAULT_RESOURCE_WIDTH = 65;
+    public static SMALL_RESOURCE_WIDTH = 21;
     public static LINK_MENU_HEIGHT = 420;
     public static TOP_HEADER_HEIGHT = 200;
     public static TOOLTIP_OFFSET_X = 50;
index 9be07f2..5731019 100644 (file)
 
             this._resizeCanvas();
 
-            this._arrowEnd = this._cy.add({
-                group: "nodes",
-                data: {
-                    "id": this.ARROW_END_ID,
-                    "position": {x: 150, y: 150}
-                }
-            });
 
-            this._arrowEnd.css({
-                "opacity": 0,
-                'width': 0.0001,
-                'height': 0.0001
-            });
 
         },
         registerHandle: function (handle) {
         _drawHandle: function (handle, target) {
 
             var position = this._getHandlePosition(handle, target);
-            var handleSize = target.renderedWidth() / 4;
+            var handleSize = this.HANDLE_SIZE * this._cy.zoom();
             
             this._ctx.beginPath();
 
             if (this._hover) {
                 toNode = this._hover;
             } else {
+                if (!this._arrowEnd) {
+                    this._arrowEnd = this._cy.add({
+                        group: "nodes",
+                        data: {
+                            "id": this.ARROW_END_ID,
+                            "position": { x: 150, y: 150 }
+                        }
+                    });
+
+                    this._arrowEnd.css({
+                        "opacity": 0,
+                        'width': 0.0001,
+                        'height': 0.0001
+                    });                   
+                }
+
                 this._arrowEnd.renderedPosition(toPosition);
                 toNode = this._arrowEnd;
             }
                 this._edge.remove();
                 this._edge = null;
             }
+
+            if (this._arrowEnd) {
+                this._arrowEnd.remove();
+                this._arrowEnd = null;
+            }
         },
         _resizeCanvas: function () {
             this._$canvas
                 }
             }
         },
-        _getHandlePosition: function (handle, target) {
+        _getHandlePosition: function (handle, target) { //returns the upper left point at which to begin drawing the handle
             var position = target.renderedPosition();
             var width = target.renderedWidth();
             var height = target.renderedHeight();
+            var renderedHandleSize = this.HANDLE_SIZE * this._cy.zoom(); //actual number of pixels that handle will use.
             var xpos = null;
             var ypos = null;
 
             switch (handle.positionX) {
                 case "left":
-                    xpos = position.x - width / 4;
+                    xpos = position.x - width / 2;
                     break;
-                case "right":
-                    xpos = position.x + width / 4;
+                case "right": //position.x is the exact center of the node. Need to add half the width to get to the right edge. Then, subtract renderedHandleSize to get handle position
+                    xpos = position.x + width / 2 - renderedHandleSize;
                     break;
                 case "center":
                     xpos = position.x;
 
             switch (handle.positionY) {
                 case "top":
-                    ypos = position.y - width / 2;
+                    ypos = position.y - height / 2;
                     break;
                 case "center":
                     ypos = position.y;
                     break;
                 case "bottom":
-                    ypos = position.y + width / 2;
+                    ypos = position.y + height / 2;
                     break;
             }
 
-            var offsetX =  0;
-            var offsetY =  0;
-            return {x: xpos + offsetX, y: ypos + offsetY};
+            //Determine if handle will be too big and require offset to prevent it from covering too much of the node icon (in which case, move it over by 1/2 the renderedHandleSize, so half the handle overlaps).
+            //Need to use target.width(), which is the size of the node, unrelated to rendered size/zoom
+            var offsetX = (target.width() < 30) ? renderedHandleSize / 2 : 0; 
+            var offsetY = (target.height() < 30) ? renderedHandleSize /2 : 0;
+            return {x: xpos + offsetX, y: ypos - offsetY};
         },
         _getEdgeCSSByHandle: function (handle) {
             var color = handle.lineColor ? handle.lineColor : handle.color;
index a8420a4..536ec7a 100644 (file)
@@ -59,6 +59,8 @@ public class Configuration extends BasicConfiguration {
 
        private String onboardingForwardContext;
 
+       private OnboardingConfig onboarding;
+
        public String getKibanaProtocol() {
                return kibanaProtocol;
        }
@@ -299,6 +301,54 @@ public class Configuration extends BasicConfiguration {
                this.onboardingForwardContext = onboardingForwardContext;
        }
 
+       public OnboardingConfig getOnboarding() {
+               return onboarding;
+       }
+
+       public void setOnboarding(OnboardingConfig onboarding) {
+               this.onboarding = onboarding;
+       }
+
+       public static class OnboardingConfig {
+
+               String protocol = "http";
+               String host;
+               Integer port;
+               String healthCheckUri;
+
+               public String getProtocol() {
+                       return protocol;
+               }
+
+               public void setProtocol(String protocol) {
+                       this.protocol = protocol;
+               }
+
+               public String getHost() {
+                       return host;
+               }
+
+               public void setHost(String host) {
+                       this.host = host;
+               }
+
+               public Integer getPort() {
+                       return port;
+               }
+
+               public void setPort(Integer port) {
+                       this.port = port;
+               }
+
+               public String getHealthCheckUri() {
+                       return healthCheckUri;
+               }
+
+               public void setHealthCheckUri(String healthCheckUri) {
+                       this.healthCheckUri = healthCheckUri;
+               }
+       }
+
        @Override
        public String toString() {
                return new StringBuilder().append(format("backend host: %s%n", beHost))
diff --git a/pom.xml b/pom.xml
index 6941b6e..c1f9184 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
                <!-- ==================== -->
                <!-- Generic properties -->
                <!-- ==================== -->
-               <build.type></build.type>
+               <build.type>-SNAPSHOT</build.type>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <sprint.number>74</sprint.number>
 
index 3a39d25..6eaac4a 100644 (file)
@@ -9,6 +9,7 @@ ENV HTTPS_PROXY ${HTTPS_PROXY}
 RUN if [ ! -z ${HTTP_PROXY} ]; then echo "Acquire::http::proxy  \"${HTTP_PROXY}\";" >> /etc/apt/apt.conf; fi && \
     if [ ! -z ${HTTPS_PROXY} ]; then echo "Acquire::https::proxy \"${HTTPS_PROXY}\";" >> /etc/apt/apt.conf; fi 
 
+
 RUN apt-get -y update
 RUN apt-get -y install apt-utils
 RUN apt-get -y install curl
index f864bb9..c6fc36c 100644 (file)
@@ -26,6 +26,12 @@ healthCheckSocketTimeoutInMs: 5000
 
 healthCheckIntervalInSeconds: 5
 
+onboarding:
+  protocol: http
+  host: localhost
+  port: 8181
+  healthCheckUri: "/onboarding/v1.0/healthcheck"
+
 identificationHeaderFields: 
    -
         - &HTTP_IV_USER HTTP_IV_USER
@@ -70,7 +76,7 @@ protocols:
 
 
 systemMonitoring:
-    enabled: true
+    enabled: false
     isProxy: true
     probeIntervalInSeconds: 15
 
index c5421a1..9dd8291 100644 (file)
@@ -24,5 +24,4 @@ RUN curl -L https://omnitruck.chef.io/install.sh | bash
 
 COPY startup.sh /root/
 RUN chmod 770 /root/startup.sh
-
 ENTRYPOINT [ "/root/startup.sh" ]