summaryrefslogtreecommitdiffstats
path: root/artifactbroker/plugins/forwarding-plugins
diff options
context:
space:
mode:
authorBin Yang <bin.yang@windriver.com>2019-04-04 09:24:37 +0000
committerGerrit Code Review <gerrit@onap.org>2019-04-04 09:24:37 +0000
commit9e91e644956951197e321b1b2a3cd2ec03a74ef0 (patch)
tree1041ccb9c123a6bfcc360cc179811a87bedf4ffe /artifactbroker/plugins/forwarding-plugins
parent012a14db776e9a6c24acecec2e46dac2b8611b65 (diff)
parent999748a64e72b9a7975ddac3406eb95a0b9aeaff (diff)
Merge "add subplug for k8s to invoke Artifact forward support"
Diffstat (limited to 'artifactbroker/plugins/forwarding-plugins')
-rw-r--r--artifactbroker/plugins/forwarding-plugins/pom.xml61
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarder.java207
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarderParameterGroup.java181
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpPolicyAdapter.java53
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/AbstractXacmlPdpPolicyAdapter.java54
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/XacmlPdpOptimizationPolicyAdapter.java54
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderParameterGroupTest.java98
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderTest.java333
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyReceptionHandler.java37
-rw-r--r--artifactbroker/plugins/forwarding-plugins/src/test/resource/modules.json95
10 files changed, 1173 insertions, 0 deletions
diff --git a/artifactbroker/plugins/forwarding-plugins/pom.xml b/artifactbroker/plugins/forwarding-plugins/pom.xml
new file mode 100644
index 0000000..9ceab89
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/pom.xml
@@ -0,0 +1,61 @@
+<!--
+ ============LICENSE_START=======================================================
+ Copyright (C) 2018 Ericsson. 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.
+
+ SPDX-License-Identifier: Apache-2.0
+ ============LICENSE_END=========================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.multicloud.framework</groupId>
+ <artifactId>multicloud-framework-artifactbroker-plugins</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>multicloud-framework-artifactbroker-forwarding-plugins</artifactId>
+ <name>${project.artifactId}</name>
+ <description>[${project.parent.artifactId}] module contains plugins for forwarding of policies.</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.multicloud.framework</groupId>
+ <artifactId>multicloud-framework-artifactbroker-forwarding</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.multicloud.framework</groupId>
+ <artifactId>multicloud-framework-artifactbroker-main</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.policy.engine</groupId>
+ <artifactId>PolicyEngineAPI</artifactId>
+ <version>${policy.engine.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>eclipselink</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <scope>test</scope>
+ <version>1.10.19</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarder.java b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarder.java
new file mode 100644
index 0000000..906827c
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarder.java
@@ -0,0 +1,207 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.FileEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.util.EntityUtils;
+
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.common.parameters.ParameterService;
+import org.onap.policy.distribution.forwarding.ArtifactForwarder;
+import org.onap.policy.distribution.forwarding.xacml.pdp.adapters.XacmlPdpOptimizationPolicyAdapter;
+import org.onap.policy.distribution.model.PolicyInput;
+import org.onap.policy.distribution.model.CloudArtifact;
+import org.onap.policy.distribution.model.VfModuleModel;
+import org.onap.sdc.api.notification.IArtifactInfo;
+import org.springframework.http.HttpStatus;
+
+
+/**
+ * Forwards policies to the XACML PDP.
+ */
+public class XacmlPdpArtifactForwarder implements ArtifactForwarder {
+
+ private static final Logger LOGGER = FlexLogger.getLogger(XacmlPdpArtifactForwarder.class);
+ private static final String BASE_PATH = "http://localhost:8081/v1/rb/definition";
+ private static final String CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT = "CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT";
+ private Map<String, IArtifactInfo> artifactMap;
+
+ private XacmlPdpArtifactForwarderParameterGroup configurationParameters = null;
+
+
+
+ @Override
+ public void forward(PolicyInput policyInput) {
+ if (policyInput instanceof CloudArtifact) {
+ System.out.println("get a CloudArtifact !");
+ CloudArtifact cloudArtifact = (CloudArtifact) policyInput;
+ artifactMap = cloudArtifact.getArtifactTypeMap();
+ System.out.println("the artifactMap = " + artifactMap);
+ ArrayList<VfModuleModel> vfModuleModels = cloudArtifact.getVfModulePayload();
+ System.out.println("the size of vfModule = " + vfModuleModels.size());
+
+ for (VfModuleModel vfModule : vfModuleModels) {
+ forwardAndUpload(vfModule);
+ }
+ } else {
+ System.out.println("NOT a CloudArtifact type !");
+ return;
+ }
+ }
+
+ private void forwardAndUpload(VfModuleModel vfModule) {
+
+ System.out.println("before create type !");
+ boolean definitionCreated = createDefinition(vfModule);
+ System.out.println(" after create type !");
+ if (definitionCreated) {
+ uploadArtifact(vfModule);
+ }
+ }
+
+ private boolean createDefinition(VfModuleModel vfModule) {
+ try {
+ HttpPost httpPost = new HttpPost(BASE_PATH);
+ httpPost.addHeader("Accept", "application/json");
+ httpPost.addHeader("Content-Type", "application/json");
+
+ Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
+ .create();
+
+ Map<String, Object> map = new LinkedHashMap<String, Object>();
+ map.put("rb-name", vfModule.getVfModuleModelName());
+ map.put("rb-version", vfModule.getVfModuleModelVersion());
+ map.put("descritpion",vfModule.getVfModuleModelDescription());
+ Map<String, String> labelMap = new LinkedHashMap<String, String>();
+ labelMap.put("vnf_customization_uuid",vfModule.getVfModuleModelCustomizationUUID());
+ map.put("labels", labelMap);
+ String json = gson.toJson(map);
+
+ StringEntity entity = new StringEntity(json);
+ httpPost.setEntity(entity);
+ return invokeHttpPost("definition", httpPost);
+ } catch (Exception e) {
+ System.out.println("create definition error");
+ return false;
+ }
+
+ }
+
+ private boolean uploadArtifact(VfModuleModel vfModule) {
+ String url = BASE_PATH + "/" + vfModule.getVfModuleModelName() + "/"
+ + vfModule.getVfModuleModelVersion() + "/content";
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.addHeader("content-type", "application/x-www-form-urlencoded;charset=utf-8");
+
+ List<String> artifacts = vfModule.getArtifacts();
+ System.out.println("artifacts = " + artifacts);
+
+ String cloudUuid = null;
+ IArtifactInfo cloudArtifact = null;
+ boolean found = false;
+
+ for (String artifact: artifacts) {
+ if ( artifactMap.get(artifact) != null &&
+ artifactMap.get(artifact).getArtifactType().equals("CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT")) {
+ cloudArtifact = artifactMap.get(artifact);
+ cloudUuid = cloudArtifact.getArtifactUUID();
+ found = true;
+ break;
+ }
+ }
+
+ if ( found == false ) {
+ System.out.println(" meets error , no CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT type found ");
+ return false;
+ }
+ String cloudArtifactPath = "/data/" + vfModule.getVfModuleModelCustomizationUUID()
+ + "/" + cloudArtifact.getArtifactName();
+ File file = new File(cloudArtifactPath);
+ FileEntity entity = new FileEntity(file);
+ httpPost.setEntity(entity);
+
+ return invokeHttpPost("uploading", httpPost);
+ }
+
+
+ @Override
+ public void configure(String parameterGroupName) {
+ configurationParameters = ParameterService.get(parameterGroupName);
+ }
+
+ protected static boolean invokeHttpPost(String action, HttpPost httpPost) {
+ System.out.println("httpPost begin!");
+ boolean ret = false;
+
+ String errorMsg;
+ label1: {
+ try ( CloseableHttpClient httpClient = HttpClients.createDefault() ) {
+ System.out.println("result1") ;
+ CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
+ System.out.println("result2") ;
+ String result = EntityUtils.toString(closeableHttpResponse.getEntity());
+ System.out.println("result = {}" + result);
+ System.out.println("status = {}"+ closeableHttpResponse.getStatusLine().getStatusCode());
+ if ( closeableHttpResponse.getStatusLine().getStatusCode() != 200 ) {
+ System.out.println("exception: ret= " + closeableHttpResponse.getStatusLine().getStatusCode());
+ } else {
+ ret = true;
+ }
+
+ closeableHttpResponse.close();
+ break label1;
+ } catch (IOException var) {
+ errorMsg = action + ":httpPostWithJSON connect faild";
+ System.out.println("exception: POST_CONNECT_FAILD : {}" + errorMsg);
+ }
+ }
+
+ System.out.println("httpPost end!");
+ return ret;
+ }
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarderParameterGroup.java b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarderParameterGroup.java
new file mode 100644
index 0000000..d04bb3c
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarderParameterGroup.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp;
+
+import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.common.utils.validation.ParameterValidationUtils;
+import org.onap.policy.distribution.main.parameters.ArtifactForwarderConfigurationParameterGroup;
+
+/**
+ * Holds the parameters for the{@link XacmlPdpArtifactForwarder}.
+ */
+public class XacmlPdpArtifactForwarderParameterGroup extends ArtifactForwarderConfigurationParameterGroup {
+ public static final String POLICY_FORWARDER_PLUGIN_CLASS = XacmlPdpArtifactForwarder.class.getCanonicalName();
+
+ private boolean useHttps;
+ private String hostname;
+ private int port;
+ private String userName;
+ private String password;
+ private String clientAuth;
+ private boolean isManaged;
+ private String pdpGroup;
+
+ /**
+ * Construct an instance.
+ *
+ * @param builder the builder create the instance from
+ */
+ private XacmlPdpArtifactForwarderParameterGroup(final XacmlPdpArtifactForwarderParameterGroupBuilder builder) {
+ this.useHttps = builder.useHttps;
+ this.hostname = builder.hostname;
+ this.port = builder.port;
+ this.userName = builder.userName;
+ this.password = builder.password;
+ this.clientAuth = builder.clientAuth;
+ this.isManaged = builder.isManaged;
+ this.pdpGroup = builder.pdpGroup;
+ }
+
+ public boolean isUseHttps() {
+ return useHttps;
+ }
+
+ public String getHostname() {
+ return hostname;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public String getClientAuth() {
+ return clientAuth;
+ }
+
+ public boolean isManaged() {
+ return isManaged;
+ }
+
+ public String getPdpGroup() {
+ return pdpGroup;
+ }
+
+ /**
+ * Builder for XacmlPdpArtifactForwarderParameterGroup.
+ */
+ public static class XacmlPdpArtifactForwarderParameterGroupBuilder {
+ private boolean useHttps = false;
+ private String hostname;
+ private int port;
+ private String userName;
+ private String password;
+ private String clientAuth;
+ private boolean isManaged = true;
+ private String pdpGroup;
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setUseHttps(final boolean useHttps) {
+ this.useHttps = useHttps;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setHostname(final String hostname) {
+ this.hostname = hostname;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setPort(final int port) {
+ this.port = port;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setUserName(final String userName) {
+ this.userName = userName;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setPassword(final String password) {
+ this.password = password;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setClientAuth(final String clientAuth) {
+ this.clientAuth = clientAuth;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setIsManaged(final boolean isManaged) {
+ this.isManaged = isManaged;
+ return this;
+ }
+
+ public XacmlPdpArtifactForwarderParameterGroupBuilder setPdpGroup(final String pdpGroup) {
+ this.pdpGroup = pdpGroup;
+ return this;
+ }
+
+ /**
+ * Creates a new XacmlPapServletArtifactForwarderParameterGroup instance.
+ */
+ public XacmlPdpArtifactForwarderParameterGroup build() {
+ return new XacmlPdpArtifactForwarderParameterGroup(this);
+ }
+ }
+
+ @Override
+ public GroupValidationResult validate() {
+ final GroupValidationResult validationResult = new GroupValidationResult(this);
+ if (!ParameterValidationUtils.validateStringParameter(hostname)) {
+ validationResult.setResult("hostname", ValidationStatus.INVALID,
+ "must be a non-blank string containing hostname/ipaddress");
+ }
+ if (!ParameterValidationUtils.validateIntParameter(port)) {
+ validationResult.setResult("port", ValidationStatus.INVALID, "must be a positive integer containing port");
+ }
+ if (!ParameterValidationUtils.validateStringParameter(userName)) {
+ validationResult.setResult("userName", ValidationStatus.INVALID,
+ "must be a non-blank string containing userName");
+ }
+ if (!ParameterValidationUtils.validateStringParameter(password)) {
+ validationResult.setResult("password", ValidationStatus.INVALID,
+ "must be a non-blank string containing password");
+ }
+ if (!ParameterValidationUtils.validateStringParameter(clientAuth)) {
+ validationResult.setResult("clientAuth", ValidationStatus.INVALID,
+ "must be a non-blank string containing clientAuth");
+ }
+ if (!ParameterValidationUtils.validateStringParameter(pdpGroup)) {
+ validationResult.setResult("pdpGroup", ValidationStatus.INVALID,
+ "must be a non-blank string containing pdpGroup");
+ }
+ return validationResult;
+ }
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpPolicyAdapter.java b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpPolicyAdapter.java
new file mode 100644
index 0000000..c50eac1
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpPolicyAdapter.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp;
+
+import org.onap.policy.api.PolicyParameters;
+import org.onap.policy.api.PushPolicyParameters;
+import org.onap.policy.distribution.model.Policy;
+
+/**
+ * Adapts {@link Policy} objects to objects compatible with the XACML PDP API.
+ */
+public interface XacmlPdpPolicyAdapter<T extends Policy> {
+
+ /**
+ * Get the policy.
+ *
+ * @return the policy
+ */
+ T getPolicy();
+
+ /**
+ * Get as a {@link PolicyParameters} object.
+ *
+ * @returna {@link PolicyParameters} object
+ */
+ PolicyParameters getAsPolicyParameters();
+
+ /**
+ * Get as a {@link PushPolicyParameters} object.
+ *
+ * @returna {@link PushPolicyParameters} object
+ */
+ PushPolicyParameters getAsPushPolicyParameters(final String pdpGroups);
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/AbstractXacmlPdpPolicyAdapter.java b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/AbstractXacmlPdpPolicyAdapter.java
new file mode 100644
index 0000000..c136516
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/AbstractXacmlPdpPolicyAdapter.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp.adapters;
+
+import org.onap.policy.api.PushPolicyParameters;
+import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyAdapter;
+import org.onap.policy.distribution.model.Policy;
+
+/**
+ * Base class for {@link XacmlPdpPolicyAdapter} implementations.
+ *
+ * @param <T> the type of policy the adapter handles
+ */
+public abstract class AbstractXacmlPdpPolicyAdapter<T extends Policy> implements XacmlPdpPolicyAdapter<T> {
+
+ private T policy;
+
+ protected AbstractXacmlPdpPolicyAdapter(T policy) {
+ this.policy = policy;
+ }
+
+ @Override
+ public T getPolicy() {
+ return policy;
+ }
+
+ @Override
+ public PushPolicyParameters getAsPushPolicyParameters(String pdpGroups) {
+ PushPolicyParameters pushPolicyParameters = new PushPolicyParameters();
+ pushPolicyParameters.setPolicyName(policy.getPolicyName());
+ pushPolicyParameters.setPolicyType(policy.getPolicyType());
+ pushPolicyParameters.setPdpGroup(pdpGroups);
+ return pushPolicyParameters;
+ }
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/XacmlPdpOptimizationPolicyAdapter.java b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/XacmlPdpOptimizationPolicyAdapter.java
new file mode 100644
index 0000000..1ec654f
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/XacmlPdpOptimizationPolicyAdapter.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp.adapters;
+
+import org.onap.policy.api.PolicyConfigType;
+import org.onap.policy.api.PolicyParameters;
+import org.onap.policy.distribution.model.OptimizationPolicy;
+
+/**
+ * Adapts {@link OptimizationPolicy} objects to objects compatible with the XACML PDP API.
+ */
+public class XacmlPdpOptimizationPolicyAdapter extends AbstractXacmlPdpPolicyAdapter<OptimizationPolicy> {
+
+ /**
+ * Create an instance to adapt the given {@link OptimizationPolicy}.
+ *
+ * @param optimizationPolicy the {@link OptimizationPolicy} to be adapted
+ */
+ public XacmlPdpOptimizationPolicyAdapter(final OptimizationPolicy optimizationPolicy) {
+ super(optimizationPolicy);
+ }
+
+ @Override
+ public PolicyParameters getAsPolicyParameters() {
+ PolicyParameters policyParameters = new PolicyParameters();
+ policyParameters.setPolicyName(getPolicy().getPolicyName());
+ policyParameters.setPolicyDescription(getPolicy().getPolicyDescription());
+ policyParameters.setPolicyConfigType(PolicyConfigType.valueOf(getPolicy().getPolicyConfigType()));
+ policyParameters.setOnapName(getPolicy().getOnapName());
+ policyParameters.setRiskLevel(getPolicy().getRiskLevel());
+ policyParameters.setConfigBody(getPolicy().getConfigBody());
+ policyParameters.setRiskType(getPolicy().getRiskType());
+ return policyParameters;
+ }
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderParameterGroupTest.java b/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderParameterGroupTest.java
new file mode 100644
index 0000000..d10ea62
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderParameterGroupTest.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp.engine;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpArtifactForwarderParameterGroup;
+import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpArtifactForwarderParameterGroup.XacmlPdpArtifactForwarderParameterGroupBuilder;
+
+public class XacmlPdpArtifactForwarderParameterGroupTest {
+
+ @Test
+ public void testBuilderAndGetters() {
+ XacmlPdpArtifactForwarderParameterGroupBuilder builder =
+ new XacmlPdpArtifactForwarderParameterGroupBuilder();
+ XacmlPdpArtifactForwarderParameterGroup configurationParameters =
+ builder.setUseHttps(true).setHostname("10.10.10.10").setPort(1234).setUserName("myUser")
+ .setPassword("myPassword").setClientAuth("myClientAuth").setIsManaged(false).build();
+
+ assertTrue(configurationParameters.isUseHttps());
+ assertEquals("10.10.10.10", configurationParameters.getHostname());
+ assertEquals(1234, configurationParameters.getPort());
+ assertEquals("myUser", configurationParameters.getUserName());
+ assertEquals("myPassword", configurationParameters.getPassword());
+ assertEquals("myClientAuth", configurationParameters.getClientAuth());
+ assertFalse(configurationParameters.isManaged());
+ }
+
+ @Test
+ public void testInvalidHostName() {
+ XacmlPdpArtifactForwarderParameterGroupBuilder builder =
+ new XacmlPdpArtifactForwarderParameterGroupBuilder();
+ XacmlPdpArtifactForwarderParameterGroup configurationParameters = builder.setUseHttps(true).setHostname("")
+ .setPort(1234).setUserName("myUser").setPassword("myPassword").setIsManaged(false).build();
+ configurationParameters.setName("myConfiguration");
+
+ assertEquals(ValidationStatus.INVALID, configurationParameters.validate().getStatus());
+ }
+
+ @Test
+ public void testInvalidPort() {
+ XacmlPdpArtifactForwarderParameterGroupBuilder builder =
+ new XacmlPdpArtifactForwarderParameterGroupBuilder();
+ XacmlPdpArtifactForwarderParameterGroup configurationParameters =
+ builder.setUseHttps(true).setHostname("10.10.10.10").setPort(-1234).setUserName("myUser")
+ .setPassword("myPassword").setIsManaged(false).build();
+ configurationParameters.setName("myConfiguration");
+
+ assertEquals(ValidationStatus.INVALID, configurationParameters.validate().getStatus());
+ }
+
+ @Test
+ public void testInvalidUserName() {
+ XacmlPdpArtifactForwarderParameterGroupBuilder builder =
+ new XacmlPdpArtifactForwarderParameterGroupBuilder();
+ XacmlPdpArtifactForwarderParameterGroup configurationParameters =
+ builder.setUseHttps(true).setHostname("10.10.10.10").setPort(1234).setUserName("")
+ .setPassword("myPassword").setIsManaged(false).build();
+ configurationParameters.setName("myConfiguration");
+
+ assertEquals(ValidationStatus.INVALID, configurationParameters.validate().getStatus());
+ }
+
+ @Test
+ public void testInvalidPassword() {
+ XacmlPdpArtifactForwarderParameterGroupBuilder builder =
+ new XacmlPdpArtifactForwarderParameterGroupBuilder();
+ XacmlPdpArtifactForwarderParameterGroup configurationParameters =
+ builder.setUseHttps(true).setHostname("10.10.10.10").setPort(1234).setUserName("myUser").setPassword("")
+ .setIsManaged(false).build();
+ configurationParameters.setName("myConfiguration");
+
+ assertEquals(ValidationStatus.INVALID, configurationParameters.validate().getStatus());
+ }
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderTest.java b/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderTest.java
new file mode 100644
index 0000000..ca2fd0d
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderTest.java
@@ -0,0 +1,333 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp.engine;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import java.io.IOException;
+import java.io.ByteArrayInputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Response;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.http.HttpStatus;
+import org.apache.http.HttpVersion;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.message.BasicStatusLine;
+
+import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.parameters.ParameterService;
+import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpArtifactForwarder;
+import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpArtifactForwarderParameterGroup.XacmlPdpArtifactForwarderParameterGroupBuilder;
+import org.onap.policy.distribution.main.PolicyDistributionException;
+import org.onap.policy.distribution.model.GsonUtil;
+import org.onap.policy.distribution.model.Policy;
+import org.onap.policy.distribution.model.CloudArtifact;
+import org.onap.policy.distribution.model.VfModuleModel;
+
+import org.onap.sdc.api.notification.IArtifactInfo;
+
+public class XacmlPdpArtifactForwarderTest {
+
+ private static final BusTopicParams BUS_TOPIC_PARAMS = BusTopicParams.builder().useHttps(false).hostname("myHost")
+ .port(1234).userName("myUser").password("myPassword").managed(true).build();
+ private static final String CLIENT_AUTH = "ClientAuth";
+ private static final String CLIENT_AUTH_VALUE = "myClientAuth";
+ private static final String PDP_GROUP_VALUE = "myPdpGroup";
+ private HashMap<String, Object> headers = new HashMap<>();
+ private BusTopicParamsMatcher matcher = new BusTopicParamsMatcher(BUS_TOPIC_PARAMS);
+
+ /**
+ * Set up.
+ */
+ @BeforeClass
+ public static void setUp() {
+ ParameterGroup parameterGroup = new XacmlPdpArtifactForwarderParameterGroupBuilder()
+ .setUseHttps(BUS_TOPIC_PARAMS.isUseHttps()).setHostname(BUS_TOPIC_PARAMS.getHostname())
+ .setPort(BUS_TOPIC_PARAMS.getPort()).setUserName(BUS_TOPIC_PARAMS.getUserName())
+ .setPassword(BUS_TOPIC_PARAMS.getPassword()).setClientAuth(CLIENT_AUTH_VALUE)
+ .setIsManaged(BUS_TOPIC_PARAMS.isManaged()).setPdpGroup(PDP_GROUP_VALUE).build();
+ parameterGroup.setName("xacmlPdpConfiguration");
+ ParameterService.register(parameterGroup);
+ }
+
+ @Test
+ public void testForwardPolicy()
+ throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException,SecurityException,
+ IllegalArgumentException, IllegalAccessException, IOException, ClassNotFoundException {
+
+ CloseableHttpClient httpClientMock = mock(CloseableHttpClient.class);
+ headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
+ //when(httpClientMock.execute(any(HttpPost.class))).thenReturn(Response.ok().build());
+ //when(httpClientMock.execute(anyObject())).thenReturn(CloseableHttpResponse.ok().build());
+ CloseableHttpResponse response = mock(CloseableHttpResponse.class);
+ HttpEntity entity = mock(HttpEntity.class);
+ when(response.getStatusLine()).thenReturn(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "FINE!"));
+ //when(entity.getContent()).thenReturn(getClass().getClassLoader().getResourceAsStream("result.txt"));
+ //when(entity.getContent()).thenReturn("result of content");
+ when(entity.getContent()).thenReturn(new ByteArrayInputStream( "{foo : 'bar'}".getBytes()));
+ when(response.getEntity()).thenReturn(entity);
+
+ when(httpClientMock.execute(anyObject())).thenReturn(response);
+
+ XacmlPdpArtifactForwarder forwarder = new XacmlPdpArtifactForwarder();
+ forwarder.configure("xacmlPdpConfiguration");
+
+
+ ArrayList<VfModuleModel> vfModuleModels = new ArrayList<VfModuleModel>();
+ try {
+ // Read the parameters from JSON using Gson
+
+ String data = new String(Files.readAllBytes(Paths.get("src/test/resource/modules.json")));
+ Type type = new TypeToken<ArrayList<VfModuleModel>>() {}.getType();
+ Gson gson = new Gson();
+ vfModuleModels= gson.fromJson(data, type);
+
+ //vfModuleModels= GsonUtil.parseJsonArrayWithGson(data, VfModuleModel.class);
+ assertEquals(4, vfModuleModels.size());
+ } catch (final Exception e) {
+ fail("test should not thrown an exception here: " + e.getMessage());
+ }
+
+ HashMap<String, IArtifactInfo> artifactHashMap = new HashMap<>();
+ artifactHashMap.put("4d4a37ef-6a1f-4cb2-b3c9-b380a5940431",new ArtifactInfoImpl());
+ artifactHashMap.put("0a38b7ef-93b9-4d48-856d-efb56d53aab8",new ArtifactInfoImpl());
+
+ CloudArtifact cloudArtifact = new CloudArtifact(vfModuleModels,artifactHashMap);
+
+ forwarder.forward(cloudArtifact);
+
+ }
+
+ class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
+
+ private BusTopicParams busTopicParams;
+
+ BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
+ this.busTopicParams = busTopicParams;
+ }
+
+ @Override
+ public boolean matches(Object arg0) {
+ if (arg0 instanceof BusTopicParams) {
+ BusTopicParams toCompareTo = (BusTopicParams) arg0;
+ return toCompareTo.isUseHttps() == busTopicParams.isUseHttps()
+ && toCompareTo.getHostname().equals(busTopicParams.getHostname())
+ && toCompareTo.getPort() == busTopicParams.getPort()
+ && toCompareTo.getUserName().equals(busTopicParams.getUserName())
+ && toCompareTo.getPassword().equals(busTopicParams.getPassword())
+ && toCompareTo.isManaged() == busTopicParams.isManaged();
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description arg0) {}
+ }
+
+ class ArtifactInfoImpl implements IArtifactInfo {
+
+ private String artifactName;
+ private String artifactType;
+ private String artifactURL;
+ private String artifactChecksum;
+ private String artifactDescription;
+ private Integer artifactTimeout;
+ private String artifactVersion;
+ private String artifactUUID;
+ private String generatedFromUUID;
+ private IArtifactInfo generatedArtifact;
+ private List<String> relatedArtifacts;
+ private List<IArtifactInfo> relatedArtifactsInfo;
+ ArtifactInfoImpl(){}
+
+ private ArtifactInfoImpl(IArtifactInfo iArtifactInfo){
+ artifactName = iArtifactInfo.getArtifactName();
+ artifactType = iArtifactInfo.getArtifactType();
+ artifactURL = iArtifactInfo.getArtifactURL();
+ artifactChecksum = iArtifactInfo.getArtifactChecksum();
+ artifactDescription = iArtifactInfo.getArtifactDescription();
+ artifactTimeout = iArtifactInfo.getArtifactTimeout();
+ artifactVersion = iArtifactInfo.getArtifactVersion();
+ artifactUUID = iArtifactInfo.getArtifactUUID();
+ generatedArtifact = iArtifactInfo.getGeneratedArtifact();
+ relatedArtifactsInfo = iArtifactInfo.getRelatedArtifacts();
+ relatedArtifacts = fillRelatedArtifactsUUID(relatedArtifactsInfo);
+
+ }
+
+
+ private List<String> fillRelatedArtifactsUUID(List<IArtifactInfo> relatedArtifactsInfo) {
+ List<String> relatedArtifactsUUID = null;
+ if( relatedArtifactsInfo != null && !relatedArtifactsInfo.isEmpty()){
+ relatedArtifactsUUID = new ArrayList<>();
+ for(IArtifactInfo curr: relatedArtifactsInfo){
+ relatedArtifactsUUID.add(curr.getArtifactUUID());
+ }
+ }
+ return relatedArtifactsUUID;
+ }
+
+ public String getArtifactName() {
+ return artifactName;
+ }
+
+ public void setArtifactName(String artifactName) {
+ this.artifactName = artifactName;
+ }
+
+ public String getArtifactType() {
+ return artifactType;
+ }
+
+ public void setArtifactType(String artifactType) {
+ this.artifactType = artifactType;
+ }
+
+ public String getArtifactURL() {
+ return artifactURL;
+ }
+
+ public void setArtifactURL(String artifactURL) {
+ this.artifactURL = artifactURL;
+ }
+
+ public String getArtifactChecksum() {
+ return artifactChecksum;
+ }
+
+ public void setArtifactChecksum(String artifactChecksum) {
+ this.artifactChecksum = artifactChecksum;
+ }
+
+ public String getArtifactDescription() {
+ return artifactDescription;
+ }
+
+ public void setArtifactDescription(String artifactDescription) {
+ this.artifactDescription = artifactDescription;
+ }
+
+ public Integer getArtifactTimeout() {
+ return artifactTimeout;
+ }
+
+ public void setArtifactTimeout(Integer artifactTimeout) {
+ this.artifactTimeout = artifactTimeout;
+ }
+
+ @Override
+ public String toString() {
+ return "BaseArtifactInfoImpl [artifactName=" + artifactName
+ + ", artifactType=" + artifactType + ", artifactURL="
+ + artifactURL + ", artifactChecksum=" + artifactChecksum
+ + ", artifactDescription=" + artifactDescription
+ + ", artifactVersion=" + artifactVersion
+ + ", artifactUUID=" + artifactUUID
+ + ", artifactTimeout=" + artifactTimeout + "]";
+ }
+
+ public String getArtifactVersion() {
+ return artifactVersion;
+ }
+
+ public void setArtifactVersion(String artifactVersion) {
+ this.artifactVersion = artifactVersion;
+ }
+
+ public String getArtifactUUID() {
+ return artifactUUID;
+ }
+
+ public void setArtifactUUID(String artifactUUID) {
+ this.artifactUUID = artifactUUID;
+ }
+
+ public String getGeneratedFromUUID() {
+ return generatedFromUUID;
+ }
+
+ public void setGeneratedFromUUID(String generatedFromUUID) {
+ this.generatedFromUUID = generatedFromUUID;
+ }
+
+ public IArtifactInfo getGeneratedArtifact() {
+ return generatedArtifact;
+ }
+
+ public void setGeneratedArtifact(IArtifactInfo generatedArtifact) {
+ this.generatedArtifact = generatedArtifact;
+ }
+
+ public List<IArtifactInfo> getRelatedArtifacts(){
+ List<IArtifactInfo> temp = new ArrayList<IArtifactInfo>();
+ if( relatedArtifactsInfo != null ){
+ temp.addAll(relatedArtifactsInfo);
+ }
+ return temp;
+ }
+
+ public void setRelatedArtifacts(List<String> relatedArtifacts) {
+ this.relatedArtifacts = relatedArtifacts;
+ }
+
+ public void setRelatedArtifactsInfo(List<IArtifactInfo> relatedArtifactsInfo) {
+ this.relatedArtifactsInfo = relatedArtifactsInfo;
+ }
+
+ public List<String> getRelatedArtifactsUUID(){
+ return relatedArtifacts;
+ }
+
+ }
+
+
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyReceptionHandler.java b/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyReceptionHandler.java
new file mode 100644
index 0000000..c093481
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyReceptionHandler.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.distribution.forwarding.xacml.pdp.testclasses;
+
+import org.onap.policy.distribution.reception.handling.AbstractReceptionHandler;
+
+/**
+ * Class to create a dummy reception handler for test cases.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
+ */
+public class DummyReceptionHandler extends AbstractReceptionHandler {
+
+ @Override
+ public void initializeReception(final String parameterGroupName) {}
+
+ @Override
+ public void destroy() {}
+}
diff --git a/artifactbroker/plugins/forwarding-plugins/src/test/resource/modules.json b/artifactbroker/plugins/forwarding-plugins/src/test/resource/modules.json
new file mode 100644
index 0000000..e363c52
--- /dev/null
+++ b/artifactbroker/plugins/forwarding-plugins/src/test/resource/modules.json
@@ -0,0 +1,95 @@
+[
+ {
+ "vfModuleModelName": "Vfwnextgen..base_template..module-0",
+ "vfModuleModelInvariantUUID": "e40629e7-4fab-4ca3-b3ad-570763a32893",
+ "vfModuleModelVersion": "1",
+ "vfModuleModelUUID": "bff998ed-8322-4050-b1c0-181078ecbcd8",
+ "vfModuleModelCustomizationUUID": "4e00870e-87e2-4968-85ab-22d9c181b770",
+ "isBase": true,
+ "artifacts": [
+ "4d4a37ef-6a1f-4cb2-b3c9-b380a5940431",
+ "0a38b7ef-93b9-4d48-856d-efb56d53aab8"
+ ],
+ "properties": {
+ "min_vf_module_instances": "1",
+ "vf_module_label": "base_template",
+ "max_vf_module_instances": "1",
+ "vfc_list": "",
+ "vf_module_description": "",
+ "vf_module_type": "Base",
+ "availability_zone_count": "",
+ "volume_group": "false",
+ "initial_count": "1"
+ }
+ },
+ {
+ "vfModuleModelName": "Vfwnextgen..vsn..module-1",
+ "vfModuleModelInvariantUUID": "608cf695-83d9-4777-8d34-d4d76a5b5c19",
+ "vfModuleModelVersion": "1",
+ "vfModuleModelUUID": "8a5b6f0a-535d-4d86-ba6e-facf56302a39",
+ "vfModuleModelCustomizationUUID": "77320fa7-afa0-4e9c-b998-5a182c05ce0a",
+ "isBase": false,
+ "artifacts": [
+ "db75d79d-5e33-4e28-9a53-8d2c5d9df350",
+ "dd537ba7-a63a-4dff-8448-53b6bd450685"
+ ],
+ "properties": {
+ "min_vf_module_instances": "0",
+ "vf_module_label": "vsn",
+ "max_vf_module_instances": "",
+ "vfc_list": "",
+ "vf_module_description": "",
+ "vf_module_type": "Expansion",
+ "availability_zone_count": "",
+ "volume_group": "false",
+ "initial_count": "0"
+ }
+ },
+ {
+ "vfModuleModelName": "Vfwnextgen..vpg..module-2",
+ "vfModuleModelInvariantUUID": "4dd970d9-fc1c-4d06-bc29-c5eebc28a58c",
+ "vfModuleModelVersion": "1",
+ "vfModuleModelUUID": "8184982c-9706-4a4c-9d56-3d125772d55a",
+ "vfModuleModelCustomizationUUID": "ed4f1e52-17ab-458e-8b05-9620f97f2465",
+ "isBase": false,
+ "artifacts": [
+ "b57ab00a-b4c8-4732-9cad-06b341fc12bb",
+ "9753e2bc-8b85-4793-9591-5c65e82df6a4"
+ ],
+ "properties": {
+ "min_vf_module_instances": "0",
+ "vf_module_label": "vpg",
+ "max_vf_module_instances": "",
+ "vfc_list": "",
+ "vf_module_description": "",
+ "vf_module_type": "Expansion",
+ "availability_zone_count": "",
+ "volume_group": "false",
+ "initial_count": "0"
+ }
+ },
+ {
+ "vfModuleModelName": "Vfwnextgen..vfw..module-3",
+ "vfModuleModelInvariantUUID": "1b998683-0854-4bd1-bfab-345cccf1fc16",
+ "vfModuleModelVersion": "1",
+ "vfModuleModelUUID": "3a4a9712-9fab-4c20-9b82-f4ebbbf4437c",
+ "vfModuleModelCustomizationUUID": "1d177995-1861-4036-993c-37642d768694",
+ "isBase": false,
+ "artifacts": [
+ "450a0635-73ce-4394-ad7d-a3ab354b044c",
+ "7d7a9ab4-ef1d-4d3f-baa4-e9c1361a23ef"
+ ],
+ "properties": {
+ "min_vf_module_instances": "0",
+ "vf_module_label": "vfw",
+ "max_vf_module_instances": "",
+ "vfc_list": "",
+ "vf_module_description": "",
+ "vf_module_type": "Expansion",
+ "availability_zone_count": "",
+ "volume_group": "false",
+ "initial_count": "0"
+ }
+ }
+]
+