diff options
author | ramverma <ram.krishna.verma@est.tech> | 2019-08-16 10:13:09 +0000 |
---|---|---|
committer | ramverma <ram.krishna.verma@est.tech> | 2019-08-16 10:13:09 +0000 |
commit | ebd5d6f5d1973298a62b581f2e604528993d56d2 (patch) | |
tree | 8805d6f1e331bf07c9f2ee21229a852e52bda3b1 /plugins/forwarding-plugins/src/main | |
parent | 2326847dac621c3718023be059cc1648f69bd31e (diff) |
Add LifecycleApiForwarder in policy/distribution
* Adding implementation of LifecycleApiForwarder in policy/distribution
for forwarding policy to new components (PAP & API).
* Adding related test cases and json files for testing.
* Created a rest simulator to use for testing the API calls.
* Fixed review comments
Issue-ID: POLICY-1890
Change-Id: I6682e0366206d3f4ac77f60b676f40a0fd1aad02
Signed-off-by: ramverma <ram.krishna.verma@est.tech>
Diffstat (limited to 'plugins/forwarding-plugins/src/main')
-rw-r--r-- | plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiForwarderParameters.java (renamed from plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarderParameterGroup.java) | 23 | ||||
-rw-r--r-- | plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiParameters.java | 49 | ||||
-rw-r--r-- | plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarder.java | 124 |
3 files changed, 178 insertions, 18 deletions
diff --git a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarderParameterGroup.java b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiForwarderParameters.java index 8ba7bdbe..ab1a737a 100644 --- a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarderParameterGroup.java +++ b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiForwarderParameters.java @@ -22,34 +22,27 @@ package org.onap.policy.distribution.forwarding.lifecycle.api; import lombok.Getter; -import org.onap.policy.common.parameters.annotations.Min; import org.onap.policy.common.parameters.annotations.NotBlank; import org.onap.policy.common.parameters.annotations.NotNull; import org.onap.policy.distribution.main.parameters.PolicyForwarderConfigurationParameterGroup; /** - * Holds the parameters for the{@link LifecycleApiPolicyForwarder}. + * Holds the parameters for the {@link LifecycleApiPolicyForwarder}. + * + * @author Ram Krishna Verma (ram.krishna.verma@est.tech) */ @Getter @NotNull @NotBlank -public class LifecycleApiPolicyForwarderParameterGroup extends PolicyForwarderConfigurationParameterGroup { +public class LifecycleApiForwarderParameters extends PolicyForwarderConfigurationParameterGroup { public static final String POLICY_FORWARDER_PLUGIN_CLASS = LifecycleApiPolicyForwarder.class.getName(); - private String policyApiHostName; - @Min(value = 1) - private int policyApiPort; - private String policyApiUserName; - private String policyApiPassword; - private String policyPapHostName; - @Min(value = 1) - private int policyPapPort; - private String policyPapUserName; - private String policyPapPassword; + private LifecycleApiParameters apiParameters; + private LifecycleApiParameters papParameters; private boolean isHttps; private boolean deployPolicies = true; - public LifecycleApiPolicyForwarderParameterGroup() { - super(LifecycleApiPolicyForwarderParameterGroup.class.getSimpleName()); + public LifecycleApiForwarderParameters() { + super(LifecycleApiForwarderParameters.class.getSimpleName()); } } diff --git a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiParameters.java b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiParameters.java new file mode 100644 index 00000000..ed9ed9e0 --- /dev/null +++ b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiParameters.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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.lifecycle.api; + +import lombok.Getter; + +import org.onap.policy.common.parameters.annotations.Min; +import org.onap.policy.common.parameters.annotations.NotBlank; +import org.onap.policy.common.parameters.annotations.NotNull; +import org.onap.policy.distribution.main.parameters.PolicyForwarderConfigurationParameterGroup; + +/** + * Holds the parameters for the {@link LifecycleApiPolicyForwarder}. + * + * @author Ram Krishna Verma (ram.krishna.verma@est.tech) + */ +@Getter +@NotNull +@NotBlank +public class LifecycleApiParameters extends PolicyForwarderConfigurationParameterGroup { + + private String hostName; + @Min(value = 1) + private int port; + private String userName; + private String password; + + public LifecycleApiParameters() { + super(LifecycleApiParameters.class.getSimpleName()); + } +} diff --git a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarder.java b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarder.java index 4b8acb10..5cd9966d 100644 --- a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarder.java +++ b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/lifecycle/api/LifecycleApiPolicyForwarder.java @@ -20,12 +20,35 @@ package org.onap.policy.distribution.forwarding.lifecycle.api; +import com.google.common.collect.ImmutableMap; + +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.Map; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams; +import org.onap.policy.common.endpoints.http.client.HttpClient; +import org.onap.policy.common.endpoints.http.client.HttpClientConfigException; +import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance; +import org.onap.policy.common.gson.GsonMessageBodyHandler; import org.onap.policy.common.parameters.ParameterService; import org.onap.policy.distribution.forwarding.PolicyForwarder; import org.onap.policy.distribution.forwarding.PolicyForwardingException; +import org.onap.policy.models.pap.concepts.PdpDeployPolicies; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion; +import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * This class provides an implementation of {@link PolicyForwarder} interface for forwarding the given policies & policy @@ -35,7 +58,10 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity; */ public class LifecycleApiPolicyForwarder implements PolicyForwarder { - private LifecycleApiPolicyForwarderParameterGroup forwarderParameters; + private static final String DEPLOY_POLICY_URI = "/policy/pap/v1/pdps/policies"; + private static final String CREATE_POLICY_TYPE_URI = "/policy/api/v1/policytypes/"; + private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleApiPolicyForwarder.class); + private LifecycleApiForwarderParameters forwarderParameters; /** * {@inheritDoc}. @@ -49,9 +75,101 @@ public class LifecycleApiPolicyForwarder implements PolicyForwarder { * {@inheritDoc}. */ @Override - public void forward(final Collection<ToscaEntity> policies) throws PolicyForwardingException { - // TODO: add implementation + public void forward(final Collection<ToscaEntity> entities) throws PolicyForwardingException { + final List<ToscaEntity> failedEntities = new ArrayList<>(); + for (final ToscaEntity entity : entities) { + forwardSingleEntity(failedEntities, entity); + } + if (!failedEntities.isEmpty()) { + throw new PolicyForwardingException( + "Failed forwarding the following entities: " + Arrays.toString(failedEntities.toArray())); + } + } + + private void forwardSingleEntity(final List<ToscaEntity> failedEntities, final ToscaEntity entity) { + Response policyCreated = null; + try { + if (entity instanceof ToscaServiceTemplate) { + final ToscaServiceTemplate toscaServiceTemplate = (ToscaServiceTemplate) entity; + if (null != toscaServiceTemplate.getPolicyTypes() && !toscaServiceTemplate.getPolicyTypes().isEmpty()) { + createPolicyType(toscaServiceTemplate); + } + if (null != toscaServiceTemplate.getToscaTopologyTemplate() + && null != toscaServiceTemplate.getToscaTopologyTemplate().getPolicies() + && !toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().isEmpty() + && !toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).entrySet().isEmpty()) { + policyCreated = createPolicy(toscaServiceTemplate); + } + if (forwarderParameters.isDeployPolicies() && policyCreated != null) { + deployPolicy(policyCreated.readEntity(ToscaServiceTemplate.class)); + } + } else { + throw new PolicyForwardingException("The entity is not of type ToscaServiceTemplate - " + entity); + } + } catch (final Exception exp) { + LOGGER.error(exp.getMessage(), exp); + failedEntities.add(entity); + } } + private Response createPolicyType(final ToscaServiceTemplate toscaServiceTemplate) + throws PolicyForwardingException { + return invokeHttpClient(Entity.entity(toscaServiceTemplate, MediaType.APPLICATION_JSON), CREATE_POLICY_TYPE_URI, + true); + } + + private Response createPolicy(final ToscaServiceTemplate toscaServiceTemplate) throws PolicyForwardingException { + final ToscaPolicy policy = toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).entrySet() + .iterator().next().getValue(); + return invokeHttpClient(Entity.entity(toscaServiceTemplate, MediaType.APPLICATION_JSON), + CREATE_POLICY_TYPE_URI + policy.getType() + "/versions/" + policy.getTypeVersion() + "/policies", true); + } + + private Response deployPolicy(final ToscaServiceTemplate toscaServiceTemplate) throws PolicyForwardingException { + final PdpDeployPolicies pdpPolicies = new PdpDeployPolicies(); + final List<ToscaPolicyIdentifierOptVersion> policyIdentifierList = new ArrayList<>(); + for (final Map<String, ToscaPolicy> policyMap : toscaServiceTemplate.getToscaTopologyTemplate().getPolicies()) { + final String policyId = policyMap.entrySet().iterator().next().getValue().getMetadata().get("policy-id"); + final String policyVersion = + policyMap.entrySet().iterator().next().getValue().getMetadata().get("policy-version"); + final ToscaPolicyIdentifierOptVersion toscaPolicyIdentifier = + new ToscaPolicyIdentifierOptVersion(policyId, policyVersion); + policyIdentifierList.add(toscaPolicyIdentifier); + } + pdpPolicies.setPolicies(policyIdentifierList); + return invokeHttpClient(Entity.entity(pdpPolicies, MediaType.APPLICATION_JSON), DEPLOY_POLICY_URI, false); + } + + private Response invokeHttpClient(final Entity<?> entity, final String path, final boolean wantApi) + throws PolicyForwardingException { + Response response = null; + try { + response = getHttpClient(wantApi).post(path, entity, ImmutableMap.of(HttpHeaders.ACCEPT, + MediaType.APPLICATION_JSON, HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)); + if (response.getStatus() != Status.OK.getStatusCode()) { + LOGGER.error( + "Invocation of path {} failed for entity {}. Response status: {}, Response status info: {}", + path, entity, response.getStatus(), response.getStatusInfo()); + throw new PolicyForwardingException("Failed creating the entity - " + entity); + } + } catch (final HttpClientConfigException exception) { + LOGGER.error( + "Invocation of path " + path + " failed for entity " + entity + " due to error opening Http client", + exception); + throw new PolicyForwardingException("Failed creating the entity - " + entity, exception); + } + return response; + } + + private HttpClient getHttpClient(final boolean wantApi) throws HttpClientConfigException { + final boolean https = forwarderParameters.isHttps(); + final LifecycleApiParameters parameters = + (wantApi ? forwarderParameters.getApiParameters() : forwarderParameters.getPapParameters()); + final BusTopicParams params = BusTopicParams.builder().clientName("Policy Distribution").useHttps(https) + .hostname(parameters.getHostName()).port(parameters.getPort()).userName(parameters.getUserName()) + .password(parameters.getPassword()).serializationProvider(GsonMessageBodyHandler.class.getName()) + .build(); + return HttpClientFactoryInstance.getClientFactory().build(params); + } } |