Fix Keystone RC and parser

Change-Id: I0b4657bcbd46917e355916aa62cbd1578563ee67
diff --git a/src/com/mirantis/mk/openstack.groovy b/src/com/mirantis/mk/openstack.groovy
index 1d6bcca..6a0a9ce 100644
--- a/src/com/mirantis/mk/openstack.groovy
+++ b/src/com/mirantis/mk/openstack.groovy
@@ -54,24 +54,18 @@
  * @param credentialsId   Credentials to the OpenStack API
  * @param project         OpenStack project to connect to
  */
-@NonCPS
 def createOpenstackEnv(url, credentialsId, project) {
     def common = new com.mirantis.mk.common()
+    rcFile = "${env.WORKSPACE}/keystonerc"
     creds = common.getPasswordCredentials(credentialsId)
-    params = [
-        "OS_USERNAME": creds.username,
-        "OS_PASSWORD": creds.password.toString(),
-        "OS_TENANT_NAME": project,
-        "OS_AUTH_URL": url,
-        "OS_AUTH_STRATEGY": "keystone"
-    ]
-    res = ""
-    for ( e in params ) {
-        res = "${res}export ${e.key}=${e.value}\n"
-    }
-    writeFile file: "${env.WORKSPACE}/keystonerc", text: res
-    return "${env.WORKSPACE}/keystonerc"
-    //return res.substring(1)
+    rc = """export OS_USERNAME=${creds.username}
+export OS_PASSWORD=${creds.password.toString()}
+export OS_TENANT_NAME=${project}
+export OS_AUTH_URL=${url}
+export OS_AUTH_STRATEGY=keystone
+"""
+    writeFile file: rcFile, text: rc
+    return rcFile
 }
 
 /**
diff --git a/src/com/mirantis/mk/python.groovy b/src/com/mirantis/mk/python.groovy
index c832cb3..b8ea694 100644
--- a/src/com/mirantis/mk/python.groovy
+++ b/src/com/mirantis/mk/python.groovy
@@ -55,11 +55,132 @@
  * @param format     Format of the table
  */
 def parseTextTable(tableStr, type = 'item', format = 'rest') {
-    parserScript = "${env.WORKSPACE}/scripts/parse_text_table.py"
+    parserFile = "${env.WORKSPACE}/textTableParser.py"
+    parserScript = """import json
+import argparse
+from docutils.parsers.rst import tableparser
+from docutils import statemachine
+
+def parse_item_table(raw_data):
+    i = 1
+    pretty_raw_data = []
+    for datum in raw_data:
+        if datum != "":
+            if datum[3] != ' ' and i > 4:
+                pretty_raw_data.append(raw_data[0])
+            if i == 3:
+                pretty_raw_data.append(datum.replace('-', '='))
+            else:
+                pretty_raw_data.append(datum)
+            i += 1
+    parser = tableparser.GridTableParser()
+    block = statemachine.StringList(pretty_raw_data)
+    docutils_data = parser.parse(block)
+    final_data = {}
+    for line in docutils_data[2]:
+        key = ' '.join(line[0][3]).strip()
+        value = ' '.join(line[1][3]).strip()
+        if key != "":
+            try:
+                value = json.loads(value)
+            except:
+                pass
+            final_data[key] = value
+        i+=1
+    return final_data
+
+def parse_list_table(raw_data):
+    i = 1
+    pretty_raw_data = []
+    for datum in raw_data:
+        if datum != "":
+            if datum[3] != ' ' and i > 4:
+                pretty_raw_data.append(raw_data[0])
+            if i == 3:
+                pretty_raw_data.append(datum.replace('-', '='))
+            else:
+                pretty_raw_data.append(datum)
+            i += 1
+    parser = tableparser.GridTableParser()
+    block = statemachine.StringList(pretty_raw_data)
+    docutils_data = parser.parse(block)
+    final_data = []
+    keys = []
+    for line in docutils_data[1]:
+        for item in line:
+             keys.append(' '.join(item[3]).strip())
+    for line in docutils_data[2]:
+        final_line = {}
+        key = ' '.join(line[0][3]).strip()
+        value = ' '.join(line[1][3]).strip()
+        if key != "":
+            try:
+                value = json.loads(value)
+            except:
+                pass
+            final_data[key] = value
+        i+=1
+    return final_data
+
+def parse_list_table(raw_data):
+    i = 1
+    pretty_raw_data = []
+    for datum in raw_data:
+        if datum != "":
+            if datum[3] != ' ' and i > 4:
+                pretty_raw_data.append(raw_data[0])
+            if i == 3:
+                pretty_raw_data.append(datum.replace('-', '='))
+            else:
+                pretty_raw_data.append(datum)
+            i += 1
+    parser = tableparser.GridTableParser()
+    block = statemachine.StringList(pretty_raw_data)
+    docutils_data = parser.parse(block)
+    final_data = []
+    keys = []
+    for line in docutils_data[1]:
+        for item in line:
+             keys.append(' '.join(item[3]).strip())
+    for line in docutils_data[2]:
+        final_line = {}
+        i = 0
+        for item in line:
+            value = ' '.join(item[3]).strip()
+            try:
+                value = json.loads(value)
+            except:
+                pass
+            final_line[keys[i]] = value
+            i += 1
+        final_data.append(final_line)
+    return final_data
+
+def read_table_file(file):
+    table_file = open(file, 'r')
+    raw_data = table_file.read().split('\n')
+    table_file.close()
+    return raw_data
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-f','--file', help='File with table data', required=True)
+parser.add_argument('-t','--type', help='Type of table (list/item)', required=True)
+args = vars(parser.parse_args())
+
+raw_data = read_table_file(args['file'])
+
+if args['type'] == 'list':
+  final_data = parse_list_table(raw_data)
+else:
+  final_data = parse_item_table(raw_data)
+
+print json.dumps(final_data)
+"""
+    writeFile file: parserFile, text: parserScript
     tableFile = "${env.WORKSPACE}/prettytable.txt"
     writeFile file: tableFile, text: tableStr
     rawData = sh (
-        script: "python ${parserScript} --file '${tableFile}' --type ${type}",
+        script: "python ${parserFile} --file '${tableFile}' --type ${type}",
         returnStdout: true
     ).trim()
     data = loadJson(rawData)