1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Fix a logical flaw when deleting a build in the jenkins_build module (#5514)

* 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>
This commit is contained in:
Tong He 2022-11-11 04:18:01 +08:00 committed by GitHub
parent 6b20572ea1
commit 7610501c66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 5 deletions

View file

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

View file

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

View file

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