Add mk libraries
Change-Id: I829b299b6329e8f4d4424c89717d432513d1eece
diff --git a/src/com/mirantis/mk/python.groovy b/src/com/mirantis/mk/python.groovy
new file mode 100644
index 0000000..c832cb3
--- /dev/null
+++ b/src/com/mirantis/mk/python.groovy
@@ -0,0 +1,128 @@
+package com.mirantis.mk
+
+/**
+ *
+ * Python functions
+ *
+ */
+
+/**
+ * Install python virtualenv
+ *
+ * @param path Path to virtualenv
+ * @param python Version of Python (python/python3)
+ * @param reqs Environment requirements in list format
+ */
+def setupVirtualenv(path, python = 'python2', reqs = []) {
+ virtualenv_cmd = "virtualenv ${path} --python ${python}"
+
+ echo("[Python ${path}] Setup ${python} environment")
+ sh(returnStdout: true, script: virtualenv_cmd)
+ args = ""
+ for (req in reqs) {
+ args = args + "${req}\n"
+ }
+ writeFile file: "${path}/requirements.txt", text: args
+ runVirtualenvCommand(path, "pip install -r ${path}/requirements.txt")
+}
+
+/**
+ * Run command in specific python virtualenv
+ *
+ * @param path Path to virtualenv
+ * @param cmd Command to be executed
+ */
+def runVirtualenvCommand(path, cmd) {
+ virtualenv_cmd = ". ${path}/bin/activate; ${cmd}"
+ echo("[Python ${path}] Run command ${cmd}")
+ output = sh(
+ returnStdout: true,
+ script: virtualenv_cmd
+ ).trim()
+ return output
+}
+
+@NonCPS
+def loadJson(rawData) {
+ return new groovy.json.JsonSlurperClassic().parseText(rawData)
+}
+
+/**
+ * Parse content from markup-text tables to variables
+ *
+ * @param tableStr String representing the table
+ * @param mode Either list (1st row are keys) or item (key, value rows)
+ * @param format Format of the table
+ */
+def parseTextTable(tableStr, type = 'item', format = 'rest') {
+ parserScript = "${env.WORKSPACE}/scripts/parse_text_table.py"
+ tableFile = "${env.WORKSPACE}/prettytable.txt"
+ writeFile file: tableFile, text: tableStr
+ rawData = sh (
+ script: "python ${parserScript} --file '${tableFile}' --type ${type}",
+ returnStdout: true
+ ).trim()
+ data = loadJson(rawData)
+ echo("[Parsed table] ${data}")
+ return data
+}
+
+/**
+ * Install cookiecutter in isolated environment
+ *
+ * @param path Path where virtualenv is created
+ */
+def setupCookiecutterVirtualenv(path) {
+ requirements = [
+ 'cookiecutter',
+ ]
+ setupVirtualenv(path, 'python2', requirements)
+}
+
+/**
+ * Generate the cookiecutter templates with given context
+ *
+ * @param path Path where virtualenv is created
+ */
+def buildCookiecutterTemplate (template, context, path = none) {
+ contextFile = "default_context.json"
+ contextString = "parameters:\n"
+ for (parameter in context) {
+ contextString = "${contextString} ${parameter.key}: ${parameter.value}\n"
+ }
+ writeFile file: contextFile, text: contextString
+ command = ". ./${work_dir}/bin/activate; cookiecutter --config-file ${cookiecutter_context_file} --overwrite-if-exists --verbose --no-input ${template_dir}"
+ output = sh (returnStdout: true, script: command)
+ echo("[Cookiecutter build] Output: ${output}")
+}
+
+/**
+ * Install jinja rendering in isolated environment
+ *
+ * @param path Path where virtualenv is created
+ */
+def setupJinjaVirtualenv(path) {
+ requirements = [
+ 'jinja2-cli',
+ 'pyyaml',
+ ]
+ setupVirtualenv(path, 'python2', requirements)
+}
+
+/**
+ * Generate the Jinja templates with given context
+ *
+ * @param path Path where virtualenv is created
+ */
+def jinjaBuildTemplate (template, context, path = none) {
+ contextFile = "jinja_context.yml"
+ contextString = ""
+ for (parameter in context) {
+ contextString = "${contextString}${parameter.key}: ${parameter.value}\n"
+ }
+ writeFile file: contextFile, text: contextString
+ cmd = "jinja2 ${template} ${contextFile} --format=yaml"
+ data = sh (returnStdout: true, script: cmd)
+ echo(data)
+ return data
+}