Add remove-offline-nodes command 54/11554/2
authorThanh Ha <thanh.ha@linuxfoundation.org>
Tue, 26 Jun 2018 00:58:59 +0000 (20:58 -0400)
committerThanh Ha <thanh.ha@linuxfoundation.org>
Mon, 9 Jul 2018 16:28:59 +0000 (12:28 -0400)
Migrates the 2 scripts for removing offline nodes from global-jjb
jenkins-admin into lftools.

https://github.com/lfit/releng-global-jjb/blob/v0.21.4/jenkins-admin/del_computer.groovy
https://github.com/lfit/releng-global-jjb/blob/v0.21.4/jenkins-admin/slay_computer.groovy

Change-Id: Ifb96689274d91d2655fe3fe1122856c82a3edaf2
Signed-off-by: Thanh Ha <thanh.ha@linuxfoundation.org>
lftools/cli/jenkins/__init__.py

index 83ef71d..6da1e45 100644 (file)
@@ -94,9 +94,77 @@ def quiet_down(ctx, n):
                 raise m
 
 
+@click.command()
+@click.option(
+    '--force', is_flag=True, default=False,
+    help='Forcibly remove nodes, use only if the non-force version fails.')
+@click.pass_context
+def remove_offline_nodes(ctx, force):
+    """Remove any offline nodes."""
+    server = ctx.obj['server']
+    groovy_script = """
+import hudson.model.*
+
+def numberOfflineNodes = 0
+def numberNodes = 0
+
+slaveNodes = hudson.model.Hudson.instance
+
+for (slave in slaveNodes.nodes) {
+    def node = slave.computer
+    numberNodes ++
+    println ""
+    println "Checking node ${node.name}:"
+    println '\tcomputer.isOffline: ${slave.getComputer().isOffline()}'
+    println '\tcomputer.offline: ${node.offline}'
+
+    if (node.offline) {
+        numberOfflineNodes ++
+        println '\tRemoving node ${node.name}'
+        slaveNodes.removeNode(slave)
+    }
+}
+
+println "Number of Offline Nodes: " + numberOfflineNodes
+println "Number of Nodes: " + numberNodes
+"""
+
+    force_script = """
+import jenkins.*
+import jenkins.model.*
+import hudson.*
+import hudson.model.*
+
+for (node in Jenkins.instance.computers) {
+    try {
+        println "Checking node: ${node.name}"
+        println "\tdisplay-name: ${node.properties.displayName}"
+        println "\toffline: ${node.properties.offline}"
+        println "\ttemporarily-offline: ${node.properties.temporarilyOffline}"
+        if (node.properties.offline) {
+            println "Removing bad node: ${node.name}"
+            Jenkins.instance.removeComputer(node)
+        }
+        println ""
+    }
+    catch (NullPointerException nullPointer) {
+        println "NullPointerException caught"
+        println ""
+    }
+}
+"""
+
+    if force:
+        result = server.run_script(force_script)
+    else:
+        result = server.run_script(groovy_script)
+    print(result)
+
+
 jenkins_cli.add_command(plugins_init, name='plugins')
 jenkins_cli.add_command(nodes)
 jenkins_cli.add_command(builds)
 jenkins_cli.add_command(get_credentials, name='get-credentials')
 jenkins_cli.add_command(groovy)
 jenkins_cli.add_command(quiet_down, name='quiet-down')
+jenkins_cli.add_command(remove_offline_nodes, name='remove-offline-nodes')