| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 1 | common = new com.mirantis.mk.Common() | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 2 | gerrit = new com.mirantis.mk.Gerrit() | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 3 | git = new com.mirantis.mk.Git() | 
 | 4 | python = new com.mirantis.mk.Python() | 
 | 5 | saltModelTesting = new com.mirantis.mk.SaltModelTesting() | 
 | 6 |  | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 7 | def generateSaltMaster(modEnv, clusterDomain, clusterName) { | 
 | 8 |     def nodeFile = "${modEnv}/nodes/cfg01.${clusterDomain}.yml" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 9 |     def nodeString = """classes: | 
 | 10 | - cluster.${clusterName}.infra.config | 
 | 11 | parameters: | 
 | 12 |     _param: | 
 | 13 |         linux_system_codename: xenial | 
 | 14 |         reclass_data_revision: master | 
 | 15 |     linux: | 
 | 16 |         system: | 
 | 17 |             name: cfg01 | 
 | 18 |             domain: ${clusterDomain} | 
 | 19 | """ | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 20 |     sh "mkdir -p ${modEnv}/nodes/" | 
 | 21 |     println "Create file ${nodeFile}" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 22 |     writeFile(file: nodeFile, text: nodeString) | 
 | 23 | } | 
 | 24 |  | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 25 | def generateModel(modelFile, cutterEnv) { | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 26 |     def templateEnv = "${env.WORKSPACE}" | 
 | 27 |     def modelEnv = "${env.WORKSPACE}/model" | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 28 |     def basename = sh(script: "basename ${modelFile} .yml", returnStdout: true).trim() | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 29 |     def generatedModel = "${modelEnv}/${basename}" | 
 | 30 |     def testEnv = "${env.WORKSPACE}/test" | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 31 |     def content = readFile(file: "${templateEnv}/contexts/${modelFile}") | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 32 |     def templateContext = readYaml text: content | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 33 |     def clusterDomain = templateContext.default_context.cluster_domain | 
 | 34 |     def clusterName = templateContext.default_context.cluster_name | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 35 |     def outputDestination = "${generatedModel}/classes/cluster/${clusterName}" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 36 |     def targetBranch = "feature/${clusterName}" | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 37 |     def templateBaseDir = "${env.WORKSPACE}" | 
 | 38 |     def templateDir = "${templateEnv}/dir" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 39 |     def templateOutputDir = templateBaseDir | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 40 |     sh "rm -rf ${generatedModel} || true" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 41 |  | 
| chnyda | e79b94e | 2017-07-10 09:46:25 +0200 | [diff] [blame] | 42 |     println "Generating model from context ${modelFile}" | 
 | 43 |  | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 44 |     def productList = ["infra", "cicd", "opencontrail", "kubernetes", "openstack", "stacklight"] | 
 | 45 |     for (product in productList) { | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 46 |         if (product == "infra" || (templateContext.default_context["${product}_enabled"] | 
 | 47 |             && templateContext.default_context["${product}_enabled"].toBoolean())) { | 
 | 48 |             templateDir = "${templateEnv}/cluster_product/${product}" | 
 | 49 |             templateOutputDir = "${env.WORKSPACE}/output/${product}" | 
 | 50 |             sh "rm -rf ${templateOutputDir} || true" | 
 | 51 |             sh "mkdir -p ${templateOutputDir}" | 
 | 52 |             sh "mkdir -p ${outputDestination}" | 
 | 53 |             python.buildCookiecutterTemplate(templateDir, content, templateOutputDir, cutterEnv, templateBaseDir) | 
 | 54 |             sh "mv -v ${templateOutputDir}/${clusterName}/* ${outputDestination}" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 55 |         } | 
 | 56 |     } | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 57 |     generateSaltMaster(generatedModel, clusterDomain, clusterName) | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 58 | } | 
 | 59 |  | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 60 | def testModel(modelFile, testEnv) { | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 61 |     def templateEnv = "${env.WORKSPACE}" | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 62 |     def content = readFile(file: "${templateEnv}/contexts/${modelFile}.yml") | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 63 |     def templateContext = readYaml text: content | 
 | 64 |     def clusterDomain = templateContext.default_context.cluster_domain | 
 | 65 |     git.checkoutGitRepository("${testEnv}/classes/system", RECLASS_MODEL_URL, RECLASS_MODEL_BRANCH, CREDENTIALS_ID) | 
| chnyda | dac9dfd | 2017-06-14 10:57:17 +0200 | [diff] [blame] | 66 |     saltModelTesting.setupAndTestNode("cfg01.${clusterDomain}", EXTRA_FORMULAS, testEnv) | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 67 | } | 
 | 68 |  | 
 | 69 | def gerritRef | 
 | 70 | try { | 
 | 71 |   gerritRef = GERRIT_REFSPEC | 
 | 72 | } catch (MissingPropertyException e) { | 
 | 73 |   gerritRef = null | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 74 | } | 
 | 75 |  | 
 | 76 | timestamps { | 
 | 77 |     node("python&&docker") { | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 78 |         def templateEnv = "${env.WORKSPACE}" | 
 | 79 |         def cutterEnv = "${env.WORKSPACE}/cutter" | 
 | 80 |         def jinjaEnv = "${env.WORKSPACE}/jinja" | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 81 |  | 
 | 82 |         try { | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 83 |             stage("Cleanup") { | 
 | 84 |                 sh("rm -rf * || true") | 
 | 85 |             } | 
 | 86 |  | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 87 |             stage ('Download Cookiecutter template') { | 
 | 88 |                 if (gerritRef) { | 
 | 89 |                     def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID) | 
 | 90 |                     merged = gerritChange.status == "MERGED" | 
 | 91 |                     if(!merged){ | 
 | 92 |                         checkouted = gerrit.gerritPatchsetCheckout ([ | 
 | 93 |                             credentialsId : CREDENTIALS_ID | 
 | 94 |                         ]) | 
 | 95 |                     } else{ | 
 | 96 |                         common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to gate them") | 
 | 97 |                     } | 
 | 98 |                 } else { | 
| chnyda | 0381bc5 | 2017-05-31 11:19:15 +0200 | [diff] [blame] | 99 |                     git.checkoutGitRepository(templateEnv, COOKIECUTTER_TEMPLATE_URL, COOKIECUTTER_TEMPLATE_BRANCH, CREDENTIALS_ID) | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 100 |                 } | 
 | 101 |             } | 
 | 102 |  | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 103 |             stage("Setup") { | 
 | 104 |                 python.setupCookiecutterVirtualenv(cutterEnv) | 
 | 105 |             } | 
 | 106 |  | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 107 |             def contextFiles | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 108 |             dir("${templateEnv}/contexts") { | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 109 |                 contextFiles = findFiles(glob: "*.yml") | 
 | 110 |             } | 
 | 111 |  | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 112 |             def contextFileList = [] | 
 | 113 |             for (int i = 0; i < contextFiles.size(); i++) { | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 114 |                 contextFileList << contextFiles[i] | 
 | 115 |             } | 
 | 116 |  | 
 | 117 |             stage("generate-model") { | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 118 |                 for (contextFile in contextFileList) { | 
| chnyda | 467f10f | 2017-05-30 17:25:07 +0200 | [diff] [blame] | 119 |                     generateModel(contextFile, cutterEnv) | 
| chnyda | bc63c9a | 2017-05-30 15:37:54 +0200 | [diff] [blame] | 120 |                 } | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 121 |             } | 
 | 122 |  | 
| chnyda | 30e04c4 | 2017-06-01 10:24:36 +0200 | [diff] [blame] | 123 |             stage("test-nodes") { | 
 | 124 |                 def partitions = common.partitionList(contextFileList, PARALLEL_NODE_GROUP_SIZE.toInteger()) | 
 | 125 |                 def buildSteps = [:] | 
 | 126 |                 for (int i = 0; i < partitions.size(); i++) { | 
 | 127 |                     def partition = partitions[i] | 
 | 128 |                     buildSteps.put("partition-${i}", new HashMap<String,org.jenkinsci.plugins.workflow.cps.CpsClosure2>()) | 
 | 129 |                     for(int k = 0; k < partition.size; k++){ | 
 | 130 |                         def basename = sh(script: "basename ${partition[k]} .yml", returnStdout: true).trim() | 
 | 131 |                         def testEnv = "${env.WORKSPACE}/model/${basename}" | 
 | 132 |                         buildSteps.get("partition-${i}").put(basename, { testModel(basename, testEnv) }) | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 133 |                     } | 
 | 134 |                 } | 
| chnyda | 30e04c4 | 2017-06-01 10:24:36 +0200 | [diff] [blame] | 135 |                 common.serial(buildSteps) | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 136 |             } | 
 | 137 |  | 
 | 138 |         } catch (Throwable e) { | 
 | 139 |              currentBuild.result = "FAILURE" | 
 | 140 |              throw e | 
 | 141 |         } finally { | 
 | 142 |             stage ('Clean workspace directories') { | 
| chnyda | 0381bc5 | 2017-05-31 11:19:15 +0200 | [diff] [blame] | 143 |                 sh(returnStatus: true, script: "rm -rfv * > /dev/null || true") | 
| chnyda | e80bb92 | 2017-05-29 17:48:40 +0200 | [diff] [blame] | 144 |             } | 
 | 145 |             common.sendNotification(currentBuild.result,"",["slack"]) | 
 | 146 |         } | 
 | 147 |     } | 
 | 148 | } |