support oAuth authentication method
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / RestapiCallNode.java
index 60697a4..bd2fc82 100644 (file)
@@ -8,9 +8,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -62,6 +62,9 @@ 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.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 +97,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 +138,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);
@@ -156,7 +165,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                             ctx.setAttribute(pp + entry.getKey(), entry.getValue());
                 }
             }
-        } catch (SvcLogicException | JSONException e) {
+        } catch (SvcLogicException e) {
             boolean shouldRetry = false;
             if (e.getCause().getCause() instanceof SocketException) {
                 shouldRetry = true;
@@ -183,10 +192,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,9 +218,15 @@ 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.httpMethod = HttpMethod.fromString(parseParam(paramMap, "httpMethod", false, "post"));
@@ -232,6 +247,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 +274,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 +287,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 +351,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 +391,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));
@@ -426,8 +448,19 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
         Client client = Client.create(config);
         client.setConnectTimeout(5000);
-        if (p.restapiUser != null)
+        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 && p.oAuthVersion != 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));
+        }
         WebResource webResource = client.resource(p.restapiUrl);
 
         log.info("Sending request:");
@@ -446,6 +479,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 +513,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 +540,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 +570,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;
@@ -612,7 +648,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 +674,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 +693,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 +707,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 +752,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 +780,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 +796,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 +811,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) {