diff options
Diffstat (limited to 'csarvalidation')
55 files changed, 611 insertions, 3041 deletions
diff --git a/csarvalidation/README.md b/csarvalidation/README.md index d940d1d..65c12fb 100644 --- a/csarvalidation/README.md +++ b/csarvalidation/README.md @@ -77,7 +77,14 @@ How to configure vnfreqs.properties How to run CSAR validation -------------------------- -Follow the setups given below to run as csar-validate command +Follow the setups given below to run as csar-validate command. + +<u><b>Warning !!!</b> +Be default, during project building, documentation generation is being disabled +(see point "Documentation generation" for more details).</u> +In order to enable this process, add parameter `-DskipDocsGeneration=false` to mvn command, example: +`mvn clean package -DskipDocsGeneration=false` + 1. Install OCLIP (`wget -O - https://raw.githubusercontent.com/onap/cli/master/deployment/zip/installer/install-latest.sh | sh`) @@ -85,6 +92,13 @@ Follow the setups given below to run as csar-validate command 3. Run `oclip --product onap-vtp csar-validate --csar <CSAR path>` +Documentation generation +-------------------------- +During project build, automated generation of tables, containing supported rules, is being performed. +Created tables are being saved in target directory, `target/generated-docs/{current_release}`. +This generation is being performed by `exec-maven-plugin`, defined in pom.xml. +In order to generate tables <b>python3 and pip3 are required</b>. + Contact ------- -Kanagaraj.Manickam@huawei.com
\ No newline at end of file +Kanagaraj.Manickam@huawei.com diff --git a/csarvalidation/pom.xml b/csarvalidation/pom.xml index 729c82d..13b4245 100644 --- a/csarvalidation/pom.xml +++ b/csarvalidation/pom.xml @@ -14,7 +14,7 @@ <parent> <groupId>org.onap.vnfsdk.validation</groupId> <artifactId>validation</artifactId> - <version>1.2.15-SNAPSHOT</version> + <version>1.2.16-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>validation-csar</artifactId> @@ -50,6 +50,8 @@ <maven-war-plugin.version>2.6</maven-war-plugin.version> <maven-dependency-plugin.version>3.0.0</maven-dependency-plugin.version> <mockito-core.version>3.5.0</mockito-core.version> + <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> + <skipDocsGeneration>true</skipDocsGeneration> </properties> <dependencies> @@ -106,6 +108,11 @@ </exclusions> </dependency> <dependency> + <groupId>org.onap.vnfsdk.validation</groupId> + <artifactId>validation-pmdictionary</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.14</version> @@ -160,8 +167,72 @@ <build> <finalName>${project.artifactId}-${project.version}</finalName> - <plugins> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>${exec-maven-plugin.version}</version> + <executions> + <execution> + <configuration> + <skip>${skipDocsGeneration}</skip> + <executable>pip3</executable> + <workingDirectory>./python</workingDirectory> + <arguments> + <argument>install</argument> + <argument>-r</argument> + <argument>./requirements.txt</argument> + </arguments> + </configuration> + <id>python-requirements</id> + <phase>initialize</phase> + <goals> + <goal>exec</goal> + </goals> + </execution> + <execution> + <configuration> + <skip>${skipDocsGeneration}</skip> + <executable>python3</executable> + <workingDirectory>./python/</workingDirectory> + <environmentVariables> + <PYTHONPATH>./main</PYTHONPATH> + </environmentVariables> + <arguments> + <argument>-m</argument> + <argument>unittest</argument> + <argument>discover</argument> + <argument>./test</argument> + </arguments> + </configuration> + <id>python-test</id> + <phase>test</phase> + <goals> + <goal>exec</goal> + </goals> + </execution> + <execution> + <configuration> + <skip>${skipDocsGeneration}</skip> + <executable>python3</executable> + <workingDirectory>./python/main</workingDirectory> + <arguments> + <argument>generate_active_validation_rules_table.py</argument> + </arguments> + <environmentVariables> + <OUTPUT_DIRECTORY>${project.build.directory}/generated-docs/${onap.release}/</OUTPUT_DIRECTORY> + </environmentVariables> + </configuration> + <id>python_build</id> + <phase>generate-resources</phase> + <goals> + <goal>exec</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> diff --git a/csarvalidation/python/main/generate_active_validation_rules_table.py b/csarvalidation/python/main/generate_active_validation_rules_table.py new file mode 100755 index 0000000..8367e44 --- /dev/null +++ b/csarvalidation/python/main/generate_active_validation_rules_table.py @@ -0,0 +1,65 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +import os + +from validation.FileManager import FileManager +from validation.rules.ActiveRulesTableGenerator import ActiveRulesTableGenerator + +from validation.rules.providers.ActiveRulesProvider import ActiveRulesProvider +from validation.rules.providers.RulesDescriptionsProvider import RulesDescriptionsProvider + +RESOURCES_DIRECTORY = '../../src/main/resources/' +RULE_DESCRIPTION_SOL001_PATH = RESOURCES_DIRECTORY + 'open-cli-schema/sol001/' +RULE_DESCRIPTION_SOL004_PATH = RESOURCES_DIRECTORY + 'open-cli-schema/sol004/' +VNFREWS_PROPERTIES_PATH = RESOURCES_DIRECTORY + 'vnfreqs.properties' +RULE_DESCRIPTION_FILE_NAME_PATTERN = 'vtp-validate-csar-%s.yaml' + +DEFAULT_OUTPUT_DIRECTORY = RESOURCES_DIRECTORY + 'generated/active-validation-rules/' + +VNF_REQS_TAG = "vnfreqs" +PNF_REQS_TAG = "pnfreqs" + +def main(): + output_directory = get_output_directory() + table_with_vnf_rules = output_directory + 'VnfActiveRulesTable.csv' + table_with_pnf_rules = output_directory + 'PnfActiveRulesTable.csv' + requs_tags = [VNF_REQS_TAG, PNF_REQS_TAG] + + tables = ActiveRulesTableGenerator( + [ + RulesDescriptionsProvider(RULE_DESCRIPTION_SOL001_PATH, RULE_DESCRIPTION_FILE_NAME_PATTERN), + RulesDescriptionsProvider(RULE_DESCRIPTION_SOL004_PATH, RULE_DESCRIPTION_FILE_NAME_PATTERN) + ], + ActiveRulesProvider(VNFREWS_PROPERTIES_PATH) + ).generate_active_validation_rule_tables(requs_tags) + file_manager = FileManager(output_directory) + file_manager.save_rule_table(tables[0].get_table_in_csv_format(), table_with_vnf_rules) + file_manager.save_rule_table(tables[1].get_table_in_csv_format(), table_with_pnf_rules) + + +def get_output_directory(): + if 'OUTPUT_DIRECTORY' in os.environ: + output_directory = os.getenv('OUTPUT_DIRECTORY') + else: + output_directory = DEFAULT_OUTPUT_DIRECTORY + return output_directory + + +if __name__ == '__main__': + main() diff --git a/csarvalidation/python/main/validation/FileManager.py b/csarvalidation/python/main/validation/FileManager.py new file mode 100644 index 0000000..2cdaab5 --- /dev/null +++ b/csarvalidation/python/main/validation/FileManager.py @@ -0,0 +1,37 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +import os + + +class FileManager: + + def __init__(self, output_directory: str): + self._output_directory = output_directory + + def save_rule_table(self, csv_table: str, table_name: str): + self._create_output_directory() + self._write_rules_to_file(csv_table, table_name) + + def _create_output_directory(self): + if not os.path.isdir(self._output_directory): + os.makedirs(self._output_directory) + + def _write_rules_to_file(self, csv_table: str, file_name: str): + with open(file_name, 'w') as vnf_rules_file: + vnf_rules_file.write(csv_table) diff --git a/csarvalidation/python/main/validation/__init__.py b/csarvalidation/python/main/validation/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/csarvalidation/python/main/validation/__init__.py diff --git a/csarvalidation/python/main/validation/rules/ActiveRulesTableGenerator.py b/csarvalidation/python/main/validation/rules/ActiveRulesTableGenerator.py new file mode 100644 index 0000000..c8a0f37 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/ActiveRulesTableGenerator.py @@ -0,0 +1,70 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +from validation.rules.providers.ActiveRulesProvider import ActiveRulesProvider + +from validation.rules.table.ActiveRuleEntity import ActiveRuleEntity +from validation.rules.table.ActiveRulesTable import ActiveRulesTable + + +class ActiveRulesTableGenerator: + + def __init__(self, + rules_descriptions_providers: list, + active_rules_provider: ActiveRulesProvider + ): + self._rules_descriptions = rules_descriptions_providers + self._active_rules = active_rules_provider + + def generate_active_validation_rule_tables(self, reqs_tags: list) -> list: + tables = [] + for reqs_tag in reqs_tags: + tables.append( + self._create_rules_table(reqs_tag) + ) + return tables + + def _create_rules_table(self, reqs_tag: str) -> ActiveRulesTable: + active_rules_table = ActiveRulesTable() + active_rules = self._active_rules.get_active_rules(reqs_tag) + for rule in active_rules: + yaml_description = self._get_rule_description(rule) + active_rules_table.add_entity( + ActiveRuleEntity( + rule, + self._get_description_from_yaml(yaml_description), + self._get_product_from_yaml(yaml_description) + ) + ) + return active_rules_table + + def _get_rule_description(self, rule: str) -> dict: + yaml_description = "" + for rules_description in self._rules_descriptions: + if rules_description.contains_rule(rule): + yaml_description = rules_description.get_rule_description(rule) + break + return yaml_description + + @staticmethod + def _get_description_from_yaml(yaml_file: dict) -> str: + return yaml_file['description'].replace("\n", " ") + + @staticmethod + def _get_product_from_yaml(yaml_file: dict) -> str: + return yaml_file['info']['product'] diff --git a/csarvalidation/python/main/validation/rules/__init__.py b/csarvalidation/python/main/validation/rules/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/__init__.py diff --git a/csarvalidation/python/main/validation/rules/providers/ActiveRulesProvider.py b/csarvalidation/python/main/validation/rules/providers/ActiveRulesProvider.py new file mode 100644 index 0000000..1d601f2 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/providers/ActiveRulesProvider.py @@ -0,0 +1,43 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +class ActiveRulesProvider: + + def __init__(self, properties_file_path: str, rules_separator: str = ",", key_value_separator: str = "="): + self.properties_file_path = properties_file_path + self._rules_separator = rules_separator + self._key_value_separator = key_value_separator + + def get_active_rules(self, reqs: str) -> list: + active_rules = [] + for line in self._load_file_by_lines(): + if line.startswith(reqs): + active_rules = self._split_properties_line(line, self._rules_separator, self._key_value_separator) + break + return active_rules + + def _load_file_by_lines(self) -> list: + with open(self.properties_file_path, 'r') as properties_file: + lines = properties_file.read().splitlines() + return lines + + @staticmethod + def _split_properties_line(line: str, splitter: str, key_value_separator: str) -> list: + key_value_separation_index = line.index(key_value_separator) + 1 + value = line[key_value_separation_index:] + return value.split(splitter) diff --git a/csarvalidation/python/main/validation/rules/providers/RulesDescriptionsProvider.py b/csarvalidation/python/main/validation/rules/providers/RulesDescriptionsProvider.py new file mode 100644 index 0000000..a34bbe3 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/providers/RulesDescriptionsProvider.py @@ -0,0 +1,40 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +import os +import yaml + + +class RulesDescriptionsProvider: + + def __init__(self, directory_containing_rules: str, rule_description_file_name_pattern: str): + self._directory_containing_rules = directory_containing_rules + self._rule_description_file_name_pattern = rule_description_file_name_pattern + + def contains_rule(self, rule: str) -> bool: + description_file_name = self._rule_description_file_name_pattern % rule + return os.path.isfile(self._directory_containing_rules + description_file_name) + + def get_rule_description(self, rule: str) -> str: + description_file_name = self._rule_description_file_name_pattern % rule + return self._get_yaml_description(description_file_name) + + def _get_yaml_description(self, yaml_file: str) -> str: + with open(self._directory_containing_rules + yaml_file, 'r') as description_file: + description_yaml = yaml.load(description_file, Loader=yaml.FullLoader) + return description_yaml diff --git a/csarvalidation/python/main/validation/rules/providers/__init__.py b/csarvalidation/python/main/validation/rules/providers/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/providers/__init__.py diff --git a/csarvalidation/python/main/validation/rules/table/ActiveRuleEntity.py b/csarvalidation/python/main/validation/rules/table/ActiveRuleEntity.py new file mode 100644 index 0000000..ed8c7d5 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/table/ActiveRuleEntity.py @@ -0,0 +1,24 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +class ActiveRuleEntity: + + def __init__(self, rule, description, product): + self.rule = rule + self.description = description + self.product = product diff --git a/csarvalidation/python/main/validation/rules/table/ActiveRulesTable.py b/csarvalidation/python/main/validation/rules/table/ActiveRulesTable.py new file mode 100644 index 0000000..70bb10d --- /dev/null +++ b/csarvalidation/python/main/validation/rules/table/ActiveRulesTable.py @@ -0,0 +1,37 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +from validation.rules.table.ActiveRuleEntity import ActiveRuleEntity + + +class ActiveRulesTable: + + def __init__(self): + self._active_rules_entities = [] + + def add_entity(self, active_rule_entity: ActiveRuleEntity): + self._active_rules_entities.append(active_rule_entity) + + def get_table_in_csv_format(self, values_separator=";", entity_separator="\n") -> str: + csv_table = "" + for entity in self._active_rules_entities: + csv_table += \ + entity.product + values_separator + \ + entity.rule + values_separator + \ + entity.description + entity_separator + return csv_table diff --git a/csarvalidation/python/main/validation/rules/table/__init__.py b/csarvalidation/python/main/validation/rules/table/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/csarvalidation/python/main/validation/rules/table/__init__.py diff --git a/csarvalidation/python/requirements.txt b/csarvalidation/python/requirements.txt new file mode 100644 index 0000000..7a997b5 --- /dev/null +++ b/csarvalidation/python/requirements.txt @@ -0,0 +1 @@ +PyYAML==5.3.1 diff --git a/csarvalidation/python/setup.py b/csarvalidation/python/setup.py new file mode 100644 index 0000000..060d45c --- /dev/null +++ b/csarvalidation/python/setup.py @@ -0,0 +1,30 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +from setuptools import setup + +with open('requirements.txt') as f: + required = f.read().splitlines() + +setup( + name='Active rules table generator', + version='1.0', + description='This project allow generation of tables containing rules that are active for given vnfsdk/validation release.', + packages=['main.validation'], + install_requires=required +) diff --git a/csarvalidation/python/test/__init__.py b/csarvalidation/python/test/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/csarvalidation/python/test/__init__.py diff --git a/csarvalidation/python/test/test_ActiveRulesTableGenerator.py b/csarvalidation/python/test/test_ActiveRulesTableGenerator.py new file mode 100644 index 0000000..3103a23 --- /dev/null +++ b/csarvalidation/python/test/test_ActiveRulesTableGenerator.py @@ -0,0 +1,78 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +import unittest + +from validation.rules.ActiveRulesTableGenerator import ActiveRulesTableGenerator +from validation.rules.providers.ActiveRulesProvider import ActiveRulesProvider +from validation.rules.providers.RulesDescriptionsProvider import RulesDescriptionsProvider + +RESOURCES_DIRECTORY = '../src/main/resources/' +RULE_DESCRIPTION_SOL001_PATH = RESOURCES_DIRECTORY + 'open-cli-schema/sol001/' +RULE_DESCRIPTION_SOL004_PATH = RESOURCES_DIRECTORY + 'open-cli-schema/sol004/' +VNFREWS_PROPERTIES_PATH = RESOURCES_DIRECTORY + 'vnfreqs.properties' +RULE_DESCRIPTION_FILE_NAME_PATTERN = 'vtp-validate-csar-%s.yaml' + +CSV_DELIMITER = ";" + +VNF_REQS_TAG = "vnfreqs" +PNF_REQS_TAG = "pnfreqs" + + +class ActiveRulesTableGeneratorTest(unittest.TestCase): + + @staticmethod + def generate_tables_with_active_rules(requs_tags: list) -> list: + return ActiveRulesTableGenerator( + [ + RulesDescriptionsProvider(RULE_DESCRIPTION_SOL001_PATH, RULE_DESCRIPTION_FILE_NAME_PATTERN), + RulesDescriptionsProvider(RULE_DESCRIPTION_SOL004_PATH, RULE_DESCRIPTION_FILE_NAME_PATTERN) + ], + ActiveRulesProvider(VNFREWS_PROPERTIES_PATH) + ).generate_active_validation_rule_tables(requs_tags) + + def test_generate_table_with_active_pnf_rules(self): + tables = self.generate_tables_with_active_rules([PNF_REQS_TAG]) + + self.assertTrue(len(tables) == 1) + self.validate_csv_table_with_rules(tables[0].get_table_in_csv_format()) + + def test_generate_table_with_active_vnf_rules(self): + tables = self.generate_tables_with_active_rules([VNF_REQS_TAG]) + + self.assertTrue(len(tables) == 1) + self.validate_csv_table_with_rules(tables[0].get_table_in_csv_format()) + + def test_generate_tables_with_active_vnf_and_pnf_rules(self): + tables = self.generate_tables_with_active_rules([PNF_REQS_TAG, VNF_REQS_TAG]) + + self.assertTrue(len(tables) == 2) + self.validate_csv_table_with_rules(tables[0].get_table_in_csv_format(values_separator=CSV_DELIMITER)) + self.validate_csv_table_with_rules(tables[1].get_table_in_csv_format(values_separator=CSV_DELIMITER)) + + def validate_csv_table_with_rules(self, vnf_rules: str): + lines = vnf_rules.splitlines() + for line in lines: + values = line.split(CSV_DELIMITER) + self.assertTrue(len(values) == 3) + self.assertTrue(values[0].startswith("onap-")) + self.assertTrue(values[1].startswith("r")) + + +if __name__ == '__main__': + unittest.main() diff --git a/csarvalidation/python/test/test_FileManager.py b/csarvalidation/python/test/test_FileManager.py new file mode 100644 index 0000000..722d1a9 --- /dev/null +++ b/csarvalidation/python/test/test_FileManager.py @@ -0,0 +1,95 @@ +# ============LICENSE_START==================================== +# vnfsdk-validation +# ========================================================= +# Copyright (C) 2020 Nokia. 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===================================== + +import os +import shutil +import unittest + +from validation.FileManager import FileManager +from validation.rules.ActiveRulesTableGenerator import ActiveRulesTableGenerator +from validation.rules.providers.ActiveRulesProvider import ActiveRulesProvider +from validation.rules.providers.RulesDescriptionsProvider import RulesDescriptionsProvider + +RESOURCES_DIRECTORY = '../src/main/resources/' +RULE_DESCRIPTION_SOL001_PATH = RESOURCES_DIRECTORY + 'open-cli-schema/sol001/' +RULE_DESCRIPTION_SOL004_PATH = RESOURCES_DIRECTORY + 'open-cli-schema/sol004/' +VNFREWS_PROPERTIES_PATH = RESOURCES_DIRECTORY + 'vnfreqs.properties' +RULE_DESCRIPTION_FILE_NAME_PATTERN = 'vtp-validate-csar-%s.yaml' + +CSV_DELIMITER = ";" + +VNF_REQS_TAG = "vnfreqs" +PNF_REQS_TAG = "pnfreqs" + +OUTPUT_DIRECTORY = './active_rules_table_generator_test/' + +TABLE_WITH_VNF_RULES = OUTPUT_DIRECTORY + 'VnfActiveRulesTable.csv' +TABLE_WITH_PNF_RULES = OUTPUT_DIRECTORY + 'PnfActiveRulesTable.csv' + + +class FileManagerTest(unittest.TestCase): + + + @staticmethod + def generate_tables_with_active_rules(requs_tags: list) -> list: + return ActiveRulesTableGenerator( + [ + RulesDescriptionsProvider(RULE_DESCRIPTION_SOL001_PATH, RULE_DESCRIPTION_FILE_NAME_PATTERN), + RulesDescriptionsProvider(RULE_DESCRIPTION_SOL004_PATH, RULE_DESCRIPTION_FILE_NAME_PATTERN) + ], + ActiveRulesProvider(VNFREWS_PROPERTIES_PATH) + ).generate_active_validation_rule_tables(requs_tags) + + def generate_and_save_tables(self): + tables = self.generate_tables_with_active_rules([VNF_REQS_TAG, PNF_REQS_TAG]) + file_manager = FileManager(OUTPUT_DIRECTORY) + file_manager.save_rule_table( + tables[0].get_table_in_csv_format(values_separator=CSV_DELIMITER), + TABLE_WITH_VNF_RULES + ) + file_manager.save_rule_table( + tables[1].get_table_in_csv_format(values_separator=CSV_DELIMITER), + TABLE_WITH_PNF_RULES + ) + + def tearDown(self): + shutil.rmtree(OUTPUT_DIRECTORY) + + def test_generate_and_save_table_with_active_rules(self): + self.generate_and_save_tables() + self.assertTrue(os.path.isdir(OUTPUT_DIRECTORY)) + + self.assertTrue(os.path.isfile(TABLE_WITH_VNF_RULES)) + with open(TABLE_WITH_VNF_RULES, 'r') as vnf_rules: + self.validate_csv_table_with_rules(vnf_rules) + + self.assertTrue(os.path.isfile(TABLE_WITH_PNF_RULES)) + with open(TABLE_WITH_PNF_RULES, 'r') as pnf_rules: + self.validate_csv_table_with_rules(pnf_rules) + + def validate_csv_table_with_rules(self, vnf_rules): + lines = vnf_rules.read().splitlines() + for line in lines: + values = line.split(CSV_DELIMITER) + self.assertTrue(len(values) == 3) + self.assertTrue(values[0].startswith("onap-")) + self.assertTrue(values[1].startswith("r")) + + +if __name__ == '__main__': + unittest.main() diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR816745.java b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR816745.java index b43dbba..ec0b46f 100644 --- a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR816745.java +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR816745.java @@ -19,7 +19,7 @@ package org.onap.cvc.csar.cc.sol004; import org.onap.cli.fw.schema.OnapCommandSchema; import org.onap.cvc.csar.CSARArchive; import org.onap.cvc.csar.cc.VTPValidateCSARBase; -import org.onap.validation.yaml.YamlFileValidator; +import org.onap.validation.yaml.YamlContentValidator; import org.onap.validation.yaml.error.YamlDocumentValidationError; import org.onap.validation.yaml.exception.YamlProcessingException; import org.slf4j.Logger; @@ -97,7 +97,7 @@ public class VTPValidateCSARR816745 extends VTPValidateCSARBase { private void validateYamlFile(String rootPath, String artifactPath) { try { List<YamlDocumentValidationError> validationErrors = - new YamlFileValidator().validateYamlFileWithSchema(rootPath+artifactPath); + new YamlContentValidator().validate(rootPath+artifactPath); addAllErrorsReportedByVaidator(artifactPath, validationErrors); } catch (YamlProcessingException | YAMLException e) { LOGGER.error("Failed to load PM_Dictionary file.", e); diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/YamlFileValidator.java b/csarvalidation/src/main/java/org/onap/validation/yaml/YamlFileValidator.java deleted file mode 100644 index 2de4f48..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/YamlFileValidator.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.onap.validation.yaml.error.SchemaValidationError; -import org.onap.validation.yaml.error.YamlDocumentValidationError; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.schema.YamlSchema; -import org.onap.validation.yaml.schema.YamlSchemaFactory; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public class YamlFileValidator { - - private static final int FIRST_DOCUMENT_INDEX = 1; - - public List<YamlDocumentValidationError> validateYamlFileWithSchema(String pathToFile) - throws YamlProcessingException { - - List<YamlDocument> documents = new YamlLoader().loadMultiDocumentYamlFile(pathToFile); - if(!documents.isEmpty()) { - return validateDocuments(documents); - } else { - throw new YamlProcessingException("PM_Dictionary YAML file is empty"); - } - } - - private List<YamlDocumentValidationError> validateDocuments(List<YamlDocument> documents) - throws YamlProcessingException { - - List<YamlDocumentValidationError> yamlFileValidationErrors = new ArrayList<>(); - YamlSchema schema = extractSchema(documents); - YamlValidator validator = new YamlValidator(schema); - - for (int index = FIRST_DOCUMENT_INDEX; index < documents.size(); index++) { - List<SchemaValidationError> validationErrors = validator.validate(documents.get(index)); - yamlFileValidationErrors.addAll(transformErrors(index,validationErrors)); - } - - return yamlFileValidationErrors; - } - - private List<YamlDocumentValidationError> transformErrors(int index, List<SchemaValidationError> validationErrors) { - return validationErrors - .stream() - .map(error->new YamlDocumentValidationError(index, error.getPath(), error.getMessage())) - .collect(Collectors.toList()); - } - - private YamlSchema extractSchema(List<YamlDocument> documents) throws YamlProcessingException { - return new YamlSchemaFactory().createTreeStructuredYamlSchema(documents.get(0)); - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/YamlLoader.java b/csarvalidation/src/main/java/org/onap/validation/yaml/YamlLoader.java deleted file mode 100644 index 1a5eef9..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/YamlLoader.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.model.YamlDocumentFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.yaml.snakeyaml.Yaml; - -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -class YamlLoader { - - private static final Logger LOGGER = LoggerFactory.getLogger(YamlLoader.class); - - List<YamlDocument> loadMultiDocumentYamlFile(URL path) - throws YamlDocumentFactory.YamlDocumentParsingException { - List<YamlDocument> documentsFromFile = new ArrayList<>(); - try (InputStream yamlStream = path.openStream()) { - for (Object yamlDocument : new Yaml().loadAll(yamlStream)) { - documentsFromFile.add( - new YamlDocumentFactory().createYamlDocument(yamlDocument) - ); - } - } catch (IOException e) { - LOGGER.error("Failed to load multi document YAML file",e); - } - return documentsFromFile; - } - - List<YamlDocument> loadMultiDocumentYamlFile(String path) - throws YamlProcessingException { - try { - return loadMultiDocumentYamlFile(new URL("file://" + path)); - } catch (MalformedURLException e) { - throw new YamlProcessingException("Fail to read file under given path.", e); - } - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/YamlValidator.java b/csarvalidation/src/main/java/org/onap/validation/yaml/YamlValidator.java deleted file mode 100644 index 9430df4..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/YamlValidator.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.error.SchemaValidationError; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.process.YamlValidationProcess; -import org.onap.validation.yaml.schema.YamlSchema; - -import java.util.List; - -public class YamlValidator { - - private final YamlSchema schema; - - YamlValidator(YamlSchema schema) { - this.schema = schema; - } - - public List<SchemaValidationError> validate(YamlDocument document) throws YamlProcessingException { - return new YamlValidationProcess(schema,document).validate(); - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/error/SchemaValidationError.java b/csarvalidation/src/main/java/org/onap/validation/yaml/error/SchemaValidationError.java deleted file mode 100644 index 6ffe6d4..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/error/SchemaValidationError.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.error; - -public class SchemaValidationError { - private final String path; - private final String message; - - public String getPath() { - return path; - } - - public String getMessage() { - return message; - } - - public SchemaValidationError(String path, String message) { - this.path = path; - this.message = message; - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/error/YamlDocumentValidationError.java b/csarvalidation/src/main/java/org/onap/validation/yaml/error/YamlDocumentValidationError.java deleted file mode 100644 index f04708f..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/error/YamlDocumentValidationError.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.error; - -public class YamlDocumentValidationError { - private final int yamlDocumentNumber; - private final String path; - private final String message; - - public YamlDocumentValidationError(int yamlDocumentNumber, String path, String message) { - this.yamlDocumentNumber = yamlDocumentNumber; - this.path = path; - this.message = message; - } - - public int getYamlDocumentNumber() { - return yamlDocumentNumber; - } - - public String getPath() { - return path; - } - - public String getMessage() { - return message; - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/exception/YamlProcessingException.java b/csarvalidation/src/main/java/org/onap/validation/yaml/exception/YamlProcessingException.java deleted file mode 100644 index 99c2437..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/exception/YamlProcessingException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.exception; - -public class YamlProcessingException extends Exception { - - public YamlProcessingException(String message, Throwable throwable) { - super(message, throwable); - } - - public YamlProcessingException(String message) { - super(message); - } - - public YamlProcessingException(Throwable throwable) { - super(throwable); - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlDocument.java b/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlDocument.java deleted file mode 100644 index 557b6fd..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlDocument.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.model; - -import java.util.Map; - -public class YamlDocument { - - private final Map<String, Object> yaml; - - YamlDocument(Map<String, Object> yaml) { - this.yaml = yaml; - } - - public Map<String, Object> getYaml() { - return yaml; - } - - public boolean containsKey(String key) { - return yaml.containsKey(key); - } - - public String getValue(String key) { - return yaml.get(key).toString(); - } - - public YamlParametersList getListOfValues(String key) { - return new YamlParameterListFactory().createYamlParameterList( - yaml.get(key) - ); - } - - public YamlDocument getSubStructure(String name) - throws YamlDocumentFactory.YamlDocumentParsingException { - return new YamlDocumentFactory().createYamlDocument( - yaml.get(name) - ); - } -} - - diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlDocumentFactory.java b/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlDocumentFactory.java deleted file mode 100644 index b56422c..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlDocumentFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.model; - -import org.onap.validation.yaml.exception.YamlProcessingException; - -import java.util.HashMap; -import java.util.Map; - -public class YamlDocumentFactory { - - public YamlDocument createYamlDocument(Object yaml) throws YamlDocumentParsingException { - try { - Map<String, Object> parsedYaml = transformMap((Map) yaml); - return new YamlDocument(parsedYaml); - } catch (ClassCastException e) { - throw new YamlDocumentParsingException( - String.format("Fail to parse given objects: %s as yaml document.", yaml), e - ); - } - } - - private Map<String, Object> transformMap(Map<Object, Object> yaml) { - Map<String, Object> parsedYaml = new HashMap<>(); - for (Map.Entry<Object, Object> entry: yaml.entrySet()) { - parsedYaml.put(entry.getKey().toString(), entry.getValue()); - } - return parsedYaml; - } - - public static class YamlDocumentParsingException extends YamlProcessingException { - YamlDocumentParsingException(String message, Throwable throwable) { - super(message, throwable); - } - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlParameterListFactory.java b/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlParameterListFactory.java deleted file mode 100644 index 5f41c5c..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlParameterListFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.model; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class YamlParameterListFactory { - - public YamlParametersList createEmptyYamlParameterList() { - return new YamlParametersList(Collections.emptyList()); - } - - public YamlParametersList createYamlParameterList(Object yaml) { - List<String> parametersList = new ArrayList<>(); - if( yaml instanceof List) { - for (Object element : (List) yaml) { - parametersList.add(element.toString()); - } - } else { - parametersList.add(yaml.toString()); - } - return new YamlParametersList(parametersList); - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlParametersList.java b/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlParametersList.java deleted file mode 100644 index 2b93c74..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/model/YamlParametersList.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.model; - -import java.util.List; - -public class YamlParametersList { - - private final List<String> parameters; - - YamlParametersList(List<String> parameters) { - this.parameters = parameters; - } - - public List<String> getParameters() { - return parameters; - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/process/YamlValidationProcess.java b/csarvalidation/src/main/java/org/onap/validation/yaml/process/YamlValidationProcess.java deleted file mode 100644 index 273014b..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/process/YamlValidationProcess.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.process; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.error.SchemaValidationError; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.schema.YamlSchema; -import org.onap.validation.yaml.schema.node.YamlSchemaNode; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - -public class YamlValidationProcess { - - private final Queue<YamlValidationStep> validationSteps; - private final List<SchemaValidationError> errors; - private final YamlSchema schema; - private final YamlDocument document; - - public YamlValidationProcess(YamlSchema schema, YamlDocument document) { - this.schema = schema; - this.document = document; - errors = new ArrayList<>(); - validationSteps = new LinkedList<>(); - } - - public List<SchemaValidationError> validate() throws YamlProcessingException { - validationSteps.add(new YamlValidationStep(schema.getRootNodes(), document)); - while (!validationSteps.isEmpty()) { - YamlValidationStep nextValidationNode = validationSteps.poll(); - validateStep(nextValidationNode); - } - return errors; - } - - private void validateStep(YamlValidationStep validationNode) - throws YamlProcessingException { - for (YamlSchemaNode schemaNode : validationNode.getSchemaNodes()) { - validateNode(validationNode.getDocument(), schemaNode); - } - } - - private void validateNode(YamlDocument document, YamlSchemaNode schemaNode) - throws YamlProcessingException { - - if (document.containsKey(schemaNode.getName())) { - if (schemaNode.isContainingSubStructure()) { - addNextLevelNodeToValidationNodesQueue(document, schemaNode); - } else if (!isValueOfNodeInAcceptedValuesList(document, schemaNode)) { - addIncorrectValueError(document, schemaNode); - } - } else if (schemaNode.isRequired()) { - addRequiredKeyNotFoundError(schemaNode); - } - } - - private boolean isValueOfNodeInAcceptedValuesList(YamlDocument document, YamlSchemaNode node) { - return node.getAcceptedValues().isEmpty() || - node.getAcceptedValues().containsAll( - document.getListOfValues(node.getName()).getParameters() - ); - } - - private void addNextLevelNodeToValidationNodesQueue(YamlDocument document, YamlSchemaNode node) - throws YamlProcessingException { - validationSteps.add( - new YamlValidationStep( - node.getNextNodes(), - document.getSubStructure(node.getName()) - ) - ); - } - - private void addRequiredKeyNotFoundError(YamlSchemaNode node) { - errors.add( - new SchemaValidationError( - node.getPath(), - String.format("Key not found: %s", node.getName()) - ) - ); - } - - private void addIncorrectValueError(YamlDocument document, YamlSchemaNode node) { - errors.add( - new SchemaValidationError( - node.getPath() + node.getName(), - String.format( - "Value(s) is/are not in array of accepted values.%n value(s): %s%n accepted value(s): %s", - document.getValue(node.getName()), node.getAcceptedValues()) - ) - ); - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/process/YamlValidationStep.java b/csarvalidation/src/main/java/org/onap/validation/yaml/process/YamlValidationStep.java deleted file mode 100644 index eb5ab8e..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/process/YamlValidationStep.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.process; - -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.schema.node.YamlSchemaNode; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -class YamlValidationStep { - - private final List<YamlSchemaNode> schemaNodes; - private final YamlDocument document; - - YamlValidationStep(List<YamlSchemaNode> nodes, YamlDocument yaml) { - this.schemaNodes = new ArrayList<>(nodes); - this.document = yaml; - } - - List<YamlSchemaNode> getSchemaNodes() { - return Collections.unmodifiableList(schemaNodes); - } - - YamlDocument getDocument() { - return document; - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/YamlSchema.java b/csarvalidation/src/main/java/org/onap/validation/yaml/schema/YamlSchema.java deleted file mode 100644 index 69bb6cd..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/YamlSchema.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema; - -import org.onap.validation.yaml.schema.node.YamlSchemaNode; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class YamlSchema { - - private final List<YamlSchemaNode> rootNodes; - - public List<YamlSchemaNode> getRootNodes() { - return Collections.unmodifiableList(rootNodes); - } - - YamlSchema(List<YamlSchemaNode> rootNodes) { - this.rootNodes = new ArrayList<>(rootNodes); - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/YamlSchemaFactory.java b/csarvalidation/src/main/java/org/onap/validation/yaml/schema/YamlSchemaFactory.java deleted file mode 100644 index df7d673..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/YamlSchemaFactory.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - -package org.onap.validation.yaml.schema; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.model.YamlDocumentFactory; -import org.onap.validation.yaml.schema.node.YamlSchemaNode; -import org.onap.validation.yaml.schema.node.YamlSchemaNodeFactory; - -import java.util.ArrayList; -import java.util.List; - -public class YamlSchemaFactory { - - - private static final String ROOT_PATH = "/"; - - public YamlSchema createTreeStructuredYamlSchema(YamlDocument schema) - throws YamlProcessingException { - - return new YamlSchema(getRootNodes(schema)); - } - - private List<YamlSchemaNode> getRootNodes(YamlDocument yamlDocument) - throws YamlProcessingException { - - List<YamlSchemaNode> nextNodes = new ArrayList<>(); - for(String nodeName: yamlDocument.getYaml().keySet()) { - nextNodes.add( - new YamlSchemaNodeFactory().createNode( - nodeName, - ROOT_PATH, - new YamlDocumentFactory().createYamlDocument( - yamlDocument.getYaml().get(nodeName) - ) - ) - ); - } - return nextNodes; - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaBranchNode.java b/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaBranchNode.java deleted file mode 100644 index 0f5b480..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaBranchNode.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema.node; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.model.YamlDocumentFactory; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -public class YamlSchemaBranchNode extends YamlSchemaNode { - - private final YamlDocument nextNodesInLazyForm; - private Optional<List<YamlSchemaNode>> nextNodes; - - YamlSchemaBranchNode(String name, String path, boolean required, String comment, - YamlDocument nextNodesInLazyForm) { - super(name, path, required, comment); - this.nextNodesInLazyForm = nextNodesInLazyForm; - this.nextNodes = Optional.empty(); - } - - @Override - public boolean isContainingSubStructure() { - return true; - } - - @Override - public List<String> getAcceptedValues() { - return Collections.emptyList(); - } - - @Override - public synchronized List<YamlSchemaNode> getNextNodes() throws YamlSchemaProcessingException { - try { - return nextNodes.orElseGet(this::loadNextNodes); - } catch (YamlSchemaLazyLoadingException lazyLoadingException) { - throw new YamlSchemaProcessingException(lazyLoadingException); - } - } - - private List<YamlSchemaNode> loadNextNodes() { - try { - List<YamlSchemaNode> loadedNextNodes = new ArrayList<>(); - for (String key : nextNodesInLazyForm.getYaml().keySet()) { - YamlDocument substructure = new YamlDocumentFactory() - .createYamlDocument(nextNodesInLazyForm.getYaml().get(key)); - loadedNextNodes.add(new YamlSchemaNodeFactory().createNode(key, getPath() + getName() + "/", substructure)); - } - nextNodes = Optional.of(loadedNextNodes); - return loadedNextNodes; - } catch (YamlProcessingException e) { - throw new YamlSchemaLazyLoadingException("Lazy loading failed, due to yaml parsing exception.",e); - } - } - - static class YamlSchemaLazyLoadingException extends RuntimeException { - YamlSchemaLazyLoadingException(String message, Throwable throwable) { - super(message, throwable); - } - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaLeafNode.java b/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaLeafNode.java deleted file mode 100644 index c98f41e..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaLeafNode.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema.node; - -import org.onap.validation.yaml.model.YamlParametersList; - -import java.util.Collections; -import java.util.List; - -public class YamlSchemaLeafNode extends YamlSchemaNode { - - private final YamlParametersList acceptedValues; - - YamlSchemaLeafNode(String name, String path, boolean required, String comment, - YamlParametersList acceptedValues) { - super(name, path, required, comment); - this.acceptedValues = acceptedValues; - } - - @Override - public List<String> getAcceptedValues() { - return acceptedValues.getParameters(); - } - - @Override - public List<YamlSchemaNode> getNextNodes() { - return Collections.emptyList(); - } - - @Override - public boolean isContainingSubStructure() { - return false; - } - -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaNode.java b/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaNode.java deleted file mode 100644 index 28913a2..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaNode.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema.node; - -import org.onap.validation.yaml.exception.YamlProcessingException; - -import java.util.List; - -public abstract class YamlSchemaNode { - - private final String path; - private final String name; - private final boolean required; - private final String comment; - - - public String getName() { - return name; - } - - public String getPath() { - return path; - } - - public boolean isRequired() { - return required; - } - - public abstract List<String> getAcceptedValues(); - - public abstract List<YamlSchemaNode> getNextNodes() throws YamlSchemaProcessingException; - - public abstract boolean isContainingSubStructure(); - - public String getComment() { - return comment; - } - - YamlSchemaNode(String name, String path, boolean required, String comment) { - this.name = name; - this.path = path; - this.required = required; - this.comment = comment; - } - - static class YamlSchemaProcessingException extends YamlProcessingException { - YamlSchemaProcessingException(Throwable throwable) { - super(throwable); - } - } -} diff --git a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaNodeFactory.java b/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaNodeFactory.java deleted file mode 100644 index 79a8f14..0000000 --- a/csarvalidation/src/main/java/org/onap/validation/yaml/schema/node/YamlSchemaNodeFactory.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema.node; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.model.YamlDocumentFactory; -import org.onap.validation.yaml.model.YamlParameterListFactory; -import org.onap.validation.yaml.model.YamlParametersList; - -import static org.onap.validation.yaml.model.YamlDocumentFactory.YamlDocumentParsingException; - -public class YamlSchemaNodeFactory { - - public static final String EMPTY_COMMENT = "no comment available"; - static final String STRUCTURE_KEY = "structure"; - static final String COMMENT_KEY = "comment"; - static final String VALUE_KET = "value"; - static final String PRESENCE_KEY = "presence"; - static final String PRESENCE_REQUIRED_KEY = "required"; - - public YamlSchemaNode createNode(String nodeName, String path, YamlDocument yamlDocument) - throws YamlProcessingException { - - YamlSchemaNode yamlSchemaNode; - if(isYamlContainingKey(yamlDocument, STRUCTURE_KEY)) { - yamlSchemaNode = new YamlSchemaBranchNode( - nodeName, path, getIsPresenceRequired(yamlDocument), getComment(yamlDocument), - getNextNodes(yamlDocument) - ); - } else { - yamlSchemaNode = new YamlSchemaLeafNode( - nodeName, path, getIsPresenceRequired(yamlDocument), getComment(yamlDocument), - getAcceptedValues(yamlDocument) - ); - } - return yamlSchemaNode; - } - - private YamlDocument getNextNodes(YamlDocument yamlDocument) - throws YamlDocumentParsingException { - return new YamlDocumentFactory().createYamlDocument(yamlDocument.getYaml().get(STRUCTURE_KEY)); - } - - private String getComment(YamlDocument yamlDocument) { - - return isYamlContainingKey(yamlDocument, COMMENT_KEY) - ? yamlDocument.getYaml().get(COMMENT_KEY).toString() - : EMPTY_COMMENT; - } - - private YamlParametersList getAcceptedValues(YamlDocument yamlDocument) { - - return isYamlContainingKey(yamlDocument, VALUE_KET) - ? new YamlParameterListFactory().createYamlParameterList(yamlDocument.getYaml().get(VALUE_KET)) - : new YamlParameterListFactory().createEmptyYamlParameterList(); - } - - private boolean getIsPresenceRequired(YamlDocument yamlDocument) { - - return isYamlContainingKey(yamlDocument, PRESENCE_KEY) - && yamlDocument.getYaml().get(PRESENCE_KEY).equals(PRESENCE_REQUIRED_KEY); - } - - private boolean isYamlContainingKey(YamlDocument yamlDocument, String structureKey) { - return yamlDocument.getYaml().containsKey(structureKey); - } - -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlFileValidatorTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/YamlFileValidatorTest.java deleted file mode 100644 index f89cc68..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlFileValidatorTest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.assertj.core.util.Lists; -import org.junit.Test; -import org.onap.validation.yaml.error.YamlDocumentValidationError; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.yaml.snakeyaml.parser.ParserException; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -public class YamlFileValidatorTest { - - @Test - public void shouldReturnCorrectErrorsWhenGivenPathToValidPmDictionaryFile() throws YamlProcessingException { - // given - String path = getFullPathForGivenResources(YamlLoadingUtils.PATH_TO_VALID_YAML); - - // when - List<YamlDocumentValidationError> validationErrors = - new YamlFileValidator().validateYamlFileWithSchema(path); - - // then - assertValidationReturnedExpectedErrors(validationErrors); - - } - - @Test - public void shouldReturnCorrecErrorsWhenGivenPathToValidJsonStylePmDictionaryFile() throws YamlProcessingException { - // given - String path = getFullPathForGivenResources(YamlLoadingUtils.PATH_TO_VALID_JSON_STYLE_YAML); - - // when - List<YamlDocumentValidationError> validationErrors = - new YamlFileValidator().validateYamlFileWithSchema(path); - - // then - assertValidationReturnedExpectedErrors(validationErrors); - } - - - private void assertValidationReturnedExpectedErrors(List<YamlDocumentValidationError> validationErrors) { - assertThat(validationErrors).isNotNull(); - assertThat(validationErrors).hasSize(4); - assertThat(validationErrors).usingRecursiveFieldByFieldElementComparator().containsAll( - Lists.list( - new YamlDocumentValidationError(1, - "/pmMetaData/pmFields/measResultType", - "Value(s) is/are not in array of accepted values.\n" + - " value(s): integer\n" + - " accepted value(s): [float, uint32, uint64]"), - new YamlDocumentValidationError(1, - "/pmMetaData/pmFields/", - "Key not found: measChangeType"), - new YamlDocumentValidationError(2, - "/pmMetaData/pmFields/", - "Key not found: measChangeType"), - new YamlDocumentValidationError(3, - "/pmMetaData/pmFields/measAdditionalFields/vendorField1", - "Value(s) is/are not in array of accepted values.\n" + - " value(s): [Z, A]\n" + - " accepted value(s): [X, Y, Z]") - ) - ); - } - @Test - public void shouldThrowErrorWhenGivenPathToInvalidPmDictionaryFile() { - // given - String path = getFullPathForGivenResources(YamlLoadingUtils.PATH_TO_MULTI_DOCUMENT_INVALID_YAML); - // when then - assertThatThrownBy(() -> - new YamlFileValidator().validateYamlFileWithSchema(path) - ).isInstanceOf(ParserException.class) - .hasMessageContaining( - "expected the node content, but found '<document end>'" - ); - } - - @Test - public void shouldThrowErrorWhenGivenInvalidPath() { - // given - String path ="invalid/path/to/pm_dictionary"; - - // when then - assertThatThrownBy(() -> - new YamlFileValidator().validateYamlFileWithSchema(path) - ).isInstanceOf(YamlProcessingException.class) - .hasMessageContaining( - "PM_Dictionary YAML file is empty" - ); - } - - private String getFullPathForGivenResources(String pathToValidYaml) { - return this.getClass().getClassLoader().getResource( - pathToValidYaml - ).getPath(); - } -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlLoaderTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/YamlLoaderTest.java deleted file mode 100644 index 4c68d60..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlLoaderTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.junit.Test; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.model.YamlDocumentFactory; -import org.yaml.snakeyaml.parser.ParserException; -import org.yaml.snakeyaml.scanner.ScannerException; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - - -public class YamlLoaderTest { - - private static final int EXPECTED_NUMBER_OF_DOCUMENTS = 5; - private static final String LETTER_S_WITH_ASCII_CODE = "s(115)"; - - @Test - public void shouldLoadAllDocumentsFromYamlFile() throws YamlDocumentFactory.YamlDocumentParsingException { - // when - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFile(); - - // then - assertThat(documents).hasSize(EXPECTED_NUMBER_OF_DOCUMENTS); - } - - @Test - public void shouldLoadAllDocumentsFromJsonStyleYamlFile() throws YamlDocumentFactory.YamlDocumentParsingException { - // when - List<YamlDocument> documents = YamlLoadingUtils.loadValidJsonStyleMultiDocumentYamlFile(); - - // then - assertThat(documents).hasSize(EXPECTED_NUMBER_OF_DOCUMENTS); - } - - @Test - public void shouldLoadAllDocumentsFromYamlFileUsingPathInString() throws YamlProcessingException { - // when - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFileUsingStringPath(); - - // then - assertThat(documents).hasSize(EXPECTED_NUMBER_OF_DOCUMENTS); - } - - @Test - public void shouldThrowExceptionWhenLoadingDocumentsFromInvalidYamlFile() { - // when then - assertThatThrownBy(YamlLoadingUtils::tryToLoadMultiDocumentInvalidYamlFile - ).isInstanceOf(ParserException.class) - .hasMessageContaining("expected the node content, but found '<document end>'"); - } - - @Test - public void shouldThrowExceptionWhenLoadingDocumentsFromInvalidYamlFileUsingPathInString() { - // when then - assertThatThrownBy(YamlLoadingUtils::tryToLoadMultiDocumentInvalidYamlFileUsingStringPath - ).isInstanceOf(ParserException.class) - .hasMessageContaining("expected the node content, but found '<document end>'"); - } - - - @Test - public void shouldThrowExceptionWhenLoadingInvalidYamlFileWithIncorrectKeyMapping() { - // when then - assertThatThrownBy(YamlLoadingUtils::tryToLoadInvalidYamlFileWithIncorrectKeyMapping - ).isInstanceOf(ScannerException.class) - .hasMessageContaining("mapping values are not allowed here"); - } - - - @Test - public void shouldThrowExceptionWhenLoadingInvalidYamlFileWithUnknownEscapeCharacter() { - // when then - assertThatThrownBy(YamlLoadingUtils::tryToLoadInvalidYamlFileWithUnknownEscapeCharacter - ).isInstanceOf(ScannerException.class) - .hasMessageContaining("found unknown escape character " + LETTER_S_WITH_ASCII_CODE); - } - -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlLoadingUtils.java b/csarvalidation/src/test/java/org/onap/validation/yaml/YamlLoadingUtils.java deleted file mode 100644 index 8d03910..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlLoadingUtils.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; - -import java.net.URL; -import java.util.List; - -import static org.onap.validation.yaml.model.YamlDocumentFactory.YamlDocumentParsingException; - -public final class YamlLoadingUtils { - - private YamlLoadingUtils() {} - - public static final int VALID_YAML_DOCUMENT_INDEX = 4; - public static final int YAML_DOCUMENT_WITH_WRONG_VALUE_IN_ARRAY_INDEX = 3; - public static final int YAML_DOCUMENT_WITH_MISSING_FIELD_INDEX = 2; - public static final int YAML_DOCUMENT_WITH_MISSING_FIELD_AND_WRONG_VALUE_INDEX = 1; - - static final String PATH_TO_VALID_YAML = "yaml_schema/PM_Dictionary.yaml"; - static final String PATH_TO_VALID_JSON_STYLE_YAML = "yaml_schema/PM_Dictionary_JSON_Style.yaml"; - private static final String PATH_TO_SIMPLE_VALID_SCHEMA = "yaml_schema/Simple_Valid_Schema.yaml"; - private static final String PATH_TO_SIMPLE_VALID_SCHEMA_MULTI_ROOT = "yaml_schema/Simple_Valid_Schema_Multi_Root.yaml"; - private static final String PATH_TO_SIMPLE_INVALID_SCHEMA = "yaml_schema/Simple_Invalid_Schema_Construction.yaml"; - private static final String PATH_TO_SIMPLE_INVALID_SCHEMA_FOR_LAZY_LOADING = "yaml_schema/Simple_Invalid_Schema_LazyLoading.yaml"; - static final String PATH_TO_MULTI_DOCUMENT_INVALID_YAML = "yaml_schema/Multi_Document_Invalid.yaml"; - private static final String PATH_TO_INVALID_YAML_WITH_INCORRECT_KEY_MAPPING = "yaml_schema/Simple_Invalid_Mapping_Value.yaml"; - private static final String PATH_TO_INVALID_YAML_WITH_UNKNOWN_ESCAPE_CHARACTER = "yaml_schema/Simple_Unknown_Escape_Character.yaml"; - - public static List<YamlDocument> loadValidMultiDocumentYamlFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_VALID_YAML)); - } - - public static List<YamlDocument> loadValidJsonStyleMultiDocumentYamlFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_VALID_JSON_STYLE_YAML)); - } - - public static List<YamlDocument> loadValidMultiDocumentYamlFileUsingStringPath() throws YamlProcessingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_VALID_YAML).getPath()); - } - - public static YamlDocument loadSimpleValidYamlSchemaFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_SIMPLE_VALID_SCHEMA)).get(0); - } - - public static YamlDocument loadSimpleInvalidYamlSchemaFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_SIMPLE_INVALID_SCHEMA)).get(0); - } - - public static YamlDocument loadSimpleInvalidYamlSchemaForLazyLoadingFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_SIMPLE_INVALID_SCHEMA_FOR_LAZY_LOADING)).get(0); - } - - public static YamlDocument loadSimpleValidYamlSchemaWithMultiRootFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_SIMPLE_VALID_SCHEMA_MULTI_ROOT)).get(0); - } - - public static List<YamlDocument> tryToLoadMultiDocumentInvalidYamlFile() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_MULTI_DOCUMENT_INVALID_YAML)); - } - - public static List<YamlDocument> tryToLoadMultiDocumentInvalidYamlFileUsingStringPath() throws YamlProcessingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_MULTI_DOCUMENT_INVALID_YAML).getPath()); - } - - public static List<YamlDocument> tryToLoadInvalidYamlFileWithIncorrectKeyMapping() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_INVALID_YAML_WITH_INCORRECT_KEY_MAPPING)); - } - - public static List<YamlDocument> tryToLoadInvalidYamlFileWithUnknownEscapeCharacter() throws YamlDocumentParsingException { - return new YamlLoader().loadMultiDocumentYamlFile(getUrlForGivenPath(PATH_TO_INVALID_YAML_WITH_UNKNOWN_ESCAPE_CHARACTER)); - } - - private static URL getUrlForGivenPath(String path) { - return YamlLoadingUtils.class.getClassLoader().getResource(path); - } -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlValidatorTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/YamlValidatorTest.java deleted file mode 100644 index efe9d69..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/YamlValidatorTest.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml; - -import org.assertj.core.util.Lists; -import org.junit.Test; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.error.SchemaValidationError; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.schema.YamlSchemaFactory; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.onap.validation.yaml.YamlLoadingUtils.VALID_YAML_DOCUMENT_INDEX; -import static org.onap.validation.yaml.YamlLoadingUtils.YAML_DOCUMENT_WITH_MISSING_FIELD_INDEX; -import static org.onap.validation.yaml.YamlLoadingUtils.YAML_DOCUMENT_WITH_MISSING_FIELD_AND_WRONG_VALUE_INDEX; -import static org.onap.validation.yaml.YamlLoadingUtils.YAML_DOCUMENT_WITH_WRONG_VALUE_IN_ARRAY_INDEX; - -public class YamlValidatorTest { - - - @Test - public void shouldCreateValidatorUsingSchemaLoadedFromYamlFileAndValidatedJsonStyleDocumentsFromThatFile() - throws YamlProcessingException { - - // given - List<YamlDocument> documents = YamlLoadingUtils.loadValidJsonStyleMultiDocumentYamlFile(); - YamlValidator validator = new YamlValidator(new YamlSchemaFactory().createTreeStructuredYamlSchema(documents.get(0))); - Map<Integer,List<SchemaValidationError>> validationErrors = new HashMap<>(); - - // when - for (int documentIndex = 1 ; documentIndex < documents.size() ; documentIndex++) { - validationErrors.put(documentIndex, validator.validate(documents.get(documentIndex))); - } - - // then - assertValidatorReturnedCorrectErrors(validationErrors); - } - - @Test - public void shouldCreateValidatorUsingSchemaLoadedFromYamlFileAndValidatedDocumentsFromThatFile() - throws YamlProcessingException { - - // given - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFile(); - YamlValidator validator = new YamlValidator(new YamlSchemaFactory().createTreeStructuredYamlSchema(documents.get(0))); - Map<Integer,List<SchemaValidationError>> validationErrors = new HashMap<>(); - - // when - for (int documentIndex = 1 ; documentIndex < documents.size() ; documentIndex++) { - validationErrors.put(documentIndex, validator.validate(documents.get(documentIndex))); - } - - // then - assertValidatorReturnedCorrectErrors(validationErrors); - } - - private void assertValidatorReturnedCorrectErrors(Map<Integer, List<SchemaValidationError>> validationErrors) { - - SchemaValidationError expectedValidationValueError = - new SchemaValidationError( - "/pmMetaData/pmFields/measResultType", - "Value(s) is/are not in array of accepted values.\n" - + " value(s): integer\n" - + " accepted value(s): [float, uint32, uint64]" - ); - SchemaValidationError expectedValidationKeyError = - new SchemaValidationError( - "/pmMetaData/pmFields/", - "Key not found: measChangeType" - ); - SchemaValidationError expectedValidationValuesInArrayError = - new SchemaValidationError( - "/pmMetaData/pmFields/measAdditionalFields/vendorField1", - "Value(s) is/are not in array of accepted values.\n" - + " value(s): [Z, A]\n" - + " accepted value(s): [X, Y, Z]" - ); - - assertThat(validationErrors.size()).isEqualTo(4); - assertThat(validationErrors).containsKeys(1,2,3); - assertThat(validationErrors.get(YAML_DOCUMENT_WITH_MISSING_FIELD_AND_WRONG_VALUE_INDEX)).hasSize(2); - assertThat(validationErrors.get(YAML_DOCUMENT_WITH_MISSING_FIELD_AND_WRONG_VALUE_INDEX)) - .usingFieldByFieldElementComparator() - .containsAll( - Lists.list( - expectedValidationValueError, - expectedValidationKeyError - )); - assertThat(validationErrors.get(YAML_DOCUMENT_WITH_MISSING_FIELD_INDEX)).hasSize(1); - assertThat(validationErrors.get(YAML_DOCUMENT_WITH_MISSING_FIELD_INDEX)) - .usingFieldByFieldElementComparator() - .contains( - expectedValidationKeyError - ); - assertThat(validationErrors.get(YAML_DOCUMENT_WITH_WRONG_VALUE_IN_ARRAY_INDEX)).hasSize(1); - assertThat(validationErrors.get(YAML_DOCUMENT_WITH_WRONG_VALUE_IN_ARRAY_INDEX)) - .usingFieldByFieldElementComparator() - .contains( - expectedValidationValuesInArrayError - ); - assertThat(validationErrors.get(VALID_YAML_DOCUMENT_INDEX)).hasSize(0); - } - -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/model/YamlDocumentFactoryTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/model/YamlDocumentFactoryTest.java deleted file mode 100644 index 7879d4e..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/model/YamlDocumentFactoryTest.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.model; - -import org.assertj.core.util.Lists; -import org.junit.Test; - -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.onap.validation.yaml.model.YamlDocumentFactory.YamlDocumentParsingException; - -public class YamlDocumentFactoryTest { - - @Test - public void shouldTurnMapOfUnknownKeyTypeToMapWithStringKeysAndBeAbleToReturnStringifyValues() - throws YamlDocumentParsingException { - // given - Map<Object, Object> inputMap = new HashMap<>(); - List<String> testList = Lists.list("element1", "element11"); - Map<Object, Object> testEmptyMap = Collections.emptyMap(); - - inputMap.put("test", testList); - inputMap.put(345, "element2"); - inputMap.put("test2", "element3"); - inputMap.put(2.67, testEmptyMap); - - // when - YamlDocument document = new YamlDocumentFactory().createYamlDocument(inputMap); - - // then - assertThat(document).isNotNull(); - assertThat(document.getYaml()).containsKeys("test", "345", "test2", "2.67"); - - assertThat(document.getYaml()).containsEntry("test", testList); - assertThat(document.getValue("test")).isEqualTo("[element1, element11]"); - - assertThat(document.getValue("345")).isEqualTo("element2"); - assertThat(document.getValue("test2")).isEqualTo("element3"); - - assertThat(document.getYaml()).containsEntry("2.67", testEmptyMap); - assertThat(document.getValue("2.67")).isEqualTo("{}"); - } - - @Test - public void shouldTurnMapOfUnknownKeyTypeToMapWithStringKeysAndBeAbleToExtractSubStructure() - throws YamlDocumentParsingException { - // given - Map<Object, Object> inputMap = new HashMap<>(); - Map<Object, Object> subStructureMap = new HashMap<>(); - - inputMap.put("test", "element1"); - inputMap.put("structure", subStructureMap); - - subStructureMap.put("subTest1", "subElement1"); - subStructureMap.put("subTest2", "subElement2"); - - // when - YamlDocument document = new YamlDocumentFactory().createYamlDocument(inputMap); - - // then - assertThat(document).isNotNull(); - assertThat(document.getYaml()).containsKeys("test", "structure"); - assertThat(document.getValue("test")).isEqualTo("element1"); - - assertThat(document.getSubStructure("structure")).isNotNull(); - assertThat(document.getSubStructure("structure").getValue("subTest1")).isEqualTo("subElement1"); - assertThat(document.getSubStructure("structure").getValue("subTest2")).isEqualTo("subElement2"); - } - - @Test - public void shouldTurnMapOfUnknownKeyTypeToMapWithStringKeysAndBeAbleToExtractParametersList() - throws YamlDocumentParsingException { - // given - Map<Object, Object> inputMap = new HashMap<>(); - List<String> parametersList = new LinkedList<>(); - - inputMap.put("test", "element1"); - inputMap.put("parameters", parametersList); - - parametersList.add("parameter1"); - parametersList.add("parameter2"); - - // when - YamlDocument document = new YamlDocumentFactory().createYamlDocument(inputMap); - - // then - assertThat(document).isNotNull(); - assertThat(document.getYaml()).containsKeys("test", "parameters"); - assertThat(document.getValue("test")).isEqualTo("element1"); - - assertThat(document.getListOfValues("parameters")).isNotNull(); - assertThat(document.getListOfValues("parameters").getParameters()).contains("parameter1","parameter2"); - } - - @Test - public void shouldThrowExceptionIfGetSubStructureIsCalledOnList() - throws YamlDocumentParsingException { - // given - Map<Object, Object> inputMap = new HashMap<>(); - List<String> testList = Lists.list("element1", "element2"); - - inputMap.put("test", testList); - - YamlDocument document = new YamlDocumentFactory().createYamlDocument(inputMap); - - // when then - assertThatThrownBy(() -> - document.getSubStructure("test") - ).isInstanceOf(YamlDocumentParsingException.class) - .hasMessageContaining( - String.format("Fail to parse given objects: %s as yaml document", testList) - ); - } - - @Test - public void shouldThrowExceptionIfGetSubStructureIsCalledOnString() - throws YamlDocumentParsingException { - // given - Map<Object, Object> inputMap = new HashMap<>(); - - inputMap.put("test", "testElement"); - - YamlDocument document = new YamlDocumentFactory().createYamlDocument(inputMap); - - // when then - assertThatThrownBy(() -> - document.getSubStructure("test") - ).isInstanceOf(YamlDocumentParsingException.class) - .hasMessageContaining( - String.format("Fail to parse given objects: %s as yaml document.", "testElement") - ); - } -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/model/YamlParameterListFactoryTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/model/YamlParameterListFactoryTest.java deleted file mode 100644 index 34e61c5..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/model/YamlParameterListFactoryTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.model; - -import org.assertj.core.util.Lists; -import org.junit.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class YamlParameterListFactoryTest { - - @Test - public void shouldCreateEmptyParametersList() { - // when - YamlParametersList parametersList = new YamlParameterListFactory().createEmptyYamlParameterList(); - - // then - assertThat(parametersList).isNotNull(); - assertThat(parametersList.getParameters()).isEmpty(); - } - - @Test - public void shouldCreateParametersListContainingStringsFromListContainingSimpleTypes() { - // given - List<Object> testList = Lists.list("test1",3,23.45,'a',"test2"); - - // when - YamlParametersList parametersList = new YamlParameterListFactory().createYamlParameterList(testList); - - // then - assertThat(parametersList).isNotNull(); - assertThat(parametersList.getParameters()).hasSize(5); - assertThat(parametersList.getParameters()).contains("test1","test2","3","23.45","a"); - } - - @Test - public void shouldCreateParametersListContainingStringsFromListContainingVariousTypes() { - // given - List<Object> testList = Lists.list("test1",3,Lists.list(2,3,4),"test2"); - - // when - YamlParametersList parametersList = new YamlParameterListFactory().createYamlParameterList(testList); - - // then - assertThat(parametersList).isNotNull(); - assertThat(parametersList.getParameters()).hasSize(4); - assertThat(parametersList.getParameters()).contains("test1","test2","3","[2, 3, 4]"); - } - - @Test - public void shouldCreateListWithOneStringWhenGivenObjectIsNotList() { - // given - Object testObject = "test"; - - // when - YamlParametersList parametersList = new YamlParameterListFactory().createYamlParameterList(testObject); - - // then - assertThat(parametersList).isNotNull(); - assertThat(parametersList.getParameters()).hasSize(1); - assertThat(parametersList.getParameters()).contains("test"); - } - -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/process/YamlValidationProcessTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/process/YamlValidationProcessTest.java deleted file mode 100644 index 12fe9ec..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/process/YamlValidationProcessTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.process; - -import org.junit.Test; -import org.onap.validation.yaml.YamlLoadingUtils; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.error.SchemaValidationError; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.schema.YamlSchema; -import org.onap.validation.yaml.schema.YamlSchemaFactory; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.onap.validation.yaml.YamlLoadingUtils.VALID_YAML_DOCUMENT_INDEX; -import static org.onap.validation.yaml.YamlLoadingUtils.YAML_DOCUMENT_WITH_MISSING_FIELD_INDEX; -import static org.onap.validation.yaml.YamlLoadingUtils.YAML_DOCUMENT_WITH_MISSING_FIELD_AND_WRONG_VALUE_INDEX; - - -public class YamlValidationProcessTest { - - @Test - public void shouldReturnNoErrorWhenProcessingValidPmDictionaryYaml() - throws YamlProcessingException { - // given - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFile(); - YamlSchema schema = new YamlSchemaFactory().createTreeStructuredYamlSchema(documents.get(0)); - YamlDocument document = documents.get(VALID_YAML_DOCUMENT_INDEX); - - // when - List<SchemaValidationError> errors = new YamlValidationProcess(schema,document).validate(); - - // then - assertThat(errors).isEmpty(); - } - - @Test - public void shouldReturnOneErrorWhenProcessingPmDictionaryYamlWithMissingField() - throws YamlProcessingException { - // given - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFile(); - YamlSchema schema = new YamlSchemaFactory().createTreeStructuredYamlSchema(documents.get(0)); - YamlDocument document = documents.get(YAML_DOCUMENT_WITH_MISSING_FIELD_INDEX); - - // when - List<SchemaValidationError> errors = new YamlValidationProcess(schema,document).validate(); - - // then - assertThat(errors).hasSize(1); - } - - @Test - public void shouldReturnTwoErrorsWhenProcessingPmDictionaryYamlWithMissingFieldAndIncorrectValue() - throws YamlProcessingException { - // given - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFile(); - YamlSchema schema = new YamlSchemaFactory().createTreeStructuredYamlSchema(documents.get(0)); - YamlDocument document = documents.get(YAML_DOCUMENT_WITH_MISSING_FIELD_AND_WRONG_VALUE_INDEX); - - // when - List<SchemaValidationError> errors = new YamlValidationProcess(schema,document).validate(); - - // then - assertThat(errors).hasSize(2); - } - - @Test - public void shouldThrowExceptionWhenProcessingPmDictionaryIsNotValidYaml() - throws YamlProcessingException { - // given - List<YamlDocument> documents = YamlLoadingUtils.loadValidMultiDocumentYamlFile(); - YamlDocument schemaInYaml = YamlLoadingUtils.loadSimpleInvalidYamlSchemaForLazyLoadingFile(); - YamlSchema schema = new YamlSchemaFactory().createTreeStructuredYamlSchema(schemaInYaml); - YamlDocument document = documents.get(VALID_YAML_DOCUMENT_INDEX); - - // when then - assertThatThrownBy(() -> - new YamlValidationProcess(schema,document).validate() - ).isInstanceOf(YamlProcessingException.class) - .hasMessageContaining( - String.format("Lazy loading failed, due to yaml parsing exception.") - ); - } -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/schema/YamlSchemaFactoryTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/schema/YamlSchemaFactoryTest.java deleted file mode 100644 index 4c05d71..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/schema/YamlSchemaFactoryTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema; - -import org.junit.Test; -import org.onap.validation.yaml.YamlLoadingUtils; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.schema.node.YamlSchemaNode; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.onap.validation.yaml.model.YamlDocumentFactory.YamlDocumentParsingException; -import static org.onap.validation.yaml.schema.node.YamlSchemaNodeFactory.EMPTY_COMMENT; -import static org.onap.validation.yaml.schema.node.YamlSchemaNodeFactoryTest.assertThatBranchNodeIsValid; -import static org.onap.validation.yaml.schema.node.YamlSchemaNodeFactoryTest.assertThatLeafNodeIsValid; - - -public class YamlSchemaFactoryTest { - - @Test - public void shouldCreateYamlSchemaFromYamlDocumentWithMultipleRoots() - throws YamlProcessingException { - - // given - YamlDocument documents = YamlLoadingUtils.loadSimpleValidYamlSchemaWithMultiRootFile(); - - // when - YamlSchema schema = new YamlSchemaFactory().createTreeStructuredYamlSchema(documents); - - // then - assertThat(schema).isNotNull(); - assertThat(schema.getRootNodes()).hasSize(3); - assertThat(schema.getRootNodes().get(0).getName()).isEqualTo("root1"); - assertThat(schema.getRootNodes().get(1).getName()).isEqualTo("root2"); - assertThat(schema.getRootNodes().get(2).getName()).isEqualTo("root3"); - } - - - @Test - public void shouldCreateYamlSchemaFromYamlDocument() - throws YamlProcessingException { - - // given - YamlDocument documents = YamlLoadingUtils.loadSimpleValidYamlSchemaFile(); - - // when - YamlSchema schema = new YamlSchemaFactory().createTreeStructuredYamlSchema(documents); - - // then - assertThat(schema).isNotNull(); - assertThat(schema.getRootNodes()).hasSize(1); - YamlSchemaNode pmMetaData = schema.getRootNodes().get(0); - assertThatBranchNodeIsValid(pmMetaData, "pmMetaData","/", true, EMPTY_COMMENT, - 2); - - YamlSchemaNode pmHeader = pmMetaData.getNextNodes().get(1); - assertThatBranchNodeIsValid(pmHeader, "pmHeader","/pmMetaData/", true, EMPTY_COMMENT, - 1); - - YamlSchemaNode nfType = pmHeader.getNextNodes().get(0); - assertThatLeafNodeIsValid(nfType, "nfType", "/pmMetaData/pmHeader/", true, "nfType comment"); - - YamlSchemaNode pmFields = pmMetaData.getNextNodes().get(0); - assertThatBranchNodeIsValid(pmFields, "pmFields", "/pmMetaData/", true, EMPTY_COMMENT, - 2); - - YamlSchemaNode measChangeType = pmFields.getNextNodes().get(1); - assertThatLeafNodeIsValid(measChangeType, "measChangeType", "/pmMetaData/pmFields/", - true, "measChangeType comment", - "added", "modified", "deleted"); - - YamlSchemaNode measAdditionalFields = pmFields.getNextNodes().get(0); - assertThatBranchNodeIsValid(measAdditionalFields, "measAdditionalFields", "/pmMetaData/pmFields/", - true, "measAdditionalFields comment", - 2); - - YamlSchemaNode vendorField1 = measAdditionalFields.getNextNodes().get(0); - assertThatLeafNodeIsValid(vendorField1, "vendorField1", "/pmMetaData/pmFields/measAdditionalFields/", - true, "vendorField1 comment", - "X", "Y", "Z"); - YamlSchemaNode vendorField2 = measAdditionalFields.getNextNodes().get(1); - assertThatLeafNodeIsValid(vendorField2, "vendorField2", "/pmMetaData/pmFields/measAdditionalFields/", - false, "vendorField2 comment", - "A", "B"); - } - - @Test - public void shouldThrowYamlParsingExceptionWhenLoadedSchemaIsInvalid() - throws YamlDocumentParsingException { - - // given - YamlDocument documents = YamlLoadingUtils.loadSimpleInvalidYamlSchemaFile(); - - // when/then - assertThatThrownBy(() -> - new YamlSchemaFactory().createTreeStructuredYamlSchema(documents) - ).isInstanceOf(YamlDocumentParsingException.class) - .hasMessageContaining( - String.format( - "Fail to parse given objects: %s as yaml document", - documents.getSubStructure("pmMetaData").getYaml().get("structure") - ) - ); - } - -} diff --git a/csarvalidation/src/test/java/org/onap/validation/yaml/schema/node/YamlSchemaNodeFactoryTest.java b/csarvalidation/src/test/java/org/onap/validation/yaml/schema/node/YamlSchemaNodeFactoryTest.java deleted file mode 100644 index d35e3b2..0000000 --- a/csarvalidation/src/test/java/org/onap/validation/yaml/schema/node/YamlSchemaNodeFactoryTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2020 Nokia - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.onap.validation.yaml.schema.node; - -import org.assertj.core.util.Lists; -import org.junit.Test; -import org.onap.validation.yaml.YamlLoadingUtils; -import org.onap.validation.yaml.exception.YamlProcessingException; -import org.onap.validation.yaml.model.YamlDocument; -import org.onap.validation.yaml.model.YamlDocumentFactory; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.onap.validation.yaml.schema.node.YamlSchemaNodeFactory.EMPTY_COMMENT; - -public class YamlSchemaNodeFactoryTest { - - private static final String ROOT_PATH = "/"; - - @Test - public void shouldThrowExceptionDuringLazyLoadingWhenLoadedSchemaHaveInvalidSubStructure() - throws YamlProcessingException { - // given - String nodeName = "pmMetaData"; - - YamlDocument document = YamlLoadingUtils.loadSimpleInvalidYamlSchemaForLazyLoadingFile(); - YamlSchemaNode node = new YamlSchemaNodeFactory() - .createNode(nodeName, ROOT_PATH, document.getSubStructure(nodeName)); - - // when/then - assertThatThrownBy(node::getNextNodes - ).isInstanceOf(YamlSchemaNode.YamlSchemaProcessingException.class) - .hasMessageContaining( - "Lazy loading failed, due to yaml parsing exception." - ); - } - - @Test - public void shouldCreateLeafNodeIfGivenYamlDocumentHaveNoSubStructure() - throws YamlProcessingException { - // given - String nodeName = "leaf_test"; - String comment = "test leaf node"; - List<String> acceptedValues = Lists.list("val1", "val2"); - Map<Object, Object> nodeInYamlFormat = new HashMap<>(); - nodeInYamlFormat.put(YamlSchemaNodeFactory.PRESENCE_KEY, YamlSchemaNodeFactory.PRESENCE_REQUIRED_KEY); - nodeInYamlFormat.put(YamlSchemaNodeFactory.COMMENT_KEY, comment); - nodeInYamlFormat.put(YamlSchemaNodeFactory.VALUE_KET, acceptedValues); - YamlDocument document = new YamlDocumentFactory().createYamlDocument( - nodeInYamlFormat - ); - - // when - YamlSchemaNode yamlSchemaNode = new YamlSchemaNodeFactory().createNode(nodeName, ROOT_PATH, document); - - // then - assertThatLeafNodeIsValid( - yamlSchemaNode, nodeName, ROOT_PATH, true, comment, - acceptedValues.toArray(new String[acceptedValues.size()]) - ); - } - - @Test - public void shouldCreateBranchNodeIfGivenYamlDocumentHaveSubStructure() - throws YamlProcessingException { - // given - String nodeName = "branch_test"; - String comment = "test branch node"; - - Map<Object, Object> subStructure = new HashMap<>(); - String subNode1Name = "branch_test_node1"; - String subNode2Name = "branch_test_node2"; - subStructure.put(subNode1Name, new HashMap<>()); - subStructure.put(subNode2Name, new HashMap<>()); - - Map<Object, Object> nodeInYamlFormat = new HashMap<>(); - nodeInYamlFormat.put(YamlSchemaNodeFactory.PRESENCE_KEY, YamlSchemaNodeFactory.PRESENCE_REQUIRED_KEY); - nodeInYamlFormat.put(YamlSchemaNodeFactory.COMMENT_KEY, comment); - nodeInYamlFormat.put(YamlSchemaNodeFactory.STRUCTURE_KEY, subStructure); - YamlDocument document = new YamlDocumentFactory().createYamlDocument( - nodeInYamlFormat - ); - - // when - YamlSchemaNode yamlSchemaNode = new YamlSchemaNodeFactory().createNode(nodeName, ROOT_PATH, document); - - // then - assertThatBranchNodeIsValid( - yamlSchemaNode, nodeName, ROOT_PATH, true, comment, 2); - - List<YamlSchemaNode> subNodes = yamlSchemaNode.getNextNodes(); - assertThat(subNodes).hasSize(2); - assertThatLeafNodeIsValid( - subNodes.get(1), subNode1Name, ROOT_PATH + nodeName + "/", false, EMPTY_COMMENT); - assertThatLeafNodeIsValid( - subNodes.get(0), subNode2Name, ROOT_PATH + nodeName + "/", false, EMPTY_COMMENT); - } - - public static void assertThatBranchNodeIsValid( - YamlSchemaNode yamlSchemaNode, String name, String path, boolean isRequired, String comment, - int numberOfSubNodes - ) throws YamlSchemaNode.YamlSchemaProcessingException { - assertThatNodeIsValid(yamlSchemaNode, name, path, isRequired, comment); - - assertThat(yamlSchemaNode.getClass()).isEqualTo(YamlSchemaBranchNode.class); - assertThat(yamlSchemaNode.isContainingSubStructure()).isTrue(); - assertThat(yamlSchemaNode.getNextNodes()).hasSize(numberOfSubNodes); - assertThat(yamlSchemaNode.getAcceptedValues()).isEmpty(); - } - - public static void assertThatLeafNodeIsValid( - YamlSchemaNode yamlSchemaNode, String name, String path, boolean isRequired, String comment, - String... acceptedValues - ) throws YamlSchemaNode.YamlSchemaProcessingException { - assertThatNodeIsValid(yamlSchemaNode, name, path, isRequired, comment); - - assertThat(yamlSchemaNode.getClass()).isEqualTo(YamlSchemaLeafNode.class); - assertThat(yamlSchemaNode.isContainingSubStructure()).isFalse(); - assertThat(yamlSchemaNode.getAcceptedValues()).containsExactly(acceptedValues); - assertThat(yamlSchemaNode.getNextNodes()).isEmpty(); - } - - private static void assertThatNodeIsValid(YamlSchemaNode yamlSchemaNode, String name, String path, boolean isRequired, String comment) { - assertThat(yamlSchemaNode).isNotNull(); - assertThat(yamlSchemaNode.getName()).isEqualTo(name); - assertThat(yamlSchemaNode.getPath()).isEqualTo(path); - if (comment.isEmpty()) { - assertThat(yamlSchemaNode.getComment()).isNotEmpty(); - } else { - assertThat(yamlSchemaNode.getComment()).isEqualTo(comment); - } - assertThat(yamlSchemaNode.isRequired()).isEqualTo(isRequired); - } -} diff --git a/csarvalidation/src/test/resources/yaml_schema/Multi_Document_Invalid.yaml b/csarvalidation/src/test/resources/yaml_schema/Multi_Document_Invalid.yaml deleted file mode 100644 index aab34fa..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Multi_Document_Invalid.yaml +++ /dev/null @@ -1,86 +0,0 @@ -... -# PM Dictionary perf3gpp measurements for the gnb-Nokia NF (bracket style yaml) ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2204, - iMeasType: 1, - - measCollectionMethod: CC, - measCondition: "This measurement is updated when X2AP: SgNB Modification Required message is sent to MeNB - with the SCG Change Indication set as PSCellChange.", - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change attempts.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G18A_1807_003, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: integer, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChAttempt, - measAdditionalFields: { - vendorField1: X, - vendorField2: B - } - } -} ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2204, - iMeasType: 2, - measCollectionMethod: CC, - measCondition: "This measurement is updated when the TDCoverall timer has elapsed before gNB receives the X2AP: SgNB Modification Confirm message.", - measDescription: "This measurement the number of intra gNB intra frequency PSCell change failures due to TDCoverall timer expiry.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G18A_1807_003, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: float, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChFailTdcExp, - measAdditionalFields: { - vendorField1: Y - } - } -} -... ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2206, - iMeasType: 1, - measCondition: "This measurement is updated when MeNB replies to X2AP: SgNB Modification Required message with the X2AP: SgNB Modification Refuse message.", - measCollectionMethod: CC, - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change failures due to MeNB refusal.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G19_1906_002, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: float, - measChangeType: added, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChFailMenbRef, - measAdditionalFields: { - vendorField1: Z, - vendorField2: A - } - } -... diff --git a/csarvalidation/src/test/resources/yaml_schema/PM_Dictionary.yaml b/csarvalidation/src/test/resources/yaml_schema/PM_Dictionary.yaml deleted file mode 100644 index 12a4af9..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/PM_Dictionary.yaml +++ /dev/null @@ -1,228 +0,0 @@ ---- -# PM Dictionary schema specifying and describing the meta information -# used to define perf3gpp measurements in the PM Dictionary -pmMetaData: { presence: required, structure: { - pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "NF type; should match the nfName-vendor string used in - the fileReady or perf3gpp eventName" - }, - pmDefSchemaVsn: { - presence: required, - value: 2.0, - comment: "PM Dictionary Schema Version from the VES Event - Registration specification" - }, - pmDefVsn: { - presence: required, - comment: "vendor-defined PM Dictionary version" - } - } - }, - pmFields: { - presence: required, - structure: { - iMeasInfoId: { - presence: required, - comment: "vendor-defined integer measurement group identifier" - }, - iMeasType: { - presence: required, - comment: "vendor-defined integer identifier for the measType; - must be combined with measInfoId to identify a - specific measurement." - }, - measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "indicates the type of change that occurred during - measLastChange" - }, - measCollectionMethod: { - presence: required, - value: [CC, SI, DER, Gauge, Average], - comment: "the measurement collection method; CC, SI, DER and - Gauge are as defined in 3GPP; average contains the - average value of the measurement during the - granularity period" - }, - measCondition: { - presence: required, - comment: "description of the condition causing the measurement" - }, - measDescription: { - presence: required, - comment: "description of the measurement information - and purpose" - }, - measFamily: { - presence: required, - comment: "abbreviation for a family of measurements, in - 3GPP format, or vendor defined" - }, - measInfoId: { - presence: required, - comment: "name for a group of related measurements in - 3GPP format or vendor defined" - }, - measLastChange: { - presence: required, - comment: "version of the PM Dictionary the last time this - measurement was added, modified or deleted" - }, - measObjClass: { - presence: required, - value: [NGBTS, NGCELL, IPNO, IPSEC, ETHIF], - comment: "measurement object class" - }, - measResultRange: { - presence: optional, - comment: "range of the measurement result; only necessary when - the range is smaller than the full range of the - data type" - }, - measResultType: { - presence: required, - value: [float, uint32, uint64], - comment: "data type of the measurement result" - }, - measResultUnits: { - presence: required, - value: [seconds, minutes, nanoseconds, microseconds, dB, - number, kilobytes, bytes, ethernetFrames, - packets, users], - comment: "units of measure for the measurement result" - }, - measType: { - presence: required, - comment: "measurement name in 3GPP or vendor-specific format; - vendor specific names are preceded with VS" - }, - measAdditionalFields: { - presence: required, - comment: "vendor-specific PM Dictionary fields", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendor field 1 description" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendor field 2 description." - } - } - } - } - } -}} -... -# PM Dictionary perf3gpp measurements for the gnb-Nokia NF (bracket style yaml) ---- -pmMetaData: - pmHeader: - nfType: gnb-Nokia - pmDefSchemaVsn: 2.0 - pmDefVsn: 5G19_1906_002 - pmFields: - iMeasInfoId: 2204 - iMeasType: 1 - measCollectionMethod: CC - measCondition: "This measurement is updated when X2AP: SgNB Modification Required message is sent to MeNB - with the SCG Change Indication set as PSCellChange." - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change attempts." - measFamily: NINFC - measInfoId: "NR Intra Frequency PSCell Change" - measLastChange: 5G18A_1807_003 - measObjClass: NGCELL - measResultRange: 0-4096 - measResultType: integer - measResultUnits: number - measType: VS.NINFC.IntraFrPscelChAttempt - measAdditionalFields: - vendorField1: X - vendorField2: B -... ---- -pmMetaData: - pmHeader: - nfType: gnb-Nokia - pmDefSchemaVsn: 2.0 - pmDefVsn: 5G19_1906_002 - pmFields: - iMeasInfoId: 2204 - iMeasType: 2 - measCollectionMethod: CC - measCondition: "This measurement is updated when the TDCoverall timer has elapsed before gNB receives the X2AP: SgNB Modification Confirm message." - measDescription: "This measurement the number of intra gNB intra frequency PSCell change failures due to TDCoverall timer expiry." - measFamily: NINFC - measInfoId: "NR Intra Frequency PSCell Change" - measLastChange: 5G18A_1807_003 - measObjClass: NGCELL - measResultRange: 0-4096 - measResultType: float - measResultUnits: number - measType: VS.NINFC.IntraFrPscelChFailTdcExp - measAdditionalFields: - vendorField1: - - Y - - X -... ---- -pmMetaData: - pmHeader: - nfType: gnb-Nokia - pmDefSchemaVsn: 2.0 - pmDefVsn: 5G19_1906_002 - pmFields: - iMeasInfoId: 2206 - iMeasType: 1 - measCondition: "This measurement is updated when MeNB replies to X2AP: SgNB Modification Required message with the X2AP: SgNB Modification Refuse message." - measCollectionMethod: CC - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change failures due to MeNB refusal." - measFamily: NINFC - measInfoId: "NR Intra Frequency PSCell Change" - measLastChange: 5G19_1906_002 - measObjClass: NGCELL - measResultRange: 0-4096 - measResultType: float - measChangeType: added - measResultUnits: number - measType: VS.NINFC.IntraFrPscelChFailMenbRef - measAdditionalFields: - vendorField1: - - Z - - A - vendorField2: A -... ---- -pmMetaData: - pmHeader: - nfType: gnb-Nokia - pmDefSchemaVsn: 2.0 - pmDefVsn: 5G19_1906_002 - pmFields: - iMeasInfoId: 2206 - iMeasType: 1 - measCondition: "This measurement is updated when MeNB replies to X2AP: SgNB Modification Required message with the X2AP: SgNB Modification Refuse message." - measCollectionMethod: CC - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change failures due to MeNB refusal." - measFamily: NINFC - measInfoId: "NR Intra Frequency PSCell Change" - measLastChange: 5G19_1906_002 - measObjClass: NGCELL - measResultRange: 0-4096 - measResultType: float - measChangeType: added - measResultUnits: number - measType: VS.NINFC.IntraFrPscelChFailMenbRef - measAdditionalFields: - vendorField1: - - X - - Y - vendorField2: A -... diff --git a/csarvalidation/src/test/resources/yaml_schema/PM_Dictionary_JSON_Style.yaml b/csarvalidation/src/test/resources/yaml_schema/PM_Dictionary_JSON_Style.yaml deleted file mode 100644 index f4cbddf..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/PM_Dictionary_JSON_Style.yaml +++ /dev/null @@ -1,239 +0,0 @@ ---- -# PM Dictionary schema specifying and describing the meta information -# used to define perf3gpp measurements in the PM Dictionary -pmMetaData: { presence: required, structure: { - pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "NF type; should match the nfName-vendor string used in - the fileReady or perf3gpp eventName" - }, - pmDefSchemaVsn: { - presence: required, - value: 2.0, - comment: "PM Dictionary Schema Version from the VES Event - Registration specification" - }, - pmDefVsn: { - presence: required, - comment: "vendor-defined PM Dictionary version" - } - } - }, - pmFields: { - presence: required, - structure: { - iMeasInfoId: { - presence: required, - comment: "vendor-defined integer measurement group identifier" - }, - iMeasType: { - presence: required, - comment: "vendor-defined integer identifier for the measType; - must be combined with measInfoId to identify a - specific measurement." - }, - measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "indicates the type of change that occurred during - measLastChange" - }, - measCollectionMethod: { - presence: required, - value: [CC, SI, DER, Gauge, Average], - comment: "the measurement collection method; CC, SI, DER and - Gauge are as defined in 3GPP; average contains the - average value of the measurement during the - granularity period" - }, - measCondition: { - presence: required, - comment: "description of the condition causing the measurement" - }, - measDescription: { - presence: required, - comment: "description of the measurement information - and purpose" - }, - measFamily: { - presence: required, - comment: "abbreviation for a family of measurements, in - 3GPP format, or vendor defined" - }, - measInfoId: { - presence: required, - comment: "name for a group of related measurements in - 3GPP format or vendor defined" - }, - measLastChange: { - presence: required, - comment: "version of the PM Dictionary the last time this - measurement was added, modified or deleted" - }, - measObjClass: { - presence: required, - value: [NGBTS, NGCELL, IPNO, IPSEC, ETHIF], - comment: "measurement object class" - }, - measResultRange: { - presence: optional, - comment: "range of the measurement result; only necessary when - the range is smaller than the full range of the - data type" - }, - measResultType: { - presence: required, - value: [float, uint32, uint64], - comment: "data type of the measurement result" - }, - measResultUnits: { - presence: required, - value: [seconds, minutes, nanoseconds, microseconds, dB, - number, kilobytes, bytes, ethernetFrames, - packets, users], - comment: "units of measure for the measurement result" - }, - measType: { - presence: required, - comment: "measurement name in 3GPP or vendor-specific format; - vendor specific names are preceded with VS" - }, - measAdditionalFields: { - presence: required, - comment: "vendor-specific PM Dictionary fields", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendor field 1 description" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendor field 2 description." - } - } - } - } - } -}} -... -# PM Dictionary perf3gpp measurements for the gnb-Nokia NF (bracket style yaml) ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2204, - iMeasType: 1, - - measCollectionMethod: CC, - measCondition: "This measurement is updated when X2AP: SgNB Modification Required message is sent to MeNB - with the SCG Change Indication set as PSCellChange.", - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change attempts.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G18A_1807_003, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: integer, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChAttempt, - measAdditionalFields: { - vendorField1: X, - vendorField2: B - } - } -} -... ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2204, - iMeasType: 2, - measCollectionMethod: CC, - measCondition: "This measurement is updated when the TDCoverall timer has elapsed before gNB receives the X2AP: SgNB Modification Confirm message.", - measDescription: "This measurement the number of intra gNB intra frequency PSCell change failures due to TDCoverall timer expiry.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G18A_1807_003, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: float, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChFailTdcExp, - measAdditionalFields: { - vendorField1: [Y,Z] - } - } -} -... ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2206, - iMeasType: 1, - measCondition: "This measurement is updated when MeNB replies to X2AP: SgNB Modification Required message with the X2AP: SgNB Modification Refuse message.", - measCollectionMethod: CC, - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change failures due to MeNB refusal.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G19_1906_002, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: float, - measChangeType: added, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChFailMenbRef, - measAdditionalFields: { - vendorField1: [Z,A], - vendorField2: A - } - } -} -... ---- -pmMetaData: { - pmHeader: { - nfType: gnb-Nokia, - pmDefSchemaVsn: 2.0, - pmDefVsn: 5G19_1906_002 - }, - pmFields: { - iMeasInfoId: 2206, - iMeasType: 1, - measCondition: "This measurement is updated when MeNB replies to X2AP: SgNB Modification Required message with the X2AP: SgNB Modification Refuse message.", - measCollectionMethod: CC, - measDescription: "This counter indicates the number of intra gNB intra frequency PSCell change failures due to MeNB refusal.", - measFamily: NINFC, - measInfoId: "NR Intra Frequency PSCell Change", - measLastChange: 5G19_1906_002, - measObjClass: NGCELL, - measResultRange: 0-4096, - measResultType: float, - measChangeType: added, - measResultUnits: number, - measType: VS.NINFC.IntraFrPscelChFailMenbRef, - measAdditionalFields: { - vendorField1: [X,Y], - vendorField2: A - } - } -} -... diff --git a/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Mapping_Value.yaml b/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Mapping_Value.yaml deleted file mode 100644 index 25c72cd..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Mapping_Value.yaml +++ /dev/null @@ -1,149 +0,0 @@ ---- -# PM Dictionary schema specifying and describing the meta information -# used to define perf3gpp measurements in the PM Dictionary -pmMetaData: { presence: required, structure: { - pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "NF type; should match the nfName-vendor string used in - the fileReady or perf3gpp eventName" - }, - pmDefSchemaVsn: { - presence: required, - value: 2.0, - comment: "PM Dictionary Schema Version from the VES Event - Registration specification" - }, - pmDefVsn: { - presence: required, - comment: "vendor-defined PM Dictionary version" - } - } - }, - pmFields: { - presence: required, - structure: { - iMeasInfoId: { - presence: required, - comment: "vendor-defined integer measurement group identifier" - }, - iMeasType: { - presence: required, - comment: "vendor-defined integer identifier for the measType; - must be combined with measInfoId to identify a - specific measurement." - }, - measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "indicates the type of change that occurred during - measLastChange" - }, - measCollectionMethod: { - presence: required, - value: [CC, SI, DER, Gauge, Average], - comment: "the measurement collection method; CC, SI, DER and - Gauge are as defined in 3GPP; average contains the - average value of the measurement during the - granularity period" - }, - measCondition: { - presence: required, - comment: "description of the condition causing the measurement" - }, - measDescription: { - presence: required, - comment: "description of the measurement information - and purpose" - }, - measFamily: { - presence: required, - comment: "abbreviation for a family of measurements, in - 3GPP format, or vendor defined" - }, - measInfoId: { - presence: required, - comment: "name for a group of related measurements in - 3GPP format or vendor defined" - }, - measLastChange: { - presence: required, - comment: "version of the PM Dictionary the last time this - measurement was added, modified or deleted" - }, - measObjClass: { - presence: required, - value: [NGBTS, NGCELL, IPNO, IPSEC, ETHIF], - comment: "measurement object class" - }, - measResultRange: { - presence: optional, - comment: "range of the measurement result; only necessary when - the range is smaller than the full range of the - data type" - }, - measResultType: { - presence: required, - value: [float, uint32, uint64], - comment: "data type of the measurement result" - }, - measResultUnits: { - presence: required, - value: [seconds, minutes, nanoseconds, microseconds, dB, - number, kilobytes, bytes, ethernetFrames, - packets, users], - comment: "units of measure for the measurement result" - }, - measType: { - presence: required, - comment: "measurement name in 3GPP or vendor-specific format; - vendor specific names are preceded with VS" - }, - measAdditionalFields: { - presence: required, - comment: "vendor-specific PM Dictionary fields", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendor field 1 description" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendor field 2 description." - } - } - } - } - } -}} -... -# PM Dictionary perf3gpp measurements for the gnb-Nokia NF (bracket style yaml) ---- -pmMetaData: - pmHeader: - nfType: gnb-Nokia - pmDefSchemaVsn: 2.0 - pmDefVsn: 5G19_1906_002 - pmFields: - iMeasInfoId: 2204 - iMeasType: 1 - measCollectionMethod: CC - measCondition: This measurement is updated when X2AP: SgNB Modification Required message is sent to MeNB - with the SCG Change Indication set as PSCellChange. - measDescription: This counter indicates the number of intra gNB intra frequency PSCell change attempts. - measFamily: NINFC - measInfoId: "NR Intra Frequency PSCell Change" - measLastChange: 5G18A_1807_003 - measObjClass: NGCELL - measResultRange: 0-4096 - measResultType: integer - measResultUnits: number - measType: VS.NINFC.IntraFrPscelChAttempt - measAdditionalFields: - vendorField1: X - vendorField2: B -... diff --git a/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Schema_Construction.yaml b/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Schema_Construction.yaml deleted file mode 100644 index c5e7b7c..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Schema_Construction.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -pmMetaData: { presence: required, structure: [ - -pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "nfType comment" - } - } - }, - -pmFields: { - presence: required, - structure: { - measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "measChangeType comment" - }, - measAdditionalFields: { - presence: required, - comment: "measAdditionalFields comment", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendorField1 comment" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendorField2 comment" - } - } - } - } - } -]} -... diff --git a/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Schema_LazyLoading.yaml b/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Schema_LazyLoading.yaml deleted file mode 100644 index 7f9f946..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Simple_Invalid_Schema_LazyLoading.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -pmMetaData: { presence: required, structure: { - pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "nfType comment" - } - } - }, - pmFields: { - presence: required, - structure: [ - -measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "measChangeType comment" - }, - -measAdditionalFields: { - presence: required, - comment: "measAdditionalFields comment", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendorField1 comment" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendorField2 comment" - } - } - } - ] - } -}} -... diff --git a/csarvalidation/src/test/resources/yaml_schema/Simple_Unknown_Escape_Character.yaml b/csarvalidation/src/test/resources/yaml_schema/Simple_Unknown_Escape_Character.yaml deleted file mode 100644 index 2cac9e6..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Simple_Unknown_Escape_Character.yaml +++ /dev/null @@ -1,149 +0,0 @@ ---- -# PM Dictionary schema specifying and describing the meta information -# used to define perf3gpp measurements in the PM Dictionary -pmMetaData: { presence: required, structure: { - pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "NF type; should match the nfName-vendor string used in - the fileReady or perf3gpp eventName" - }, - pmDefSchemaVsn: { - presence: required, - value: 2.0, - comment: "PM Dictionary Schema Version from the VES Event - Registration specification" - }, - pmDefVsn: { - presence: required, - comment: "vendor-defined PM Dictionary version" - } - } - }, - pmFields: { - presence: required, - structure: { - iMeasInfoId: { - presence: required, - comment: "vendor-defined integer measurement group identifier" - }, - iMeasType: { - presence: required, - comment: "vendor-defined integer identifier for the measType; - must be combined with measInfoId to identify a - specific measurement." - }, - measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "indicates the type of change that occurred during - measLastChange" - }, - measCollectionMethod: { - presence: required, - value: [CC, SI, DER, Gauge, Average], - comment: "the measurement collection method; CC, SI, DER and - Gauge are as defined in 3GPP; average contains the - average value of the measurement during the - granularity period" - }, - measCondition: { - presence: required, - comment: "description of the condition causing the measurement" - }, - measDescription: { - presence: required, - comment: "description of the measurement information - and purpose" - }, - measFamily: { - presence: required, - comment: "abbreviation for a family of measurements, in - 3GPP format, or vendor defined" - }, - measInfoId: { - presence: required, - comment: "name for a group of related measurements in - 3GPP format or vendor defined" - }, - measLastChange: { - presence: required, - comment: "version of the PM Dictionary the last time this - measurement was added, modified or deleted" - }, - measObjClass: { - presence: required, - value: [NGBTS, NGCELL, IPNO, IPSEC, ETHIF], - comment: "measurement object class" - }, - measResultRange: { - presence: optional, - comment: "range of the measurement result; only necessary when - the range is smaller than the full range of the - data type" - }, - measResultType: { - presence: required, - value: [float, uint32, uint64], - comment: "data type of the measurement result" - }, - measResultUnits: { - presence: required, - value: [seconds, minutes, nanoseconds, microseconds, dB, - number, kilobytes, bytes, ethernetFrames, - packets, users], - comment: "units of measure for the measurement result" - }, - measType: { - presence: required, - comment: "measurement name in 3GPP or vendor-specific format; - vendor specific names are preceded with VS" - }, - measAdditionalFields: { - presence: required, - comment: "vendor-specific PM Dictionary fields", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendor field 1 description" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendor field 2 description." - } - } - } - } - } -}} -... -# PM Dictionary perf3gpp measurements for the gnb-Nokia NF (bracket style yaml) ---- -pmMetaData: - pmHeader: - nfType: gnb-Nokia - pmDefSchemaVsn: 2.0 - pmDefVsn: 5G19_1906_002 - pmFields: - iMeasInfoId: 2204 - iMeasType: 1 - measCollectionMethod: CC - measCondition: "This measurement is updated when X2AP: SgNB Modification Required message is \sent\ to MeNB - with the SCG Change Indication set as PSCellChange." - measDescription: This counter indicates the number of intra gNB intra frequency PSCell change attempts. - measFamily: NINFC - measInfoId: "NR Intra Frequency PSCell Change" - measLastChange: 5G18A_1807_003 - measObjClass: NGCELL - measResultRange: 0-4096 - measResultType: integer - measResultUnits: number - measType: VS.NINFC.IntraFrPscelChAttempt - measAdditionalFields: - vendorField1: X - vendorField2: B -... diff --git a/csarvalidation/src/test/resources/yaml_schema/Simple_Valid_Schema.yaml b/csarvalidation/src/test/resources/yaml_schema/Simple_Valid_Schema.yaml deleted file mode 100644 index a125b13..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Simple_Valid_Schema.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -pmMetaData: { presence: required, structure: { - pmHeader: { - presence: required, - structure: { - nfType: { - presence: required, - comment: "nfType comment" - } - } - }, - pmFields: { - presence: required, - structure: { - measChangeType: { - presence: required, - value: [added, modified, deleted], - comment: "measChangeType comment" - }, - measAdditionalFields: { - presence: required, - comment: "measAdditionalFields comment", - structure: { - vendorField1: { - presence: required, - value: [X, Y, Z], - comment: "vendorField1 comment" - }, - vendorField2: { - presence: optional, - value: [A, B], - comment: "vendorField2 comment" - } - } - } - } - } -}} -... diff --git a/csarvalidation/src/test/resources/yaml_schema/Simple_Valid_Schema_Multi_Root.yaml b/csarvalidation/src/test/resources/yaml_schema/Simple_Valid_Schema_Multi_Root.yaml deleted file mode 100644 index d73ca4f..0000000 --- a/csarvalidation/src/test/resources/yaml_schema/Simple_Valid_Schema_Multi_Root.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -root1: { presence: required, structure: { - field1: { - presence: required, - value: [X, Y, Z], - comment: "field 1 description" - } -}} -root2: { presence: required, structure: { - field2: { - presence: required, - value: [X, Y, Z], - comment: "field 1 description" - } -}} -root3: { presence: required, structure: { - field3: { - presence: required, - value: [X, Y, Z], - comment: "field 1 description" - } -}} -... |