add subplug for k8s to invoke Artifact forward support 15/84215/1
authorliboNet <libo.zhu@intel.com>
Fri, 5 Apr 2019 00:59:41 +0000 (08:59 +0800)
committerliboNet <libo.zhu@intel.com>
Fri, 5 Apr 2019 00:59:41 +0000 (08:59 +0800)
. add forward plugin to forward Artifact
. add test case to cover basic httpPost action
. fix the misuse of List and ArrayList to avoid Null Pointer

Change-Id: I18ead2ba6251a93fddff4657f3945d635a450276
Issue-ID: MULTICLOUD-514
Signed-off-by: liboNet <libo.zhu@intel.com>
14 files changed:
artifactbroker/model/src/main/java/org/onap/policy/distribution/model/CloudArtifact.java
artifactbroker/model/src/main/java/org/onap/policy/distribution/model/GsonUtil.java
artifactbroker/plugins/forwarding-plugins/pom.xml [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarder.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarderParameterGroup.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpPolicyAdapter.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/AbstractXacmlPdpPolicyAdapter.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/XacmlPdpOptimizationPolicyAdapter.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderParameterGroupTest.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/engine/XacmlPdpArtifactForwarderTest.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyReceptionHandler.java [new file with mode: 0644]
artifactbroker/plugins/forwarding-plugins/src/test/resource/modules.json [new file with mode: 0644]
artifactbroker/plugins/pom.xml
artifactbroker/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/handling/sdc/SdcReceptionHandler.java

index 834bbcf..8a7943a 100644 (file)
@@ -20,8 +20,8 @@
 
 package org.onap.policy.distribution.model;
 
-import java.util.List;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.HashMap;
 
 import org.onap.sdc.api.notification.IArtifactInfo;
 
@@ -30,10 +30,10 @@ import org.onap.sdc.api.notification.IArtifactInfo;
  */
 public class CloudArtifact implements PolicyInput {
 
-    List<VfModuleModel> vfModulePayload;
-    Map<String, IArtifactInfo> artifactMap;
+    ArrayList<VfModuleModel> vfModulePayload;
+    HashMap<String, IArtifactInfo> artifactMap;
 
-    public CloudArtifact(List<VfModuleModel> vfModulePayload, Map<String, IArtifactInfo> artifactMap) {
+    public CloudArtifact(ArrayList<VfModuleModel> vfModulePayload, HashMap<String, IArtifactInfo> artifactMap) {
         this.vfModulePayload = vfModulePayload;
         this.artifactMap = artifactMap;
     }
@@ -43,7 +43,7 @@ public class CloudArtifact implements PolicyInput {
      *
      * @return the path of the TOSCA file
      */
-    public List<VfModuleModel> getVfModulePayload() {
+    public ArrayList<VfModuleModel> getVfModulePayload() {
         return vfModulePayload;
     }
 
@@ -52,7 +52,7 @@ public class CloudArtifact implements PolicyInput {
      *
      * @return the path of the TOSCA file
      */
-    public Map<String, IArtifactInfo> getArtifactTypeMap() {
+    public HashMap<String, IArtifactInfo> getArtifactTypeMap() {
         return artifactMap;
     }
 
index 077c753..46f2735 100644 (file)
@@ -22,7 +22,7 @@ package org.onap.policy.distribution.model;
 
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import java.util.List;
+import java.util.ArrayList;
 /**
  * A GsonUtil created by a {@link GsonUtil}.
  */
@@ -36,10 +36,10 @@ public class GsonUtil {
     }
 
     // 将Json数组解析成相应的映射对象列表
-    public static <T> List<T> parseJsonArrayWithGson(String jsonData,
+    public static <T> ArrayList<T> parseJsonArrayWithGson(String jsonData,
             Class<T> type) {
         Gson gson = new Gson();
-        List<T> result = gson.fromJson(jsonData, new TypeToken<List<T>>() {}.getType());
+        ArrayList<T> result = gson.fromJson(jsonData, new TypeToken<ArrayList<T>>() {}.getType());
         return result;
     }
 }
diff --git a/artifactbroker/plugins/forwarding-plugins/pom.xml b/artifactbroker/plugins/forwarding-plugins/pom.xml
new file mode 100644 (file)
index 0000000..9ceab89
--- /dev/null
@@ -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 (file)
index 0000000..906827c
--- /dev/null
@@ -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 (file)
index 0000000..d04bb3c
--- /dev/null
@@ -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 (file)
index 0000000..c50eac1
--- /dev/null
@@ -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 (file)
index 0000000..c136516
--- /dev/null
@@ -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 (file)
index 0000000..1ec654f
--- /dev/null
@@ -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 (file)
index 0000000..d10ea62
--- /dev/null
@@ -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 (file)
index 0000000..ca2fd0d
--- /dev/null
@@ -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 (file)
index 0000000..c093481
--- /dev/null
@@ -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 (file)
index 0000000..e363c52
--- /dev/null
@@ -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"
+    }
+  }
+]
+
index 68d0fea..ad380bb 100644 (file)
@@ -33,5 +33,6 @@
     
     <modules>
         <module>reception-plugins</module>
+        <module>forwarding-plugins</module>
     </modules>
 </project>
index 998527b..6b8f3b6 100644 (file)
@@ -27,8 +27,9 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
+import java.util.HashMap;
 
 import org.onap.policy.common.logging.flexlogger.FlexLogger;
 import org.onap.policy.common.logging.flexlogger.Logger;
@@ -220,8 +221,8 @@ public class SdcReceptionHandler extends AbstractReceptionHandler implements INo
         DistributionStatisticsManager.updateTotalDistributionCount();
         List<String> relevantArtifactTypes = sdcConfig.getRelevantArtifactTypes();
         Path path = Paths.get("/data");
-        List<VfModuleModel> vfModuleModels = null;
-        Map<String, IArtifactInfo> artifactMap = null;//key is UUID, value is artifact for shared folder
+        ArrayList<VfModuleModel> vfModuleModels = new ArrayList<>();
+        HashMap<String, IArtifactInfo> artifactMap = new HashMap<>();//key is UUID, value is artifact for shared folder
         String vfArtifactData = null;
 
         for (final IArtifactInfo artifact : resource.getArtifacts()) {