First stab at node class
authorRamon van Alteren <ramon@vanalteren.nl>
Tue, 3 Jan 2012 12:32:34 +0000 (13:32 +0100)
committerRamon van Alteren <ramon@vanalteren.nl>
Tue, 3 Jan 2012 12:32:34 +0000 (13:32 +0100)
Addded method to get at node info from jenkins object
Created a node class to hold node data

Node class still has all the original code from the ubuntu project commented out, aka this is a WIP

pyjenkinsci/jenkins.py
pyjenkinsci/node.py [new file with mode: 0644]

index d5c23dd..76cc6b8 100644 (file)
@@ -2,7 +2,8 @@ from pyjenkinsci.jenkinsbase import JenkinsBase
 from pyjenkinsci.fingerprint import Fingerprint\r
 from pyjenkinsci.job import Job\r
 from pyjenkinsci.view import View\r
-from exceptions import UnknownJob\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
@@ -94,3 +95,18 @@ class Jenkins(JenkinsBase):
             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
+        return dict(self.get_data(url))\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
diff --git a/pyjenkinsci/node.py b/pyjenkinsci/node.py
new file mode 100644 (file)
index 0000000..332c4db
--- /dev/null
@@ -0,0 +1,133 @@
+from pyjenkinsci.jenkinsbase import JenkinsBase
+import logging
+
+log = logging.getLogger(__name__)
+
+class Node(JenkinsBase):
+    """
+    Class to hold information on nodes that are attached as slaves to the master jenkins instance
+    """
+
+    def __init__(self, baseurl, nodename, jenkins_obj):
+        """
+        Init a node object by providing all relevant pointers to it
+        :param baseurl: basic url for querying information on a node
+        :param nodename: hostname of the node
+        :param jenkins_obj: ref to the jenkins obj
+        :return: Node obj
+        """
+        self.name = nodename
+        self.jenkins = jenkins_obj
+        JenkinsBase.__init__(self, baseurl)
+
+    def get_jenkins_obj(self):
+        return self.jenkins
+
+    def id(self):
+        return self.name
+
+    def __str__(self):
+        return self.id()
+
+    def is_online(self):
+        return not self._data['offline']
+
+#NODES       = 'computer/api/json'
+#CREATE_NODE = 'computer/doCreateItem?%s'
+#DELETE_NODE = 'computer/%(name)s/doDelete'
+#NODE_INFO   = 'computer/%(name)s/api/json?depth=0'
+#NODE_TYPE   = 'hudson.slaves.DumbSlave$DescriptorImpl'
+#
+#def get_nodes(self):
+#    '''
+#    Get a list of nodes registered on the jenkins instance
+#    returns a list of node dictionaries
+#    '''
+#    try:
+#        response = self.jenkins_open(urllib2.Request(self.server + NODES%locals()))
+#        if response:
+#            return json.loads(response)['computer']
+#        else:
+#            raise JenkinsException('Cannot get nodes information')
+#    except urllib2.HTTPError:
+#        raise JenkinsException('Cannot get nodes information')
+#    except ValueError:
+#        raise JenkinsException("Could not parse JSON info for nodes information")
+#
+#def get_node_info(self, name):
+#    '''
+#    Get node information dictionary
+#
+#    :param name: Node name, ``str``
+#    :returns: Dictionary of node info, ``dict``
+#    '''
+#    try:
+#        response = self.jenkins_open(urllib2.Request(self.server + NODE_INFO%locals()))
+#        if response:
+#            return json.loads(response)
+#        else:
+#            raise JenkinsException('node[%s] does not exist'%name)
+#    except urllib2.HTTPError:
+#        raise JenkinsException('node[%s] does not exist'%name)
+#    except ValueError:
+#        raise JenkinsException("Could not parse JSON info for node[%s]"%name)
+#
+#def node_exists(self, name):
+#    '''
+#    :param name: Name of Jenkins node, ``str``
+#    :returns: ``True`` if Jenkins node exists
+#    '''
+#    try:
+#        self.get_node_info(name)
+#        return True
+#    except JenkinsException:
+#        return False
+#
+#def delete_node(self, name):
+#    '''
+#    Delete Jenkins node permanently.
+#
+#    :param name: Name of Jenkins node, ``str``
+#    '''
+#    self.get_node_info(name)
+#    self.jenkins_open(urllib2.Request(self.server + DELETE_NODE%locals(), ''))
+#    if self.node_exists(name):
+#        raise JenkinsException('delete[%s] failed'%(name))
+#
+#def create_node(self, name, numExecutors=2, nodeDescription=None,
+#                remoteFS='/var/lib/jenkins', labels=None, exclusive=False):
+#    '''
+#    :param name: name of node to create, ``str``
+#    :param numExecutors: number of executors for node, ``int``
+#    :param nodeDescription: Description of node, ``str``
+#    :param remoteFS: Remote filesystem location to use, ``str``
+#    :param labels: Labels to associate with node, ``str``
+#    :param exclusive: Use this node for tied jobs only, ``bool``
+#    '''
+#    if self.node_exists(name):
+#        raise JenkinsException('node[%s] already exists'%(name))
+#
+#    mode = 'NORMAL'
+#    if exclusive:
+#        mode = 'EXCLUSIVE'
+#
+#    params = {
+#        'name' : name,
+#        'type' : NODE_TYPE,
+#        'json' : json.dumps ({
+#            'name'            : name,
+#            'nodeDescription' : nodeDescription,
+#            'numExecutors'    : numExecutors,
+#            'remoteFS'        : remoteFS,
+#            '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' }
+#        })
+#    }
+#
+#    self.jenkins_open(urllib2.Request(self.server + CREATE_NODE%urllib.urlencode(params)))
+#    if not self.node_exists(name):
+#        raise JenkinsException('create[%s] failed'%(name))