def test_get_perm_id(self, session): admin_perm_id = get_perm_id(session, 'admin') build_perm_id = get_perm_id(session, 'build') repo_perm_id = get_perm_id(session, 'repo') assert admin_perm_id == 1 assert build_perm_id == 2 assert repo_perm_id == 3 # Verify that we used cached data for the calls above: assert session.called == 1
def ensure_tag(session, name, check_mode, inheritance, external_repos, packages, groups, **kwargs): """ Ensure that this tag exists in Koji. :param session: Koji client session :param name: Koji tag name :param check_mode: don't make any changes :param inheritance: Koji tag inheritance settings. These will be translated for Koji's setInheritanceData RPC. :param external_repos: Koji external repos to set for this tag. :param packages: dict of packages to add ("whitelist") for this tag. If this is an empty dict, we don't touch the package list for this tag. :param groups: dict of comps groups to set for this tag. :param **kwargs: Pass remaining kwargs directly into Koji's createTag and editTag2 RPCs. """ taginfo = session.getTag(name) result = {'changed': False, 'stdout_lines': []} if not taginfo: if check_mode: result['stdout_lines'].append('would create tag %s' % name) result['changed'] = True return result common_koji.ensure_logged_in(session) if 'perm' in kwargs and kwargs['perm']: kwargs['perm'] = common_koji.get_perm_id(session, kwargs['perm']) id_ = session.createTag(name, parent=None, **kwargs) result['stdout_lines'].append('created tag id %d' % id_) result['changed'] = True taginfo = {'id': id_} # populate for inheritance management below else: # The tag name already exists. Ensure all the parameters are set. edits = {} edit_log = [] for key, value in kwargs.items(): if taginfo[key] != value and value is not None: edits[key] = value edit_log.append('%s: changed %s from "%s" to "%s"' % (name, key, taginfo[key], value)) # Find out which "extra" items we must explicitly remove # ("remove_extra" argument to editTag2). if 'extra' in kwargs and kwargs['extra'] is not None: for key in taginfo['extra']: if key not in kwargs['extra']: if 'remove_extra' not in edits: edits['remove_extra'] = [] edits['remove_extra'].append(key) if 'remove_extra' in edits: edit_log.append('%s: remove extra fields "%s"' % (name, '", "'.join(edits['remove_extra']))) if edits: result['stdout_lines'].extend(edit_log) result['changed'] = True if not check_mode: common_koji.ensure_logged_in(session) session.editTag2(name, **edits) # Ensure inheritance rules are all set. if inheritance not in (None, ['']): inheritance_result = ensure_inheritance(session, name, taginfo['id'], check_mode, inheritance) if inheritance_result['changed']: result['changed'] = True result['stdout_lines'].extend(inheritance_result['stdout_lines']) # Ensure external repos. if external_repos not in (None, ['']): repos_result = ensure_external_repos(session, name, check_mode, external_repos) if repos_result['changed']: result['changed'] = True result['stdout_lines'].extend(repos_result['stdout_lines']) # Ensure package list. if packages not in (None, ''): if not isinstance(packages, dict): raise ValueError('packages must be a dict') packages_result = ensure_packages(session, name, taginfo['id'], check_mode, packages) if packages_result['changed']: result['changed'] = True result['stdout_lines'].extend(packages_result['stdout_lines']) # Ensure group list. if groups not in (None, ''): if not isinstance(groups, dict): raise ValueError('groups must be a dict') groups_result = ensure_groups(session, taginfo['id'], check_mode, groups) if groups_result['changed']: result['changed'] = True result['stdout_lines'].extend(groups_result['stdout_lines']) return result