saltstack reqExecSlsFile API implemented 55/56255/1
authorGanesh Chandrasekaran <ganesh.c@samsung.com>
Wed, 11 Jul 2018 23:58:56 +0000 (08:58 +0900)
committerGanesh Chandrasekaran <ganesh.c@samsung.com>
Thu, 12 Jul 2018 00:00:38 +0000 (09:00 +0900)
Issue-ID: CCSDK-356

Change-Id: Ib9e7a7c147992505e85d1f2f195cb7f52930057f
Signed-off-by: Ganesh Chandrasekaran <ganesh.c@samsung.com>
saltstack-adapter/saltstack-adapter-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/impl/SaltstackAdapterImpl.java
saltstack-adapter/saltstack-adapter-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/model/SaltstackMessageParser.java
saltstack-adapter/saltstack-adapter-provider/src/test/java/org/onap/appc/adapter/impl/TestSaltstackAdapterImpl.java
saltstack-adapter/saltstack-adapter-provider/src/test/java/org/onap/appc/adapter/impl/TestSaltstackAdapterPropertiesProviderImpl.java [new file with mode: 0644]
saltstack-adapter/saltstack-adapter-provider/src/test/resources/test.sls [new file with mode: 0644]

index e3046db..84e5d4f 100644 (file)
@@ -111,11 +111,11 @@ public class SaltstackAdapterImpl implements SaltstackAdapter {
     /**
      * This default constructor is used as a work around because the activator wasn't getting called
      */
-    public SaltstackAdapterImpl() {
+    public SaltstackAdapterImpl() throws SvcLogicException{
         initialize(new SaltstackAdapterPropertiesProviderImpl());
     }
 
-    public SaltstackAdapterImpl(SaltstackAdapterPropertiesProvider propProvider) {
+    public SaltstackAdapterImpl(SaltstackAdapterPropertiesProvider propProvider) throws SvcLogicException{
         initialize(propProvider);
     }
 
@@ -160,7 +160,7 @@ public class SaltstackAdapterImpl implements SaltstackAdapter {
     /**
      * initialize the Saltstack adapter based on default and over-ride configuration data
      */
-    private void initialize(SaltstackAdapterPropertiesProvider propProvider) {
+    private void initialize(SaltstackAdapterPropertiesProvider propProvider) throws SvcLogicException{
 
 
         Properties props = propProvider.getProperties();
@@ -204,12 +204,19 @@ public class SaltstackAdapterImpl implements SaltstackAdapter {
                 String sshPort = props.getProperty(SS_SERVER_PORT);
                 logger.info("Creating ssh client with ssh KEY from " + sshKey);
                 sshClient = new ConnectionBuilder(sshHost, sshPort, sshUserName, sshPassword, sshKey);
+            } else if ("NONE".equalsIgnoreCase(clientType)) {
+                logger.info("No saltstack-adapter.properties defined so reading from DG props");
+                sshClient = null;
             } else {
                 logger.info("No saltstack-adapter.properties defined so reading from DG props");
                 sshClient = null;
             }
+        } catch (NumberFormatException e) {
+            logger.error("Error Initializing Saltstack Adapter due to Unknown Exception", e);
+            throw new SvcLogicException("Saltstack Adapter Property file parsing Error = port in property file has to be an integer.");
         } catch (Exception e) {
             logger.error("Error Initializing Saltstack Adapter due to Unknown Exception", e);
+            throw new SvcLogicException("Saltstack Adapter Property file parsing Error = " + e.getMessage());
         }
 
         logger.info("Initialized Saltstack Adapter");
@@ -231,27 +238,45 @@ public class SaltstackAdapterImpl implements SaltstackAdapter {
     }
 
     private String putToCommands(SvcLogicContext ctx, String slsFileName,
-                                 String reqID, String applyTo) throws SvcLogicException {
+                                    String applyTo) throws SvcLogicException {
         String constructedCommand = "";
         try {
             File file = new File(slsFileName);
+            String slsFile = file.getName();
+            if (!slsFile.substring(slsFile.lastIndexOf("."),
+                                   slsFile.length()).equalsIgnoreCase(".sls")) {
+                doFailure(ctx, SaltstackResultCodes.IO_EXCEPTION.getValue(), "Input file " +
+                        "is not of type .sls");
+            }
             InputStream in = new FileInputStream(file);
             byte[] data = new byte[(int) file.length()];
             in.read(data);
             String str = new String(data, "UTF-8");
             in.close();
-            constructedCommand = "echo "+str+" > /srv/salt/"+reqID+".sls; salt '"+applyTo+"' state.apply "+reqID+" --out=json --static";
+            String slsWithoutExtn = stripExtension(slsFile);
+            constructedCommand = "echo -e \""+str+"\" > /srv/salt/"+slsFile+"; cd /srv/salt/; salt '"+
+                    applyTo+"' state.apply "+slsWithoutExtn+" --out=json --static";
         } catch (FileNotFoundException e) {
             doFailure(ctx, SaltstackResultCodes.IO_EXCEPTION.getValue(), "Input SLS file " +
                     "not found in path : " + slsFileName+". "+ e.getMessage());
         } catch (IOException e) {
             doFailure(ctx, SaltstackResultCodes.IO_EXCEPTION.getValue(), "Input SLS file " +
                     "error in path : " + slsFileName +". "+ e.getMessage());
+        } catch (StringIndexOutOfBoundsException e) {
+            doFailure(ctx, SaltstackResultCodes.IO_EXCEPTION.getValue(), "Input file " +
+                    "is not of type .sls");
         }
         logger.info("Command to be executed on server : " + constructedCommand);
         return constructedCommand;
     }
 
+    private String stripExtension (String str) {
+        if (str == null) return null;
+        int pos = str.lastIndexOf(".");
+        if (pos == -1) return str;
+        return str.substring(0, pos);
+    }
+
     private String putToCommands(String slsName, String applyTo) {
         String
             constructedCommand = "cd /srv/salt/; salt '"+applyTo+"' state.apply "+slsName+" --out=json --static";
@@ -265,8 +290,8 @@ public class SaltstackAdapterImpl implements SaltstackAdapter {
 
         // Check status of test request returned by Agent
         if (testResult.getStatusCode() != SaltstackResultCodes.FINAL_SUCCESS.getValue()) {
-            doFailure(ctx, testResult.getStatusCode(), "Request for execution of command failed. Reason = " + testResult.getStatusMessage());
             ctx.setAttribute(ID_ATTRIBUTE_NAME, reqID);
+            doFailure(ctx, testResult.getStatusCode(), "Request for execution of command failed. Reason = " + testResult.getStatusMessage());
             return;
         } else {
             logger.info(String.format("Execution of request : successful."));
@@ -338,7 +363,7 @@ public class SaltstackAdapterImpl implements SaltstackAdapter {
         reqID = messageProcessor.reqId(params);
         String slsFile = messageProcessor.reqSlsFile(params);
         String applyTo = messageProcessor.reqApplyToDevices(params);
-        String commandToExecute = putToCommands(ctx, slsFile, reqID, applyTo);
+        String commandToExecute = putToCommands(ctx, slsFile, applyTo);
         testResult = execCommand(params, commandToExecute);
         testResult = messageProcessor.parseResponse(ctx, reqID, testResult, true);
         checkResponseStatus(testResult, ctx, reqID, true);
index 372d565..f282a33 100644 (file)
@@ -205,8 +205,12 @@ public class SaltstackMessageParser {
             throwIfMissingMandatoryParam(params, key);
         }
         String slsName = params.get(SaltstackMessageParser.SLS_NAME);
-        if(slsName.substring(slsName.lastIndexOf("."), slsName.length()).equalsIgnoreCase(".sls"))
-            return stripExtension(slsName);
+        try {
+            if(slsName.substring(slsName.lastIndexOf("."), slsName.length()).equalsIgnoreCase(".sls"))
+                return stripExtension(slsName);
+        } catch (StringIndexOutOfBoundsException e) {
+            return slsName;
+        }
         return slsName;
     }
 
index c8776fb..d60059e 100644 (file)
@@ -80,10 +80,10 @@ public class TestSaltstackAdapterImpl {
         params.put("User", "test");
         params.put("Password", "test");
         params.put("Test", "fail");
-            adapter.reqExecCommand(params, svcContext);
-            String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
-            TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
-            assertEquals("101", status);
+        adapter.reqExecCommand(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals("101", status);
     }
 
     @Test(expected = SvcLogicException.class)
@@ -322,7 +322,6 @@ public class TestSaltstackAdapterImpl {
         params.put("slsExec", "true");
 
         adapter.reqExecCommand(params, svcContext);
-        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
         TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
         assertEquals(TestId, "test1");
     }
@@ -432,7 +431,7 @@ public class TestSaltstackAdapterImpl {
         params.put("User", "test");
         params.put("Password", "test");
         params.put("Test", "success");
-        params.put("slsFile", "src/test/resources/test.json");
+        params.put("slsFile", "src/test/resources/test.sls");
         params.put("fileName", "src/test/resources/test-sls.json");
         params.put("Id", "test1");
         params.put("cmd", "test");
@@ -453,7 +452,26 @@ public class TestSaltstackAdapterImpl {
         params.put("User", "test");
         params.put("Password", "test");
         params.put("Test", "success");
-        params.put("slsFile", "src/test/resources/test-none.json");
+        params.put("slsFile", "src/test/resources/test-none.sls");
+        params.put("fileName", "src/test/resources/test-sls.json");
+        params.put("Id", "test1");
+
+        adapter.reqExecSLSFile(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals(TestId, "test1");
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecSLSFile_NoExtn() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsFile", "src/test/resources/test-none");
         params.put("fileName", "src/test/resources/test-sls.json");
         params.put("Id", "test1");
 
@@ -482,8 +500,8 @@ public class TestSaltstackAdapterImpl {
         assertEquals(TestId, "test1");
     }
 
-    @Test
-    public void reqExecSLSFile_WithMinionSetSuccessJson() throws SvcLogicException,
+    @Test(expected = SvcLogicException.class)
+    public void reqExecSLSFile_WithMinionSetNotSLSType() throws SvcLogicException,
             IllegalStateException, IllegalArgumentException {
 
         params.put("HostName", "test");
@@ -504,6 +522,28 @@ public class TestSaltstackAdapterImpl {
         assertEquals(TestId, "test1");
     }
 
+    @Test
+    public void reqExecSLSFile_WithMinionSetSuccessSls() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsFile", "src/test/resources/test.sls");
+        params.put("fileName", "src/test/resources/test-sls.json");
+        params.put("Id", "test1");
+        params.put("cmd", "test");
+        params.put("applyTo", "minion1");
+
+        adapter.reqExecSLSFile(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals("200", status);
+        assertEquals(TestId, "test1");
+    }
+
     @Test(expected = SvcLogicException.class)
     public void reqExecSLSFile_WithMinionNoSLSfile() throws SvcLogicException,
             IllegalStateException, IllegalArgumentException {
@@ -553,7 +593,7 @@ public class TestSaltstackAdapterImpl {
         params.put("User", "test");
         params.put("Password", "test");
         params.put("Test", "success");
-        params.put("slsFile", "src/test/resources/test.json");
+        params.put("slsFile", "src/test/resources/test.sls");
         params.put("fileName", "src/test/resources/test-sls.json");
         params.put("Id", "test1");
         params.put("cmd", "test");
@@ -606,6 +646,156 @@ public class TestSaltstackAdapterImpl {
         assertEquals(TestId, "test1");
     }
 
+
+    @Test
+    public void reqExecSLS_shouldSetSuccessJson() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test.sls");
+        params.put("fileName", "src/test/resources/test-sls.json");
+        params.put("Id", "test1");
+        params.put("cmd", "test");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals("200", status);
+        assertEquals(TestId, "test1");
+    }
+
+    @Test
+    public void reqExecSLS_shouldSetNoExtn() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test");
+        params.put("fileName", "src/test/resources/test-sls.json");
+        params.put("Id", "test1");
+        params.put("cmd", "test");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals("200", status);
+        assertEquals(TestId, "test1");
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecSLS_NoResponsefile() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test/resources/test.json");
+        params.put("fileName", "src/test/resources/test-none.json");
+        params.put("Id", "test1");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals(TestId, "test1");
+    }
+
+
+    @Test
+    public void reqExecSLS_WithMinionSetSuccessSls() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test/resources/test.sls");
+        params.put("fileName", "src/test/resources/test-sls.json");
+        params.put("Id", "test1");
+        params.put("cmd", "test");
+        params.put("applyTo", "minion1");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals("200", status);
+        assertEquals(TestId, "test1");
+    }
+
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecSLS_WithMinionNoResponsefile() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test/resources/test.json");
+        params.put("fileName", "src/test/resources/test-none.json");
+        params.put("Id", "test1");
+        params.put("applyTo", "minion1");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals(TestId, "test1");
+    }
+
+    @Test
+    public void reqExecSLS_WithAllMinionSetSuccessJson() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test/resources/test.sls");
+        params.put("fileName", "src/test/resources/test-sls.json");
+        params.put("Id", "test1");
+        params.put("cmd", "test");
+        params.put("applyTo", "*");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals("200", status);
+        assertEquals(TestId, "test1");
+    }
+
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecSLS_WithAllMinionNoResponsefile() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+
+        params.put("HostName", "test");
+        params.put("Port", "10");
+        params.put("User", "test");
+        params.put("Password", "test");
+        params.put("Test", "success");
+        params.put("slsName", "src/test/resources/test.json");
+        params.put("fileName", "src/test/resources/test-none.json");
+        params.put("Id", "test1");
+        params.put("applyTo", "*");
+
+        adapter.reqExecSLS(params, svcContext);
+        String status = svcContext.getAttribute("org.onap.appc.adapter.saltstack.result.code");
+        TestId = svcContext.getAttribute("org.onap.appc.adapter.saltstack.Id");
+        assertEquals(TestId, "test1");
+    }
+
+
     @Test
     public void reqExecLog_shouldSetMessage() throws IllegalStateException, IllegalArgumentException {
 
diff --git a/saltstack-adapter/saltstack-adapter-provider/src/test/java/org/onap/appc/adapter/impl/TestSaltstackAdapterPropertiesProviderImpl.java b/saltstack-adapter/saltstack-adapter-provider/src/test/java/org/onap/appc/adapter/impl/TestSaltstackAdapterPropertiesProviderImpl.java
new file mode 100644 (file)
index 0000000..9275918
--- /dev/null
@@ -0,0 +1,323 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.
+ * 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=========================================================
+ */
+
+package org.onap.appc.adapter.impl;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.sli.adaptors.saltstack.SaltstackAdapterPropertiesProvider;
+import org.onap.ccsdk.sli.adaptors.saltstack.impl.SaltstackAdapterImpl;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+import java.util.Properties;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestSaltstackAdapterPropertiesProviderImpl {
+    private final String PENDING = "100";
+    private final String SUCCESS = "400";
+    private String message = "{\"Results\":{\"192.168.1.10\":{\"Id\":\"101\",\"StatusCode\":200,\"StatusMessage\":\"SUCCESS\"}},\"StatusCode\":200,\"StatusMessage\":\"FINISHED\"}";
+
+    private SaltstackAdapterImpl adapter;
+    private Properties params;
+    private SvcLogicContext svcContext;
+
+
+    @Before
+    public void setup() throws IllegalArgumentException {
+        params = new Properties();
+    }
+
+    @After
+    public void tearDown() {
+        adapter = null;
+        params = null;
+        svcContext = null;
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecCommand_setPropertiesBasicPortNull() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "BASIC");
+        params.put("User", "test");
+        params.put("Password", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecCommand_setPropertiesBasicPortString() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "BASIC");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "test");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesBasicSuccess() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "BASIC");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "10");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecCommand_setPropertiesSSH_CERTPortNull() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "SSH_CERT");
+        params.put("User", "test");
+        params.put("Password", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecCommand_setPropertiesSSH_CERTPortString() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "SSH_CERT");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "test");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesSSH_CERTSuccess() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "SSH_CERT");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "10");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecCommand_setPropertiesBOTHPortNull() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "BOTH");
+        params.put("User", "test");
+        params.put("Password", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void reqExecCommand_setPropertiesBOTHPortString() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "BOTH");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "test");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesBOTHSuccess() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "BOTH");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "10");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesNonePortNull() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "NONE");
+        params.put("User", "test");
+        params.put("Password", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesNonePortString() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "NONE");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "test");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesNoneSuccess() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.clientType", "NONE");
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "10");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+
+
+    @Test
+    public void reqExecCommand_setPropertiesElsePortNull() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("User", "test");
+        params.put("Password", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesElsePortString() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "test");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesElseSuccess() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        params.put("org.onap.appc.adapter.saltstack.host", "test");
+        params.put("org.onap.appc.adapter.saltstack.port", "10");
+        params.put("org.onap.appc.adapter.saltstack.userName", "test");
+        params.put("org.onap.appc.adapter.saltstack.userPasswd", "test");
+        params.put("org.onap.appc.adapter.saltstack.sshKey", "test");
+        SaltstackAdapterPropertiesProvider propProvider = new SaltstackAdapterPropertiesProvider() {
+            @Override
+            public Properties getProperties() {
+                return params;
+            }
+        };
+        adapter = new SaltstackAdapterImpl(propProvider);
+        String adaptorName = adapter.getAdapterName();
+        assertEquals("Saltstack Adapter", adaptorName);
+        adapter.setExecTimeout(10);
+    }
+
+    @Test
+    public void reqExecCommand_setPropertiesDefault() throws SvcLogicException,
+            IllegalStateException, IllegalArgumentException {
+        adapter = new SaltstackAdapterImpl();
+    }
+}
diff --git a/saltstack-adapter/saltstack-adapter-provider/src/test/resources/test.sls b/saltstack-adapter/saltstack-adapter-provider/src/test/resources/test.sls
new file mode 100644 (file)
index 0000000..cd76486
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "equipment-data": [
+    {
+      "server-count": "4",
+      "max-server-speed": "1600000",
+      "number-primary-servers": "2",
+      "equipment-id": "Server1",
+      "server-model": "Unknown",
+      "server-id": "Server1",
+      "test-node" : {
+        "test-inner-node" : "Test-Value"
+      }
+    }
+  ],
+  "resource-state": {
+    "threshold-value": "1600000",
+    "last-added": "1605000",
+    "used": "1605000",
+    "limit-value": "1920000"
+  },
+  "resource-rule": {
+    "endpoint-position": "VCE-Cust",
+    "soft-limit-expression": "0.6 * max-server-speed * number-primary-servers",
+    "resource-name": "Bandwidth",
+    "service-model": "DUMMY",
+    "hard-limit-expression": "max-server-speed * number-primary-servers",
+    "equipment-level": "Server"
+  },
+  "message": "The provisioned access bandwidth is at or exceeds 50% of the total server capacity."
+}