CCSDK plugin has authType param for DG to sel type
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / RestapiCallNode.java
index 20c13da..d215d90 100644 (file)
@@ -62,6 +62,10 @@ 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;
 
 public class RestapiCallNode implements SvcLogicJavaPlugin {
@@ -94,6 +98,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
      *      <tr><td>restapiUrl</td><td>Mandatory</td><td>url to send the request to</td><td>https://sdncodl:8543/restconf/operations/L3VNF-API:create-update-vnf-request</td></tr>
      *      <tr><td>restapiUser</td><td>Optional</td><td>user name to use for http basic authentication</td><td>sdnc_ws</td></tr>
      *      <tr><td>restapiPassword</td><td>Optional</td><td>unencrypted password to use for http basic authentication</td><td>plain_password</td></tr>
+     *      <tr><td>oAuthConsumerKey</td><td>Optional</td><td>Consumer key to use for http oAuth authentication</td><td>plain_key</td></tr>
+     *      <tr><td>oAuthConsumerSecret</td><td>Optional</td><td>Consumer secret to use for http oAuth authentication</td><td>plain_secret</td></tr>
+     *      <tr><td>oAuthSignatureMethod</td><td>Optional</td><td>Consumer method to use for http oAuth authentication</td><td>method</td></tr>
+     *      <tr><td>oAuthVersion</td><td>Optional</td><td>Version http oAuth authentication</td><td>version</td></tr>
      *      <tr><td>contentType</td><td>Optional</td><td>http content type to set in the http header</td><td>usually application/json or application/xml</td></tr>
      *      <tr><td>format</td><td>Optional</td><td>should match request body format</td><td>json or xml</td></tr>
      *      <tr><td>httpMethod</td><td>Optional</td><td>http method to use when sending the request</td><td>get post put delete patch</td></tr>
@@ -131,6 +139,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (p.templateFileName != null) {
                 String reqTemplate = readFile(p.templateFileName);
                 req = buildXmlJsonRequest(ctx, reqTemplate, p.format);
+            } else if (p.requestBody != null) {
+                req = p.requestBody;
             }
             r = sendHttpRequest(req, p);
             setResponseStatus(ctx, p.responsePrefix, r);
@@ -183,10 +193,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                         URI retryUri = UriBuilder.fromUri(uri).host(uriTwo.getHost()).port(uriTwo.getPort()).scheme(
                                 uriTwo.getScheme()).build();
                         paramMap.put("restapiUrl", retryUri.toString());
-                        log.debug("URL was set to " + retryUri.toString());
-                        log.debug("Failed to communicate with host " + hostname +
-                                ". Request will be re-attempted using the host " + retryString + ".");
-                        log.debug("This is retry attempt " + retryCount + " out of " + retryPolicy.getMaximumRetries());
+                        log.debug("URL was set to {}", retryUri.toString());
+                        log.debug("Failed to communicate with host {}. Request will be re-attempted using the host {}.",
+                            hostname, retryString);
+                        log.debug("This is retry attempt {} out of {}", retryCount, retryPolicy.getMaximumRetries());
                         sendRequest(paramMap, ctx, retryCount);
                     } else {
                         log.debug("Maximum retries reached, calling setFailureResponseStatus.");
@@ -209,11 +219,18 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
     protected Parameters getParameters(Map<String, String> paramMap) throws SvcLogicException {
         Parameters p = new Parameters();
         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.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.responsePrefix = parseParam(paramMap, "responsePrefix", false, null);
         p.listNameList = getListNameList(paramMap);
@@ -232,6 +249,14 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return p;
     }
 
+    private void validateUrl(String restapiUrl) throws SvcLogicException {
+        try {
+            URI.create(restapiUrl);
+        } catch (IllegalArgumentException e) {
+            throw new SvcLogicException("Invalid input of url " + e.getLocalizedMessage(), e);
+        }
+    }
+
     protected Set<String> getListNameList(Map<String, String> paramMap) {
         Set<String> ll = new HashSet<>();
         for (Map.Entry<String,String> entry : paramMap.entrySet())
@@ -251,7 +276,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         s = s.trim();
-        String value = "";
+        StringBuilder value = new StringBuilder();
         int i = 0;
         int i1 = s.indexOf('%');
         while (i1 >= 0) {
@@ -264,21 +289,21 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (varValue == null)
                 varValue = "%" + varName + "%";
 
-            value += s.substring(i, i1);
-            value += varValue;
+            value.append(s.substring(i, i1));
+            value.append(varValue);
 
             i = i2 + 1;
             i1 = s.indexOf('%', i);
         }
-        value += s.substring(i);
+        value.append(s.substring(i));
 
-        log.info("Parameter " + name + ": [" + value + "]");
-        return value;
+        log.info("Parameter {}: [{}]", name, value);
+        return value.toString();
     }
 
     protected String buildXmlJsonRequest(SvcLogicContext ctx, String template, Format format)
         throws SvcLogicException {
-        log.info("Building " + format + " started");
+        log.info("Building {} started", format);
         long t1 = System.currentTimeMillis();
 
         template = expandRepeats(ctx, template, 1);
@@ -328,7 +353,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             req = XmlJsonUtil.removeLastCommaJson(req);
 
         long t2 = System.currentTimeMillis();
-        log.info("Building " + format + " completed. Time: " + (t2 - t1));
+        log.info("Building {} completed. Time: {}", format, (t2 - t1));
 
         return req;
     }
@@ -368,13 +393,12 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
             String var1 = template.substring(i1 + 9, i2);
             String value1 = ctx.getAttribute(var1);
-            log.info("     " + var1 + ": " + value1);
+            log.info("     {}:{}", var1, value1);
             int n = 0;
             try {
                 n = Integer.parseInt(value1);
             } catch (NumberFormatException e) {
-                throw new SvcLogicException("Invalid input of repeat interval, should be an integer value " +
-                    e.getLocalizedMessage(), e);
+                log.info("value1 not set or not a number, n will remain set at zero");
             }
 
             newTemplate.append(template.substring(k, i1));
@@ -409,6 +433,67 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
     }
 
