Add junit coverage to RequestInfoBuilder class
[appc.git] / appc-config / appc-flow-controller / provider / src / main / java / org / onap / appc / flow / controller / node / RestServiceNode.java
index d931e47..b8625db 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP : APPC
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. 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.
  * 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.
- *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * ============LICENSE_END=========================================================
+ * * ============LICENSE_END=========================================================
  */
 
 package org.onap.appc.flow.controller.node;
 
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.APPC_SOUTHBOUND;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_PARAM_RESPONSE_PREFIX;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_PARAM_ERROR_MESSAGE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_PARAM_STATUS;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_STATUS_FAILURE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_STATUS_MESSAGE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_STATUS_SUCCESS;
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 import java.util.Properties;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.appc.flow.controller.data.Transaction;
 import org.onap.appc.flow.controller.executorImpl.RestExecutor;
-import org.onap.appc.flow.controller.utils.FlowControllerConstants;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
 import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
 
 public class RestServiceNode implements SvcLogicJavaPlugin {
 
-    private static final  EELFLogger log = EELFManager.getInstance().getLogger(RestServiceNode.class);
-    private static final String SDNC_CONFIG_DIR_VAR = "SDNC_CONFIG_DIR";
+    private static final EELFLogger log = EELFManager.getInstance().getLogger(RestServiceNode.class);
+    public static final String APPC_CONFIG_DIR_VAR = "APPC_CONFIG_DIR";
+
+    static final String REST_RESPONSE = "restResponse";
+
+    private final TransactionHandler transactionHandler;
+    private final RestExecutor restExecutor;
+    private final ResourceUriExtractor resourceUriExtractor;
+    private final EnvVariables envVariables;
+
+    public RestServiceNode() {
+        this.transactionHandler = new TransactionHandler();
+        this.restExecutor = new RestExecutor();
+        this.resourceUriExtractor = new ResourceUriExtractor();
+        this.envVariables = new EnvVariables();
+    }
+
+    /**
+     * Constructor for tests, prefer to use no arg constructor
+     */
+    RestServiceNode(TransactionHandler transactionHandler, RestExecutor restExecutor, ResourceUriExtractor uriExtractor,
+            EnvVariables envVariables) {
+        this.transactionHandler = transactionHandler;
+        this.restExecutor = restExecutor;
+        this.resourceUriExtractor = uriExtractor;
+        this.envVariables = envVariables;
+    }
 
     public void sendRequest(Map<String, String> inParams, SvcLogicContext ctx) throws SvcLogicException {
         String fn = "RestServiceNode.sendRequest";
         log.info("Received processParamKeys call with params : " + inParams);
-        String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PRIFIX);
+        String responsePrefix = inParams.get(INPUT_PARAM_RESPONSE_PREFIX);
         try {
             responsePrefix = StringUtils.isNotBlank(responsePrefix) ? (responsePrefix + ".") : "";
-            //Remove below for Block
-            for (Object key : ctx.getAttributeKeySet()) {
-                String parmName = (String) key;
-                String parmValue = ctx.getAttribute(parmName);
-                log.info(fn  + "Getting Key = "  + parmName + "and Value = " +  parmValue);
+            // Remove below for Block
+            for (String key : ctx.getAttributeKeySet()) {
+                log.info(fn + "Getting Key = " + key + "and Value = " + ctx.getAttribute(key));
             }
-            
-            send(ctx, inParams);
-            ctx.setAttribute(responsePrefix + FlowControllerConstants.OUTPUT_PARAM_STATUS,
-                FlowControllerConstants.OUTPUT_STATUS_SUCCESS);
-            
-        } catch (Exception e) {
-            ctx.setAttribute(responsePrefix + FlowControllerConstants.OUTPUT_PARAM_STATUS,
-                FlowControllerConstants.OUTPUT_STATUS_FAILURE);
-            ctx.setAttribute(responsePrefix + FlowControllerConstants.OUTPUT_PARAM_ERROR_MESSAGE,
-                e.getMessage());
-            log.error("Error Message : "  + e.getMessage(), e);
-            throw new SvcLogicException(e.getMessage());
-        }
-    }
 
-    private void send(SvcLogicContext ctx, Map<String, String> inParams) throws Exception {
-        try {
             Properties prop = loadProperties();
             log.info("Loaded Properties " + prop.toString());
-            String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PRIFIX);
-            String resourceUri = "";
-            if (ctx.getAttribute(FlowControllerConstants.INPUT_URL) != null
-                && !(ctx.getAttribute(FlowControllerConstants.INPUT_URL).isEmpty())) {
-                resourceUri = ctx.getAttribute(FlowControllerConstants.INPUT_URL);
-
-            } else {
-                resourceUri = resourceUri.concat(FlowControllerConstants.HTTP);
-                log.info("resourceUri=  " + resourceUri );
-                resourceUri = resourceUri.concat(ctx.getAttribute(FlowControllerConstants.INPUT_HOST_IP_ADDRESS));
-                resourceUri = resourceUri.concat(":");
-                resourceUri = resourceUri.concat(ctx.getAttribute(FlowControllerConstants.INPUT_PORT_NUMBER));
-
-                if (ctx.getAttribute(FlowControllerConstants.INPUT_CONTEXT) != null
-                    && !ctx.getAttribute(FlowControllerConstants.INPUT_CONTEXT).isEmpty()) {
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(ctx.getAttribute(FlowControllerConstants.INPUT_CONTEXT));
-                    log.info("resourceUri= " + resourceUri );
-
-                } else if (prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".context")) != null ) {
-                    log.info("resourceUri = " + resourceUri );
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                            .concat(".context")));
-
-                } else {
-                    throw new Exception("Could Not found the context for operation "
-                        + ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION));
-                }
-
-                if (ctx.getAttribute(FlowControllerConstants.INPUT_SUB_CONTEXT) != null
-                    && !ctx.getAttribute(FlowControllerConstants.INPUT_SUB_CONTEXT).isEmpty()) {
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(ctx.getAttribute(FlowControllerConstants.INPUT_SUB_CONTEXT));
-                    log.info("resourceUri" + resourceUri );
-
-                } else if (prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".sub-context")) != null ) {
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                            .concat(".sub-context")));
-                    log.info("resourceUri" + resourceUri );
-                }
-            }
+
+            String resourceUri = resourceUriExtractor.extractResourceUri(ctx, prop);
+
             log.info("Rest Constructed URL : " + resourceUri);
 
