|
|
6e61fb |
#!/usr/bin/python
|
|
|
6e61fb |
from ansible.module_utils.basic import AnsibleModule
|
|
|
6e61fb |
from ansible.module_utils import common_koji
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
ANSIBLE_METADATA = {
|
|
|
6e61fb |
'metadata_version': '1.0',
|
|
|
6e61fb |
'status': ['preview'],
|
|
|
6e61fb |
'supported_by': 'community'
|
|
|
6e61fb |
}
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
DOCUMENTATION = '''
|
|
|
6e61fb |
---
|
|
|
6e61fb |
module: koji_target
|
|
|
6e61fb |
|
|
|
6e61fb |
short_description: Create and manage Koji targets
|
|
|
6e61fb |
description:
|
|
|
6e61fb |
- Create, update, and delete targets within Koji.
|
|
|
6e61fb |
options:
|
|
|
6e61fb |
name:
|
|
|
6e61fb |
description:
|
|
|
6e61fb |
- The name of the Koji target to create and manage.
|
|
|
6e61fb |
required: true
|
|
|
6e61fb |
build_tag:
|
|
|
6e61fb |
description:
|
|
|
6e61fb |
- The name of the "build" or "buildroot" tag. The latest builds in
|
|
|
6e61fb |
this tag will be available in the buildroot when you build an RPM or
|
|
|
6e61fb |
container for this Koji target.
|
|
|
6e61fb |
- 'Example: "f29-build"'
|
|
|
6e61fb |
required: true
|
|
|
6e61fb |
dest_tag:
|
|
|
6e61fb |
description:
|
|
|
6e61fb |
- The name of the "destination" tag. When Koji completes a build for
|
|
|
6e61fb |
this target, it will tag that build into this destination tag.
|
|
|
6e61fb |
- 'Example: "f29-updates-candidate"'
|
|
|
6e61fb |
required: true
|
|
|
6e61fb |
requirements:
|
|
|
6e61fb |
- "python >= 2.7"
|
|
|
6e61fb |
- "koji"
|
|
|
6e61fb |
'''
|
|
|
6e61fb |
|
|
|
6e61fb |
EXAMPLES = '''
|
|
|
6e61fb |
- name: create a koji target
|
|
|
6e61fb |
hosts: localhost
|
|
|
6e61fb |
tasks:
|
|
|
6e61fb |
|
|
|
6e61fb |
- name: Configure CBS target
|
|
|
6e61fb |
koji_target:
|
|
|
6e61fb |
name: storage7-ceph-nautilus-el7
|
|
|
6e61fb |
build_tag: storage7-ceph-nautilus-el7-build
|
|
|
6e61fb |
dest_tag: storage7-ceph-nautilus-candidate
|
|
|
6e61fb |
'''
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
def ensure_target(session, name, check_mode, build_tag, dest_tag):
|
|
|
6e61fb |
"""
|
|
|
6e61fb |
Ensure that this target exists in Koji.
|
|
|
6e61fb |
|
|
|
6e61fb |
:param session: Koji client session
|
|
|
6e61fb |
:param name: Koji target name
|
|
|
6e61fb |
:param check_mode: don't make any changes
|
|
|
6e61fb |
:param build_tag: Koji build tag name, eg. "f29-build"
|
|
|
6e61fb |
:param dest_tag: Koji destination tag name, eg "f29-updates-candidate"
|
|
|
6e61fb |
"""
|
|
|
6e61fb |
targetinfo = session.getBuildTarget(name)
|
|
|
6e61fb |
result = {'changed': False, 'stdout_lines': []}
|
|
|
6e61fb |
if not targetinfo:
|
|
|
6e61fb |
result['changed'] = True
|
|
|
6e61fb |
if check_mode:
|
|
|
6e61fb |
result['stdout_lines'].append('would create target %s' % name)
|
|
|
6e61fb |
return result
|
|
|
6e61fb |
common_koji.ensure_logged_in(session)
|
|
|
6e61fb |
session.createBuildTarget(name, build_tag, dest_tag)
|
|
|
6e61fb |
targetinfo = session.getBuildTarget(name)
|
|
|
6e61fb |
result['stdout_lines'].append('created target %s' % targetinfo['id'])
|
|
|
6e61fb |
# Ensure the build and destination tags are set for this target.
|
|
|
6e61fb |
needs_edit = False
|
|
|
6e61fb |
if build_tag != targetinfo['build_tag_name']:
|
|
|
6e61fb |
needs_edit = True
|
|
|
6e61fb |
result['stdout_lines'].append('build_tag_name: %s' % build_tag)
|
|
|
6e61fb |
if dest_tag != targetinfo['dest_tag_name']:
|
|
|
6e61fb |
needs_edit = True
|
|
|
6e61fb |
result['stdout_lines'].append('dest_tag_name: %s' % dest_tag)
|
|
|
6e61fb |
if needs_edit:
|
|
|
6e61fb |
result['changed'] = True
|
|
|
6e61fb |
if check_mode:
|
|
|
6e61fb |
return result
|
|
|
6e61fb |
common_koji.ensure_logged_in(session)
|
|
|
6e61fb |
session.editBuildTarget(name, name, build_tag, dest_tag)
|
|
|
6e61fb |
return result
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
def delete_target(session, name, check_mode):
|
|
|
6e61fb |
""" Ensure that this tag is deleted from Koji. """
|
|
|
6e61fb |
targetinfo = session.getBuildTarget(name)
|
|
|
6e61fb |
result = dict(
|
|
|
6e61fb |
stdout='',
|
|
|
6e61fb |
changed=False,
|
|
|
6e61fb |
)
|
|
|
6e61fb |
if targetinfo:
|
|
|
6e61fb |
result['stdout'] = 'deleted target %d' % targetinfo['id']
|
|
|
6e61fb |
result['changed'] = True
|
|
|
6e61fb |
if not check_mode:
|
|
|
6e61fb |
common_koji.ensure_logged_in(session)
|
|
|
6e61fb |
session.deleteBuildTarget(targetinfo['id'])
|
|
|
6e61fb |
return result
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
def run_module():
|
|
|
6e61fb |
module_args = dict(
|
|
|
6e61fb |
koji=dict(type='str', required=False),
|
|
|
6e61fb |
name=dict(type='str', required=True),
|
|
|
6e61fb |
state=dict(type='str', choices=[
|
|
|
6e61fb |
'present', 'absent'], required=False, default='present'),
|
|
|
6e61fb |
build_tag=dict(type='str', required=True),
|
|
|
6e61fb |
dest_tag=dict(type='str', required=True),
|
|
|
6e61fb |
)
|
|
|
6e61fb |
module = AnsibleModule(
|
|
|
6e61fb |
argument_spec=module_args,
|
|
|
6e61fb |
supports_check_mode=True
|
|
|
6e61fb |
)
|
|
|
6e61fb |
|
|
|
6e61fb |
if not common_koji.HAS_KOJI:
|
|
|
6e61fb |
module.fail_json(msg='koji is required for this module')
|
|
|
6e61fb |
|
|
|
6e61fb |
check_mode = module.check_mode
|
|
|
6e61fb |
params = module.params
|
|
|
6e61fb |
profile = params['koji']
|
|
|
6e61fb |
name = params['name']
|
|
|
6e61fb |
state = params['state']
|
|
|
6e61fb |
build_tag = params['build_tag']
|
|
|
6e61fb |
dest_tag = params['dest_tag']
|
|
|
6e61fb |
|
|
|
6e61fb |
session = common_koji.get_session(profile)
|
|
|
6e61fb |
|
|
|
6e61fb |
if state == 'present':
|
|
|
6e61fb |
result = ensure_target(session, name, check_mode, build_tag, dest_tag)
|
|
|
6e61fb |
elif state == 'absent':
|
|
|
6e61fb |
result = delete_target(session, name, check_mode)
|
|
|
6e61fb |
|
|
|
6e61fb |
module.exit_json(**result)
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
def main():
|
|
|
6e61fb |
run_module()
|
|
|
6e61fb |
|
|
|
6e61fb |
|
|
|
6e61fb |
if __name__ == '__main__':
|
|
|
6e61fb |
main()
|