From: Thanh Ha Date: Thu, 20 Sep 2018 02:24:42 +0000 (-0400) Subject: Refactor the Jenkins object into a class X-Git-Tag: v0.18.0~4 X-Git-Url: https://gerrit.linuxfoundation.org/infra/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F75%2F12675%2F4;p=releng%2Flftools.git Refactor the Jenkins object into a class 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 --- diff --git a/lftools/cli/jenkins/__init__.py b/lftools/cli/jenkins/__init__.py index de6f5559..681d1f1d 100644 --- a/lftools/cli/jenkins/__init__.py +++ b/lftools/cli/jenkins/__init__.py @@ -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) diff --git a/lftools/cli/jenkins/builds.py b/lftools/cli/jenkins/builds.py index 8d68ef1b..fd4a9c20 100644 --- a/lftools/cli/jenkins/builds.py +++ b/lftools/cli/jenkins/builds.py @@ -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) diff --git a/lftools/cli/jenkins/jobs.py b/lftools/cli/jenkins/jobs.py index c4107a4c..b6df0335 100644 --- a/lftools/cli/jenkins/jobs.py +++ b/lftools/cli/jenkins/jobs.py @@ -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) diff --git a/lftools/cli/jenkins/nodes.py b/lftools/cli/jenkins/nodes.py index 5569b74e..7487b0b4 100644 --- a/lftools/cli/jenkins/nodes.py +++ b/lftools/cli/jenkins/nodes.py @@ -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() diff --git a/lftools/cli/jenkins/plugins.py b/lftools/cli/jenkins/plugins.py index 53b229b4..efeb41be 100644 --- a/lftools/cli/jenkins/plugins.py +++ b/lftools/cli/jenkins/plugins.py @@ -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() diff --git a/lftools/cli/jenkins/token.py b/lftools/cli/jenkins/token.py index 73890a46..47bb8203 100644 --- a/lftools/cli/jenkins/token.py +++ b/lftools/cli/jenkins/token.py @@ -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() diff --git a/lftools/jenkins/__init__.py b/lftools/jenkins/__init__.py index 67d95f3f..6ce420df 100644 --- a/lftools/jenkins/__init__.py +++ b/lftools/jenkins/__init__.py @@ -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 index 00000000..ff0c1d6e --- /dev/null +++ b/releasenotes/notes/jenkins-class-refactor-91250f2bba941c26.yaml @@ -0,0 +1,5 @@ +--- +other: + - | + Refactored the Jenkins object into a class to allow us to reuse it outside + of the Jenkins command group.