100% test coverage
Change-Id: Ie035a299a2f92eede9a88c00e4dc4ad820fbc710
This commit is contained in:
parent
8d38dfefd2
commit
9424023180
@ -45,11 +45,11 @@
|
||||
See examples at :doc:`example`
|
||||
'''
|
||||
|
||||
import urllib2
|
||||
import urllib
|
||||
import base64
|
||||
from httplib import BadStatusLine
|
||||
import json
|
||||
import httplib
|
||||
import urllib
|
||||
from urllib2 import Request, HTTPError, urlopen
|
||||
|
||||
LAUNCHER_SSH = 'hudson.plugins.sshslaves.SSHLauncher'
|
||||
LAUNCHER_COMMAND = 'hudson.slaves.CommandLauncher'
|
||||
@ -157,7 +157,7 @@ class Jenkins(object):
|
||||
def maybe_add_crumb(self, req):
|
||||
# We don't know yet whether we need a crumb
|
||||
if self.crumb is None:
|
||||
response = self.jenkins_open(urllib2.Request(
|
||||
response = self.jenkins_open(Request(
|
||||
self.server + CRUMB_URL), add_crumb=False)
|
||||
if response:
|
||||
self.crumb = json.loads(response)
|
||||
@ -175,13 +175,13 @@ class Jenkins(object):
|
||||
:returns: dictionary of job information
|
||||
'''
|
||||
try:
|
||||
response = self.jenkins_open(urllib2.Request(
|
||||
response = self.jenkins_open(Request(
|
||||
self.server + JOB_INFO % locals()))
|
||||
if response:
|
||||
return json.loads(response)
|
||||
else:
|
||||
raise JenkinsException('job[%s] does not exist' % name)
|
||||
except urllib2.HTTPError:
|
||||
except HTTPError:
|
||||
raise JenkinsException('job[%s] does not exist' % name)
|
||||
except ValueError:
|
||||
raise JenkinsException(
|
||||
@ -197,7 +197,7 @@ class Jenkins(object):
|
||||
:returns: Name of job or None
|
||||
'''
|
||||
response = self.jenkins_open(
|
||||
urllib2.Request(self.server + JOB_NAME % locals()))
|
||||
Request(self.server + JOB_NAME % locals()))
|
||||
if response:
|
||||
actual = json.loads(response)['name']
|
||||
if actual != name:
|
||||
@ -226,8 +226,8 @@ class Jenkins(object):
|
||||
req.add_header('Authorization', self.auth)
|
||||
if add_crumb:
|
||||
self.maybe_add_crumb(req)
|
||||
return urllib2.urlopen(req).read()
|
||||
except urllib2.HTTPError, e:
|
||||
return urlopen(req).read()
|
||||
except HTTPError, e:
|
||||
# Jenkins's funky authentication means its nigh impossible to
|
||||
# distinguish errors.
|
||||
if e.code in [401, 403, 500]:
|
||||
@ -255,14 +255,14 @@ 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'}
|
||||
'''
|
||||
try:
|
||||
response = self.jenkins_open(urllib2.Request(
|
||||
response = self.jenkins_open(Request(
|
||||
self.server + BUILD_INFO % locals()))
|
||||
if response:
|
||||
return json.loads(response)
|
||||
else:
|
||||
raise JenkinsException('job[%s] number[%d] does not exist'
|
||||
% (name, number))
|
||||
except urllib2.HTTPError:
|
||||
except HTTPError:
|
||||
raise JenkinsException('job[%s] number[%d] does not exist'
|
||||
% (name, number))
|
||||
except ValueError:
|
||||
@ -281,7 +281,7 @@ class Jenkins(object):
|
||||
{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)
|
||||
Request(self.server + Q_INFO)
|
||||
))['items']
|
||||
|
||||
def cancel_queue(self, number):
|
||||
@ -292,9 +292,10 @@ class Jenkins(object):
|
||||
'''
|
||||
# Jenkins returns a 302 from this URL, unless Referer is not set,
|
||||
# then you get a 404.
|
||||
self.jenkins_open(urllib2.Request(self.server +
|
||||
CANCEL_QUEUE % locals(),
|
||||
headers={'Referer': self.server}))
|
||||
self.jenkins_open(
|
||||
Request(
|
||||
self.server + CANCEL_QUEUE % locals(),
|
||||
headers={'Referer': self.server}))
|
||||
|
||||
def get_info(self):
|
||||
"""
|
||||
@ -314,11 +315,11 @@ class Jenkins(object):
|
||||
"""
|
||||
try:
|
||||
return json.loads(self.jenkins_open(
|
||||
urllib2.Request(self.server + INFO)))
|
||||
except urllib2.HTTPError:
|
||||
Request(self.server + INFO)))
|
||||
except HTTPError:
|
||||
raise JenkinsException("Error communicating with server[%s]"
|
||||
% self.server)
|
||||
except httplib.BadStatusLine:
|
||||
except BadStatusLine:
|
||||
raise JenkinsException("Error communicating with server[%s]"
|
||||
% self.server)
|
||||
except ValueError:
|
||||
@ -342,7 +343,7 @@ class Jenkins(object):
|
||||
:param to_name: Name of Jenkins job to copy to, ``str``
|
||||
'''
|
||||
self.get_job_info(from_name)
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + COPY_JOB % locals(), ''))
|
||||
if not self.job_exists(to_name):
|
||||
raise JenkinsException('create[%s] failed' % (to_name))
|
||||
@ -355,7 +356,7 @@ class Jenkins(object):
|
||||
:param new_name: New Jenkins job name, ``str``
|
||||
'''
|
||||
self.get_job_info(name)
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + RENAME_JOB % locals(), ''))
|
||||
if not self.job_exists(new_name):
|
||||
raise JenkinsException('rename[%s] failed' % (new_name))
|
||||
@ -367,7 +368,7 @@ class Jenkins(object):
|
||||
:param name: Name of Jenkins job, ``str``
|
||||
'''
|
||||
self.get_job_info(name)
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + DELETE_JOB % locals(), ''))
|
||||
if self.job_exists(name):
|
||||
raise JenkinsException('delete[%s] failed' % (name))
|
||||
@ -379,7 +380,7 @@ class Jenkins(object):
|
||||
:param name: Name of Jenkins job, ``str``
|
||||
'''
|
||||
self.get_job_info(name)
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + ENABLE_JOB % locals(), ''))
|
||||
|
||||
def disable_job(self, name):
|
||||
@ -389,7 +390,7 @@ class Jenkins(object):
|
||||
:param name: Name of Jenkins job, ``str``
|
||||
'''
|
||||
self.get_job_info(name)
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + DISABLE_JOB % locals(), ''))
|
||||
|
||||
def job_exists(self, name):
|
||||
@ -411,7 +412,7 @@ class Jenkins(object):
|
||||
raise JenkinsException('job[%s] already exists' % (name))
|
||||
|
||||
headers = {'Content-Type': 'text/xml'}
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + CREATE_JOB % locals(), config_xml, headers))
|
||||
if not self.job_exists(name):
|
||||
raise JenkinsException('create[%s] failed' % (name))
|
||||
@ -423,8 +424,8 @@ class Jenkins(object):
|
||||
:param name: Name of Jenkins job, ``str``
|
||||
:returns: job configuration (XML format)
|
||||
'''
|
||||
request = urllib2.Request(self.server + CONFIG_JOB %
|
||||
{"name": urllib.quote(name)})
|
||||
request = Request(self.server + CONFIG_JOB %
|
||||
{"name": urllib.quote(name)})
|
||||
return self.jenkins_open(request)
|
||||
|
||||
def reconfig_job(self, name, config_xml):
|
||||
@ -438,7 +439,7 @@ class Jenkins(object):
|
||||
self.get_job_info(name)
|
||||
headers = {'Content-Type': 'text/xml'}
|
||||
reconfig_url = self.server + CONFIG_JOB % locals()
|
||||
self.jenkins_open(urllib2.Request(reconfig_url, config_xml, headers))
|
||||
self.jenkins_open(Request(reconfig_url, config_xml, headers))
|
||||
|
||||
def build_job_url(self, name, parameters=None, token=None):
|
||||
'''
|
||||
@ -470,7 +471,7 @@ class Jenkins(object):
|
||||
'''
|
||||
if not self.job_exists(name):
|
||||
raise JenkinsException('no such job[%s]' % (name))
|
||||
return self.jenkins_open(urllib2.Request(
|
||||
return self.jenkins_open(Request(
|
||||
self.build_job_url(name, parameters, token)))
|
||||
|
||||
def stop_build(self, name, number):
|
||||
@ -480,7 +481,7 @@ class Jenkins(object):
|
||||
:param name: Name of Jenkins job, ``str``
|
||||
:param number: Jenkins build number for the job, ``int``
|
||||
'''
|
||||
self.jenkins_open(urllib2.Request(self.server + STOP_BUILD % locals()))
|
||||
self.jenkins_open(Request(self.server + STOP_BUILD % locals()))
|
||||
|
||||
def get_node_info(self, name):
|
||||
'''
|
||||
@ -490,13 +491,13 @@ class Jenkins(object):
|
||||
:returns: Dictionary of node info, ``dict``
|
||||
'''
|
||||
try:
|
||||
response = self.jenkins_open(urllib2.Request(
|
||||
response = self.jenkins_open(Request(
|
||||
self.server + NODE_INFO % locals()))
|
||||
if response:
|
||||
return json.loads(response)
|
||||
else:
|
||||
raise JenkinsException('node[%s] does not exist' % name)
|
||||
except urllib2.HTTPError:
|
||||
except HTTPError:
|
||||
raise JenkinsException('node[%s] does not exist' % name)
|
||||
except ValueError:
|
||||
raise JenkinsException("Could not parse JSON info for node[%s]"
|
||||
@ -520,7 +521,7 @@ class Jenkins(object):
|
||||
:param name: Name of Jenkins node, ``str``
|
||||
'''
|
||||
self.get_node_info(name)
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + DELETE_NODE % locals(), ''))
|
||||
if self.node_exists(name):
|
||||
raise JenkinsException('delete[%s] failed' % (name))
|
||||
@ -535,7 +536,7 @@ class Jenkins(object):
|
||||
info = self.get_node_info(name)
|
||||
if info['offline']:
|
||||
return
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + TOGGLE_OFFLINE % locals()))
|
||||
|
||||
def enable_node(self, name):
|
||||
@ -548,7 +549,7 @@ class Jenkins(object):
|
||||
if not info['offline']:
|
||||
return
|
||||
msg = ''
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + TOGGLE_OFFLINE % locals()))
|
||||
|
||||
def create_node(self, name, numExecutors=2, nodeDescription=None,
|
||||
@ -595,7 +596,7 @@ class Jenkins(object):
|
||||
'json': json.dumps(inner_params)
|
||||
}
|
||||
|
||||
self.jenkins_open(urllib2.Request(
|
||||
self.jenkins_open(Request(
|
||||
self.server + CREATE_NODE % urllib.urlencode(params)))
|
||||
|
||||
if not self.node_exists(name):
|
||||
@ -610,18 +611,13 @@ class Jenkins(object):
|
||||
:returns: Build console output, ``str``
|
||||
'''
|
||||
try:
|
||||
response = self.jenkins_open(urllib2.Request(
|
||||
response = self.jenkins_open(Request(
|
||||
self.server + BUILD_CONSOLE_OUTPUT % locals()))
|
||||
if response:
|
||||
return response
|
||||
else:
|
||||
raise JenkinsException('job[%s] number[%d] does not exist'
|
||||
% (name, number))
|
||||
except urllib2.HTTPError:
|
||||
except HTTPError:
|
||||
raise JenkinsException('job[%s] number[%d] does not exist'
|
||||
% (name, number))
|
||||
except ValueError:
|
||||
raise JenkinsException(
|
||||
'Could not parse JSON info for job[%s] number[%d]'
|
||||
% (name, number)
|
||||
)
|
||||
|
@ -2,3 +2,4 @@ coverage>=3.6
|
||||
discover
|
||||
flake8
|
||||
mock
|
||||
unittest2
|
||||
|
@ -3,3 +3,4 @@ import sys
|
||||
sys.path.insert(0, os.path.abspath('..'))
|
||||
|
||||
import jenkins # noqa
|
||||
from StringIO import StringIO # noqa
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user