-            Transaction transaction = new Transaction();
-            transaction.setExecutionEndPoint(resourceUri);
-            transaction.setExecutionRPC(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE));
-            transaction.setAction(FlowControllerConstants.INPUT_REQUEST_ACTION);
-            if (ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE) == null
-                || ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE).isEmpty()) {
-                throw new Exception("Dont know REST operation for Action " + transaction.getExecutionRPC());
-            }
-            if (ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION) == null
-                || ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION).isEmpty()) {
-                throw new Exception("Dont know request-action " + transaction.getAction());
-            }
+            Transaction transaction = transactionHandler.buildTransaction(ctx, prop, resourceUri);
+            Map<String, String> output = restExecutor.execute(transaction, ctx);
 
-            //This code need to get changed to get the UserID and pass from a common place.
-            if (transaction.getuId() == null) {
-                transaction.setuId(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".default-rest-user")));
-            }
-            if (transaction.getPswd() == null) {
-                transaction.setPswd(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".default-rest-pass")));
-            }
+            String json = output.get(REST_RESPONSE);
+            log.info("Received response from Interface " + json);
+
+            JsonNode validatedJson = JsonValidator.validate(json);
 
-            RestExecutor restRequestExecutor = new RestExecutor();
-            Map<String, String> output = restRequestExecutor.execute(transaction, ctx);
-
-            if (isValidJson(output.get("restResponse")) != null) {
-                ctx.setAttribute(responsePrefix + "." + FlowControllerConstants.OUTPUT_STATUS_MESSAGE,
-                    output.get("restResponse"));
-//                JsonNode restResponse = isValidJson(output.get("restResponse"));
-//                for (String key : inParams.keySet()) {
-//                    if(key !=null &&  key.startsWith("output-")){
-//                            log.info("Found Key = " + key);
-//                            log.info("Found Key in Params " + inParams.get(key) + ".");
-//                            JsonNode setValue =  restResponse.findValue(inParams.get(key));                            
-//                             log.info("Found value = " + setValue);
-//                             if(setValue !=null && setValue.textValue() !=null && !setValue.textValue().isEmpty())
-//                                 ctx.setAttribute(responsePrefix + "." + key, setValue.textValue());
-//                             else
-//                                 ctx.setAttribute(responsePrefix + "." + key, null);
-//                    }
-//                }                
+            if (validatedJson != null) {
+                log.info("state is " + validatedJson.findValue("state"));
+                ctx.setAttribute(responsePrefix + OUTPUT_STATUS_MESSAGE, output.get(REST_RESPONSE));
             }
-            log.info("Response from Rest :" );
 
-        } catch(Exception e) {
-            log.error("Error Message: " + e.getMessage(), e);
-            throw e;
-        }
-    }
+            ctx.setAttribute(responsePrefix + OUTPUT_PARAM_STATUS, OUTPUT_STATUS_SUCCESS);
 
-    private Properties loadProperties() throws Exception {
-        Properties props = new Properties();
-        String propDir = System.getenv(SDNC_CONFIG_DIR_VAR);
-        if (propDir == null) {
-            throw new Exception("Cannot find Property file -" + SDNC_CONFIG_DIR_VAR);
-        }
-        String propFile = propDir + FlowControllerConstants.APPC_FLOW_CONTROLLER;
-        try (InputStream propStream = new FileInputStream(propFile)) {
-
-            props.load(propStream);
-        }
-        catch (Exception e) {
-            throw new Exception("Could not load properties file " + propFile, e);
+        } catch (Exception e) {
+            ctx.setAttribute(responsePrefix + OUTPUT_PARAM_STATUS, OUTPUT_STATUS_FAILURE);
+            ctx.setAttribute(responsePrefix + OUTPUT_PARAM_ERROR_MESSAGE, e.getMessage());
+            log.error("Error Message : " + e.getMessage(), e);
+            throw new SvcLogicException(e.getMessage());
         }
-        return props;
     }
 
-    private JsonNode isValidJson(String json) throws IOException {
-        JsonNode output;
-        log.info("Received response from Interface " + json);
-        if (json == null  || json.isEmpty()) {
-            return null;
-        }
-        try {
-            ObjectMapper objectMapper = new ObjectMapper();
-            output = objectMapper.readTree(json);
-        } catch(JsonProcessingException e) {
-            log.warn("Response received from interface is not a valid JSON block" + json, e);
-            return null;
+    private Properties loadProperties() throws Exception {
+        String directory = envVariables.getenv(APPC_CONFIG_DIR_VAR);
+        if (directory == null) {
+            throw new Exception("Cannot find Property file: " + APPC_CONFIG_DIR_VAR);
         }
-        log.info("state is " + output.findValue("state"));
-        return output;
+        String path = directory + APPC_SOUTHBOUND;
+        return PropertiesLoader.load(path);
     }
 }