Refactor the Jenkins object into a class 75/12675/4
authorThanh Ha <thanh.ha@linuxfoundation.org>
Thu, 20 Sep 2018 02:24:42 +0000 (22:24 -0400)
committerThanh Ha <thanh.ha@linuxfoundation.org>
Thu, 20 Sep 2018 02:54:53 +0000 (22:54 -0400)
Make it easier for us to reuse the Jenkins instance in commands
outside of the jenkins command group.

Issue: RELENG-237
Change-Id: I2168adf9bc992b719da6c0350a446830015e6df6
Signed-off-by: Thanh Ha <thanh.ha@linuxfoundation.org>
lftools/cli/jenkins/__init__.py
lftools/cli/jenkins/builds.py
lftools/cli/jenkins/jobs.py
lftools/cli/jenkins/nodes.py
lftools/cli/jenkins/plugins.py
lftools/cli/jenkins/token.py
lftools/jenkins/__init__.py
releasenotes/notes/jenkins-class-refactor-91250f2bba941c26.yaml [new file with mode: 0644]

index de6f555..681d1f1 100644 (file)
@@ -15,8 +15,6 @@ __author__ = 'Trevor Bramwell'
 import logging
 
 import click
-import jenkins as jenkins_python  # Don't confuse this with the function ...
-from six.moves import configparser
 from six.moves.urllib.error import HTTPError
 
 from lftools.cli.jenkins.builds import builds
@@ -24,7 +22,7 @@ from lftools.cli.jenkins.jobs import jobs
 from lftools.cli.jenkins.nodes import nodes
 from lftools.cli.jenkins.plugins import plugins_init
 from lftools.cli.jenkins.token import token
-from lftools.jenkins import JJB_INI
+from lftools.jenkins import Jenkins
 
 log = logging.getLogger(__name__)
 
@@ -39,25 +37,8 @@ log = logging.getLogger(__name__)
 @click.pass_context
 def jenkins_cli(ctx, server, user, password):
     """Query information about the Jenkins Server."""
-    if '://' not in server:
-        if JJB_INI:
-            log.debug('Using config from {}'.format(JJB_INI))
-            config = configparser.ConfigParser()
-            config.read(JJB_INI)
-            user = config.get(server, 'user')
-            password = config.get(server, 'password')
-            server = config.get(server, 'url')
-        else:
-            log.debug('jenkins_jobs.ini not found in any of the default paths.')
-            server = 'https://localhost:8080'
-
     # Initial the Jenkins object and pass it to sub-commands
-    ctx.obj['server'] = jenkins_python.Jenkins(
-        server,
-        username=user,
-        password=password)
-
-    ctx.obj['jenkins_url'] = server
+    ctx.obj['jenkins'] = Jenkins(server, user, password)
 
 
 @click.command()
@@ -94,8 +75,8 @@ def groovy(ctx, groovy_file):
     with open(groovy_file, 'r') as f:
         data = f.read()
 
-    server = ctx.obj['server']
-    result = server.run_script(data)
+    jenkins = ctx.obj['jenkins']
+    result = jenkins.server.run_script(data)
     log.info(result)
 
 
@@ -104,11 +85,12 @@ def groovy(ctx, groovy_file):
 @click.pass_context
 def quiet_down(ctx, n):
     """Put Jenkins into 'Quiet Down' mode."""
-    version = ctx.obj['server'].get_version()
+    jenkins = ctx.obj['jenkins']
+    version = jenkins.server.get_version()
     # Ask permission first
     if n:
         try:
