Skip to content

Commit

Permalink
Merge pull request #1 from kkpattern/create_credential_by_id
Browse files Browse the repository at this point in the history
Version 0.3.12 for internal use
  • Loading branch information
kkpattern authored Jan 16, 2021
2 parents 6c69865 + ab97534 commit 6b0091c
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 7 deletions.
50 changes: 50 additions & 0 deletions jenkinsapi/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,3 +213,53 @@ def __getitem__(self, credential_id):

raise KeyError('Credential with credential_id "%s" not found'
% credential_id)

def update(self, credential):
"""
Creates or updates credential in Jenkins. The credential.credential_id
must be set.
If credential.credential_id already exists - this method is going to
update existing Credential
:param Credential credential: The credential to create/update.
"""
if not credential.credential_id:
raise JenkinsAPIException('Credential Id must be set before '
'creating/update credential.')
cred_id = credential.credential_id
if cred_id not in self:
params = credential.get_attributes()
url = (
'%s/createCredentials'
% self.baseurl
)
try:
self.jenkins.requester.post_and_confirm_status(
url, params={}, data=urlencode(params)
)
except JenkinsAPIException as jae:
raise JenkinsAPIException('Latest version of Credentials '
'plugin is required to be able '
'to create credentials. '
'Original exception: %s' % str(jae))
else:
params = credential.get_attributes_xml()
url = (
'%s/credential/%s/config.xml'
% (self.baseurl, cred_id)
)
try:
self.jenkins.requester.post_xml_and_confirm_status(
url, params={}, data=params
)
except JenkinsAPIException as jae:
raise JenkinsAPIException('Latest version of Credentials '
'plugin is required to be able '
'to update credentials. '
'Original exception: %s' % str(jae))

self.poll()
self.credentials = self._data['credentials']
if cred_id not in self:
raise JenkinsAPIException('Problem creating/updating credential.')
6 changes: 4 additions & 2 deletions jenkinsapi/jenkins.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,13 @@ class Jenkins(JenkinsBase):
Represents a jenkins environment.
"""

# pylint: disable=too-many-arguments
def __init__(
self, baseurl,
username=None, password=None,
requester=None, lazy=False,
ssl_verify=True, cert=None,
timeout=10, use_crumb=False):
timeout=10, use_crumb=False, max_retries=None):
"""
:param baseurl: baseurl for jenkins instance including port, str
:param username: username for jenkins auth, str
Expand All @@ -66,7 +67,8 @@ def __init__(
baseurl=baseurl,
ssl_verify=ssl_verify,
cert=cert,
timeout=timeout
timeout=timeout,
max_retries=max_retries,
)
else:
self.requester = requester
Expand Down
1 change: 0 additions & 1 deletion jenkinsapi/jenkinsbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class JenkinsBase(object):
This appears to be the base object that all other jenkins objects are
inherited from
"""
RETRY_ATTEMPTS = 1

def __repr__(self):
return """<%s.%s %s>""" % (self.__class__.__module__,
Expand Down
7 changes: 6 additions & 1 deletion jenkinsapi/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ def mk_json_from_build_parameters(build_params, file_params=None):
return json.dumps(json_structure)

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

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

Expand Down
6 changes: 5 additions & 1 deletion jenkinsapi/queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,11 @@ def block_until_building(self, delay=5):
try:
self.poll()
return self.get_build()
except (NotBuiltYet, HTTPError):
except NotBuiltYet:
time.sleep(delay)
continue
except HTTPError as http_error:
log.debug(str(http_error))
time.sleep(delay)
continue

Expand Down
5 changes: 5 additions & 0 deletions jenkinsapi/utils/requester.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ def __init__(self, *args, **kwargs):
self.cert = kwargs.get('cert', cert)
self.timeout = kwargs.get('timeout', timeout)
self.session = requests.Session()
self.max_retries = kwargs.get('max_retries')
if self.max_retries is not None:
retry_adapter = requests.adapters.HTTPAdapter(max_retries=self.max_retries)
self.session.mount('http://', retry_adapter)
self.session.mount('https://', retry_adapter)

def get_request_dict(
self, params=None, data=None, files=None, headers=None, **kwargs):
Expand Down
12 changes: 10 additions & 2 deletions jenkinsapi_tests/unittests/test_requester.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,12 +362,13 @@ def fake_post(*args, **kwargs): # pylint: disable=unused-argument
monkeypatch.setattr(requests.Session, 'post', fake_post)

req = Requester('foo', 'bar')
with pytest.raises(JenkinsAPIException):
with pytest.raises(JenkinsAPIException) as error:
req.post_and_confirm_status(
url='http://dummy',
params={'param': 'value'},
data='some data'
)
assert 'status=500' in str(error)


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

req = Requester('foo', 'bar', baseurl='http://dummy')
with pytest.raises(JenkinsAPIException):
with pytest.raises(JenkinsAPIException) as error:
req.get_and_confirm_status(
url='http://dummy',
params={'param': 'value'}
)
assert 'status=500' in str(error)


def test_configure_max_retries():
req = Requester('username', 'password', baseurl='http://dummy', max_retries=3)
for adapter in req.session.adapters.values():
assert adapter.max_retries.total == 3

0 comments on commit 6b0091c

Please sign in to comment.