mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
* Fix the logical flaw when deleting a build in the jenkins_build module.
* Fix the logical flaw when deleting a Jenkins build in the jenkins_build module.
* Adding changelogs.
* Update tests/unit/plugins/modules/test_jenkins_build.py
Co-authored-by: Felix Fontein <felix@fontein.de>
* Attempt to mock the exception classes.
* Remedy the CI issues when mocking the exception classes.
* Assuming a way to mock the get_build_status function.
* Near to the feasible approach.
* Calls the correct class when unit testing.
* Fix sending wrong arguments when unit testing.
* Directly assign the argument value in the unit testing.
* Fix errors calling different classes.
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 7610501c66
)
Co-authored-by: Tong He <68936428+unnecessary-username@users.noreply.github.com>
This commit is contained in:
parent
618e567377
commit
fef6abc8c8
3 changed files with 55 additions and 5 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- jenkins_build - fix the logical flaw when deleting a Jenkins build (https://github.com/ansible-collections/community.general/pull/5514).
|
|
@ -183,7 +183,10 @@ class JenkinsBuild:
|
||||||
try:
|
try:
|
||||||
response = self.server.get_build_info(self.name, self.build_number)
|
response = self.server.get_build_info(self.name, self.build_number)
|
||||||
return response
|
return response
|
||||||
|
except jenkins.JenkinsException as e:
|
||||||
|
response = {}
|
||||||
|
response["result"] = "ABSENT"
|
||||||
|
return response
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.module.fail_json(msg='Unable to fetch build information, %s' % to_native(e),
|
self.module.fail_json(msg='Unable to fetch build information, %s' % to_native(e),
|
||||||
exception=traceback.format_exc())
|
exception=traceback.format_exc())
|
||||||
|
@ -231,7 +234,10 @@ class JenkinsBuild:
|
||||||
if self.state == "stopped" and build_status['result'] == "ABORTED":
|
if self.state == "stopped" and build_status['result'] == "ABORTED":
|
||||||
result['changed'] = True
|
result['changed'] = True
|
||||||
result['build_info'] = build_status
|
result['build_info'] = build_status
|
||||||
elif build_status['result'] == "SUCCESS":
|
elif self.state == "absent" and build_status['result'] == "ABSENT":
|
||||||
|
result['changed'] = True
|
||||||
|
result['build_info'] = build_status
|
||||||
|
elif self.state != "absent" and build_status['result'] == "SUCCESS":
|
||||||
result['changed'] = True
|
result['changed'] = True
|
||||||
result['build_info'] = build_status
|
result['build_info'] = build_status
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -43,6 +43,28 @@ def fail_json(*args, **kwargs):
|
||||||
raise AnsibleFailJson(kwargs)
|
raise AnsibleFailJson(kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class jenkins:
|
||||||
|
class JenkinsException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NotFoundException(JenkinsException):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class JenkinsBuildMock():
|
||||||
|
def get_build_status(self):
|
||||||
|
try:
|
||||||
|
instance = JenkinsMock()
|
||||||
|
response = JenkinsMock.get_build_info(instance, 'host-delete', 1234)
|
||||||
|
return response
|
||||||
|
except jenkins.JenkinsException as e:
|
||||||
|
response = {}
|
||||||
|
response["result"] = "ABSENT"
|
||||||
|
return response
|
||||||
|
except Exception as e:
|
||||||
|
fail_json(msg='Unable to fetch build information, {0}'.format(e))
|
||||||
|
|
||||||
|
|
||||||
class JenkinsMock():
|
class JenkinsMock():
|
||||||
|
|
||||||
def get_job_info(self, name):
|
def get_job_info(self, name):
|
||||||
|
@ -51,6 +73,8 @@ class JenkinsMock():
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_build_info(self, name, build_number):
|
def get_build_info(self, name, build_number):
|
||||||
|
if name == "host-delete":
|
||||||
|
raise jenkins.JenkinsException("job {0} number {1} does not exist".format(name, build_number))
|
||||||
return {
|
return {
|
||||||
"building": True,
|
"building": True,
|
||||||
"result": "SUCCESS"
|
"result": "SUCCESS"
|
||||||
|
@ -83,7 +107,7 @@ class JenkinsMockIdempotent():
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def delete_build(self, name, build_number):
|
def delete_build(self, name, build_number):
|
||||||
return None
|
raise jenkins.NotFoundException("job {0} number {1} does not exist".format(name, build_number))
|
||||||
|
|
||||||
def stop_build(self, name, build_number):
|
def stop_build(self, name, build_number):
|
||||||
return None
|
return None
|
||||||
|
@ -167,13 +191,31 @@ class TestJenkinsBuild(unittest.TestCase):
|
||||||
|
|
||||||
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.test_dependencies')
|
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.test_dependencies')
|
||||||
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.JenkinsBuild.get_jenkins_connection')
|
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.JenkinsBuild.get_jenkins_connection')
|
||||||
def test_module_delete_build(self, jenkins_connection, test_deps):
|
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.JenkinsBuild.get_build_status')
|
||||||
|
def test_module_delete_build(self, build_status, jenkins_connection, test_deps):
|
||||||
test_deps.return_value = None
|
test_deps.return_value = None
|
||||||
jenkins_connection.return_value = JenkinsMock()
|
jenkins_connection.return_value = JenkinsMock()
|
||||||
|
build_status.return_value = JenkinsBuildMock().get_build_status()
|
||||||
|
|
||||||
with self.assertRaises(AnsibleExitJson):
|
with self.assertRaises(AnsibleExitJson):
|
||||||
set_module_args({
|
set_module_args({
|
||||||
"name": "host-check",
|
"name": "host-delete",
|
||||||
|
"build_number": "1234",
|
||||||
|
"state": "absent",
|
||||||
|
"user": "abc",
|
||||||
|
"token": "xyz"
|
||||||
|
})
|
||||||
|
jenkins_build.main()
|
||||||
|
|
||||||
|
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.test_dependencies')
|
||||||
|
@patch('ansible_collections.community.general.plugins.modules.jenkins_build.JenkinsBuild.get_jenkins_connection')
|
||||||
|
def test_module_delete_build_again(self, jenkins_connection, test_deps):
|
||||||
|
test_deps.return_value = None
|
||||||
|
jenkins_connection.return_value = JenkinsMockIdempotent()
|
||||||
|
|
||||||
|
with self.assertRaises(AnsibleFailJson):
|
||||||
|
set_module_args({
|
||||||
|
"name": "host-delete",
|
||||||
"build_number": "1234",
|
"build_number": "1234",
|
||||||
"state": "absent",
|
"state": "absent",
|
||||||
"user": "abc",
|
"user": "abc",
|
||||||
|
|
Loading…
Reference in a new issue