def ensure_user(client, params, check_mode): result = {'changed': False, 'stdout_lines': []} params = {param: val for param, val in params.items() if val is not None} login_name = params['login_name'] user = get_user(client, login_name) if not user: result['changed'] = True result['stdout_lines'] = ['created %s user' % login_name] if not check_mode: create_user(client, params) return result user_id = user.pop('id') differences = common_errata_tool.diff_settings(user, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: # Hack for CLOUDWF-2817 - If the user's receives_mail attribute is # true, we must always send the intended email_address as well. if params['receives_mail']: keys = [difference[0] for difference in differences] if 'email_address' not in keys: differences.append( ('email_address', '', user['email_address'])) edit_user(client, user_id, differences) return result
def ensure_release(client, params, check_mode): # Note: this looks identical to the diff_product() method. # Maybe we can generalize this. result = {'changed': False, 'stdout_lines': []} params = {param: val for param, val in params.items() if val is not None} # Special-case state_machine_rule_set, because it's an enum, and it's # important to be able to set this back to "null" if desired: if params.get('state_machine_rule_set') == '': params['state_machine_rule_set'] = None name = params['name'] release = get_release(client, name) if not release: result['changed'] = True result['stdout_lines'] = ['created %s' % name] if not check_mode: create_release(client, params) return result differences = common_errata_tool.diff_settings(release, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: # CLOUDWF-6: we must send product_version_ids in every request, # or the server will reset the product versions to an empty list. keys = [difference[0] for difference in differences] if 'product_versions' not in keys: differences.append( ('product_versions', params['product_versions'], params['product_versions'])) edit_release(client, release['id'], differences) return result
def ensure_release(client, params, check_mode): # Note: this looks identical to the diff_product() method. # Maybe we can generalize this. result = {'changed': False, 'stdout_lines': []} name = params['name'] release = get_release(client, name) if not release: result['changed'] = True result['stdout_lines'] = ['created %s' % name] if not check_mode: create_release(client, params) return result differences = common_errata_tool.diff_settings(release, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: # ERRATA-9867: we must send product_version_ids in every request, # or the server will reset the product versions to an empty list. changing_product_versions = False for difference in differences: key, _, _ = difference if key == 'product_versions': changing_product_versions = True break if not changing_product_versions: differences.append( ('product_versions', params['product_versions'], params['product_versions'])) edit_release(client, release['id'], differences) return result
def ensure_cdn_repo(client, check_mode, params): """ Ensure that this CDN repo exists in the Errata Tool. :param client: Errata Client :param bool check_mode: describe what would happen, but don't do it. :param dict params: Parameters from ansible """ result = {'changed': False, 'stdout_lines': []} params = {param: val for param, val in params.items() if val is not None} name = params['name'] # Special handling for packages parameter: params = params.copy() packages = params.pop('packages') package_names = list(packages.keys()) params['package_names'] = package_names packages = normalize_packages(packages) # main cdn_repo cdn_repo = get_cdn_repo(client, name) if not cdn_repo: result['changed'] = True result['stdout_lines'] = ['created %s' % name] result['diff'] = prepare_diff_data(cdn_repo, params, {}, packages) if check_mode: return result cdn_repo = create_cdn_repo(client, params) differences = common_errata_tool.diff_settings(cdn_repo, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: # CLOUDWF-316 to access cdn_repos directly by name. edit_cdn_repo(client, cdn_repo['id'], differences) # packages (from /api/v1/cdn_repo_package_tags): package_tag_changes, current_packages = \ ensure_packages_tags(client, name, check_mode, packages) if package_tag_changes: result['changed'] = True result['stdout_lines'].extend(package_tag_changes) # (Don't redo the diff if the repo was just created) if result['changed'] and 'diff' not in result: result['diff'] = prepare_diff_data(cdn_repo, params, current_packages, packages) return result
def ensure_product(client, params, check_mode): result = {'changed': False, 'stdout_lines': []} short_name = params['short_name'] product = get_product(client, short_name) if not product: result['changed'] = True result['stdout_lines'] = ['created %s product' % short_name] if not check_mode: create_product(client, params) return result differences = common_errata_tool.diff_settings(product, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: edit_product(client, product['id'], params) return result
def ensure_user(client, params, check_mode): result = {'changed': False, 'stdout_lines': []} login_name = params['login_name'] user = get_user(client, login_name) if not user: result['changed'] = True result['stdout_lines'] = ['created %s user' % login_name] if not check_mode: create_user(client, params) return result user_id = user.pop('id') differences = common_errata_tool.diff_settings(user, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: edit_user(client, user_id, differences) return result
def ensure_product_version(client, params, check_mode): result = {'changed': False, 'stdout_lines': []} product = params['product'] name = params['name'] product_version = get_product_version(client, product, name) if not product_version: result['changed'] = True result['stdout_lines'] = ['created %s product version' % name] if not check_mode: create_product_version(client, product, params) return result differences = common_errata_tool.diff_settings(product_version, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: edit_product_version(client, product_version, differences) return result
def ensure_cdn_repo(client, check_mode, params): """ Ensure that this CDN repo exists in the Errata Tool. :param client: Errata Client :param bool check_mode: describe what would happen, but don't do it. :param dict params: Parameters from ansible """ result = {'changed': False, 'stdout_lines': []} name = params['name'] # Special handling for packages parameter: params = params.copy() packages = params.pop('packages') package_names = list(packages.keys()) params['package_names'] = package_names packages = normalize_packages(packages) # main cdn_repo cdn_repo = get_cdn_repo(client, name) if not cdn_repo: result['changed'] = True result['stdout_lines'] = ['created %s' % name] if check_mode: return result cdn_repo = create_cdn_repo(client, params) differences = common_errata_tool.diff_settings(cdn_repo, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: # ERRATA-9728 to access cdn_repos directly by name. edit_cdn_repo(client, cdn_repo['id'], differences) # packages (from /api/v1/cdn_repo_package_tags): package_tag_changes = ensure_packages_tags(client, name, check_mode, packages) if package_tag_changes: result['changed'] = True result['stdout_lines'].extend(package_tag_changes) return result
def ensure_variant(client, params, check_mode): result = {'changed': False, 'stdout_lines': []} params = {param: val for param, val in params.items() if val is not None} name = params['name'] variant = get_variant(client, name) if not variant: result['changed'] = True result['stdout_lines'] = ['created %s variant' % name] if not check_mode: create_variant(client, params) return result differences = common_errata_tool.diff_settings(variant, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: edit_variant(client, variant['id'], differences) return result
def ensure_variant(client, params, check_mode): result = {'changed': False, 'stdout_lines': []} name = params['name'] variant = get_variant(client, name) if not variant: result['changed'] = True result['stdout_lines'] = ['created %s variant' % name] if not check_mode: create_variant(client, params) return result # Don't print a diff for CPE if it was omitted if params['cpe'] is None: params.pop('cpe') differences = common_errata_tool.diff_settings(variant, params) if differences: result['changed'] = True changes = common_errata_tool.describe_changes(differences) result['stdout_lines'].extend(changes) if not check_mode: edit_variant(client, variant['id'], differences) return result
def test_list(self): settings = {'active': True, 'push_targets': ['cdn']} params = {'active': True, 'push_targets': ['cdn', 'cdn_stage']} differences = diff_settings(settings, params) assert differences == [('push_targets', ['cdn'], ['cdn', 'cdn_stage'])]
def test_simple(self): settings = {'active': False, 'push_targets': ['cdn']} params = {'active': True, 'push_targets': ['cdn']} differences = diff_settings(settings, params) assert differences == [('active', False, True)]