| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 1 | package com.mirantis.mk | 
 | 2 |  | 
 | 3 | /** | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 4 |  * Setup Docker to run some tests. Returns true/false based on | 
 | 5 |  were tests successful or not. | 
 | 6 |  * @param config - LinkedHashMap with configuration params: | 
 | 7 |  *   dockerHostname - (required) Hostname to use for Docker container. | 
| azvyagintsev | abcf42e | 2018-10-05 20:40:27 +0300 | [diff] [blame] | 8 |  *   distribRevision - (optional) Revision of packages to use (default proposed). | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 9 |  *   runCommands - (optional) Dict with closure structure of body required tests. For example: | 
 | 10 |  *     [ '001_Test': { sh("./run-some-test") }, '002_Test': { sh("./run-another-test") } ] | 
 | 11 |  *     Before execution runCommands will be sorted by key names. Alpabetical order is preferred. | 
 | 12 |  *   runFinally - (optional) Dict with closure structure of body required commands, which should be | 
 | 13 |  *     executed in any case of test results. Same format as for runCommands | 
 | 14 |  *   updateRepo - (optional) Whether to run common repo update step. | 
 | 15 |  *   dockerContainerName - (optional) Docker container name. | 
 | 16 |  *   dockerImageName - (optional) Docker image name | 
 | 17 |  *   dockerMaxCpus - (optional) Number of CPUS to use in Docker. | 
 | 18 |  *   dockerExtraOpts - (optional) Array of Docker extra opts for container | 
 | 19 |  *   envOpts - (optional) Array of variables that should be passed as ENV vars to Docker container. | 
 | 20 |  * Return true | false | 
 | 21 |  */ | 
 | 22 |  | 
 | 23 | def setupDockerAndTest(LinkedHashMap config) { | 
 | 24 |     def common = new com.mirantis.mk.Common() | 
 | 25 |     def TestMarkerResult = false | 
 | 26 |     // setup options | 
 | 27 |     def defaultContainerName = 'test-' + UUID.randomUUID().toString() | 
 | 28 |     def dockerHostname = config.get('dockerHostname', defaultContainerName) | 
| azvyagintsev | abcf42e | 2018-10-05 20:40:27 +0300 | [diff] [blame] | 29 |     def distribRevision = config.get('distribRevision', 'proposed') | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 30 |     def runCommands = config.get('runCommands', [:]) | 
 | 31 |     def runFinally = config.get('runFinally', [:]) | 
 | 32 |     def baseRepoPreConfig = config.get('baseRepoPreConfig', true) | 
 | 33 |     def dockerContainerName = config.get('dockerContainerName', defaultContainerName) | 
 | 34 |     def dockerImageName = config.get('image', "mirantis/salt:saltstack-ubuntu-xenial-salt-2017.7") | 
 | 35 |     def dockerMaxCpus = config.get('dockerMaxCpus', 4) | 
 | 36 |     def dockerExtraOpts = config.get('dockerExtraOpts', []) | 
 | 37 |     def envOpts = config.get('envOpts', []) | 
| azvyagintsev | abcf42e | 2018-10-05 20:40:27 +0300 | [diff] [blame] | 38 |     envOpts.add("DISTRIB_REVISION=${distribRevision}") | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 39 |     def dockerBaseOpts = [ | 
 | 40 |         '-u root:root', | 
 | 41 |         "--hostname=${dockerHostname}", | 
 | 42 |         '--ulimit nofile=4096:8192', | 
 | 43 |         "--name=${dockerContainerName}", | 
 | 44 |         "--cpus=${dockerMaxCpus}" | 
 | 45 |     ] | 
 | 46 |  | 
| Denis Egorenko | 649cf7d | 2018-10-18 16:36:33 +0400 | [diff] [blame] | 47 |     // extra repo on mirror.mirantis.net, which is not supported before 2018.11.0 release | 
 | 48 |     def extraRepoSource = "deb [arch=amd64] http://mirror.mirantis.com/${distribRevision}/extra/xenial xenial main" | 
 | 49 |     try { | 
 | 50 |         def releaseNaming = 'yyyy.MM.dd' | 
 | 51 |         def repoDateUsed = new Date().parse(releaseNaming, distribRevision) | 
 | 52 |         def extraAvailableFrom = new Date().parse(releaseNaming, '2018.11.0') | 
 | 53 |         if (repoDateUsed < extraAvailableFrom) { | 
 | 54 |           extraRepoSource = "deb http://apt.mcp.mirantis.net:8085/xenial ${distribRevision} extra" | 
 | 55 |         } | 
 | 56 |     } catch (Exception e) { | 
 | 57 |         common.warningMsg(e) | 
 | 58 |         if ( !(distribRevision in [ 'nightly', 'proposed', 'testing' ] )) { | 
 | 59 |             extraRepoSource = "deb http://apt.mcp.mirantis.net:8085/xenial ${distribRevision} extra" | 
 | 60 |         } | 
 | 61 |     } | 
 | 62 |  | 
 | 63 |     def dockerOptsFinal = (dockerBaseOpts + dockerExtraOpts).join(' ') | 
 | 64 |     def defaultExtraReposYaml = """ | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 65 | --- | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 66 | aprConfD: |- | 
 | 67 |   APT::Get::AllowUnauthenticated 'true'; | 
 | 68 |   APT::Get::Install-Suggests 'false'; | 
 | 69 |   APT::Get::Install-Recommends 'false'; | 
 | 70 | repo: | 
 | 71 |   mcp_saltstack: | 
| Denis Egorenko | 395aa21 | 2018-10-11 15:11:28 +0400 | [diff] [blame] | 72 |     source: "deb [arch=amd64] http://mirror.mirantis.com/${distribRevision}/saltstack-2017.7/xenial xenial main" | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 73 |     pinning: |- | 
 | 74 |         Package: libsodium18 | 
 | 75 |         Pin: release o=SaltStack | 
 | 76 |         Pin-Priority: 50 | 
 | 77 |  | 
 | 78 |         Package: * | 
 | 79 |         Pin: release o=SaltStack | 
 | 80 |         Pin-Priority: 1100 | 
 | 81 |   mcp_extra: | 
| Denis Egorenko | 3c752a5 | 2018-10-12 12:21:29 +0400 | [diff] [blame] | 82 |     source: "${extraRepoSource}" | 
| Denis Egorenko | 395aa21 | 2018-10-11 15:11:28 +0400 | [diff] [blame] | 83 |   mcp_saltformulas: | 
 | 84 |     source: "deb http://apt.mcp.mirantis.net:8085/xenial ${distribRevision} salt salt-latest" | 
 | 85 |     repo_key: "http://apt.mcp.mirantis.net:8085/public.gpg" | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 86 |   ubuntu: | 
| Denis Egorenko | 395aa21 | 2018-10-11 15:11:28 +0400 | [diff] [blame] | 87 |     source: "deb [arch=amd64] http://mirror.mirantis.com/${distribRevision}/ubuntu xenial main restricted universe" | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 88 |   ubuntu-upd: | 
| Denis Egorenko | 395aa21 | 2018-10-11 15:11:28 +0400 | [diff] [blame] | 89 |     source: "deb [arch=amd64] http://mirror.mirantis.com/${distribRevision}/ubuntu xenial-updates main restricted universe" | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 90 |   ubuntu-sec: | 
| Denis Egorenko | 395aa21 | 2018-10-11 15:11:28 +0400 | [diff] [blame] | 91 |     source: "deb [arch=amd64] http://mirror.mirantis.com/${distribRevision}/ubuntu xenial-security main restricted universe" | 
 | 92 | """ | 
| Denis Egorenko | d54f60f | 2018-10-10 19:38:03 +0400 | [diff] [blame] | 93 |  | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 94 |     def img = docker.image(dockerImageName) | 
| Denis Egorenko | 649cf7d | 2018-10-18 16:36:33 +0400 | [diff] [blame] | 95 |     def extraReposYaml = config.get('extraReposYaml', defaultExtraReposYaml) | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 96 |  | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 97 |     img.pull() | 
 | 98 |  | 
 | 99 |     try { | 
 | 100 |         img.inside(dockerOptsFinal) { | 
 | 101 |             withEnv(envOpts) { | 
 | 102 |                 try { | 
 | 103 |                     // Currently, we don't have any other point to install | 
 | 104 |                     // runtime dependencies for tests. | 
 | 105 |                     if (baseRepoPreConfig) { | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 106 |                         // Warning! POssible point of 'allow-downgrades' issue | 
 | 107 |                         // Probably, need to add such flag into apt.prefs | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 108 |                         sh("""#!/bin/bash -xe | 
 | 109 |                             echo "Installing extra-deb dependencies inside docker:" | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 110 |                             echo > /etc/apt/sources.list | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 111 |                             rm -vf /etc/apt/sources.list.d/* || true | 
| Aleksey Zvyagintsev | c545334 | 2018-10-05 15:03:59 +0000 | [diff] [blame] | 112 |                         """) | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 113 |                         common.debianExtraRepos(extraReposYaml) | 
 | 114 |                         sh('''#!/bin/bash -xe | 
 | 115 |                             apt-get update | 
| Denis Egorenko | c6b24be | 2018-10-10 17:36:04 +0400 | [diff] [blame] | 116 |                             apt-get install -y python-netaddr | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 117 |                         ''') | 
 | 118 |  | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 119 |                     } | 
 | 120 |                     runCommands.sort().each { command, body -> | 
 | 121 |                         common.warningMsg("Running command: ${command}") | 
 | 122 |                         // doCall is the closure implementation in groovy, allow to pass arguments to closure | 
 | 123 |                         body.call() | 
 | 124 |                     } | 
 | 125 |                     // If we didn't dropped for now - test has been passed. | 
 | 126 |                     TestMarkerResult = true | 
 | 127 |                 } | 
 | 128 |                 finally { | 
 | 129 |                     runFinally.sort().each { command, body -> | 
 | 130 |                         common.warningMsg("Running ${command} command.") | 
 | 131 |                         // doCall is the closure implementation in groovy, allow to pass arguments to closure | 
 | 132 |                         body.call() | 
 | 133 |                     } | 
 | 134 |                 } | 
 | 135 |             } | 
 | 136 |         } | 
 | 137 |     } | 
 | 138 |     catch (Exception er) { | 
 | 139 |         common.warningMsg("IgnoreMe:Something wrong with img.Message:\n" + er.toString()) | 
 | 140 |     } | 
 | 141 |  | 
 | 142 |     try { | 
 | 143 |         common.warningMsg("IgnoreMe:Force cleanup slave.Ignore docker-daemon errors") | 
 | 144 |         timeout(time: 10, unit: 'SECONDS') { | 
 | 145 |             sh(script: "set -x; docker kill ${dockerContainerName} || true", returnStdout: true) | 
 | 146 |         } | 
 | 147 |         timeout(time: 10, unit: 'SECONDS') { | 
 | 148 |             sh(script: "set -x; docker rm --force ${dockerContainerName} || true", returnStdout: true) | 
 | 149 |         } | 
 | 150 |     } | 
 | 151 |     catch (Exception er) { | 
 | 152 |         common.warningMsg("IgnoreMe:Timeout to delete test docker container with force!Message:\n" + er.toString()) | 
 | 153 |     } | 
 | 154 |  | 
 | 155 |     if (TestMarkerResult) { | 
 | 156 |         common.infoMsg("Test finished: SUCCESS") | 
 | 157 |     } else { | 
 | 158 |         common.warningMsg("Test finished: FAILURE") | 
 | 159 |     } | 
 | 160 |     return TestMarkerResult | 
 | 161 | } | 
 | 162 |  | 
 | 163 | /** | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 164 |  * Wrapper around setupDockerAndTest, to run checks against new Reclass version | 
 | 165 |  * that current model is compatible with new Reclass. | 
 | 166 |  * | 
 | 167 |  * @param config - LinkedHashMap with configuration params: | 
 | 168 |  *   dockerHostname - (required) Hostname to use for Docker container. | 
 | 169 |  *   distribRevision - (optional) Revision of packages to use (default proposed). | 
 | 170 |  *   extraRepo - (optional) Extra repo to use to install new Reclass version. Has | 
 | 171 |  *     high priority on distribRevision | 
 | 172 |  *   targetNodes - (required) List nodes to check pillar data. | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 173 |  */ | 
 | 174 | def compareReclassVersions(config) { | 
 | 175 |     def common = new com.mirantis.mk.Common() | 
 | 176 |     def salt = new com.mirantis.mk.Salt() | 
 | 177 |     common.infoMsg("Going to test new reclass for CFG node") | 
 | 178 |     def distribRevision = config.get('distribRevision', 'proposed') | 
 | 179 |     def venv = config.get('venv') | 
 | 180 |     def extraRepo = config.get('extraRepo', '') | 
 | 181 |     def extraRepoKey = config.get('extraRepoKey', '') | 
 | 182 |     def targetNodes = config.get('targetNodes') | 
 | 183 |     sh "rm -rf ${env.WORKSPACE}/old ${env.WORKSPACE}/new" | 
 | 184 |     sh "mkdir -p ${env.WORKSPACE}/old ${env.WORKSPACE}/new" | 
 | 185 |     def configRun = [ | 
| azvyagintsev | abcf42e | 2018-10-05 20:40:27 +0300 | [diff] [blame] | 186 |         'distribRevision': distribRevision, | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 187 |         'dockerExtraOpts' : [ | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 188 |             "-v /srv/salt/reclass:/srv/salt/reclass:ro", | 
 | 189 |             "-v /etc/salt:/etc/salt:ro", | 
 | 190 |             "-v /usr/share/salt-formulas/:/usr/share/salt-formulas/:ro" | 
 | 191 |         ], | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 192 |         'envOpts'         : [ | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 193 |             "WORKSPACE=${env.WORKSPACE}", | 
 | 194 |             "NODES_LIST=${targetNodes.join(' ')}" | 
 | 195 |         ], | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 196 |         'runCommands'     : [ | 
 | 197 |             '001_Update_Reclass_package'    : { | 
 | 198 |                 sh('apt-get update && apt-get install -y reclass') | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 199 |             }, | 
 | 200 |             '002_Test_Reclass_Compatibility': { | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 201 |                 sh(''' | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 202 |                 reclass-salt -b /srv/salt/reclass -t > ${WORKSPACE}/new/inventory || exit 1 | 
 | 203 |                 for node in $NODES_LIST; do | 
 | 204 |                     reclass-salt -b /srv/salt/reclass -p $node > ${WORKSPACE}/new/$node || exit 1 | 
 | 205 |                 done | 
 | 206 |               ''') | 
 | 207 |             } | 
 | 208 |         ] | 
 | 209 |     ] | 
 | 210 |     if (extraRepo) { | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 211 |         // FIXME | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 212 |         configRun['runCommands']['0001_Additional_Extra_Repo_Passed'] = { | 
 | 213 |             sh(""" | 
 | 214 |                 echo "${extraRepo}" > /etc/apt/sources.list.d/mcp_extra.list | 
 | 215 |                 [ "${extraRepoKey}" ] && wget -O - ${extraRepoKey} | apt-key add - | 
 | 216 |             """) | 
 | 217 |         } | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 218 |     } | 
 | 219 |     if (setupDockerAndTest(configRun)) { | 
 | 220 |         common.infoMsg("New reclass version is compatible with current model: SUCCESS") | 
 | 221 |         def inventoryOld = salt.cmdRun(venv, "I@salt:master", "reclass-salt -b /srv/salt/reclass -t", true, null, true).get("return")[0].values()[0] | 
 | 222 |         // [0..-31] to exclude 'echo Salt command execution success' from output | 
 | 223 |         writeFile(file: "${env.WORKSPACE}/old/inventory", text: inventoryOld[0..-31]) | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 224 |         for (String node in targetNodes) { | 
| Denis Egorenko | b090a76 | 2018-09-12 19:25:41 +0400 | [diff] [blame] | 225 |             def nodeOut = salt.cmdRun(venv, "I@salt:master", "reclass-salt -b /srv/salt/reclass -p ${node}", true, null, true).get("return")[0].values()[0] | 
 | 226 |             writeFile(file: "${env.WORKSPACE}/old/${node}", text: nodeOut[0..-31]) | 
 | 227 |         } | 
 | 228 |         def reclassDiff = common.comparePillars(env.WORKSPACE, env.BUILD_URL, '') | 
 | 229 |         currentBuild.description = reclassDiff | 
 | 230 |         if (reclassDiff != '<b>No job changes</b>') { | 
 | 231 |             throw new RuntimeException("Pillars with new reclass version has been changed: FAILED") | 
 | 232 |         } else { | 
 | 233 |             common.infoMsg("Pillars not changed with new reclass version: SUCCESS") | 
 | 234 |         } | 
 | 235 |     } else { | 
 | 236 |         throw new RuntimeException("New reclass version is not compatible with current model: FAILED") | 
 | 237 |     } | 
 | 238 | } | 
 | 239 |  | 
 | 240 | /** | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 241 |  * Wrapper over setupDockerAndTest, to test CC model. | 
 | 242 |  * | 
 | 243 |  * @param config - dict with params: | 
 | 244 |  *   dockerHostname - (required) salt master's name | 
 | 245 |  *   clusterName - (optional) model cluster name | 
 | 246 |  *   extraFormulas - (optional) extraFormulas to install. DEPRECATED | 
 | 247 |  *   formulasSource - (optional) formulas source (git or pkg, default pkg) | 
 | 248 |  *   reclassVersion - (optional) Version of used reclass (branch, tag, ...) (optional, default master) | 
 | 249 |  *   reclassEnv - (require) directory of model | 
 | 250 |  *   ignoreClassNotfound - (optional) Ignore missing classes for reclass model (default false) | 
 | 251 |  *   aptRepoUrl - (optional) package repository with salt formulas | 
 | 252 |  *   aptRepoGPG - (optional) GPG key for apt repository with formulas | 
 | 253 |  *   testContext - (optional) Description of test | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 254 |  Return: true\exception | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 255 |  */ | 
 | 256 |  | 
 | 257 | def testNode(LinkedHashMap config) { | 
 | 258 |     def common = new com.mirantis.mk.Common() | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 259 |     def dockerHostname = config.get('dockerHostname') | 
 | 260 |     def reclassEnv = config.get('reclassEnv') | 
 | 261 |     def clusterName = config.get('clusterName', "") | 
 | 262 |     def formulasSource = config.get('formulasSource', 'pkg') | 
 | 263 |     def extraFormulas = config.get('extraFormulas', 'linux') | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 264 |     def ignoreClassNotfound = config.get('ignoreClassNotfound', false) | 
 | 265 |     def aptRepoUrl = config.get('aptRepoUrl', "") | 
 | 266 |     def aptRepoGPG = config.get('aptRepoGPG', "") | 
 | 267 |     def testContext = config.get('testContext', 'test') | 
 | 268 |     config['envOpts'] = [ | 
 | 269 |         "RECLASS_ENV=${reclassEnv}", "SALT_STOPSTART_WAIT=5", | 
 | 270 |         "MASTER_HOSTNAME=${dockerHostname}", "CLUSTER_NAME=${clusterName}", | 
 | 271 |         "MINION_ID=${dockerHostname}", "FORMULAS_SOURCE=${formulasSource}", | 
| Denis Egorenko | d54f60f | 2018-10-10 19:38:03 +0400 | [diff] [blame] | 272 |         "EXTRA_FORMULAS=${extraFormulas}", "EXTRA_FORMULAS_PKG_ALL=true", | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 273 |         "RECLASS_IGNORE_CLASS_NOTFOUND=${ignoreClassNotfound}", "DEBUG=1", | 
| Denis Egorenko | d54f60f | 2018-10-10 19:38:03 +0400 | [diff] [blame] | 274 |         "APT_REPOSITORY=${aptRepoUrl}", "APT_REPOSITORY_GPG=${aptRepoGPG}" | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 275 |     ] | 
 | 276 |  | 
 | 277 |     config['runCommands'] = [ | 
 | 278 |         '001_Clone_salt_formulas_scripts': { | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 279 |             sh(script: 'git clone https://github.com/salt-formulas/salt-formulas-scripts /srv/salt/scripts', returnStdout: true) | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 280 |         }, | 
 | 281 |  | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 282 |         '002_Prepare_something'          : { | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 283 |             sh('''rsync -ah ${RECLASS_ENV}/* /srv/salt/reclass && echo '127.0.1.2  salt' >> /etc/hosts | 
 | 284 |               cd /srv/salt && find . -type f \\( -name '*.yml' -or -name '*.sh' \\) -exec sed -i 's/apt-mk.mirantis.com/apt.mirantis.net:8085/g' {} \\; | 
 | 285 |               cd /srv/salt && find . -type f \\( -name '*.yml' -or -name '*.sh' \\) -exec sed -i 's/apt.mirantis.com/apt.mirantis.net:8085/g' {} \\; | 
 | 286 |             ''') | 
 | 287 |         }, | 
 | 288 |  | 
| Denis Egorenko | c6b24be | 2018-10-10 17:36:04 +0400 | [diff] [blame] | 289 |         '003_Install_Reclass_package'    : { | 
 | 290 |             sh('apt-get install -y reclass') | 
 | 291 |         }, | 
 | 292 |  | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 293 |         '004_Run_tests'                  : { | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 294 |             def testTimeout = 40 * 60 | 
 | 295 |             timeout(time: testTimeout, unit: 'SECONDS') { | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 296 |                 sh('''#!/bin/bash | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 297 |                 source /srv/salt/scripts/bootstrap.sh | 
 | 298 |                 cd /srv/salt/scripts | 
 | 299 |                 source_local_envs | 
 | 300 |                 configure_salt_master | 
 | 301 |                 configure_salt_minion | 
 | 302 |                 install_salt_formula_pkg | 
 | 303 |                 source /srv/salt/scripts/bootstrap.sh | 
 | 304 |                 cd /srv/salt/scripts | 
 | 305 |                 saltservice_restart''') | 
 | 306 |  | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 307 |                 sh('''#!/bin/bash | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 308 |                 source /srv/salt/scripts/bootstrap.sh | 
 | 309 |                 cd /srv/salt/scripts | 
 | 310 |                 source_local_envs | 
 | 311 |                 saltmaster_init''') | 
 | 312 |  | 
| Aleksey Zvyagintsev | b20bd26 | 2018-10-05 15:09:06 +0000 | [diff] [blame] | 313 |                 sh('''#!/bin/bash | 
| Denis Egorenko | 6fd79ac | 2018-09-12 13:28:21 +0400 | [diff] [blame] | 314 |                 source /srv/salt/scripts/bootstrap.sh | 
 | 315 |                 cd /srv/salt/scripts | 
 | 316 |                 verify_salt_minions''') | 
 | 317 |             } | 
 | 318 |         } | 
 | 319 |     ] | 
 | 320 |     config['runFinally'] = [ | 
 | 321 |         '001_Archive_artefacts': { | 
 | 322 |             sh(script: "cd /tmp; tar -czf ${env.WORKSPACE}/nodesinfo.tar.gz *reclass*", returnStatus: true) | 
 | 323 |             archiveArtifacts artifacts: "nodesinfo.tar.gz" | 
 | 324 |         } | 
 | 325 |     ] | 
 | 326 |     testResult = setupDockerAndTest(config) | 
 | 327 |     if (testResult) { | 
 | 328 |         common.infoMsg("Node test for context: ${testContext} model: ${reclassEnv} finished: SUCCESS") | 
 | 329 |     } else { | 
 | 330 |         throw new RuntimeException("Node test for context: ${testContext} model: ${reclassEnv} finished: FAILURE") | 
 | 331 |     } | 
 | 332 |     return testResult | 
 | 333 | } | 
 | 334 |  | 
 | 335 | /** | 
| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 336 |  * setup and test salt-master | 
 | 337 |  * | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 338 |  * @param masterName salt master's name | 
 | 339 |  * @param clusterName model cluster name | 
 | 340 |  * @param extraFormulas extraFormulas to install. DEPRECATED | 
 | 341 |  * @param formulasSource formulas source (git or pkg) | 
 | 342 |  * @param reclassVersion Version of used reclass (branch, tag, ...) (optional, default master) | 
 | 343 |  * @param testDir directory of model | 
 | 344 |  * @param formulasSource Salt formulas source type (optional, default pkg) | 
 | 345 |  * @param formulasRevision APT revision for formulas (optional default stable) | 
| Petr Michalec | 6414aa5 | 2017-08-17 14:32:52 +0200 | [diff] [blame] | 346 |  * @param ignoreClassNotfound Ignore missing classes for reclass model | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 347 |  * @param dockerMaxCpus max cpus passed to docker (default 0, disabled) | 
 | 348 |  * @param legacyTestingMode do you want to enable legacy testing mode (iterating through the nodes directory definitions instead of reading cluster models) | 
 | 349 |  * @param aptRepoUrl package repository with salt formulas | 
 | 350 |  * @param aptRepoGPG GPG key for apt repository with formulas | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 351 |  * Return                     true | false | 
| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 352 |  */ | 
 | 353 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 354 | def setupAndTestNode(masterName, clusterName, extraFormulas = '*', testDir, formulasSource = 'pkg', | 
| Vasyl Saienko | 369ed90 | 2018-07-23 11:49:32 +0000 | [diff] [blame] | 355 |                      formulasRevision = 'stable', reclassVersion = "master", dockerMaxCpus = 0, | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 356 |                      ignoreClassNotfound = false, legacyTestingMode = false, aptRepoUrl = '', aptRepoGPG = '', dockerContainerName = false) { | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 357 |     def common = new com.mirantis.mk.Common() | 
| azvyagintsev | 1cecc09 | 2018-09-14 13:19:16 +0300 | [diff] [blame] | 358 |     // TODO | 
 | 359 |     common.errorMsg('You are using deprecated function!Please migrate to "setupDockerAndTest".' + | 
 | 360 |         'It would be removed after 2018.q4 release!Pushing forced 60s sleep..') | 
 | 361 |     sh('sleep 60') | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 362 |     // timeout for test execution (40min) | 
 | 363 |     def testTimeout = 40 * 60 | 
 | 364 |     def TestMarkerResult = false | 
 | 365 |     def saltOpts = "--retcode-passthrough --force-color" | 
 | 366 |     def workspace = common.getWorkspace() | 
 | 367 |     def img = docker.image("mirantis/salt:saltstack-ubuntu-xenial-salt-2017.7") | 
 | 368 |     img.pull() | 
| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 369 |  | 
| azvyagintsev | 635affb | 2018-09-13 13:02:54 +0300 | [diff] [blame] | 370 |     if (formulasSource == 'pkg') { | 
 | 371 |         if (extraFormulas) { | 
 | 372 |             common.warningMsg("You have passed deprecated variable:extraFormulas=${extraFormulas}. " + | 
 | 373 |                 "\n It would be ignored, and all formulas would be installed anyway") | 
 | 374 |         } | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 375 |     } | 
 | 376 |     if (!dockerContainerName) { | 
 | 377 |         dockerContainerName = 'setupAndTestNode' + UUID.randomUUID().toString() | 
 | 378 |     } | 
 | 379 |     def dockerMaxCpusOpt = "--cpus=4" | 
 | 380 |     if (dockerMaxCpus > 0) { | 
 | 381 |         dockerMaxCpusOpt = "--cpus=${dockerMaxCpus}" | 
 | 382 |     } | 
 | 383 |     try { | 
 | 384 |         img.inside("-u root:root --hostname=${masterName} --ulimit nofile=4096:8192 ${dockerMaxCpusOpt} --name=${dockerContainerName}") { | 
| azvyagintsev | 635affb | 2018-09-13 13:02:54 +0300 | [diff] [blame] | 385 |             withEnv(["FORMULAS_SOURCE=${formulasSource}", "EXTRA_FORMULAS=${extraFormulas}", "EXTRA_FORMULAS_PKG_ALL=true", | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 386 |                      "DISTRIB_REVISION=${formulasRevision}", | 
 | 387 |                      "DEBUG=1", "MASTER_HOSTNAME=${masterName}", | 
 | 388 |                      "CLUSTER_NAME=${clusterName}", "MINION_ID=${masterName}", | 
 | 389 |                      "RECLASS_VERSION=${reclassVersion}", "RECLASS_IGNORE_CLASS_NOTFOUND=${ignoreClassNotfound}", | 
 | 390 |                      "APT_REPOSITORY=${aptRepoUrl}", "SALT_STOPSTART_WAIT=5", | 
 | 391 |                      "APT_REPOSITORY_GPG=${aptRepoGPG}"]) { | 
 | 392 |                 try { | 
 | 393 |                     // Currently, we don't have any other point to install | 
 | 394 |                     // runtime dependencies for tests. | 
 | 395 |                     sh("""#!/bin/bash -xe | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 396 |             echo "Installing extra-deb dependencies inside docker:" | 
 | 397 |             echo "APT::Get::AllowUnauthenticated 'true';"  > /etc/apt/apt.conf.d/99setupAndTestNode | 
 | 398 |             echo "APT::Get::Install-Suggests 'false';"  >> /etc/apt/apt.conf.d/99setupAndTestNode | 
 | 399 |             echo "APT::Get::Install-Recommends 'false';"  >> /etc/apt/apt.conf.d/99setupAndTestNode | 
 | 400 |             rm -vf /etc/apt/sources.list.d/* || true | 
 | 401 |             echo 'deb [arch=amd64] http://mirror.mirantis.com/$DISTRIB_REVISION/ubuntu xenial main restricted universe' > /etc/apt/sources.list | 
 | 402 |             echo 'deb [arch=amd64] http://mirror.mirantis.com/$DISTRIB_REVISION/ubuntu xenial-updates main restricted universe' >> /etc/apt/sources.list | 
 | 403 |             apt-get update | 
 | 404 |             apt-get install -y python-netaddr | 
 | 405 |             """) | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 406 |                     sh(script: "git clone https://github.com/salt-formulas/salt-formulas-scripts /srv/salt/scripts", returnStdout: true) | 
 | 407 |                     sh("""rsync -ah ${testDir}/* /srv/salt/reclass && echo '127.0.1.2  salt' >> /etc/hosts | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 408 |             cd /srv/salt && find . -type f \\( -name '*.yml' -or -name '*.sh' \\) -exec sed -i 's/apt-mk.mirantis.com/apt.mirantis.net:8085/g' {} \\; | 
 | 409 |             cd /srv/salt && find . -type f \\( -name '*.yml' -or -name '*.sh' \\) -exec sed -i 's/apt.mirantis.com/apt.mirantis.net:8085/g' {} \\; | 
 | 410 |             """) | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 411 |                     // FIXME: should be changed to use reclass from mcp_extra_nigtly? | 
 | 412 |                     sh("""for s in \$(python -c \"import site; print(' '.join(site.getsitepackages()))\"); do | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 413 |             sudo -H pip install --install-option=\"--prefix=\" --upgrade --force-reinstall -I \ | 
 | 414 |             -t \"\$s\" git+https://github.com/salt-formulas/reclass.git@${reclassVersion}; | 
 | 415 |             done""") | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 416 |                     timeout(time: testTimeout, unit: 'SECONDS') { | 
 | 417 |                         sh('''#!/bin/bash | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 418 |               source /srv/salt/scripts/bootstrap.sh | 
 | 419 |               cd /srv/salt/scripts | 
 | 420 |               source_local_envs | 
 | 421 |               configure_salt_master | 
 | 422 |               configure_salt_minion | 
 | 423 |               install_salt_formula_pkg | 
 | 424 |               source /srv/salt/scripts/bootstrap.sh | 
 | 425 |               cd /srv/salt/scripts | 
 | 426 |               saltservice_restart''') | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 427 |                         sh('''#!/bin/bash | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 428 |               source /srv/salt/scripts/bootstrap.sh | 
 | 429 |               cd /srv/salt/scripts | 
 | 430 |               source_local_envs | 
 | 431 |               saltmaster_init''') | 
 | 432 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 433 |                         if (!legacyTestingMode.toBoolean()) { | 
 | 434 |                             sh('''#!/bin/bash | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 435 |                 source /srv/salt/scripts/bootstrap.sh | 
 | 436 |                 cd /srv/salt/scripts | 
 | 437 |                 verify_salt_minions | 
 | 438 |                 ''') | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 439 |                         } | 
 | 440 |                     } | 
 | 441 |                     // If we didn't dropped for now - test has been passed. | 
 | 442 |                     TestMarkerResult = true | 
 | 443 |                 } | 
 | 444 |  | 
 | 445 |                 finally { | 
 | 446 |                     // Collect rendered per-node data.Those info could be simply used | 
 | 447 |                     // for diff processing. Data was generated via reclass.cli --nodeinfo, | 
 | 448 |                     /// during verify_salt_minions. | 
 | 449 |                     sh(script: "cd /tmp; tar -czf ${env.WORKSPACE}/nodesinfo.tar.gz *reclass*", returnStatus: true) | 
 | 450 |                     archiveArtifacts artifacts: "nodesinfo.tar.gz" | 
 | 451 |                 } | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 452 |             } | 
| azvyagintsev | 1bfe684 | 2018-08-09 18:40:17 +0200 | [diff] [blame] | 453 |         } | 
| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 454 |     } | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 455 |     catch (Exception er) { | 
 | 456 |         common.warningMsg("IgnoreMe:Something wrong with img.Message:\n" + er.toString()) | 
 | 457 |     } | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 458 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 459 |     if (legacyTestingMode.toBoolean()) { | 
 | 460 |         common.infoMsg("Running legacy mode test for master hostname ${masterName}") | 
 | 461 |         def nodes = sh(script: "find /srv/salt/reclass/nodes -name '*.yml' | grep -v 'cfg*.yml'", returnStdout: true) | 
 | 462 |         for (minion in nodes.tokenize()) { | 
 | 463 |             def basename = sh(script: "set +x;basename ${minion} .yml", returnStdout: true) | 
 | 464 |             if (!basename.trim().contains(masterName)) { | 
 | 465 |                 testMinion(basename.trim()) | 
 | 466 |             } | 
 | 467 |         } | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 468 |     } | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 469 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 470 |     try { | 
 | 471 |         common.warningMsg("IgnoreMe:Force cleanup slave.Ignore docker-daemon errors") | 
 | 472 |         timeout(time: 10, unit: 'SECONDS') { | 
 | 473 |             sh(script: "set -x; docker kill ${dockerContainerName} || true", returnStdout: true) | 
 | 474 |         } | 
 | 475 |         timeout(time: 10, unit: 'SECONDS') { | 
 | 476 |             sh(script: "set -x; docker rm --force ${dockerContainerName} || true", returnStdout: true) | 
 | 477 |         } | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 478 |     } | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 479 |     catch (Exception er) { | 
 | 480 |         common.warningMsg("IgnoreMe:Timeout to delete test docker container with force!Message:\n" + er.toString()) | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 481 |     } | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 482 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 483 |     if (TestMarkerResult) { | 
 | 484 |         common.infoMsg("Test finished: SUCCESS") | 
 | 485 |     } else { | 
 | 486 |         common.warningMsg("Test finished: FAILURE") | 
 | 487 |     } | 
 | 488 |     return TestMarkerResult | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 489 |  | 
| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 490 | } | 
 | 491 |  | 
 | 492 | /** | 
 | 493 |  * Test salt-minion | 
 | 494 |  * | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 495 |  * @param minion salt minion | 
| chnyda | f14ea2a | 2017-05-26 15:07:47 +0200 | [diff] [blame] | 496 |  */ | 
 | 497 |  | 
| azvyagintsev | 28fa9d9 | 2018-06-26 14:31:49 +0300 | [diff] [blame] | 498 | def testMinion(minionName) { | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 499 |     sh(script: "bash -c 'source /srv/salt/scripts/bootstrap.sh; cd /srv/salt/scripts && verify_salt_minion ${minionName}'", returnStdout: true) | 
| Jakub Josef | fa6ad8d | 2017-06-26 18:29:55 +0200 | [diff] [blame] | 500 | } | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 501 |  | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 502 | /** | 
 | 503 |  * Wrapper over setupAndTestNode, to test exactly one CC model. | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 504 |  Whole workspace and model - should be pre-rendered and passed via MODELS_TARGZ | 
 | 505 |  Flow: grab all data, and pass to setupAndTestNode function | 
 | 506 |  under-modell will be directly mirrored to `model/{cfg.testReclassEnv}/* /srv/salt/reclass/*` | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 507 |  * | 
 | 508 |  * @param cfg - dict with params: | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 509 |  MODELS_TARGZ       http link to arch with (models|contexts|global_reclass) | 
 | 510 |  modelFile | 
 | 511 |  DockerCName        directly passed to setupAndTestNode | 
 | 512 |  EXTRA_FORMULAS     directly passed to setupAndTestNode | 
 | 513 |  DISTRIB_REVISION   directly passed to setupAndTestNode | 
 | 514 |  reclassVersion     directly passed to setupAndTestNode | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 515 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 516 |  Return: true\exception | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 517 |  */ | 
 | 518 |  | 
 | 519 | def testCCModel(cfg) { | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 520 |     def common = new com.mirantis.mk.Common() | 
| azvyagintsev | 1cecc09 | 2018-09-14 13:19:16 +0300 | [diff] [blame] | 521 |     common.errorMsg('You are using deprecated function!Please migrate to "testNode".' + | 
 | 522 |         'It would be removed after 2018.q4 release!Pushing forced 60s sleep..') | 
 | 523 |     sh('sleep 60') | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 524 |     sh(script: 'find . -mindepth 1 -delete || true', returnStatus: true) | 
 | 525 |     sh(script: "wget --progress=dot:mega --auth-no-challenge -O models.tar.gz ${cfg.MODELS_TARGZ}") | 
 | 526 |     // unpack data | 
 | 527 |     sh(script: "tar -xzf models.tar.gz ") | 
 | 528 |     common.infoMsg("Going to test exactly one context: ${cfg.modelFile}\n, with params: ${cfg}") | 
 | 529 |     content = readFile(file: cfg.modelFile) | 
 | 530 |     templateContext = readYaml text: content | 
 | 531 |     clusterName = templateContext.default_context.cluster_name | 
 | 532 |     clusterDomain = templateContext.default_context.cluster_domain | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 533 |  | 
| azvyagintsev | b4e0c44 | 2018-09-12 17:00:04 +0300 | [diff] [blame] | 534 |     def testResult = false | 
 | 535 |     testResult = setupAndTestNode( | 
 | 536 |         "cfg01.${clusterDomain}", | 
 | 537 |         clusterName, | 
 | 538 |         '', | 
 | 539 |         cfg.testReclassEnv, // Sync into image exactly one env | 
 | 540 |         'pkg', | 
 | 541 |         cfg.DISTRIB_REVISION, | 
 | 542 |         cfg.reclassVersion, | 
 | 543 |         0, | 
 | 544 |         false, | 
 | 545 |         false, | 
 | 546 |         '', | 
 | 547 |         '', | 
 | 548 |         cfg.DockerCName) | 
 | 549 |     if (testResult) { | 
 | 550 |         common.infoMsg("testCCModel for context: ${cfg.modelFile} model: ${cfg.testReclassEnv} finished: SUCCESS") | 
 | 551 |     } else { | 
 | 552 |         throw new RuntimeException("testCCModel for context: ${cfg.modelFile} model: ${cfg.testReclassEnv} finished: FAILURE") | 
 | 553 |     } | 
 | 554 |     return testResult | 
| azvyagintsev | 2b279d8 | 2018-08-07 17:22:54 +0200 | [diff] [blame] | 555 | } |