pass pep8 on all files
pep8 is the python style standard. I have ignored long lines though.
This commit is contained in:
parent
40a9b5243a
commit
c3e23c2973
27
doc/conf.py
27
doc/conf.py
@ -3,7 +3,8 @@
|
|||||||
# Python Jenkins documentation build configuration file, created by
|
# Python Jenkins documentation build configuration file, created by
|
||||||
# sphinx-quickstart on Sat Sep 3 16:24:58 2011.
|
# sphinx-quickstart on Sat Sep 3 16:24:58 2011.
|
||||||
#
|
#
|
||||||
# This file is execfile()d with the current directory set to its containing dir.
|
# This file is execfile()d with the current directory set to its containing
|
||||||
|
# dir.
|
||||||
#
|
#
|
||||||
# Note that not all possible configuration values are present in this
|
# Note that not all possible configuration values are present in this
|
||||||
# autogenerated file.
|
# autogenerated file.
|
||||||
@ -11,9 +12,9 @@
|
|||||||
# All configuration values have a default; values that are commented out
|
# All configuration values have a default; values that are commented out
|
||||||
# serve to show the default.
|
# serve to show the default.
|
||||||
|
|
||||||
import sys, os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
import sys, os
|
|
||||||
sys.path.insert(0, os.path.abspath('..'))
|
sys.path.insert(0, os.path.abspath('..'))
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
@ -21,13 +22,13 @@ sys.path.insert(0, os.path.abspath('..'))
|
|||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
#sys.path.insert(0, os.path.abspath('.'))
|
#sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
# -- General configuration -----------------------------------------------------
|
# -- General configuration ----------------------------------------------------
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
#needs_sphinx = '1.0'
|
#needs_sphinx = '1.0'
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
extensions = ['sphinx.ext.autodoc']
|
extensions = ['sphinx.ext.autodoc']
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
@ -69,7 +70,7 @@ release = '0.2'
|
|||||||
# directories to ignore when looking for source files.
|
# directories to ignore when looking for source files.
|
||||||
exclude_patterns = ['_build']
|
exclude_patterns = ['_build']
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
# The reST default role (used for this markup: `text`) to use for all documents
|
||||||
#default_role = None
|
#default_role = None
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
@ -90,7 +91,7 @@ pygments_style = 'sphinx'
|
|||||||
#modindex_common_prefix = []
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ---------------------------------------------------
|
# -- Options for HTML output --------------------------------------------------
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
@ -170,7 +171,7 @@ html_static_path = ['_static']
|
|||||||
htmlhelp_basename = 'PythonJenkinsdoc'
|
htmlhelp_basename = 'PythonJenkinsdoc'
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output --------------------------------------------------
|
# -- Options for LaTeX output -------------------------------------------------
|
||||||
|
|
||||||
# The paper size ('letter' or 'a4').
|
# The paper size ('letter' or 'a4').
|
||||||
#latex_paper_size = 'letter'
|
#latex_paper_size = 'letter'
|
||||||
@ -179,10 +180,10 @@ htmlhelp_basename = 'PythonJenkinsdoc'
|
|||||||
#latex_font_size = '10pt'
|
#latex_font_size = '10pt'
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
# (source start file, target name, title, author, documentclass [howto/manual])
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
('index', 'PythonJenkins.tex', u'Python Jenkins Documentation',
|
('index', 'PythonJenkins.tex', u'Python Jenkins Documentation',
|
||||||
u'Ken Conley, James Page, Tully Foote, Matthew Gertner', 'manual'),
|
u'Ken Conley, James Page, Tully Foote, Matthew Gertner', 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
@ -209,7 +210,7 @@ latex_documents = [
|
|||||||
#latex_domain_indices = True
|
#latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output --------------------------------------------
|
# -- Options for manual page output -------------------------------------------
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
|
@ -54,41 +54,44 @@ Examples::
|
|||||||
j.delete_job('empty_copy')
|
j.delete_job('empty_copy')
|
||||||
|
|
||||||
# build a parameterized job
|
# build a parameterized job
|
||||||
j.build_job('api-test', {'param1': 'test value 1', 'param2': 'test value 2'})
|
j.build_job('api-test', {
|
||||||
|
'param1': 'test value 1',
|
||||||
|
'param2': 'test value 2',
|
||||||
|
})
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import sys
|
#import sys
|
||||||
import urllib2
|
import urllib2
|
||||||
import urllib
|
import urllib
|
||||||
import base64
|
import base64
|
||||||
import traceback
|
#import traceback
|
||||||
import json
|
import json
|
||||||
import httplib
|
import httplib
|
||||||
|
|
||||||
LAUNCHER_SSH = 'hudson.plugins.sshslaves.SSHLauncher'
|
LAUNCHER_SSH = 'hudson.plugins.sshslaves.SSHLauncher'
|
||||||
LAUNCHER_COMMAND = 'hudson.slaves.CommandLauncher'
|
LAUNCHER_COMMAND = 'hudson.slaves.CommandLauncher'
|
||||||
LAUNCHER_WINDOWS_SERVICE = 'hudson.os.windows.ManagedWindowsServiceLauncher'
|
LAUNCHER_WINDOWS_SERVICE = 'hudson.os.windows.ManagedWindowsServiceLauncher'
|
||||||
|
|
||||||
INFO = 'api/json'
|
INFO = 'api/json'
|
||||||
JOB_INFO = 'job/%(name)s/api/json?depth=0'
|
JOB_INFO = 'job/%(name)s/api/json?depth=0'
|
||||||
Q_INFO = 'queue/api/json?depth=0'
|
Q_INFO = 'queue/api/json?depth=0'
|
||||||
CANCEL_QUEUE = 'queue/item/%(number)s/cancelQueue'
|
CANCEL_QUEUE = 'queue/item/%(number)s/cancelQueue'
|
||||||
CREATE_JOB = 'createItem?name=%(name)s' #also post config.xml
|
CREATE_JOB = 'createItem?name=%(name)s' # also post config.xml
|
||||||
CONFIG_JOB = 'job/%(name)s/config.xml'
|
CONFIG_JOB = 'job/%(name)s/config.xml'
|
||||||
DELETE_JOB = 'job/%(name)s/doDelete'
|
DELETE_JOB = 'job/%(name)s/doDelete'
|
||||||
ENABLE_JOB = 'job/%(name)s/enable'
|
ENABLE_JOB = 'job/%(name)s/enable'
|
||||||
DISABLE_JOB = 'job/%(name)s/disable'
|
DISABLE_JOB = 'job/%(name)s/disable'
|
||||||
COPY_JOB = 'createItem?name=%(to_name)s&mode=copy&from=%(from_name)s'
|
COPY_JOB = 'createItem?name=%(to_name)s&mode=copy&from=%(from_name)s'
|
||||||
BUILD_JOB = 'job/%(name)s/build'
|
BUILD_JOB = 'job/%(name)s/build'
|
||||||
STOP_BUILD = 'job/%(name)s/%(number)s/stop'
|
STOP_BUILD = 'job/%(name)s/%(number)s/stop'
|
||||||
BUILD_WITH_PARAMS_JOB = 'job/%(name)s/buildWithParameters'
|
BUILD_WITH_PARAMS_JOB = 'job/%(name)s/buildWithParameters'
|
||||||
BUILD_INFO = 'job/%(name)s/%(number)d/api/json?depth=0'
|
BUILD_INFO = 'job/%(name)s/%(number)d/api/json?depth=0'
|
||||||
|
|
||||||
|
|
||||||
CREATE_NODE = 'computer/doCreateItem?%s'
|
CREATE_NODE = 'computer/doCreateItem?%s'
|
||||||
DELETE_NODE = 'computer/%(name)s/doDelete'
|
DELETE_NODE = 'computer/%(name)s/doDelete'
|
||||||
NODE_INFO = 'computer/%(name)s/api/json?depth=0'
|
NODE_INFO = 'computer/%(name)s/api/json?depth=0'
|
||||||
NODE_TYPE = 'hudson.slaves.DumbSlave$DescriptorImpl'
|
NODE_TYPE = 'hudson.slaves.DumbSlave$DescriptorImpl'
|
||||||
TOGGLE_OFFLINE = 'computer/%(name)s/toggleOffline?offlineMessage=%(msg)s'
|
TOGGLE_OFFLINE = 'computer/%(name)s/toggleOffline?offlineMessage=%(msg)s'
|
||||||
|
|
||||||
#for testing only
|
#for testing only
|
||||||
@ -118,27 +121,31 @@ RECONFIG_XML = '''<?xml version='1.0' encoding='UTF-8'?>
|
|||||||
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
|
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
|
||||||
<triggers class='vector'/>
|
<triggers class='vector'/>
|
||||||
<concurrentBuild>false</concurrentBuild>
|
<concurrentBuild>false</concurrentBuild>
|
||||||
<builders>
|
<builders>
|
||||||
<jenkins.tasks.Shell>
|
<jenkins.tasks.Shell>
|
||||||
<command>export FOO=bar</command>
|
<command>export FOO=bar</command>
|
||||||
</jenkins.tasks.Shell>
|
</jenkins.tasks.Shell>
|
||||||
</builders>
|
</builders>
|
||||||
<publishers/>
|
<publishers/>
|
||||||
<buildWrappers/>
|
<buildWrappers/>
|
||||||
</project>'''
|
</project>'''
|
||||||
|
|
||||||
|
|
||||||
class JenkinsException(Exception):
|
class JenkinsException(Exception):
|
||||||
'''
|
'''
|
||||||
General exception type for jenkins-API-related failures.
|
General exception type for jenkins-API-related failures.
|
||||||
'''
|
'''
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def auth_headers(username, password):
|
def auth_headers(username, password):
|
||||||
'''
|
'''
|
||||||
Simple implementation of HTTP Basic Authentication. Returns the 'Authentication' header value.
|
Simple implementation of HTTP Basic Authentication. Returns the
|
||||||
|
'Authentication' header value.
|
||||||
'''
|
'''
|
||||||
return 'Basic ' + base64.encodestring('%s:%s' % (username, password))[:-1]
|
return 'Basic ' + base64.encodestring('%s:%s' % (username, password))[:-1]
|
||||||
|
|
||||||
|
|
||||||
class Jenkins(object):
|
class Jenkins(object):
|
||||||
|
|
||||||
def __init__(self, url, username=None, password=None):
|
def __init__(self, url, username=None, password=None):
|
||||||
@ -164,15 +171,17 @@ class Jenkins(object):
|
|||||||
:returns: dictionary of job information
|
:returns: dictionary of job information
|
||||||
'''
|
'''
|
||||||
try:
|
try:
|
||||||
response = self.jenkins_open(urllib2.Request(self.server + JOB_INFO%locals()))
|
response = self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + JOB_INFO % locals()))
|
||||||
if response:
|
if response:
|
||||||
return json.loads(response)
|
return json.loads(response)
|
||||||
else:
|
else:
|
||||||
raise JenkinsException('job[%s] does not exist'%name)
|
raise JenkinsException('job[%s] does not exist' % name)
|
||||||
except urllib2.HTTPError:
|
except urllib2.HTTPError:
|
||||||
raise JenkinsException('job[%s] does not exist'%name)
|
raise JenkinsException('job[%s] does not exist' % name)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise JenkinsException("Could not parse JSON info for job[%s]"%name)
|
raise JenkinsException(
|
||||||
|
"Could not parse JSON info for job[%s]" % name)
|
||||||
|
|
||||||
def debug_job_info(self, job_name):
|
def debug_job_info(self, job_name):
|
||||||
'''
|
'''
|
||||||
@ -183,17 +192,21 @@ class Jenkins(object):
|
|||||||
|
|
||||||
def jenkins_open(self, req):
|
def jenkins_open(self, req):
|
||||||
'''
|
'''
|
||||||
Utility routine for opening an HTTP request to a Jenkins server. This should only be used
|
Utility routine for opening an HTTP request to a Jenkins server. This
|
||||||
to extends the :class:`Jenkins` API.
|
should only be used to extends the :class:`Jenkins` API.
|
||||||
'''
|
'''
|
||||||
try:
|
try:
|
||||||
if self.auth:
|
if self.auth:
|
||||||
req.add_header('Authorization', self.auth)
|
req.add_header('Authorization', self.auth)
|
||||||
return urllib2.urlopen(req).read()
|
return urllib2.urlopen(req).read()
|
||||||
except urllib2.HTTPError, e:
|
except urllib2.HTTPError, e:
|
||||||
# Jenkins's funky authentication means its nigh impossible to distinguish errors.
|
# Jenkins's funky authentication means its nigh impossible to
|
||||||
|
# distinguish errors.
|
||||||
if e.code in [401, 403, 500]:
|
if e.code in [401, 403, 500]:
|
||||||
raise JenkinsException('Error in request. Possibly authentication failed [%s]'%(e.code))
|
raise JenkinsException(
|
||||||
|
'Error in request.' +
|
||||||
|
'Possibly authentication failed [%s]' % (e.code)
|
||||||
|
)
|
||||||
# right now I'm getting 302 infinites on a successful delete
|
# right now I'm getting 302 infinites on a successful delete
|
||||||
|
|
||||||
def get_build_info(self, name, number):
|
def get_build_info(self, name, number):
|
||||||
@ -214,15 +227,21 @@ class Jenkins(object):
|
|||||||
{u'building': False, u'changeSet': {u'items': [{u'date': u'2011-12-19T18:01:52.540557Z', u'msg': u'test', u'revision': 66, u'user': u'unknown', u'paths': [{u'editType': u'edit', u'file': u'/branches/demo/index.html'}]}], u'kind': u'svn', u'revisions': [{u'module': u'http://eaas-svn01.i3.level3.com/eaas', u'revision': 66}]}, u'builtOn': u'', u'description': None, u'artifacts': [{u'relativePath': u'dist/eaas-87-2011-12-19_18-01-57.war', u'displayPath': u'eaas-87-2011-12-19_18-01-57.war', u'fileName': u'eaas-87-2011-12-19_18-01-57.war'}, {u'relativePath': u'dist/eaas-87-2011-12-19_18-01-57.war.zip', u'displayPath': u'eaas-87-2011-12-19_18-01-57.war.zip', u'fileName': u'eaas-87-2011-12-19_18-01-57.war.zip'}], u'timestamp': 1324317717000, u'number': 87, u'actions': [{u'parameters': [{u'name': u'SERVICE_NAME', u'value': u'eaas'}, {u'name': u'PROJECT_NAME', u'value': u'demo'}]}, {u'causes': [{u'userName': u'anonymous', u'shortDescription': u'Started by user anonymous'}]}, {}, {}, {}], u'id': u'2011-12-19_18-01-57', u'keepLog': False, u'url': u'http://eaas-jenkins01.i3.level3.com:9080/job/build_war/87/', u'culprits': [{u'absoluteUrl': u'http://eaas-jenkins01.i3.level3.com:9080/user/unknown', u'fullName': u'unknown'}], u'result': u'SUCCESS', u'duration': 8826, u'fullDisplayName': u'build_war #87'}
|
{u'building': False, u'changeSet': {u'items': [{u'date': u'2011-12-19T18:01:52.540557Z', u'msg': u'test', u'revision': 66, u'user': u'unknown', u'paths': [{u'editType': u'edit', u'file': u'/branches/demo/index.html'}]}], u'kind': u'svn', u'revisions': [{u'module': u'http://eaas-svn01.i3.level3.com/eaas', u'revision': 66}]}, u'builtOn': u'', u'description': None, u'artifacts': [{u'relativePath': u'dist/eaas-87-2011-12-19_18-01-57.war', u'displayPath': u'eaas-87-2011-12-19_18-01-57.war', u'fileName': u'eaas-87-2011-12-19_18-01-57.war'}, {u'relativePath': u'dist/eaas-87-2011-12-19_18-01-57.war.zip', u'displayPath': u'eaas-87-2011-12-19_18-01-57.war.zip', u'fileName': u'eaas-87-2011-12-19_18-01-57.war.zip'}], u'timestamp': 1324317717000, u'number': 87, u'actions': [{u'parameters': [{u'name': u'SERVICE_NAME', u'value': u'eaas'}, {u'name': u'PROJECT_NAME', u'value': u'demo'}]}, {u'causes': [{u'userName': u'anonymous', u'shortDescription': u'Started by user anonymous'}]}, {}, {}, {}], u'id': u'2011-12-19_18-01-57', u'keepLog': False, u'url': u'http://eaas-jenkins01.i3.level3.com:9080/job/build_war/87/', u'culprits': [{u'absoluteUrl': u'http://eaas-jenkins01.i3.level3.com:9080/user/unknown', u'fullName': u'unknown'}], u'result': u'SUCCESS', u'duration': 8826, u'fullDisplayName': u'build_war #87'}
|
||||||
'''
|
'''
|
||||||
try:
|
try:
|
||||||
response = self.jenkins_open(urllib2.Request(self.server + BUILD_INFO%locals()))
|
response = self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + BUILD_INFO % locals()))
|
||||||
if response:
|
if response:
|
||||||
return json.loads(response)
|
return json.loads(response)
|
||||||
else:
|
else:
|
||||||
raise JenkinsException('job[%s] number[%d] does not exist'%(name, number))
|
raise JenkinsException('job[%s] number[%d] does not exist'
|
||||||
|
% (name, number))
|
||||||
except urllib2.HTTPError:
|
except urllib2.HTTPError:
|
||||||
raise JenkinsException('job[%s] number[%d] does not exist'%(name, number))
|
raise JenkinsException('job[%s] number[%d] does not exist'
|
||||||
|
% (name, number))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise JenkinsException('Could not parse JSON info for job[%s] number[%d]'%(name, number))
|
raise JenkinsException(
|
||||||
|
'Could not parse JSON info for job[%s] number[%d]'
|
||||||
|
% (name, number)
|
||||||
|
)
|
||||||
|
|
||||||
def get_queue_info(self):
|
def get_queue_info(self):
|
||||||
'''
|
'''
|
||||||
@ -233,7 +252,9 @@ class Jenkins(object):
|
|||||||
>>> print(queue_info[0])
|
>>> print(queue_info[0])
|
||||||
{u'task': {u'url': u'http://your_url/job/my_job/', u'color': u'aborted_anime', u'name': u'my_job'}, u'stuck': False, u'actions': [{u'causes': [{u'shortDescription': u'Started by timer'}]}], u'buildable': False, u'params': u'', u'buildableStartMilliseconds': 1315087293316, u'why': u'Build #2,532 is already in progress (ETA:10 min)', u'blocked': True}
|
{u'task': {u'url': u'http://your_url/job/my_job/', u'color': u'aborted_anime', u'name': u'my_job'}, u'stuck': False, u'actions': [{u'causes': [{u'shortDescription': u'Started by timer'}]}], u'buildable': False, u'params': u'', u'buildableStartMilliseconds': 1315087293316, u'why': u'Build #2,532 is already in progress (ETA:10 min)', u'blocked': True}
|
||||||
'''
|
'''
|
||||||
return json.loads(self.jenkins_open(urllib2.Request(self.server + Q_INFO)))['items']
|
return json.loads(self.jenkins_open(
|
||||||
|
urllib2.Request(self.server + Q_INFO)
|
||||||
|
))['items']
|
||||||
|
|
||||||
def cancel_queue(self, number):
|
def cancel_queue(self, number):
|
||||||
'''
|
'''
|
||||||
@ -259,17 +280,22 @@ class Jenkins(object):
|
|||||||
>>> info = j.get_info()
|
>>> info = j.get_info()
|
||||||
>>> jobs = info['jobs']
|
>>> jobs = info['jobs']
|
||||||
>>> print(jobs[0])
|
>>> print(jobs[0])
|
||||||
{u'url': u'http://your_url_here/job/my_job/', u'color': u'blue', u'name': u'my_job'}
|
{u'url': u'http://your_url_here/job/my_job/', u'color': u'blue',
|
||||||
|
u'name': u'my_job'}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return json.loads(self.jenkins_open(urllib2.Request(self.server + INFO)))
|
return json.loads(self.jenkins_open(
|
||||||
|
urllib2.Request(self.server + INFO)))
|
||||||
except urllib2.HTTPError:
|
except urllib2.HTTPError:
|
||||||
raise JenkinsException("Error communicating with server[%s]"%self.server)
|
raise JenkinsException("Error communicating with server[%s]"
|
||||||
|
% self.server)
|
||||||
except httplib.BadStatusLine:
|
except httplib.BadStatusLine:
|
||||||
raise JenkinsException("Error communicating with server[%s]"%self.server)
|
raise JenkinsException("Error communicating with server[%s]"
|
||||||
|
% self.server)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise JenkinsException("Could not parse JSON info for server[%s]"%self.server)
|
raise JenkinsException("Could not parse JSON info for server[%s]"
|
||||||
|
% self.server)
|
||||||
|
|
||||||
def get_jobs(self):
|
def get_jobs(self):
|
||||||
"""
|
"""
|
||||||
@ -288,20 +314,22 @@ class Jenkins(object):
|
|||||||
:param to_name: Name of Jenkins job to copy to, ``str``
|
:param to_name: Name of Jenkins job to copy to, ``str``
|
||||||
'''
|
'''
|
||||||
self.get_job_info(from_name)
|
self.get_job_info(from_name)
|
||||||
self.jenkins_open(urllib2.Request(self.server + COPY_JOB%locals(), ''))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + COPY_JOB % locals(), ''))
|
||||||
if not self.job_exists(to_name):
|
if not self.job_exists(to_name):
|
||||||
raise JenkinsException('create[%s] failed'%(to_name))
|
raise JenkinsException('create[%s] failed' % (to_name))
|
||||||
|
|
||||||
def delete_job(self, name):
|
def delete_job(self, name):
|
||||||
'''
|
'''
|
||||||
Delete Jenkins job permanently.
|
Delete Jenkins job permanently.
|
||||||
|
|
||||||
:param name: Name of Jenkins job, ``str``
|
:param name: Name of Jenkins job, ``str``
|
||||||
'''
|
'''
|
||||||
self.get_job_info(name)
|
self.get_job_info(name)
|
||||||
self.jenkins_open(urllib2.Request(self.server + DELETE_JOB%locals(), ''))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + DELETE_JOB % locals(), ''))
|
||||||
if self.job_exists(name):
|
if self.job_exists(name):
|
||||||
raise JenkinsException('delete[%s] failed'%(name))
|
raise JenkinsException('delete[%s] failed' % (name))
|
||||||
|
|
||||||
def enable_job(self, name):
|
def enable_job(self, name):
|
||||||
'''
|
'''
|
||||||
@ -310,7 +338,8 @@ class Jenkins(object):
|
|||||||
:param name: Name of Jenkins job, ``str``
|
:param name: Name of Jenkins job, ``str``
|
||||||
'''
|
'''
|
||||||
self.get_job_info(name)
|
self.get_job_info(name)
|
||||||
self.jenkins_open(urllib2.Request(self.server + ENABLE_JOB%locals(), ''))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + ENABLE_JOB % locals(), ''))
|
||||||
|
|
||||||
def disable_job(self, name):
|
def disable_job(self, name):
|
||||||
'''
|
'''
|
||||||
@ -319,7 +348,8 @@ class Jenkins(object):
|
|||||||
:param name: Name of Jenkins job, ``str``
|
:param name: Name of Jenkins job, ``str``
|
||||||
'''
|
'''
|
||||||
self.get_job_info(name)
|
self.get_job_info(name)
|
||||||
self.jenkins_open(urllib2.Request(self.server + DISABLE_JOB%locals(), ''))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + DISABLE_JOB % locals(), ''))
|
||||||
|
|
||||||
def job_exists(self, name):
|
def job_exists(self, name):
|
||||||
'''
|
'''
|
||||||
@ -340,12 +370,13 @@ class Jenkins(object):
|
|||||||
:param config_xml: config file text, ``str``
|
:param config_xml: config file text, ``str``
|
||||||
'''
|
'''
|
||||||
if self.job_exists(name):
|
if self.job_exists(name):
|
||||||
raise JenkinsException('job[%s] already exists'%(name))
|
raise JenkinsException('job[%s] already exists' % (name))
|
||||||
|
|
||||||
headers = {'Content-Type': 'text/xml'}
|
headers = {'Content-Type': 'text/xml'}
|
||||||
self.jenkins_open(urllib2.Request(self.server + CREATE_JOB%locals(), config_xml, headers))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + CREATE_JOB % locals(), config_xml, headers))
|
||||||
if not self.job_exists(name):
|
if not self.job_exists(name):
|
||||||
raise JenkinsException('create[%s] failed'%(name))
|
raise JenkinsException('create[%s] failed' % (name))
|
||||||
|
|
||||||
def get_job_config(self, name):
|
def get_job_config(self, name):
|
||||||
'''
|
'''
|
||||||
@ -360,20 +391,22 @@ class Jenkins(object):
|
|||||||
|
|
||||||
def reconfig_job(self, name, config_xml):
|
def reconfig_job(self, name, config_xml):
|
||||||
'''
|
'''
|
||||||
Change configuration of existing Jenkins job. To create a new job, see :meth:`Jenkins.create_job`.
|
Change configuration of existing Jenkins job. To create a new job, see
|
||||||
|
:meth:`Jenkins.create_job`.
|
||||||
|
|
||||||
:param name: Name of Jenkins job, ``str``
|
:param name: Name of Jenkins job, ``str``
|
||||||
:param config_xml: New XML configuration, ``str``
|
:param config_xml: New XML configuration, ``str``
|
||||||
'''
|
'''
|
||||||
self.get_job_info(name)
|
self.get_job_info(name)
|
||||||
headers = {'Content-Type': 'text/xml'}
|
headers = {'Content-Type': 'text/xml'}
|
||||||
reconfig_url = self.server + CONFIG_JOB%locals()
|
reconfig_url = self.server + CONFIG_JOB % locals()
|
||||||
self.jenkins_open(urllib2.Request(reconfig_url, config_xml, headers))
|
self.jenkins_open(urllib2.Request(reconfig_url, config_xml, headers))
|
||||||
|
|
||||||
def build_job_url(self, name, parameters=None, token=None):
|
def build_job_url(self, name, parameters=None, token=None):
|
||||||
'''
|
'''
|
||||||
Get URL to trigger build job. Authenticated setups may require configuring a token on the server side.
|
Get URL to trigger build job. Authenticated setups may require
|
||||||
|
configuring a token on the server side.
|
||||||
|
|
||||||
:param parameters: parameters for job, or None., ``dict``
|
:param parameters: parameters for job, or None., ``dict``
|
||||||
:param token: (optional) token for building job, ``str``
|
:param token: (optional) token for building job, ``str``
|
||||||
:returns: URL for building job
|
:returns: URL for building job
|
||||||
@ -381,21 +414,24 @@ class Jenkins(object):
|
|||||||
if parameters:
|
if parameters:
|
||||||
if token:
|
if token:
|
||||||
parameters['token'] = token
|
parameters['token'] = token
|
||||||
return self.server + BUILD_WITH_PARAMS_JOB%locals() + '?' + urllib.urlencode(parameters)
|
return (self.server + BUILD_WITH_PARAMS_JOB % locals() +
|
||||||
|
'?' + urllib.urlencode(parameters))
|
||||||
elif token:
|
elif token:
|
||||||
return self.server + BUILD_JOB%locals() + '?' + urllib.urlencode({'token': token})
|
return (self.server + BUILD_JOB % locals() +
|
||||||
|
'?' + urllib.urlencode({'token': token}))
|
||||||
else:
|
else:
|
||||||
return self.server + BUILD_JOB%locals()
|
return self.server + BUILD_JOB % locals()
|
||||||
|
|
||||||
def build_job(self, name, parameters=None, token=None):
|
def build_job(self, name, parameters=None, token=None):
|
||||||
'''
|
'''
|
||||||
Trigger build job.
|
Trigger build job.
|
||||||
|
|
||||||
:param parameters: parameters for job, or ``None``, ``dict``
|
:param parameters: parameters for job, or ``None``, ``dict``
|
||||||
'''
|
'''
|
||||||
if not self.job_exists(name):
|
if not self.job_exists(name):
|
||||||
raise JenkinsException('no such job[%s]'%(name))
|
raise JenkinsException('no such job[%s]' % (name))
|
||||||
return self.jenkins_open(urllib2.Request(self.build_job_url(name, parameters, token)))
|
return self.jenkins_open(urllib2.Request(
|
||||||
|
self.build_job_url(name, parameters, token)))
|
||||||
|
|
||||||
def stop_build(self, name, number):
|
def stop_build(self, name, number):
|
||||||
'''
|
'''
|
||||||
@ -414,15 +450,17 @@ class Jenkins(object):
|
|||||||
:returns: Dictionary of node info, ``dict``
|
:returns: Dictionary of node info, ``dict``
|
||||||
'''
|
'''
|
||||||
try:
|
try:
|
||||||
response = self.jenkins_open(urllib2.Request(self.server + NODE_INFO%locals()))
|
response = self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + NODE_INFO % locals()))
|
||||||
if response:
|
if response:
|
||||||
return json.loads(response)
|
return json.loads(response)
|
||||||
else:
|
else:
|
||||||
raise JenkinsException('node[%s] does not exist'%name)
|
raise JenkinsException('node[%s] does not exist' % name)
|
||||||
except urllib2.HTTPError:
|
except urllib2.HTTPError:
|
||||||
raise JenkinsException('node[%s] does not exist'%name)
|
raise JenkinsException('node[%s] does not exist' % name)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise JenkinsException("Could not parse JSON info for node[%s]"%name)
|
raise JenkinsException("Could not parse JSON info for node[%s]"
|
||||||
|
% name)
|
||||||
|
|
||||||
def node_exists(self, name):
|
def node_exists(self, name):
|
||||||
'''
|
'''
|
||||||
@ -438,38 +476,40 @@ class Jenkins(object):
|
|||||||
def delete_node(self, name):
|
def delete_node(self, name):
|
||||||
'''
|
'''
|
||||||
Delete Jenkins node permanently.
|
Delete Jenkins node permanently.
|
||||||
|
|
||||||
:param name: Name of Jenkins node, ``str``
|
:param name: Name of Jenkins node, ``str``
|
||||||
'''
|
'''
|
||||||
self.get_node_info(name)
|
self.get_node_info(name)
|
||||||
self.jenkins_open(urllib2.Request(self.server + DELETE_NODE%locals(), ''))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + DELETE_NODE % locals(), ''))
|
||||||
if self.node_exists(name):
|
if self.node_exists(name):
|
||||||
raise JenkinsException('delete[%s] failed'%(name))
|
raise JenkinsException('delete[%s] failed' % (name))
|
||||||
|
|
||||||
|
|
||||||
def disable_node(self, name, msg=''):
|
def disable_node(self, name, msg=''):
|
||||||
'''
|
'''
|
||||||
Disable a node
|
Disable a node
|
||||||
|
|
||||||
:param name: Jenkins node name, ``str``
|
:param name: Jenkins node name, ``str``
|
||||||
:param msg: Offline message, ``str``
|
:param msg: Offline message, ``str``
|
||||||
'''
|
'''
|
||||||
info = self.get_node_info(name)
|
info = self.get_node_info(name)
|
||||||
if info['offline']:
|
if info['offline']:
|
||||||
return
|
return
|
||||||
self.jenkins_open(urllib2.Request(self.server + TOGGLE_OFFLINE%locals()))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + TOGGLE_OFFLINE % locals()))
|
||||||
|
|
||||||
def enable_node(self, name):
|
def enable_node(self, name):
|
||||||
'''
|
'''
|
||||||
Enable a node
|
Enable a node
|
||||||
|
|
||||||
:param name: Jenkins node name, ``str``
|
:param name: Jenkins node name, ``str``
|
||||||
'''
|
'''
|
||||||
info = self.get_node_info(name)
|
info = self.get_node_info(name)
|
||||||
if not info['offline']:
|
if not info['offline']:
|
||||||
return
|
return
|
||||||
msg = ''
|
msg = ''
|
||||||
self.jenkins_open(urllib2.Request(self.server + TOGGLE_OFFLINE%locals()))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + TOGGLE_OFFLINE % locals()))
|
||||||
|
|
||||||
def create_node(self, name, numExecutors=2, nodeDescription=None,
|
def create_node(self, name, numExecutors=2, nodeDescription=None,
|
||||||
remoteFS='/var/lib/jenkins', labels=None, exclusive=False,
|
remoteFS='/var/lib/jenkins', labels=None, exclusive=False,
|
||||||
@ -485,7 +525,7 @@ class Jenkins(object):
|
|||||||
:param launcher_params: Additional parameters for the launcher, ``dict``
|
:param launcher_params: Additional parameters for the launcher, ``dict``
|
||||||
'''
|
'''
|
||||||
if self.node_exists(name):
|
if self.node_exists(name):
|
||||||
raise JenkinsException('node[%s] already exists'%(name))
|
raise JenkinsException('node[%s] already exists' % (name))
|
||||||
|
|
||||||
mode = 'NORMAL'
|
mode = 'NORMAL'
|
||||||
if exclusive:
|
if exclusive:
|
||||||
@ -494,25 +534,29 @@ class Jenkins(object):
|
|||||||
launcher_params['stapler-class'] = launcher
|
launcher_params['stapler-class'] = launcher
|
||||||
|
|
||||||
inner_params = {
|
inner_params = {
|
||||||
'name' : name,
|
'name': name,
|
||||||
'nodeDescription' : nodeDescription,
|
'nodeDescription': nodeDescription,
|
||||||
'numExecutors' : numExecutors,
|
'numExecutors': numExecutors,
|
||||||
'remoteFS' : remoteFS,
|
'remoteFS': remoteFS,
|
||||||
'labelString' : labels,
|
'labelString': labels,
|
||||||
'mode' : mode,
|
'mode': mode,
|
||||||
'type' : NODE_TYPE,
|
'type': NODE_TYPE,
|
||||||
'retentionStrategy' : { 'stapler-class' : 'hudson.slaves.RetentionStrategy$Always' },
|
'retentionStrategy': {
|
||||||
'nodeProperties' : { 'stapler-class-bag' : 'true' },
|
'stapler-class':
|
||||||
'launcher' : launcher_params
|
'hudson.slaves.RetentionStrategy$Always'
|
||||||
|
},
|
||||||
|
'nodeProperties': {'stapler-class-bag': 'true'},
|
||||||
|
'launcher': launcher_params
|
||||||
}
|
}
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
'name' : name,
|
'name': name,
|
||||||
'type' : NODE_TYPE,
|
'type': NODE_TYPE,
|
||||||
'json' : json.dumps(inner_params)
|
'json': json.dumps(inner_params)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.jenkins_open(urllib2.Request(self.server + CREATE_NODE%urllib.urlencode(params)))
|
self.jenkins_open(urllib2.Request(
|
||||||
|
self.server + CREATE_NODE % urllib.urlencode(params)))
|
||||||
|
|
||||||
if not self.node_exists(name):
|
if not self.node_exists(name):
|
||||||
raise JenkinsException('create[%s] failed'%(name))
|
raise JenkinsException('create[%s] failed' % (name))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user