Fix Tech Debt/JUnit on APPC and APPCLCM actors 39/28739/1
authorliamfallon <liam.fallon@ericsson.com>
Sat, 20 Jan 2018 11:22:27 +0000 (11:22 +0000)
committerliamfallon <liam.fallon@ericsson.com>
Sun, 21 Jan 2018 18:39:46 +0000 (18:39 +0000)
Unit test updated to increase coverage on getter methods.
Constants added for some string literals to reduce technical debt warnings.

Change-Id: I3b175de7c65aa9d342e71adc951d1ee08c9d781b
Issue-ID: POLICY-455
Signed-off-by: liamfallon <liam.fallon@ericsson.com>
controlloop/common/actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/APPCActorServiceProvider.java
controlloop/common/actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java
controlloop/common/actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmActorServiceProvider.java
controlloop/common/actors/actor.appclcm/src/test/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmServiceProviderTest.java
controlloop/common/model-impl/appclcm/src/test/java/org/onap/policy/appclcm/util/TestSerialization.java [moved from controlloop/common/model-impl/appclcm/src/test/java/org/onap/policy/applcm/util/TestSerialization.java with 98% similarity]

index c0bbfe8..929b319 100644 (file)
@@ -38,16 +38,25 @@ import com.google.common.collect.ImmutableMap;
 
 
 public class APPCActorServiceProvider implements Actor {
+       // Strings for targets
+       private static final String TARGET_VM  = "VM";
+       private static final String TARGET_VNF = "VNF";
 
-       private static final ImmutableList<String> recipes = ImmutableList.of("Restart", "Rebuild", "Migrate", "ModifyConfig");
+       // Strings for recipes
+       private static final String RECIPE_RESTART = "Restart";
+       private static final String RECIPE_REBUILD = "Rebuild";
+       private static final String RECIPE_MIGRATE = "Migrate";
+       private static final String RECIPE_MODIFY  = "ModifyConfig";
+
+       private static final ImmutableList<String> recipes = ImmutableList.of(RECIPE_RESTART, RECIPE_REBUILD, RECIPE_MIGRATE, RECIPE_MODIFY);
        private static final ImmutableMap<String, List<String>> targets = new ImmutableMap.Builder<String, List<String>>()
-                       .put("Restart", ImmutableList.of("VM"))
-                       .put("Rebuild", ImmutableList.of("VM"))
-                       .put("Migrate", ImmutableList.of("VM"))
-                       .put("ModifyConfig", ImmutableList.of("VNF"))
+                       .put(RECIPE_RESTART, ImmutableList.of(TARGET_VM))
+                       .put(RECIPE_REBUILD, ImmutableList.of(TARGET_VM))
+                       .put(RECIPE_MIGRATE, ImmutableList.of(TARGET_VM))
+                       .put(RECIPE_MODIFY, ImmutableList.of(TARGET_VNF))
                        .build();
        private static final ImmutableMap<String, List<String>> payloads = new ImmutableMap.Builder<String, List<String>>()
-                       .put("ModifyConfig", ImmutableList.of("generic-vnf.vnf-id"))
+                       .put(RECIPE_MODIFY, ImmutableList.of("generic-vnf.vnf-id"))
                        .build();
 
        @Override
index 89de717..58510ba 100644 (file)
@@ -127,7 +127,7 @@ public class AppcServiceProviderTest {
 
         /* An action is required and cannot be null */
         assertNotNull(appcRequest.getAction());
-        assertEquals(appcRequest.getAction(), "ModifyConfig");
+        assertEquals("ModifyConfig", appcRequest.getAction());
 
         /* A payload is required and cannot be null */
         assertNotNull(appcRequest.getPayload());
@@ -157,4 +157,13 @@ public class AppcServiceProviderTest {
         logger.debug("JSON Output: \n" + jsonResponse);
     }
 
+    @Test
+    public void testMethods() {
+               APPCActorServiceProvider sp = new APPCActorServiceProvider();
+       
+               assertEquals("APPC", sp.actor());
+               assertEquals(4, sp.recipes().size());
+               assertEquals("VM", sp.recipeTargets("Restart").get(0));
+               assertEquals(0, sp.recipePayloads("Restart").size());
+    }
 }
index 8e416cb..813ddfa 100644 (file)
@@ -56,291 +56,303 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class AppcLcmActorServiceProvider implements Actor {
-    
-    private static final Logger logger = LoggerFactory.getLogger(AppcLcmActorServiceProvider.class);
-
-    /* To be used in future releases to restart a single vm */
-    private static final String APPC_VM_ID = "vm-id";
-    
-    /* To be used in future releases when LCM ConfigModify is used */
-    private static final String APPC_REQUEST_PARAMS = "request-parameters";
-    private static final String APPC_CONFIG_PARAMS = "configuration-parameters";
-
-    private static final ImmutableList<String> recipes = ImmutableList.of("Restart", "Rebuild", "Migrate",
-            "ConfigModify");
-    private static final ImmutableMap<String, List<String>> targets = new ImmutableMap.Builder<String, List<String>>()
-            .put("Restart", ImmutableList.of("VM")).put("Rebuild", ImmutableList.of("VM"))
-            .put("Migrate", ImmutableList.of("VM")).put("ConfigModify", ImmutableList.of("VNF")).build();
-    private static final ImmutableMap<String, List<String>> payloads = new ImmutableMap.Builder<String, List<String>>()
-            .put("Restart", ImmutableList.of(APPC_VM_ID))
-            .put("ConfigModify", ImmutableList.of(APPC_REQUEST_PARAMS, APPC_CONFIG_PARAMS)).build();
-
-    @Override
-    public String actor() {
-        return "APPC";
-    }
-
-    @Override
-    public List<String> recipes() {
-        return ImmutableList.copyOf(recipes);
-    }
-
-    @Override
-    public List<String> recipeTargets(String recipe) {
-        return ImmutableList.copyOf(targets.getOrDefault(recipe, Collections.emptyList()));
-    }
-
-    @Override
-    public List<String> recipePayloads(String recipe) {
-        return ImmutableList.copyOf(payloads.getOrDefault(recipe, Collections.emptyList()));
-    }
-    
-    /**
-     * This method recursively traverses the A&AI named query response
-     * to find the generic-vnf object that contains a model-invariant-id
-     * that matches the resourceId of the policy. Once this match is found
-     * the generic-vnf object's vnf-id is returned.
-     * 
-     * @param items
-     *          the list of items related to the vnf returned by A&AI
-     * @param resourceId
-     *          the id of the target from the sdc catalog
-     *          
-     * @return the vnf-id of the target vnf to act upon or null if not found
-     */
-    private static String parseAAIResponse(List<AAINQInventoryResponseItem> items, String resourceId) {
-        String vnfId = null;
-        for (AAINQInventoryResponseItem item: items) {
-            if ((item.getGenericVNF() != null)
-                    && (item.getGenericVNF().getModelInvariantId() != null) 
-                    && (resourceId.equals(item.getGenericVNF().getModelInvariantId()))) {
-                vnfId = item.getGenericVNF().getVnfID();
-                break;
-            } 
-            else {
-                if((item.getItems() != null) && (item.getItems().getInventoryResponseItems() != null)) {
-                    vnfId = parseAAIResponse(item.getItems().getInventoryResponseItems(), resourceId);
-                }
-            }
-        }
-        return vnfId;
-    }
-        
-    /**
-     * Constructs an A&AI Named Query using a source vnf-id to determine 
-     * the vnf-id of the target entity specified in the policy to act upon.
-     * 
-     * @param resourceId
-     *            the id of the target from the sdc catalog
-     *            
-     * @param sourceVnfId
-     *            the vnf id of the source entity reporting the alert
-     *            
-     * @return the target entities vnf id to act upon
-     * @throws AAIException 
-     */
-    public static String vnfNamedQuery(String resourceId, String sourceVnfId) throws AAIException {
-        
-        //TODO: This request id should not be hard coded in future releases
-        UUID requestId = UUID.fromString("a93ac487-409c-4e8c-9e5f-334ae8f99087");
-        
-        AAINQRequest aaiRequest = new AAINQRequest();
-        aaiRequest.setQueryParameters(new AAINQQueryParameters());
-        aaiRequest.getQueryParameters().setNamedQuery(new AAINQNamedQuery());
-        aaiRequest.getQueryParameters().getNamedQuery().setNamedQueryUUID(requestId);
-        
-        Map<String, Map<String, String>> filter = new HashMap<>();        
-        Map<String, String> filterItem = new HashMap<>();
-        
-        filterItem.put("vnf-id", sourceVnfId);
-        filter.put("generic-vnf", filterItem);
-        
-        aaiRequest.setInstanceFilters(new AAINQInstanceFilters());
-        aaiRequest.getInstanceFilters().getInstanceFilter().add(filter);
-        
-        /*
-         * Obtain A&AI credentials from properties.environment file
-         * TODO: What if these are null?
-         */
-        String aaiUrl = PolicyEngine.manager.getEnvironmentProperty("aai.url");
-        String aaiUsername = PolicyEngine.manager.getEnvironmentProperty("aai.username");
-        String aaiPassword = PolicyEngine.manager.getEnvironmentProperty("aai.password");
-        
-        AAINQResponse aaiResponse = new AAIManager(new RESTManager()).postQuery(
-                        aaiUrl,
-                        aaiUsername, aaiPassword, 
-                        aaiRequest, requestId);
-        
-        if (aaiResponse == null) {
-            throw new AAIException("The named query response was null");
-        }
-
-        String targetVnfId = parseAAIResponse(aaiResponse.getInventoryResponseItems(), resourceId);
-        if (targetVnfId == null) {
-            throw new AAIException("Target vnf-id could not be found"); 
-        }
-        
-        return targetVnfId;
-    }
-    
-    /**
-     * Constructs an APPC 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                        
-     * @return an APPC request conforming to the lcm API using the DMAAP wrapper
-     * @throws AAIException 
-     */
-    public static LCMRequestWrapper constructRequest(VirtualControlLoopEvent onset, 
-                ControlLoopOperation operation, Policy policy, String targetVnf) throws AAIException {
-        
-        /* Construct an APPC request using LCM Model */
-        
-        /*
-         * The actual LCM request is placed in a wrapper used to send
-         * through dmaap. The current version is 2.0 as of R1.
-         */
-        LCMRequestWrapper dmaapRequest = new LCMRequestWrapper();
-        dmaapRequest.setVersion("2.0");
-        dmaapRequest.setCorrelationId(onset.getRequestID() + "-" + operation.getSubRequestId());
-        dmaapRequest.setRpcName(policy.getRecipe().toLowerCase());
-        dmaapRequest.setType("request");
-        
-        /* This is the actual request that is placed in the dmaap wrapper. */
-        LCMRequest appcRequest = new LCMRequest();
-        
-        /* The common header is a required field for all APPC requests. */
-        LCMCommonHeader requestCommonHeader = new LCMCommonHeader();
-        requestCommonHeader.setOriginatorId(onset.getRequestID().toString());
-        requestCommonHeader.setRequestId(onset.getRequestID());
-        requestCommonHeader.setSubRequestId(operation.getSubRequestId());
-        
-        appcRequest.setCommonHeader(requestCommonHeader);
-
-        /* 
-         * Action Identifiers are required for APPC LCM requests.
-         * For R1, the recipes supported by Policy only require
-         * a vnf-id.
-         */
-        HashMap<String, String> requestActionIdentifiers = new HashMap<>();
-        requestActionIdentifiers.put("vnf-id", targetVnf);
-        
-        appcRequest.setActionIdentifiers(requestActionIdentifiers);
-        
-        /* 
-         * An action is required for all APPC requests, this will 
-         * be the recipe specified in the policy.
-         */
-        appcRequest.setAction(policy.getRecipe().substring(0, 1).toUpperCase() 
-                + policy.getRecipe().substring(1).toLowerCase());
-
-        /*
-         * For R1, the payloads will not be required for the Restart, 
-         * Rebuild, or Migrate recipes. APPC will populate the payload
-         * based on A&AI look up of the vnd-id provided in the action
-         * identifiers.
-         */
-        if ("Restart".equalsIgnoreCase(policy.getRecipe()) || "Rebuild".equalsIgnoreCase(policy.getRecipe())
-                || "Migrate".equalsIgnoreCase(policy.getRecipe())) {
-            appcRequest.setPayload(null);
-        }
-        
-        /* 
-         * Once the LCM request is constructed, add it into the 
-         * body of the dmaap wrapper.
-         */
-        dmaapRequest.setBody(appcRequest);
-        
-        /* Return the request to be sent through dmaap. */
-        return dmaapRequest;
-    }
-    
-    /**
-     * Parses the operation attempt using the subRequestId
-     * of APPC response.
-     * 
-     * @param subRequestId
-     *            the sub id used to send to APPC, Policy sets
-     *            this using the operation attempt
-     *            
-     * @return the current operation attempt
-     */
-    public static Integer parseOperationAttempt(String subRequestId) {
-        Integer operationAttempt;
-        try {
-            operationAttempt = Integer.parseInt(subRequestId);
-        } catch (NumberFormatException e) {
-            logger.debug("A NumberFormatException was thrown due to error in parsing the operation attempt");
-            return null;
-        }
-        return operationAttempt;
-    }
-    
-    /**
-     * Processes the APPC LCM response sent from APPC. Determines
-     * if the APPC operation was successful/unsuccessful and maps
-     * this to the corresponding Policy result.
-     * 
-     * @param dmaapResponse
-     *            the dmaap wrapper message that contains the
-     *            actual APPC reponse inside the body field
-     *                       
-     * @return an key-value pair that contains the Policy result
-     * and APPC response message
-     */
-    public static SimpleEntry<PolicyResult, String> processResponse(LCMResponseWrapper dmaapResponse) {
-        /* The actual APPC response is inside the wrapper's body field. */
-        LCMResponse appcResponse = dmaapResponse.getBody();
-        
-        /* The message returned in the APPC response. */
-        String message;
-        
-        /* The Policy result determined from the APPC Response. */
-        PolicyResult result;
-        
-        /* If there is no status, Policy cannot determine if the request was successful. */
-        if (appcResponse.getStatus() == null) {
-            message = "Policy was unable to parse APP-C response status field (it was null).";
-            return new AbstractMap.SimpleEntry<>(PolicyResult.FAILURE_EXCEPTION, message);
-        }
-        
-        /* If there is no code, Policy cannot determine if the request was successful. */
-        String responseValue = LCMResponseCode.toResponseValue(appcResponse.getStatus().getCode());
-        if (responseValue == null) {
-            message = "Policy was unable to parse APP-C response status code field.";
-            return new AbstractMap.SimpleEntry<>(PolicyResult.FAILURE_EXCEPTION, message);
-        }
-        
-        /* Save the APPC response's message for Policy noticiation message. */
-        message = appcResponse.getStatus().getMessage();
-        
-        /* Maps the APPC response result to a Policy result. */
-        switch (responseValue) {
-            case LCMResponseCode.ACCEPTED:
-                /* Nothing to do if code is accept, continue processing */
-                result = null;
-                break;
-            case LCMResponseCode.SUCCESS:
-                result = PolicyResult.SUCCESS;
-                break;
-            case LCMResponseCode.FAILURE:
-                result = PolicyResult.FAILURE;
-                break;
-            case LCMResponseCode.REJECT:
-            case LCMResponseCode.ERROR:
-            default:
-                result = PolicyResult.FAILURE_EXCEPTION;
-        }
-        return new AbstractMap.SimpleEntry<>(result, message);
-    }
 
+       private static final Logger logger = LoggerFactory.getLogger(AppcLcmActorServiceProvider.class);
+
+       /* To be used in future releases to restart a single vm */
+       private static final String APPC_VM_ID = "vm-id";
+       
+       // Strings for targets
+       private static final String TARGET_VM  = "VM";
+       private static final String TARGET_VNF = "VNF";
+
+       // Strings for recipes
+       private static final String RECIPE_RESTART = "Restart";
+       private static final String RECIPE_REBUILD = "Rebuild";
+       private static final String RECIPE_MIGRATE = "Migrate";
+       private static final String RECIPE_MODIFY  = "ConfigModify";
+       
+       /* To be used in future releases when LCM ConfigModify is used */
+       private static final String APPC_REQUEST_PARAMS = "request-parameters";
+       private static final String APPC_CONFIG_PARAMS = "configuration-parameters";
+
+       private static final ImmutableList<String> recipes = ImmutableList.of(RECIPE_RESTART, RECIPE_REBUILD, RECIPE_MIGRATE, RECIPE_MODIFY);
+       private static final ImmutableMap<String, List<String>> targets = new ImmutableMap.Builder<String, List<String>>()
+                       .put(RECIPE_RESTART, ImmutableList.of(TARGET_VM)).put(RECIPE_REBUILD, ImmutableList.of(TARGET_VM))
+                       .put(RECIPE_MIGRATE, ImmutableList.of(TARGET_VM)).put(RECIPE_MODIFY, ImmutableList.of(TARGET_VNF)).build();
+       private static final ImmutableMap<String, List<String>> payloads = new ImmutableMap.Builder<String, List<String>>()
+                       .put(RECIPE_RESTART, ImmutableList.of(APPC_VM_ID))
+                       .put(RECIPE_MODIFY, ImmutableList.of(APPC_REQUEST_PARAMS, APPC_CONFIG_PARAMS)).build();
+
+       @Override
+       public String actor() {
+               return "APPC";
+       }
+
+       @Override
+       public List<String> recipes() {
+               return ImmutableList.copyOf(recipes);
+       }
+
+       @Override
+       public List<String> recipeTargets(String recipe) {
+               return ImmutableList.copyOf(targets.getOrDefault(recipe, Collections.emptyList()));
+       }
+
+       @Override
+       public List<String> recipePayloads(String recipe) {
+               return ImmutableList.copyOf(payloads.getOrDefault(recipe, Collections.emptyList()));
+       }
+
+       /**
+        * This method recursively traverses the A&AI named query response
+        * to find the generic-vnf object that contains a model-invariant-id
+        * that matches the resourceId of the policy. Once this match is found
+        * the generic-vnf object's vnf-id is returned.
+        * 
+        * @param items
+        *          the list of items related to the vnf returned by A&AI
+        * @param resourceId
+        *          the id of the target from the sdc catalog
+        *          
+        * @return the vnf-id of the target vnf to act upon or null if not found
+        */
+       private static String parseAAIResponse(List<AAINQInventoryResponseItem> items, String resourceId) {
+               String vnfId = null;
+               for (AAINQInventoryResponseItem item: items) {
+                       if ((item.getGenericVNF() != null)
+                                       && (item.getGenericVNF().getModelInvariantId() != null) 
+                                       && (resourceId.equals(item.getGenericVNF().getModelInvariantId()))) {
+                               vnfId = item.getGenericVNF().getVnfID();
+                               break;
+                       } 
+                       else {
+                               if((item.getItems() != null) && (item.getItems().getInventoryResponseItems() != null)) {
+                                       vnfId = parseAAIResponse(item.getItems().getInventoryResponseItems(), resourceId);
+                               }
+                       }
+               }
+               return vnfId;
+       }
+
+       /**
+        * Constructs an A&AI Named Query using a source vnf-id to determine 
+        * the vnf-id of the target entity specified in the policy to act upon.
+        * 
+        * @param resourceId
+        *            the id of the target from the sdc catalog
+        *            
+        * @param sourceVnfId
+        *            the vnf id of the source entity reporting the alert
+        *            
+        * @return the target entities vnf id to act upon
+        * @throws AAIException 
+        */
+       public static String vnfNamedQuery(String resourceId, String sourceVnfId) throws AAIException {
+
+               //TODO: This request id should not be hard coded in future releases
+               UUID requestId = UUID.fromString("a93ac487-409c-4e8c-9e5f-334ae8f99087");
+
+               AAINQRequest aaiRequest = new AAINQRequest();
+               aaiRequest.setQueryParameters(new AAINQQueryParameters());
+               aaiRequest.getQueryParameters().setNamedQuery(new AAINQNamedQuery());
+               aaiRequest.getQueryParameters().getNamedQuery().setNamedQueryUUID(requestId);
+
+               Map<String, Map<String, String>> filter = new HashMap<>();        
+               Map<String, String> filterItem = new HashMap<>();
+
+               filterItem.put("vnf-id", sourceVnfId);
+               filter.put("generic-vnf", filterItem);
+
+               aaiRequest.setInstanceFilters(new AAINQInstanceFilters());
+               aaiRequest.getInstanceFilters().getInstanceFilter().add(filter);
+
+               AAINQResponse aaiResponse = new AAIManager(new RESTManager()).postQuery(
+                               getPEManagerEnvProperty("aai.url"), getPEManagerEnvProperty("aai.username"), getPEManagerEnvProperty("aai.password"), 
+                               aaiRequest, requestId);
+
+               if (aaiResponse == null) {
+                       throw new AAIException("The named query response was null");
+               }
+
+               String targetVnfId = parseAAIResponse(aaiResponse.getInventoryResponseItems(), resourceId);
+               if (targetVnfId == null) {
+                       throw new AAIException("Target vnf-id could not be found"); 
+               }
+
+               return targetVnfId;
+       }
+
+       /**
+        * Constructs an APPC 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                        
+        * @return an APPC request conforming to the lcm API using the DMAAP wrapper
+        */
+       public static LCMRequestWrapper constructRequest(VirtualControlLoopEvent onset, 
+                       ControlLoopOperation operation, Policy policy, String targetVnf) {
+
+               /* Construct an APPC request using LCM Model */
+
+               /*
+                * The actual LCM request is placed in a wrapper used to send
+                * through dmaap. The current version is 2.0 as of R1.
+                */
+               LCMRequestWrapper dmaapRequest = new LCMRequestWrapper();
+               dmaapRequest.setVersion("2.0");
+               dmaapRequest.setCorrelationId(onset.getRequestID() + "-" + operation.getSubRequestId());
+               dmaapRequest.setRpcName(policy.getRecipe().toLowerCase());
+               dmaapRequest.setType("request");
+
+               /* This is the actual request that is placed in the dmaap wrapper. */
+               LCMRequest appcRequest = new LCMRequest();
+
+               /* The common header is a required field for all APPC requests. */
+               LCMCommonHeader requestCommonHeader = new LCMCommonHeader();
+               requestCommonHeader.setOriginatorId(onset.getRequestID().toString());
+               requestCommonHeader.setRequestId(onset.getRequestID());
+               requestCommonHeader.setSubRequestId(operation.getSubRequestId());
+
+               appcRequest.setCommonHeader(requestCommonHeader);
+
+               /* 
+                * Action Identifiers are required for APPC LCM requests.
+                * For R1, the recipes supported by Policy only require
+                * a vnf-id.
+                */
+               HashMap<String, String> requestActionIdentifiers = new HashMap<>();
+               requestActionIdentifiers.put("vnf-id", targetVnf);
+
+               appcRequest.setActionIdentifiers(requestActionIdentifiers);
+
+               /* 
+                * An action is required for all APPC requests, this will 
+                * be the recipe specified in the policy.
+                */
+               appcRequest.setAction(policy.getRecipe().substring(0, 1).toUpperCase() 
+                               + policy.getRecipe().substring(1).toLowerCase());
+
+               /*
+                * For R1, the payloads will not be required for the Restart, 
+                * Rebuild, or Migrate recipes. APPC will populate the payload
+                * based on A&AI look up of the vnd-id provided in the action
+                * identifiers.
+                */
+               if (RECIPE_RESTART.equalsIgnoreCase(policy.getRecipe()) || RECIPE_REBUILD.equalsIgnoreCase(policy.getRecipe())
+                               || RECIPE_MIGRATE.equalsIgnoreCase(policy.getRecipe())) {
+                       appcRequest.setPayload(null);
+               }
+
+               /* 
+                * Once the LCM request is constructed, add it into the 
+                * body of the dmaap wrapper.
+                */
+               dmaapRequest.setBody(appcRequest);
+
+               /* Return the request to be sent through dmaap. */
+               return dmaapRequest;
+       }
+
+       /**
+        * Parses the operation attempt using the subRequestId
+        * of APPC response.
+        * 
+        * @param subRequestId
+        *            the sub id used to send to APPC, Policy sets
+        *            this using the operation attempt
+        *            
+        * @return the current operation attempt
+        */
+       public static Integer parseOperationAttempt(String subRequestId) {
+               Integer operationAttempt;
+               try {
+                       operationAttempt = Integer.parseInt(subRequestId);
+               } catch (NumberFormatException e) {
+                       logger.debug("A NumberFormatException was thrown due to error in parsing the operation attempt");
+                       return null;
+               }
+               return operationAttempt;
+       }
+
+       /**
+        * Processes the APPC LCM response sent from APPC. Determines
+        * if the APPC operation was successful/unsuccessful and maps
+        * this to the corresponding Policy result.
+        * 
+        * @param dmaapResponse
+        *            the dmaap wrapper message that contains the
+        *            actual APPC reponse inside the body field
+        *                       
+        * @return an key-value pair that contains the Policy result
+        * and APPC response message
+        */
+       public static SimpleEntry<PolicyResult, String> processResponse(LCMResponseWrapper dmaapResponse) {
+               /* The actual APPC response is inside the wrapper's body field. */
+               LCMResponse appcResponse = dmaapResponse.getBody();
+
+               /* The message returned in the APPC response. */
+               String message;
+
+               /* The Policy result determined from the APPC Response. */
+               PolicyResult result;
+
+               /* If there is no status, Policy cannot determine if the request was successful. */
+               if (appcResponse.getStatus() == null) {
+                       message = "Policy was unable to parse APP-C response status field (it was null).";
+                       return new AbstractMap.SimpleEntry<>(PolicyResult.FAILURE_EXCEPTION, message);
+               }
+
+               /* If there is no code, Policy cannot determine if the request was successful. */
+               String responseValue = LCMResponseCode.toResponseValue(appcResponse.getStatus().getCode());
+               if (responseValue == null) {
+                       message = "Policy was unable to parse APP-C response status code field.";
+                       return new AbstractMap.SimpleEntry<>(PolicyResult.FAILURE_EXCEPTION, message);
+               }
+
+               /* Save the APPC response's message for Policy noticiation message. */
+               message = appcResponse.getStatus().getMessage();
+
+               /* Maps the APPC response result to a Policy result. */
+               switch (responseValue) {
+               case LCMResponseCode.ACCEPTED:
+                       /* Nothing to do if code is accept, continue processing */
+                       result = null;
+                       break;
+               case LCMResponseCode.SUCCESS:
+                       result = PolicyResult.SUCCESS;
+                       break;
+               case LCMResponseCode.FAILURE:
+                       result = PolicyResult.FAILURE;
+                       break;
+               case LCMResponseCode.REJECT:
+               case LCMResponseCode.ERROR:
+               default:
+                       result = PolicyResult.FAILURE_EXCEPTION;
+               }
+               return new AbstractMap.SimpleEntry<>(result, message);
+       }
+
+       /**
+        * This method reads and validates environmental properties coming from the policy engine. Null properties cause
+        * an {@link IllegalArgumentException} runtime exception to be thrown 
+        * @param string the name of the parameter to retrieve
+        * @return the property value
+        */
+       private static String getPEManagerEnvProperty(String enginePropertyName) {
+               String enginePropertyValue = PolicyEngine.manager.getEnvironmentProperty(enginePropertyName);
+               if (enginePropertyValue == null) {
+                       throw new IllegalArgumentException("The value of policy engine manager environment property \"" + enginePropertyName + "\" may not be null");
+               }
+               return enginePropertyValue;
+       }
 }
index b498566..cf53602 100644 (file)
@@ -163,19 +163,13 @@ public class AppcLcmServiceProviderTest {
     @Test
     public void constructRestartRequestTest() {
         
-        LCMRequestWrapper dmaapRequest = null;
-        try {
-            dmaapRequest = AppcLcmActorServiceProvider.constructRequest(onsetEvent, operation, policy, "vnf01");
-        } catch (AAIException e) {
-            logger.warn(e.toString());
-            fail("no vnfid found");
-        }
+        LCMRequestWrapper dmaapRequest =  AppcLcmActorServiceProvider.constructRequest(onsetEvent, operation, policy, "vnf01");
 
         /* The service provider must return a non null DMAAP request wrapper */
         assertNotNull(dmaapRequest);
 
         /* The DMAAP wrapper's type field must be request */
-        assertEquals(dmaapRequest.getType(), "request");
+        assertEquals("request", dmaapRequest.getType());
         
         /* The DMAAP wrapper's body field cannot be null */
         assertNotNull(dmaapRequest.getBody());
@@ -188,12 +182,12 @@ public class AppcLcmServiceProviderTest {
 
         /* An action is required and cannot be null */
         assertNotNull(appcRequest.getAction());
-        assertEquals(appcRequest.getAction(), "Restart");
+        assertEquals("Restart", appcRequest.getAction());
 
         /* Action Identifiers are required and cannot be null */
         assertNotNull(appcRequest.getActionIdentifiers());
         assertNotNull(appcRequest.getActionIdentifiers().get("vnf-id"));
-        assertEquals(appcRequest.getActionIdentifiers().get("vnf-id"), "vnf01");
+        assertEquals("vnf01", appcRequest.getActionIdentifiers().get("vnf-id"));
         
         logger.debug("APPC Request: \n" + appcRequest.toString());
     }
@@ -205,8 +199,8 @@ public class AppcLcmServiceProviderTest {
     public void processRestartResponseSuccessTest() {
         AbstractMap.SimpleEntry<PolicyResult, String> result = AppcLcmActorServiceProvider
                 .processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.SUCCESS);
-        assertEquals(result.getValue(), "Restart Successful");
+        assertEquals(PolicyResult.SUCCESS, result.getKey());
+        assertEquals("Restart Successful", result.getValue());
     }
     
     /**
@@ -221,82 +215,82 @@ public class AppcLcmServiceProviderTest {
         dmaapResponse.getBody().getStatus().setCode(100);
         dmaapResponse.getBody().getStatus().setMessage("ACCEPTED");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), null);
+        assertEquals(null, result.getKey());
         
         /* If APPC is successful, PolicyResult is success */
         dmaapResponse.getBody().getStatus().setCode(400);
         dmaapResponse.getBody().getStatus().setMessage("SUCCESS");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.SUCCESS);
+        assertEquals(PolicyResult.SUCCESS, result.getKey());
         
         /* If APPC returns an error, PolicyResult is failure exception */
         dmaapResponse.getBody().getStatus().setCode(200);
         dmaapResponse.getBody().getStatus().setMessage("ERROR");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         /* If APPC rejects, PolicyResult is failure exception */
         dmaapResponse.getBody().getStatus().setCode(300);
         dmaapResponse.getBody().getStatus().setMessage("REJECT");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         /* Test multiple reject codes */
         dmaapResponse.getBody().getStatus().setCode(306);
         dmaapResponse.getBody().getStatus().setMessage("REJECT");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         dmaapResponse.getBody().getStatus().setCode(313);
         dmaapResponse.getBody().getStatus().setMessage("REJECT");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         /* If APPC returns failure, PolicyResult is failure */
         dmaapResponse.getBody().getStatus().setCode(401);
         dmaapResponse.getBody().getStatus().setMessage("FAILURE");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE);
+        assertEquals(PolicyResult.FAILURE, result.getKey());
         
         /* Test multiple failure codes */
         dmaapResponse.getBody().getStatus().setCode(406);
         dmaapResponse.getBody().getStatus().setMessage("FAILURE");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE);