+    protected Client addAuthType(Client c, FileParam fp) throws SvcLogicException {
+        Parameters p = new Parameters();
+        p.restapiUser = fp.user;
+        p.restapiPassword = fp.password;
+        p.oAuthConsumerKey = fp.oAuthConsumerKey;
+        p.oAuthVersion = fp.oAuthVersion;
+        p.oAuthConsumerSecret = fp.oAuthConsumerSecret;
+        p.oAuthSignatureMethod = fp.oAuthSignatureMethod;
+        p.authtype = fp.authtype;
+        return addAuthType(c,p);
+    }
+
+    protected Client addAuthType(Client client, Parameters p) throws SvcLogicException {
+        if (p.authtype == AuthType.Unspecified){
+            if (p.restapiUser != null && p.restapiPassword != null)
+                client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword));
+            else if(p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null
+                    && p.oAuthSignatureMethod != null) {
+                OAuthParameters params = new OAuthParameters()
+                        .signatureMethod(p.oAuthSignatureMethod)
+                        .consumerKey(p.oAuthConsumerKey)
+                        .version(p.oAuthVersion);
+
+                OAuthSecrets secrets = new OAuthSecrets()
+                        .consumerSecret(p.oAuthConsumerSecret);
+                client.addFilter(new OAuthClientFilter(client.getProviders(), params, secrets));
+            }
+        } else {
+            if (p.authtype == AuthType.DIGEST) {
+                if (p.restapiUser != null && p.restapiPassword != null) {
+                    client.addFilter(new HTTPDigestAuthFilter(p.restapiUser, p.restapiPassword));
+                } else {
+                    throw new SvcLogicException("oAUTH authentication type selected but all restapiUser and restapiPassword " +
+                                                        "parameters doesn't exist", new Throwable());
+                }
+            } else if (p.authtype == AuthType.BASIC){
+                if (p.restapiUser != null && p.restapiPassword != null) {
+                    client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword));
+                } else {
+                    throw new SvcLogicException("oAUTH authentication type selected but all restapiUser and restapiPassword " +
+                                                        "parameters doesn't exist", new Throwable());
+                }
+            } else if(p.authtype == AuthType.OAUTH ) {
+                if(p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null && p.oAuthSignatureMethod != null) {
+                    OAuthParameters params = new OAuthParameters()
+                            .signatureMethod(p.oAuthSignatureMethod)
+                            .consumerKey(p.oAuthConsumerKey)
+                            .version(p.oAuthVersion);
+
+                    OAuthSecrets secrets = new OAuthSecrets()
+                            .consumerSecret(p.oAuthConsumerSecret);
+                    client.addFilter(new OAuthClientFilter(client.getProviders(), params, secrets));
+                } else {
+                    throw new SvcLogicException("oAUTH authentication type selected but all oAuthConsumerKey, oAuthConsumerSecret " +
+                                                        "and oAuthSignatureMethod parameters doesn't exist", new Throwable());
+                }
+            }
+        }
+        return client;
+    }
+
     protected HttpResponse sendHttpRequest(String request, Parameters p) throws SvcLogicException {
 
         ClientConfig config = new DefaultClientConfig();
@@ -426,9 +511,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
         Client client = Client.create(config);
         client.setConnectTimeout(5000);
-        if (p.restapiUser != null)
-            client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword));
-        WebResource webResource = client.resource(p.restapiUrl);
+        WebResource webResource = addAuthType(client,p).resource(p.restapiUrl);
 
         log.info("Sending request:");
         log.info(request);
@@ -446,6 +529,9 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             }
 
             WebResource.Builder webResourceBuilder = webResource.accept(tt).type(tt1);
+            if(p.format == Format.NONE){
+                webResourceBuilder = webResource.header("","");
+            }
 
             if (p.customHttpHeaders != null && p.customHttpHeaders.length() > 0) {
                 String[] keyValuePairs = p.customHttpHeaders.split(",");
@@ -477,11 +563,11 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Response received. Time: " + (t2 - t1));
-        log.info("HTTP response code: " + r.code);
-        log.info("HTTP response message: " + r.message);
+        log.info("Response received. Time: {}", (t2 - t1));
+        log.info("HTTP response code: {}", r.code);
+        log.info("HTTP response message: {}", r.message);
         logHeaders(r.headers);
-        log.info("HTTP response: " + r.body);
+        log.info("HTTP response: {}", r.body);
 
         return r;
     }
