Precheck VM status before assigning jobs 11/167811/3
authorhyokeun <hyokeun.jeon@samsung.com>
Mon, 22 Jan 2018 07:39:09 +0000 (16:39 +0900)
committerhyokeun <hyokeun.jeon@samsung.com>
Wed, 24 Jan 2018 01:14:24 +0000 (10:14 +0900)
Change-Id: I69613384505c4b84271195e5be4b9b9f0ef9a4b1

common/aws_ec2.py
groovy_init_scripts/scriptApproval.xml
job_control_ondemand_slaves.groovy

index dff975d..7d35a4f 100644 (file)
@@ -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),
index 47ebe92..a0f2c69 100644 (file)
@@ -8,6 +8,7 @@
     <string>0bc5dcb90964741115308f13c042998b6bbfbc66</string>
     <string>0d3674cfaee34604a98aa6375a979e4bef3077ef</string>
     <string>1469b56a8f49513d0f8c94ab23d328e1137922ad</string>
+    <string>1789b0d914f0084ed7fd333b0b0eea748709ada6</string>
     <string>1a82acd5437b3c3aef5a000285178fc408c3c0c2</string>
     <string>1ac9db42ad5c4b6b6ccd110bd83605d3554ce88b</string>
     <string>1b6ee1e9ec250e65df3f124a6b10a9c745d06476</string>
@@ -23,6 +24,7 @@
     <string>2e7251e3f5b2236d842994720f6769528135312d</string>
     <string>2ed34917927e5af323c645c90f9be85d1c44517d</string>
     <string>32c9e3fa097fa7f0055750a44cebc64d534dc111</string>
+    <string>3500985ded84809f4898727b418384f553afe296</string>
     <string>3587988807a6fe4160fc7370e4d3b46e494bb35f</string>
     <string>3a012e0fadd095372e77b0655aa765f9409455f8</string>
     <string>3e86b636ead9f2cf44bf40e2895ab9c6c264e6e8</string>
     <string>7d581316af66034919a152e9014b8b0a69657e6e</string>
     <string>7d5ae9a876a71918f07edc15742ec5c01d9193ed</string>
     <string>7f9dd3bb442e5ac921535b98e4170f48f06901f3</string>
+    <string>7fed9990e3a66c5293e9c2b02bd3590e1e231a9f</string>
     <string>85aec29c6dd85c3a72435a1e4aaa85fef7805a22</string>
     <string>88e6f9c2fb68fd50617a6f038da02bb2735a343f</string>
     <string>8acf4be14ab31b3a9a9f08d448b5e7e87a973bf6</string>
     <string>8cdb455146cce59033173a6c269bc396f9b981f9</string>
     <string>8f55d4f32226edf90e29cdbece0c0aaa7e1636ec</string>
+    <string>91dd560b8c31636f4cf0025bfad0abd92800d102</string>
     <string>92318df17b760e3dd8e8446dde7a9ef7ea92a41b</string>
     <string>931836c0b5555ab3399a5b64c68e04bc86186f9f</string>
     <string>93b2188439cc18091839439e9650d09e3c6dca4c</string>
+    <string>93f92899721b83cd85a647c5c281500118f881d3</string>
     <string>94b94d0126370f5024b3d51b99b838f363afe3ee</string>
     <string>9897016720cecc6b36292cae818d8036d7f86aa7</string>
     <string>9a2a336769f722b4adf971a33365f364df488a77</string>
     <string>method hudson.model.Slave getComputer</string>
     <string>method hudson.model.Slave getLauncher</string>
     <string>method hudson.plugins.sshslaves.SSHLauncher getHost</string>
+    <string>method java.io.BufferedReader readLine</string>
+    <string>method java.io.Flushable flush</string>
+    <string>method java.io.Writer write java.lang.String</string>
+    <string>method java.lang.AutoCloseable close</string>
     <string>method java.lang.Class getClassLoader</string>
     <string>method java.lang.Class newInstance</string>
     <string>method java.lang.Process waitFor</string>
     <string>method java.lang.String getBytes</string>
     <string>method java.lang.Thread join</string>
     <string>method java.lang.Thread start</string>
+    <string>method java.net.HttpURLConnection setRequestMethod java.lang.String</string>
+    <string>method java.net.URL openConnection</string>
+    <string>method java.net.URLConnection getInputStream</string>
+    <string>method java.net.URLConnection getOutputStream</string>
+    <string>method java.net.URLConnection setDoOutput boolean</string>
+    <string>method java.net.URLConnection setRequestProperty java.lang.String java.lang.String</string>
     <string>method java.util.Collection remove java.lang.Object</string>
     <string>method java.util.Dictionary get java.lang.Object</string>
     <string>method java.util.Properties load java.io.InputStream</string>
+    <string>new java.io.BufferedReader java.io.Reader</string>
     <string>new java.io.File java.lang.String</string>
     <string>new java.io.File java.lang.String java.lang.String</string>
     <string>new java.io.FileInputStream java.lang.String</string>
+    <string>new java.io.InputStreamReader java.io.InputStream</string>
+    <string>new java.io.OutputStreamWriter java.io.OutputStream</string>
     <string>new java.lang.StringBuffer</string>
     <string>new java.lang.Thread java.lang.Runnable</string>
+    <string>new java.util.Base64</string>
     <string>new java.util.Properties</string>
     <string>staticMethod hudson.model.Hudson getInstance</string>
     <string>staticMethod java.lang.Class forName java.lang.String boolean java.lang.ClassLoader</string>
     <string>staticMethod java.lang.String format java.lang.String java.lang.Object[]</string>
     <string>staticMethod java.lang.System getProperty java.lang.String</string>
     <string>staticMethod java.lang.System getenv java.lang.String</string>
+    <string>staticMethod javax.xml.bind.DatatypeConverter printBase64Binary byte[]</string>
     <string>staticMethod jenkins.model.Jenkins getInstance</string>
     <string>staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods append java.io.File java.lang.Object</string>
     <string>staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods execute java.lang.String</string>
     <string>staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure java.lang.Object</string>
     <string>staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println java.lang.Object java.lang.Object</string>
     <string>staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods unique java.util.Collection groovy.lang.Closure</string>
+    <string>staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods write java.io.File java.lang.String</string>
     <string>staticMethod org.codehaus.groovy.runtime.EncodingGroovyMethods encodeBase64 byte[]</string>
     <string>staticMethod org.codehaus.groovy.runtime.ProcessGroovyMethods consumeProcessOutput java.lang.Process java.lang.Appendable java.lang.Appendable</string>
   </approvedSignatures>
   <pendingSignatures/>
   <pendingClasspathEntries/>
 </scriptApproval>
+
index 698ea57..a5e5dbf 100644 (file)
@@ -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__()