Merge "Fix names of parameters in importGpgKey"
diff --git a/src/com/mirantis/mk/Common.groovy b/src/com/mirantis/mk/Common.groovy
index 6a01a12..be9540b 100644
--- a/src/com/mirantis/mk/Common.groovy
+++ b/src/com/mirantis/mk/Common.groovy
@@ -32,9 +32,15 @@
  *
  * @param id    Credentials name
  */
-def getCredentials(id) {
+def getCredentials(id, cred_type = "username_password") {
+    def credClass;
+    if(cred_type == "username_password"){
+        credClass = com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials.class
+    }else if(cred_type == "key"){
+        credClass = com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey.class
+    }
     def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
-                    com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials.class,
+                    credClass,
                     jenkins.model.Jenkins.instance
                 )
 
@@ -99,6 +105,23 @@
 }
 
 /**
+ * Print debug message, this message will show only if DEBUG global variable is present
+ * @param msg
+ * @param color Colorful output or not
+ */
+def debugMsg(msg, color = true){
+    def debugEnabled
+    try {
+        debugEnabled = DEBUG
+    } catch (MissingPropertyException e) {
+        debugEnabled = false
+    }
+    if(debugEnabled){
+        printMsg(msg, "red")
+    }
+}
+
+/**
  * Print message
  *
  * @param msg        Message to be printed
diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index 91da71f..285de00 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -261,25 +261,41 @@
  */
 def checkResult(result, failOnError = true) {
     def common = new com.mirantis.mk.Common()
-    for (entry in result['return']) {
-        if (!entry) {
-            if (failOnError) {
-                throw new Exception("Salt API returned empty response: ${result}")
-            } else {
-                common.errorMsg("Salt API returned empty response: ${result}")
+    if(result['return']){
+        for (int i=0;i<result['return'].size();i++) {
+            def entry = result['return'][i]
+            if (!entry) {
+                if (failOnError) {
+                    throw new Exception("Salt API returned empty response: ${result}")
+                } else {
+                    common.errorMsg("Salt API returned empty response: ${result}")
+                }
             }
-        }
-        for (node in entry) {
-            for (resource in node.value) {
-                if(!resource[result] || resource[result] != "true") {
-                    if (failOnError) {
-                        throw new Exception("Salt state on node ${node.key} failed: ${node.value}")
-                    } else {
-                        common.errorMsg("Salt state on node ${node.key} failed: ${node.value}")
+            for (int j=0;j<entry.size();j++) {
+                def nodeKey = entry.keySet()[j]
+                def node=entry[nodeKey]
+                for (int k=0;k<node.size();k++) {
+                    def resource;
+                    def resKey;
+                    if(node instanceof Map){
+                        resKey = node.keySet()[k]
+                    }else if(node instanceof List){
+                        resKey = k
+                    }
+                    resource = node[resKey]
+                    common.errorMsg("Checking resource: ${resource}")
+                    if(resource instanceof String || !resource["result"] || (resource["result"] instanceof String && resource["result"] != "true")){
+                        if (failOnError) {
+                            throw new Exception("Salt state on node ${nodeKey} failed: ${resource}. State output: ${node}")
+                        } else {
+                            common.errorMsg("Salt state on node ${nodeKey} failed: ${resource}. State output: ${node}")
+                        }
                     }
                 }
             }
         }
+    }else{
+        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
     }
 }
 
@@ -293,30 +309,49 @@
 def printSaltStateResult(result, onlyChanges = true) {
     def common = new com.mirantis.mk.Common()
     def out = [:]
-    for (entry in result['return']) {
-        for (node in entry) {
-            out[node.key] = [:]
-            for (resource in node.value) {
-                if (resource instanceof String) {
-                    out[node.key] = node.value
-                } else if (resource.value.result.toString().toBoolean() == false || resource.value.changes || onlyChanges == false) {
-                    out[node.key][resource.key] = resource.value
-
-                    //if (resource.value.result.toString().toBoolean() == false && resource.key instanceof String && node.key instanceof String) {
-                    //    common.warningMsg("Resource ${resource.key} failed on node ${node.key}!")
-                    //}
+    if(result['return']){
+        for (int i=0; i<result['return'].size(); i++) {
+            def entry = result['return'][i]
+            for (int j=0; j<entry.size(); j++) {
+                common.errorMsg("Entry is: ${entry}")
+                def nodeKey = entry.keySet()[j]
+                def node=entry[nodeKey]
+                out[nodeKey] = [:]
+                if(node instanceof Iterable){
+                    for (int k=0; k<node.size(); k++) {
+                        def resource;
+                        def resKey;
+                        if(node instanceof Map){
+                            resKey = node.keySet()[k]
+                        }else if(node instanceof List){
+                            resKey=k
+                        }
+                        resource = node[resKey]
+                        if (resource instanceof String) {
+                            //ORIGINAL??out[node.key] = node.value
+                            out[nodeKey][resKey] = resource
+                        } else if (resource.result.toString().toBoolean() == false || resource.changes || onlyChanges == false) {
+                            out[nodeKey][resKey] = resource.value
+                        }
+                    }
+                } else {
+                    out[nodeKey] = node.toString();
                 }
             }
         }
-    }
 
-    for (node in out) {
-        if (node.value) {
-            println "Node ${node.key} changes:"
-            print new groovy.json.JsonBuilder(node.value).toPrettyString().replace('\\n', System.getProperty('line.separator'))
-        } else {
-            println "No changes for node ${node.key}"
+        for (int i=0; i<out.size(); i++) {
+            def nodeKey = out.keySet()[i]
+            def node=out[nodeKey]
+            if (node) {
+                println "Node ${nodeKey} changes:"
+                print new groovy.json.JsonBuilder(node).toPrettyString().replace('\\n', System.getProperty('line.separator'))
+            } else {
+                println "No changes for node ${nodeKey}"
+            }
         }
+    }else{
+        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
     }
 }
 
@@ -326,22 +361,46 @@
  * @param result        Parsed response of Salt API
  */
 def printSaltCommandResult(result) {
+    def common = new com.mirantis.mk.Common()
     def out = [:]
-    for (entry in result['return']) {
-        for (node in entry) {
-            out[node.key] = [:]
-            for (resource in node.value) {
-                out[node.key] = node.value
+    if(result['return']){
+        for (int i=0; i<result['return'].size(); i++) {
+            def entry = result['return'][i]
+            for (int j=0; j<entry.size(); j++) {
+                common.errorMsg("Entry is: ${entry}")
+                def nodeKey = entry.keySet()[j]
+                def node=entry[nodeKey]
+                out[nodeKey] = [:]
+                if(node instanceof Iterable){
+                    for (int k=0; k<node.size(); k++) {
+                        def resource;
+                        def resKey;
+                        if(node instanceof Map){
+                            resKey = node.keySet()[k]
+                        }else if(node instanceof List){
+                            resKey=k
+                        }
+                        resource = node[resKey]
+                        //ORIGINAL??out[node.key] = node.value
+                        out[nodeKey][resKey] = resource
+                    }
+                } else {
+                    out[nodeKey] = node.toString();
+                }
             }
         }
-    }
 
-    for (node in out) {
-        if (node.value) {
-            println "Node ${node.key} changes:"
-            print new groovy.json.JsonBuilder(node.value).toPrettyString()
-        } else {
-            println "No changes for node ${node.key}"
+        for (int i=0; i<out.size(); i++) {
+            def nodeKey = out.keySet()[i]
+            def node = out[nodeKey]
+            if (node) {
+                common.infoMsg("Node ${nodeKey} changes:")
+                common.infoMsg(new groovy.json.JsonBuilder(node).toPrettyString())
+            } else {
+                common.infoMsg("No changes for node ${nodeKey}")
+            }
         }
+    }else{
+        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
     }
 }