From 4ff3b261231274ec9f3cd957ba50108fef3e0eb5 Mon Sep 17 00:00:00 2001 From: Pamela Dragosh Date: Sun, 8 Dec 2019 17:44:31 -0500 Subject: Add SDNC naming application Requires changes to StdMatchableTranslator to go deeper when searching for matchable attributes. NOTE: will re-visit the StdMatchableTranslator at a later date in order to support more robust Policy Types. And document best practices for defining matchables. Issue-ID: POLICY-1740 Change-Id: I291cf1c2e6eba0a677a3312dd11f0e56178a805b Signed-off-by: Pamela Dragosh --- .../common/std/StdMatchableTranslator.java | 64 +++++++++++++++++++++- .../matchable/onap.policies.Test-1.0.0.yaml | 50 +++++++++++++++-- .../matchable/test.policies.input.tosca.yaml | 50 ++++++++++------- 3 files changed, 135 insertions(+), 29 deletions(-) (limited to 'applications/common/src') diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java index addb0df3..ae09ec10 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java @@ -332,20 +332,60 @@ public class StdMatchableTranslator extends StdBaseTranslator { // // Iterate the properties // + int totalWeight = findMatchableFromMap(properties, policyTypes, targetType); + LOGGER.info("Total weight is {}", totalWeight); + return Pair.of(targetType, totalWeight); + } + + @SuppressWarnings("unchecked") + protected int findMatchableFromList(List listProperties, Collection policyTypes, + TargetType targetType) { + LOGGER.info("findMatchableFromList {}", listProperties); + int totalWeight = 0; + for (Object property : listProperties) { + if (property instanceof List) { + totalWeight += findMatchableFromList((List) property, policyTypes, targetType); + } else if (property instanceof Map) { + totalWeight += findMatchableFromMap((Map) property, policyTypes, targetType); + } + } + return totalWeight; + } + + protected int findMatchableFromMap(Map properties, Collection policyTypes, + TargetType targetType) { + LOGGER.info("findMatchableFromMap {}", properties); int totalWeight = 0; for (Entry entrySet : properties.entrySet()) { // - // Find matchable properties + // Is this a matchable property? // if (isMatchable(entrySet.getKey(), policyTypes)) { LOGGER.info("Found matchable property {}", entrySet.getKey()); int weight = generateMatchable(targetType, entrySet.getKey(), entrySet.getValue()); LOGGER.info("Weight is {}", weight); totalWeight += weight; + } else { + // + // Check if we need to search deeper + // + totalWeight += checkDeeperForMatchable(entrySet.getValue(), policyTypes, targetType); } } - LOGGER.info("Total weight is {}", totalWeight); - return Pair.of(targetType, totalWeight); + return totalWeight; + } + + @SuppressWarnings("unchecked") + protected int checkDeeperForMatchable(Object property, Collection policyTypes, + TargetType targetType) { + if (property instanceof List) { + return findMatchableFromList((List) property, policyTypes, targetType); + } else if (property instanceof Map) { + return findMatchableFromMap((Map) property, policyTypes, + targetType); + } + LOGGER.info("checkDeeperForMatchable not necessary for {}", property); + return 0; } /** @@ -362,11 +402,28 @@ public class StdMatchableTranslator extends StdBaseTranslator { if (checkIsMatchableProperty(propertyName, propertiesEntry)) { return true; } + // + // Check if its a list or map + // + if (isListOrMap(propertiesEntry.getValue().getType()) + && ! isYamlType(propertiesEntry.getValue().getEntrySchema().getType())) { + LOGGER.info("need to search list or map"); + } } } + LOGGER.info("isMatchable false for {}", propertyName); return false; } + private boolean isListOrMap(String type) { + return "list".equalsIgnoreCase(type) || "map".equalsIgnoreCase(type); + } + + private boolean isYamlType(String type) { + return "string".equalsIgnoreCase(type) || "integer".equalsIgnoreCase(type) || "float".equalsIgnoreCase(type) + || "boolean".equalsIgnoreCase(type) || "timestamp".equalsIgnoreCase(type); + } + /** * checkIsMatchableProperty - checks the policy contents for matchable field. If the metadata doesn't exist, * then definitely not. If the property doesn't exist, then definitely not. Otherwise need to have a metadata @@ -665,6 +722,7 @@ public class StdMatchableTranslator extends StdBaseTranslator { LOGGER.error("parameters: {} ", this.apiRestParameters); return null; } + LOGGER.info("Successfully pulled {}", policyTypeId); // // Store it locally // diff --git a/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml b/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml index 089aad66..f44a3061 100644 --- a/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml +++ b/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml @@ -18,10 +18,10 @@ policy_types: type: integer metadata: matchable: true - nonmatachableDouble: - type: double - matchableDouble: - type: double + nonmatachableFloat: + type: float + matchableFloat: + type: float metadata: matchable: true nonmatachableBoolean: @@ -35,4 +35,44 @@ policy_types: metadata: matchable: true entry_schema: - type: string \ No newline at end of file + type: string + propertyOneMap: + type: map + entry_schema: + type: onap.datatype.level1 +data_types: + onap.datatype.one: + derived_from: tosca.datatypes.Root + properties: + oneString: + type: string + oneStringMatchable: + type: string + metadata: + matachable: true + propertyTwoList: + type: list + entry_schema: + type: onap.datatype.two + onap.datatype.two: + derived_from: tosca.datatypes.Root + properties: + twoString: + type: string + twoStringMatchable: + type: string + metadata: + matachable: true + propertyThreeMap: + type: map + entry_schema: + type: onap.datatype.three + onap.datatype.three: + derived_from: tosca.datatypes.Root + properties: + threeString: + type: string + threeStringMatchable: + type: string + metadata: + matachable: true \ No newline at end of file diff --git a/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml b/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml index 434f7a97..9a68d488 100644 --- a/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml +++ b/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml @@ -1,23 +1,31 @@ tosca_definitions_version: tosca_simple_yaml_1_0_0 topology_template: - policies: - - - Test.policy: - type: onap.policies.Test - type_version: 1.0.0 - version: 1.0.0 - metadata: - policy-id: Test.policy - policy-version: 1 - properties: - nonmatachableString: "I am NON matchable" - matchableString: "I should be matched" - nonmatachableInteger: 0 - matachableInteger: 1000 - nonmatachableDouble: 0.0 - matchableDouble: 1.1 - nonmatachableBoolean: false - matachableBoolean: true - matchableListString: - - match A - - match B \ No newline at end of file + policies: + - Test.policy: + type: onap.policies.Test + type_version: 1.0.0 + version: 1.0.0 + metadata: + policy-id: Test.policy + policy-version: 1 + properties: + nonmatachableString: I am NON matchable + matchableString: I should be matched + nonmatachableInteger: 0 + matachableInteger: 1000 + nonmatachableFloat: 0.0 + matchableFloat: 1.1 + nonmatachableBoolean: false + matachableBoolean: true + matchableListString: + - match A + - match B + propertyOneMap: + oneString: One is NOT matchable + oneStringMatchable: One should be matched + propertyTwoList: + - twoString: Two is NOT matchable + twoStringMatachable: Two should be matched + propertyThreeMap: + threeString: Three is NOT matchable + threeStringMatchable: Three should be matched \ No newline at end of file -- cgit 1.2.3-korg