~msabramo/python-jenkins/python3_small_tweaks

« back to all changes in this revision

Viewing changes to jenkins/__init__.py

  • Committer: James E. Blair
  • Date: 2012-06-20 21:41:59 UTC
  • mto: This revision was merged to the branch mainline in revision 16.
  • Revision ID: jeblair@hp.com-20120620214159-ig2trdi70k37kwt1
Add additional methods:

cancel_queue
stop_build
disable_node
enable_node

And add support for ssh and windows service launcher types to
create_node.

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
import json
66
66
import httplib
67
67
 
 
68
LAUNCHER_SSH             = 'hudson.plugins.sshslaves.SSHLauncher'
 
69
LAUNCHER_COMMAND         = 'hudson.slaves.CommandLauncher'
 
70
LAUNCHER_WINDOWS_SERVICE = 'hudson.os.windows.ManagedWindowsServiceLauncher'
 
71
 
68
72
INFO         = 'api/json'
69
73
JOB_INFO     = 'job/%(name)s/api/json?depth=0'
70
74
Q_INFO       = 'queue/api/json?depth=0'
 
75
CANCEL_QUEUE = 'queue/item/%(number)s/cancelQueue'
71
76
CREATE_JOB   = 'createItem?name=%(name)s' #also post config.xml
72
77
CONFIG_JOB   = 'job/%(name)s/config.xml'
73
78
DELETE_JOB   = 'job/%(name)s/doDelete'
75
80
DISABLE_JOB  = 'job/%(name)s/disable'
76
81
COPY_JOB     = 'createItem?name=%(to_name)s&mode=copy&from=%(from_name)s'
77
82
BUILD_JOB    = 'job/%(name)s/build'
 
83
STOP_BUILD   = 'job/%(name)s/%(number)s/stop'
78
84
BUILD_WITH_PARAMS_JOB = 'job/%(name)s/buildWithParameters'
79
85
BUILD_INFO   = 'job/%(name)s/%(number)d/api/json?depth=0'
80
86
 
83
89
DELETE_NODE = 'computer/%(name)s/doDelete'
84
90
NODE_INFO   = 'computer/%(name)s/api/json?depth=0'
85
91
NODE_TYPE   = 'hudson.slaves.DumbSlave$DescriptorImpl'
86
 
 
 
92
TOGGLE_OFFLINE = '/computer/%(name)s/toggleOffline?offlineMessage=%(msg)s'
87
93
 
88
94
#for testing only
89
95
EMPTY_CONFIG_XML = '''<?xml version='1.0' encoding='UTF-8'?>
229
235
        '''
230
236
        return json.loads(self.jenkins_open(urllib2.Request(self.server + Q_INFO)))['items']
231
237
 
 
238
    def cancel_queue(self, number):
 
239
        '''
 
240
        Cancel a queued build.
 
241
 
 
242
        :param number: Jenkins queue number for the build, ``int``
 
243
        '''
 
244
        # Jenkins returns a 302 from this URL, unless Referer is not set,
 
245
        # then you get a 404.
 
246
        self.jenkins_open(urllib2.Request(self.server +
 
247
                                          CANCEL_QUEUE % locals(),
 
248
                                          headers={'Referer': self.server}))
 
249
 
232
250
    def get_info(self):
233
251
        """
234
252
        Get information on this Master.  This information
379
397
            raise JenkinsException('no such job[%s]'%(name))
380
398
        return self.jenkins_open(urllib2.Request(self.build_job_url(name, parameters, token)))
381
399
 
 
400
    def stop_build(self, name, number):
 
401
        '''
 
402
        Stop a running Jenkins build.
 
403
 
 
404
        :param name: Name of Jenkins job, ``str``
 
405
        :param number: Jenkins build number for the job, ``int``
 
406
        '''
 
407
        self.jenkins_open(urllib2.Request(self.server + STOP_BUILD % locals()))
 
408
 
382
409
    def get_node_info(self, name):
383
410
        '''
384
411
        Get node information dictionary
420
447
            raise JenkinsException('delete[%s] failed'%(name))
421
448
 
422
449
 
 
450
    def disable_node(self, name, msg=''):
 
451
        '''
 
452
        Disable a node
 
453
        
 
454
        :param name: Jenkins node name, ``str``
 
455
        :param msg: Offline message, ``str``
 
456
        '''
 
457
        info = self.get_node_info(name)
 
458
        if info['offline']:
 
459
            return
 
460
        self.jenkins_open(urllib2.Request(self.server + TOGGLE_OFFLINE%locals()))
 
461
 
 
462
    def enable_node(self, name):
 
463
        '''
 
464
        Enable a node
 
465
        
 
466
        :param name: Jenkins node name, ``str``
 
467
        '''
 
468
        info = self.get_node_info(name)
 
469
        if not info['offline']:
 
470
            return
 
471
        msg = ''
 
472
        self.jenkins_open(urllib2.Request(self.server + TOGGLE_OFFLINE%locals()))
 
473
 
423
474
    def create_node(self, name, numExecutors=2, nodeDescription=None,
424
 
                    remoteFS='/var/lib/jenkins', labels=None, exclusive=False):
 
475
                    remoteFS='/var/lib/jenkins', labels=None, exclusive=False,
 
476
                    launcher=LAUNCHER_COMMAND, launcher_params={}):
425
477
        '''
426
478
        :param name: name of node to create, ``str``
427
479
        :param numExecutors: number of executors for node, ``int``
429
481
        :param remoteFS: Remote filesystem location to use, ``str``
430
482
        :param labels: Labels to associate with node, ``str``
431
483
        :param exclusive: Use this node for tied jobs only, ``bool``
 
484
        :param launcher: The launch method for the slave, ``jenkins.LAUNCHER_COMMAND``, ``jenkins.LAUNCHER_SSH``, ``jenkins.LAUNCHER_WINDOWS_SERVICE``
 
485
        :param launcher_params: Additional parameters for the launcher, ``dict``
432
486
        '''
433
487
        if self.node_exists(name):
434
488
            raise JenkinsException('node[%s] already exists'%(name))
437
491
        if exclusive:
438
492
            mode = 'EXCLUSIVE'
439
493
 
440
 
        params = {
441
 
            'name' : name,
442
 
            'type' : NODE_TYPE,
443
 
            'json' : json.dumps ({
 
494
        launcher_params['stapler-class'] = launcher
 
495
 
 
496
        inner_params = {
444
497
                'name'            : name,
445
498
                'nodeDescription' : nodeDescription,
446
499
                'numExecutors'    : numExecutors,
450
503
                'type'            : NODE_TYPE,
451
504
                'retentionStrategy' : { 'stapler-class'  : 'hudson.slaves.RetentionStrategy$Always' },
452
505
                'nodeProperties'    : { 'stapler-class-bag' : 'true' },
453
 
                'launcher'          : { 'stapler-class' : 'hudson.slaves.JNLPLauncher' }
454
 
            })
 
506
                'launcher'          : launcher_params
 
507
        }
 
508
 
 
509
        params = {
 
510
            'name' : name,
 
511
            'type' : NODE_TYPE,
 
512
            'json' : json.dumps(inner_params)
455
513
        }
456
514
 
457
515
        self.jenkins_open(urllib2.Request(self.server + CREATE_NODE%urllib.urlencode(params)))
 
516
 
458
517
        if not self.node_exists(name):
459
518
            raise JenkinsException('create[%s] failed'%(name))