Skip to content

Commit 6b0091c

Browse files
authored
Merge pull request #1 from kkpattern/create_credential_by_id
Version 0.3.12 for internal use
2 parents 6c69865 + ab97534 commit 6b0091c

File tree

7 files changed

+80
-7
lines changed

7 files changed

+80
-7
lines changed

jenkinsapi/credentials.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,53 @@ def __getitem__(self, credential_id):
213213

214214
raise KeyError('Credential with credential_id "%s" not found'
215215
% credential_id)
216+
217+
def update(self, credential):
218+
"""
219+
Creates or updates credential in Jenkins. The credential.credential_id
220+
must be set.
221+
222+
If credential.credential_id already exists - this method is going to
223+
update existing Credential
224+
225+
:param Credential credential: The credential to create/update.
226+
"""
227+
if not credential.credential_id:
228+
raise JenkinsAPIException('Credential Id must be set before '
229+
'creating/update credential.')
230+
cred_id = credential.credential_id
231+
if cred_id not in self:
232+
params = credential.get_attributes()
233+
url = (
234+
'%s/createCredentials'
235+
% self.baseurl
236+
)
237+
try:
238+
self.jenkins.requester.post_and_confirm_status(
239+
url, params={}, data=urlencode(params)
240+
)
241+
except JenkinsAPIException as jae:
242+
raise JenkinsAPIException('Latest version of Credentials '
243+
'plugin is required to be able '
244+
'to create credentials. '
245+
'Original exception: %s' % str(jae))
246+
else:
247+
params = credential.get_attributes_xml()
248+
url = (
249+
'%s/credential/%s/config.xml'
250+
% (self.baseurl, cred_id)
251+
)
252+
try:
253+
self.jenkins.requester.post_xml_and_confirm_status(
254+
url, params={}, data=params
255+
)
256+
except JenkinsAPIException as jae:
257+
raise JenkinsAPIException('Latest version of Credentials '
258+
'plugin is required to be able '
259+
'to update credentials. '
260+
'Original exception: %s' % str(jae))
261+
262+
self.poll()
263+
self.credentials = self._data['credentials']
264+
if cred_id not in self:
265+
raise JenkinsAPIException('Problem creating/updating credential.')

jenkinsapi/jenkins.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ class Jenkins(JenkinsBase):
4040
Represents a jenkins environment.
4141
"""
4242

43+
# pylint: disable=too-many-arguments
4344
def __init__(
4445
self, baseurl,
4546
username=None, password=None,
4647
requester=None, lazy=False,
4748
ssl_verify=True, cert=None,
48-
timeout=10, use_crumb=False):
49+
timeout=10, use_crumb=False, max_retries=None):
4950
"""
5051
:param baseurl: baseurl for jenkins instance including port, str
5152
:param username: username for jenkins auth, str
@@ -66,7 +67,8 @@ def __init__(
6667
baseurl=baseurl,
6768
ssl_verify=ssl_verify,
6869
cert=cert,
69-
timeout=timeout
70+
timeout=timeout,
71+
max_retries=max_retries,
7072
)
7173
else:
7274
self.requester = requester

jenkinsapi/jenkinsbase.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ class JenkinsBase(object):
1818
This appears to be the base object that all other jenkins objects are
1919
inherited from
2020
"""
21-
RETRY_ATTEMPTS = 1
2221

2322
def __repr__(self):
2423
return """<%s.%s %s>""" % (self.__class__.__module__,

jenkinsapi/job.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ def mk_json_from_build_parameters(build_params, file_params=None):
174174
return json.dumps(json_structure)
175175

176176
def invoke(self, securitytoken=None, block=False,
177-
build_params=None, cause=None, files=None, delay=5):
177+
build_params=None, cause=None, files=None, delay=5,
178+
quiet_period=None):
178179
assert isinstance(block, bool)
179180
if build_params and (not self.has_params()):
180181
raise BadParams("This job does not support parameters")
@@ -189,6 +190,10 @@ def invoke(self, securitytoken=None, block=False,
189190
if build_params else {} # Via POSTed JSON
190191

191192
url = self.get_build_triggerurl()
193+
# If quiet period is set, the build will have {quiet_period} seconds
194+
# quiet peroid before start.
195+
if quiet_period is not None:
196+
url += "?delay={0}sec".format(quiet_period)
192197
if cause:
193198
build_params['cause'] = cause
194199

jenkinsapi/queue.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ def block_until_building(self, delay=5):
146146
try:
147147
self.poll()
148148
return self.get_build()
149-
except (NotBuiltYet, HTTPError):
149+
except NotBuiltYet:
150+
time.sleep(delay)
151+
continue
152+
except HTTPError as http_error:
153+
log.debug(str(http_error))
150154
time.sleep(delay)
151155
continue
152156

jenkinsapi/utils/requester.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ def __init__(self, *args, **kwargs):
7878
self.cert = kwargs.get('cert', cert)
7979
self.timeout = kwargs.get('timeout', timeout)
8080
self.session = requests.Session()
81+
self.max_retries = kwargs.get('max_retries')
82+
if self.max_retries is not None:
83+
retry_adapter = requests.adapters.HTTPAdapter(max_retries=self.max_retries)
84+
self.session.mount('http://', retry_adapter)
85+
self.session.mount('https://', retry_adapter)
8186

8287
def get_request_dict(
8388
self, params=None, data=None, files=None, headers=None, **kwargs):

jenkinsapi_tests/unittests/test_requester.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,12 +362,13 @@ def fake_post(*args, **kwargs): # pylint: disable=unused-argument
362362
monkeypatch.setattr(requests.Session, 'post', fake_post)
363363

364364
req = Requester('foo', 'bar')
365-
with pytest.raises(JenkinsAPIException):
365+
with pytest.raises(JenkinsAPIException) as error:
366366
req.post_and_confirm_status(
367367
url='http://dummy',
368368
params={'param': 'value'},
369369
data='some data'
370370
)
371+
assert 'status=500' in str(error)
371372

372373

373374
def test_get_and_confirm_status(monkeypatch):
@@ -401,8 +402,15 @@ def fake_get(*args, **kwargs): # pylint: disable=unused-argument
401402
monkeypatch.setattr(requests.Session, 'get', fake_get)
402403

403404
req = Requester('foo', 'bar', baseurl='http://dummy')
404-
with pytest.raises(JenkinsAPIException):
405+
with pytest.raises(JenkinsAPIException) as error:
405406
req.get_and_confirm_status(
406407
url='http://dummy',
407408
params={'param': 'value'}
408409
)
410+
assert 'status=500' in str(error)
411+
412+
413+
def test_configure_max_retries():
414+
req = Requester('username', 'password', baseurl='http://dummy', max_retries=3)
415+
for adapter in req.session.adapters.values():
416+
assert adapter.max_retries.total == 3

0 commit comments

Comments
 (0)