From a35d44a88ae512813802a3359633119418c94dda Mon Sep 17 00:00:00 2001 From: Ramon van Alteren Date: Wed, 8 Feb 2012 14:19:13 +0100 Subject: [PATCH] Moved hiturl to base class and implemented reload hiturl is generic, moved it to baseclass so we can use it everywhere. implemented reload on Jenkins object, which will reload the config from disk --- jenkinsapi/exceptions.py | 4 ++++ jenkinsapi/jenkins.py | 43 +++++++++++++++++++++++---------------- jenkinsapi/jenkinsbase.py | 43 ++++++++++++++++++++++++--------------- jenkinsapi/job.py | 11 ---------- setup.py | 3 +-- 5 files changed, 58 insertions(+), 46 deletions(-) diff --git a/jenkinsapi/exceptions.py b/jenkinsapi/exceptions.py index 1e20226..8c9f337 100644 --- a/jenkinsapi/exceptions.py +++ b/jenkinsapi/exceptions.py @@ -47,3 +47,7 @@ class NotFound(Exception): """ Resource cannot be found """ + +class NotAuthorized(Exception): + """Not Authorized to access resource""" + # Usually thrown when we get a 403 returned diff --git a/jenkinsapi/jenkins.py b/jenkinsapi/jenkins.py index 4060337..016d358 100644 --- a/jenkinsapi/jenkins.py +++ b/jenkinsapi/jenkins.py @@ -3,7 +3,7 @@ from jenkinsapi.fingerprint import Fingerprint from jenkinsapi.job import Job from jenkinsapi.view import View from jenkinsapi.node import Node -from jenkinsapi.exceptions import UnknownJob +from jenkinsapi.exceptions import UnknownJob, NotAuthorized from utils.urlopener import mkurlopener import logging import time @@ -38,7 +38,7 @@ class Jenkins(JenkinsBase): self.proxyport = proxyport self.proxyuser = proxyuser self.proxypass = proxypass - JenkinsBase.__init__( self, baseurl ) + JenkinsBase.__init__(self, baseurl) def get_proxy_auth(self): return self.proxyhost, self.proxyport, self.proxyuser, self.proxypass @@ -53,22 +53,31 @@ class Jenkins(JenkinsBase): log.debug("args: %s" % auth_args) return auth_args - def get_opener( self ): + def get_opener(self): return mkurlopener(*self.get_auth()) - def validate_fingerprint( self, id ): + def validate_fingerprint(self, id): obj_fingerprint = Fingerprint(self.baseurl, id, jenkins_obj=self) obj_fingerprint.validate() log.info("Jenkins says %s is valid" % id) + def reload(self): + '''Try and reload the configuration from disk''' + try: + self.hit_url("%(baseurl)s/reload" % self.__dict__) + except urllib2.HTTPError, e: + if e.code == 403: + raise NotAuthorized("You are not authorized to reload this server") + raise + def get_artifact_data(self, id): obj_fingerprint = Fingerprint(self.baseurl, id, jenkins_obj=self) obj_fingerprint.validate() return obj_fingerprint.get_info() - def validate_fingerprint_for_build(self, digest, filename, job, build ): - obj_fingerprint = Fingerprint( self.baseurl, digest, jenkins_obj=self ) - return obj_fingerprint.validate_for_build( filename, job, build ) + def validate_fingerprint_for_build(self, digest, filename, job, build): + obj_fingerprint = Fingerprint(self.baseurl, digest, jenkins_obj=self) + return obj_fingerprint.validate_for_build(filename, job, build) def get_jenkins_obj(self): return self @@ -78,7 +87,7 @@ class Jenkins(JenkinsBase): Fetch all the build-names on this Jenkins server. """ for info in self._data["jobs"]: - yield info["name"], Job( info["url"], info["name"], jenkins_obj=self) + yield info["name"], Job(info["url"], info["name"], jenkins_obj=self) def get_job(self, jobname): """ @@ -101,28 +110,28 @@ class Jenkins(JenkinsBase): def __str__(self): return "Jenkins server at %s" % self.baseurl - def _get_views( self ): - if not self._data.has_key( "views" ): + def _get_views(self): + if not self._data.has_key("views"): pass else: for viewdict in self._data["views"]: yield viewdict["name"], viewdict["url"] def get_view_dict(self): - return dict( self._get_views() ) + return dict(self._get_views()) - def get_view_url( self, str_view_name ): + def get_view_url(self, str_view_name): try: view_dict = self.get_view_dict() return view_dict[ str_view_name ] except KeyError: #noinspection PyUnboundLocalVariable - all_views = ", ".join( view_dict.keys() ) - raise KeyError("View %s is not known - available: %s" % ( str_view_name, all_views ) ) + all_views = ", ".join(view_dict.keys()) + raise KeyError("View %s is not known - available: %s" % (str_view_name, all_views)) - def get_view(self, str_view_name ): - view_url = self.get_view_url( str_view_name ) - view_api_url = self.python_api_url( view_url ) + def get_view(self, str_view_name): + view_url = self.get_view_url(str_view_name) + view_api_url = self.python_api_url(view_url) return View(view_api_url , str_view_name, jenkins_obj=self) def __getitem__(self, jobname): diff --git a/jenkinsapi/jenkinsbase.py b/jenkinsapi/jenkinsbase.py index 38a759d..f41f2fd 100644 --- a/jenkinsapi/jenkinsbase.py +++ b/jenkinsapi/jenkinsbase.py @@ -4,7 +4,7 @@ import pprint from jenkinsapi import config from jenkinsapi.utils.retry import retry_function -log = logging.getLogger( __name__ ) +log = logging.getLogger(__name__) class JenkinsBase(object): """ @@ -12,18 +12,18 @@ class JenkinsBase(object): """ RETRY_ATTEMPTS = 5 - def __repr__( self ): - return """<%s.%s %s>""" % ( self.__class__.__module__, - self.__class__.__name__, - str( self ) ) + def __repr__(self): + return """<%s.%s %s>""" % (self.__class__.__module__, + self.__class__.__name__, + str( self )) def print_data(self): - pprint.pprint( self._data ) + pprint.pprint(self._data) def __str__(self): raise NotImplemented - def __init__( self, baseurl, poll=True ): + def __init__(self, baseurl, poll=True): """ Initialize a jenkins connection """ @@ -40,34 +40,45 @@ class JenkinsBase(object): self._data = self._poll() def _poll(self): - url = self.python_api_url( self.baseurl ) - return retry_function( self.RETRY_ATTEMPTS , self.get_data, url ) + url = self.python_api_url(self.baseurl) + return retry_function(self.RETRY_ATTEMPTS , self.get_data, url) def get_jenkins_obj(self): """Not implemented, abstract method implemented by child classes""" raise NotImplemented("Abstract method, implemented by child classes") @classmethod - def python_api_url( cls, url ): - if url.endswith( config.JENKINS_API ): + def python_api_url(cls, url): + if url.endswith(config.JENKINS_API): return url else: - if url.endswith( r"/" ): + if url.endswith(r"/"): fmt="%s%s" else: fmt = "%s/%s" return fmt % (url, config.JENKINS_API) - def get_data( self, url ): + def get_data(self, url): """ Find out how to connect, and then grab the data. """ fn_urlopen = self.get_jenkins_obj().get_opener() try: - stream = fn_urlopen( url ) - result = eval( stream.read() ) + stream = fn_urlopen(url) + result = eval(stream.read()) except urllib2.HTTPError, e: - log.warn( "Error reading %s" % url ) + log.warn("Error reading %s" % url) log.exception(e) raise return result + + def hit_url(self, url ): + fn_urlopen = self.get_jenkins_obj().get_opener() + try: + stream = fn_urlopen( url ) + html_result = stream.read() + except urllib2.HTTPError, e: + log.debug( "Error reading %s" % url ) + log.exception(e) + raise + return html_result \ No newline at end of file diff --git a/jenkinsapi/job.py b/jenkinsapi/job.py index 9588acc..7e5d8eb 100644 --- a/jenkinsapi/job.py +++ b/jenkinsapi/job.py @@ -45,17 +45,6 @@ class Job(JenkinsBase): buildurl = urlparse.urljoin( self.baseurl, extra ) return buildurl - def hit_url(self, url ): - fn_urlopen = self.get_jenkins_obj().get_opener() - try: - stream = fn_urlopen( url ) - html_result = stream.read() - except urllib2.HTTPError, e: - log.debug( "Error reading %s" % url ) - log.exception(e) - raise - return html_result - def invoke(self, securitytoken=None, block=False, skip_if_running=False, invoke_pre_check_delay=3, invoke_block_delay=15, params={}): assert isinstance( invoke_pre_check_delay, (int, float) ) assert isinstance( invoke_block_delay, (int, float) ) diff --git a/setup.py b/setup.py index c5f22b0..74780c6 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ -from setuptools import setup, find_packages -import sys, os +from setuptools import setup from setup_config import DESCRIPTION, VERSION, PROJECT_NAME, PROJECT_AUTHORS, GLOBAL_ENTRY_POINTS, PROJECT_EMAILS, PROJECT_URL, SHORT_DESCRIPTION setup(name=PROJECT_NAME.lower(), -- 2.34.1