blob: ec8d7b7e1c0d5ec773ec4b9b3eaaaf3f56a76b1b [file] [log] [blame]
Dennis Dmitrievb3b37492018-07-08 21:23:00 +03001package com.mirantis.system_qa
2
Dennis Dmitriev27a96792018-07-30 07:52:03 +03003import groovy.xml.XmlUtil
Dennis Dmitrievb3b37492018-07-08 21:23:00 +03004
Vladimir Jigulin6a1ef812019-03-21 19:34:07 +04005def is_released_version(version) {
6 return Character.isDigit(version.charAt(0))
7}
8
Dennis Dmitriev4c383472019-04-12 13:58:06 +03009def verbose_sh(String script, Boolean returnStatus=false, Boolean returnStdout=false, Boolean verboseStdout=false) {
10 def common = new com.mirantis.mk.Common()
11 common.printMsg("Run shell command:\n" + script, "blue")
12 def result = sh(script: script, returnStatus: returnStatus, returnStdout: returnStdout)
13 if (verboseStdout) {
14 common.printMsg("Output:\n" + result, "cyan")
15 }
16 return result
17}
18
Dennis Dmitrieveb50ce12018-09-27 13:34:32 +030019def run_sh(String cmd) {
20 // run shell script without catching any output
21 def common = new com.mirantis.mk.Common()
22 common.printMsg("Run shell command:\n" + cmd, "blue")
23 def VENV_PATH='/home/jenkins/fuel-devops30'
Dmitry Tyzhnenkob39de052019-03-21 17:05:07 +020024 def script = """\
Dennis Dmitrieveb50ce12018-09-27 13:34:32 +030025 set -ex;
26 . ${VENV_PATH}/bin/activate;
27 bash -c '${cmd.stripIndent()}'
28 """
29 return sh(script: script)
30}
31
Dennis Dmitriev8df35442018-07-31 08:40:20 +030032def run_cmd(String cmd, Boolean returnStdout=false) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +030033 def common = new com.mirantis.mk.Common()
34 common.printMsg("Run shell command:\n" + cmd, "blue")
35 def VENV_PATH='/home/jenkins/fuel-devops30'
Dennis Dmitriev27a96792018-07-30 07:52:03 +030036 def stderr_path = "/tmp/${JOB_NAME}_${BUILD_NUMBER}_stderr.log"
Dmitry Tyzhnenkob39de052019-03-21 17:05:07 +020037 def script = """#!/bin/bash
38 set +x
39 echo 'activate python virtualenv ${VENV_PATH}'
40 . ${VENV_PATH}/bin/activate
41 bash -c -e -x '${cmd.stripIndent()}' 2>${stderr_path}
Dennis Dmitrievb3b37492018-07-08 21:23:00 +030042 """
Dennis Dmitriev27a96792018-07-30 07:52:03 +030043 try {
Dmitry Tyzhnenkob39de052019-03-21 17:05:07 +020044 def stdout = sh(script: script, returnStdout: returnStdout)
45 def stderr = readFile("${stderr_path}")
46 def error_message = "\n<<<<<< STDERR: >>>>>>\n" + stderr
47 common.printMsg(error_message, "yellow")
48 common.printMsg("", "reset")
49 return stdout
Dennis Dmitriev27a96792018-07-30 07:52:03 +030050 } catch (e) {
Dennis Dmitriev8df35442018-07-31 08:40:20 +030051 def stderr = readFile("${stderr_path}")
52 def error_message = e.message + "\n<<<<<< STDERR: >>>>>>\n" + stderr
Dmitry Tyzhnenkob39de052019-03-21 17:05:07 +020053 common.printMsg(error_message, "red")
54 common.printMsg("", "reset")
Dennis Dmitriev8df35442018-07-31 08:40:20 +030055 throw new Exception(error_message)
Dennis Dmitriev27a96792018-07-30 07:52:03 +030056 } finally {
Dennis Dmitriev8df35442018-07-31 08:40:20 +030057 sh(script: "rm ${stderr_path} || true")
Dennis Dmitriev27a96792018-07-30 07:52:03 +030058 }
Dennis Dmitrievb3b37492018-07-08 21:23:00 +030059}
60
61def run_cmd_stdout(cmd) {
Dennis Dmitriev8df35442018-07-31 08:40:20 +030062 return run_cmd(cmd, true)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +030063}
64
Dennis Dmitriev27a96792018-07-30 07:52:03 +030065def build_pipeline_job(job_name, parameters) {
66 //Build a job, grab the results if failed and use the results in exception
67 def common = new com.mirantis.mk.Common()
68 common.printMsg("Start building job '${job_name}' with parameters:", "purple")
69 common.prettyPrint(parameters)
70
71 def job_info = build job: "${job_name}",
72 parameters: parameters,
73 propagate: false
74
75 if (job_info.getResult() != "SUCCESS") {
76 currentBuild.result = job_info.getResult()
77 def build_number = job_info.getNumber()
Dennis Dmitrievb08c0772018-10-17 15:10:26 +030078 common.printMsg("Job '${job_name}' failed, getting details", "purple")
Dennis Dmitriev27a96792018-07-30 07:52:03 +030079 def workflow_details=run_cmd_stdout("""\
80 export JOB_NAME=${job_name}
81 export BUILD_NUMBER=${build_number}
82 python ./tcp_tests/utils/get_jenkins_job_stages.py
83 """)
84 throw new Exception(workflow_details)
85 }
86}
87
88def build_shell_job(job_name, parameters, junit_report_filename=null, junit_report_source_dir='**/') {
89 //Build a job, grab the results if failed and use the results in exception
90 //junit_report_filename: if not null, try to copy this JUnit report first from remote job
91 def common = new com.mirantis.mk.Common()
92 common.printMsg("Start building job '${job_name}' with parameters:", "purple")
93 common.prettyPrint(parameters)
94
95 def job_info = build job: "${job_name}",
96 parameters: parameters,
97 propagate: false
98
Dennis Dmitriev4115ae72018-11-20 13:43:35 +020099 def build_number = job_info.getNumber()
100 def build_url = job_info.getAbsoluteUrl()
101 def build_status = job_info.getResult()
102 try {
103 // Try to grab 'tar.gz' articacts from the shell job'
104 step($class: 'hudson.plugins.copyartifact.CopyArtifact',
105 projectName: job_name,
106 selector: specific("${build_number}"),
107 filter: "**/*.tar.gz",
108 target: '.',
109 flatten: true,
110 fingerprintArtifacts: true)
111 } catch (none) {
112 common.printMsg("No *.tar.gz files found in artifacts of the build ${build_url}", "purple")
113 }
114
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300115 if (job_info.getResult() != "SUCCESS") {
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300116 def job_url = "${build_url}"
117 currentBuild.result = build_status
118 if (junit_report_filename) {
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300119 common.printMsg("Job '${job_url}' failed with status ${build_status}, getting details", "purple")
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300120 step($class: 'hudson.plugins.copyartifact.CopyArtifact',
121 projectName: job_name,
122 selector: specific("${build_number}"),
123 filter: "${junit_report_source_dir}/${junit_report_filename}",
124 target: '.',
125 flatten: true,
126 fingerprintArtifacts: true)
127
128 def String junit_report_xml = readFile("${junit_report_filename}")
129 def String junit_report_xml_pretty = new XmlUtil().serialize(junit_report_xml)
130 def String msg = "Job '${job_url}' failed with status ${build_status}, JUnit report:\n"
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300131 throw new Exception(msg + junit_report_xml_pretty)
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300132 } else {
133 throw new Exception("Job '${job_url}' failed with status ${build_status}, please check the console output.")
134 }
135 }
136}
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300137
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300138def prepare_working_dir(env_manager) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300139 println "Clean the working directory ${env.WORKSPACE}"
140 deleteDir()
141
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300142 if (env_manager == 'devops') {
143 // do not fail if environment doesn't exists
144 println "Remove fuel-devops environment '${ENV_NAME}'"
145 run_cmd("""\
146 dos.py erase ${ENV_NAME} || true
147 """)
148 } else if (env_manager == 'heat') {
149 // delete heat stack
150 println "Remove heat stack '${ENV_NAME}'"
151 withCredentials([
152 [$class : 'UsernamePasswordMultiBinding',
153 credentialsId : env.OS_CREDENTIALS,
154 passwordVariable: 'OS_PASSWORD',
155 usernameVariable: 'OS_USERNAME']
156 ]) {
157 run_cmd("""\
158 export OS_IDENTITY_API_VERSION=3
159 export OS_AUTH_URL=${OS_AUTH_URL}
160 export OS_USERNAME=${OS_USERNAME}
161 export OS_PASSWORD=${OS_PASSWORD}
162 export OS_PROJECT_NAME=${OS_PROJECT_NAME}
163 export OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME}
164 openstack --insecure stack delete -y ${ENV_NAME} || true
Hanna Arhipova8b45a712020-05-25 14:21:58 +0300165 timeout 20m /bin/bash -c "while openstack --insecure stack show ${ENV_NAME} -f value -c stack_status; do sleep 10; done"
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300166 """)
167 }
168
169 } else {
170 throw new Exception("Unknown env_manager: '${env_manager}'")
171 }
172
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300173 println "Remove config drive ISO"
174 run_cmd("""\
175 rm /home/jenkins/images/${CFG01_CONFIG_IMAGE_NAME} || true
176 """)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300177
178 run_cmd("""\
Hanna Arhipova5173aad2019-11-11 12:42:31 +0200179 git clone https://gerrit.mcp.mirantis.com/mcp/tcp-qa ${env.WORKSPACE}
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300180 if [ -n "$TCP_QA_REFS" ]; then
181 set -e
Hanna Arhipova5173aad2019-11-11 12:42:31 +0200182 git fetch https://gerrit.mcp.mirantis.com/mcp/tcp-qa $TCP_QA_REFS && git checkout FETCH_HEAD || exit \$?
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300183 fi
184 pip install --upgrade --upgrade-strategy=only-if-needed -r tcp_tests/requirements.txt
Dennis Dmitriev8df35442018-07-31 08:40:20 +0300185 """)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300186}
187
Dennis Dmitriev056ecbf2019-05-20 15:36:29 +0300188def update_working_dir(Boolean updateRequirements=true) {
Dennis Dmitrieveb50ce12018-09-27 13:34:32 +0300189 // Use to fetch a patchset from gerrit to the working dir
190 run_cmd("""\
191 if [ -n "$TCP_QA_REFS" ]; then
192 set -e
Hanna Arhipova5173aad2019-11-11 12:42:31 +0200193 git reset --hard && git fetch https://gerrit.mcp.mirantis.com/mcp/tcp-qa $TCP_QA_REFS && git checkout FETCH_HEAD || exit \$?
Dennis Dmitriev056ecbf2019-05-20 15:36:29 +0300194 fi""")
195 if (updateRequirements) {
196 run_cmd("""\
197 pip install -r tcp_tests/requirements.txt
198 """)
199 }
Dennis Dmitrieveb50ce12018-09-27 13:34:32 +0300200}
201
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300202def swarm_bootstrap_salt_cluster_devops() {
203 def common = new com.mirantis.mk.Common()
Hanna Arhipovac2965a42020-01-21 12:27:33 +0200204 def cookiecutter_template_commit = env.COOKIECUTTER_TEMPLATE_COMMIT ?: is_released_version(env.MCP_VERSION) ? "refs/tags/${env.MCP_VERSION}" : 'master'
205 def salt_models_system_commit = env.SALT_MODELS_SYSTEM_COMMIT ?: "refs/tags/${env.MCP_VERSION}"
Tatyana Leontovich8ac26d72019-05-15 23:33:38 +0300206 def jenkins_pipelines_branch = env.JENKINS_PIPELINE_BRANCH ?: ''
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300207 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
208 def mk_pipelines_ref = env.MK_PIPELINES_REF ?: ''
209 def pipeline_library_ref = env.PIPELINE_LIBRARY_REF ?: ''
210 def cookiecutter_ref_change = env.COOKIECUTTER_REF_CHANGE ?: ''
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300211 def mcp_common_scripts_refs = env.MCP_COMMON_SCRIPTS_REFS ?: ''
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300212 def environment_template_ref_change = env.ENVIRONMENT_TEMPLATE_REF_CHANGE ?: ''
Dennis Dmitrievd9168b52018-12-19 18:53:52 +0200213 def mcp_salt_repo_url = env.MCP_SALT_REPO_URL ?: ''
214 def mcp_salt_repo_key = env.MCP_SALT_REPO_KEY ?: ''
Tatyana Leontovich1f069162019-04-02 19:57:55 +0300215 def deploy_network_mask = env.DEPLOY_NETWORK_NETMASK ?: ''
Dennis Dmitriev63460042018-12-11 13:08:11 +0200216 def env_ipmi_user = env.IPMI_USER ?: ''
217 def env_ipmi_pass = env.IPMI_PASS ?: ''
Oleksii Butenkoab538de2019-09-23 18:26:57 +0300218 def env_cisco_pass = env.CISCO_PASS ?: ''
Dennis Dmitriev63460042018-12-11 13:08:11 +0200219 def env_lab_mgm_iface = env.LAB_MANAGEMENT_IFACE ?: ''
220 def env_lab_ctl_iface = env.LAB_CONTROL_IFACE ?: ''
sgudzb7953382019-02-18 17:59:30 +0200221 def update_repo_custom_tag = env.UPDATE_REPO_CUSTOM_TAG ?: ''
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300222 def update_version = env.UPDATE_VERSION ?: ''
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300223 def parameters = [
224 string(name: 'PARENT_NODE_NAME', value: "${NODE_NAME}"),
225 string(name: 'PARENT_WORKSPACE', value: pwd()),
226 string(name: 'LAB_CONFIG_NAME', value: "${LAB_CONFIG_NAME}"),
227 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
228 string(name: 'MCP_VERSION', value: "${MCP_VERSION}"),
229 string(name: 'MCP_IMAGE_PATH1604', value: "${MCP_IMAGE_PATH1604}"),
230 string(name: 'IMAGE_PATH_CFG01_DAY01', value: "${IMAGE_PATH_CFG01_DAY01}"),
231 string(name: 'CFG01_CONFIG_IMAGE_NAME', value: "${CFG01_CONFIG_IMAGE_NAME}"),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300232 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
233 string(name: 'PIPELINE_LIBRARY_REF', value: "${pipeline_library_ref}"),
234 string(name: 'MK_PIPELINES_REF', value: "${mk_pipelines_ref}"),
235 string(name: 'COOKIECUTTER_TEMPLATE_COMMIT', value: "${cookiecutter_template_commit}"),
236 string(name: 'SALT_MODELS_SYSTEM_COMMIT', value: "${salt_models_system_commit}"),
237 string(name: 'COOKIECUTTER_REF_CHANGE', value: "${cookiecutter_ref_change}"),
238 string(name: 'ENVIRONMENT_TEMPLATE_REF_CHANGE', value: "${environment_template_ref_change}"),
Dennis Dmitrievd9168b52018-12-19 18:53:52 +0200239 string(name: 'MCP_SALT_REPO_URL', value: "${mcp_salt_repo_url}"),
240 string(name: 'MCP_SALT_REPO_KEY', value: "${mcp_salt_repo_key}"),
Tatyana Leontovich1f069162019-04-02 19:57:55 +0300241 string(name: 'DEPLOY_NETWORK_NETMASK', value: "${deploy_network_mask}"),
Dennis Dmitriev63460042018-12-11 13:08:11 +0200242 string(name: 'IPMI_USER', value: env_ipmi_user),
243 string(name: 'IPMI_PASS', value: env_ipmi_pass),
Oleksii Butenkoab538de2019-09-23 18:26:57 +0300244 string(name: 'CISCO_PASS', value: env_cisco_pass),
Dennis Dmitriev63460042018-12-11 13:08:11 +0200245 string(name: 'LAB_MANAGEMENT_IFACE', value: env_lab_mgm_iface),
246 string(name: 'LAB_CONTROL_IFACE', value: env_lab_ctl_iface),
sgudzb7953382019-02-18 17:59:30 +0200247 string(name: 'UPDATE_REPO_CUSTOM_TAG', value: "${update_repo_custom_tag}"),
Tatyana Leontovich8ac26d72019-05-15 23:33:38 +0300248 string(name: 'JENKINS_PIPELINE_BRANCH', value: "${jenkins_pipelines_branch}"),
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300249 string(name: 'MCP_COMMON_SCRIPTS_REFS', value: "${mcp_common_scripts_refs}"),
250 string(name: 'UPDATE_VERSION', value: "${update_version}"),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300251 booleanParam(name: 'SHUTDOWN_ENV_ON_TEARDOWN', value: false),
252 ]
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300253
254 build_pipeline_job('swarm-bootstrap-salt-cluster-devops', parameters)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300255}
256
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300257def swarm_bootstrap_salt_cluster_heat(String jenkins_slave_node_name) {
258 // jenkins_slave_node_name
259 def common = new com.mirantis.mk.Common()
Hanna Arhipovac2965a42020-01-21 12:27:33 +0200260 def cookiecutter_template_commit = env.COOKIECUTTER_TEMPLATE_COMMIT ?: "refs/tags/${env.MCP_VERSION}"
261 def salt_models_system_commit = env.SALT_MODELS_SYSTEM_COMMIT ?: "refs/tags/${env.MCP_VERSION}"
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300262 def mcp_common_scripts_refs = env.MCP_COMMON_SCRIPTS_REFS ?: ''
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300263 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
264 def mk_pipelines_ref = env.MK_PIPELINES_REF ?: ''
Tatyana Leontovich8ac26d72019-05-15 23:33:38 +0300265 def jenkins_pipelines_branch = env.JENKINS_PIPELINE_BRANCH ?: ''
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300266 def pipeline_library_ref = env.PIPELINE_LIBRARY_REF ?: ''
267 def cookiecutter_ref_change = env.COOKIECUTTER_REF_CHANGE ?: ''
268 def environment_template_ref_change = env.ENVIRONMENT_TEMPLATE_REF_CHANGE ?: ''
269 def mcp_salt_repo_url = env.MCP_SALT_REPO_URL ?: ''
270 def mcp_salt_repo_key = env.MCP_SALT_REPO_KEY ?: ''
271 def env_ipmi_user = env.IPMI_USER ?: ''
272 def env_ipmi_pass = env.IPMI_PASS ?: ''
Oleksii Butenkoab538de2019-09-23 18:26:57 +0300273 def env_cisco_pass = env.CISCO_PASS ?: ''
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300274 def env_lab_mgm_iface = env.LAB_MANAGEMENT_IFACE ?: ''
275 def env_lab_ctl_iface = env.LAB_CONTROL_IFACE ?: ''
276 def update_repo_custom_tag = env.UPDATE_REPO_CUSTOM_TAG ?: ''
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300277 def update_version = env.UPDATE_VERSION ?: ''
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300278 def parameters = [
279 string(name: 'PARENT_NODE_NAME', value: "${NODE_NAME}"),
280 string(name: 'JENKINS_SLAVE_NODE_NAME', value: jenkins_slave_node_name),
281 string(name: 'PARENT_WORKSPACE', value: pwd()),
282 string(name: 'LAB_CONFIG_NAME', value: "${LAB_CONFIG_NAME}"),
283 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
284 string(name: 'MCP_VERSION', value: "${MCP_VERSION}"),
285 string(name: 'MCP_IMAGE_PATH1604', value: "${MCP_IMAGE_PATH1604}"),
286 string(name: 'IMAGE_PATH_CFG01_DAY01', value: "${IMAGE_PATH_CFG01_DAY01}"),
287 string(name: 'CFG01_CONFIG_IMAGE_NAME', value: "${CFG01_CONFIG_IMAGE_NAME}"),
288 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
289 string(name: 'PIPELINE_LIBRARY_REF', value: "${pipeline_library_ref}"),
290 string(name: 'MK_PIPELINES_REF', value: "${mk_pipelines_ref}"),
291 string(name: 'COOKIECUTTER_TEMPLATE_COMMIT', value: "${cookiecutter_template_commit}"),
292 string(name: 'SALT_MODELS_SYSTEM_COMMIT', value: "${salt_models_system_commit}"),
293 string(name: 'COOKIECUTTER_REF_CHANGE', value: "${cookiecutter_ref_change}"),
294 string(name: 'ENVIRONMENT_TEMPLATE_REF_CHANGE', value: "${environment_template_ref_change}"),
295 string(name: 'MCP_SALT_REPO_URL', value: "${mcp_salt_repo_url}"),
296 string(name: 'MCP_SALT_REPO_KEY', value: "${mcp_salt_repo_key}"),
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300297 string(name: 'MCP_COMMON_SCRIPTS_REFS', value: "${mcp_common_scripts_refs}"),
298 string(name: 'UPDATE_VERSION', value: "${update_version}"),
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300299 string(name: 'IPMI_USER', value: env_ipmi_user),
300 string(name: 'IPMI_PASS', value: env_ipmi_pass),
Oleksii Butenkoab538de2019-09-23 18:26:57 +0300301 string(name: 'CISCO_PASS', value: env_cisco_pass),
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300302 string(name: 'LAB_MANAGEMENT_IFACE', value: env_lab_mgm_iface),
303 string(name: 'LAB_CONTROL_IFACE', value: env_lab_ctl_iface),
304 string(name: 'UPDATE_REPO_CUSTOM_TAG', value: "${update_repo_custom_tag}"),
305 string(name: 'OS_AUTH_URL', value: "${OS_AUTH_URL}"),
306 string(name: 'OS_PROJECT_NAME', value: "${OS_PROJECT_NAME}"),
307 string(name: 'OS_USER_DOMAIN_NAME', value: "${OS_USER_DOMAIN_NAME}"),
308 string(name: 'OS_CREDENTIALS', value: "${OS_CREDENTIALS}"),
309 string(name: 'LAB_PARAM_DEFAULTS', value: "${LAB_PARAM_DEFAULTS}"),
Tatyana Leontovich8ac26d72019-05-15 23:33:38 +0300310 string(name: 'JENKINS_PIPELINE_BRANCH', value: "${jenkins_pipelines_branch}"),
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300311 booleanParam(name: 'SHUTDOWN_ENV_ON_TEARDOWN', value: false),
Hanna Arhipova31cb1d82021-01-27 09:41:11 +0200312 booleanParam(name: 'DEPLOY_EMPTY_NODE', value: false),
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300313 ]
314
315 build_pipeline_job('swarm-bootstrap-salt-cluster-heat', parameters)
316}
317
PGlazoved19b352020-05-21 16:42:27 +0400318def swarm_deploy_cicd(String stack_to_install, String install_timeout, String jenkins_slave_node_name, Boolean make_snapshot_stages, String batch_size, Boolean dist_upgrade_nodes, Boolean upgrade_saltstack) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300319 // Run openstack_deploy job on cfg01 Jenkins for specified stacks
320 def common = new com.mirantis.mk.Common()
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300321 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300322 def parameters = [
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300323 string(name: 'PARENT_NODE_NAME', value: jenkins_slave_node_name),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300324 string(name: 'PARENT_WORKSPACE', value: pwd()),
325 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
326 string(name: 'STACK_INSTALL', value: stack_to_install),
Dennis Dmitriev07d5b8a2018-10-29 19:43:00 +0200327 string(name: 'STACK_INSTALL_TIMEOUT', value: install_timeout),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300328 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
Hanna Arhipova6f493522019-12-25 04:23:28 +0200329 string(name: 'BATCH_SIZE', value: batch_size),
Dmitriy Kruglov758f99c2020-02-04 12:04:31 +0100330 booleanParam(name: 'DIST_UPGRADE_NODES', value: dist_upgrade_nodes),
PGlazoved19b352020-05-21 16:42:27 +0400331 booleanParam(name: 'UPGRADE_SALTSTACK', value: upgrade_saltstack),
Dennis Dmitriev02447412019-04-17 18:02:46 +0300332 booleanParam(name: 'MAKE_SNAPSHOT_STAGES', value: make_snapshot_stages),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300333 booleanParam(name: 'SHUTDOWN_ENV_ON_TEARDOWN', value: false),
334 ]
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300335 build_pipeline_job('swarm-deploy-cicd', parameters)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300336}
337
Hanna Arhipovaddd35a22020-05-27 12:39:26 +0300338def swarm_deploy_platform(String stack_to_install, String install_timeout, String jenkins_slave_node_name, Boolean make_snapshot_stages, String batch_size, Boolean dist_upgrade_nodes, Boolean upgrade_saltstack) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300339 // Run openstack_deploy job on CICD Jenkins for specified stacks
340 def common = new com.mirantis.mk.Common()
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300341 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300342 def parameters = [
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300343 string(name: 'PARENT_NODE_NAME', value: jenkins_slave_node_name),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300344 string(name: 'PARENT_WORKSPACE', value: pwd()),
345 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
346 string(name: 'STACK_INSTALL', value: stack_to_install),
Dennis Dmitriev07d5b8a2018-10-29 19:43:00 +0200347 string(name: 'STACK_INSTALL_TIMEOUT', value: install_timeout),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300348 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
Hanna Arhipova6f493522019-12-25 04:23:28 +0200349 string(name: 'BATCH_SIZE', value: batch_size),
Dmitriy Kruglov758f99c2020-02-04 12:04:31 +0100350 booleanParam(name: 'DIST_UPGRADE_NODES', value: dist_upgrade_nodes),
PGlazoved19b352020-05-21 16:42:27 +0400351 booleanParam(name: 'UPGRADE_SALTSTACK', value: upgrade_saltstack),
Dennis Dmitriev02447412019-04-17 18:02:46 +0300352 booleanParam(name: 'MAKE_SNAPSHOT_STAGES', value: make_snapshot_stages),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300353 booleanParam(name: 'SHUTDOWN_ENV_ON_TEARDOWN', value: false),
354 ]
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300355 build_pipeline_job('swarm-deploy-platform', parameters)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300356}
357
sgudz2ed95852019-03-01 14:48:52 +0200358def swarm_deploy_platform_non_cicd(String stack_to_install, String install_timeout) {
359 // Run openstack_deploy job on day01 Jenkins for specified stacks
360 def common = new com.mirantis.mk.Common()
361 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
362 def parameters = [
363 string(name: 'PARENT_NODE_NAME', value: "${NODE_NAME}"),
364 string(name: 'PARENT_WORKSPACE', value: pwd()),
365 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
366 string(name: 'STACK_INSTALL', value: stack_to_install),
367 string(name: 'STACK_INSTALL_TIMEOUT', value: install_timeout),
368 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
369 booleanParam(name: 'SHUTDOWN_ENV_ON_TEARDOWN', value: false),
370 ]
371 build_pipeline_job('swarm-deploy-platform-without-cicd', parameters)
372}
373
Dennis Dmitriev02447412019-04-17 18:02:46 +0300374def swarm_run_pytest(String passed_steps, String jenkins_slave_node_name, Boolean make_snapshot_stages) {
Dennis Dmitrievfde667f2018-07-23 16:26:50 +0300375 // Run pytest tests
376 def common = new com.mirantis.mk.Common()
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300377 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
Oleksii Butenkoec78c9f2019-04-04 16:26:20 +0300378 def tempest_extra_args = env.TEMPEST_EXTRA_ARGS ?: ''
Tatyana Leontovich05f79402018-11-16 15:04:02 +0200379 def tempest_image_version = env.TEMPEST_IMAGE_VERSION ?: 'pike'
Tatyana Leontovichbfbc4832018-12-27 12:47:23 +0200380 def tempest_target=env.TEMPEST_TARGET ?: 'gtw01'
Andrew Baraniukd1586342019-06-12 11:41:20 +0300381 def tempest_pattern=env.TEMPEST_PATTERN ?: 'tempest'
Dennis Dmitrievfde667f2018-07-23 16:26:50 +0300382 def parameters = [
383 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
384 string(name: 'PASSED_STEPS', value: passed_steps),
Hanna Arhipova798759d2020-02-19 14:07:50 +0200385 text(name: 'RUN_TEST_OPTS', value: "${RUN_TEST_OPTS}"),
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300386 string(name: 'PARENT_NODE_NAME', value: jenkins_slave_node_name),
Dennis Dmitrievfde667f2018-07-23 16:26:50 +0300387 string(name: 'PARENT_WORKSPACE', value: pwd()),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300388 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
Dennis Dmitrievfde667f2018-07-23 16:26:50 +0300389 booleanParam(name: 'SHUTDOWN_ENV_ON_TEARDOWN', value: false),
Tatyana Leontovich05f79402018-11-16 15:04:02 +0200390 string(name: 'TEMPEST_IMAGE_VERSION', value: "${tempest_image_version}"),
Tatyana Leontovichbfbc4832018-12-27 12:47:23 +0200391 string(name: 'TEMPEST_TARGET', value: "${tempest_target}"),
Hanna Arhipovac8875442020-07-10 13:22:59 +0300392 string(name: 'TEMPEST_PATTERN', value: "${tempest_pattern}"),
393 string(name: 'TEMPEST_EXTRA_ARGS', value: "${tempest_extra_args}"),
Dennis Dmitriev02447412019-04-17 18:02:46 +0300394 booleanParam(name: 'MAKE_SNAPSHOT_STAGES', value: make_snapshot_stages),
Dennis Dmitrievfde667f2018-07-23 16:26:50 +0300395 ]
396 common.printMsg("Start building job 'swarm-run-pytest' with parameters:", "purple")
397 common.prettyPrint(parameters)
398 build job: 'swarm-run-pytest',
399 parameters: parameters
400}
401
Tatyana Leontovichc18c8142019-05-16 15:20:33 +0300402def swarm_testrail_report(String passed_steps, String node_with_reports) {
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300403 // Run pytest tests
404 def common = new com.mirantis.mk.Common()
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300405 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
Tatyana Leontovichf3718442018-10-31 13:36:13 +0200406 def tempest_test_suite_name = env.TEMPEST_TEST_SUITE_NAME
Vladimir Jigulin91bb7c92019-04-04 18:15:45 +0400407 def test_plan_name_prefix = env.TEST_PLAN_NAME_PREFIX ?: ''
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300408 def parameters = [
409 string(name: 'ENV_NAME', value: "${ENV_NAME}"),
Tatyana Leontovichbfbc4832018-12-27 12:47:23 +0200410 string(name: 'LAB_CONFIG_NAME', value: "${LAB_CONFIG_NAME}"),
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300411 string(name: 'MCP_VERSION', value: "${MCP_VERSION}"),
412 string(name: 'PASSED_STEPS', value: passed_steps),
Tatyana Leontovichc18c8142019-05-16 15:20:33 +0300413 string(name: 'PARENT_NODE_NAME', value: node_with_reports),
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300414 string(name: 'PARENT_WORKSPACE', value: pwd()),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300415 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
Tatyana Leontovichf3718442018-10-31 13:36:13 +0200416 string(name: 'TEMPEST_TEST_SUITE_NAME', value: "${tempest_test_suite_name}"),
Hanna Arhipova705a2892020-09-25 12:40:39 +0300417 string(name: 'TEST_PLAN_NAME_PREFIX', value: "${test_plan_name_prefix}")
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300418 ]
419 common.printMsg("Start building job 'swarm-testrail-report' with parameters:", "purple")
420 common.prettyPrint(parameters)
421 build job: 'swarm-testrail-report',
422 parameters: parameters
423}
424
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300425def generate_cookied_model(IPV4_NET_ADMIN, IPV4_NET_CONTROL, IPV4_NET_TENANT, IPV4_NET_EXTERNAL) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300426 def common = new com.mirantis.mk.Common()
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300427 println("IPV4_NET_ADMIN=" + IPV4_NET_ADMIN)
428 println("IPV4_NET_CONTROL=" + IPV4_NET_CONTROL)
429 println("IPV4_NET_TENANT=" + IPV4_NET_TENANT)
430 println("IPV4_NET_EXTERNAL=" + IPV4_NET_EXTERNAL)
431
Hanna Arhipovac2965a42020-01-21 12:27:33 +0200432 def cookiecuttertemplate_commit = env.COOKIECUTTER_TEMPLATE_COMMIT ?: is_released_version(env.MCP_VERSION) ? "refs/tags/${env.MCP_VERSION}" : 'master'
433 def saltmodels_system_commit = env.SALT_MODELS_SYSTEM_COMMIT ?: "refs/tags/${env.MCP_VERSION}"
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300434 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
435 def environment_template_ref_change = env.ENVIRONMENT_TEMPLATE_REF_CHANGE ?: ''
436 def cookiecutter_ref_change = env.COOKIECUTTER_REF_CHANGE ?: ''
Tatyana Leontovich8ac26d72019-05-15 23:33:38 +0300437 def jenkins_pipelines_branch=env.JENKINS_PIPELINE_BRANCH ?: ''
sgudzb7953382019-02-18 17:59:30 +0200438 def update_repo_custom_tag = env.UPDATE_REPO_CUSTOM_TAG ?: ''
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300439 def update_version = env.UPDATE_VERSION ?: ''
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300440
441 def parameters = [
442 string(name: 'LAB_CONTEXT_NAME', value: "${LAB_CONFIG_NAME}"),
443 string(name: 'CLUSTER_NAME', value: "${LAB_CONFIG_NAME}"),
444 string(name: 'DOMAIN_NAME', value: "${LAB_CONFIG_NAME}.local"),
445 string(name: 'REPOSITORY_SUITE', value: "${env.MCP_VERSION}"),
446 string(name: 'SALT_MODELS_SYSTEM_COMMIT', value: "${saltmodels_system_commit}"),
447 string(name: 'COOKIECUTTER_TEMPLATE_COMMIT', value: "${cookiecuttertemplate_commit}"),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300448 string(name: 'COOKIECUTTER_REF_CHANGE', value: "${cookiecutter_ref_change}"),
449 string(name: 'ENVIRONMENT_TEMPLATE_REF_CHANGE', value: "${environment_template_ref_change}"),
450 string(name: 'TCP_QA_REVIEW', value: "${tcp_qa_refs}"),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300451 string(name: 'IPV4_NET_ADMIN', value: IPV4_NET_ADMIN),
452 string(name: 'IPV4_NET_CONTROL', value: IPV4_NET_CONTROL),
453 string(name: 'IPV4_NET_TENANT', value: IPV4_NET_TENANT),
454 string(name: 'IPV4_NET_EXTERNAL', value: IPV4_NET_EXTERNAL),
sgudzc97385a2018-11-29 17:01:53 +0200455 string(name: 'IPMI_USER', value: env.IPMI_USER),
456 string(name: 'IPMI_PASS', value: env.IPMI_PASS),
Oleksii Butenkoab538de2019-09-23 18:26:57 +0300457 string(name: 'CISCO_PASS', value: env.CISCO_PASS),
sgudzb7953382019-02-18 17:59:30 +0200458 string(name: 'UPDATE_REPO_CUSTOM_TAG', value: "${update_repo_custom_tag}"),
Tatyana Leontovich8ac26d72019-05-15 23:33:38 +0300459 string(name: 'JENKINS_PIPELINE_BRANCH', value: "${jenkins_pipelines_branch}"),
sgudzc97385a2018-11-29 17:01:53 +0200460 string(name: 'IMAGE_PATH_CFG01_DAY01', value: env.IMAGE_PATH_CFG01_DAY01),
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300461 string(name: 'UPDATE_VERSION', value: "${update_version}"),
462
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300463 ]
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300464
465 build_shell_job('swarm-cookied-model-generator', parameters, "deploy_generate_model.xml")
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300466}
467
Dennis Dmitriev4c383472019-04-12 13:58:06 +0300468def generate_configdrive_iso(SALT_MASTER_IP, ADMIN_NETWORK_GW) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300469 def common = new com.mirantis.mk.Common()
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300470 println("SALT_MASTER_IP=" + SALT_MASTER_IP)
Dennis Dmitrievf220d972018-10-10 15:19:14 +0300471 println("ADMIN_NETWORK_GW=" + ADMIN_NETWORK_GW)
472
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300473 def mk_pipelines_ref = env.MK_PIPELINES_REF ?: ''
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300474 def mcp_common_scripts_ref = env.MCP_COMMON_SCRIPTS_REFS ?: ''
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300475 def pipeline_library_ref = env.PIPELINE_LIBRARY_REF ?: ''
Dennis Dmitrievf220d972018-10-10 15:19:14 +0300476 def tcp_qa_refs = env.TCP_QA_REFS ?: ''
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300477 def update_version = env.UPDATE_VERSION?: 'proposed'
Dennis Dmitrievd9168b52018-12-19 18:53:52 +0200478 def mcp_salt_repo_url = env.MCP_SALT_REPO_URL ?: ''
479 def mcp_salt_repo_key = env.MCP_SALT_REPO_KEY ?: ''
Tatyana Leontovich1f069162019-04-02 19:57:55 +0300480 def deploy_network_mask = env.DEPLOY_NETWORK_NETMASK ?: ''
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300481
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300482 def parameters = [
483 string(name: 'CLUSTER_NAME', value: "${LAB_CONFIG_NAME}"),
Hanna Arhipovac2965a42020-01-21 12:27:33 +0200484 string(name: 'MODEL_URL', value: "http://sre-ci.scc.mirantis.net:8098/${LAB_CONFIG_NAME}.git"),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300485 string(name: 'MODEL_URL_OBJECT_TYPE', value: "git"),
486 booleanParam(name: 'DOWNLOAD_CONFIG_DRIVE', value: true),
487 string(name: 'MCP_VERSION', value: "${MCP_VERSION}"),
Hanna Arhipovac2965a42020-01-21 12:27:33 +0200488 string(name: 'COMMON_SCRIPTS_COMMIT', value: "refs/tags/${env.MCP_VERSION}"),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300489 string(name: 'NODE_NAME', value: "${NODE_NAME}"),
490 string(name: 'CONFIG_DRIVE_ISO_NAME', value: "${CFG01_CONFIG_IMAGE_NAME}"),
491 string(name: 'SALT_MASTER_DEPLOY_IP', value: SALT_MASTER_IP),
Dennis Dmitrievf220d972018-10-10 15:19:14 +0300492 string(name: 'DEPLOY_NETWORK_GW', value: "${ADMIN_NETWORK_GW}"),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300493 string(name: 'PIPELINE_REPO_URL', value: "https://github.com/Mirantis"),
494 booleanParam(name: 'PIPELINES_FROM_ISO', value: true),
Dennis Dmitrievd9168b52018-12-19 18:53:52 +0200495 string(name: 'MCP_SALT_REPO_URL', value: "${mcp_salt_repo_url}"),
496 string(name: 'MCP_SALT_REPO_KEY', value: "${mcp_salt_repo_key}"),
Tatyana Leontovich1f069162019-04-02 19:57:55 +0300497 string(name: 'DEPLOY_NETWORK_NETMASK', value: "${deploy_network_mask}"),
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300498 string(name: 'PIPELINE_LIBRARY_REF', value: "${pipeline_library_ref}"),
499 string(name: 'MK_PIPELINES_REF', value: "${mk_pipelines_ref}"),
Dennis Dmitrievf220d972018-10-10 15:19:14 +0300500 string(name: 'TCP_QA_REFS', value: "${tcp_qa_refs}"),
Tatyana Leontovich4718bdf2019-05-24 12:37:06 +0300501 string(name: 'UPDATE_VERSION', value: "${update_version}"),
502 string(name: 'MCP_COMMON_SCRIPTS_REFS', value: "${mcp_common_scripts_ref}"),
503 string(name: 'MCP_SALT_REPO_UPDATES', value: "'deb [arch=amd64] http://mirror.mirantis.com/update/${UPDATE_VERSION}/salt-formulas/xenial xenial main'"),
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300504 ]
Dennis Dmitrievf220d972018-10-10 15:19:14 +0300505 build_pipeline_job('swarm-create-cfg-config-drive', parameters)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300506}
507
Dennis Dmitriev13e804b2018-10-09 19:25:14 +0300508def run_job_on_day01_node(stack_to_install, timeout=2400) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300509 // stack_to_install="core,cicd"
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200510 def common = new com.mirantis.mk.Common()
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300511 def stack = "${stack_to_install}"
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200512 common.printMsg("Deploy DriveTrain CICD components: ${stack_to_install}", "blue")
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300513 try {
514 run_cmd("""\
515 export ENV_NAME=${ENV_NAME}
516 . ./tcp_tests/utils/env_salt
517 . ./tcp_tests/utils/env_jenkins_day01
518 export JENKINS_BUILD_TIMEOUT=${timeout}
519 JOB_PARAMETERS=\"{
520 \\\"SALT_MASTER_URL\\\": \\\"\${SALTAPI_URL}\\\",
Hanna Arhipova6f493522019-12-25 04:23:28 +0200521 \\\"BATCH_SIZE\\\": \\\"\${BATCH_SIZE}\\\",
Dmitriy Kruglov758f99c2020-02-04 12:04:31 +0100522 \\\"STACK_INSTALL\\\": \\\"${stack}\\\",
PGlazoved19b352020-05-21 16:42:27 +0400523 \\\"DIST_UPGRADE_NODES\\\": \\\"\${DIST_UPGRADE_NODES}\\\",
524 \\\"UPGRADE_SALTSTACK\\\": \\\"\${UPGRADE_SALTSTACK}\\\"
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300525 }\"
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200526 JOB_PREFIX="[ ${ENV_NAME}/{build_number}:drivetrain {time} ] "
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300527 python ./tcp_tests/utils/run_jenkins_job.py --verbose --job-name=deploy_openstack --job-parameters="\$JOB_PARAMETERS" --job-output-prefix="\$JOB_PREFIX"
528 """)
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200529 // Wait for IO calm down on cluster nodes
530 sleep(60)
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300531 } catch (e) {
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300532 common.printMsg("Product job 'deploy_openstack' failed, getting details", "purple")
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300533 def workflow_details=run_cmd_stdout("""\
534 . ./tcp_tests/utils/env_salt
535 . ./tcp_tests/utils/env_jenkins_day01
536 export JOB_NAME=deploy_openstack
537 export BUILD_NUMBER=lastBuild
538 python ./tcp_tests/utils/get_jenkins_job_stages.py
539 """)
540 throw new Exception(workflow_details)
541 }
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300542}
543
Dennis Dmitriev13e804b2018-10-09 19:25:14 +0300544def run_job_on_cicd_nodes(stack_to_install, timeout=2400) {
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300545 // stack_to_install="k8s,calico,stacklight"
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200546 def common = new com.mirantis.mk.Common()
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300547 def stack = "${stack_to_install}"
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200548 common.printMsg("Deploy Platform components: ${stack_to_install}", "blue")
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300549 try {
550 run_cmd("""\
551 export ENV_NAME=${ENV_NAME}
552 . ./tcp_tests/utils/env_salt
553 . ./tcp_tests/utils/env_jenkins_cicd
554 export JENKINS_BUILD_TIMEOUT=${timeout}
555 JOB_PARAMETERS=\"{
556 \\\"SALT_MASTER_URL\\\": \\\"\${SALTAPI_URL}\\\",
Hanna Arhipova6f493522019-12-25 04:23:28 +0200557 \\\"BATCH_SIZE\\\": \\\"\${BATCH_SIZE}\\\",
Dmitriy Kruglov758f99c2020-02-04 12:04:31 +0100558 \\\"STACK_INSTALL\\\": \\\"${stack}\\\",
PGlazoved19b352020-05-21 16:42:27 +0400559 \\\"DIST_UPGRADE_NODES\\\": \\\"\${DIST_UPGRADE_NODES}\\\",
560 \\\"UPGRADE_SALTSTACK\\\": \\\"\${UPGRADE_SALTSTACK}\\\"
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300561 }\"
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200562 JOB_PREFIX="[ ${ENV_NAME}/{build_number}:platform {time} ] "
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300563 python ./tcp_tests/utils/run_jenkins_job.py --verbose --job-name=deploy_openstack --job-parameters="\$JOB_PARAMETERS" --job-output-prefix="\$JOB_PREFIX"
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300564 """)
Dennis Dmitriev44f6db22018-10-31 16:07:56 +0200565 // Wait for IO calm down on cluster nodes
566 sleep(60)
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300567 } catch (e) {
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300568 common.printMsg("Product job 'deploy_openstack' failed, getting details", "purple")
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300569 def workflow_details=run_cmd_stdout("""\
570 . ./tcp_tests/utils/env_salt
571 . ./tcp_tests/utils/env_jenkins_cicd
572 export JOB_NAME=deploy_openstack
573 export BUILD_NUMBER=lastBuild
574 python ./tcp_tests/utils/get_jenkins_job_stages.py
575 """)
576 throw new Exception(workflow_details)
577 }
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300578}
579
580def sanity_check_component(stack) {
581 // Run sanity check for the component ${stack}.
582 // Result will be stored in JUnit XML file deploy_${stack}.xml
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300583 try {
584 run_cmd("""\
Dennis Dmitriev27007322019-05-03 19:21:44 +0300585 export LOG_NAME=deploy_${stack}_test.log
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300586 py.test --junit-xml=deploy_${stack}.xml -m check_${stack}
587 """)
588 } catch (e) {
589 def String junit_report_xml = readFile("deploy_${stack}.xml")
590 def String junit_report_xml_pretty = new XmlUtil().serialize(junit_report_xml)
591 def String msg = "Sanity check for '${stack}' failed, JUnit report:\n"
592 throw new Exception(msg + junit_report_xml_pretty)
593 }
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300594}
595
Dennis Dmitrievefe5c0b2018-10-24 20:35:26 +0300596def download_logs(archive_name_prefix) {
597 // Archive and download logs and debug info from salt nodes in the lab
598 // Do not fail in case of error to not lose the original error from the parent exception.
599 def common = new com.mirantis.mk.Common()
600 common.printMsg("Downloading nodes logs by ${archive_name_prefix}", "blue")
601 run_cmd("""\
602 export TESTS_CONFIGS=\$(pwd)/${ENV_NAME}_salt_deployed.ini
603 ./tcp_tests/utils/get_logs.py --archive-name-prefix ${archive_name_prefix} || true
604 """)
605}
606
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300607def devops_snapshot_info(snapshot_name) {
608 // Print helper message after snapshot
609 def common = new com.mirantis.mk.Common()
610
611 def SALT_MASTER_IP=run_cmd_stdout("""\
612 . ./tcp_tests/utils/env_salt
613 echo \$SALT_MASTER_IP
614 """).trim().split().last()
615 def login = "root" // set fixed 'root' login for now
616 def password = "r00tme" // set fixed 'root' login for now
617 def key_file = "${env.WORKSPACE}/id_rsa" // set fixed path in the WORKSPACE
618 def VENV_PATH='/home/jenkins/fuel-devops30'
619
620 common.printMsg("""\
621#########################
622# To revert the snapshot:
623#########################
624. ${VENV_PATH}/bin/activate;
625dos.py revert ${ENV_NAME} ${snapshot_name};
626dos.py resume ${ENV_NAME};
627# dos.py time-sync ${ENV_NAME}; # Optional\n
628ssh -i ${key_file} ${login}@${SALT_MASTER_IP} # Optional password: ${password}
629""", "cyan")
630}
631
Dennis Dmitriev2bacadf2019-05-03 17:26:11 +0300632def devops_snapshot(stacks) {
633 // Make snapshots with names "${stack}_deployed" for each stack
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300634 // for all VMs in the environment.
Dennis Dmitriev2bacadf2019-05-03 17:26:11 +0300635
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300636 run_cmd("""\
637 dos.py suspend ${ENV_NAME}
Dennis Dmitriev2bacadf2019-05-03 17:26:11 +0300638 """)
639
640 for (stack in "${stacks}".split(",")) {
641 run_cmd("""\
642 dos.py snapshot ${ENV_NAME} ${stack}_deployed
643 """)
644 devops_snapshot_info("${stack}_deployed")
645 }
646
647 run_cmd("""\
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300648 dos.py resume ${ENV_NAME}
Dennis Dmitriev1fed6662018-07-27 18:22:13 +0300649 sleep 20 # Wait for I/O on the host calms down
Dennis Dmitrievee5ef232018-08-31 13:53:18 +0300650
651 CFG01_NAME=\$(dos.py show-resources ${ENV_NAME} | grep ^cfg01 | cut -d" " -f1)
652 dos.py time-sync ${ENV_NAME} --skip-sync \${CFG01_NAME}
Dennis Dmitriev8df35442018-07-31 08:40:20 +0300653 """)
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300654}
655
Dennis Dmitrievfde667f2018-07-23 16:26:50 +0300656def get_steps_list(steps) {
657 // Make a list from comma separated string
658 return steps.split(',').collect { it.split(':')[0] }
659}
660
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300661def create_xml_report(String filename, String classname, String name, String status='success', String status_message='', String text='', String stdout='', String stderr='') {
662 // <filename> is name of the XML report file that will be created
663 // <status> is one of the 'success', 'skipped', 'failure' or 'error'
664 // 'error' status is assumed as 'Blocker' in TestRail reporter
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300665
666 // Replace '<' and '>' to '&lt;' and '&gt;' to avoid conflicts between xml tags in the message and JUnit report
Hanna Arhipova70685072021-01-25 16:11:57 +0200667 def String text_filtered = text.replaceAll("&", "&amp;").
668 replaceAll("<","&lt;").
Hanna Arhipova413c1db2020-02-11 15:37:48 +0200669 replaceAll(">", "&gt;").
670 replaceAll("[^\\x{0009}\\x{000a}\\x{000d}\\x{0020}-\\x{D7FF}\\x{E000}-\\x{FFFD}]+", "")
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300671
Dennis Dmitriev39666082018-08-29 15:30:45 +0300672 def script = """\
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300673<?xml version=\"1.0\" encoding=\"utf-8\"?>
674 <testsuite>
675 <testcase classname=\"${classname}\" name=\"${name}\" time=\"0\">
Dennis Dmitrievb08c0772018-10-17 15:10:26 +0300676 <${status} message=\"${status_message}\">${text_filtered}</${status}>
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300677 <system-out>${stdout}</system-out>
678 <system-err>${stderr}</system-err>
679 </testcase>
680 </testsuite>
Dennis Dmitriev39666082018-08-29 15:30:45 +0300681"""
682 writeFile(file: filename, text: script, encoding: "UTF-8")
Dennis Dmitrievb3b37492018-07-08 21:23:00 +0300683}
684
Hanna Arhipova1b92f9b2020-10-05 15:50:25 +0300685def upload_results_to_testrail(report_name, testPlanName, testSuiteName, methodname, testrail_name_template, reporter_extra_options=[]) {
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300686 def venvPath = '/home/jenkins/venv_testrail_reporter'
Tatyana Leontovichbfbc4832018-12-27 12:47:23 +0200687 def testPlanDesc = env.LAB_CONFIG_NAME
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300688 def testrailURL = "https://mirantis.testrail.com"
689 def testrailProject = "Mirantis Cloud Platform"
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300690 def testrailMilestone = "MCP1.1"
Dennis Dmitriev707b2152018-10-23 19:12:48 +0300691 def testrailCaseMaxNameLenght = 250
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300692 def jobURL = env.BUILD_URL
693
694 def reporterOptions = [
695 "--verbose",
696 "--env-description \"${testPlanDesc}\"",
697 "--testrail-run-update",
698 "--testrail-url \"${testrailURL}\"",
699 "--testrail-user \"\${TESTRAIL_USER}\"",
700 "--testrail-password \"\${TESTRAIL_PASSWORD}\"",
701 "--testrail-project \"${testrailProject}\"",
702 "--testrail-plan-name \"${testPlanName}\"",
703 "--testrail-milestone \"${testrailMilestone}\"",
704 "--testrail-suite \"${testSuiteName}\"",
705 "--xunit-name-template \"${methodname}\"",
706 "--testrail-name-template \"${testrail_name_template}\"",
707 "--test-results-link \"${jobURL}\"",
Dennis Dmitriev707b2152018-10-23 19:12:48 +0300708 "--testrail-case-max-name-lenght ${testrailCaseMaxNameLenght}",
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300709 ] + reporter_extra_options
710
711 def script = """
712 . ${venvPath}/bin/activate
713 set -ex
Ekaterina Chernova0d81efc2019-10-28 16:23:17 +0300714 report ${reporterOptions.join(' ')} ${report_name}
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300715 """
716
717 def testrail_cred_id = params.TESTRAIL_CRED ?: 'testrail_system_tests'
718
719 withCredentials([
720 [$class : 'UsernamePasswordMultiBinding',
721 credentialsId : testrail_cred_id,
722 passwordVariable: 'TESTRAIL_PASSWORD',
723 usernameVariable: 'TESTRAIL_USER']
724 ]) {
Dennis Dmitrievfd0b78c2019-05-30 00:16:04 +0300725 def ret = [:]
726 ret.stdout = ''
727 ret.exception = ''
728 try {
729 ret.stdout = run_cmd_stdout(script)
730 } catch (Exception ex) {
731 ret.exception = ("""\
732##### Report to '${testSuiteName}' failed: #####\n""" + ex.message + "\n\n")
733 }
734 return ret
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300735 }
736}
737
738
739def create_deploy_result_report(deploy_expected_stacks, result, text) {
740 def STATUS_MAP = ['SUCCESS': 'success', 'FAILURE': 'failure', 'UNSTABLE': 'failure', 'ABORTED': 'error']
741 def classname = "Deploy"
742 def name = "deployment_${ENV_NAME}"
Dennis Dmitriev39666082018-08-29 15:30:45 +0300743 def filename = "${name}.xml"
Dennis Dmitrieve4b831b2018-08-15 17:16:10 +0300744 def status = STATUS_MAP[result ?: 'FAILURE'] // currentBuild.result *must* be set at the finish of the try/catch
745 create_xml_report(filename, classname, name, status, "Deploy components: ${deploy_expected_stacks}", text, '', '')
Dennis Dmitriev27a96792018-07-30 07:52:03 +0300746}
Hanna Arhipova1b92f9b2020-10-05 15:50:25 +0300747
748def mark_test_results(testPlanName, testSuiteName) {
749 def venvPath = '/home/jenkins/venv_testrail_analyzer'
750 def testrailURL = "https://mirantis.testrail.com"
751 def testrailProject = "Mirantis Cloud Platform"
752 def configName = env.LAB_CONFIG_NAME
753 def testRunName = "${configName} <${testSuiteName}>"
754
755 def script = """
756 . ${venvPath}/bin/activate
757 set -ex
758 export TESTRAIL_URL=${testrailURL}
759 testrail-reporter analyze -p "${testrailProject}" -t "${testPlanName}" -r "${testRunName}" checklist.yaml
760 """
761
762 def testrail_cred_id = params.TESTRAIL_CRED ?: 'testrail_system_tests'
763
764 withCredentials([
765 [$class : 'UsernamePasswordMultiBinding',
766 credentialsId : testrail_cred_id,
767 passwordVariable: 'TESTRAIL_PASSWORD',
768 usernameVariable: 'TESTRAIL_USER']
769 ]) {
770 def ret = [:]
771 ret.stdout = ''
772 ret.exception = ''
773 try {
774 ret.stdout = run_cmd_stdout(script)
775 } catch (Exception ex) {
776 ret.exception = ("""\
777##### Report to '${testRunName}' failed: #####\n""" + ex.message + "\n\n")
778 }
779 return ret
780 }
Hanna Arhipova3be50622021-01-11 13:11:45 +0200781}
782
783def reboot_hardware_nodes() {
784 bm_ips = [
785 "185.8.59.227",
786 "185.8.59.229",
787 "5.43.225.88",
788 "5.43.225.112",
789 "5.43.225.208",
790 "5.43.227.118",
791 "185.8.58.248",
792 "185.8.59.222",
793 "5.43.225.228",
794 "5.43.229.28",
795 "5.43.225.23",
796 "185.8.58.9",
797 "185.8.58.246",
798 "185.8.58.243",
799 "185.8.58.244"
800 ]
801
802 withCredentials([
803 [$class : 'UsernamePasswordMultiBinding',
804 credentialsId : 'lab_engineer',
805 passwordVariable: 'lab_pass',
806 usernameVariable: 'lab_user']
807 ]) {
808 for (ip in bm_ips) { sh ("ipmitool -H ${ip} -U ${lab_user} -P ${lab_pass} chassis power off")}
809 for (ip in bm_ips) { sh ("ipmitool -H ${ip} -U ${lab_user} -P ${lab_pass} chassis bootdev pxe")}
810 }
Hanna Arhipova1b92f9b2020-10-05 15:50:25 +0300811}