Blame koji-tags/library/koji_external_repo.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_external_repo
6e61fb
6e61fb
short_description: Create and manage Koji external repos
6e61fb
description:
6e61fb
   - Create and manage Koji external repos
6e61fb
options:
6e61fb
   name:
6e61fb
     description:
6e61fb
       - The name of the Koji external repo to create and manage.
6e61fb
     required: true
6e61fb
   url:
6e61fb
     description:
6e61fb
       - The URL to the Koji external repo.
6e61fb
       - Note, this uses "$arch", not the common "$basearch" you may find in a
6e61fb
         typical Yum repository file.
6e61fb
       - For idempotency, please ensure your url always ends with a "/"
6e61fb
         character. If you leave it out, Koji Hub will automatically add a "/"
6e61fb
         slash when storing this value in the database, and every subsequent
6e61fb
         Ansible run will appear to be "changing" the external repo's URL.
6e61fb
     required: true
6e61fb
requirements:
6e61fb
  - "python >= 2.7"
6e61fb
  - "koji"
6e61fb
'''
6e61fb
6e61fb
EXAMPLES = '''
6e61fb
- name: create a koji tag with an external repo.
6e61fb
  hosts: localhost
6e61fb
  tasks:
6e61fb
    - name: Create an external repo for CentOS "CR"
6e61fb
      koji_external_repo:
6e61fb
        name: centos7-cr
6e61fb
        url: http://mirror.centos.org/centos/7/cr/$arch/
6e61fb
        state: present
6e61fb
6e61fb
    - name: Create a koji tag that uses the CentOS CR repo
6e61fb
      koji_tag:
6e61fb
        name: storage7-ceph-nautilus-el7-build
6e61fb
        state: present
6e61fb
        external_repos:
6e61fb
        - repo: centos7-cr
6e61fb
          priority: 5
6e61fb
'''
6e61fb
6e61fb
RETURN = ''' # '''
6e61fb
6e61fb
6e61fb
def ensure_external_repo(session, name, check_mode, url):
6e61fb
    """
6e61fb
    Ensure that this external repo exists in Koji.
6e61fb
6e61fb
    :param session: Koji client session
6e61fb
    :param name: Koji external repo name
6e61fb
    :param check_mode: don't make any changes
6e61fb
    :param url: URL to this external repo
6e61fb
    """
6e61fb
    repoinfo = session.getExternalRepo(name)
6e61fb
    result = {'changed': False, 'stdout_lines': []}
6e61fb
    if not repoinfo:
6e61fb
        if check_mode:
6e61fb
            result['stdout_lines'].append('would create repo %s' % name)
6e61fb
            result['changed'] = True
6e61fb
            return result
6e61fb
        common_koji.ensure_logged_in(session)
6e61fb
        repoinfo = session.createExternalRepo(name, url)
6e61fb
        result['stdout_lines'].append('created repo id %d' % repoinfo['id'])
6e61fb
        result['changed'] = True
6e61fb
        return result
6e61fb
    if repoinfo['url'] != url:
6e61fb
        result['stdout_lines'].append('set url to %s' % url)
6e61fb
        result['changed'] = True
6e61fb
        if not check_mode:
6e61fb
            common_koji.ensure_logged_in(session)
6e61fb
            session.editExternalRepo(info=repoinfo['id'], url=url)
6e61fb
    return result
6e61fb
6e61fb
6e61fb
def delete_external_repo(session, name, check_mode):
6e61fb
    """ Ensure that this external_repo is deleted from Koji. """
6e61fb
    repoinfo = session.getExternalRepo(name)
6e61fb
    result = dict(
6e61fb
        stdout='',
6e61fb
        changed=False,
6e61fb
    )
6e61fb
    if repoinfo:
6e61fb
        result['stdout'] = 'deleted external repo %s' % name
6e61fb
        result['changed'] = True
6e61fb
        if not check_mode:
6e61fb
            common_koji.ensure_logged_in(session)
6e61fb
            session.deleteExternalRepo(name)
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
        url=dict(type='str', required=False, default=None),
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
    url = params['url']
6e61fb
6e61fb
    session = common_koji.get_session(profile)
6e61fb
6e61fb
    if state == 'present':
6e61fb
        if not url:
6e61fb
            module.fail_json(msg='you must set a url for this external_repo')
6e61fb
        result = ensure_external_repo(session, name, check_mode, url)
6e61fb
    elif state == 'absent':
6e61fb
        result = delete_external_repo(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()