Moved hiturl to base class and implemented reload
authorRamon van Alteren <ramon@vanalteren.nl>
Wed, 8 Feb 2012 13:19:13 +0000 (14:19 +0100)
committerRamon van Alteren <ramon@vanalteren.nl>
Wed, 8 Feb 2012 14:13:34 +0000 (15:13 +0100)
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
jenkinsapi/jenkins.py
jenkinsapi/jenkinsbase.py
jenkinsapi/job.py
setup.py

index 1e20226ae94c74502116040154372778de83c891..8c9f337bd699836236791a0a7db0a07c50ab2e15 100644 (file)
@@ -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
index 4060337efc724a0ff4a5f7e02799ddf74729b1c0..016d358aa83faa3af671a43ed17946daa4c055a2 100644 (file)
@@ -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):
index 38a759dd604b131faf75ad40236900a3277ed5a6..f41f2fd21a4abad4f08f8ecccf080726f5d2ad97 100644 (file)
@@ -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
index 9588acc650f3b023a03f0dc9a106a6f189e2c2ad..7e5d8eb9221490e740366ad03ef6a9cf9149ddd8 100644 (file)
@@ -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) )
index c5f22b0c2c8842f0ffa186ea9f55cee13c14645c..74780c68ed2897987c9ababbf13a857ab5f0ffa6 100644 (file)
--- 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(),