@@ -504,7 +590,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             ctx.init(kmf.getKeyManagers(), null, null);
             return ctx;
         } catch (Exception e) {
-            log.error("Error creating SSLContext: " + e.getMessage(), e);
+            log.error("Error creating SSLContext: {}", e.getMessage(), e);
         }
         return null;
     }
@@ -534,7 +620,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             setResponseStatus(ctx, p.responsePrefix, r);
 
         } catch (SvcLogicException | IOException e) {
-            log.error("Error sending the request: " + e.getMessage(), e);
+            log.error("Error sending the request: {}", e.getMessage(), e);
 
             r = new HttpResponse();
             r.code = 500;
@@ -556,6 +642,11 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         public HttpMethod httpMethod;
         public String responsePrefix;
         public boolean skipSending;
+        public String oAuthConsumerKey;
+        public String oAuthConsumerSecret;
+        public String oAuthSignatureMethod;
+        public String oAuthVersion;
+        public AuthType authtype;
     }
 
     private FileParam getFileParameters(Map<String, String> paramMap) throws SvcLogicException {
@@ -568,6 +659,11 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         p.responsePrefix = parseParam(paramMap, "responsePrefix", false, null);
         String skipSendingStr = paramMap.get("skipSending");
         p.skipSending = "true".equalsIgnoreCase(skipSendingStr);
+        p.oAuthConsumerKey = parseParam(paramMap, "oAuthConsumerKey", false, null);
+        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"));
         return p;
     }
 
@@ -575,9 +671,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         Client client = Client.create();
         client.setConnectTimeout(5000);
         client.setFollowRedirects(true);
-        if (p.user != null)
-            client.addFilter(new HTTPBasicAuthFilter(p.user, p.password));
-        WebResource webResource = client.resource(p.url);
+        WebResource webResource = addAuthType(client,p).resource(p.url);
 
         log.info("Sending file");
         long t1 = System.currentTimeMillis();
@@ -612,7 +706,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (r.code == 301) {
                 String newUrl = response.getHeaders().getFirst("Location");
 
-                log.info("Got response code 301. Sending same request to URL: " + newUrl);
+                log.info("Got response code 301. Sending same request to URL: {}", newUrl);
 
                 webResource = client.resource(newUrl);
 
@@ -638,11 +732,11 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Response received. Time: " + (t2 - t1));
-        log.info("HTTP response code: " + r.code);
-        log.info("HTTP response message: " + r.message);
+        log.info("Response received. Time: {}", (t2 - t1));
+        log.info("HTTP response code: {}", r.code);
+        log.info("HTTP response message: {}", r.message);
         logHeaders(r.headers);
-        log.info("HTTP response: " + r.body);
+        log.info("HTTP response: {}", r.body);
 
         return r;
     }
@@ -657,7 +751,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             String req;
 
             if (p.templateFileName == null) {
-                log.info("No template file name specified. Using default UEB template: " + defaultUebTemplateFileName);
+                log.info("No template file name specified. Using default UEB template: {}", defaultUebTemplateFileName);
                 p.templateFileName = defaultUebTemplateFileName;
             }
 
@@ -671,7 +765,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                 ctx.setAttribute(pp + "httpResponse", r.body);
 
         } catch (SvcLogicException e) {
-            log.error("Error sending the request: " + e.getMessage(), e);
+            log.error("Error sending the request: {}", e.getMessage(), e);
 
             r = new HttpResponse();
             r.code = 500;
@@ -716,7 +810,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         client.setConnectTimeout(5000);
         WebResource webResource = client.resource(urls[0]);
 
-        log.info("UEB URL: " + urls[0]);
+        log.info("UEB URL: {}", urls[0]);
         log.info("Sending request:");
         log.info(request);
         long t1 = System.currentTimeMillis();
@@ -744,10 +838,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Response received. Time: " + (t2 - t1));
-        log.info("HTTP response code: " + r.code);
+        log.info("Response received. Time: {}", (t2 - t1));
+        log.info("HTTP response code: {}", r.code);
         logHeaders(r.headers);
-        log.info("HTTP response:\n" + r.body);
+        log.info("HTTP response:\n {}", r.body);
 
         return r;
     }
@@ -760,7 +854,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
         log.info("Properties:");
         for (String name : ll)
-            log.info("--- " + name + ": " + String.valueOf(mm.get(name)));
+            log.info("--- {}:{}", name, String.valueOf(mm.get(name)));
     }
 
     protected void logHeaders(MultivaluedMap<String, String> mm) {
@@ -775,7 +869,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         Collections.sort(ll);
 
         for (String name : ll)
-            log.info("--- " + name + ": " + String.valueOf(mm.get(name)));
+            log.info("--- {}:{}", name, String.valueOf(mm.get(name)));
     }
 
     public void setUebServers(String uebServers) {