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