-            ctx.obj['server'].quiet_down()
+            jenkins.server.quiet_down()
         except HTTPError as m:
             if m.code == 405:
                 log.error("\n[%s]\nJenkins %s does not support Quiet Down "
@@ -125,7 +107,7 @@ def quiet_down(ctx, n):
 @click.pass_context
 def remove_offline_nodes(ctx, force):
     """Remove any offline nodes."""
-    server = ctx.obj['server']
+    jenkins = ctx.obj['jenkin']
     groovy_script = """
 import hudson.model.*
 
@@ -179,9 +161,9 @@ for (node in Jenkins.instance.computers) {
 """
 
     if force:
-        result = server.run_script(force_script)
+        result = jenkins.server.run_script(force_script)
     else:
-        result = server.run_script(groovy_script)
+        result = jenkins.server.run_script(groovy_script)
     log.info(result)
 
 
index 8d68ef1..fd4a9c2 100644 (file)
@@ -25,7 +25,8 @@ def builds(ctx):
 @click.pass_context
 def running(ctx):
     """Show all the currently running builds."""
-    running_builds = ctx.obj['server'].get_running_builds()
+    jenkins = ctx.obj['jenkins']
+    running_builds = jenkins.server.get_running_builds()
 
     for build in running_builds:
         print("- %s on %s" % (build['name'], build['node']))
@@ -35,7 +36,8 @@ def running(ctx):
 @click.pass_context
 def queued(ctx):
     """Show all jobs waiting in the queue and their status."""
-    queue = ctx.obj['server'].get_queue_info()
+    jenkins = ctx.obj['jenkins']
+    queue = jenkins.server.get_queue_info()
 
     queue_length = len(queue)
     print("Build Queue (%s)" % queue_length)
index c4107a4..b6df033 100644 (file)
@@ -47,9 +47,9 @@ def jobs(ctx):
 @click.pass_context
 def enable(ctx, regex):
     """Enable all Jenkins jobs matching REGEX."""
-    server = ctx.obj['server']
+    jenkins = ctx.obj['jenkins']
 
-    result = server.run_script(enable_disable_jobs.format(regex, "enable"))
+    result = jenkins.server.run_script(enable_disable_jobs.format(regex, "enable"))
     print(result)
 
 
@@ -58,9 +58,9 @@ def enable(ctx, regex):
 @click.pass_context
 def disable(ctx, regex):
     """Disable all Jenkins jobs matching REGEX."""
-    server = ctx.obj['server']
+    jenkins = ctx.obj['jenkins']
 
-    result = server.run_script(enable_disable_jobs.format(regex, "disable"))
+    result = jenkins.server.run_script(enable_disable_jobs.format(regex, "disable"))
     print(result)
 
 
index 5569b74..7487b0b 100644 (file)
@@ -25,7 +25,8 @@ def offline_str(status):
 @click.pass_context
 def nodes(ctx):
     """Find information about builders connected to Jenkins Master."""
-    ctx.obj['nodes'] = ctx.obj['server'].get_nodes()
+    jenkins = ctx.obj['jenkins']
+    ctx.obj['nodes'] = jenkins.server.get_nodes()
 
 
 @click.command()
index 53b229b..efeb41b 100644 (file)
@@ -30,7 +30,8 @@ def print_plugin(plugin, namefield='longName'):
 @click.pass_context
 def plugins_init(ctx):
     """Inspect Jenkins plugins on the server."""
-    ctx.obj['plugins'] = ctx.obj['server'].get_plugins()
+    jenkins = ctx.obj['jenkins']
+    ctx.obj['plugins'] = jenkins.server.get_plugins()
 
 
 @click.command()
index 73890a4..47bb820 100644 (file)
@@ -35,7 +35,8 @@ def token(ctx):
 @click.pass_context
 def change(ctx):
     """Generate a new API token."""
-    log.info(get_token(ctx.obj['jenkins_url'], change=True))
+    jenkins = ctx.obj['jenkins']
+    log.info(get_token(jenkins.url, change=True))
 
 
 @click.command()
@@ -67,7 +68,8 @@ def init(name, url):
 @click.pass_context
 def print_token(ctx):
     """Print current API token."""
-    log.info(get_token(ctx.obj['jenkins_url']))
+    jenkins = ctx.obj['jenkins']
+    log.info(get_token(jenkins.url))
 
 
 @click.command()
index 67d95f3..6ce420d 100644 (file)
@@ -14,6 +14,9 @@ __author__ = 'Thanh Ha'
 import logging
 import os
 
+import jenkins
+from six.moves import configparser
+
 log = logging.getLogger(__name__)
 
 
@@ -41,3 +44,28 @@ def jjb_ini():
 
 
 JJB_INI = jjb_ini()
+
+
+class Jenkins():
+    """lftools Jenkins object."""
+
+    def __init__(self, server, user=None, password=None):
+        """Initialize a Jenkins object."""
+        if '://' not in server:
+            if JJB_INI:
+                log.debug('Using config from {}'.format(JJB_INI))
+                config = configparser.ConfigParser()
+                config.read(JJB_INI)
+                user = config.get(server, 'user')
+                password = config.get(server, 'password')
+                server = config.get(server, 'url')
+            else:
+                log.debug('jenkins_jobs.ini not found in any of the default paths.')
+                server = 'https://localhost:8080'
+
+        self.server = jenkins.Jenkins(
+            server,
+            username=user,
+            password=password)
+
+        self.url = server
diff --git a/releasenotes/notes/jenkins-class-refactor-91250f2bba941c26.yaml b/releasenotes/notes/jenkins-class-refactor-91250f2bba941c26.yaml
new file mode 100644 (file)
index 0000000..ff0c1d6
--- /dev/null
@@ -0,0 +1,5 @@
+---
+other:
+  - |
+    Refactored the Jenkins object into a class to allow us to reuse it outside
+    of the Jenkins command group.