Moving common polling code into HttpOperation
[policy/models.git] / models-interactions / model-actors / actor.so / src / main / java / org / onap / policy / controlloop / actor / so / SoActorServiceProvider.java
index 8aad5fe..642e2b4 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * SOActorServiceProvider
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,12 +33,11 @@ import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.Tenant;
 import org.onap.policy.aai.AaiCqResponse;
-import org.onap.policy.aai.AaiNqExtraProperty;
-import org.onap.policy.aai.AaiNqInventoryResponseItem;
-import org.onap.policy.aai.AaiNqResponseWrapper;
 import org.onap.policy.controlloop.ControlLoopOperation;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.actorserviceprovider.spi.Actor;
+import org.onap.policy.controlloop.actorserviceprovider.impl.HttpActor;
+import org.onap.policy.controlloop.actorserviceprovider.impl.HttpPollingOperator;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingActorParams;
 import org.onap.policy.controlloop.policy.Policy;
 import org.onap.policy.so.SoCloudConfiguration;
 import org.onap.policy.so.SoManager;
@@ -54,15 +53,16 @@ import org.onap.policy.so.util.Serialization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SoActorServiceProvider implements Actor {
+public class SoActorServiceProvider extends HttpActor<HttpPollingActorParams> {
     private static final Logger logger = LoggerFactory.getLogger(SoActorServiceProvider.class);
 
+    public static final String NAME = "SO";
+
+    // TODO old code: remove lines down to **HERE**
+
     private static final String TENANT_NOT_FOUND = "Tenant Item not found in AAI response {}";
     private static final String CONSTRUCTED_SO_MSG = "Constructed SO request: {}";
 
-    // Strings for SO Actor
-    private static final String SO_ACTOR = "SO";
-
     // Strings for targets
     private static final String TARGET_VFC = "VFC";
 
@@ -82,10 +82,6 @@ public class SoActorServiceProvider implements Actor {
     // name of configuration parameters within policy payload
     public static final String CONFIG_PARAM_NM = "configurationParameters";
 
-    private static final String MODEL_NAME_PROPERTY_KEY = "model-ver.model-name";
-    private static final String MODEL_VERSION_PROPERTY_KEY = "model-ver.model-version";
-    private static final String MODEL_VERSION_ID_PROPERTY_KEY = "model-ver.model-version-id";
-
     // used to decode configuration parameters via gson
     private static final Type CONFIG_TYPE = new TypeToken<List<Map<String, String>>>() {}.getType();
 
@@ -96,9 +92,23 @@ public class SoActorServiceProvider implements Actor {
     private static String lastServiceItemServiceInstanceId;
     private static String lastVfModuleItemVfModuleInstanceId;
 
+    // **HERE**
+
+    /**
+     * Constructs the object.
+     */
+    public SoActorServiceProvider() {
+        super(NAME, HttpPollingActorParams.class);
+
+        addOperator(new HttpPollingOperator(NAME, VfModuleCreate.NAME, VfModuleCreate::new));
+        addOperator(new HttpPollingOperator(NAME, VfModuleDelete.NAME, VfModuleDelete::new));
+    }
+
+    // TODO old code: remove lines down to **HERE**
+
     @Override
     public String actor() {
-        return SO_ACTOR;
+        return NAME;
     }
 
     @Override
@@ -116,79 +126,6 @@ public class SoActorServiceProvider implements Actor {
         return Collections.emptyList();
     }
 
-    /**
-     * 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 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) {
-        if (!SO_ACTOR.equals(policy.getActor()) || !recipes().contains(policy.getRecipe())) {
-            return null;
-        }
-
-        // A&AI named query should have been performed by now. If not, return null
-        if (aaiResponseWrapper == null) {
-            return null;
-        }
-
-        AaiNqInventoryResponseItem vnfItem;
-        AaiNqInventoryResponseItem vnfServiceItem;
-        AaiNqInventoryResponseItem tenantItem;
-
-        // Extract the items we're interested in from the response
-        try {
-            vnfItem = aaiResponseWrapper.getAaiNqResponse().getInventoryResponseItems().get(0).getItems()
-                    .getInventoryResponseItems().get(0);
-        } catch (Exception e) {
-            logger.error("VNF Item not found in AAI response {}", Serialization.gsonPretty.toJson(aaiResponseWrapper),
-                    e);
-            return null;
-        }
-
-        try {
-            vnfServiceItem = vnfItem.getItems().getInventoryResponseItems().get(0);
-        } catch (Exception e) {
-            logger.error("VNF Service Item not found in AAI response {}",
-                    Serialization.gsonPretty.toJson(aaiResponseWrapper), e);
-            return null;
-        }
-
-        try {
-            tenantItem = aaiResponseWrapper.getAaiNqResponse().getInventoryResponseItems().get(0).getItems()
-                    .getInventoryResponseItems().get(1);
-        } catch (Exception e) {
-            logger.error(TENANT_NOT_FOUND,
-                    Serialization.gsonPretty.toJson(aaiResponseWrapper), e);
-            return null;
-        }
-
-        // Find the index for base vf module and non-base vf module
-        AaiNqInventoryResponseItem baseItem = findVfModule(aaiResponseWrapper, true);
-
-        SoModelInfo soModelInfo = prepareSoModelInfo(policy);
-
-        // Report the error if either base vf module or non-base vf module is not found
-        if (baseItem == null || soModelInfo == null) {
-            logger.error("Either base or non-base vf module is not found from AAI response.");
-            return null;
-        }
-
-        // Construct SO Request for a policy's recipe
-        if (RECIPE_VF_MODULE_CREATE.equals(policy.getRecipe())) {
-            return constructCreateRequest(aaiResponseWrapper, policy, tenantItem, vnfItem, vnfServiceItem, soModelInfo);
-        } else if (RECIPE_VF_MODULE_DELETE.equals(policy.getRecipe())) {
-            return constructDeleteRequest(tenantItem, vnfItem, vnfServiceItem, policy);
-        } else {
-            return null;
-        }
-    }
-
     private SoModelInfo prepareSoModelInfo(Policy policy) {
 
         if (policy.getTarget() == null || policy.getTarget().getModelCustomizationId() == null
@@ -207,142 +144,10 @@ public class SoActorServiceProvider implements Actor {
         soModelInfo.setModelName(policy.getTarget().getModelName());
         soModelInfo.setModelVersion(policy.getTarget().getModelVersion());
         soModelInfo.setModelVersionId(policy.getTarget().getModelVersionId());
+        soModelInfo.setModelType("vfModule");
         return soModelInfo;
     }
 
-    /**
-     * Construct SO request to create vf-module.
-     *
-     * @param aaiResponseWrapper the AAI response containing the VF modules
-     * @param policy the policy
-     * @param tenantItem tenant item from A&AI named-query response
-     * @param vnfItem vnf item from A&AI named-query response
-     * @param vnfServiceItem vnf service item from A&AI named-query response
-     * @param vfModuleItem vf module item from A&AI named-query response
-     * @return SO create vf-module request
-     */
-    private SoRequest constructCreateRequest(AaiNqResponseWrapper aaiResponseWrapper, Policy policy,
-            AaiNqInventoryResponseItem tenantItem, AaiNqInventoryResponseItem vnfItem,
-            AaiNqInventoryResponseItem vnfServiceItem, SoModelInfo vfModuleItem) {
-        SoRequest request = new SoRequest();
-        request.setOperationType(SoOperationType.SCALE_OUT);
-        //
-        //
-        // Do NOT send So the requestId, they do not support this field
-        //
-        request.setRequestDetails(new SoRequestDetails());
-        request.getRequestDetails().setRequestParameters(new SoRequestParameters());
-        request.getRequestDetails().getRequestParameters().setUserParams(null);
-
-        // cloudConfiguration
-        request.getRequestDetails().setCloudConfiguration(constructCloudConfiguration(tenantItem));
-        // modelInfo
-        request.getRequestDetails().setModelInfo(vfModuleItem);
-
-        // requestInfo
-        request.getRequestDetails().setRequestInfo(constructRequestInfo());
-        String vfModuleName = aaiResponseWrapper.genVfModuleName();
-        request.getRequestDetails().getRequestInfo().setInstanceName(vfModuleName);
-
-        // relatedInstanceList
-        SoRelatedInstanceListElement relatedInstanceListElement1 = new SoRelatedInstanceListElement();
-        SoRelatedInstanceListElement relatedInstanceListElement2 = new SoRelatedInstanceListElement();
-        relatedInstanceListElement1.setRelatedInstance(new SoRelatedInstance());
-        relatedInstanceListElement2.setRelatedInstance(new SoRelatedInstance());
-
-        // Service Item
-        relatedInstanceListElement1.getRelatedInstance()
-                .setInstanceId(vnfServiceItem.getServiceInstance().getServiceInstanceId());
-        relatedInstanceListElement1.getRelatedInstance().setModelInfo(new SoModelInfo());
-        relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelType("service");
-        relatedInstanceListElement1.getRelatedInstance().getModelInfo()
-                .setModelInvariantId(vnfServiceItem.getServiceInstance().getModelInvariantId());
-        for (AaiNqExtraProperty prop : vnfServiceItem.getExtraProperties().getExtraProperty()) {
-            if (prop.getPropertyName().equals(MODEL_NAME_PROPERTY_KEY)) {
-                relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelName(prop.getPropertyValue());
-            } else if (prop.getPropertyName().equals(MODEL_VERSION_PROPERTY_KEY)) {
-                relatedInstanceListElement1.getRelatedInstance().getModelInfo()
-                        .setModelVersion(prop.getPropertyValue());
-            } else if (prop.getPropertyName().equals(MODEL_VERSION_ID_PROPERTY_KEY)) {
-                relatedInstanceListElement1.getRelatedInstance().getModelInfo()
-                        .setModelVersionId(prop.getPropertyValue());
-            }
-        }
-
-        // VNF Item
-        relatedInstanceListElement2.getRelatedInstance().setInstanceId(vnfItem.getGenericVnf().getVnfId());
-        relatedInstanceListElement2.getRelatedInstance().setModelInfo(new SoModelInfo());
-        relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelType("vnf");
-        relatedInstanceListElement2.getRelatedInstance().getModelInfo()
-                .setModelInvariantId(vnfItem.getGenericVnf().getModelInvariantId());
-        for (AaiNqExtraProperty prop : vnfItem.getExtraProperties().getExtraProperty()) {
-            if (prop.getPropertyName().equals(MODEL_NAME_PROPERTY_KEY)) {
-                relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelName(prop.getPropertyValue());
-            } else if (prop.getPropertyName().equals(MODEL_VERSION_PROPERTY_KEY)) {
-                relatedInstanceListElement2.getRelatedInstance().getModelInfo()
-                        .setModelVersion(prop.getPropertyValue());
-            } else if (prop.getPropertyName().equals(MODEL_VERSION_ID_PROPERTY_KEY)) {
-                relatedInstanceListElement2.getRelatedInstance().getModelInfo()
-                        .setModelVersionId(prop.getPropertyValue());
-            }
-        }
-
-        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(relatedInstanceListElement1);
-        request.getRequestDetails().getRelatedInstanceList().add(relatedInstanceListElement2);
-
-        // Request Parameters
-        buildRequestParameters(policy, request.getRequestDetails());
-
-        // Configuration Parameters
-        buildConfigurationParameters(policy, request.getRequestDetails());
-        // Save the instance IDs for the VNF and service to static fields
-        // vfModuleId is not required for the create vf-module
-        preserveInstanceIds(vnfItem.getGenericVnf().getVnfId(),
-                vnfServiceItem.getServiceInstance().getServiceInstanceId(), null);
-        if (logger.isDebugEnabled()) {
-            logger.debug(CONSTRUCTED_SO_MSG, Serialization.gsonPretty.toJson(request));
-        }
-        return request;
-    }
-
-    /**
-     * Construct SO request to delete vf-module.
-     *
-     * @param tenantItem tenant item from A&AI named-query response
-     * @param vnfItem vnf item from A&AI named-query response
-     * @param vnfServiceItem vnf service item from A&AI named-query response
-     * @return SO delete vf-module request
-     */
-    private SoRequest constructDeleteRequest(AaiNqInventoryResponseItem tenantItem, AaiNqInventoryResponseItem vnfItem,
-            AaiNqInventoryResponseItem vnfServiceItem, Policy policy) {
-        SoRequest request = new SoRequest();
-        request.setOperationType(SoOperationType.DELETE_VF_MODULE);
-        request.setRequestDetails(new SoRequestDetails());
-        request.getRequestDetails().setRelatedInstanceList(null);
-        request.getRequestDetails().setConfigurationParameters(null);
-
-        // cloudConfiguration
-        request.getRequestDetails().setCloudConfiguration(constructCloudConfiguration(tenantItem));
-        // modelInfo
-        request.getRequestDetails().setModelInfo(prepareSoModelInfo(policy));
-        // requestInfo
-        request.getRequestDetails().setRequestInfo(constructRequestInfo());
-        // Save the instance IDs for the VNF, service and vfModule to static fields
-        preserveInstanceIds(vnfItem.getGenericVnf().getVnfId(),
-                vnfServiceItem.getServiceInstance().getServiceInstanceId(), null);
-
-        if (logger.isDebugEnabled()) {
-            logger.debug(CONSTRUCTED_SO_MSG, Serialization.gsonPretty.toJson(request));
-        }
-        return request;
-    }
-
     /**
      * Construct requestInfo for the SO requestDetails.
      *
@@ -356,20 +161,6 @@ public class SoActorServiceProvider implements Actor {
         return soRequestInfo;
     }
 
-    /**
-     * Construct cloudConfiguration for the SO requestDetails.
-     *
-     * @param tenantItem tenant item from A&AI named-query response
-     * @return SO cloud configuration
-     */
-    private SoCloudConfiguration constructCloudConfiguration(AaiNqInventoryResponseItem tenantItem) {
-        SoCloudConfiguration cloudConfiguration = new SoCloudConfiguration();
-        cloudConfiguration.setTenantId(tenantItem.getTenant().getTenantId());
-        cloudConfiguration.setLcpCloudRegionId(
-                tenantItem.getItems().getInventoryResponseItems().get(0).getCloudRegion().getCloudRegionId());
-        return cloudConfiguration;
-    }
-
     /**
      * This method is needed to get the serviceInstanceId and vnfInstanceId which is used in the asyncSORestCall.
      *
@@ -387,18 +178,6 @@ public class SoActorServiceProvider implements Actor {
                 lastVfModuleItemVfModuleInstanceId, (SoRequest) request);
     }
 
-    /**
-     * Find the base or non base VF module item in an AAI response. If there is more than one item, then the <i>last</i>
-     * item is returned
-     *
-     * @param aaiResponseWrapper the AAI response containing the VF modules
-     * @param baseFlag true if we are searching for the base, false if we are searching for the non base
-     * @return the base or non base VF module item or null if the module was not found
-     */
-    private AaiNqInventoryResponseItem findVfModule(AaiNqResponseWrapper aaiResponseWrapper, boolean baseFlag) {
-        List<AaiNqInventoryResponseItem> lst = aaiResponseWrapper.getVfModuleItems(baseFlag);
-        return (lst.isEmpty() ? null : lst.get(lst.size() - 1));
-    }
 
     /**
      * Builds the request parameters from the policy payload.
@@ -471,7 +250,7 @@ public class SoActorServiceProvider implements Actor {
      */
     public SoRequest constructRequestCq(VirtualControlLoopEvent onset, ControlLoopOperation operation, Policy policy,
             AaiCqResponse aaiCqResponse) {
-        if (!SO_ACTOR.equals(policy.getActor()) || !recipes().contains(policy.getRecipe())) {
+        if (!NAME.equals(policy.getActor()) || !recipes().contains(policy.getRecipe())) {
             return null;
         }
 
@@ -678,4 +457,6 @@ public class SoActorServiceProvider implements Actor {
         return cloudConfiguration;
     }
 
+    // **HERE**
+
 }