From 999748a64e72b9a7975ddac3406eb95a0b9aeaff Mon Sep 17 00:00:00 2001 From: liboNet Date: Fri, 5 Apr 2019 08:59:41 +0800 Subject: add subplug for k8s to invoke Artifact forward support . 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 --- .../xacml/pdp/XacmlPdpArtifactForwarder.java | 207 +++++++++++++++++++++ .../XacmlPdpArtifactForwarderParameterGroup.java | 181 ++++++++++++++++++ .../xacml/pdp/XacmlPdpPolicyAdapter.java | 53 ++++++ .../adapters/AbstractXacmlPdpPolicyAdapter.java | 54 ++++++ .../XacmlPdpOptimizationPolicyAdapter.java | 54 ++++++ 5 files changed, 549 insertions(+) create mode 100644 artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarder.java create mode 100644 artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpArtifactForwarderParameterGroup.java create mode 100644 artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/XacmlPdpPolicyAdapter.java create mode 100644 artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/AbstractXacmlPdpPolicyAdapter.java create mode 100644 artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/xacml/pdp/adapters/XacmlPdpOptimizationPolicyAdapter.java (limited to 'artifactbroker/plugins/forwarding-plugins/src/main/java/org/onap/policy') 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 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 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 map = new LinkedHashMap(); + map.put("rb-name", vfModule.getVfModuleModelName()); + map.put("rb-version", vfModule.getVfModuleModelVersion()); + map.put("descritpion",vfModule.getVfModuleModelDescription()); + Map labelMap = new LinkedHashMap(); + 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 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 { + + /** + * 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 the type of policy the adapter handles + */ +public abstract class AbstractXacmlPdpPolicyAdapter implements XacmlPdpPolicyAdapter { + + 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 { + + /** + * 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; + } + +} -- cgit 1.2.3-korg