Merge lp:~corvus/python-jenkins/addmethods into lp:~python-jenkins-developers/python-jenkins/trunk

Proposed by James E. Blair
Status: Merged
Merged at revision: 16
Proposed branch: lp:~corvus/python-jenkins/addmethods
Merge into: lp:~python-jenkins-developers/python-jenkins/trunk
Diff against target: 147 lines (+67/-8)
1 file modified
jenkins/__init__.py (+67/-8)
To merge this branch: bzr merge lp:~corvus/python-jenkins/addmethods
Reviewer Review Type Date Requested Status
James Page Approve
Monty Taylor (community) Approve
Review via email: mp+111313@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Monty Taylor (mordred) wrote :

Awesome.

review: Approve
Revision history for this message
James E. Blair (corvus) wrote :

These are some methods we're actively using for OpenStack, in Zuul, and in the devstack-gate.

Revision history for this message
James Page (james-page) wrote :

Hi James

Thanks very much for this work - LGTM (and tested OK on my local setup).

Merged....

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'jenkins/__init__.py'
2--- jenkins/__init__.py 2012-05-17 15:10:00 +0000
3+++ jenkins/__init__.py 2012-06-20 21:47:20 +0000
4@@ -65,9 +65,14 @@
5 import json
6 import httplib
7
8+LAUNCHER_SSH = 'hudson.plugins.sshslaves.SSHLauncher'
9+LAUNCHER_COMMAND = 'hudson.slaves.CommandLauncher'
10+LAUNCHER_WINDOWS_SERVICE = 'hudson.os.windows.ManagedWindowsServiceLauncher'
11+
12 INFO = 'api/json'
13 JOB_INFO = 'job/%(name)s/api/json?depth=0'
14 Q_INFO = 'queue/api/json?depth=0'
15+CANCEL_QUEUE = 'queue/item/%(number)s/cancelQueue'
16 CREATE_JOB = 'createItem?name=%(name)s' #also post config.xml
17 CONFIG_JOB = 'job/%(name)s/config.xml'
18 DELETE_JOB = 'job/%(name)s/doDelete'
19@@ -75,6 +80,7 @@
20 DISABLE_JOB = 'job/%(name)s/disable'
21 COPY_JOB = 'createItem?name=%(to_name)s&mode=copy&from=%(from_name)s'
22 BUILD_JOB = 'job/%(name)s/build'
23+STOP_BUILD = 'job/%(name)s/%(number)s/stop'
24 BUILD_WITH_PARAMS_JOB = 'job/%(name)s/buildWithParameters'
25 BUILD_INFO = 'job/%(name)s/%(number)d/api/json?depth=0'
26
27@@ -83,7 +89,7 @@
28 DELETE_NODE = 'computer/%(name)s/doDelete'
29 NODE_INFO = 'computer/%(name)s/api/json?depth=0'
30 NODE_TYPE = 'hudson.slaves.DumbSlave$DescriptorImpl'
31-
32+TOGGLE_OFFLINE = '/computer/%(name)s/toggleOffline?offlineMessage=%(msg)s'
33
34 #for testing only
35 EMPTY_CONFIG_XML = '''<?xml version='1.0' encoding='UTF-8'?>
36@@ -229,6 +235,18 @@
37 '''
38 return json.loads(self.jenkins_open(urllib2.Request(self.server + Q_INFO)))['items']
39
40+ def cancel_queue(self, number):
41+ '''
42+ Cancel a queued build.
43+
44+ :param number: Jenkins queue number for the build, ``int``
45+ '''
46+ # Jenkins returns a 302 from this URL, unless Referer is not set,
47+ # then you get a 404.
48+ self.jenkins_open(urllib2.Request(self.server +
49+ CANCEL_QUEUE % locals(),
50+ headers={'Referer': self.server}))
51+
52 def get_info(self):
53 """
54 Get information on this Master. This information
55@@ -379,6 +397,15 @@
56 raise JenkinsException('no such job[%s]'%(name))
57 return self.jenkins_open(urllib2.Request(self.build_job_url(name, parameters, token)))
58
59+ def stop_build(self, name, number):
60+ '''
61+ Stop a running Jenkins build.
62+
63+ :param name: Name of Jenkins job, ``str``
64+ :param number: Jenkins build number for the job, ``int``
65+ '''
66+ self.jenkins_open(urllib2.Request(self.server + STOP_BUILD % locals()))
67+
68 def get_node_info(self, name):
69 '''
70 Get node information dictionary
71@@ -420,8 +447,33 @@
72 raise JenkinsException('delete[%s] failed'%(name))
73
74
75+ def disable_node(self, name, msg=''):
76+ '''
77+ Disable a node
78+
79+ :param name: Jenkins node name, ``str``
80+ :param msg: Offline message, ``str``
81+ '''
82+ info = self.get_node_info(name)
83+ if info['offline']:
84+ return
85+ self.jenkins_open(urllib2.Request(self.server + TOGGLE_OFFLINE%locals()))
86+
87+ def enable_node(self, name):
88+ '''
89+ Enable a node
90+
91+ :param name: Jenkins node name, ``str``
92+ '''
93+ info = self.get_node_info(name)
94+ if not info['offline']:
95+ return
96+ msg = ''
97+ self.jenkins_open(urllib2.Request(self.server + TOGGLE_OFFLINE%locals()))
98+
99 def create_node(self, name, numExecutors=2, nodeDescription=None,
100- remoteFS='/var/lib/jenkins', labels=None, exclusive=False):
101+ remoteFS='/var/lib/jenkins', labels=None, exclusive=False,
102+ launcher=LAUNCHER_COMMAND, launcher_params={}):
103 '''
104 :param name: name of node to create, ``str``
105 :param numExecutors: number of executors for node, ``int``
106@@ -429,6 +481,8 @@
107 :param remoteFS: Remote filesystem location to use, ``str``
108 :param labels: Labels to associate with node, ``str``
109 :param exclusive: Use this node for tied jobs only, ``bool``
110+ :param launcher: The launch method for the slave, ``jenkins.LAUNCHER_COMMAND``, ``jenkins.LAUNCHER_SSH``, ``jenkins.LAUNCHER_WINDOWS_SERVICE``
111+ :param launcher_params: Additional parameters for the launcher, ``dict``
112 '''
113 if self.node_exists(name):
114 raise JenkinsException('node[%s] already exists'%(name))
115@@ -437,10 +491,9 @@
116 if exclusive:
117 mode = 'EXCLUSIVE'
118
119- params = {
120- 'name' : name,
121- 'type' : NODE_TYPE,
122- 'json' : json.dumps ({
123+ launcher_params['stapler-class'] = launcher
124+
125+ inner_params = {
126 'name' : name,
127 'nodeDescription' : nodeDescription,
128 'numExecutors' : numExecutors,
129@@ -450,10 +503,16 @@
130 'type' : NODE_TYPE,
131 'retentionStrategy' : { 'stapler-class' : 'hudson.slaves.RetentionStrategy$Always' },
132 'nodeProperties' : { 'stapler-class-bag' : 'true' },
133- 'launcher' : { 'stapler-class' : 'hudson.slaves.JNLPLauncher' }
134- })
135+ 'launcher' : launcher_params
136+ }
137+
138+ params = {
139+ 'name' : name,
140+ 'type' : NODE_TYPE,
141+ 'json' : json.dumps(inner_params)
142 }
143
144 self.jenkins_open(urllib2.Request(self.server + CREATE_NODE%urllib.urlencode(params)))
145+
146 if not self.node_exists(name):
147 raise JenkinsException('create[%s] failed'%(name))

Subscribers

People subscribed via source and target branches