Add Unit Tests for appc-chef-adapter
Issue-Id: APPC-181
Change-Id: Iee824ca929ea46944ac1673e709074687ad812f9
Signed-off-by: Marcus G K Williams <marcus.williams@intel.com>
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/pom.xml b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/pom.xml
index 28930ba..bb29f91 100644
--- a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/pom.xml
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/pom.xml
@@ -58,8 +58,14 @@
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
- <version>4.4.4</version>
+ <version>4.4.6</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.5.3</version>
+ </dependency>
+
<dependency>
<groupId>org.bouncycastle</groupId>
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/chefapi/ApiMethod.java b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/chefapi/ApiMethod.java
index 19e381e..de4f31a 100644
--- a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/chefapi/ApiMethod.java
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/chefapi/ApiMethod.java
@@ -24,25 +24,19 @@
package org.openecomp.appc.adapter.chef.chefapi;
-import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
-import org.apache.http.*;
-import org.apache.http.client.*;
-import org.apache.http.client.methods.*;
-import org.apache.http.impl.client.*;
+import org.apache.http.HttpResponse;
+import org.apache.http.Header;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.util.EntityUtils;
import org.openecomp.appc.adapter.chef.chefclient.Utils;
-import javax.net.ssl.SSLContext;
-import java.io.File;
import org.apache.http.HttpEntity;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.HttpClients;
-import org.apache.http.ssl.SSLContexts;
public class ApiMethod {
private HttpClient client = null;
@@ -64,7 +58,7 @@
this.methodName = methodName;
}
- public ApiMethod execute() {
+ public ApiMethod createRequest(){
String hashedPath = Utils.sha1AndBase64("/organizations/"+organizations+chefPath);
String hashedBody = Utils.sha1AndBase64(reqBody);
@@ -101,11 +95,15 @@
* RHS=this.method.getHeaders(); for (int i = 0; i < RHS.length; i++) {
* test=test+RHS[i]+"\n"; } test=test+this.reqBody+"\n";
*/
+ return this;
+ }
+
+ public ApiMethod execute() {
try{
- response = client.execute(method);
- resCode = response.getStatusLine().getStatusCode();
- HttpEntity entity1 = response.getEntity();
- responseBody = EntityUtils.toString(entity1);}
+ response = client.execute(method);
+ resCode = response.getStatusLine().getStatusCode();
+ HttpEntity entity1 = response.getEntity();
+ responseBody = EntityUtils.toString(entity1);}
catch(Exception ex){
resCode=500;
responseBody=ex.getMessage();
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/impl/ChefAdapterImpl.java b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/impl/ChefAdapterImpl.java
index b81c10b..ab853dc 100644
--- a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/impl/ChefAdapterImpl.java
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/main/java/org/openecomp/appc/adapter/chef/impl/ChefAdapterImpl.java
@@ -145,7 +145,11 @@
serverAddress = params.get("org.openecomp.appc.instance.serverAddress");
organizations = params.get("org.openecomp.appc.instance.organizations");
chefserver = "https://" + serverAddress + ORGANIZATIONS_STR + organizations;
- clientPrivatekey = "/opt/app/bvc/chef/" + serverAddress + "/" + organizations + "/" + clientName + ".pem";
+ if (params.containsKey("org.openecomp.appc.instance.pemPath")) {
+ clientPrivatekey = params.get("org.openecomp.appc.instance.pemPath");
+ } else {
+ clientPrivatekey = "/opt/app/bvc/chef/" + serverAddress + "/" + organizations + "/" + clientName + ".pem";
+ }
}
public Boolean privateKeyCheck() {
@@ -444,7 +448,7 @@
configuration = ConfigurationFactory.getConfiguration();
// need to fetch data from appc configurator or form some file in the appc vms
clientName = "testnode";
- clientPrivatekey = "/etc/chef/client.pem";
+ clientPrivatekey = System.getProperty("user.dir") + "/src/test/resources/testclient.pem";
serverAddress = "http://example.com";
organizations = "test";
chefserver = serverAddress + ORGANIZATIONS_STR + organizations;
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/chefclient/TestChefApiClient.java b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/chefclient/TestChefApiClient.java
new file mode 100644
index 0000000..3dc9ff2
--- /dev/null
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/chefclient/TestChefApiClient.java
@@ -0,0 +1,107 @@
+package org.openecomp.appc.adapter.chef.chefclient;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Properties;
+import java.util.TimeZone;
+import java.util.regex.Pattern;
+
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.appc.adapter.chef.chefapi.ApiMethod;
+import org.openecomp.appc.adapter.chef.chefapi.Delete;
+import org.openecomp.appc.adapter.chef.chefapi.Get;
+import org.openecomp.appc.adapter.chef.chefapi.Post;
+import org.openecomp.appc.adapter.chef.chefapi.Put;
+
+public class TestChefApiClient {
+
+ private ChefApiClient client;
+ private Properties props;
+
+ @Before
+ public void setup() throws IllegalArgumentException, IllegalAccessException {
+ props = new Properties();
+ InputStream propStr = getClass().getResourceAsStream("/test.properties");
+ if (propStr == null) {
+ fail("src/test/resources/test.properties missing");
+ }
+
+ try {
+ props.load(propStr);
+ propStr.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("Could not initialize properties");
+ }
+ client = new ChefApiClient(
+ props.getProperty("org.openecomp.appc.adapter.chef.chefclient.userId"),
+ System.getProperty("user.dir") +
+ props.getProperty("org.openecomp.appc.adapter.chef.chefclient.pemPath"),
+ props.getProperty("org.openecomp.appc.adapter.chef.chefclient.endPoint"),
+ props.getProperty("org.openecomp.appc.adapter.chef.chefclient.organizations"));
+ }
+
+ @Test
+ public void testGet(){
+ Get get = client.get(props.getProperty("org.openecomp.appc.adapter.chef.chefclient.path"));
+ ApiMethod method = get.createRequest();
+ String[] response = method.test.split("\n");
+
+ thenStringShouldMatch("GET", response);
+ }
+
+ @Test
+ public void testPut(){
+ Put put = client.put(props.getProperty("org.openecomp.appc.adapter.chef.chefclient.path"));
+ ApiMethod method = put.createRequest();
+ String[] response = method.test.split("\n");
+
+ thenStringShouldMatch("PUT", response);
+ }
+
+ @Test
+ public void testPost() {
+ Post post = client.post(props.getProperty("org.openecomp.appc.adapter.chef.chefclient.path"));
+ ApiMethod method = post.createRequest();
+ String[] response = method.test.split("\n");
+
+ thenStringShouldMatch("POST", response);
+ }
+
+ @Test
+ public void testDelete(){
+ Delete delete = client.delete(props.getProperty("org.openecomp.appc.adapter.chef.chefclient.path"));
+ ApiMethod method = delete.createRequest();
+ String[] response = method.test.split("\n");
+
+ thenStringShouldMatch("DELETE", response);
+ }
+
+ private String timestamp(){
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+ String timeStamp = sdf.format(new Date());
+ timeStamp = timeStamp.replace(" ", "T");
+ timeStamp = timeStamp + "Z";
+ return timeStamp;
+ }
+
+ private void thenStringShouldMatch(String method, String[] response){
+ assertEquals("sb Method:" + method, response[0]);
+ assertEquals("Hashed Path:+JEk1y2gXwqZRweNjXYtx4ojxW8=", response[1]);
+ assertEquals("X-Ops-Content-Hash:2jmj7l5rSw0yVb/vlWAYkK/YBwk=", response[2]);
+ String timestamp = timestamp().substring(0, timestamp().length() - 3);
+ String regEx = "X-Ops-Timestamp:" +
+ timestamp +
+ "...";
+ assertTrue(Pattern.matches(regEx, response[3]));
+ assertEquals("X-Ops-UserId:test", response[4]);
+ }
+}
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/impl/TestChefAdapterImpl.java b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/impl/TestChefAdapterImpl.java
index d0eb060..bb63d34 100644
--- a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/impl/TestChefAdapterImpl.java
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/java/org/openecomp/appc/adapter/chef/impl/TestChefAdapterImpl.java
@@ -25,97 +25,89 @@
package org.openecomp.appc.adapter.chef.impl;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import java.io.File;
import java.io.IOException;
-import java.lang.reflect.Field;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
+import org.junit.After;
import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
-import org.openecomp.appc.Constants;
-import org.openecomp.appc.adapter.chef.ChefAdapter;
-import org.openecomp.appc.adapter.chef.impl.ChefAdapterImpl;
-import org.openecomp.appc.configuration.ConfigurationFactory;
import org.openecomp.appc.exceptions.APPCException;
-import org.openecomp.appc.exceptions.UnknownProviderException;
import com.att.cdp.exceptions.ZoneException;
-import com.att.cdp.zones.ComputeService;
-import com.att.cdp.zones.Context;
-import com.att.cdp.zones.ContextFactory;
-import com.att.cdp.zones.model.Server;
-import com.att.cdp.zones.model.Server.Status;
import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
-import org.slf4j.MDC;
-@Ignore
public class TestChefAdapterImpl {
-
+ private SvcLogicContext svcContext;
private ChefAdapterImpl adapter;
- @SuppressWarnings("nls")
- @BeforeClass
- public static void once() throws NoSuchFieldException, SecurityException, NoSuchMethodException {
-
- }
+ private Map<String, String> params;
+ private String getAttribute;
@Before
- public void setup() throws IllegalArgumentException, IllegalAccessException {
+ public void setup() {
+ adapter = new ChefAdapterImpl(Boolean.TRUE);
+ params = new HashMap<>();
+ params.put("org.openecomp.appc.instance.pemPath",
+ "/src/test/resources/testclient.pem");
+ }
- adapter = new ChefAdapterImpl(System.getProperty("user.dir")+"/src/main/resources/client.pem");
+ @After
+ public void tearDown() {
+ params = null;
+ svcContext = null;
+ getAttribute = null;
}
@Test
- public void testChefGet() throws IOException, IllegalStateException, IllegalArgumentException,
- ZoneException, APPCException {
+ public void testChefGetFail() throws IOException, IllegalStateException, IllegalArgumentException,
+ ZoneException, APPCException {
+ params.put("org.openecomp.appc.instance.chefAction", "/nodes");
- Map<String, String> params = new HashMap<>();
- params.put("org.openecomp.appc.instance.chefAction", "/nodes");
-
- SvcLogicContext svcContext = new SvcLogicContext();
- adapter.chefGet(params, svcContext);
- String status=svcContext.getAttribute("org.openecomp.appc.chefServerResult.code");
- assertEquals("200",status);
-
+ givenParams(params, "chefGet");
+ thenResponseShouldFail();
}
@Test
- public void testChefPut() throws IOException, IllegalStateException, IllegalArgumentException,
- ZoneException, APPCException {
+ public void testChefPutFail() throws IOException, IllegalStateException, IllegalArgumentException,
+ ZoneException, APPCException {
+ params.put("org.openecomp.appc.instance.chefAction", "/nodes/testnode");
+ params.put("org.openecomp.appc.instance.runList", "recipe[commandtest]");
+ params.put("org.openecomp.appc.instance.attributes", "");
+ params.put("org.openecomp.appc.instance.chefRequestBody", "Test Body");
- Map<String, String> params = new HashMap<>();
- params.put("org.openecomp.appc.instance.chefAction", "/nodes/testnode");
- params.put("org.openecomp.appc.instance.runList", "recipe[commandtest]");
- params.put("org.openecomp.appc.instance.attributes", "");
- SvcLogicContext svcContext = new SvcLogicContext();
- adapter.chefPut(params, svcContext);
- String status=svcContext.getAttribute("org.openecomp.appc.chefServerResult.code");
- assertEquals("200",status);
-
+ givenParams(params, "chefPut");
+ thenResponseShouldFail();
}
@Test
- public void testTrigger() throws IOException, IllegalStateException, IllegalArgumentException,
- ZoneException, APPCException {
+ public void testTriggerFail() throws IOException, IllegalStateException, IllegalArgumentException,
+ ZoneException, APPCException {
+ params.put("org.openecomp.appc.instance.ip", "");
- Map<String, String> params = new HashMap<>();
- params.put("org.openecomp.appc.instance.ip", "http://example.com/test");
- SvcLogicContext svcContext = new SvcLogicContext();
- adapter.trigger(params, svcContext);
- String status=svcContext.getAttribute("org.openecomp.appc.chefAgent.code");
- assertEquals("200",status);
-
+ givenParams(params, "trigger");
+ thenResponseShouldFail();
}
+ private void givenParams(Map<String, String> adapterParams, String method) {
+ svcContext = new SvcLogicContext();
+ if (method == "chefGet"){
+ adapter.chefGet(adapterParams, svcContext);
+ getAttribute = "org.openecomp.appc.chefServerResult.code";
+ }
+ if (method == "chefPut"){
+ adapter.chefPut(adapterParams, svcContext);
+ getAttribute = "org.openecomp.appc.chefServerResult.code";
+ }
+ if (method == "trigger"){
+ adapter.trigger(adapterParams, svcContext);
+ getAttribute = "org.openecomp.appc.chefAgent.code";
+ }
+ }
+ private void thenResponseShouldFail(){
+ String status = svcContext.getAttribute(this.getAttribute);
+ assertEquals("500", status);
+ }
}
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/resources/test.properties b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/resources/test.properties
new file mode 100644
index 0000000..4805e43
--- /dev/null
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/resources/test.properties
@@ -0,0 +1,5 @@
+org.openecomp.appc.adapter.chef.chefclient.userId=test
+org.openecomp.appc.adapter.chef.chefclient.pemPath=/src/test/resources/testclient.pem
+org.openecomp.appc.adapter.chef.chefclient.endPoint=http://test.com
+org.openecomp.appc.adapter.chef.chefclient.organizations=onap
+org.openecomp.appc.adapter.chef.chefclient.path=/test/path
diff --git a/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/resources/testclient.pem b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/resources/testclient.pem
new file mode 100644
index 0000000..a12f381
--- /dev/null
+++ b/appc-adapters/appc-chef-adapter/appc-chef-adapter-bundle/src/test/resources/testclient.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAqDFyi0Tp4CQN2Q1kp2NXLPl5P4CVqjdXTUgxugupRC9aqJa5
+l7NOOkQWadSaU/CCtdsikp6ymyxEqR0Y3TtxmY3ongFBtLDaU/UnWXZY0pcaJBN/
+ZZKV9++lZF8+USKlZTQo+EqD7XlEjiDKjfwylaMTSwQPKGa0bDZZ6U44K63uuClw
+mkvhtlaeS+t4Ah/YMU2nSxrWH3CpPxO4qD2KducrNRs01+hRxoVEaEX7HGXi8zdz
+BHSp8mcA8mGl9uJFXN8Gtgphrlknq7DPjVb0iZ9Lw2u6WNhZizFHghEwHRSJYn26
+DNzmOjyD0IaQf5lf1L1sO5DcPkWC2I21MNaE4QIDAQABAoIBAEa/Xe4lE7d7kvOd
+BZy/VZkOaykB/nJ2CtvwJTKb2xxaSuklVXXxL1Ok9kSX8D6kqWazgYxpArnw2gTE
+v4O3kGZF4fYskyXdSkkMkvu3o08Zzh4ksW7ZRQngnRJmWcEpMKcsVJt0RKAsZWDf
+fDRTRDfbO69PSsz0vqnSBunzQ/9i4LbFDOKYnWFDOiGKzM8SXMvVUVpGAzvc773M
+lthBAo9KpbNrbO0b3OGUM8pU2o9GRbBAEzIq8j/i2h/vHtswgM9g3IsHNqYbvJPD
+uAY8hsYEPZh/RasIBLN1J9HD+Ex1q2OA+Yi3jBtT4s545MJIHpdmo57/B2SHQbug
+KuWTsb0CgYEA0ZKIig/jeZEOokvWxDrN6Ok2Hb9TFZcNi/qBLcQ25A1C2fDkvsHc
+S6UDxknT2cyQ77R9xK25vrFKKrv5FUwgg7h0ps19w8xSZRG9Wvg0nus69oavXIDi
+MOCBfb6pn2+Glhdt84Ku0oSTPtfcTHerACOunGATpk1NW2dlmDbvmTcCgYEAzXQs
+9lS31+2Oh64g4gH/6Jfx+Mh5JY+2bUhSMy53tulzFwfI1zLyyu9SLLfVbAnxhmS8
+rSg7Q2mN492ZhnoVScYN3RTpudBJIinqlFoarqu+6E83k+83wGv3m2pP6XPbpHCy
+QE6IQm5U+ZSbMRD+8SjG3pbPRYcwww5xRsIj/qcCgYA2kEc6Yu6fzROZT9OH3aOU
+u3tafWC9Y0mko0EU0FxWPdmk8qIrxD999mWoL7qXnzoxHrYMCgstSe18eNpeICbr
+BJBiiWfwHXdqVxcM40iYA7ijTOfFVs0NWrZ8LbLuDtRkqY738pNfviK0HvF9ez6r
+V57zmdQj3UaBwMbjvZHeOwKBgQCA0gsvGMd8+FKZ+DBeBWrz5/GsT+bGCmoT83i2
+5rfhVFb5ZcQkSqm5XH1l1I5ZA5MQ9TDoUYV3K0PwUA3nJ70ZWLlwmaBDBboVVbrj
+8esxAjbdam4qr5+BYzEJnYslkaNyY8cgUx1UqeFV7DuydDml9C9deanUqoOEihW0
+jB4NmQKBgD4nwTUcQIbzeWnFoPxbDMQIIheZ3EK+rEbmXiU3blPhmCoye9q58Qet
+YaeQKiJEF2mWnBE6VtSg84OiENSAMxUn2VlwopFoTbfLKD4qfGoGWm9tjUdBblHe
+3U3ZdQLYKTiSNr+LXrAI0w4MukmL8vzxzo80tcB4+tePyWN/lqoq
+-----END RSA PRIVATE KEY-----