Add support for retrieving apex-policyModel from metadata 63/127263/1
authorrameshiyer27 <ramesh.murugan.iyer@est.tech>
Wed, 23 Feb 2022 19:07:28 +0000 (19:07 +0000)
committerrameshiyer27 <ramesh.murugan.iyer@est.tech>
Wed, 23 Feb 2022 19:43:20 +0000 (19:43 +0000)
Apex policyModel had been provided under policy properties for apex-pdp.
Additional support included to retrieve the policyModel from metadata if PAP supplied it
as metadataSet.

Issue-ID: POLICY-3834
Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech>
Change-Id: Ic810d78cf01c507c5b4d167f28ae6f7729132238

services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameterHandler.java
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java
services/services-engine/src/test/resources/parameters/policyModelFromMetadata.json [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/policyModelFromProperties.json [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/policyModelMultiple.json [new file with mode: 0644]

index 2e97c54..72cbd28 100644 (file)
@@ -29,7 +29,9 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import org.onap.policy.apex.core.engine.EngineParameters;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.service.engine.main.ApexCommandLineArguments;
@@ -63,6 +65,7 @@ public class ApexParameterHandler {
 
     private static final String POLICY_TYPE_IMPL = "policy_type_impl";
     private static final String APEX_POLICY_MODEL = "apexPolicyModel";
+    private static final String METADATA_SET = "metadataSet";
 
     private String policyModel;
     private String apexConfig;
@@ -171,14 +174,28 @@ public class ApexParameterHandler {
                 apexConfigJsonObject.add(property.getKey(), body);
             }
             apexConfig = standardCoder.encode(apexConfigJsonObject);
+
+            // populate policyModel from metadata if present
+            Optional<Map<String, Object>> metadata =
+                Optional.ofNullable(toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
+                    .entrySet().iterator().next().getValue().getMetadata());
+            if (metadata.isPresent() && metadata.get().containsKey(METADATA_SET)) {
+                JsonElement body = standardCoder.convert(metadata.get(), JsonObject.class);
+                policyModel = extractPolicyModel(standardCoder, body);
+            }
         } catch (Exception e) {
             throw new ApexException("Parsing config and model from the tosca policy failed.", e);
         }
     }
 
     private String extractPolicyModel(StandardCoder standardCoder, JsonElement body) throws CoderException {
-        // Check for "policy_type_impl"
-        JsonElement policyTypeImplObject = ((JsonObject) body).get(POLICY_TYPE_IMPL);
+        JsonElement policyTypeImplObject = null;
+        // Check for "policy_type_impl, if not present check for "metadataSet"
+        if (body.getAsJsonObject().has(POLICY_TYPE_IMPL)) {
+            policyTypeImplObject = ((JsonObject) body).get(POLICY_TYPE_IMPL);
+        } else if (body.getAsJsonObject().has(METADATA_SET))  {
+            policyTypeImplObject = ((JsonObject) body).get(METADATA_SET);
+        }
         if (null == policyTypeImplObject) {
             return null;
         }
index a0169d7..dd76374 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2020 Nordix Foundation.
+ *  Modifications Copyright (C) 2020,2022 Nordix Foundation.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
@@ -23,6 +23,7 @@
 
 package org.onap.policy.apex.service.engine.parameters;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -78,6 +79,51 @@ public class ApexParametersTest {
             .hasMessageContaining("\"value\" value \"null\" INVALID, is blank");
     }
 
+    @Test
+    public void testPolicyModelFromMetadata() throws ParameterException {
+        // Policy Models provided only in metadata.
+        final String[] args = {"-p", "src/test/resources/parameters/policyModelFromMetadata.json"};
+        final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args);
+
+        ApexParameters parameters = new ApexParameterHandler().getParameters(arguments);
+
+        assertThat(parameters.getEngineServiceParameters().getPolicyModel()).isNotEmpty();
+        assertThat(parameters.getEngineServiceParameters().getPolicyModel())
+            .contains("{\"key\":{\"name\":\"dummy key1 provided in metadata\",\"version\":\"0.0.1\"},\"keyInformation\""
+                + ":{\"key\":{\"name\":\"dummy key2 provided in metadata\",\"version\":\"0.0.1\"}},"
+                + "\"threshold\":3.15,\"state\":\"passive\"}");
+    }
+
+    @Test
+    public void testPolicyModelFromProperties() throws ParameterException {
+        // Policy models provided in properties under EngineServiceParameters for backward compatibility
+        final String[] args = {"-p", "src/test/resources/parameters/policyModelFromProperties.json"};
+        final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args);
+
+        ApexParameters parameters = new ApexParameterHandler().getParameters(arguments);
+
+        assertThat(parameters.getEngineServiceParameters().getPolicyModel()).isNotEmpty();
+        assertThat(parameters.getEngineServiceParameters().getPolicyModel())
+            .contains("{\"key\":{\"name\":\"dummy key1 provided in properties\",\"version\":\"0.0.1\"},"
+                + "\"keyInformation\":{\"key\":{\"name\":\"dummy key2 provided in properties\","
+                + "\"version\":\"0.0.1\"}},\"threshold\":3.15,\"state\":\"passive\"}");
+    }
+
+    @Test
+    public void testPolicyModelFromPropertiesAndMetadata() throws ParameterException {
+        // Policy models provided in both properties and in metadata. policyModels in metadata takes precedence
+        final String[] args = {"-p", "src/test/resources/parameters/policyModelMultiple.json"};
+        final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args);
+
+        ApexParameters parameters = new ApexParameterHandler().getParameters(arguments);
+
+        assertThat(parameters.getEngineServiceParameters().getPolicyModel()).isNotEmpty();
+        assertThat(parameters.getEngineServiceParameters().getPolicyModel())
+            .contains("{\"key\":{\"name\":\"dummy key1 provided in metadata\",\"version\":\"0.0.1\"},"
+                + "\"keyInformation\":{\"key\":{\"name\":\"dummy key2 provided in metadata\","
+                + "\"version\":\"0.0.1\"}},\"threshold\":3.15,\"state\":\"passive\"}");
+    }
+
     @Test
     public void testGettersSetters() {
         ApexParameters pars = new ApexParameters();
diff --git a/services/services-engine/src/test/resources/parameters/policyModelFromMetadata.json b/services/services-engine/src/test/resources/parameters/policyModelFromMetadata.json
new file mode 100644 (file)
index 0000000..d7423bc
--- /dev/null
@@ -0,0 +1,89 @@
+{
+  "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+  "topology_template": {
+    "policies": [
+      {
+        "onap.policies.apex.Simplecontrolloop": {
+          "type": "onap.policies.native.Apex",
+          "type_version": "1.0.0",
+          "name": "onap.policies.apex.Simplecontrolloop",
+          "version": "1.0.0",
+          "metadata": {
+            "metadataSetName": "dummyMetadataSet",
+            "metadataSetVersion": "1.0.0",
+            "metadataSet": {
+              "apexPolicyModel": {
+                "key": {
+                  "name": "dummy key1 provided in metadata",
+                  "version": "0.0.1"
+                },
+                "keyInformation": {
+                  "key": {
+                    "name": "dummy key2 provided in metadata",
+                    "version": "0.0.1"
+                  }
+                },
+                "threshold": 3.15,
+                "state": "passive"
+              }
+            }
+          },
+          "properties": {
+            "javaProperties": [
+              [
+                "property0",
+                "property0Value"
+              ],
+              [
+                "property1",
+                "property1Value"
+              ]
+            ],
+            "engineServiceParameters": {
+              "name": "MyApexEngine",
+              "version": "0.0.1",
+              "id": 45,
+              "instanceCount": 345,
+              "deploymentPort": 65522,
+              "engineParameters": {
+                "contextParameters": {
+                  "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters"
+                },
+                "executorParameters": {
+                  "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                  }
+                }
+              }
+            },
+            "eventOutputParameters": {
+              "FirstProducer": {
+                "carrierTechnologyParameters": {
+                  "carrierTechnology": "FILE",
+                  "parameters": {
+                    "fileName": "target/aaa.json"
+                  }
+                },
+                "eventProtocolParameters": {
+                  "eventProtocol": "JSON"
+                }
+              }
+            },
+            "eventInputParameters": {
+              "MySuperDooperConsumer1": {
+                "carrierTechnologyParameters": {
+                  "carrierTechnology": "SUPER_DOOPER",
+                  "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters"
+                },
+                "eventProtocolParameters": {
+                  "eventProtocol": "SUPER_TOK_DEL",
+                  "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters"
+                }
+              }
+            }
+          }
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/services/services-engine/src/test/resources/parameters/policyModelFromProperties.json b/services/services-engine/src/test/resources/parameters/policyModelFromProperties.json
new file mode 100644 (file)
index 0000000..77f00ac
--- /dev/null
@@ -0,0 +1,85 @@
+{
+  "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+  "topology_template": {
+    "policies": [
+      {
+        "onap.policies.apex.Simplecontrolloop": {
+          "type": "onap.policies.native.Apex",
+          "type_version": "1.0.0",
+          "name": "onap.policies.apex.Simplecontrolloop",
+          "version": "1.0.0",
+          "properties": {
+            "javaProperties": [
+              [
+                "property0",
+                "property0Value"
+              ],
+              [
+                "property1",
+                "property1Value"
+              ]
+            ],
+            "engineServiceParameters": {
+              "name": "MyApexEngine",
+              "version": "0.0.1",
+              "id": 45,
+              "instanceCount": 345,
+              "deploymentPort": 65522,
+              "policy_type_impl": {
+                "apexPolicyModel": {
+                  "key": {
+                    "name": "dummy key1 provided in properties",
+                    "version": "0.0.1"
+                  },
+                  "keyInformation": {
+                    "key": {
+                      "name": "dummy key2 provided in properties",
+                      "version": "0.0.1"
+                    }
+                  },
+                  "threshold": 3.15,
+                  "state": "passive"
+                }
+              },
+              "engineParameters": {
+                "contextParameters": {
+                  "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters"
+                },
+                "executorParameters": {
+                  "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                  }
+                }
+              }
+            },
+            "eventOutputParameters": {
+              "FirstProducer": {
+                "carrierTechnologyParameters": {
+                  "carrierTechnology": "FILE",
+                  "parameters": {
+                    "fileName": "target/aaa.json"
+                  }
+                },
+                "eventProtocolParameters": {
+                  "eventProtocol": "JSON"
+                }
+              }
+            },
+            "eventInputParameters": {
+              "MySuperDooperConsumer1": {
+                "carrierTechnologyParameters": {
+                  "carrierTechnology": "SUPER_DOOPER",
+                  "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters"
+                },
+                "eventProtocolParameters": {
+                  "eventProtocol": "SUPER_TOK_DEL",
+                  "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters"
+                }
+              }
+            }
+          }
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/services/services-engine/src/test/resources/parameters/policyModelMultiple.json b/services/services-engine/src/test/resources/parameters/policyModelMultiple.json
new file mode 100644 (file)
index 0000000..dc1e2bc
--- /dev/null
@@ -0,0 +1,105 @@
+{
+  "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+  "topology_template": {
+    "policies": [
+      {
+        "onap.policies.apex.Simplecontrolloop": {
+          "type": "onap.policies.native.Apex",
+          "type_version": "1.0.0",
+          "name": "onap.policies.apex.Simplecontrolloop",
+          "version": "1.0.0",
+          "metadata": {
+            "metadataSetName": "dummyMetadataSet",
+            "metadataSetVersion": "1.0.0",
+            "metadataSet": {
+              "apexPolicyModel": {
+                "key": {
+                  "name": "dummy key1 provided in metadata",
+                  "version": "0.0.1"
+                },
+                "keyInformation": {
+                  "key": {
+                    "name": "dummy key2 provided in metadata",
+                    "version": "0.0.1"
+                  }
+                },
+                "threshold": 3.15,
+                "state": "passive"
+              }
+            }
+          },
+          "properties": {
+            "javaProperties": [
+              [
+                "property0",
+                "property0Value"
+              ],
+              [
+                "property1",
+                "property1Value"
+              ]
+            ],
+            "engineServiceParameters": {
+              "name": "MyApexEngine",
+              "version": "0.0.1",
+              "id": 45,
+              "instanceCount": 345,
+              "deploymentPort": 65522,
+              "policy_type_impl": {
+                "apexPolicyModel": {
+                  "key": {
+                    "name": "dummy key1 provided in properties",
+                    "version": "0.0.1"
+                  },
+                  "keyInformation": {
+                    "key": {
+                      "name": "dummy key2 provided in properties",
+                      "version": "0.0.1"
+                    }
+                  },
+                  "threshold": 3.15,
+                  "state": "passive"
+                }
+              },
+              "engineParameters": {
+                "contextParameters": {
+                  "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters"
+                },
+                "executorParameters": {
+                  "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                  }
+                }
+              }
+            },
+            "eventOutputParameters": {
+              "FirstProducer": {
+                "carrierTechnologyParameters": {
+                  "carrierTechnology": "FILE",
+                  "parameters": {
+                    "fileName": "target/aaa.json"
+                  }
+                },
+                "eventProtocolParameters": {
+                  "eventProtocol": "JSON"
+                }
+              }
+            },
+            "eventInputParameters": {
+              "MySuperDooperConsumer1": {
+                "carrierTechnologyParameters": {
+                  "carrierTechnology": "SUPER_DOOPER",
+                  "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters"
+                },
+                "eventProtocolParameters": {
+                  "eventProtocol": "SUPER_TOK_DEL",
+                  "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters"
+                }
+              }
+            }
+          }
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file