Implementation for Restconf api call node
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / RestapiCallNode.java
index d215d90..6a9e81b 100644 (file)
 
 package org.onap.ccsdk.sli.plugins.restapicall;
 
+import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.ClientHandlerException;
+import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.UniformInterfaceException;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
+import com.sun.jersey.api.client.filter.HTTPDigestAuthFilter;
+import com.sun.jersey.client.urlconnection.HTTPSProperties;
+import com.sun.jersey.oauth.client.OAuthClientFilter;
+import com.sun.jersey.oauth.signature.OAuthParameters;
+import com.sun.jersey.oauth.signature.OAuthSecrets;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriBuilder;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.SocketException;
@@ -37,36 +62,11 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.Set;
 
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.ws.rs.core.EntityTag;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriBuilder;
-
-import org.apache.commons.lang3.StringUtils;
-import org.codehaus.jettison.json.JSONException;
-import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
-import org.onap.ccsdk.sli.core.sli.SvcLogicException;
-import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
-import com.sun.jersey.api.client.filter.HTTPDigestAuthFilter;
-import com.sun.jersey.oauth.client.OAuthClientFilter;
-import com.sun.jersey.oauth.signature.OAuthParameters;
-import com.sun.jersey.oauth.signature.OAuthSecrets;
-import com.sun.jersey.client.urlconnection.HTTPSProperties;
+import static java.lang.Boolean.valueOf;
+import static org.onap.ccsdk.sli.plugins.restapicall.AuthType.fromString;
 
 public class RestapiCallNode implements SvcLogicJavaPlugin {
 
@@ -75,8 +75,12 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
     private String uebServers;
     private String defaultUebTemplateFileName = "/opt/bvc/restapi/templates/default-ueb-message.json";
     protected RetryPolicyStore retryPolicyStore;
+    protected static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties";
+    protected static final String UEB_PROPERTIES_FILE_NAME = "ueb.properties";
+    protected static final String DEFAULT_PROPERTIES_DIR = "/opt/onap/ccsdk/data/properties";
+    protected static final String PROPERTIES_DIR_KEY = "SDNC_CONFIG_DIR";
 
-    protected RetryPolicyStore getRetryPolicyStore() {
+    public RetryPolicyStore getRetryPolicyStore() {
         return retryPolicyStore;
     }
 
@@ -85,12 +89,31 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
     }
 
     public RestapiCallNode() {
+        String configDir = System.getProperty(PROPERTIES_DIR_KEY, DEFAULT_PROPERTIES_DIR);
+
+        try (FileInputStream in = new FileInputStream(configDir + "/" + DME2_PROPERTIES_FILE_NAME)) {
+            Properties props = new Properties();
+            props.load(in);
+            this.retryPolicyStore = new RetryPolicyStore();
+            this.retryPolicyStore.setProxyServers(props.getProperty("proxyUrl"));
+            log.info("DME2 support enabled");
+        } catch (Exception e) {
+            log.warn("DME2 properties could not be read, DME2 support will not be enabled.", e);
+        }
 
+        try (FileInputStream in = new FileInputStream(configDir + "/" + UEB_PROPERTIES_FILE_NAME)) {
+            Properties props = new Properties();
+            props.load(in);
+            this.uebServers = props.getProperty("servers");
+            log.info("UEB support enabled");
+        } catch (Exception e) {
+            log.warn("UEB properties could not be read, UEB support will not be enabled.", e);
+        }
     }
 
      /**
      * Allows Directed Graphs  the ability to interact with REST APIs.
-     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * @param paramMap HashMap<String,String> of parameters passed by the DG to this function
      * <table border="1">
      *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th><th>example values</th></thead>
      *  <tbody>
@@ -112,6 +135,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
      *      <tr><td>customHttpHeaders</td><td>Optional</td><td>a list additional http headers to be passed in, follow the format in the example</td><td>X-CSI-MessageId=messageId,headerFieldName=headerFieldValue</td></tr>
      *      <tr><td>dumpHeaders</td><td>Optional</td><td>when true writes http header content to context memory</td><td>true or false</td></tr>
      *      <tr><td>partner</td><td>Optional</td><td>needed for DME2 calls</td><td>dme2proxy</td></tr>
+     *      <tr><td>returnRequestPayload</td><td>Optional</td><td>used to return payload built in the request</td><td>true or false</td></tr>
      *  </tbody>
      * </table>
      * @param ctx Reference to context memory
@@ -129,7 +153,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         RetryPolicy retryPolicy = null;
         HttpResponse r = new HttpResponse();
         try {
-            Parameters p = getParameters(paramMap);
+            Parameters p = getParameters(paramMap, new Parameters());
             if (p.partner != null) {
                 retryPolicy = retryPolicyStore.getRetryPolicy(p.partner);
             }
@@ -150,6 +174,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                     ctx.setAttribute(pp + "header." + a.getKey(), StringUtils.join(a.getValue(), ","));
                 }
             }
+            
+            if (p.returnRequestPayload && req != null) {
+               ctx.setAttribute(pp + "httpRequest", req);
+            }
 
             if (r.body != null && r.body.trim().length() > 0) {
                 ctx.setAttribute(pp + "httpResponse", r.body);
@@ -216,48 +244,88 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             throw new SvcLogicException(String.valueOf(r.code) + ": " + r.message);
     }
 
-    protected Parameters getParameters(Map<String, String> paramMap) throws SvcLogicException {
-        Parameters p = new Parameters();
-        p.templateFileName = parseParam(paramMap, "templateFileName", false, null);
+    /**
+     * Returns parameters from the parameter map.
+     *
+     * @param paramMap parameter map
+     * @param p        parameters instance
+     * @return parameters filed instance
+     * @throws SvcLogicException when svc logic exception occurs
+     */
+    public static Parameters getParameters(Map<String, String> paramMap,
+                                           Parameters p)
+            throws SvcLogicException {
+        p.templateFileName = parseParam(paramMap, "templateFileName",
+                                        false, null);
         p.requestBody = parseParam(paramMap, "requestBody", false, null);
         p.restapiUrl = parseParam(paramMap, "restapiUrl", true, null);
         validateUrl(p.restapiUrl);
         p.restapiUser = parseParam(paramMap, "restapiUser", false, null);
-        p.restapiPassword = parseParam(paramMap, "restapiPassword", false, null);
-        p.oAuthConsumerKey = parseParam(paramMap, "oAuthConsumerKey", false, null);
-        p.oAuthConsumerSecret = parseParam(paramMap, "oAuthConsumerSecret", false, null);
-        p.oAuthSignatureMethod = parseParam(paramMap, "oAuthSignatureMethod", false, null);
+        p.restapiPassword = parseParam(paramMap, "restapiPassword", false,
+                                       null);
+        p.oAuthConsumerKey = parseParam(paramMap, "oAuthConsumerKey",
+                                        false, null);
+        p.oAuthConsumerSecret = parseParam(paramMap, "oAuthConsumerSecret",
+                                           false, null);
+        p.oAuthSignatureMethod = parseParam(paramMap, "oAuthSignatureMethod",
+                                            false, null);
         p.oAuthVersion = parseParam(paramMap, "oAuthVersion", false, null);
         p.contentType = parseParam(paramMap, "contentType", false, null);
-        p.format = Format.fromString(parseParam(paramMap, "format", false, "json"));
-        p.authtype = AuthType.fromString(parseParam(paramMap, "authType", false, "unspecified"));
-        p.httpMethod = HttpMethod.fromString(parseParam(paramMap, "httpMethod", false, "post"));
+        p.format = Format.fromString(parseParam(paramMap, "format", false,
+                                                "json"));
+        p.authtype = fromString(parseParam(paramMap, "authType", false,
+                                           "unspecified"));
+        p.httpMethod = HttpMethod.fromString(parseParam(paramMap, "httpMethod",
+                                                        false, "post"));
         p.responsePrefix = parseParam(paramMap, "responsePrefix", false, null);
         p.listNameList = getListNameList(paramMap);
         String skipSendingStr = paramMap.get("skipSending");
         p.skipSending = "true".equalsIgnoreCase(skipSendingStr);
-        p.convertResponse = Boolean.valueOf(parseParam(paramMap, "convertResponse", false, "true"));
-        p.trustStoreFileName = parseParam(paramMap, "trustStoreFileName", false, null);
-        p.trustStorePassword = parseParam(paramMap, "trustStorePassword", false, null);
-        p.keyStoreFileName = parseParam(paramMap, "keyStoreFileName", false, null);
-        p.keyStorePassword = parseParam(paramMap, "keyStorePassword", false, null);
-        p.ssl = p.trustStoreFileName != null && p.trustStorePassword != null && p.keyStoreFileName != null &&
-                p.keyStorePassword != null;
-        p.customHttpHeaders = parseParam(paramMap, "customHttpHeaders", false, null);
+        p.convertResponse = valueOf(parseParam(paramMap, "convertResponse",
+                                               false, "true"));
+        p.trustStoreFileName = parseParam(paramMap, "trustStoreFileName",
+                                          false, null);
+        p.trustStorePassword = parseParam(paramMap, "trustStorePassword",
+                                          false, null);
+        p.keyStoreFileName = parseParam(paramMap, "keyStoreFileName",
+                                        false, null);
+        p.keyStorePassword = parseParam(paramMap, "keyStorePassword",
+                                        false, null);
+        p.ssl = p.trustStoreFileName != null && p.trustStorePassword != null
+                && p.keyStoreFileName != null && p.keyStorePassword != null;
+        p.customHttpHeaders = parseParam(paramMap, "customHttpHeaders",
+                                         false, null);
         p.partner = parseParam(paramMap, "partner", false, null);
-        p.dumpHeaders = Boolean.valueOf(parseParam(paramMap, "dumpHeaders", false, null));
+        p.dumpHeaders = valueOf(parseParam(paramMap, "dumpHeaders",
+                                           false, null));
+        p.returnRequestPayload = valueOf(parseParam(
+                paramMap, "returnRequestPayload", false, null));
         return p;
     }
 
-    private void validateUrl(String restapiUrl) throws SvcLogicException {
+    /**
+     * Validates the given URL in the parameters.
+     *
+     * @param restapiUrl rest api URL
+     * @throws SvcLogicException when URL validation fails
+     */
+    private static void validateUrl(String restapiUrl)
+            throws SvcLogicException {
         try {
             URI.create(restapiUrl);
         } catch (IllegalArgumentException e) {
-            throw new SvcLogicException("Invalid input of url " + e.getLocalizedMessage(), e);
+            throw new SvcLogicException("Invalid input of url "
+                                                + e.getLocalizedMessage(), e);
         }
     }
 
-    protected Set<String> getListNameList(Map<String, String> paramMap) {
+    /**
+     * Returns the list of list name.
+     *
+     * @param paramMap parameters map
+     * @return list of list name
+     */
+    private static Set<String> getListNameList(Map<String, String> paramMap) {
         Set<String> ll = new HashSet<>();
         for (Map.Entry<String,String> entry : paramMap.entrySet())
             if (entry.getKey().startsWith("listName"))
@@ -265,7 +333,19 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return ll;
     }
 
-    protected String parseParam(Map<String, String> paramMap, String name, boolean required, String def)
+    /**
+     * Parses the parameter string map of property, validates if required,
+     * assigns default value if present and returns the value.
+     *
+     * @param paramMap string param map
+     * @param name     name of the property
+     * @param required if value required
+     * @param def      default value
+     * @return value of the property
+     * @throws SvcLogicException if required parameter value is empty
+     */
+    public static String parseParam(Map<String, String> paramMap, String name,
+                                    boolean required, String def)
             throws SvcLogicException {
         String s = paramMap.get(name);
 
@@ -494,7 +574,16 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return client;
     }
 
-    protected HttpResponse sendHttpRequest(String request, Parameters p) throws SvcLogicException {
+    /**
+     * Receives the http response for the http request sent.
+     *
+     * @param request request msg
+     * @param p       parameters
+     * @return HTTP response
+     * @throws SvcLogicException when sending http request fails
+     */
+    public HttpResponse sendHttpRequest(String request, Parameters p)
+            throws SvcLogicException {
 
         ClientConfig config = new DefaultClientConfig();
         SSLContext ssl = null;
@@ -663,7 +752,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         p.oAuthVersion = parseParam(paramMap, "oAuthVersion", false, null);
         p.oAuthConsumerSecret = parseParam(paramMap, "oAuthConsumerSecret", false, null);
         p.oAuthSignatureMethod = parseParam(paramMap, "oAuthSignatureMethod", false, null);
-        p.authtype = AuthType.fromString(parseParam(paramMap, "authType", false, "unspecified"));
+        p.authtype = fromString(parseParam(paramMap, "authType", false, "unspecified"));
         return p;
     }