bstinson / centos / releng

Forked from centos/releng 3 years ago
Clone

Blame koji-tags/library/koji_target.py

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()