100% test coverage

Change-Id: Ie035a299a2f92eede9a88c00e4dc4ad820fbc710
This commit is contained in:
Marc Abramowitz 2014-04-08 09:18:17 -07:00 committed by Marc Abramowitz
parent 8d38dfefd2
commit 9424023180
4 changed files with 1165 additions and 45 deletions

View File

@ -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)
)

View File

@ -2,3 +2,4 @@ coverage>=3.6
discover
flake8
mock
unittest2

View File

@ -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