From 6f48fee4bd619d1545be6247c641be2012f2b90f Mon Sep 17 00:00:00 2001 From: hyokeun Date: Mon, 22 Jan 2018 16:39:09 +0900 Subject: [PATCH] Precheck VM status before assigning jobs Change-Id: I69613384505c4b84271195e5be4b9b9f0ef9a4b1 --- common/aws_ec2.py | 2 +- groovy_init_scripts/scriptApproval.xml | 22 ++++++++++++++ job_control_ondemand_slaves.groovy | 52 ++++++++++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/common/aws_ec2.py b/common/aws_ec2.py index dff975d..7d35a4f 100644 --- a/common/aws_ec2.py +++ b/common/aws_ec2.py @@ -235,7 +235,7 @@ def create_main(args): for t in [ x for x in args.tags.split(',')] ] print 'Tags: [%s]' % tags userdata = base64.b64decode(args.userdata) - print 'UserData: [%s]' % userdata + #print 'UserData: [%s]' % userdata create_ec2_ondemand_instance(args.amiid, int(args.mincount), diff --git a/groovy_init_scripts/scriptApproval.xml b/groovy_init_scripts/scriptApproval.xml index 47ebe92..a0f2c69 100644 --- a/groovy_init_scripts/scriptApproval.xml +++ b/groovy_init_scripts/scriptApproval.xml @@ -8,6 +8,7 @@ 0bc5dcb90964741115308f13c042998b6bbfbc66 0d3674cfaee34604a98aa6375a979e4bef3077ef 1469b56a8f49513d0f8c94ab23d328e1137922ad + 1789b0d914f0084ed7fd333b0b0eea748709ada6 1a82acd5437b3c3aef5a000285178fc408c3c0c2 1ac9db42ad5c4b6b6ccd110bd83605d3554ce88b 1b6ee1e9ec250e65df3f124a6b10a9c745d06476 @@ -23,6 +24,7 @@ 2e7251e3f5b2236d842994720f6769528135312d 2ed34917927e5af323c645c90f9be85d1c44517d 32c9e3fa097fa7f0055750a44cebc64d534dc111 + 3500985ded84809f4898727b418384f553afe296 3587988807a6fe4160fc7370e4d3b46e494bb35f 3a012e0fadd095372e77b0655aa765f9409455f8 3e86b636ead9f2cf44bf40e2895ab9c6c264e6e8 @@ -51,14 +53,17 @@ 7d581316af66034919a152e9014b8b0a69657e6e 7d5ae9a876a71918f07edc15742ec5c01d9193ed 7f9dd3bb442e5ac921535b98e4170f48f06901f3 + 7fed9990e3a66c5293e9c2b02bd3590e1e231a9f 85aec29c6dd85c3a72435a1e4aaa85fef7805a22 88e6f9c2fb68fd50617a6f038da02bb2735a343f 8acf4be14ab31b3a9a9f08d448b5e7e87a973bf6 8cdb455146cce59033173a6c269bc396f9b981f9 8f55d4f32226edf90e29cdbece0c0aaa7e1636ec + 91dd560b8c31636f4cf0025bfad0abd92800d102 92318df17b760e3dd8e8446dde7a9ef7ea92a41b 931836c0b5555ab3399a5b64c68e04bc86186f9f 93b2188439cc18091839439e9650d09e3c6dca4c + 93f92899721b83cd85a647c5c281500118f881d3 94b94d0126370f5024b3d51b99b838f363afe3ee 9897016720cecc6b36292cae818d8036d7f86aa7 9a2a336769f722b4adf971a33365f364df488a77 @@ -132,20 +137,34 @@ method hudson.model.Slave getComputer method hudson.model.Slave getLauncher method hudson.plugins.sshslaves.SSHLauncher getHost + method java.io.BufferedReader readLine + method java.io.Flushable flush + method java.io.Writer write java.lang.String + method java.lang.AutoCloseable close method java.lang.Class getClassLoader method java.lang.Class newInstance method java.lang.Process waitFor method java.lang.String getBytes method java.lang.Thread join method java.lang.Thread start + method java.net.HttpURLConnection setRequestMethod java.lang.String + method java.net.URL openConnection + method java.net.URLConnection getInputStream + method java.net.URLConnection getOutputStream + method java.net.URLConnection setDoOutput boolean + method java.net.URLConnection setRequestProperty java.lang.String java.lang.String method java.util.Collection remove java.lang.Object method java.util.Dictionary get java.lang.Object method java.util.Properties load java.io.InputStream + new java.io.BufferedReader java.io.Reader new java.io.File java.lang.String new java.io.File java.lang.String java.lang.String new java.io.FileInputStream java.lang.String + new java.io.InputStreamReader java.io.InputStream + new java.io.OutputStreamWriter java.io.OutputStream new java.lang.StringBuffer new java.lang.Thread java.lang.Runnable + new java.util.Base64 new java.util.Properties staticMethod hudson.model.Hudson getInstance staticMethod java.lang.Class forName java.lang.String boolean java.lang.ClassLoader @@ -154,6 +173,7 @@ staticMethod java.lang.String format java.lang.String java.lang.Object[] staticMethod java.lang.System getProperty java.lang.String staticMethod java.lang.System getenv java.lang.String + staticMethod javax.xml.bind.DatatypeConverter printBase64Binary byte[] staticMethod jenkins.model.Jenkins getInstance staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods append java.io.File java.lang.Object staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods execute java.lang.String @@ -170,6 +190,7 @@ staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure java.lang.Object staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println java.lang.Object java.lang.Object staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods unique java.util.Collection groovy.lang.Closure + staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods write java.io.File java.lang.String staticMethod org.codehaus.groovy.runtime.EncodingGroovyMethods encodeBase64 byte[] staticMethod org.codehaus.groovy.runtime.ProcessGroovyMethods consumeProcessOutput java.lang.Process java.lang.Appendable java.lang.Appendable @@ -179,3 +200,4 @@ + diff --git a/job_control_ondemand_slaves.groovy b/job_control_ondemand_slaves.groovy index 698ea57..a5e5dbf 100644 --- a/job_control_ondemand_slaves.groovy +++ b/job_control_ondemand_slaves.groovy @@ -1,6 +1,31 @@ import hudson.model.* import jenkins.model.* import groovy.json.JsonSlurper +import java.io.BufferedReader +import java.io.InputStreamReader +import java.io.OutputStreamWriter +import java.net.URL +import java.net.URLConnection + +def sendPostRequest(urlString, paramString, username, password) { + def url = new URL(urlString) + def conn = url.openConnection() + String userpass = username + ":" + password; + String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes()); + conn.setRequestProperty ("Authorization", basicAuth); + conn.setDoOutput(true) + def writer = new OutputStreamWriter(conn.getOutputStream()) + + writer.write(paramString) + writer.flush() + String line + def reader = new BufferedReader(new InputStreamReader(conn.getInputStream())) + while ((line = reader.readLine()) != null) { + println line + } + writer.close() + reader.close() +} def execute_command(cmd, args, verbose=false, return_stdout=false) { if (!cmd.toString()?.trim()) { @@ -382,6 +407,8 @@ def create_slaves(worker_conf, num_nodes_to_create) { println ec2s + def buildEnv = build.getEnvironment(listener) + // Jenkins slave nodes only for imager... // if (worker_conf.getClass().getName() == "WorkerConf_JENKINS_IMAGER") { println "Slave attach needed: " + worker_conf.slave_attach_needed() @@ -392,12 +419,19 @@ def create_slaves(worker_conf, num_nodes_to_create) { println " Instance ID: ${v.instance_id}" println " IP Address: ${v.private_ip_address}" println " Launch Time: ${v.launch_time}" + myslot = "" + v.tags.each{ nn -> + if( nn['Key'] == 'slot' ) { + myslot = String.format("%02d", nn['Value'].toInteger()) + } + } create_slave_node( instance = Jenkins.getInstance(), name = "${worker_conf.name_prefix()} (${v.instance_id})", remoteFS = "${worker_conf.remote_fs()}", numExecutors = "${worker_conf.executors_per_slave()}", - labelString = "${worker_conf.labels()}", + //labelString = "${worker_conf.labels()} ${worker_conf.labels()}-slot-${myslot}", + labelString = "${worker_conf.labels()}-slot-${myslot}", sshHost = "${v.private_ip_address}", sshPort = "${worker_conf.ssh_port()}", sshCredentials = "${worker_conf.credential_id()}", @@ -405,6 +439,19 @@ def create_slaves(worker_conf, num_nodes_to_create) { description = "${v.launch_time}" ) instance.save() + // TODO: VM PRE CHECK + println " VM TESTER for ${myslot}" + if ( false ) { + File file = new File(buildEnv["WORKSPACE"] + "/IMAGER_VM_PRE_CHECK_SLOT_${myslot}.env") + file.write "BACKEND_SELECTION=${worker_conf.labels()}-slot-${myslot}" + } else { + def jenkins_url = buildEnv["JENKINS_URL_INTERNAL"] + def jenkins_job = buildEnv["VM_CHECKER_JOB_NAME"] + sendPostRequest("${jenkins_url}/job/${jenkins_job}/buildWithParameters", "BACKEND_SELECTION=${worker_conf.labels()}-slot-${myslot}", + buildEnv["JENKINS_USER"], buildEnv["JENKINS_PW"]) + + } + } } else { print "Skip creating slaves for " + worker_conf.getClass().getName() @@ -517,7 +564,7 @@ def worker_ondemand_create_request(worker_conf, Integer num_requested_executors) for (f = 0; f < num_nodes_to_create; f++) { println "Processing ${free_slots[f]}" worker_conf.set_slot_number(free_slots[f]) - println worker_conf.userdata() + //println worker_conf.userdata() inst_info = create_slaves(worker_conf, 1) created_inst.add(inst_info) } @@ -745,6 +792,7 @@ def __main__() { } else { println "Invalid action: " + action } + } __main__() -- 2.7.4