summaryrefslogtreecommitdiffstats
path: root/controlloop/common/actors/actor.so
diff options
context:
space:
mode:
Diffstat (limited to 'controlloop/common/actors/actor.so')
-rw-r--r--controlloop/common/actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/SOActorServiceProvider.java140
-rw-r--r--controlloop/common/actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/TestSOActorServiceProvider.java75
2 files changed, 178 insertions, 37 deletions
diff --git a/controlloop/common/actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/SOActorServiceProvider.java b/controlloop/common/actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/SOActorServiceProvider.java
index f68c6f676..ccc13a557 100644
--- a/controlloop/common/actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/SOActorServiceProvider.java
+++ b/controlloop/common/actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/SOActorServiceProvider.java
@@ -20,8 +20,11 @@
package org.onap.policy.controlloop.actor.so;
+import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.UUID;
import org.drools.core.WorkingMemory;
import org.onap.policy.aai.AaiNqExtraProperty;
import org.onap.policy.aai.AaiNqInventoryResponseItem;
@@ -44,6 +47,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.gson.reflect.TypeToken;
public class SOActorServiceProvider implements Actor {
private static final Logger logger = LoggerFactory.getLogger(SOActorServiceProvider.class);
@@ -59,9 +63,19 @@ public class SOActorServiceProvider implements Actor {
private static final ImmutableList<String> recipes = ImmutableList.of(RECIPE_VF_MODULE_CREATE);
private static final ImmutableMap<String, List<String>> targets = new ImmutableMap.Builder<String, List<String>>()
- .put(RECIPE_VF_MODULE_CREATE, ImmutableList.of(TARGET_VFC)).build();
+ .put(RECIPE_VF_MODULE_CREATE, ImmutableList.of(TARGET_VFC)).build();
- // Static variables required to hold the IDs of the last service item and VNF item. Note that in
+ // name of request parameters within policy payload
+ public static final String REQ_PARAM_NM = "requestParameters";
+
+ // name of configuration parameters within policy payload
+ public static final String CONFIG_PARAM_NM = "configurationParameters";
+
+ // used to decode configuration parameters via gson
+ public static Type CONFIG_TYPE = new TypeToken<List<Map<String, String>>>() {}.getType();
+
+ // Static variables required to hold the IDs of the last service item and VNF item.
+ // Note that in
// a multithreaded deployment this WILL break
private static String lastVNFItemVnfId;
private static String lastServiceItemServiceInstanceId;
@@ -87,17 +101,19 @@ public class SOActorServiceProvider implements Actor {
}
/**
- * Constructs a SO request conforming to the lcm API. The actual request is constructed and then
- * placed in a wrapper object used to send through DMAAP.
+ * Constructs a SO request conforming to the lcm API. The actual request is
+ * constructed and then placed in a wrapper object used to send through DMAAP.
*
* @param onset the event that is reporting the alert for policy to perform an action
- * @param operation the control loop operation specifying the actor, operation, target, etc.
- * @param policy the policy the was specified from the yaml generated by CLAMP or through the
- * Policy GUI/API
+ * @param operation the control loop operation specifying the actor, operation,
+ * target, etc.
+ * @param policy the policy the was specified from the yaml generated by CLAMP or
+ * through the Policy GUI/API
* @param aaiResponseWrapper wrapper for AAI vserver named-query response
* @return a SO request conforming to the lcm API using the DMAAP wrapper
*/
- public SORequest constructRequest(VirtualControlLoopEvent onset, ControlLoopOperation operation, Policy policy, AaiNqResponseWrapper aaiResponseWrapper) {
+ public SORequest constructRequest(VirtualControlLoopEvent onset, ControlLoopOperation operation, Policy policy,
+ AaiNqResponseWrapper aaiResponseWrapper) {
String modelNamePropertyKey = "model-ver.model-name";
String modelVersionPropertyKey = "model-ver.model-version";
String modelVersionIdPropertyKey = "model-ver.model-version-id";
@@ -120,10 +136,10 @@ public class SOActorServiceProvider implements Actor {
// Extract the items we're interested in from the response
try {
vnfItem = aaiResponseWrapper.getAaiNqResponse().getInventoryResponseItems().get(0).getItems()
- .getInventoryResponseItems().get(0);
+ .getInventoryResponseItems().get(0);
} catch (Exception e) {
logger.error("VNF Item not found in AAI response {}", Serialization.gsonPretty.toJson(aaiResponseWrapper),
- e);
+ e);
return null;
}
@@ -131,16 +147,16 @@ public class SOActorServiceProvider implements Actor {
vnfServiceItem = vnfItem.getItems().getInventoryResponseItems().get(0);
} catch (Exception e) {
logger.error("VNF Service Item not found in AAI response {}",
- Serialization.gsonPretty.toJson(aaiResponseWrapper), e);
+ Serialization.gsonPretty.toJson(aaiResponseWrapper), e);
return null;
}
try {
tenantItem = aaiResponseWrapper.getAaiNqResponse().getInventoryResponseItems().get(0).getItems()
- .getInventoryResponseItems().get(1);
+ .getInventoryResponseItems().get(1);
} catch (Exception e) {
logger.error("Tenant Item not found in AAI response {}",
- Serialization.gsonPretty.toJson(aaiResponseWrapper), e);
+ Serialization.gsonPretty.toJson(aaiResponseWrapper), e);
return null;
}
@@ -172,15 +188,17 @@ public class SOActorServiceProvider implements Actor {
//
request.getRequestDetails().getCloudConfiguration().setTenantId(tenantItem.getTenant().getTenantId());
request.getRequestDetails().getCloudConfiguration().setLcpCloudRegionId(
- tenantItem.getItems().getInventoryResponseItems().get(0).getCloudRegion().getCloudRegionId());
+ tenantItem.getItems().getInventoryResponseItems().get(0).getCloudRegion().getCloudRegionId());
//
// modelInfo
//
request.getRequestDetails().getModelInfo().setModelType("vfModule");
request.getRequestDetails().getModelInfo()
- .setModelInvariantId(vfModuleItem.getVfModule().getModelInvariantId());
+ .setModelInvariantId(vfModuleItem.getVfModule().getModelInvariantId());
request.getRequestDetails().getModelInfo().setModelVersionId(vfModuleItem.getVfModule().getModelVersionId());
+ request.getRequestDetails().getModelInfo()
+ .setModelCustomizationId(vfModuleItem.getVfModule().getModelCustomizationId());
for (AaiNqExtraProperty prop : vfModuleItem.getExtraProperties().getExtraProperty()) {
if (prop.getPropertyName().equals(modelNamePropertyKey)) {
@@ -193,7 +211,8 @@ public class SOActorServiceProvider implements Actor {
//
// requestInfo
//
- request.getRequestDetails().getRequestInfo().setInstanceName(aaiResponseWrapper.genVfModuleName());
+ String vfModuleName = aaiResponseWrapper.genVfModuleName();
+ request.getRequestDetails().getRequestInfo().setInstanceName(vfModuleName);
request.getRequestDetails().getRequestInfo().setSource("POLICY");
request.getRequestDetails().getRequestInfo().setSuppressRollback(false);
request.getRequestDetails().getRequestInfo().setRequestorId("policy");
@@ -201,27 +220,35 @@ public class SOActorServiceProvider implements Actor {
//
// relatedInstanceList
//
+ SORelatedInstanceListElement relatedInstanceListElement0 = new SORelatedInstanceListElement();
SORelatedInstanceListElement relatedInstanceListElement1 = new SORelatedInstanceListElement();
SORelatedInstanceListElement relatedInstanceListElement2 = new SORelatedInstanceListElement();
relatedInstanceListElement1.setRelatedInstance(new SORelatedInstance());
relatedInstanceListElement2.setRelatedInstance(new SORelatedInstance());
+ // Volume Group Item
+ relatedInstanceListElement0.setRelatedInstance(new SORelatedInstance());
+ relatedInstanceListElement0.getRelatedInstance().setInstanceId(UUID.randomUUID().toString());
+ relatedInstanceListElement0.getRelatedInstance().setInstanceName(vfModuleName + "_vol");
+ relatedInstanceListElement0.getRelatedInstance().setModelInfo(new SOModelInfo());
+ relatedInstanceListElement0.getRelatedInstance().getModelInfo().setModelType("volumeGroup");
+
// Service Item
relatedInstanceListElement1.getRelatedInstance()
- .setInstanceId(vnfServiceItem.getServiceInstance().getServiceInstanceId());
+ .setInstanceId(vnfServiceItem.getServiceInstance().getServiceInstanceId());
relatedInstanceListElement1.getRelatedInstance().setModelInfo(new SOModelInfo());
relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelType("service");
relatedInstanceListElement1.getRelatedInstance().getModelInfo()
- .setModelInvariantId(vnfServiceItem.getServiceInstance().getModelInvariantId());
+ .setModelInvariantId(vnfServiceItem.getServiceInstance().getModelInvariantId());
for (AaiNqExtraProperty prop : vnfServiceItem.getExtraProperties().getExtraProperty()) {
if (prop.getPropertyName().equals(modelNamePropertyKey)) {
relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelName(prop.getPropertyValue());
} else if (prop.getPropertyName().equals(modelVersionPropertyKey)) {
relatedInstanceListElement1.getRelatedInstance().getModelInfo()
- .setModelVersion(prop.getPropertyValue());
+ .setModelVersion(prop.getPropertyValue());
} else if (prop.getPropertyName().equals(modelVersionIdPropertyKey)) {
- relatedInstanceListElement1.getRelatedInstance().getModelInfo()
- .setModelVersionId(prop.getPropertyValue());
+ relatedInstanceListElement1.getRelatedInstance().getModelInfo()
+ .setModelVersionId(prop.getPropertyValue());
}
}
@@ -230,28 +257,38 @@ public class SOActorServiceProvider implements Actor {
relatedInstanceListElement2.getRelatedInstance().setModelInfo(new SOModelInfo());
relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelType("vnf");
relatedInstanceListElement2.getRelatedInstance().getModelInfo()
- .setModelInvariantId(vnfItem.getGenericVnf().getModelInvariantId());
+ .setModelInvariantId(vnfItem.getGenericVnf().getModelInvariantId());
for (AaiNqExtraProperty prop : vnfItem.getExtraProperties().getExtraProperty()) {
if (prop.getPropertyName().equals(modelNamePropertyKey)) {
relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelName(prop.getPropertyValue());
} else if (prop.getPropertyName().equals(modelVersionPropertyKey)) {
relatedInstanceListElement2.getRelatedInstance().getModelInfo()
- .setModelVersion(prop.getPropertyValue());
+ .setModelVersion(prop.getPropertyValue());
} else if (prop.getPropertyName().equals(modelVersionIdPropertyKey)) {
relatedInstanceListElement2.getRelatedInstance().getModelInfo()
- .setModelVersionId(prop.getPropertyValue());
+ .setModelVersionId(prop.getPropertyValue());
}
}
- relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelCustomizationName(vnfItem
- .getGenericVnf().getVnfType().substring(vnfItem.getGenericVnf().getVnfType().lastIndexOf('/') + 1));
+ relatedInstanceListElement2.getRelatedInstance().getModelInfo()
+ .setModelCustomizationName(vnfItem.getGenericVnf().getVnfType()
+ .substring(vnfItem.getGenericVnf().getVnfType().lastIndexOf('/') + 1));
+ relatedInstanceListElement2.getRelatedInstance().getModelInfo()
+ .setModelCustomizationId(vnfItem.getGenericVnf().getModelCustomizationId());
// Insert the Service Item and VNF Item
+ request.getRequestDetails().getRelatedInstanceList().add(relatedInstanceListElement0);
request.getRequestDetails().getRelatedInstanceList().add(relatedInstanceListElement1);
request.getRequestDetails().getRelatedInstanceList().add(relatedInstanceListElement2);
+ // Request Parameters
+ request.getRequestDetails().setRequestParameters(buildRequestParameters(policy));
+
+ // Configuration Parameters
+ request.getRequestDetails().setConfigurationParameters(buildConfigurationParameters(policy));
+
// Save the instance IDs for the VNF and service to static fields
preserveInstanceIds(vnfItem.getGenericVnf().getVnfId(),
- vnfServiceItem.getServiceInstance().getServiceInstanceId());
+ vnfServiceItem.getServiceInstance().getServiceInstanceId());
if (logger.isDebugEnabled()) {
logger.debug("SO request sent: {}", Serialization.gsonPretty.toJson(request));
@@ -261,8 +298,8 @@ public class SOActorServiceProvider implements Actor {
}
/**
- * This method is needed to get the serviceInstanceId and vnfInstanceId which is used in the
- * asyncSORestCall.
+ * This method is needed to get the serviceInstanceId and vnfInstanceId which is used
+ * in the asyncSORestCall.
*
* @param requestId the request Id
* @param wm the working memory
@@ -271,7 +308,7 @@ public class SOActorServiceProvider implements Actor {
public static void sendRequest(String requestId, WorkingMemory wm, Object request) {
SOManager soManager = new SOManager();
soManager.asyncSORestCall(requestId, wm, lastServiceItemServiceInstanceId, lastVNFItemVnfId,
- (SORequest) request);
+ (SORequest) request);
}
/**
@@ -288,8 +325,47 @@ public class SOActorServiceProvider implements Actor {
}
/**
- * This method is called to remember the last service instance ID and VNF Item VNF ID. Note
- * these fields are static, beware for multithreaded deployments
+ * Builds the request parameters from the policy payload.
+ *
+ * @param policy the policy
+ * @return the request parameters, or {@code null} if the payload is {@code null}
+ */
+ private SORequestParameters buildRequestParameters(Policy policy) {
+ if (policy.getPayload() == null) {
+ return null;
+ }
+
+ String json = policy.getPayload().get(REQ_PARAM_NM);
+ if (json == null) {
+ return null;
+ }
+
+ return Serialization.gsonPretty.fromJson(json, SORequestParameters.class);
+ }
+
+ /**
+ * Builds the configuration parameters from the policy payload.
+ *
+ * @param policy the policy
+ * @return the configuration parameters, or {@code null} if the payload is
+ * {@code null}
+ */
+ private List<Map<String, String>> buildConfigurationParameters(Policy policy) {
+ if (policy.getPayload() == null) {
+ return null;
+ }
+
+ String json = policy.getPayload().get(CONFIG_PARAM_NM);
+ if (json == null) {
+ return null;
+ }
+
+ return Serialization.gsonPretty.fromJson(json, CONFIG_TYPE);
+ }
+
+ /**
+ * This method is called to remember the last service instance ID and VNF Item VNF ID.
+ * Note these fields are static, beware for multithreaded deployments
*
* @param vnfInstanceId update the last VNF instance ID to this value
* @param serviceInstanceId update the last service instance ID to this value
diff --git a/controlloop/common/actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/TestSOActorServiceProvider.java b/controlloop/common/actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/TestSOActorServiceProvider.java
index 25bbda0f4..c3155367b 100644
--- a/controlloop/common/actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/TestSOActorServiceProvider.java
+++ b/controlloop/common/actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/TestSOActorServiceProvider.java
@@ -9,9 +9,9 @@
* 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.
@@ -28,6 +28,10 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
@@ -37,6 +41,7 @@ import org.onap.policy.controlloop.ControlLoopOperation;
import org.onap.policy.controlloop.VirtualControlLoopEvent;
import org.onap.policy.controlloop.policy.Policy;
import org.onap.policy.so.SORequest;
+import org.onap.policy.so.SORequestParameters;
import org.onap.policy.so.util.Serialization;
public class TestSOActorServiceProvider {
@@ -59,6 +64,8 @@ public class TestSOActorServiceProvider {
assertNull(new SOActorServiceProvider().constructRequest(onset, operation, policy, aaiNqResp));
policy.setRecipe("VF Module Create");
+
+ // empty policy payload
SORequest request = new SOActorServiceProvider().constructRequest(onset, operation, policy, aaiNqResp);
assertNotNull(request);
@@ -66,6 +73,15 @@ public class TestSOActorServiceProvider {
assertEquals("policy", request.getRequestDetails().getRequestInfo().getRequestorId());
assertEquals("RegionOne", request.getRequestDetails().getCloudConfiguration().getLcpCloudRegionId());
+ // non-empty policy payload
+ policy.setPayload(makePayload());
+ request = new SOActorServiceProvider().constructRequest(onset, operation, policy, aaiNqResp);
+ assertNotNull(request);
+ assertEquals(true, request.getRequestDetails().getRequestParameters().isUsePreload());
+ assertEquals("avalue", request.getRequestDetails().getRequestParameters().getUserParams().get(0).get("akey"));
+ assertEquals(1, request.getRequestDetails().getConfigurationParameters().size());
+ assertEquals("cvalue", request.getRequestDetails().getConfigurationParameters().get(0).get("ckey"));
+
// null response
assertNull(new SOActorServiceProvider().constructRequest(onset, operation, policy, null));
@@ -98,15 +114,64 @@ public class TestSOActorServiceProvider {
}
/**
+ * Creates a policy payload containing request & configuration parameters.
+ *
+ * @return the payload
+ */
+ private Map<String, String> makePayload() {
+ Map<String, String> payload = new TreeMap<>();
+
+ payload.put(SOActorServiceProvider.REQ_PARAM_NM, makeReqParams());
+ payload.put(SOActorServiceProvider.CONFIG_PARAM_NM, makeConfigParams());
+
+ return payload;
+ }
+
+ /**
+ * Creates request parameters.
+ *
+ * @return request parameters, encoded as JSON
+ */
+ private String makeReqParams() {
+ SORequestParameters params = new SORequestParameters();
+
+ params.setUsePreload(true);
+
+ Map<String, String> map = new TreeMap<>();
+ map.put("akey", "avalue");
+
+ List<Map<String, String>> lst = new LinkedList<>();
+ lst.add(map);
+
+ params.setUserParams(lst);
+
+ return Serialization.gsonPretty.toJson(params);
+ }
+
+ /**
+ * Creates configuration parameters.
+ *
+ * @return configuration parameters, encoded as JSON
+ */
+ private String makeConfigParams() {
+ Map<String, String> map = new TreeMap<>();
+ map.put("ckey", "cvalue");
+
+ List<Map<String, String>> lst = new LinkedList<>();
+ lst.add(map);
+
+ return Serialization.gsonPretty.toJson(lst);
+ }
+
+ /**
* Reads an AAI vserver named-query response from a file.
- *
+ *
* @param onset the ONSET event
* @param fileName name of the file containing the JSON response
* @return output from the AAI vserver named-query
* @throws IOException if the file cannot be read
*/
- private AaiNqResponseWrapper loadAaiResponse(VirtualControlLoopEvent onset, String fileName)
- throws IOException {
+ private AaiNqResponseWrapper loadAaiResponse(VirtualControlLoopEvent onset, String fileName) throws IOException {
String resp = IOUtils.toString(getClass().getResource(fileName), StandardCharsets.UTF_8);
AaiNqResponse aaiNqResponse = Serialization.gsonPretty.fromJson(resp, AaiNqResponse.class);