+        assertEquals(PolicyResult.FAILURE, result.getKey());
         
         dmaapResponse.getBody().getStatus().setCode(450);
         dmaapResponse.getBody().getStatus().setMessage("FAILURE");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE);
+        assertEquals(PolicyResult.FAILURE, result.getKey());
         
         /* If APPC returns partial success, PolicyResult is failure exception */
         dmaapResponse.getBody().getStatus().setCode(500);
         dmaapResponse.getBody().getStatus().setMessage("PARTIAL SUCCESS");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         /* If APPC returns partial failure, PolicyResult is failure exception */
         dmaapResponse.getBody().getStatus().setCode(501);
         dmaapResponse.getBody().getStatus().setMessage("PARTIAL FAILURE");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         /* Test multiple partial failure codes */
         dmaapResponse.getBody().getStatus().setCode(599);
         dmaapResponse.getBody().getStatus().setMessage("PARTIAL FAILURE");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         dmaapResponse.getBody().getStatus().setCode(550);
         dmaapResponse.getBody().getStatus().setMessage("PARTIAL FAILURE");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
         
         /* If APPC code is unknown to Policy, PolicyResult is failure exception */
         dmaapResponse.getBody().getStatus().setCode(700);
         dmaapResponse.getBody().getStatus().setMessage("UNKNOWN");
         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-        assertEquals(result.getKey(), PolicyResult.FAILURE_EXCEPTION);
+        assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
     }
     
     /**
@@ -315,6 +309,19 @@ public class AppcLcmServiceProviderTest {
             fail("no vnf-id found");
         }
         assertNotNull(targetVnfId);
-        assertEquals(targetVnfId, "vnf01");
+        assertEquals("vnf01", targetVnfId);
+    }
+    
+    /**
+     * THis test exercises getters not exercised in other tests
+     */
+    @Test
+    public void testMethods() {
+               AppcLcmActorServiceProvider sp = new AppcLcmActorServiceProvider();
+       
+               assertEquals("APPC", sp.actor());
+               assertEquals(4, sp.recipes().size());
+               assertEquals("VM", sp.recipeTargets("Restart").get(0));
+               assertEquals("vm-id", sp.recipePayloads("Restart").get(0));
     }
 }