Fixing json import, we have simplejson installed in python-2.5
authorRamon van Alteren <ramon@vanalteren.nl>
Wed, 4 Jan 2012 17:19:14 +0000 (18:19 +0100)
committerRamon van Alteren <ramon@vanalteren.nl>
Wed, 4 Jan 2012 17:19:14 +0000 (18:19 +0100)
pyjenkinsci/jenkins.py

index 1b9ccf82b2aa7e601dbbb3a0c54850acbdb0e358..04f2d65688ad3cb80a8f79993cad3a9cb018e180 100644 (file)
-from pyjenkinsci.jenkinsbase import JenkinsBase\r
-from pyjenkinsci.fingerprint import Fingerprint\r
-from pyjenkinsci.job import Job\r
-from pyjenkinsci.view import View\r
-from pyjenkinsci.node import Node\r
-from pyjenkinsci.exceptions import UnknownJob\r
-from utils.urlopener import mkurlopener\r
-import logging\r
-import time\r
-import urllib2\r
-import urllib\r
-import json\r
-\r
-log = logging.getLogger(__name__)\r
-\r
-class Jenkins(JenkinsBase):\r
-    """\r
-    Represents a jenkins environment.\r
-    """\r
-    def __init__(self, baseurl, username=None, password=None, proxyhost=None, proxyport=None, proxyuser=None, proxypass=None):\r
-        """\r
-\r
-        :param baseurl: baseurl for jenkins instance including port, str\r
-        :param username: username for jenkins auth, str\r
-        :param password: password for jenkins auth, str\r
-        :param proxyhost: proxyhostname, str\r
-        :param proxyport: proxyport, int\r
-        :param proxyuser: proxyusername for proxy auth, str\r
-        :param proxypass: proxypassword for proxyauth, str\r
-        :return: a Jenkins obj\r
-        """\r
-        self.username = username\r
-        self.password = password\r
-        self.proxyhost = proxyhost\r
-        self.proxyport = proxyport\r
-        self.proxyuser = proxyuser\r
-        self.proxypass = proxypass\r
-        JenkinsBase.__init__( self, baseurl )\r
-\r
-    def get_proxy_auth(self):\r
-        return self.proxyhost, self.proxyport, self.proxyuser, self.proxypass\r
-\r
-    def get_jenkins_auth(self):\r
-        return self.username, self.password, self.baseurl\r
-\r
-    def get_auth(self):\r
-        auth_args = []\r
-        auth_args.extend(self.get_jenkins_auth())\r
-        auth_args.extend(self.get_proxy_auth())\r
-        log.debug("args: %s" % auth_args)\r
-        return auth_args\r
-\r
-\r
-    def get_opener( self ):\r
-        return mkurlopener(*self.get_auth())\r
-\r
-    def validate_fingerprint( self, id ):\r
-        obj_fingerprint = Fingerprint(self.baseurl, id, jenkins_obj=self)\r
-        obj_fingerprint.validate()\r
-        log.info("Jenkins says %s is valid" % id)\r
-\r
-    def get_artifact_data(self, id):\r
-        obj_fingerprint = Fingerprint(self.baseurl, id, jenkins_obj=self)\r
-        obj_fingerprint.validate()\r
-        return obj_fingerprint.get_info()\r
-\r
-    def validate_fingerprint_for_build(self, digest, filename, job, build ):\r
-        obj_fingerprint = Fingerprint( self.baseurl, digest, jenkins_obj=self )\r
-        return obj_fingerprint.validate_for_build( filename, job, build )\r
-\r
-    def get_jenkins_obj(self):\r
-        return self\r
-\r
-    def get_jobs(self):\r
-        """\r
-        Fetch all the build-names on this Hudson server.\r
-        """\r
-        for info in self._data["jobs"]:\r
-            yield info["name"], Job( info["url"], info["name"], jenkins_obj=self)\r
-\r
-    def iteritems(self):\r
-        return self.get_jobs()\r
-\r
-    def iterkeys(self):\r
-        for info in self._data["jobs"]:\r
-            yield info["name"]\r
-\r
-    def keys(self):\r
-        return [ a for a in self.iterkeys() ]\r
-\r
-    def __str__(self):\r
-        return "Jenkins server at %s" % self.baseurl\r
-\r
-    def _get_views( self ):\r
-        if not self._data.has_key( "views" ):\r
-            pass\r
-        else:\r
-            for viewdict in self._data["views"]:\r
-                yield viewdict["name"], viewdict["url"]\r
-\r
-    def get_view_dict(self):\r
-        return dict( self._get_views() )\r
-\r
-    def get_view_url( self, str_view_name ):\r
-        try:\r
-            view_dict = self.get_view_dict()\r
-            return view_dict[ str_view_name ]\r
-        except KeyError, ke:\r
-            all_views = ", ".join( view_dict.keys() )\r
-            raise KeyError("View %s is not known - available: %s" % ( str_view_name, all_views ) )\r
-\r
-    def get_view(self, str_view_name ):\r
-        view_url = self.get_view_url( str_view_name )\r
-        view_api_url = self.python_api_url( view_url )\r
-        return View(view_api_url , str_view_name, jenkins_obj=self)\r
-\r
-    def __getitem__( self, buildname ):\r
-        """\r
-        Get a build\r
-        """\r
-        for name, job in self.get_jobs():\r
-            if name == buildname:\r
-                return job\r
-        raise UnknownJob(buildname)\r
-\r
-    def get_node_dict(self):\r
-        """Get registered slave nodes on this instance"""\r
-        url = self.python_api_url(self.get_node_url())\r
-        node_dict = dict(self.get_data(url))\r
-        return dict(\r
-            (node['displayName'], self.python_api_url(self.get_node_url(node['displayName'])))\r
-                for node in node_dict['computer'])\r
-\r
-    def get_node(self, nodename):\r
-        """Get a node object for a specific node"""\r
-        node_url = self.python_api_url(self.get_node_url(nodename))\r
-        return Node(node_url, nodename, jenkins_obj=self)\r
-\r
-    def get_node_url(self, nodename=""):\r
-        """Return the url for nodes"""\r
-        url = "%(baseurl)s/computer/%(nodename)s" % {'baseurl': self.baseurl, 'nodename': nodename}\r
-        return url\r
-\r
-    def has_node(self, nodename):\r
-        """\r
-        Does a node by the name specified exist\r
-        :param nodename: string, hostname\r
-        :return: boolean\r
-        """\r
-        return nodename in self.get_node_dict()\r
-\r
-    def delete_node(self, nodename):\r
-        """\r
-        Remove a node from the managed slave list\r
-        Please note that you cannot remove the master node\r
-\r
-        :param nodename: string holding a hostname\r
-        :return: None\r
-        """\r
-        assert self.has_node(nodename), "This node: %s is not registered as a slave" % nodename\r
-        assert nodename != "master", "you cannot delete the master node"\r
-        url = "%s/doDelete" % self.get_node_url(nodename)\r
-        fn_urlopen = self.get_jenkins_obj().get_opener()\r
-        try:\r
-            stream = fn_urlopen(url)\r
-            html_result = stream.read()\r
-        except urllib2.HTTPError, e:\r
-            log.debug("Error reading %s" % url)\r
-            raise\r
-        return not self.has_node(nodename)\r
-\r
-    def create_node(self, name, num_executors=2, node_description=None,\r
-                    remote_fs='/var/lib/jenkins', labels=None, exclusive=False):\r
-        """\r
-        Create a new slave node by name.\r
-\r
-        :param name: fqdn of slave, str\r
-        :param num_executors: number of executors, int\r
-        :param node_description: a freetext field describing the node\r
-        :param remote_fs: jenkins path, str\r
-        :param labels: labels to associate with slave, str\r
-        :param exclusive: tied to specific job, boolean\r
-        :return: node obj\r
-        """\r
-        NODE_TYPE   = 'hudson.slaves.DumbSlave$DescriptorImpl'\r
-        MODE = 'NORMAL'\r
-        if self.has_node(name):\r
-            return Node(nodename=name, baseurl=self.get_node_url(nodename=name), jenkins_obj=self)\r
-        if exclusive:\r
-            MODE = 'EXCLUSIVE'\r
-        params = {\r
-            'name' : name,\r
-            'type' : NODE_TYPE,\r
-            'json' : json.dumps ({\r
-                'name'            : name,\r
-                'nodeDescription' : node_description,\r
-                'numExecutors'    : num_executors,\r
-                'remoteFS'        : remote_fs,\r
-                'labelString'     : labels,\r
-                'mode'            : MODE,\r
-                'type'            : NODE_TYPE,\r
-                'retentionStrategy' : { 'stapler-class'  : 'hudson.slaves.RetentionStrategy$Always' },\r
-                'nodeProperties'    : { 'stapler-class-bag' : 'true' },\r
-                'launcher'          : { 'stapler-class' : 'hudson.slaves.JNLPLauncher' }\r
-            })\r
-        }\r
-        url = "%(nodeurl)s/doCreateItem?%(params)s" % {\r
-            'nodeurl': self.get_node_url(),\r
-            'params': urllib.urlencode(params)\r
-        }\r
-        print url\r
-        fn_urlopen = self.get_jenkins_obj().get_opener()\r
-        try:\r
-            stream = fn_urlopen(url)\r
-            html_result = stream.read()\r
-        except urllib2.HTTPError, e:\r
-            log.debug("Error reading %s" % url)\r
-            log.exception(e)\r
-            raise\r
-        return Node(nodename=name, baseurl=self.get_node_url(nodename=name), jenkins_obj=self)\r
+from pyjenkinsci.jenkinsbase import JenkinsBase
+from pyjenkinsci.fingerprint import Fingerprint
+from pyjenkinsci.job import Job
+from pyjenkinsci.view import View
+from pyjenkinsci.node import Node
+from pyjenkinsci.exceptions import UnknownJob
+from utils.urlopener import mkurlopener
+import logging
+import time
+import urllib2
+import urllib
+try:
+    import json
+except ImportError:
+    import simplejson as json
+
+log = logging.getLogger(__name__)
+
+class Jenkins(JenkinsBase):
+    """
+    Represents a jenkins environment.
+    """
+    def __init__(self, baseurl, username=None, password=None, proxyhost=None, proxyport=None, proxyuser=None, proxypass=None):
+        """
+
+        :param baseurl: baseurl for jenkins instance including port, str
+        :param username: username for jenkins auth, str
+        :param password: password for jenkins auth, str
+        :param proxyhost: proxyhostname, str
+        :param proxyport: proxyport, int
+        :param proxyuser: proxyusername for proxy auth, str
+        :param proxypass: proxypassword for proxyauth, str
+        :return: a Jenkins obj
+        """
+        self.username = username
+        self.password = password
+        self.proxyhost = proxyhost
+        self.proxyport = proxyport
+        self.proxyuser = proxyuser
+        self.proxypass = proxypass
+        JenkinsBase.__init__( self, baseurl )
+
+    def get_proxy_auth(self):
+        return self.proxyhost, self.proxyport, self.proxyuser, self.proxypass
+
+    def get_jenkins_auth(self):
+        return self.username, self.password, self.baseurl
+
+    def get_auth(self):
+        auth_args = []
+        auth_args.extend(self.get_jenkins_auth())
+        auth_args.extend(self.get_proxy_auth())
+        log.debug("args: %s" % auth_args)
+        return auth_args
+
+
+    def get_opener( self ):
+        return mkurlopener(*self.get_auth())
+
+    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 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 get_jenkins_obj(self):
+        return self
+
+    def get_jobs(self):
+        """
+        Fetch all the build-names on this Hudson server.
+        """
+        for info in self._data["jobs"]:
+            yield info["name"], Job( info["url"], info["name"], jenkins_obj=self)
+
+    def iteritems(self):
+        return self.get_jobs()
+
+    def iterkeys(self):
+        for info in self._data["jobs"]:
+            yield info["name"]
+
+    def keys(self):
+        return [ a for a in self.iterkeys() ]
+
+    def __str__(self):
+        return "Jenkins server at %s" % self.baseurl
+
+    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() )
+
+    def get_view_url( self, str_view_name ):
+        try:
+            view_dict = self.get_view_dict()
+            return view_dict[ str_view_name ]
+        except KeyError, ke:
+            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 )
+        return View(view_api_url , str_view_name, jenkins_obj=self)
+
+    def __getitem__( self, buildname ):
+        """
+        Get a build
+        """
+        for name, job in self.get_jobs():
+            if name == buildname:
+                return job
+        raise UnknownJob(buildname)
+
+    def get_node_dict(self):
+        """Get registered slave nodes on this instance"""
+        url = self.python_api_url(self.get_node_url())
+        node_dict = dict(self.get_data(url))
+        return dict(
+            (node['displayName'], self.python_api_url(self.get_node_url(node['displayName'])))
+                for node in node_dict['computer'])
+
+    def get_node(self, nodename):
+        """Get a node object for a specific node"""
+        node_url = self.python_api_url(self.get_node_url(nodename))
+        return Node(node_url, nodename, jenkins_obj=self)
+
+    def get_node_url(self, nodename=""):
+        """Return the url for nodes"""
+        url = "%(baseurl)s/computer/%(nodename)s" % {'baseurl': self.baseurl, 'nodename': nodename}
+        return url
+
+    def has_node(self, nodename):
+        """
+        Does a node by the name specified exist
+        :param nodename: string, hostname
+        :return: boolean
+        """
+        return nodename in self.get_node_dict()
+
+    def delete_node(self, nodename):
+        """
+        Remove a node from the managed slave list
+        Please note that you cannot remove the master node
+
+        :param nodename: string holding a hostname
+        :return: None
+        """
+        assert self.has_node(nodename), "This node: %s is not registered as a slave" % nodename
+        assert nodename != "master", "you cannot delete the master node"
+        url = "%s/doDelete" % self.get_node_url(nodename)
+        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)
+            raise
+        return not self.has_node(nodename)
+
+    def create_node(self, name, num_executors=2, node_description=None,
+                    remote_fs='/var/lib/jenkins', labels=None, exclusive=False):
+        """
+        Create a new slave node by name.
+
+        :param name: fqdn of slave, str
+        :param num_executors: number of executors, int
+        :param node_description: a freetext field describing the node
+        :param remote_fs: jenkins path, str
+        :param labels: labels to associate with slave, str
+        :param exclusive: tied to specific job, boolean
+        :return: node obj
+        """
+        NODE_TYPE   = 'hudson.slaves.DumbSlave$DescriptorImpl'
+        MODE = 'NORMAL'
+        if self.has_node(name):
+            return Node(nodename=name, baseurl=self.get_node_url(nodename=name), jenkins_obj=self)
+        if exclusive:
+            MODE = 'EXCLUSIVE'
+        params = {
+            'name' : name,
+            'type' : NODE_TYPE,
+            'json' : json.dumps ({
+                'name'            : name,
+                'nodeDescription' : node_description,
+                'numExecutors'    : num_executors,
+                'remoteFS'        : remote_fs,
+                'labelString'     : labels,
+                'mode'            : MODE,
+                'type'            : NODE_TYPE,
+                'retentionStrategy' : { 'stapler-class'  : 'hudson.slaves.RetentionStrategy$Always' },
+                'nodeProperties'    : { 'stapler-class-bag' : 'true' },
+                'launcher'          : { 'stapler-class' : 'hudson.slaves.JNLPLauncher' }
+            })
+        }
+        url = "%(nodeurl)s/doCreateItem?%(params)s" % {
+            'nodeurl': self.get_node_url(),
+            'params': urllib.urlencode(params)
+        }
+        print 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 Node(nodename=name, baseurl=self.get_node_url(nodename=name), jenkins_obj=self)