mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
feat(gitlab_runner module): Add support for the new runner creation workflow (#7199)
feat(gitlab_runner module): Handle new runner creation workflow
This commit is contained in:
parent
65f58afbd9
commit
6b00b76f32
2 changed files with 56 additions and 19 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- gitlab_runner - add support for new runner creation workflow (https://github.com/ansible-collections/community.general/pull/7199).
|
|
@ -48,6 +48,7 @@ options:
|
||||||
description:
|
description:
|
||||||
- ID or full path of the group in the form group/subgroup.
|
- ID or full path of the group in the form group/subgroup.
|
||||||
- Mutually exclusive with O(owned) and O(project).
|
- Mutually exclusive with O(owned) and O(project).
|
||||||
|
- Must be group's numeric ID if O(registration_token) is not set and O(state=present).
|
||||||
type: str
|
type: str
|
||||||
version_added: '6.5.0'
|
version_added: '6.5.0'
|
||||||
project:
|
project:
|
||||||
|
@ -55,6 +56,7 @@ options:
|
||||||
- ID or full path of the project in the form of group/name.
|
- ID or full path of the project in the form of group/name.
|
||||||
- Mutually exclusive with O(owned) since community.general 4.5.0.
|
- Mutually exclusive with O(owned) since community.general 4.5.0.
|
||||||
- Mutually exclusive with O(group).
|
- Mutually exclusive with O(group).
|
||||||
|
- Must be project's numeric ID if O(registration_token) is not set and O(state=present).
|
||||||
type: str
|
type: str
|
||||||
version_added: '3.7.0'
|
version_added: '3.7.0'
|
||||||
description:
|
description:
|
||||||
|
@ -73,8 +75,11 @@ options:
|
||||||
type: str
|
type: str
|
||||||
registration_token:
|
registration_token:
|
||||||
description:
|
description:
|
||||||
- The registration token is used to register new runners.
|
- The registration token is used to register new runners before GitLab 16.0.
|
||||||
- Required if O(state=present).
|
- Required if O(state=present) for GitLab < 16.0.
|
||||||
|
- If set, the runner will be created using the old runner creation workflow.
|
||||||
|
- If not set, the runner will be created using the new runner creation workflow, introduced in GitLab 16.0.
|
||||||
|
- If not set, requires python-gitlab >= 4.0.0.
|
||||||
type: str
|
type: str
|
||||||
owned:
|
owned:
|
||||||
description:
|
description:
|
||||||
|
@ -87,9 +92,18 @@ options:
|
||||||
active:
|
active:
|
||||||
description:
|
description:
|
||||||
- Define if the runners is immediately active after creation.
|
- Define if the runners is immediately active after creation.
|
||||||
|
- Mutually exclusive with O(paused).
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
type: bool
|
type: bool
|
||||||
|
paused:
|
||||||
|
description:
|
||||||
|
- Define if the runners is active or paused after creation.
|
||||||
|
- Mutually exclusive with O(active).
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: bool
|
||||||
|
version_added: 8.1.0
|
||||||
locked:
|
locked:
|
||||||
description:
|
description:
|
||||||
- Determines if the runner is locked or not.
|
- Determines if the runner is locked or not.
|
||||||
|
@ -210,6 +224,9 @@ from ansible_collections.community.general.plugins.module_utils.gitlab import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
|
||||||
|
|
||||||
|
|
||||||
class GitLabRunner(object):
|
class GitLabRunner(object):
|
||||||
def __init__(self, module, gitlab_instance, group=None, project=None):
|
def __init__(self, module, gitlab_instance, group=None, project=None):
|
||||||
self._module = module
|
self._module = module
|
||||||
|
@ -232,18 +249,32 @@ class GitLabRunner(object):
|
||||||
changed = False
|
changed = False
|
||||||
|
|
||||||
arguments = {
|
arguments = {
|
||||||
'active': options['active'],
|
|
||||||
'locked': options['locked'],
|
'locked': options['locked'],
|
||||||
'run_untagged': options['run_untagged'],
|
'run_untagged': options['run_untagged'],
|
||||||
'maximum_timeout': options['maximum_timeout'],
|
'maximum_timeout': options['maximum_timeout'],
|
||||||
'tag_list': options['tag_list'],
|
'tag_list': options['tag_list'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.get('paused') is not None:
|
||||||
|
arguments['paused'] = options['paused']
|
||||||
|
else:
|
||||||
|
arguments['active'] = options['active']
|
||||||
|
|
||||||
if options.get('access_level') is not None:
|
if options.get('access_level') is not None:
|
||||||
arguments['access_level'] = options['access_level']
|
arguments['access_level'] = options['access_level']
|
||||||
# Because we have already call userExists in main()
|
# Because we have already call userExists in main()
|
||||||
if self.runner_object is None:
|
if self.runner_object is None:
|
||||||
arguments['description'] = description
|
arguments['description'] = description
|
||||||
arguments['token'] = options['registration_token']
|
if options.get('registration_token') is not None:
|
||||||
|
arguments['token'] = options['registration_token']
|
||||||
|
elif options.get('group') is not None:
|
||||||
|
arguments['runner_type'] = 'group_type'
|
||||||
|
arguments['group_id'] = options['group']
|
||||||
|
elif options.get('project') is not None:
|
||||||
|
arguments['runner_type'] = 'project_type'
|
||||||
|
arguments['project_id'] = options['project']
|
||||||
|
else:
|
||||||
|
arguments['runner_type'] = 'instance_type'
|
||||||
|
|
||||||
access_level_on_creation = self._module.params['access_level_on_creation']
|
access_level_on_creation = self._module.params['access_level_on_creation']
|
||||||
if not access_level_on_creation:
|
if not access_level_on_creation:
|
||||||
|
@ -253,19 +284,17 @@ class GitLabRunner(object):
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
changed, runner = self.update_runner(self.runner_object, arguments)
|
changed, runner = self.update_runner(self.runner_object, arguments)
|
||||||
|
if changed:
|
||||||
|
if self._module.check_mode:
|
||||||
|
self._module.exit_json(changed=True, msg="Successfully updated the runner %s" % description)
|
||||||
|
|
||||||
|
try:
|
||||||
|
runner.save()
|
||||||
|
except Exception as e:
|
||||||
|
self._module.fail_json(msg="Failed to update runner: %s " % to_native(e))
|
||||||
|
|
||||||
self.runner_object = runner
|
self.runner_object = runner
|
||||||
if changed:
|
return changed
|
||||||
if self._module.check_mode:
|
|
||||||
self._module.exit_json(changed=True, msg="Successfully created or updated the runner %s" % description)
|
|
||||||
|
|
||||||
try:
|
|
||||||
runner.save()
|
|
||||||
except Exception as e:
|
|
||||||
self._module.fail_json(msg="Failed to update runner: %s " % to_native(e))
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@param arguments Attributes of the runner
|
@param arguments Attributes of the runner
|
||||||
|
@ -275,7 +304,12 @@ class GitLabRunner(object):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
runner = self._gitlab.runners.create(arguments)
|
if arguments.get('token') is not None:
|
||||||
|
runner = self._gitlab.runners.create(arguments)
|
||||||
|
elif LooseVersion(gitlab.__version__) < LooseVersion('4.0.0'):
|
||||||
|
self._module.fail_json(msg="New runner creation workflow requires python-gitlab 4.0.0 or higher")
|
||||||
|
else:
|
||||||
|
runner = self._gitlab.user.runners.create(arguments)
|
||||||
except (gitlab.exceptions.GitlabCreateError) as e:
|
except (gitlab.exceptions.GitlabCreateError) as e:
|
||||||
self._module.fail_json(msg="Failed to create runner: %s " % to_native(e))
|
self._module.fail_json(msg="Failed to create runner: %s " % to_native(e))
|
||||||
|
|
||||||
|
@ -348,6 +382,7 @@ def main():
|
||||||
argument_spec.update(dict(
|
argument_spec.update(dict(
|
||||||
description=dict(type='str', required=True, aliases=["name"]),
|
description=dict(type='str', required=True, aliases=["name"]),
|
||||||
active=dict(type='bool', default=True),
|
active=dict(type='bool', default=True),
|
||||||
|
paused=dict(type='bool', default=False),
|
||||||
owned=dict(type='bool', default=False),
|
owned=dict(type='bool', default=False),
|
||||||
tag_list=dict(type='list', elements='str', default=[]),
|
tag_list=dict(type='list', elements='str', default=[]),
|
||||||
run_untagged=dict(type='bool', default=True),
|
run_untagged=dict(type='bool', default=True),
|
||||||
|
@ -372,6 +407,7 @@ def main():
|
||||||
['project', 'owned'],
|
['project', 'owned'],
|
||||||
['group', 'owned'],
|
['group', 'owned'],
|
||||||
['project', 'group'],
|
['project', 'group'],
|
||||||
|
['active', 'paused'],
|
||||||
],
|
],
|
||||||
required_together=[
|
required_together=[
|
||||||
['api_username', 'api_password'],
|
['api_username', 'api_password'],
|
||||||
|
@ -379,9 +415,6 @@ def main():
|
||||||
required_one_of=[
|
required_one_of=[
|
||||||
['api_username', 'api_token', 'api_oauth_token', 'api_job_token'],
|
['api_username', 'api_token', 'api_oauth_token', 'api_job_token'],
|
||||||
],
|
],
|
||||||
required_if=[
|
|
||||||
('state', 'present', ['registration_token']),
|
|
||||||
],
|
|
||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
ensure_gitlab_package(module)
|
ensure_gitlab_package(module)
|
||||||
|
@ -432,6 +465,8 @@ def main():
|
||||||
"access_level": access_level,
|
"access_level": access_level,
|
||||||
"maximum_timeout": maximum_timeout,
|
"maximum_timeout": maximum_timeout,
|
||||||
"registration_token": registration_token,
|
"registration_token": registration_token,
|
||||||
|
"group": group,
|
||||||
|
"project": project,
|
||||||
}):
|
}):
|
||||||
module.exit_json(changed=True, runner=gitlab_runner.runner_object._attrs,
|
module.exit_json(changed=True, runner=gitlab_runner.runner_object._attrs,
|
||||||
msg="Successfully created or updated the runner %s" % runner_description)
|
msg="Successfully created or updated the runner %s" % runner_description)
|
||||||
|
|
Loading…
Reference in a new issue