summaryrefslogtreecommitdiffstats
path: root/applications/optimization/src
diff options
context:
space:
mode:
authorPamela Dragosh <pdragosh@research.att.com>2019-08-30 15:21:05 -0400
committerPamela Dragosh <pdragosh@research.att.com>2019-09-09 15:27:30 -0400
commit85b5178017e89c815af7792826f52a90814f5dba (patch)
tree1cc49f6763f1af2cab372bb75ae6b9e5391c3ad7 /applications/optimization/src
parentdc68da3c00c0a814110e0f7529365d695bff571b (diff)
Integrate using Policy Type to find Matchable
Utilize's Jim's helper class to pull from API policy types definitions so that Xacml PDP can determine which properties are "matchable". Override initialize to set translator parameters. Utilize the metadata section of ToscaProperties to store the matchable field. Updated Matchable Request to be dynamic with respect to the incoming resource attributes. Stored the policy types as JSON. Issue-ID: POLICY-1899 Change-Id: Icff3605495b0a34ebfcdfa54346095ce2d8468a4 Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
Diffstat (limited to 'applications/optimization/src')
-rw-r--r--applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java22
-rw-r--r--applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java26
-rw-r--r--applications/optimization/src/test/resources/onap.policies.Optimization-1.0.0.json66
-rw-r--r--applications/optimization/src/test/resources/onap.policies.optimization.AffinityPolicy-1.0.0.json54
-rw-r--r--applications/optimization/src/test/resources/onap.policies.optimization.DistancePolicy-1.0.0.json89
-rw-r--r--applications/optimization/src/test/resources/onap.policies.optimization.SubscriberPolicy-1.0.0.json43
-rw-r--r--applications/optimization/src/test/resources/vCPE.policies.optimization.input.tosca.yaml185
7 files changed, 435 insertions, 50 deletions
diff --git a/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java b/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java
index 91c46746..e2ab00c6 100644
--- a/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java
+++ b/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java
@@ -22,13 +22,15 @@
package org.onap.policy.xacml.pdp.application.optimization;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
import org.onap.policy.pdp.xacml.application.common.ToscaPolicyTranslator;
+import org.onap.policy.pdp.xacml.application.common.XacmlApplicationException;
import org.onap.policy.pdp.xacml.application.common.std.StdMatchableTranslator;
import org.onap.policy.pdp.xacml.application.common.std.StdXacmlApplicationServiceProvider;
import org.slf4j.Logger;
@@ -77,6 +79,21 @@ public class OptimizationPdpApplication extends StdXacmlApplicationServiceProvid
}
@Override
+ public void initialize(Path pathForData, RestServerParameters policyApiParameters)
+ throws XacmlApplicationException {
+ //
+ // Store our API parameters and path for translator so it
+ // can go get Policy Types
+ //
+ this.translator.setPathForData(pathForData);
+ this.translator.setApiRestParameters(policyApiParameters);
+ //
+ // Let our super class do its thing
+ //
+ super.initialize(pathForData, policyApiParameters);
+ }
+
+ @Override
public synchronized List<ToscaPolicyTypeIdentifier> supportedPolicyTypes() {
return Collections.unmodifiableList(supportedPolicyTypes);
}
@@ -102,6 +119,9 @@ public class OptimizationPdpApplication extends StdXacmlApplicationServiceProvid
@Override
protected ToscaPolicyTranslator getTranslator(String type) {
+ //
+ // Return translator
+ //
return translator;
}
diff --git a/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java b/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java
index 6d1afda6..a356926d 100644
--- a/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java
+++ b/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java
@@ -23,16 +23,18 @@
package org.onap.policy.xacml.pdp.application.optimization;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import com.att.research.xacml.api.Response;
-
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.Iterator;
import java.util.Properties;
import java.util.ServiceLoader;
-
import org.apache.commons.lang3.tuple.Pair;
import org.junit.BeforeClass;
import org.junit.ClassRule;
@@ -40,6 +42,7 @@ import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runners.MethodSorters;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
import org.onap.policy.common.utils.coder.CoderException;
import org.onap.policy.common.utils.coder.StandardCoder;
import org.onap.policy.common.utils.resources.TextFileUtils;
@@ -62,6 +65,11 @@ public class OptimizationPdpApplicationTest {
private static XacmlApplicationServiceProvider service;
private static StandardCoder gson = new StandardCoder();
private static DecisionRequest requestAffinity;
+ private static RestServerParameters clientParams;
+ private static String[] listPolicyTypeFiles = { "onap.policies.Optimization",
+ "onap.policies.optimization.AffinityPolicy",
+ "onap.policies.optimization.DistancePolicy",
+ "onap.policies.optimization.SubscriberPolicy"};
@ClassRule
public static final TemporaryFolder policyFolder = new TemporaryFolder();
@@ -73,6 +81,9 @@ public class OptimizationPdpApplicationTest {
*/
@BeforeClass
public static void setUp() throws Exception {
+ clientParams = mock(RestServerParameters.class);
+ when(clientParams.getHost()).thenReturn("localhost");
+ when(clientParams.getPort()).thenReturn(6969);
//
// Load Single Decision Request
//
@@ -88,6 +99,13 @@ public class OptimizationPdpApplicationTest {
propertiesFile = XacmlPolicyUtils.copyXacmlPropertiesContents("src/test/resources/xacml.properties",
properties, myCreator);
//
+ // Copy the test policy types into data area
+ //
+ for (String policy : listPolicyTypeFiles) {
+ Files.copy(Paths.get("src/test/resources", policy + "-1.0.0.json"),
+ Paths.get(policyFolder.getRoot().getAbsolutePath(), policy + "-1.0.0.json"));
+ }
+ //
// Load service
//
ServiceLoader<XacmlApplicationServiceProvider> applicationLoader =
@@ -121,7 +139,7 @@ public class OptimizationPdpApplicationTest {
// Tell it to initialize based on the properties file
// we just built for it.
//
- service.initialize(propertiesFile.toPath().getParent());
+ service.initialize(propertiesFile.toPath().getParent(), clientParams);
}
@Test
@@ -171,7 +189,7 @@ public class OptimizationPdpApplicationTest {
LOGGER.info("Decision {}", decision.getKey());
assertThat(decision.getKey()).isNotNull();
- assertThat(decision.getKey().getPolicies().size()).isEqualTo(1);
+ assertThat(decision.getKey().getPolicies().size()).isEqualTo(4);
//
// Dump it out as Json
//
diff --git a/applications/optimization/src/test/resources/onap.policies.Optimization-1.0.0.json b/applications/optimization/src/test/resources/onap.policies.Optimization-1.0.0.json
new file mode 100644
index 00000000..8ee418e2
--- /dev/null
+++ b/applications/optimization/src/test/resources/onap.policies.Optimization-1.0.0.json
@@ -0,0 +1,66 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+ "policy_types": {
+ "onap.policies.Optimization": {
+ "derived_from": "tosca.policies.Root",
+ "version": "1.0.0",
+ "description": "The base policy type for all policies that govern optimization",
+ "properties": {
+ "scope": {
+ "description": "Scope for the policy - could be for a specific release.",
+ "type": "list",
+ "metadata": {
+ "matchable": true
+ },
+ "required": true
+ },
+ "services": {
+ "description": "One or more services that the policy applies to.",
+ "type": "list",
+ "metadata": {
+ "matchable": true
+ },
+ "required": true,
+ "entry_schema": {
+ "type": "string"
+ }
+ },
+ "resources": {
+ "description": "One or more VNF resources that the policy applies to.",
+ "type": "list",
+ "metadata": {
+ "matchable": true
+ },
+ "required": true,
+ "entry_schema": {
+ "type": "string"
+ }
+ },
+ "geography": {
+ "description": "One or more geographic regions",
+ "type": "list",
+ "metadata": {
+ "matchable": true
+ },
+ "required": true,
+ "entry_schema": {
+ "type": "string",
+ "constraints": [
+ {
+ "valid_values": [
+ "US",
+ "International"
+ ]
+ }
+ ]
+ }
+ },
+ "identity": {
+ "description": "Used internally for identification",
+ "type": "string",
+ "required": true
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/applications/optimization/src/test/resources/onap.policies.optimization.AffinityPolicy-1.0.0.json b/applications/optimization/src/test/resources/onap.policies.optimization.AffinityPolicy-1.0.0.json
new file mode 100644
index 00000000..d2b1b4b7
--- /dev/null
+++ b/applications/optimization/src/test/resources/onap.policies.optimization.AffinityPolicy-1.0.0.json
@@ -0,0 +1,54 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+ "policy_types": {
+ "onap.policies.optimization.AffinityPolicy": {
+ "derived_from": "onap.policies.Optimization",
+ "version": "1.0.0",
+ "type_version": "1.0.0",
+ "properties": {
+ "applicableResources": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string",
+ "constraints": [
+ {
+ "valid_values": [
+ "any",
+ "all"
+ ]
+ }
+ ]
+ }
+ },
+ "affinityProperties": {
+ "type": "policy.data.affinityProperties_properties",
+ "required": true
+ }
+ }
+ }
+ },
+ "data_types": {
+ "policy.data.affinityProperties_properties": {
+ "derived_from": "tosca.nodes.Root",
+ "version": "1.0.0",
+ "properties": {
+ "qualifier": {
+ "type": "string",
+ "constraints": [
+ {
+ "valid_values": [
+ "same",
+ "different"
+ ]
+ }
+ ]
+ },
+ "category": {
+ "type": "string",
+ "required": true
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/applications/optimization/src/test/resources/onap.policies.optimization.DistancePolicy-1.0.0.json b/applications/optimization/src/test/resources/onap.policies.optimization.DistancePolicy-1.0.0.json
new file mode 100644
index 00000000..1b74c356
--- /dev/null
+++ b/applications/optimization/src/test/resources/onap.policies.optimization.DistancePolicy-1.0.0.json
@@ -0,0 +1,89 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+ "policy_types": {
+ "onap.policies.optimization.DistancePolicy": {
+ "derived_from": "onap.policies.Optimization",
+ "version": "1.0.0",
+ "properties": {
+ "applicableResources": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string",
+ "constraints": [
+ {
+ "valid_values": [
+ "any",
+ "all"
+ ]
+ }
+ ]
+ }
+ },
+ "distanceProperties": {
+ "type": "policy.data.distanceProperties_properties",
+ "required": true
+ }
+ }
+ }
+ },
+ "data_types": {
+ "policy.data.distanceProperties_properties": {
+ "derived_from": "tosca.nodes.Root",
+ "properties": {
+ "locationInfo": {
+ "type": "string",
+ "required": true
+ },
+ "distance": {
+ "type": "policy.data.distance_properties",
+ "required": true,
+ "entry_schema": {
+ "type": "policy.data.distance_properties"
+ }
+ }
+ }
+ },
+ "policy.data.distance_properties": {
+ "derived_from": "tosca.nodes.Root",
+ "properties": {
+ "value": {
+ "type": "string",
+ "required": true
+ },
+ "operator": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string",
+ "constraints": [
+ {
+ "valid_values": [
+ "<",
+ "<=",
+ "\n",
+ ">=",
+ "="
+ ]
+ }
+ ]
+ }
+ },
+ "unit": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string",
+ "constraints": [
+ {
+ "valid_values": [
+ "km"
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/applications/optimization/src/test/resources/onap.policies.optimization.SubscriberPolicy-1.0.0.json b/applications/optimization/src/test/resources/onap.policies.optimization.SubscriberPolicy-1.0.0.json
new file mode 100644
index 00000000..a239d829
--- /dev/null
+++ b/applications/optimization/src/test/resources/onap.policies.optimization.SubscriberPolicy-1.0.0.json
@@ -0,0 +1,43 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+ "policy_types": {
+ "onap.policies.optimization.SubscriberPolicy": {
+ "derived_from": "onap.policies.Optimization",
+ "version": "1.0.0",
+ "properties": {
+ "subscriberProperties": {
+ "type": "policy.data.subscriberProperties_properties",
+ "required": true
+ }
+ }
+ }
+ },
+ "data_types": {
+ "policy.data.subscriberProperties_properties": {
+ "derived_from": "tosca.nodes.Root",
+ "properties": {
+ "subscriberName": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string"
+ }
+ },
+ "subscriberRole": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string"
+ }
+ },
+ "provStatus": {
+ "type": "list",
+ "required": true,
+ "entry_schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/applications/optimization/src/test/resources/vCPE.policies.optimization.input.tosca.yaml b/applications/optimization/src/test/resources/vCPE.policies.optimization.input.tosca.yaml
index 2d21a571..80888149 100644
--- a/applications/optimization/src/test/resources/vCPE.policies.optimization.input.tosca.yaml
+++ b/applications/optimization/src/test/resources/vCPE.policies.optimization.input.tosca.yaml
@@ -1,91 +1,175 @@
tosca_definitions_version: tosca_simple_yaml_1_0_0
topology_template:
policies:
- -
- OSDF_CASABLANCA.Affinity_vCPE_1:
+ -
+ OSDF_CASABLANCA.Affinity_Default:
type: onap.policies.optimization.AffinityPolicy
version: 1.0.0
+ type_version: 1.0.0
metadata:
- policy-id: OSDF_CASABLANCA.Affinity_vCPE_1
+ policy-id: OSDF_CASABLANCA.Affinity_Default
policy-version: 1
properties:
+ scope: []
+ services: []
+ resources: []
+ geography: [US]
identity: affinity_vCPE
- policyScope: [vCPE, US, INTERNATIONAL, ip, vGMuxInfra, vG]
- affinityProperties:
+ applicableResources: any
+ affinityProperties:
qualifier: same
category: complex
- policyType: zone
+ -
+ OSDF_CASABLANCA.Affinity_vCPE_0:
+ type: onap.policies.optimization.AffinityPolicy
+ version: 1.0.0
+ type_version: 1.0.0
+ metadata:
+ policy-id: OSDF_CASABLANCA.Affinity_vCPE_0
+ policy-version: 1
+ properties:
+ scope: []
+ services: [vCPE]
+ resources: []
+ geography: [US]
+ identity: affinity_vCPE
+ applicableResources: any
+ affinityProperties:
+ qualifier: different
+ category: complex
+ -
+ OSDF_CASABLANCA.Affinity_vCPE_1:
+ type: onap.policies.optimization.AffinityPolicy
+ version: 1.0.0
+ type_version: 1.0.0
+ metadata:
+ policy-id: OSDF_CASABLANCA.Affinity_vCPE_1
+ policy-version: 1
+ properties:
+ scope: [gold, platinum]
+ services: [vCPE]
resources: [vGMuxInfra, vG]
+ geography: [US, INTERNATIONAL]
+ identity: affinity_vCPE
+ applicableResources: any
+ affinityProperties:
+ qualifier: same
+ category: availabilityZone
-
OSDF_CASABLANCA.Capacity_vG_1:
type: onap.policies.optimization.Vim_fit
version: 1.0.0
+ type_version: 1.0.0
metadata:
policy-id: OSDF_CASABLANCA.Capacity_vG_1
policy-version: 1
properties:
- identity: capacity_vG
- policyScope: [VCPE, US, INTERNATIONAL, ip, vG]
+ scope: []
+ services: [vCPE]
resources: [vG]
- capacityProperty:
+ geography: [US, INTERNATIONAL]
+ identity: capacity_vG
+ applicableResources: any
+ capacityProperty:
controller: multicloud
request: "{\"vCPU\": 10, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}"
- policyType: vim_fit
- applicableResources: any
-
OSDF_CASABLANCA.Distance_vG_1:
type: onap.policies.optimization.DistancePolicy
version: 1.0.0
+ type_version: 1.0.0
metadata:
policy-id: OSDF_CASABLANCA.Distance_vG_1
policy-version: 1
properties:
- distanceProperties:
+ scope: [platinum]
+ services: [vCPE]
+ resources: [vG]
+ geography: [US, INTERNATIONAL]
+ identity: distance-vG
+ applicableResources: any
+ distanceProperties:
locationInfo: customer_loc
- distance:
+ distance:
value: 1500
operator: "<"
unit: km
- identity: "distance-vG"
- resources: [vG]
- policyScope: [vCPE, US, INTERNATIONAL, ip, vG]
- policyType: distance_to_location
- applicableResources: any
-
OSDF_CASABLANCA.hpa_policy_vG_1:
type: onap.policies.optimization.HpaPolicy
version: 1.0.0
+ type_version: 1.0.0
metadata:
policy-id: OSDF_CASABLANCA.hpa_policy_vG_1
policy-version: 1
properties:
+ scope: []
+ services: [vCPE]
resources: [vG]
- identity: "hpa-vG"
- policyScope: [vCPE, US, INTERNATIONAL, ip, vG]
- policyType: hpa
- # NONE OF THE FLAVORFEATURES CAME OUT RIGHT
+ geography: []
+ identity: hpa-vG
+ flavorFeatures:
+ -
+ id: vg_1
+ type: vnfc
+ directives:
+ - type: flavor_directives
+ attributes:
+ - attribute_name: flavor_label_vm_01
+ attribute_value: ""
+ flavorProperties:
+ -
+ hpa-feature: basicCapabilities
+ mandatory: True
+ architecture: generic
+ directives: []
+ hpa-feature-attributes:
+ - hpa-attribute-key: numVirtualCpu
+ hpa-attribute-value: 6
+ operator: ['>=']
+ unit: ""
+ - hpa-attribute-key: virtualMemSize
+ hpa-attribute-value: 4
+ operator: ['<=']
+ unit: ""
+ -
+ hpa-feature: ovsDpdk
+ mandatory: False
+ architecture: generic
+ directives: []
+ hpa-feature-attributes:
+ - hpa-attribute-key: dataProcessingAccelerationLibrary
+ hpa-attribute-value: ovsDpdk_version
+ operator: [=]
+ unit: ""
-
OSDF_CASABLANCA.queryPolicy_vCPE:
type: onap.policies.optimization.QueryPolicy
version: 1.0.0
+ type_version: 1.0.0
metadata:
policy-id: OSDF_CASABLANCA.queryPolicy_vCPE
policy-version: 1
properties:
- queryProperties:
- -
+ scope: []
+ services: [vCPE]
+ resources: [vGMuxInfra, vG]
+ geography: [US, INTERNATIONAL]
+ identity: vCPE_Query_Policy
+ queryProperties:
+ -
attribute: locationId
attribute_location: customerLocation
value: ""
- -
+ -
attribute: id
attribute_location: "vpnInfo.vpnId"
value: ""
- -
+ -
attribute: upstreamBW
attribute_location: "vpnInfo.upstreamBW"
value: ""
- -
+ -
attribute: customerLatitude
attribute_location: customerLatitude
value: 1.1
@@ -93,45 +177,56 @@ topology_template:
attribute: customerLongitude
attribute_location: customerLongitude
value: 2.2
- serviceName: vCPE
- policyScope: [vCPE, US, INTERNATIONAL, ip, vGMuxInfra, vG]
- policyType: request_param_query
- identity: vCPE_Query_Policy
-
-
OSDF_CASABLANCA.SubscriberPolicy_v1:
type: onap.policies.optimization.SubscriberPolicy
version: 1.0.0
+ type_version: 1.0.0
metadata:
policy-id: OSDF_CASABLANCA.SubscriberPolicy_v1
policy-version: 1
properties:
+ scope: []
+ services: [vCPE]
identity: subscriber_vCPE
- policyScope: [vCPE, subscriber_x, subscriber_y, subscriberPolicy]
- properties:
+ properties:
subscriberName: [subscriber_x, subscriber_y]
- subscriberRole: ["PVT Homing"]
+ subscriberRole: [platinum]
+ provStatus: [CAPPED]
+ -
+ OSDF_CASABLANCA.SubscriberPolicy_v2:
+ type: onap.policies.optimization.SubscriberPolicy
+ version: 1.0.0
+ type_version: 1.0.0
+ metadata:
+ policy-id: OSDF_CASABLANCA.SubscriberPolicy_v2
+ policy-version: 1
+ properties:
+ scope: []
+ services: [vCPE]
+ identity: subscriber_vCPE
+ properties:
+ subscriberName: [subscriber_a, subscriber_b]
+ subscriberRole: [gold]
provStatus: [CAPPED]
- policyType: subscriberPolicy
- serviceName: vCPE
-
OSDF_CASABLANCA.vnfPolicy_vG:
type: onap.policies.optimization.VnfPolicy
version: 1.0.0
+ type_version: 1.0.0
metadata:
policy-id: OSDF_CASABLANCA.vnfPolicy_vG
policy-version: 1
properties:
- identity: vnf_vG
- policyScope: [vCPE, US, INTERNATIONAL, ip, vG]
- policyType: vnfPolicy
+ scope: []
+ services: [vCPE]
resources: [vG]
+ geography: [US, INTERNATIONAL]
+ identity: vnf_vG
applicableResources: any
- vnfProperties:
- -
+ vnfProperties:
+ -
inventoryProvider: aai
serviceType: ""
- inventoryType: cloud
+ inventoryType: cloudRegionId
customerId: ""
- orchestrationStatus: ""
- equipmentRole: "" \ No newline at end of file