From d7b6d8b11e74d7cf1b3341d8046202f960ce46f0 Mon Sep 17 00:00:00 2001 From: yanpliu Date: Thu, 7 Mar 2024 04:18:15 -0500 Subject: [PATCH 001/150] add verify virt-who data is uploaded on satellite post satellite upgrade (#14260) --- tests/upgrades/test_virtwho.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/upgrades/test_virtwho.py b/tests/upgrades/test_virtwho.py index ca785ab0149..3691e3a8d70 100644 --- a/tests/upgrades/test_virtwho.py +++ b/tests/upgrades/test_virtwho.py @@ -118,6 +118,8 @@ def test_pre_create_virt_who_configuration( 'hypervisor_name': hypervisor_name, 'guest_name': guest_name, 'org_id': org.id, + 'org_name': org.name, + 'org_label': org.label, } ) @@ -131,15 +133,19 @@ def test_post_crud_virt_who_configuration(self, form_data, pre_upgrade_data, tar 1. Post upgrade, Verify virt-who exists and has same status. 2. Verify the connection of the guest on Content host. 3. Verify the virt-who config-file exists. - 4. Update virt-who config with new name. - 5. Delete virt-who config. + 4. Verify Report is sent to satellite. + 5. Update virt-who config with new name. + 6. Delete virt-who config. :expectedresults: 1. virt-who config is intact post upgrade. 2. the config and guest connection have the same status. - 3. virt-who config should update and delete successfully. + 3. Report is sent to satellite. + 4. virt-who config should update and delete successfully. """ org_id = pre_upgrade_data.get('org_id') + org_name = pre_upgrade_data.get('org_name') + org_label = pre_upgrade_data.get('org_label') # Post upgrade, Verify virt-who exists and has same status. vhd = target_sat.api.VirtWhoConfig(organization_id=org_id).search( @@ -172,6 +178,18 @@ def test_post_crud_virt_who_configuration(self, form_data, pre_upgrade_data, tar config_file = get_configure_file(vhd.id) get_configure_option('hypervisor_id', config_file), + # Verify Report is sent to satellite. + command = get_configure_command(vhd.id, org=org_name) + deploy_configure_by_command( + command, form_data['hypervisor_type'], debug=True, org=org_label + ) + virt_who_instance = ( + target_sat.api.VirtWhoConfig(organization_id=org_id) + .search(query={'search': f'name={form_data["name"]}'})[0] + .status + ) + assert virt_who_instance == 'ok' + # Update virt-who config modify_name = gen_string('alpha') vhd.name = modify_name From 215ddea047c05d936f764a93800a9a6ee9da6a97 Mon Sep 17 00:00:00 2001 From: dosas Date: Thu, 7 Mar 2024 12:55:43 +0100 Subject: [PATCH 002/150] Fix pytest deprecation warning (#14205) Fix pytest deprecation warning: Applying a mark to a fixture function never had any effect but is a common user error. see: https://docs.pytest.org/en/stable/deprecations.html#applying-a-mark-to-a-fixture-function --- pytest_fixtures/component/host.py | 1 - pytest_fixtures/component/puppet.py | 2 -- pytest_fixtures/component/satellite_auth.py | 8 -------- tests/foreman/api/test_contentview.py | 7 ------- tests/foreman/cli/test_computeresource_libvirt.py | 1 - tests/foreman/cli/test_host.py | 1 - tests/foreman/destructive/test_ldap_authentication.py | 1 - 7 files changed, 21 deletions(-) diff --git a/pytest_fixtures/component/host.py b/pytest_fixtures/component/host.py index 11645f89f84..ece968e28e7 100644 --- a/pytest_fixtures/component/host.py +++ b/pytest_fixtures/component/host.py @@ -21,7 +21,6 @@ def module_model(): return entities.Model().create() -@pytest.mark.skip_if_not_set('clients', 'fake_manifest') @pytest.fixture(scope="module") def setup_rhst_repo(module_target_sat): """Prepare Satellite tools repository for usage in specified organization""" diff --git a/pytest_fixtures/component/puppet.py b/pytest_fixtures/component/puppet.py index 0ff20685674..38cad7163c0 100644 --- a/pytest_fixtures/component/puppet.py +++ b/pytest_fixtures/component/puppet.py @@ -1,7 +1,6 @@ # Puppet Environment fixtures import pytest -from robottelo.config import settings from robottelo.constants import ENVIRONMENT @@ -55,7 +54,6 @@ def module_puppet_environment(module_puppet_org, module_puppet_loc, session_pupp return session_puppet_enabled_sat.api.Environment(id=environment.id).read() -@pytest.mark.skipif((not settings.robottelo.repos_hosting_url), reason='Missing repos_hosting_url') @pytest.fixture(scope='module') def module_import_puppet_module(session_puppet_enabled_sat): """Returns custom puppet environment name that contains imported puppet module diff --git a/pytest_fixtures/component/satellite_auth.py b/pytest_fixtures/component/satellite_auth.py index 0a1031c9e25..4eb984390f6 100644 --- a/pytest_fixtures/component/satellite_auth.py +++ b/pytest_fixtures/component/satellite_auth.py @@ -334,7 +334,6 @@ def enable_external_auth_rhsso( default_sso_host.set_the_redirect_uri() -@pytest.mark.external_auth @pytest.fixture(scope='module') def module_enroll_idm_and_configure_external_auth(module_target_sat): ipa_host = IPAHost(module_target_sat) @@ -343,7 +342,6 @@ def module_enroll_idm_and_configure_external_auth(module_target_sat): ipa_host.disenroll_idm() -@pytest.mark.external_auth @pytest.fixture def func_enroll_idm_and_configure_external_auth(target_sat): ipa_host = IPAHost(target_sat) @@ -410,19 +408,16 @@ def rhsso_setting_setup_with_timeout(module_target_sat, rhsso_setting_setup): setting_entity.update({'value'}) -@pytest.mark.external_auth @pytest.fixture(scope='module') def module_enroll_ad_and_configure_external_auth(ad_data, module_target_sat): module_target_sat.enroll_ad_and_configure_external_auth(ad_data) -@pytest.mark.external_auth @pytest.fixture def func_enroll_ad_and_configure_external_auth(ad_data, target_sat): target_sat.enroll_ad_and_configure_external_auth(ad_data) -@pytest.mark.external_auth @pytest.fixture def configure_hammer_no_creds(parametrized_enrolled_sat): """Configures hammer to use sessions and negotiate auth.""" @@ -433,7 +428,6 @@ def configure_hammer_no_creds(parametrized_enrolled_sat): parametrized_enrolled_sat.execute(f'mv -f {HAMMER_CONFIG}.backup {HAMMER_CONFIG}') -@pytest.mark.external_auth @pytest.fixture def configure_hammer_negotiate(parametrized_enrolled_sat, configure_hammer_no_creds): """Configures hammer to use sessions and negotiate auth.""" @@ -448,7 +442,6 @@ def configure_hammer_negotiate(parametrized_enrolled_sat, configure_hammer_no_cr parametrized_enrolled_sat.execute(f'mv -f {HAMMER_CONFIG}.backup {HAMMER_CONFIG}') -@pytest.mark.external_auth @pytest.fixture def configure_hammer_no_negotiate(parametrized_enrolled_sat): """Configures hammer not to use automatic negotiation.""" @@ -458,7 +451,6 @@ def configure_hammer_no_negotiate(parametrized_enrolled_sat): parametrized_enrolled_sat.execute(f'mv -f {HAMMER_CONFIG}.backup {HAMMER_CONFIG}') -@pytest.mark.external_auth @pytest.fixture def hammer_logout(parametrized_enrolled_sat): """Logout in Hammer.""" diff --git a/tests/foreman/api/test_contentview.py b/tests/foreman/api/test_contentview.py index 438ecdf3ca4..73575dd4b1a 100644 --- a/tests/foreman/api/test_contentview.py +++ b/tests/foreman/api/test_contentview.py @@ -369,9 +369,6 @@ def test_negative_create_with_invalid_name(self, name, target_sat): class TestContentViewPublishPromote: """Tests for publishing and promoting content views.""" - @pytest.mark.skipif( - (not settings.robottelo.REPOS_HOSTING_URL), reason='Missing repos_hosting_url' - ) @pytest.fixture(scope='class', autouse=True) def class_setup(self, request, module_product, class_target_sat): """Set up organization, product and repositories for tests.""" @@ -1429,9 +1426,6 @@ def test_negative_non_readonly_user_actions(target_sat, content_view, function_r class TestOstreeContentView: """Tests for ostree contents in content views.""" - @pytest.mark.skipif( - (not settings.robottelo.REPOS_HOSTING_URL), reason='Missing repos_hosting_url' - ) @pytest.fixture(scope='class', autouse=True) def initiate_testclass(self, request, module_product, class_target_sat): """Set up organization, product and repositories for tests.""" @@ -1536,7 +1530,6 @@ def test_positive_publish_promote_with_custom_ostree_and_other(self, content_vie class TestContentViewRedHatOstreeContent: """Tests for publishing and promoting cv with RH ostree contents.""" - @pytest.mark.run_in_one_thread @pytest.fixture(scope='class', autouse=True) def initiate_testclass(self, request, module_entitlement_manifest_org, class_target_sat): """Set up organization, product and repositories for tests.""" diff --git a/tests/foreman/cli/test_computeresource_libvirt.py b/tests/foreman/cli/test_computeresource_libvirt.py index 7f4fdd7526a..a53959f277b 100644 --- a/tests/foreman/cli/test_computeresource_libvirt.py +++ b/tests/foreman/cli/test_computeresource_libvirt.py @@ -101,7 +101,6 @@ def invalid_update_data(): @pytest.fixture(scope="module") -@pytest.mark.skip_if_not_set('libvirt') def libvirt_url(): return LIBVIRT_RESOURCE_URL % settings.libvirt.libvirt_hostname diff --git a/tests/foreman/cli/test_host.py b/tests/foreman/cli/test_host.py index 8bbc6cc4a2d..f7e69591f23 100644 --- a/tests/foreman/cli/test_host.py +++ b/tests/foreman/cli/test_host.py @@ -1797,7 +1797,6 @@ def test_positive_install_package_via_rex( # -------------------------- HOST SUBSCRIPTION SUBCOMMAND FIXTURES -------------------------- -@pytest.mark.skip_if_not_set('clients') @pytest.fixture def host_subscription_client(rhel7_contenthost, target_sat): rhel7_contenthost.install_katello_ca(target_sat) diff --git a/tests/foreman/destructive/test_ldap_authentication.py b/tests/foreman/destructive/test_ldap_authentication.py index ecedf803e00..304c608734a 100644 --- a/tests/foreman/destructive/test_ldap_authentication.py +++ b/tests/foreman/destructive/test_ldap_authentication.py @@ -115,7 +115,6 @@ def rhsso_groups_teardown(module_target_sat, default_sso_host): default_sso_host.delete_rhsso_group(group_name) -@pytest.mark.external_auth @pytest.fixture def configure_hammer_session(parametrized_enrolled_sat, enable=True): """Take backup of the hammer config file and enable use_sessions""" From 9012e2f927e0664b67bcbd0b12756de4c438811b Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Thu, 7 Mar 2024 13:00:56 +0100 Subject: [PATCH 003/150] Wait for product HTTP Proxy update to finish (#14269) --- tests/foreman/cli/test_http_proxy.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/foreman/cli/test_http_proxy.py b/tests/foreman/cli/test_http_proxy.py index fc0028eed78..68ea95559ca 100644 --- a/tests/foreman/cli/test_http_proxy.py +++ b/tests/foreman/cli/test_http_proxy.py @@ -272,6 +272,13 @@ def test_positive_assign_http_proxy_to_products(module_org, module_target_sat): } ) assert 'Product proxy updated' in res + module_target_sat.wait_for_tasks( + search_query=( + f'Actions::Katello::Repository::Update and organization_id = {module_org.id}' + ), + max_tries=5, + poll_rate=10, + ) for repo in repo_a1, repo_a2, repo_b1, repo_b2: result = module_target_sat.cli.Repository.info({'id': repo['id']}) assert result['http-proxy']['http-proxy-policy'] == 'use_selected_http_proxy' @@ -293,6 +300,13 @@ def test_positive_assign_http_proxy_to_products(module_org, module_target_sat): {'ids': f"{product_a['id']},{product_b['id']}", 'http-proxy-policy': 'none'} ) assert 'Product proxy updated' in res + module_target_sat.wait_for_tasks( + search_query=( + f'Actions::Katello::Repository::Update and organization_id = {module_org.id}' + ), + max_tries=5, + poll_rate=10, + ) for repo in repo_a1, repo_a2, repo_b1, repo_b2: result = module_target_sat.cli.Repository.info({'id': repo['id']}) assert result['http-proxy']['http-proxy-policy'] == 'none' From 808efeb51f0a516e41b35bfd43161cbaf8ed8691 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Thu, 7 Mar 2024 17:31:48 +0530 Subject: [PATCH 004/150] Extend ansible-roles add/remove test for nested HG (#14272) * Extend ansible-roles add/remove test for nested HG Signed-off-by: Gaurav Talreja * Fix step 1 in docstring as per grammer Co-authored-by: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> --------- Signed-off-by: Gaurav Talreja Co-authored-by: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> --- tests/foreman/api/test_ansible.py | 44 ++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/tests/foreman/api/test_ansible.py b/tests/foreman/api/test_ansible.py index 730e469b0e0..cc491b29ea8 100644 --- a/tests/foreman/api/test_ansible.py +++ b/tests/foreman/api/test_ansible.py @@ -209,6 +209,7 @@ def test_positive_ansible_job_on_multiple_host( @pytest.mark.e2e @pytest.mark.tier2 +@pytest.mark.upgrade def test_add_and_remove_ansible_role_hostgroup(target_sat): """ Test add and remove functionality for ansible roles in hostgroup via API @@ -216,11 +217,12 @@ def test_add_and_remove_ansible_role_hostgroup(target_sat): :id: 7672cf86-fa31-11ed-855a-0fd307d2d66b :steps: - 1. Create a hostgroup - 2. Sync few ansible roles + 1. Create a hostgroup and a nested hostgroup + 2. Sync a few ansible roles 3. Assign a few ansible roles with the host group 4. Add some ansible role with the host group - 5. Remove the added ansible roles from the host group + 5. Add some ansible roles to the nested hostgroup + 6. Remove the added ansible roles from the parent and nested hostgroup :expectedresults: 1. Ansible role assign/add/remove functionality should work as expected in API @@ -231,29 +233,57 @@ def test_add_and_remove_ansible_role_hostgroup(target_sat): 'theforeman.foreman_scap_client', 'redhat.satellite.hostgroups', 'RedHatInsights.insights-client', + 'redhat.satellite.compute_resources', ] hg = target_sat.api.HostGroup(name=gen_string('alpha')).create() + hg_nested = target_sat.api.HostGroup(name=gen_string('alpha'), parent=hg).create() proxy_id = target_sat.nailgun_smart_proxy.id target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': ROLE_NAMES}) ROLES = [ target_sat.api.AnsibleRoles().search(query={'search': f'name={role}'})[0].id for role in ROLE_NAMES ] + # Assign first 2 roles to HG and verify it target_sat.api.HostGroup(id=hg.id).assign_ansible_roles(data={'ansible_role_ids': ROLES[:2]}) for r1, r2 in zip( target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:2], strict=True ): assert r1['name'] == r2 + + # Add next role from list to HG and verify it target_sat.api.HostGroup(id=hg.id).add_ansible_role(data={'ansible_role_id': ROLES[2]}) for r1, r2 in zip( - target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES, strict=True + target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:3], strict=True ): assert r1['name'] == r2 - for role in ROLES: + # Add next role to nested HG, and verify roles are also nested to HG along with assigned role + # Also, ensure the parent HG does not contain the roles assigned to nested HGs + target_sat.api.HostGroup(id=hg_nested.id).add_ansible_role(data={'ansible_role_id': ROLES[3]}) + for r1, r2 in zip( + target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles(), + [ROLE_NAMES[-1]] + ROLE_NAMES[:-1], + strict=True, + ): + assert r1['name'] == r2 + + for r1, r2 in zip( + target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:3], strict=True + ): + assert r1['name'] == r2 + + # Remove roles assigned one by one from HG and nested HG + for role in ROLES[:3]: target_sat.api.HostGroup(id=hg.id).remove_ansible_role(data={'ansible_role_id': role}) - host_roles = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() - assert len(host_roles) == 0 + hg_roles = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() + assert len(hg_roles) == 0 + + for role in ROLES: + target_sat.api.HostGroup(id=hg_nested.id).remove_ansible_role( + data={'ansible_role_id': role} + ) + hg_nested_roles = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() + assert len(hg_nested_roles) == 0 @pytest.fixture From 9519bd0205b49b4ef579a877f3fcbff3d889ef4a Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Thu, 7 Mar 2024 13:03:06 +0100 Subject: [PATCH 005/150] Fix test_content_access_after_stopped_foreman (#14279) --- tests/foreman/destructive/test_contenthost.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/foreman/destructive/test_contenthost.py b/tests/foreman/destructive/test_contenthost.py index bf3b0264d2c..c098f86c065 100644 --- a/tests/foreman/destructive/test_contenthost.py +++ b/tests/foreman/destructive/test_contenthost.py @@ -30,14 +30,13 @@ def test_content_access_after_stopped_foreman(target_sat, rhel7_contenthost): :CaseImportance: Medium - :CaseComponent: Infrastructure + :CaseComponent: Hosts-Content - :Team: Platform + :Team: Phoenix-subscriptions :parametrized: yes """ org = target_sat.api.Organization().create() - org.sca_disable() lce = target_sat.api.LifecycleEnvironment(organization=org).create() repos_collection = target_sat.cli_factory.RepositoryCollection( distro='rhel7', From d552f16e80a168f4dd0cd632949d6d7455ca1452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:43:53 +0530 Subject: [PATCH 006/150] Bump pytest from 8.0.2 to 8.1.0 (#14243) Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.0.2 to 8.1.0. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.0.2...8.1.0) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 68b47607dd8..71a01c94ee7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,7 @@ paramiko==3.4.0 # Temporary until Broker is back on PyPi productmd==1.38 pyotp==2.9.0 python-box==7.1.1 -pytest==8.0.2 +pytest==8.1.0 pytest-order==1.2.0 pytest-services==2.2.1 pytest-mock==3.12.0 From 22180e79123c38faf4d64336e334f7e91acd801b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:44:16 +0530 Subject: [PATCH 007/150] Bump pytest-reportportal from 5.3.1 to 5.4.0 (#14244) Bumps [pytest-reportportal](https://github.com/reportportal/agent-python-pytest) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/reportportal/agent-python-pytest/releases) - [Changelog](https://github.com/reportportal/agent-python-pytest/blob/develop/CHANGELOG.md) - [Commits](https://github.com/reportportal/agent-python-pytest/compare/5.3.1...5.4.0) --- updated-dependencies: - dependency-name: pytest-reportportal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 71a01c94ee7..d24cbfaee2c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,7 @@ pytest==8.1.0 pytest-order==1.2.0 pytest-services==2.2.1 pytest-mock==3.12.0 -pytest-reportportal==5.3.1 +pytest-reportportal==5.4.0 pytest-xdist==3.5.0 pytest-fixturecollection==0.1.2 pytest-ibutsu==2.2.4 From db19610b89dd4577b59f27555382c4aa736eaa3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Gajdu=C5=A1ek?= Date: Thu, 7 Mar 2024 17:04:10 +0100 Subject: [PATCH 008/150] Add flake8-simplify and flake8-return to ruff config (#14100) --- conf/dynaconf_hooks.py | 3 +- pyproject.toml | 2 + pytest_fixtures/component/activationkey.py | 15 +-- pytest_fixtures/component/architecture.py | 6 +- pytest_fixtures/component/contentview.py | 3 +- pytest_fixtures/component/os.py | 3 +- pytest_fixtures/component/provision_azure.py | 24 ++--- .../component/provision_capsule_pxe.py | 2 +- pytest_fixtures/component/provision_gce.py | 18 ++-- pytest_fixtures/component/provision_pxe.py | 2 +- pytest_fixtures/component/provision_vmware.py | 3 +- .../component/provisioning_template.py | 7 +- pytest_fixtures/component/puppet.py | 6 +- pytest_fixtures/component/repository.py | 6 +- pytest_fixtures/component/rh_cloud.py | 3 +- pytest_fixtures/component/satellite_auth.py | 3 +- pytest_fixtures/component/user.py | 3 +- pytest_fixtures/core/broker.py | 1 + pytest_fixtures/core/reporting.py | 15 +-- pytest_fixtures/core/ui.py | 9 +- pytest_fixtures/core/upgrade.py | 3 +- pytest_plugins/fixture_markers.py | 3 +- pytest_plugins/logging_hooks.py | 64 +++++++------ pytest_plugins/rerun_rp/rerun_rp.py | 2 +- pytest_plugins/sanity_plugin.py | 10 +- pytest_plugins/settings_skip.py | 2 +- pytest_plugins/upgrade/scenario_workers.py | 1 + pytest_plugins/video_cleanup.py | 23 +++-- robottelo/cli/base.py | 18 +--- robottelo/cli/capsule.py | 40 ++------ robottelo/cli/hammer.py | 10 +- robottelo/cli/host.py | 16 +--- robottelo/cli/lifecycleenvironment.py | 4 +- robottelo/cli/operatingsys.py | 24 ++--- robottelo/cli/product.py | 12 +-- robottelo/cli/srpm.py | 8 +- robottelo/cli/template.py | 8 +- robottelo/cli/template_sync.py | 8 +- robottelo/cli/webhook.py | 3 +- robottelo/config/__init__.py | 2 +- robottelo/host_helpers/api_factory.py | 13 +-- robottelo/host_helpers/capsule_mixins.py | 6 +- robottelo/host_helpers/cli_factory.py | 59 ++++++------ robottelo/host_helpers/repository_mixins.py | 3 +- robottelo/host_helpers/satellite_mixins.py | 18 ++-- robottelo/hosts.py | 12 ++- robottelo/ssh.py | 3 +- robottelo/utils/datafactory.py | 25 ++--- robottelo/utils/decorators/func_locker.py | 12 +-- .../utils/decorators/func_shared/shared.py | 3 +- robottelo/utils/io/__init__.py | 1 + robottelo/utils/issue_handlers/__init__.py | 5 +- robottelo/utils/ohsnap.py | 7 +- robottelo/utils/report_portal/portal.py | 3 +- robottelo/utils/ssh.py | 3 +- robottelo/utils/vault.py | 62 ++++++------- robottelo/utils/virtwho.py | 42 ++++----- scripts/config_helpers.py | 4 +- scripts/customer_scenarios.py | 18 ++-- scripts/fixture_cli.py | 14 +-- scripts/graph_entities.py | 4 +- tests/foreman/api/test_activationkey.py | 6 +- tests/foreman/api/test_capsulecontent.py | 4 +- .../api/test_computeresource_azurerm.py | 2 +- tests/foreman/api/test_contentview.py | 3 +- tests/foreman/api/test_errata.py | 11 +-- tests/foreman/api/test_filter.py | 3 +- tests/foreman/api/test_hostcollection.py | 3 +- tests/foreman/api/test_multiple_paths.py | 18 ++-- tests/foreman/api/test_organization.py | 2 +- .../foreman/api/test_provisioningtemplate.py | 2 +- tests/foreman/api/test_registration.py | 4 +- tests/foreman/api/test_repository.py | 4 +- tests/foreman/api/test_role.py | 2 +- tests/foreman/api/test_subscription.py | 3 +- .../foreman/api/test_template_combination.py | 4 +- tests/foreman/api/test_templatesync.py | 24 ++--- tests/foreman/cli/test_activationkey.py | 7 +- .../cli/test_computeresource_azurerm.py | 91 +++++++++---------- .../cli/test_computeresource_libvirt.py | 2 +- tests/foreman/cli/test_contentview.py | 2 +- tests/foreman/cli/test_docker.py | 2 +- tests/foreman/cli/test_domain.py | 8 +- tests/foreman/cli/test_errata.py | 6 +- tests/foreman/cli/test_filter.py | 3 +- tests/foreman/cli/test_host.py | 10 +- tests/foreman/cli/test_leapp_client.py | 5 +- tests/foreman/cli/test_registration.py | 8 +- tests/foreman/cli/test_remoteexecution.py | 2 +- tests/foreman/cli/test_reporttemplates.py | 2 +- tests/foreman/cli/test_repository.py | 4 +- tests/foreman/cli/test_role.py | 2 +- tests/foreman/cli/test_satellitesync.py | 6 +- tests/foreman/cli/test_subscription.py | 5 +- tests/foreman/cli/test_templatesync.py | 2 +- tests/foreman/cli/test_user.py | 4 +- tests/foreman/cli/test_usergroup.py | 7 +- tests/foreman/conftest.py | 9 +- .../destructive/test_capsule_loadbalancer.py | 4 +- .../destructive/test_discoveredhost.py | 3 +- .../destructive/test_ldap_authentication.py | 5 +- tests/foreman/destructive/test_realm.py | 4 +- tests/foreman/longrun/test_inc_updates.py | 6 +- tests/foreman/longrun/test_oscap.py | 5 +- tests/foreman/maintain/test_advanced.py | 3 +- tests/foreman/ui/test_acs.py | 2 +- tests/foreman/ui/test_capsulecontent.py | 2 +- tests/foreman/ui/test_containerimagetag.py | 2 +- tests/foreman/ui/test_contenthost.py | 2 +- tests/foreman/ui/test_discoveredhost.py | 3 +- tests/foreman/ui/test_host.py | 17 ++-- tests/foreman/ui/test_hostcollection.py | 11 +-- tests/foreman/ui/test_ldap_authentication.py | 28 +++--- tests/foreman/ui/test_organization.py | 2 +- tests/foreman/ui/test_provisioningtemplate.py | 2 +- tests/foreman/ui/test_registration.py | 2 +- tests/foreman/ui/test_subscription.py | 5 +- tests/robottelo/conftest.py | 7 +- tests/robottelo/test_cli.py | 18 ++-- tests/robottelo/test_decorators.py | 4 +- tests/robottelo/test_dependencies.py | 5 +- tests/robottelo/test_func_locker.py | 53 ++++++----- tests/upgrades/conftest.py | 29 +++--- tests/upgrades/test_activation_key.py | 3 +- tests/upgrades/test_classparameter.py | 2 +- tests/upgrades/test_host.py | 3 +- tests/upgrades/test_puppet.py | 3 +- tests/upgrades/test_satellite_maintain.py | 3 +- tests/upgrades/test_subscription.py | 2 +- 129 files changed, 537 insertions(+), 697 deletions(-) diff --git a/conf/dynaconf_hooks.py b/conf/dynaconf_hooks.py index 6d09d6e5bec..4249ce4e604 100644 --- a/conf/dynaconf_hooks.py +++ b/conf/dynaconf_hooks.py @@ -157,7 +157,7 @@ def get_dogfood_satclient_repos(settings): def get_ohsnap_repo_url(settings, repo, product=None, release=None, os_release=None, snap=''): - repourl = dogfood_repository( + return dogfood_repository( settings.ohsnap, repo=repo, product=product, @@ -165,4 +165,3 @@ def get_ohsnap_repo_url(settings, repo, product=None, release=None, os_release=N os_release=os_release, snap=snap, ).baseurl - return repourl diff --git a/pyproject.toml b/pyproject.toml index 4f5c8af613f..72a8e2b8f3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,8 @@ select = [ "I", # isort # "Q", # flake8-quotes "PT", # flake8-pytest + "RET", # flake8-return + "SIM", # flake8-simplify "UP", # pyupgrade "W", # pycodestyle ] diff --git a/pytest_fixtures/component/activationkey.py b/pytest_fixtures/component/activationkey.py index b0f7c77bd8a..982775670ae 100644 --- a/pytest_fixtures/component/activationkey.py +++ b/pytest_fixtures/component/activationkey.py @@ -8,41 +8,37 @@ @pytest.fixture(scope='module') def module_activation_key(module_sca_manifest_org, module_target_sat): """Create activation key using default CV and library environment.""" - activation_key = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( content_view=module_sca_manifest_org.default_content_view.id, environment=module_sca_manifest_org.library.id, organization=module_sca_manifest_org, ).create() - return activation_key @pytest.fixture(scope='module') def module_ak(module_lce, module_org, module_target_sat): - ak = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( environment=module_lce, organization=module_org, ).create() - return ak @pytest.fixture(scope='module') def module_ak_with_cv(module_lce, module_org, module_promoted_cv, module_target_sat): - ak = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( content_view=module_promoted_cv, environment=module_lce, organization=module_org, ).create() - return ak @pytest.fixture(scope='module') def module_ak_with_cv_repo(module_lce, module_org, module_cv_repo, module_target_sat): - ak = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( content_view=module_cv_repo, environment=module_lce, organization=module_org, ).create() - return ak @pytest.fixture(scope='module') @@ -55,7 +51,7 @@ def module_ak_with_synced_repo(module_org, module_target_sat): {'product-id': new_product['id'], 'content-type': 'yum'} ) Repository.synchronize({'id': new_repo['id']}) - ak = module_target_sat.cli_factory.make_activation_key( + return module_target_sat.cli_factory.make_activation_key( { 'lifecycle-environment': 'Library', 'content-view': 'Default Organization View', @@ -63,4 +59,3 @@ def module_ak_with_synced_repo(module_org, module_target_sat): 'auto-attach': False, } ) - return ak diff --git a/pytest_fixtures/component/architecture.py b/pytest_fixtures/component/architecture.py index 96d758f3d64..5ff90f3cb37 100644 --- a/pytest_fixtures/component/architecture.py +++ b/pytest_fixtures/component/architecture.py @@ -6,22 +6,20 @@ @pytest.fixture(scope='session') def default_architecture(session_target_sat): - arch = ( + return ( session_target_sat.api.Architecture() .search(query={'search': f'name="{DEFAULT_ARCHITECTURE}"'})[0] .read() ) - return arch @pytest.fixture(scope='session') def session_puppet_default_architecture(session_puppet_enabled_sat): - arch = ( + return ( session_puppet_enabled_sat.api.Architecture() .search(query={'search': f'name="{DEFAULT_ARCHITECTURE}"'})[0] .read() ) - return arch @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/contentview.py b/pytest_fixtures/component/contentview.py index c1879f43338..79d66014949 100644 --- a/pytest_fixtures/component/contentview.py +++ b/pytest_fixtures/component/contentview.py @@ -36,12 +36,11 @@ def module_ak_cv_lce(module_org, module_lce, module_published_cv, module_target_ content_view_version = module_published_cv.version[0] content_view_version.promote(data={'environment_ids': module_lce.id}) module_published_cv = module_published_cv.read() - module_ak_with_cv_lce = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( content_view=module_published_cv, environment=module_lce, organization=module_org, ).create() - return module_ak_with_cv_lce @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/os.py b/pytest_fixtures/component/os.py index e6039c1b6f9..0c94baa09ce 100644 --- a/pytest_fixtures/component/os.py +++ b/pytest_fixtures/component/os.py @@ -26,8 +26,7 @@ def default_os( os.ptable.append(default_partitiontable) os.provisioning_template.append(default_pxetemplate) os.update(['architecture', 'ptable', 'provisioning_template']) - os = entities.OperatingSystem(id=os.id).read() - return os + return entities.OperatingSystem(id=os.id).read() @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/provision_azure.py b/pytest_fixtures/component/provision_azure.py index 27bcea16e1f..7e2a05f0707 100644 --- a/pytest_fixtures/component/provision_azure.py +++ b/pytest_fixtures/component/provision_azure.py @@ -44,17 +44,16 @@ def sat_azure_default_os(sat_azure): @pytest.fixture(scope='module') def sat_azure_default_architecture(sat_azure): - arch = ( + return ( sat_azure.api.Architecture() .search(query={'search': f'name="{DEFAULT_ARCHITECTURE}"'})[0] .read() ) - return arch @pytest.fixture(scope='session') def azurerm_settings(): - deps = { + return { 'tenant': settings.azurerm.tenant_id, 'app_ident': settings.azurerm.client_id, 'sub_id': settings.azurerm.subscription_id, @@ -62,7 +61,6 @@ def azurerm_settings(): 'secret': settings.azurerm.client_secret, 'region': settings.azurerm.azure_region.lower().replace(' ', ''), } - return deps @pytest.fixture(scope='session') @@ -86,7 +84,7 @@ def azurermclient(azurerm_settings): @pytest.fixture(scope='module') def module_azurerm_cr(azurerm_settings, sat_azure_org, sat_azure_loc, sat_azure): """Create AzureRM Compute Resource""" - azure_cr = sat_azure.api.AzureRMComputeResource( + return sat_azure.api.AzureRMComputeResource( name=gen_string('alpha'), provider='AzureRm', tenant=azurerm_settings['tenant'], @@ -97,7 +95,6 @@ def module_azurerm_cr(azurerm_settings, sat_azure_org, sat_azure_loc, sat_azure) organization=[sat_azure_org], location=[sat_azure_loc], ).create() - return azure_cr @pytest.fixture(scope='module') @@ -108,7 +105,7 @@ def module_azurerm_finishimg( module_azurerm_cr, ): """Creates Finish Template image on AzureRM Compute Resource""" - finish_image = sat_azure.api.Image( + return sat_azure.api.Image( architecture=sat_azure_default_architecture, compute_resource=module_azurerm_cr, name=gen_string('alpha'), @@ -116,7 +113,6 @@ def module_azurerm_finishimg( username=settings.azurerm.username, uuid=AZURERM_RHEL7_FT_IMG_URN, ).create() - return finish_image @pytest.fixture(scope='module') @@ -127,7 +123,7 @@ def module_azurerm_byos_finishimg( sat_azure, ): """Creates BYOS Finish Template image on AzureRM Compute Resource""" - finish_image = sat_azure.api.Image( + return sat_azure.api.Image( architecture=sat_azure_default_architecture, compute_resource=module_azurerm_cr, name=gen_string('alpha'), @@ -135,7 +131,6 @@ def module_azurerm_byos_finishimg( username=settings.azurerm.username, uuid=AZURERM_RHEL7_FT_BYOS_IMG_URN, ).create() - return finish_image @pytest.fixture(scope='module') @@ -146,7 +141,7 @@ def module_azurerm_cloudimg( module_azurerm_cr, ): """Creates cloudinit image on AzureRM Compute Resource""" - finish_image = sat_azure.api.Image( + return sat_azure.api.Image( architecture=sat_azure_default_architecture, compute_resource=module_azurerm_cr, name=gen_string('alpha'), @@ -155,7 +150,6 @@ def module_azurerm_cloudimg( uuid=AZURERM_RHEL7_UD_IMG_URN, user_data=True, ).create() - return finish_image @pytest.fixture(scope='module') @@ -166,7 +160,7 @@ def module_azurerm_gallery_finishimg( module_azurerm_cr, ): """Creates Shared Gallery Finish Template image on AzureRM Compute Resource""" - finish_image = sat_azure.api.Image( + return sat_azure.api.Image( architecture=sat_azure_default_architecture, compute_resource=module_azurerm_cr, name=gen_string('alpha'), @@ -174,7 +168,6 @@ def module_azurerm_gallery_finishimg( username=settings.azurerm.username, uuid=AZURERM_RHEL7_FT_GALLERY_IMG_URN, ).create() - return finish_image @pytest.fixture(scope='module') @@ -185,7 +178,7 @@ def module_azurerm_custom_finishimg( module_azurerm_cr, ): """Creates Custom Finish Template image on AzureRM Compute Resource""" - finish_image = sat_azure.api.Image( + return sat_azure.api.Image( architecture=sat_azure_default_architecture, compute_resource=module_azurerm_cr, name=gen_string('alpha'), @@ -193,4 +186,3 @@ def module_azurerm_custom_finishimg( username=settings.azurerm.username, uuid=AZURERM_RHEL7_FT_CUSTOM_IMG_URN, ).create() - return finish_image diff --git a/pytest_fixtures/component/provision_capsule_pxe.py b/pytest_fixtures/component/provision_capsule_pxe.py index 04a2c4fb475..4360ba6e4bd 100644 --- a/pytest_fixtures/component/provision_capsule_pxe.py +++ b/pytest_fixtures/component/provision_capsule_pxe.py @@ -209,7 +209,7 @@ def capsule_provisioning_rhel_content( releasever=constants.REPOS['kickstart'][name]['version'], ) # do not sync content repos for discovery based provisioning. - if not capsule_provisioning_sat.provisioning_type == 'discovery': + if capsule_provisioning_sat.provisioning_type != 'discovery': rh_repo_id = sat.api_factory.enable_rhrepo_and_fetchid( basearch=constants.DEFAULT_ARCHITECTURE, org_id=module_sca_manifest_org.id, diff --git a/pytest_fixtures/component/provision_gce.py b/pytest_fixtures/component/provision_gce.py index 4c11ecb0918..64b706d772e 100644 --- a/pytest_fixtures/component/provision_gce.py +++ b/pytest_fixtures/component/provision_gce.py @@ -53,12 +53,11 @@ def sat_gce_default_partition_table(sat_gce): @pytest.fixture(scope='module') def sat_gce_default_architecture(sat_gce): - arch = ( + return ( sat_gce.api.Architecture() .search(query={'search': f'name="{DEFAULT_ARCHITECTURE}"'})[0] .read() ) - return arch @pytest.fixture(scope='session') @@ -96,8 +95,7 @@ def gce_latest_rhel_uuid(googleclient): filter_expr=f'name:{GCE_TARGET_RHEL_IMAGE_NAME}*', ) latest_template_name = max(tpl.name for tpl in templates) - latest_template_uuid = next(tpl for tpl in templates if tpl.name == latest_template_name).uuid - return latest_template_uuid + return next(tpl for tpl in templates if tpl.name == latest_template_name).uuid @pytest.fixture(scope='session') @@ -116,7 +114,7 @@ def session_default_os(session_target_sat): @pytest.fixture(scope='module') def module_gce_compute(sat_gce, sat_gce_org, sat_gce_loc, gce_cert): - gce_cr = sat_gce.api.GCEComputeResource( + return sat_gce.api.GCEComputeResource( name=gen_string('alphanumeric'), provider='GCE', key_path=settings.gce.cert_path, @@ -124,7 +122,6 @@ def module_gce_compute(sat_gce, sat_gce_org, sat_gce_loc, gce_cert): organization=[sat_gce_org], location=[sat_gce_loc], ).create() - return gce_cr @pytest.fixture(scope='module') @@ -206,7 +203,7 @@ def gce_hostgroup( googleclient, ): """Sets Hostgroup for GCE Host Provisioning""" - hgroup = sat_gce.api.HostGroup( + return sat_gce.api.HostGroup( architecture=sat_gce_default_architecture, compute_resource=module_gce_compute, domain=sat_gce_domain, @@ -216,7 +213,6 @@ def gce_hostgroup( organization=[sat_gce_org], ptable=sat_gce_default_partition_table, ).create() - return hgroup @pytest.fixture(scope='module') @@ -250,7 +246,7 @@ def module_gce_cloudimg( sat_gce, ): """Creates cloudinit image on GCE Compute Resource""" - cloud_image = sat_gce.api.Image( + return sat_gce.api.Image( architecture=sat_gce_default_architecture, compute_resource=module_gce_compute, name=gen_string('alpha'), @@ -259,7 +255,6 @@ def module_gce_cloudimg( uuid=gce_custom_cloudinit_uuid, user_data=True, ).create() - return cloud_image @pytest.fixture(scope='module') @@ -271,7 +266,7 @@ def module_gce_finishimg( sat_gce, ): """Creates finish image on GCE Compute Resource""" - finish_image = sat_gce.api.Image( + return sat_gce.api.Image( architecture=sat_gce_default_architecture, compute_resource=module_gce_compute, name=gen_string('alpha'), @@ -279,7 +274,6 @@ def module_gce_finishimg( username=gen_string('alpha'), uuid=gce_latest_rhel_uuid, ).create() - return finish_image @pytest.fixture diff --git a/pytest_fixtures/component/provision_pxe.py b/pytest_fixtures/component/provision_pxe.py index 2fc375bc5f1..beef717d94d 100644 --- a/pytest_fixtures/component/provision_pxe.py +++ b/pytest_fixtures/component/provision_pxe.py @@ -70,7 +70,7 @@ def module_provisioning_rhel_content( releasever=constants.REPOS['kickstart'][name]['version'], ) # do not sync content repos for discovery based provisioning. - if not module_provisioning_sat.provisioning_type == 'discovery': + if module_provisioning_sat.provisioning_type != 'discovery': rh_repo_id = sat.api_factory.enable_rhrepo_and_fetchid( basearch=constants.DEFAULT_ARCHITECTURE, org_id=module_sca_manifest_org.id, diff --git a/pytest_fixtures/component/provision_vmware.py b/pytest_fixtures/component/provision_vmware.py index 507f180a158..385f49bae38 100644 --- a/pytest_fixtures/component/provision_vmware.py +++ b/pytest_fixtures/component/provision_vmware.py @@ -15,7 +15,7 @@ def vmware(request): @pytest.fixture(scope='module') def module_vmware_cr(module_provisioning_sat, module_sca_manifest_org, module_location, vmware): - vmware_cr = module_provisioning_sat.sat.api.VMWareComputeResource( + return module_provisioning_sat.sat.api.VMWareComputeResource( name=gen_string('alpha'), provider='Vmware', url=vmware.hostname, @@ -25,7 +25,6 @@ def module_vmware_cr(module_provisioning_sat, module_sca_manifest_org, module_lo organization=[module_sca_manifest_org], location=[module_location], ).create() - return vmware_cr @pytest.fixture diff --git a/pytest_fixtures/component/provisioning_template.py b/pytest_fixtures/component/provisioning_template.py index 97439a8a07a..294edcbb22e 100644 --- a/pytest_fixtures/component/provisioning_template.py +++ b/pytest_fixtures/component/provisioning_template.py @@ -17,8 +17,7 @@ def module_provisioningtemplate_default(module_org, module_location): provisioning_template.organization.append(module_org) provisioning_template.location.append(module_location) provisioning_template.update(['organization', 'location']) - provisioning_template = entities.ProvisioningTemplate(id=provisioning_template.id).read() - return provisioning_template + return entities.ProvisioningTemplate(id=provisioning_template.id).read() @pytest.fixture(scope='module') @@ -30,8 +29,7 @@ def module_provisioningtemplate_pxe(module_org, module_location): pxe_template.organization.append(module_org) pxe_template.location.append(module_location) pxe_template.update(['organization', 'location']) - pxe_template = entities.ProvisioningTemplate(id=pxe_template.id).read() - return pxe_template + return entities.ProvisioningTemplate(id=pxe_template.id).read() @pytest.fixture(scope='session') @@ -39,6 +37,7 @@ def default_partitiontable(): ptables = entities.PartitionTable().search(query={'search': f'name="{DEFAULT_PTABLE}"'}) if ptables: return ptables[0].read() + return None @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/puppet.py b/pytest_fixtures/component/puppet.py index 38cad7163c0..c531c7888ac 100644 --- a/pytest_fixtures/component/puppet.py +++ b/pytest_fixtures/component/puppet.py @@ -44,6 +44,7 @@ def default_puppet_environment(module_puppet_org, session_puppet_enabled_sat): ) if environments: return environments[0].read() + return None @pytest.fixture(scope='module') @@ -101,10 +102,7 @@ def module_puppet_classes( @pytest.fixture(scope='session', params=[True, False], ids=["puppet_enabled", "puppet_disabled"]) def parametrized_puppet_sat(request, session_target_sat, session_puppet_enabled_sat): - if request.param: - sat = session_puppet_enabled_sat - else: - sat = session_target_sat + sat = session_puppet_enabled_sat if request.param else session_target_sat return {'sat': sat, 'enabled': request.param} diff --git a/pytest_fixtures/component/repository.py b/pytest_fixtures/component/repository.py index ba92e497446..71848e3e7e7 100644 --- a/pytest_fixtures/component/repository.py +++ b/pytest_fixtures/component/repository.py @@ -68,8 +68,7 @@ def repo_setup(): product = entities.Product(organization=org).create() repo = entities.Repository(name=repo_name, product=product).create() lce = entities.LifecycleEnvironment(organization=org).create() - details = {'org': org, 'product': product, 'repo': repo, 'lce': lce} - return details + return {'org': org, 'product': product, 'repo': repo, 'lce': lce} @pytest.fixture(scope='module') @@ -190,7 +189,7 @@ def repos_collection(request, target_sat): """ repos = getattr(request, 'param', []) repo_distro, repos = _simplify_repos(request, repos) - _repos_collection = target_sat.cli_factory.RepositoryCollection( + return target_sat.cli_factory.RepositoryCollection( distro=repo_distro or request.getfixturevalue('distro'), repositories=[ getattr(target_sat.cli_factory, repo_name)(**repo_params) @@ -198,7 +197,6 @@ def repos_collection(request, target_sat): for repo_name, repo_params in repo.items() ], ) - return _repos_collection @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/rh_cloud.py b/pytest_fixtures/component/rh_cloud.py index ead92f68db2..fd035f653c3 100644 --- a/pytest_fixtures/component/rh_cloud.py +++ b/pytest_fixtures/component/rh_cloud.py @@ -15,7 +15,7 @@ def rhcloud_manifest_org(module_target_sat, module_extra_rhel_entitlement_manife def rhcloud_activation_key(module_target_sat, rhcloud_manifest_org): """A module-level fixture to create an Activation key in module_org""" purpose_addons = "test-addon1, test-addon2" - ak = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( content_view=rhcloud_manifest_org.default_content_view, organization=rhcloud_manifest_org, environment=module_target_sat.api.LifecycleEnvironment(id=rhcloud_manifest_org.library.id), @@ -25,7 +25,6 @@ def rhcloud_activation_key(module_target_sat, rhcloud_manifest_org): purpose_role='test-role', auto_attach=False, ).create() - return ak @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/satellite_auth.py b/pytest_fixtures/component/satellite_auth.py index 4eb984390f6..c6df8df1897 100644 --- a/pytest_fixtures/component/satellite_auth.py +++ b/pytest_fixtures/component/satellite_auth.py @@ -271,11 +271,12 @@ def auth_data(request, ad_data, ipa_data): ad_data['attr_login'] = LDAP_ATTR['login_ad'] ad_data['auth_type'] = auth_type return ad_data - elif auth_type == 'ipa': + if auth_type == 'ipa': ipa_data['server_type'] = LDAP_SERVER_TYPE['UI']['ipa'] ipa_data['attr_login'] = LDAP_ATTR['login'] ipa_data['auth_type'] = auth_type return ipa_data + return None @pytest.fixture(scope='module') diff --git a/pytest_fixtures/component/user.py b/pytest_fixtures/component/user.py index 3f4d1034e6e..a1b9b7a1a9f 100644 --- a/pytest_fixtures/component/user.py +++ b/pytest_fixtures/component/user.py @@ -9,5 +9,4 @@ def user_not_exists(request): if users: users[0].delete() return True - else: - return False + return False diff --git a/pytest_fixtures/core/broker.py b/pytest_fixtures/core/broker.py index 9d207fcd9d7..f3356dbbef5 100644 --- a/pytest_fixtures/core/broker.py +++ b/pytest_fixtures/core/broker.py @@ -16,6 +16,7 @@ def _default_sat(align_to_satellite): return Satellite.get_host_by_hostname(settings.server.hostname) except ContentHostError: return Satellite() + return None @contextmanager diff --git a/pytest_fixtures/core/reporting.py b/pytest_fixtures/core/reporting.py index baf9d3cde7d..c89c87d46da 100644 --- a/pytest_fixtures/core/reporting.py +++ b/pytest_fixtures/core/reporting.py @@ -35,13 +35,14 @@ def pytest_sessionstart(session): remove if resolved and set autouse=True for record_testsuite_timestamp_xml fixture """ - if get_xdist_worker_id(session) == 'master': - if session.config.pluginmanager.hasplugin('junitxml'): - xml = session.config._store.get(xml_key, None) - if xml: - xml.add_global_property( - 'start_time', datetime.datetime.utcnow().strftime(FMT_XUNIT_TIME) - ) + if get_xdist_worker_id(session) == 'master' and session.config.pluginmanager.hasplugin( + 'junitxml' + ): + xml = session.config._store.get(xml_key, None) + if xml: + xml.add_global_property( + 'start_time', datetime.datetime.utcnow().strftime(FMT_XUNIT_TIME) + ) @pytest.fixture(autouse=False, scope='session') diff --git a/pytest_fixtures/core/ui.py b/pytest_fixtures/core/ui.py index c266e363c7e..1c24d6f04a9 100644 --- a/pytest_fixtures/core/ui.py +++ b/pytest_fixtures/core/ui.py @@ -102,7 +102,8 @@ def ui_session_record_property(request, record_property): test_file_path = request.node.fspath.strpath if any(directory in test_file_path for directory in test_directories): for fixture in request.node.fixturenames: - if request.fixturename != fixture: - if isinstance(request.getfixturevalue(fixture), Satellite): - sat = request.getfixturevalue(fixture) - sat.record_property = record_property + if request.fixturename != fixture and isinstance( + request.getfixturevalue(fixture), Satellite + ): + sat = request.getfixturevalue(fixture) + sat.record_property = record_property diff --git a/pytest_fixtures/core/upgrade.py b/pytest_fixtures/core/upgrade.py index caf4532713b..5726f9f80a9 100644 --- a/pytest_fixtures/core/upgrade.py +++ b/pytest_fixtures/core/upgrade.py @@ -10,12 +10,11 @@ def dependent_scenario_name(request): """ This fixture is used to collect the dependent test case name. """ - depend_test_name = [ + return [ mark.kwargs['depend_on'].__name__ for mark in request.node.own_markers if 'depend_on' in mark.kwargs ][0] - return depend_test_name @pytest.fixture(scope="session") diff --git a/pytest_plugins/fixture_markers.py b/pytest_plugins/fixture_markers.py index 951be635ac6..f1e87d3b7f7 100644 --- a/pytest_plugins/fixture_markers.py +++ b/pytest_plugins/fixture_markers.py @@ -17,7 +17,7 @@ def pytest_generate_tests(metafunc): content_host_fixture = ''.join([i for i in TARGET_FIXTURES if i in metafunc.fixturenames]) if content_host_fixture in metafunc.fixturenames: function_marks = getattr(metafunc.function, 'pytestmark', []) - no_containers = any('no_containers' == mark.name for mark in function_marks) + no_containers = any(mark.name == 'no_containers' for mark in function_marks) # process eventual rhel_version_list markers matchers = [i.args for i in function_marks if i.name == 'rhel_ver_list'] list_params = [] @@ -87,6 +87,7 @@ def chost_rhelver(params): for param in params: if 'contenthost' in param: return params[param].get('rhel_version') + return None content_host_fixture_names = [m[0] for m in getmembers(contenthosts, isfunction)] for item in items: diff --git a/pytest_plugins/logging_hooks.py b/pytest_plugins/logging_hooks.py index 9cd7ea4c84f..c15136a647a 100644 --- a/pytest_plugins/logging_hooks.py +++ b/pytest_plugins/logging_hooks.py @@ -1,3 +1,4 @@ +import contextlib import logging import logzero @@ -13,10 +14,8 @@ robottelo_log_file, ) -try: +with contextlib.suppress(ImportError): from pytest_reportportal import RPLogger, RPLogHandler -except ImportError: - pass @pytest.fixture(autouse=True, scope='session') @@ -37,37 +36,36 @@ def configure_logging(request, worker_id): if use_rp_logger: logging.setLoggerClass(RPLogger) - if is_xdist_worker(request): - if f'{worker_id}' not in [h.get_name() for h in logger.handlers]: - # Track the core logger's file handler level, set it in case core logger wasn't set - worker_log_level = 'INFO' - handlers_to_remove = [ - h - for h in logger.handlers - if isinstance(h, logging.FileHandler) - and getattr(h, 'baseFilename', None) == str(robottelo_log_file) - ] - for handler in handlers_to_remove: - logger.removeHandler(handler) - worker_log_level = handler.level - worker_handler = logging.FileHandler( - robottelo_log_dir.joinpath(f'robottelo_{worker_id}.log') - ) - worker_handler.set_name(f'{worker_id}') - worker_handler.setFormatter(worker_formatter) - worker_handler.setLevel(worker_log_level) - logger.addHandler(worker_handler) - broker_log_setup( - level=logging_yaml.broker.level, - file_level=logging_yaml.broker.fileLevel, - formatter=worker_formatter, - path=robottelo_log_dir.joinpath(f'robottelo_{worker_id}.log'), - ) + if is_xdist_worker(request) and f'{worker_id}' not in [h.get_name() for h in logger.handlers]: + # Track the core logger's file handler level, set it in case core logger wasn't set + worker_log_level = 'INFO' + handlers_to_remove = [ + h + for h in logger.handlers + if isinstance(h, logging.FileHandler) + and getattr(h, 'baseFilename', None) == str(robottelo_log_file) + ] + for handler in handlers_to_remove: + logger.removeHandler(handler) + worker_log_level = handler.level + worker_handler = logging.FileHandler( + robottelo_log_dir.joinpath(f'robottelo_{worker_id}.log') + ) + worker_handler.set_name(f'{worker_id}') + worker_handler.setFormatter(worker_formatter) + worker_handler.setLevel(worker_log_level) + logger.addHandler(worker_handler) + broker_log_setup( + level=logging_yaml.broker.level, + file_level=logging_yaml.broker.fileLevel, + formatter=worker_formatter, + path=robottelo_log_dir.joinpath(f'robottelo_{worker_id}.log'), + ) - if use_rp_logger: - rp_handler = RPLogHandler(request.node.config.py_test_service) - rp_handler.setFormatter(worker_formatter) - # logger.addHandler(rp_handler) + if use_rp_logger: + rp_handler = RPLogHandler(request.node.config.py_test_service) + rp_handler.setFormatter(worker_formatter) + # logger.addHandler(rp_handler) def pytest_runtest_logstart(nodeid, location): diff --git a/pytest_plugins/rerun_rp/rerun_rp.py b/pytest_plugins/rerun_rp/rerun_rp.py index 5b14873a885..7007880ce4b 100644 --- a/pytest_plugins/rerun_rp/rerun_rp.py +++ b/pytest_plugins/rerun_rp/rerun_rp.py @@ -123,7 +123,7 @@ def pytest_collection_modifyitems(items, config): test_args['status'].append('SKIPPED') if fail_args: test_args['status'].append('FAILED') - if not fail_args == 'all': + if fail_args != 'all': defect_types = fail_args.split(',') allowed_args = [*rp.defect_types.keys()] if not set(defect_types).issubset(set(allowed_args)): diff --git a/pytest_plugins/sanity_plugin.py b/pytest_plugins/sanity_plugin.py index f955d9cf4ca..1d93a4b45f3 100644 --- a/pytest_plugins/sanity_plugin.py +++ b/pytest_plugins/sanity_plugin.py @@ -43,10 +43,12 @@ def pytest_collection_modifyitems(session, items, config): deselected.append(item) continue # Remove parametrization from organization test - if 'test_positive_create_with_name_and_description' in item.name: - if 'alphanumeric' not in item.name: - deselected.append(item) - continue + if ( + 'test_positive_create_with_name_and_description' in item.name + and 'alphanumeric' not in item.name + ): + deselected.append(item) + continue # Else select selected.append(item) diff --git a/pytest_plugins/settings_skip.py b/pytest_plugins/settings_skip.py index 6ee053adee5..e345338d5d8 100644 --- a/pytest_plugins/settings_skip.py +++ b/pytest_plugins/settings_skip.py @@ -22,7 +22,7 @@ def pytest_runtest_setup(item): skip_marker = item.get_closest_marker('skip_if_not_set', None) if skip_marker and skip_marker.args: options_set = {arg.upper() for arg in skip_marker.args} - settings_set = {key for key in settings.keys() if not key.endswith('_FOR_DYNACONF')} + settings_set = {key for key in settings if not key.endswith('_FOR_DYNACONF')} if not options_set.issubset(settings_set): invalid = options_set.difference(settings_set) raise ValueError( diff --git a/pytest_plugins/upgrade/scenario_workers.py b/pytest_plugins/upgrade/scenario_workers.py index 099ff1c0fe3..9deeb0ddf25 100644 --- a/pytest_plugins/upgrade/scenario_workers.py +++ b/pytest_plugins/upgrade/scenario_workers.py @@ -23,6 +23,7 @@ def save_worker_hostname(test_name, target_sat): def shared_workers(): if json_file.exists(): return json.loads(json_file.read_text()) + return None def get_worker_hostname_from_testname(test_name, shared_workers): diff --git a/pytest_plugins/video_cleanup.py b/pytest_plugins/video_cleanup.py index 08bbf5721d9..320864b7060 100644 --- a/pytest_plugins/video_cleanup.py +++ b/pytest_plugins/video_cleanup.py @@ -64,15 +64,14 @@ def pytest_runtest_makereport(item): 'longrepr': str(report.longrepr), } ) - if report.when == "teardown": - if item.nodeid in test_results: - result_info = test_results[item.nodeid] - if result_info.outcome == 'passed': - report.user_properties = [ - (key, value) for key, value in report.user_properties if key != 'video_url' - ] - session_id_tuple = next( - (t for t in report.user_properties if t[0] == 'session_id'), None - ) - session_id = session_id_tuple[1] if session_id_tuple else None - _clean_video(session_id, item.nodeid) + if report.when == "teardown" and item.nodeid in test_results: + result_info = test_results[item.nodeid] + if result_info.outcome == 'passed': + report.user_properties = [ + (key, value) for key, value in report.user_properties if key != 'video_url' + ] + session_id_tuple = next( + (t for t in report.user_properties if t[0] == 'session_id'), None + ) + session_id = session_id_tuple[1] if session_id_tuple else None + _clean_video(session_id, item.nodeid) diff --git a/robottelo/cli/base.py b/robottelo/cli/base.py index 247d17985e1..8d258500b27 100644 --- a/robottelo/cli/base.py +++ b/robottelo/cli/base.py @@ -139,9 +139,7 @@ def delete_parameter(cls, options=None, timeout=None): cls.command_sub = 'delete-parameter' - result = cls.execute(cls._construct_command(options), ignore_stderr=False, timeout=timeout) - - return result + return cls.execute(cls._construct_command(options), ignore_stderr=False, timeout=timeout) @classmethod def dump(cls, options=None, timeout=None): @@ -151,9 +149,7 @@ def dump(cls, options=None, timeout=None): cls.command_sub = 'dump' - result = cls.execute(cls._construct_command(options), ignore_stderr=False, timeout=timeout) - - return result + return cls.execute(cls._construct_command(options), ignore_stderr=False, timeout=timeout) @classmethod def _get_username_password(cls, username=None, password=None): @@ -211,16 +207,14 @@ def execute( ) if return_raw_response: return response - else: - return cls._handle_response(response, ignore_stderr=ignore_stderr) + return cls._handle_response(response, ignore_stderr=ignore_stderr) @classmethod def sm_execute(cls, command, hostname=None, timeout=None, **kwargs): """Executes the satellite-maintain cli commands on the server via ssh""" env_var = kwargs.get('env_var') or '' client = get_client(hostname=hostname or cls.hostname) - result = client.execute(f'{env_var} satellite-maintain {command}', timeout=timeout) - return result + return client.execute(f'{env_var} satellite-maintain {command}', timeout=timeout) @classmethod def exists(cls, options=None, search=None): @@ -375,6 +369,4 @@ def _construct_command(cls, options=None): if isinstance(val, list): val = ','.join(str(el) for el in val) tail += f' --{key}="{val}"' - cmd = f"{cls.command_base or ''} {cls.command_sub or ''} {tail.strip()} {cls.command_end or ''}" - - return cmd + return f"{cls.command_base or ''} {cls.command_sub or ''} {tail.strip()} {cls.command_end or ''}" diff --git a/robottelo/cli/capsule.py b/robottelo/cli/capsule.py index 2f27ba2f5c0..bb6825cc783 100644 --- a/robottelo/cli/capsule.py +++ b/robottelo/cli/capsule.py @@ -35,9 +35,7 @@ def content_add_lifecycle_environment(cls, options): cls.command_sub = 'content add-lifecycle-environment' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def content_available_lifecycle_environments(cls, options): @@ -45,9 +43,7 @@ def content_available_lifecycle_environments(cls, options): cls.command_sub = 'content available-lifecycle-environments' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def content_info(cls, options): @@ -55,9 +51,7 @@ def content_info(cls, options): cls.command_sub = 'content info' - result = cls.execute(cls._construct_command(options), output_format='json') - - return result + return cls.execute(cls._construct_command(options), output_format='json') @classmethod def content_lifecycle_environments(cls, options): @@ -65,9 +59,7 @@ def content_lifecycle_environments(cls, options): cls.command_sub = 'content lifecycle-environments' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def content_remove_lifecycle_environment(cls, options): @@ -75,9 +67,7 @@ def content_remove_lifecycle_environment(cls, options): cls.command_sub = 'content remove-lifecycle-environment' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def content_synchronization_status(cls, options): @@ -85,9 +75,7 @@ def content_synchronization_status(cls, options): cls.command_sub = 'content synchronization-status' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def content_synchronize(cls, options, return_raw_response=None, timeout=3600000): @@ -95,7 +83,7 @@ def content_synchronize(cls, options, return_raw_response=None, timeout=3600000) cls.command_sub = 'content synchronize' - result = cls.execute( + return cls.execute( cls._construct_command(options), output_format='csv', ignore_stderr=True, @@ -103,17 +91,13 @@ def content_synchronize(cls, options, return_raw_response=None, timeout=3600000) timeout=timeout, ) - return result - @classmethod def content_update_counts(cls, options): """Trigger content counts update.""" cls.command_sub = 'content update-counts' - result = cls.execute(cls._construct_command(options), output_format='json') - - return result + return cls.execute(cls._construct_command(options), output_format='json') @classmethod def import_classes(cls, options): @@ -121,9 +105,7 @@ def import_classes(cls, options): cls.command_sub = 'import-classes' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def refresh_features(cls, options): @@ -131,6 +113,4 @@ def refresh_features(cls, options): cls.command_sub = 'refresh-features' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') diff --git a/robottelo/cli/hammer.py b/robottelo/cli/hammer.py index 0471754002f..4e35b0c7612 100644 --- a/robottelo/cli/hammer.py +++ b/robottelo/cli/hammer.py @@ -26,10 +26,10 @@ def _normalize_obj(obj): """ if isinstance(obj, dict): return {_normalize(k): _normalize_obj(v) for k, v in obj.items()} - elif isinstance(obj, list): + if isinstance(obj, list): return [_normalize_obj(v) for v in obj] # doing this to conform to csv parser - elif isinstance(obj, int) and not isinstance(obj, bool): + if isinstance(obj, int) and not isinstance(obj, bool): return str(obj) return obj @@ -48,8 +48,8 @@ def parse_csv(output): """Parse CSV output from Hammer CLI and convert it to python dictionary.""" # ignore warning about puppet and ostree deprecation output.replace('Puppet and OSTree will no longer be supported in Katello 3.16\n', '') - is_rex = True if 'Job invocation' in output else False - is_pkg_list = True if 'Nvra' in output else False + is_rex = 'Job invocation' in output + is_pkg_list = 'Nvra' in output # Validate if the output is eligible for CSV conversions else return as it is if not is_csv(output) and not is_rex and not is_pkg_list: return output @@ -200,7 +200,7 @@ def parse_info(output): if line.startswith(' '): # sub-properties are indented # values are separated by ':' or '=>', but not by '::' which can be # entity name like 'test::params::keys' - if line.find(':') != -1 and not line.find('::') != -1: + if line.find(':') != -1 and line.find('::') == -1: key, value = line.lstrip().split(":", 1) elif line.find('=>') != -1 and len(line.lstrip().split(" =>", 1)) == 2: key, value = line.lstrip().split(" =>", 1) diff --git a/robottelo/cli/host.py b/robottelo/cli/host.py index 6ec096cfe10..05f042f9dde 100644 --- a/robottelo/cli/host.py +++ b/robottelo/cli/host.py @@ -215,9 +215,7 @@ def reboot(cls, options=None): cls.command_sub = 'reboot' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def reports(cls, options=None): @@ -268,9 +266,7 @@ def start(cls, options=None): cls.command_sub = 'start' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def status(cls, options=None): @@ -290,9 +286,7 @@ def status(cls, options=None): cls.command_sub = 'status' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def stop(cls, options=None): @@ -313,9 +307,7 @@ def stop(cls, options=None): cls.command_sub = 'stop' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def subscription_register(cls, options=None): diff --git a/robottelo/cli/lifecycleenvironment.py b/robottelo/cli/lifecycleenvironment.py index 72435669b62..c22d2268746 100644 --- a/robottelo/cli/lifecycleenvironment.py +++ b/robottelo/cli/lifecycleenvironment.py @@ -29,9 +29,7 @@ class LifecycleEnvironment(Base): @classmethod def list(cls, options=None, per_page=False): - result = super().list(options, per_page=per_page) - - return result + return super().list(options, per_page=per_page) @classmethod def paths(cls, options=None): diff --git a/robottelo/cli/operatingsys.py b/robottelo/cli/operatingsys.py index 1a1a63bdebd..8bf4411d56d 100644 --- a/robottelo/cli/operatingsys.py +++ b/robottelo/cli/operatingsys.py @@ -45,9 +45,7 @@ def add_architecture(cls, options=None): cls.command_sub = 'add-architecture' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def add_provisioning_template(cls, options=None): @@ -57,9 +55,7 @@ def add_provisioning_template(cls, options=None): cls.command_sub = 'add-provisioning-template' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def add_ptable(cls, options=None): @@ -69,9 +65,7 @@ def add_ptable(cls, options=None): cls.command_sub = 'add-ptable' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def remove_architecture(cls, options=None): @@ -81,9 +75,7 @@ def remove_architecture(cls, options=None): cls.command_sub = 'remove-architecture' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def remove_provisioning_template(cls, options=None): @@ -93,9 +85,7 @@ def remove_provisioning_template(cls, options=None): cls.command_sub = 'remove-provisioning-template' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def remove_ptable(cls, options=None): @@ -105,6 +95,4 @@ def remove_ptable(cls, options=None): cls.command_sub = 'remove-ptable ' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) diff --git a/robottelo/cli/product.py b/robottelo/cli/product.py index efbf7ed09e1..7a7f03eeff4 100644 --- a/robottelo/cli/product.py +++ b/robottelo/cli/product.py @@ -39,9 +39,7 @@ def remove_sync_plan(cls, options=None): cls.command_sub = 'remove-sync-plan' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def set_sync_plan(cls, options=None): @@ -51,9 +49,7 @@ def set_sync_plan(cls, options=None): cls.command_sub = 'set-sync-plan' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def synchronize(cls, options=None): @@ -69,6 +65,4 @@ def update_proxy(cls, options=None): cls.command_sub = 'update-proxy' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) diff --git a/robottelo/cli/srpm.py b/robottelo/cli/srpm.py index b0e71d8969d..62578bbaa69 100644 --- a/robottelo/cli/srpm.py +++ b/robottelo/cli/srpm.py @@ -25,15 +25,11 @@ def info(cls, options=None): """Show a SRPM Info""" cls.command_sub = 'info' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def list(cls, options=None): """List SRPMs""" cls.command_sub = 'list' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') diff --git a/robottelo/cli/template.py b/robottelo/cli/template.py index 4dbe709c33b..3729fc4bf76 100644 --- a/robottelo/cli/template.py +++ b/robottelo/cli/template.py @@ -46,18 +46,14 @@ def add_operatingsystem(cls, options=None): """Adds operating system, requires "id" and "operatingsystem-id".""" cls.command_sub = 'add-operatingsystem' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def remove_operatingsystem(cls, options=None): """Remove operating system, requires "id" and "operatingsystem-id".""" cls.command_sub = 'remove-operatingsystem' - result = cls.execute(cls._construct_command(options), output_format='csv') - - return result + return cls.execute(cls._construct_command(options), output_format='csv') @classmethod def clone(cls, options=None): diff --git a/robottelo/cli/template_sync.py b/robottelo/cli/template_sync.py index 6da3b683653..72ee70fa00f 100644 --- a/robottelo/cli/template_sync.py +++ b/robottelo/cli/template_sync.py @@ -50,15 +50,11 @@ def exports(cls, options=None): """Export Satellite Templates to Git/Local Directory.""" cls.command_base = 'export-templates' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) @classmethod def imports(cls, options=None): """Import Satellite Templates to Git/Local Directory.""" cls.command_base = 'import-templates' - result = cls.execute(cls._construct_command(options)) - - return result + return cls.execute(cls._construct_command(options)) diff --git a/robottelo/cli/webhook.py b/robottelo/cli/webhook.py index 379555630c5..c7b93f76d99 100644 --- a/robottelo/cli/webhook.py +++ b/robottelo/cli/webhook.py @@ -41,5 +41,4 @@ def create(cls, options=None): 'See See "hammer webhook create --help" for the list of supported methods' ) - result = super().create(options) - return result + return super().create(options) diff --git a/robottelo/config/__init__.py b/robottelo/config/__init__.py index 2d66d00054b..cca2258c7e6 100644 --- a/robottelo/config/__init__.py +++ b/robottelo/config/__init__.py @@ -183,7 +183,7 @@ def configure_airgun(): 'webdriver': settings.ui.webdriver, 'webdriver_binary': settings.ui.webdriver_binary, }, - 'webkaifuku': {'config': settings.ui.webkaifuku} or {}, + 'webkaifuku': {'config': settings.ui.webkaifuku}, } ) diff --git a/robottelo/host_helpers/api_factory.py b/robottelo/host_helpers/api_factory.py index ba830abda2b..1316bca9078 100644 --- a/robottelo/host_helpers/api_factory.py +++ b/robottelo/host_helpers/api_factory.py @@ -51,6 +51,7 @@ def make_http_proxy(self, org, http_proxy_type): password=settings.http_proxy.password, organization=[org.id], ).create() + return None def cv_publish_promote(self, name=None, env_name=None, repo_id=None, org_id=None): """Create, publish and promote CV to selected environment""" @@ -607,10 +608,9 @@ def update_provisioning_template(self, name=None, old=None, new=None): self.temp.template = self.temp.template.replace(old, new, 1) update = self.temp.update(['template']) return new in update.template - elif new in self.temp.template: + if new in self.temp.template: return True - else: - raise ValueError(f'{old} does not exists in template {name}') + raise ValueError(f'{old} does not exists in template {name}') def disable_syncplan(self, sync_plan): """ @@ -694,10 +694,7 @@ def wait_for_errata_applicability_task( task.label == 'Actions::Katello::Applicability::Hosts::BulkGenerate' and 'host_ids' in task.input and host_id in task.input['host_ids'] - ): - task.poll(poll_rate=poll_rate, timeout=poll_timeout) - tasks_finished += 1 - elif ( + ) or ( task.label == 'Actions::Katello::Host::UploadPackageProfile' and 'host' in task.input and host_id == task.input['host']['id'] @@ -766,7 +763,7 @@ def wait_for_syncplan_tasks(self, repo_backend_id=None, timeout=10, repo_name=No if len(req.content) > 2: if req.json()[0].get('state') in ['finished']: return True - elif req.json()[0].get('error'): + if req.json()[0].get('error'): raise AssertionError( f"Pulp task with repo_id {repo_backend_id} error or not found: " f"'{req.json().get('error')}'" diff --git a/robottelo/host_helpers/capsule_mixins.py b/robottelo/host_helpers/capsule_mixins.py index 9e283509696..1f3769e0f22 100644 --- a/robottelo/host_helpers/capsule_mixins.py +++ b/robottelo/host_helpers/capsule_mixins.py @@ -55,8 +55,7 @@ def wait_for_tasks( for task in tasks: task.poll(poll_rate=poll_rate, timeout=poll_timeout, must_succeed=must_succeed) break - else: - time.sleep(search_rate) + time.sleep(search_rate) else: raise AssertionError(f"No task was found using query '{search_query}'") return tasks @@ -94,5 +93,4 @@ def get_published_repo_url(self, org, prod, repo, lce=None, cv=None): """ if lce and cv: return f'{self.url}/pulp/content/{org}/{lce}/{cv}/custom/{prod}/{repo}/' - else: - return f'{self.url}/pulp/content/{org}/Library/custom/{prod}/{repo}/' + return f'{self.url}/pulp/content/{org}/Library/custom/{prod}/{repo}/' diff --git a/robottelo/host_helpers/cli_factory.py b/robottelo/host_helpers/cli_factory.py index 6debf436c11..964ec2a97b3 100644 --- a/robottelo/host_helpers/cli_factory.py +++ b/robottelo/host_helpers/cli_factory.py @@ -276,15 +276,13 @@ def __getattr__(self, name): # evaluate functions that provide default values fields = self._evaluate_functions(fields) return partial(create_object, entity_cls, fields) - else: - raise AttributeError(f'unknown factory method name: {name}') + raise AttributeError(f'unknown factory method name: {name}') def _evaluate_function(self, function): """Some functions may require an instance reference""" if 'self' in inspect.signature(function).parameters: return function(self) - else: - return function() + return function() def _evaluate_functions(self, iterable): """Run functions that are used to populate data in lists/dicts""" @@ -296,6 +294,7 @@ def _evaluate_functions(self, iterable): for key, item in iterable.items() if not key.startswith('_') } + return None @lru_cache def _find_entity_class(self, entity_name): @@ -303,6 +302,7 @@ def _find_entity_class(self, entity_name): for name, class_obj in self._satellite.cli.__dict__.items(): if entity_name == name.lower(): return class_obj + return None def make_content_credential(self, options=None): """Creates a content credential. @@ -530,7 +530,7 @@ def make_template(self, options=None): } # Write content to file or random text - if options is not None and 'content' in options.keys(): + if options is not None and 'content' in options: content = options.pop('content') else: content = gen_alphanumeric() @@ -874,32 +874,31 @@ def setup_org_for_a_rh_repo( custom_repo_url = settings.repos.capsule_repo if force_use_cdn or settings.robottelo.cdn or not custom_repo_url: return self._setup_org_for_a_rh_repo(options) - else: - options['url'] = custom_repo_url - result = self.setup_org_for_a_custom_repo(options) - if force_manifest_upload: - with clone() as manifest: - self._satellite.put(manifest.path, manifest.name) - try: - self._satellite.cli.Subscription.upload( - { - 'file': manifest.name, - 'organization-id': result.get('organization-id'), - } - ) - except CLIReturnCodeError as err: - raise CLIFactoryError(f'Failed to upload manifest\n{err.msg}') from err + options['url'] = custom_repo_url + result = self.setup_org_for_a_custom_repo(options) + if force_manifest_upload: + with clone() as manifest: + self._satellite.put(manifest.path, manifest.name) + try: + self._satellite.cli.Subscription.upload( + { + 'file': manifest.name, + 'organization-id': result.get('organization-id'), + } + ) + except CLIReturnCodeError as err: + raise CLIFactoryError(f'Failed to upload manifest\n{err.msg}') from err - # Add default subscription to activation-key, if SCA mode is disabled - if self._satellite.is_sca_mode_enabled(result['organization-id']) is False: - self.activationkey_add_subscription_to_repo( - { - 'activationkey-id': result['activationkey-id'], - 'organization-id': result['organization-id'], - 'subscription': constants.DEFAULT_SUBSCRIPTION_NAME, - } - ) - return result + # Add default subscription to activation-key, if SCA mode is disabled + if self._satellite.is_sca_mode_enabled(result['organization-id']) is False: + self.activationkey_add_subscription_to_repo( + { + 'activationkey-id': result['activationkey-id'], + 'organization-id': result['organization-id'], + 'subscription': constants.DEFAULT_SUBSCRIPTION_NAME, + } + ) + return result @staticmethod def _get_capsule_vm_distro_repos(distro): diff --git a/robottelo/host_helpers/repository_mixins.py b/robottelo/host_helpers/repository_mixins.py index aeb06a0c97e..0ff2bdecd68 100644 --- a/robottelo/host_helpers/repository_mixins.py +++ b/robottelo/host_helpers/repository_mixins.py @@ -388,8 +388,7 @@ def __repr__(self): f'' ) - else: - return f'' + return f'' def create( self, diff --git a/robottelo/host_helpers/satellite_mixins.py b/robottelo/host_helpers/satellite_mixins.py index 27c12c7b3be..0997bad3b83 100644 --- a/robottelo/host_helpers/satellite_mixins.py +++ b/robottelo/host_helpers/satellite_mixins.py @@ -145,9 +145,12 @@ def upload_manifest(self, org_id, manifest=None, interface='API', timeout=None): :returns: the manifest upload result """ - if not isinstance(manifest, bytes | io.BytesIO): - if not hasattr(manifest, 'content') or manifest.content is None: - manifest = clone() + if ( + not isinstance(manifest, bytes | io.BytesIO) + and not hasattr(manifest, 'content') + or manifest.content is None + ): + manifest = clone() if timeout is None: # Set the timeout to 1500 seconds to align with the API timeout. timeout = 1500000 @@ -191,8 +194,7 @@ def publish_content_view(self, org, repo_list): repo = repo_list if isinstance(repo_list, list) else [repo_list] content_view = self.api.ContentView(organization=org, repository=repo).create() content_view.publish() - content_view = content_view.read() - return content_view + return content_view.read() def move_pulp_archive(self, org, export_message): """ @@ -208,11 +210,7 @@ def move_pulp_archive(self, org, export_message): # removes everything before export path, # replaces EXPORT_PATH by IMPORT_PATH, # removes metadata filename - import_path = os.path.dirname( - re.sub(rf'.*{PULP_EXPORT_DIR}', PULP_IMPORT_DIR, export_message) - ) - - return import_path + return os.path.dirname(re.sub(rf'.*{PULP_EXPORT_DIR}', PULP_IMPORT_DIR, export_message)) class SystemInfo: diff --git a/robottelo/hosts.py b/robottelo/hosts.py index 2ff72bbe367..06e86a3b9f7 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -76,8 +76,7 @@ def lru_sat_ready_rhel(rhel_ver): 'promtail_config_template_file': 'config_sat.j2', 'workflow': settings.server.deploy_workflows.os, } - sat_ready_rhel = Broker(**deploy_args, host_class=Satellite).checkout() - return sat_ready_rhel + return Broker(**deploy_args, host_class=Satellite).checkout() def get_sat_version(): @@ -245,8 +244,8 @@ def nailgun_host(self): logger.error(f'Failed to get nailgun host for {self.hostname}: {err}') host = None return host - else: - logger.warning(f'Host {self.hostname} not registered to {self.satellite.hostname}') + logger.warning(f'Host {self.hostname} not registered to {self.satellite.hostname}') + return None @property def subscribed(self): @@ -515,6 +514,7 @@ def enable_repo(self, repo, force=False): downstream_repo = settings.repos.capsule_repo if force or settings.robottelo.cdn or not downstream_repo: return self.execute(f'subscription-manager repos --enable {repo}') + return None def subscription_manager_list_repos(self): return self.execute('subscription-manager repos --list') @@ -1586,6 +1586,7 @@ def check_services(self): for line in result.stdout.splitlines(): if error_msg in line: return line.replace(error_msg, '').strip() + return None def install(self, installer_obj=None, cmd_args=None, cmd_kwargs=None): """General purpose installer""" @@ -1754,7 +1755,7 @@ def _swap_nailgun(self, new_version): pip_main(['uninstall', '-y', 'nailgun']) pip_main(['install', f'https://github.com/SatelliteQE/nailgun/archive/{new_version}.zip']) self._api = type('api', (), {'_configured': False}) - to_clear = [k for k in sys.modules.keys() if 'nailgun' in k] + to_clear = [k for k in sys.modules if 'nailgun' in k] [sys.modules.pop(k) for k in to_clear] @property @@ -1844,6 +1845,7 @@ def get_caller(): for frame in inspect.stack(): if frame.function.startswith('test_'): return frame.function + return None try: ui_session = Session( diff --git a/robottelo/ssh.py b/robottelo/ssh.py index c82a7ebc071..8b72bed3497 100644 --- a/robottelo/ssh.py +++ b/robottelo/ssh.py @@ -16,13 +16,12 @@ def get_client( from robottelo.config import settings from robottelo.hosts import ContentHost - client = ContentHost( + return ContentHost( hostname=hostname or settings.server.hostname, username=username or settings.server.ssh_username, password=password or settings.server.ssh_password, port=port or settings.server.ssh_client.port, ) - return client def command( diff --git a/robottelo/utils/datafactory.py b/robottelo/utils/datafactory.py index 7de716e1046..c5ccc38ba14 100644 --- a/robottelo/utils/datafactory.py +++ b/robottelo/utils/datafactory.py @@ -64,11 +64,10 @@ def parametrized(data): 'ids': list(data.keys()), 'argvalues': list(data.values()), } - else: - return { - 'ids': [str(i) for i in range(len(data))], - 'argvalues': list(data), - } + return { + 'ids': [str(i) for i in range(len(data))], + 'argvalues': list(data), + } @filtered_datapoint @@ -196,14 +195,13 @@ def valid_domain_names(interface=None, length=None): length = random.randint(1, max_len) if length > max_len: raise ValueError(f'length is too large, max: {max_len}') - names = { + return { 'alphanumeric': DOMAIN % gen_string('alphanumeric', length), 'alpha': DOMAIN % gen_string('alpha', length), 'numeric': DOMAIN % gen_string('numeric', length), 'latin1': DOMAIN % gen_string('latin1', length), 'utf8': DOMAIN % gen_utf8(length), } - return names @filtered_datapoint @@ -243,8 +241,8 @@ def invalid_values_list(interface=None): raise InvalidArgumentError('Valid interface values are api, cli, ui only') if interface == 'ui': return ['', ' '] + invalid_names_list() - else: # interface = api or cli or None - return ['', ' ', '\t'] + invalid_names_list() + # else: interface = api or cli or None + return ['', ' ', '\t'] + invalid_names_list() @filtered_datapoint @@ -274,7 +272,7 @@ def valid_data_list(interface=None): @filtered_datapoint def valid_docker_repository_names(): """Generates a list of valid names for Docker repository.""" - names = [ + return [ gen_string('alphanumeric', random.randint(1, 255)), gen_string('alpha', random.randint(1, 255)), gen_string('cjk', random.randint(1, 85)), @@ -283,7 +281,6 @@ def valid_docker_repository_names(): gen_string('utf8', random.randint(1, 85)), gen_string('html', random.randint(1, 85)), ] - return names @filtered_datapoint @@ -512,8 +509,7 @@ def valid_http_credentials(url_encoded=False): } for cred in credentials ] - else: - return credentials + return credentials def invalid_http_credentials(url_encoded=False): @@ -535,8 +531,7 @@ def invalid_http_credentials(url_encoded=False): } for cred in credentials ] - else: - return credentials + return credentials @filtered_datapoint diff --git a/robottelo/utils/decorators/func_locker.py b/robottelo/utils/decorators/func_locker.py index 4d82c3add28..08f4073c614 100644 --- a/robottelo/utils/decorators/func_locker.py +++ b/robottelo/utils/decorators/func_locker.py @@ -112,10 +112,7 @@ def _get_scope_path(scope, scope_kwargs=None, scope_context=None, create=True): scope_path_list = [_get_temp_lock_function_dir(create=create)] if scope: - if callable(scope): - scope_dir_name = scope(**scope_kwargs) - else: - scope_dir_name = scope + scope_dir_name = scope(**scope_kwargs) if callable(scope) else scope if scope_dir_name: scope_path_list.append(scope_dir_name) if scope_context: @@ -168,8 +165,8 @@ def _check_deadlock(lock_file_path, process_id): """ if os.path.exists(lock_file_path): try: - lock_file_handler = open(lock_file_path) - lock_file_content = lock_file_handler.read() + with open(lock_file_path) as lock_file_handler: + lock_file_content = lock_file_handler.read() except OSError as exp: # do nothing, but anyway log the exception logger.exception(exp) @@ -265,8 +262,7 @@ def wait_function(func): if function: return main_wrapper(function) - else: - return wait_function + return wait_function @contextmanager diff --git a/robottelo/utils/decorators/func_shared/shared.py b/robottelo/utils/decorators/func_shared/shared.py index 072ebc3fb47..73961df50b5 100644 --- a/robottelo/utils/decorators/func_shared/shared.py +++ b/robottelo/utils/decorators/func_shared/shared.py @@ -565,5 +565,4 @@ def wait_function(func): if function_: return main_wrapper(function_) - else: - return wait_function + return wait_function diff --git a/robottelo/utils/io/__init__.py b/robottelo/utils/io/__init__.py index 33a4381fd4c..ac23b5e83b5 100644 --- a/robottelo/utils/io/__init__.py +++ b/robottelo/utils/io/__init__.py @@ -82,6 +82,7 @@ def get_remote_report_checksum(satellite, org_id): continue checksum, _ = result.stdout.split(maxsplit=1) return checksum + return None def get_report_data(report_path): diff --git a/robottelo/utils/issue_handlers/__init__.py b/robottelo/utils/issue_handlers/__init__.py index 4789bbc8a74..d59c97aec63 100644 --- a/robottelo/utils/issue_handlers/__init__.py +++ b/robottelo/utils/issue_handlers/__init__.py @@ -2,7 +2,7 @@ from robottelo.utils.issue_handlers import bugzilla handler_methods = {'BZ': bugzilla.is_open_bz} -SUPPORTED_HANDLERS = tuple(f"{handler}:" for handler in handler_methods.keys()) +SUPPORTED_HANDLERS = tuple(f"{handler}:" for handler in handler_methods) def add_workaround(data, matches, usage, validation=(lambda *a, **k: True), **kwargs): @@ -17,10 +17,11 @@ def should_deselect(issue, data=None): """Check if test should be deselected based on marked issue.""" # Handlers can be extended to support different issue trackers. handlers = {'BZ': bugzilla.should_deselect_bz} - supported_handlers = tuple(f"{handler}:" for handler in handlers.keys()) + supported_handlers = tuple(f"{handler}:" for handler in handlers) if str(issue).startswith(supported_handlers): handler_code = str(issue).partition(":")[0] return handlers[handler_code.strip()](issue.strip(), data) + return None def is_open(issue, data=None): diff --git a/robottelo/utils/ohsnap.py b/robottelo/utils/ohsnap.py index 89eb6a97e22..96241a759b6 100644 --- a/robottelo/utils/ohsnap.py +++ b/robottelo/utils/ohsnap.py @@ -121,7 +121,8 @@ def ohsnap_snap_rpms(ohsnap, sat_version, snap_version, os_major, is_all=True): rpm_repos = [f'satellite {sat_xy}', f'maintenance {sat_xy}'] if res.status_code == 200: for repo_data in res.json(): - if repo_data['rhel'] == os_major: - if any(repo in repo_data['repository'].lower() for repo in rpm_repos): - rpms += repo_data['rpms'] + if repo_data['rhel'] == os_major and any( + repo in repo_data['repository'].lower() for repo in rpm_repos + ): + rpms += repo_data['rpms'] return rpms diff --git a/robottelo/utils/report_portal/portal.py b/robottelo/utils/report_portal/portal.py index 3d44ac6c691..c7e0df5d54e 100644 --- a/robottelo/utils/report_portal/portal.py +++ b/robottelo/utils/report_portal/portal.py @@ -101,10 +101,9 @@ def get_launches( resp.raise_for_status() # this should further filter out unfinished launches as RP API currently doesn't # support usage of the same filter type multiple times (filter.ne.status) - launches = [ + return [ launch for launch in resp.json()['content'] if launch['status'] not in ['INTERRUPTED'] ] - return launches @retry( stop=stop_after_attempt(6), diff --git a/robottelo/utils/ssh.py b/robottelo/utils/ssh.py index c82a7ebc071..8b72bed3497 100644 --- a/robottelo/utils/ssh.py +++ b/robottelo/utils/ssh.py @@ -16,13 +16,12 @@ def get_client( from robottelo.config import settings from robottelo.hosts import ContentHost - client = ContentHost( + return ContentHost( hostname=hostname or settings.server.hostname, username=username or settings.server.ssh_username, password=password or settings.server.ssh_password, port=port or settings.server.ssh_client.port, ) - return client def command( diff --git a/robottelo/utils/vault.py b/robottelo/utils/vault.py index d447331ac15..97f95755bbd 100644 --- a/robottelo/utils/vault.py +++ b/robottelo/utils/vault.py @@ -10,7 +10,6 @@ class Vault: - HELP_TEXT = ( "Vault CLI in not installed in your system, " "refer link https://learn.hashicorp.com/tutorials/vault/getting-started-install to " @@ -41,12 +40,15 @@ def export_vault_addr(self): os.environ['VAULT_ADDR'] = vaulturl # Dynaconf Vault Env Vars - if self.vault_enabled and self.vault_enabled in ['True', 'true']: - if 'localhost:8200' in vaulturl: - raise InvalidVaultURLForOIDC( - f"{vaulturl} doesn't support OIDC login," - "please change url to corp vault in env file!" - ) + if ( + self.vault_enabled + and self.vault_enabled in ['True', 'true'] + and 'localhost:8200' in vaulturl + ): + raise InvalidVaultURLForOIDC( + f"{vaulturl} doesn't support OIDC login," + "please change url to corp vault in env file!" + ) def exec_vault_command(self, command: str, **kwargs): """A wrapper to execute the vault CLI commands @@ -74,31 +76,29 @@ def login(self, **kwargs): self.vault_enabled and self.vault_enabled in ['True', 'true'] and 'VAULT_SECRET_ID_FOR_DYNACONF' not in os.environ + and self.status(**kwargs).returncode != 0 ): - if self.status(**kwargs).returncode != 0: - logger.info( - "Warning! The browser is about to open for vault OIDC login, " - "close the tab once the sign-in is done!" - ) - if ( - self.exec_vault_command(command="vault login -method=oidc", **kwargs).returncode - == 0 - ): - self.exec_vault_command(command="vault token renew -i 10h", **kwargs) - logger.info("Success! Vault OIDC Logged-In and extended for 10 hours!") - # Fetching tokens - token = self.exec_vault_command("vault token lookup --format json").stdout - token = json.loads(str(token.decode('UTF-8')))['data']['id'] - # Setting new token in env file - _envdata = re.sub( - '.*VAULT_TOKEN_FOR_DYNACONF=.*', - f"VAULT_TOKEN_FOR_DYNACONF={token}", - self.envdata, - ) - self.env_path.write_text(_envdata) - logger.info( - "Success! New OIDC token added to .env file to access secrets from vault!" - ) + logger.info( + "Warning! The browser is about to open for vault OIDC login, " + "close the tab once the sign-in is done!" + ) + if ( + self.exec_vault_command(command="vault login -method=oidc", **kwargs).returncode + == 0 + ): + self.exec_vault_command(command="vault token renew -i 10h", **kwargs) + logger.info("Success! Vault OIDC Logged-In and extended for 10 hours!") + # Fetching tokens + token = self.exec_vault_command("vault token lookup --format json").stdout + token = json.loads(str(token.decode('UTF-8')))['data']['id'] + # Setting new token in env file + _envdata = re.sub( + '.*VAULT_TOKEN_FOR_DYNACONF=.*', + f"VAULT_TOKEN_FOR_DYNACONF={token}", + self.envdata, + ) + self.env_path.write_text(_envdata) + logger.info("Success! New OIDC token added to .env file to access secrets from vault!") def logout(self): # Teardown - Setting dymmy token in env file diff --git a/robottelo/utils/virtwho.py b/robottelo/utils/virtwho.py index 5e0f3a4657a..e159a487394 100644 --- a/robottelo/utils/virtwho.py +++ b/robottelo/utils/virtwho.py @@ -47,16 +47,15 @@ def get_system(system_type): 'password': getattr(settings.virtwho, system_type).guest_password, 'port': getattr(settings.virtwho, system_type).guest_port, } - elif system_type == 'satellite': + if system_type == 'satellite': return { 'hostname': settings.server.hostname, 'username': settings.server.ssh_username, 'password': settings.server.ssh_password, } - else: - raise VirtWhoError( - f'"{system_type}" system type is not supported. Please use one of {system_type_list}' - ) + raise VirtWhoError( + f'"{system_type}" system type is not supported. Please use one of {system_type_list}' + ) def get_guest_info(hypervisor_type): @@ -115,8 +114,7 @@ def register_system(system, activation_key=None, org='Default_Organization', env ret, stdout = runcmd(cmd, system) if ret == 0 or "system has been registered" in stdout: return True - else: - raise VirtWhoError(f'Failed to register system: {system}') + raise VirtWhoError(f'Failed to register system: {system}') def virtwho_cleanup(): @@ -150,10 +148,9 @@ def get_virtwho_status(): return 'logerror' if any(key in stdout for key in running_stauts): return 'running' - elif any(key in stdout for key in stopped_status): + if any(key in stdout for key in stopped_status): return 'stopped' - else: - return 'undefined' + return 'undefined' def get_configure_id(name): @@ -164,8 +161,7 @@ def get_configure_id(name): config = VirtWhoConfig.info({'name': name}) if 'id' in config['general-information']: return config['general-information']['id'] - else: - raise VirtWhoError(f"No configure id found for {name}") + raise VirtWhoError(f"No configure id found for {name}") def get_configure_command(config_id, org=DEFAULT_ORG): @@ -198,10 +194,8 @@ def get_configure_option(option, filename): cmd = f"grep -v '^#' {filename} | grep ^{option}" ret, stdout = runcmd(cmd) if ret == 0 and option in stdout: - value = stdout.split('=')[1].strip() - return value - else: - raise VirtWhoError(f"option {option} is not exist or not be enabled in {filename}") + return stdout.split('=')[1].strip() + raise VirtWhoError(f"option {option} is not exist or not be enabled in {filename}") def get_rhsm_log(): @@ -264,8 +258,7 @@ def _get_hypervisor_mapping(hypervisor_type): break if hypervisor_name: return hypervisor_name, guest_name - else: - raise VirtWhoError(f"Failed to get the hypervisor_name for guest {guest_name}") + raise VirtWhoError(f"Failed to get the hypervisor_name for guest {guest_name}") def get_hypervisor_ahv_mapping(hypervisor_type): @@ -348,6 +341,7 @@ def deploy_configure_by_command(command, hypervisor_type, debug=False, org='Defa raise VirtWhoError(f"Failed to deploy configure by {command}") if debug: return deploy_validation(hypervisor_type) + return None def deploy_configure_by_script( @@ -371,6 +365,7 @@ def deploy_configure_by_script( raise VirtWhoError(f"Failed to deploy configure by {script_filename}") if debug: return deploy_validation(hypervisor_type) + return None def deploy_configure_by_command_check(command): @@ -389,8 +384,7 @@ def deploy_configure_by_command_check(command): else: if ret != 0 or 'Finished successfully' not in stdout: raise VirtWhoError(f"Failed to deploy configure by {command}") - else: - return 'Finished successfully' + return 'Finished successfully' def restart_virtwho_service(): @@ -469,8 +463,7 @@ def hypervisor_json_create(hypervisors, guests): name = str(uuid.uuid4()) hypervisor = {"guestIds": guest_list, "name": name, "hypervisorId": {"hypervisorId": name}} hypervisors_list.append(hypervisor) - mapping = {"hypervisors": hypervisors_list} - return mapping + return {"hypervisors": hypervisors_list} def create_fake_hypervisor_content(org_label, hypervisors, guests): @@ -537,7 +530,8 @@ def get_configure_command_option(deploy_type, args, org=DEFAULT_ORG): username, password = Base._get_username_password() if deploy_type == 'location-id': return f"hammer -u {username} -p {password} virt-who-config deploy --id {args['id']} --location-id '{args['location-id']}' " - elif deploy_type == 'organization-title': + if deploy_type == 'organization-title': return f"hammer -u {username} -p {password} virt-who-config deploy --id {args['id']} --organization-title '{args['organization-title']}' " - elif deploy_type == 'name': + if deploy_type == 'name': return f"hammer -u {username} -p {password} virt-who-config deploy --name {args['name']} --organization '{org}' " + return None diff --git a/scripts/config_helpers.py b/scripts/config_helpers.py index feb37c9bd62..cf422588b05 100644 --- a/scripts/config_helpers.py +++ b/scripts/config_helpers.py @@ -35,7 +35,7 @@ def merge_nested_dictionaries(original, new, overwrite=False): user_choice = click.prompt(choice_prompt, type=int, default=1, show_default=True) if user_choice == 1: continue - elif user_choice == 2: + if user_choice == 2: original[key] = value elif user_choice == 3 and isinstance(value, list): original[key] = original[key] + value @@ -110,7 +110,7 @@ def merge(from_, strategy): user_choice = click.prompt(choice_prompt, type=int, default=1, show_default=True) if user_choice == 1: continue - elif user_choice == 2: + if user_choice == 2: logger.warning(f"Overwriting {real_name} with {file}") real_name.unlink() real_name.write_text(file.read_text()) diff --git a/scripts/customer_scenarios.py b/scripts/customer_scenarios.py index eb806468e21..b81137042b9 100755 --- a/scripts/customer_scenarios.py +++ b/scripts/customer_scenarios.py @@ -19,8 +19,7 @@ def make_path_list(path_list): paths = path_list.split(',') paths = [path for path in paths if any(target in path for target in targets)] return set(paths) - else: - return targets + return targets def get_bz_data(paths): @@ -31,12 +30,10 @@ def get_bz_data(paths): for test in tests: test_dict = test.to_dict() test_data = {**test_dict['tokens'], **test_dict['invalid-tokens']} - if 'bz' in test_data.keys(): - if ( - 'customerscenario' not in test_data.keys() - or test_data['customerscenario'] == 'false' - ): - path_result.append([test.name, test_data['bz']]) + if 'bz' in test_data and ( + 'customerscenario' not in test_data or test_data['customerscenario'] == 'false' + ): + path_result.append([test.name, test_data['bz']]) if path_result: result[path] = path_result return result @@ -64,8 +61,7 @@ def get_response(bzs): ) assert response.status_code == 200, 'BZ query unsuccessful' assert response.json().get('error') is not True, response.json().get('message') - bugs = response.json().get('bugs') - return bugs + return response.json().get('bugs') def query_bz(data): @@ -75,7 +71,7 @@ def query_bz(data): for test in tests: bugs = get_response(test[1]) for bug in bugs: - if 'external_bugs' in bug.keys() and len(bug['external_bugs']) > 1: + if 'external_bugs' in bug and len(bug['external_bugs']) > 1: customer_cases = [ case for case in bug['external_bugs'] diff --git a/scripts/fixture_cli.py b/scripts/fixture_cli.py index 5963394e21f..c68559d3c1b 100644 --- a/scripts/fixture_cli.py +++ b/scripts/fixture_cli.py @@ -16,13 +16,13 @@ def fixture_to_test(fixture_name): """ if ":" not in fixture_name: return f"def test_runfake_{fixture_name}({fixture_name}):\n assert True" - else: - fixture_name, params = fixture_name.split(":") - params = params.split(",") - return ( - f"@pytest.mark.parametrize('{fixture_name}', {params}, indirect=True)\n" - f"def test_runfake_{fixture_name}({fixture_name}):\n assert True" - ) + + fixture_name, params = fixture_name.split(":") + params = params.split(",") + return ( + f"@pytest.mark.parametrize('{fixture_name}', {params}, indirect=True)\n" + f"def test_runfake_{fixture_name}({fixture_name}):\n assert True" + ) @click.command() diff --git a/scripts/graph_entities.py b/scripts/graph_entities.py index a404c616911..46038a3e3b0 100755 --- a/scripts/graph_entities.py +++ b/scripts/graph_entities.py @@ -24,9 +24,7 @@ def graph(): for entity_name, entity in entities_.items(): # Graph out which entities this entity depends on. for field_name, field in entity.get_fields().items(): - if isinstance(field, entity_mixins.OneToOneField) or isinstance( - field, entity_mixins.OneToManyField - ): + if isinstance(field, (entity_mixins.OneToOneField | entity_mixins.OneToManyField)): print( '{} -> {} [label="{}"{}]'.format( entity_name, diff --git a/tests/foreman/api/test_activationkey.py b/tests/foreman/api/test_activationkey.py index 56513c03d85..ef5add381fc 100644 --- a/tests/foreman/api/test_activationkey.py +++ b/tests/foreman/api/test_activationkey.py @@ -171,7 +171,7 @@ def test_positive_update_limited_host(max_host, target_sat): for key, value in want.items(): setattr(act_key, key, value) act_key = act_key.update(want.keys()) - actual = {attr: getattr(act_key, attr) for attr in want.keys()} + actual = {attr: getattr(act_key, attr) for attr in want} assert want == actual @@ -219,7 +219,7 @@ def test_negative_update_limit(max_host, target_sat): with pytest.raises(HTTPError): act_key.update(want.keys()) act_key = act_key.read() - actual = {attr: getattr(act_key, attr) for attr in want.keys()} + actual = {attr: getattr(act_key, attr) for attr in want} assert want == actual @@ -293,7 +293,7 @@ def test_positive_get_releases_content(target_sat): """ act_key = target_sat.api.ActivationKey().create() response = client.get(act_key.path('releases'), auth=get_credentials(), verify=False).json() - assert 'results' in response.keys() + assert 'results' in response assert isinstance(response['results'], list) diff --git a/tests/foreman/api/test_capsulecontent.py b/tests/foreman/api/test_capsulecontent.py index abbfd9f9f32..48db1e11a7b 100644 --- a/tests/foreman/api/test_capsulecontent.py +++ b/tests/foreman/api/test_capsulecontent.py @@ -1513,7 +1513,7 @@ def test_positive_content_counts_for_mixed_cv( # Check the counts for CVV are not present at the Capsule side before sync. caps_counts = module_capsule_configured.nailgun_capsule.content_counts() - assert caps_counts is None or cvv.id not in caps_counts['content_view_versions'].keys() + assert caps_counts is None or cvv.id not in caps_counts['content_view_versions'] # Sync, wait for counts to be updated and get them from the Capsule. sync_status = module_capsule_configured.nailgun_capsule.content_sync() @@ -1528,7 +1528,7 @@ def test_positive_content_counts_for_mixed_cv( caps_counts = module_capsule_configured.nailgun_capsule.content_counts()[ 'content_view_versions' ] - assert str(cvv.id) in caps_counts.keys(), 'CVV is missing in content counts.' + assert str(cvv.id) in caps_counts, 'CVV is missing in content counts.' caps_counts = caps_counts[str(cvv.id)] # Every "environment repo" (the one promoted to an LCE and synced to the Capsule) diff --git a/tests/foreman/api/test_computeresource_azurerm.py b/tests/foreman/api/test_computeresource_azurerm.py index 66f25f74b2b..47bf8313066 100644 --- a/tests/foreman/api/test_computeresource_azurerm.py +++ b/tests/foreman/api/test_computeresource_azurerm.py @@ -580,4 +580,4 @@ def test_positive_azurerm_custom_image_host_provisioned( # Azure cloud assert self.hostname.lower() == azureclient_host.name - assert AZURERM_VM_SIZE_DEFAULT == azureclient_host.type + assert azureclient_host.type == AZURERM_VM_SIZE_DEFAULT diff --git a/tests/foreman/api/test_contentview.py b/tests/foreman/api/test_contentview.py index 73575dd4b1a..c822234a628 100644 --- a/tests/foreman/api/test_contentview.py +++ b/tests/foreman/api/test_contentview.py @@ -96,8 +96,7 @@ def apply_package_filter(content_view, repo, package, target_sat, inclusion=True assert cv_filter.id == cv_filter_rule.content_view_filter.id content_view.publish() content_view = content_view.read() - content_view_version_info = content_view.version[0].read() - return content_view_version_info + return content_view.version[0].read() class TestContentView: diff --git a/tests/foreman/api/test_errata.py b/tests/foreman/api/test_errata.py index 5bafb65d9b2..da257c8d983 100644 --- a/tests/foreman/api/test_errata.py +++ b/tests/foreman/api/test_errata.py @@ -76,12 +76,11 @@ def activation_key(module_sca_manifest_org, module_cv, module_lce, module_target module_cv, module_lce, )['content-view'] - activation_key = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( organization=module_sca_manifest_org, environment=module_lce, content_view=_cv, ).create() - return activation_key @pytest.fixture(scope='module') @@ -144,7 +143,7 @@ def _fetch_available_errata(host, expected_amount=None, timeout=120): for _ in range(timeout // 5): if expected_amount is None: return errata['results'] - elif len(errata['results']) == expected_amount: + if len(errata['results']) == expected_amount: return errata['results'] sleep(5) errata = host.errata() @@ -407,7 +406,7 @@ def package_applicability_changed_as_expected( prior_package = None # package must not have been present before this modification else: prior_package = package_filename - _applicables = { + return { 'result': True, 'errata_count': host.applicable_errata_count, 'package_count': host.applicable_package_count, @@ -416,7 +415,6 @@ def package_applicability_changed_as_expected( 'change_in_errata': change_in_errata, 'changed_errata': list(app_errata_diff_ids), } - return _applicables return True @@ -1347,6 +1345,7 @@ def _run_remote_command_on_content_host(command, vm, return_result=False): assert result.status == 0 if return_result: return result.stdout + return None def _set_prerequisites_for_swid_repos(vm): @@ -1688,7 +1687,7 @@ def test_positive_incremental_update_apply_to_envs_cvs( assert set(FAKE_9_YUM_SECURITY_ERRATUM).issubset(post_app_errata_ids) # expected packages from the security erratum were added to host added_packages = response['output']['changed_content'][0]['added_units']['rpm'] - assert 12 == len(added_packages) + assert len(added_packages) == 12 # expected that not all of the added packages will be applicable assert 8 == host_app_packages == rhel8_contenthost.applicable_package_count # install all of the newly added packages, recalculate applicability diff --git a/tests/foreman/api/test_filter.py b/tests/foreman/api/test_filter.py index ed61c98c76a..d13d5a7ecad 100644 --- a/tests/foreman/api/test_filter.py +++ b/tests/foreman/api/test_filter.py @@ -22,10 +22,9 @@ @pytest.fixture(scope='module') def module_perms(module_target_sat): """Search for provisioning template permissions. Set ``cls.ct_perms``.""" - ct_perms = module_target_sat.api.Permission().search( + return module_target_sat.api.Permission().search( query={'search': 'resource_type="ProvisioningTemplate"'} ) - return ct_perms @pytest.mark.tier1 diff --git a/tests/foreman/api/test_hostcollection.py b/tests/foreman/api/test_hostcollection.py index aea239ac1ad..985f989718e 100644 --- a/tests/foreman/api/test_hostcollection.py +++ b/tests/foreman/api/test_hostcollection.py @@ -28,8 +28,7 @@ @pytest.fixture(scope='module') def fake_hosts(module_org, module_target_sat): """Create content hosts that can be shared by tests.""" - hosts = [module_target_sat.api.Host(organization=module_org).create() for _ in range(2)] - return hosts + return [module_target_sat.api.Host(organization=module_org).create() for _ in range(2)] @pytest.mark.parametrize('name', **parametrized(valid_data_list())) diff --git a/tests/foreman/api/test_multiple_paths.py b/tests/foreman/api/test_multiple_paths.py index 30531f77025..8c683ca309a 100644 --- a/tests/foreman/api/test_multiple_paths.py +++ b/tests/foreman/api/test_multiple_paths.py @@ -130,7 +130,7 @@ def test_positive_get_status_code(self, entity_cls): logger.info('test_get_status_code arg: %s', entity_cls) response = client.get(entity_cls().path(), auth=get_credentials(), verify=False) response.raise_for_status() - assert http.client.OK == response.status_code + assert response.status_code == http.client.OK assert 'application/json' in response.headers['content-type'] @pytest.mark.tier1 @@ -151,7 +151,7 @@ def test_negative_get_unauthorized(self, entity_cls): """ logger.info('test_get_unauthorized arg: %s', entity_cls) response = client.get(entity_cls().path(), auth=(), verify=False) - assert http.client.UNAUTHORIZED == response.status_code + assert response.status_code == http.client.UNAUTHORIZED @pytest.mark.tier3 @pytest.mark.parametrize( @@ -173,7 +173,7 @@ def test_positive_post_status_code(self, entity_cls): :BZ: 1118015 """ response = entity_cls().create_raw() - assert http.client.CREATED == response.status_code + assert response.status_code == http.client.CREATED assert 'application/json' in response.headers['content-type'] @pytest.mark.tier1 @@ -195,7 +195,7 @@ def test_negative_post_unauthorized(self, entity_cls): """ server_cfg = user_nailgun_config() return_code = entity_cls(server_cfg).create_raw(create_missing=False).status_code - assert http.client.UNAUTHORIZED == return_code + assert return_code == http.client.UNAUTHORIZED class TestEntityId: @@ -217,7 +217,7 @@ def test_positive_get_status_code(self, entity_cls): """ entity = entity_cls(id=entity_cls().create_json()['id']) response = entity.read_raw() - assert http.client.OK == response.status_code + assert response.status_code == http.client.OK assert 'application/json' in response.headers['content-type'] @pytest.mark.tier1 @@ -248,7 +248,7 @@ def test_positive_put_status_code(self, entity_cls): auth=get_credentials(), verify=False, ) - assert http.client.OK == response.status_code + assert response.status_code == http.client.OK assert 'application/json' in response.headers['content-type'] @pytest.mark.tier1 @@ -325,7 +325,7 @@ def test_positive_put_and_get_requests(self, entity_cls): payload = _get_readable_attributes(new_entity) entity_attrs = entity_cls(id=entity['id']).read_json() for key, value in payload.items(): - assert key in entity_attrs.keys() + assert key in entity_attrs assert value == entity_attrs[key] @pytest.mark.tier1 @@ -349,7 +349,7 @@ def test_positive_post_and_get_requests(self, entity_cls): payload = _get_readable_attributes(entity) entity_attrs = entity_cls(id=entity_id).read_json() for key, value in payload.items(): - assert key in entity_attrs.keys() + assert key in entity_attrs assert value == entity_attrs[key] @pytest.mark.tier1 @@ -369,7 +369,7 @@ def test_positive_delete_and_get_requests(self, entity_cls): # Create an entity, delete it and get it. entity = entity_cls(id=entity_cls().create_json()['id']) entity.delete() - assert http.client.NOT_FOUND == entity.read_raw().status_code + assert entity.read_raw().status_code == http.client.NOT_FOUND class TestEntityRead: diff --git a/tests/foreman/api/test_organization.py b/tests/foreman/api/test_organization.py index 89988935f98..7edc09d0dc2 100644 --- a/tests/foreman/api/test_organization.py +++ b/tests/foreman/api/test_organization.py @@ -77,7 +77,7 @@ def test_positive_create(self, target_sat): if is_open('BZ:2228820'): assert response.status_code in [http.client.UNSUPPORTED_MEDIA_TYPE, 500] else: - assert http.client.UNSUPPORTED_MEDIA_TYPE == response.status_code + assert response.status_code == http.client.UNSUPPORTED_MEDIA_TYPE @pytest.mark.tier1 @pytest.mark.build_sanity diff --git a/tests/foreman/api/test_provisioningtemplate.py b/tests/foreman/api/test_provisioningtemplate.py index 95f0b3883f0..354f15ed47d 100644 --- a/tests/foreman/api/test_provisioningtemplate.py +++ b/tests/foreman/api/test_provisioningtemplate.py @@ -120,7 +120,7 @@ def tftpboot(module_org, module_target_sat): for setting in default_settings: if setting.value is None: setting.value = '' - setting.update(fields=['value'] or '') + setting.update(fields=['value']) class TestProvisioningTemplate: diff --git a/tests/foreman/api/test_registration.py b/tests/foreman/api/test_registration.py index 606dbae9dca..5b7554b480e 100644 --- a/tests/foreman/api/test_registration.py +++ b/tests/foreman/api/test_registration.py @@ -62,7 +62,7 @@ def test_host_registration_end_to_end( # Verify server.hostname and server.port from subscription-manager config assert module_target_sat.hostname == rhel_contenthost.subscription_config['server']['hostname'] - assert constants.CLIENT_PORT == rhel_contenthost.subscription_config['server']['port'] + assert rhel_contenthost.subscription_config['server']['port'] == constants.CLIENT_PORT # Update module_capsule_configured to include module_org/module_location nc = module_capsule_configured.nailgun_smart_proxy @@ -86,7 +86,7 @@ def test_host_registration_end_to_end( module_capsule_configured.hostname == rhel_contenthost.subscription_config['server']['hostname'] ) - assert constants.CLIENT_PORT == rhel_contenthost.subscription_config['server']['port'] + assert rhel_contenthost.subscription_config['server']['port'] == constants.CLIENT_PORT @pytest.mark.tier3 diff --git a/tests/foreman/api/test_repository.py b/tests/foreman/api/test_repository.py index 897c27d5f53..206dddb976f 100644 --- a/tests/foreman/api/test_repository.py +++ b/tests/foreman/api/test_repository.py @@ -488,7 +488,7 @@ def test_negative_update_to_invalid_download_policy(self, repo, target_sat): **datafactory.parametrized( [ {'content_type': content_type, 'download_policy': 'on_demand'} - for content_type in constants.REPO_TYPE.keys() + for content_type in constants.REPO_TYPE if content_type != 'yum' ] ), @@ -2301,7 +2301,7 @@ def test_positive_upload_file_to_file_repo(self, repo, target_sat): filesearch = target_sat.api.File().search( query={"search": f"name={constants.RPM_TO_UPLOAD}"} ) - assert constants.RPM_TO_UPLOAD == filesearch[0].name + assert filesearch[0].name == constants.RPM_TO_UPLOAD @pytest.mark.tier1 @pytest.mark.upgrade diff --git a/tests/foreman/api/test_role.py b/tests/foreman/api/test_role.py index 1ce1014f269..7d5a12bc591 100644 --- a/tests/foreman/api/test_role.py +++ b/tests/foreman/api/test_role.py @@ -72,7 +72,7 @@ def create_org_admin_role(self, target_sat, name=None, orgs=None, locs=None): :return dict: This function returns dict representation of cloned role data returned from 'clone' function """ - name = gen_string('alpha') if not name else name + name = name if name else gen_string('alpha') default_org_admin = target_sat.api.Role().search( query={'search': 'name="Organization admin"'} ) diff --git a/tests/foreman/api/test_subscription.py b/tests/foreman/api/test_subscription.py index 316ef4e7448..282dac528b0 100644 --- a/tests/foreman/api/test_subscription.py +++ b/tests/foreman/api/test_subscription.py @@ -54,7 +54,7 @@ def custom_repo(rh_repo, module_sca_manifest_org, module_target_sat): @pytest.fixture(scope='module') def module_ak(module_sca_manifest_org, rh_repo, custom_repo, module_target_sat): """rh_repo and custom_repo are included here to ensure their execution before the AK""" - module_ak = module_target_sat.api.ActivationKey( + return module_target_sat.api.ActivationKey( content_view=module_sca_manifest_org.default_content_view, max_hosts=100, organization=module_sca_manifest_org, @@ -63,7 +63,6 @@ def module_ak(module_sca_manifest_org, rh_repo, custom_repo, module_target_sat): ), auto_attach=True, ).create() - return module_ak @pytest.mark.tier1 diff --git a/tests/foreman/api/test_template_combination.py b/tests/foreman/api/test_template_combination.py index a10125e0a54..7e9d5f11be8 100644 --- a/tests/foreman/api/test_template_combination.py +++ b/tests/foreman/api/test_template_combination.py @@ -49,10 +49,10 @@ def test_positive_end_to_end_template_combination(request, module_target_sat, mo assert module_hostgroup.id == combination.hostgroup.id # DELETE - assert 1 == len(template.read().template_combinations) + assert len(template.read().template_combinations) == 1 combination.delete() with pytest.raises(HTTPError): combination.read() - assert 0 == len(template.read().template_combinations) + assert len(template.read().template_combinations) == 0 template.delete() module_hostgroup.delete() diff --git a/tests/foreman/api/test_templatesync.py b/tests/foreman/api/test_templatesync.py index d91c8ad378d..bda401ef373 100644 --- a/tests/foreman/api/test_templatesync.py +++ b/tests/foreman/api/test_templatesync.py @@ -693,7 +693,7 @@ def test_positive_import_json_output_name_key( template = target_sat.api.Template().imports( data={'repo': dir_path, 'organization_ids': [module_org.id]} ) - assert 'name' in template['message']['templates'][0].keys() + assert 'name' in template['message']['templates'][0] assert template_name == template['message']['templates'][0]['name'] @pytest.mark.tier2 @@ -748,7 +748,7 @@ def test_positive_import_json_output_file_key( template = module_target_sat.api.Template().imports( data={'repo': dir_path, 'organization_ids': [module_org.id]} ) - assert 'example_template.erb' == template['message']['templates'][0]['file'] + assert template['message']['templates'][0]['file'] == 'example_template.erb' @pytest.mark.tier2 def test_positive_import_json_output_corrupted_metadata( @@ -780,7 +780,7 @@ def test_positive_import_json_output_corrupted_metadata( ) assert not bool(template['message']['templates'][0]['imported']) assert ( - 'Failed to parse metadata' == template['message']['templates'][0]['additional_errors'] + template['message']['templates'][0]['additional_errors'] == 'Failed to parse metadata' ) @pytest.mark.skip_if_open('BZ:1787355') @@ -816,8 +816,8 @@ def test_positive_import_json_output_filtered_skip_message( ) assert not bool(template['message']['templates'][0]['imported']) assert ( - "Skipping, 'name' filtered out based on 'filter' and 'negate' settings" - == template['message']['templates'][0]['additional_info'] + template['message']['templates'][0]['additional_info'] + == "Skipping, 'name' filtered out based on 'filter' and 'negate' settings" ) @pytest.mark.tier2 @@ -850,8 +850,8 @@ def test_positive_import_json_output_no_name_error( ) assert not bool(template['message']['templates'][0]['imported']) assert ( - "No 'name' found in metadata" - == template['message']['templates'][0]['additional_errors'] + template['message']['templates'][0]['additional_errors'] + == "No 'name' found in metadata" ) @pytest.mark.tier2 @@ -884,8 +884,8 @@ def test_positive_import_json_output_no_model_error( ) assert not bool(template['message']['templates'][0]['imported']) assert ( - "No 'model' found in metadata" - == template['message']['templates'][0]['additional_errors'] + template['message']['templates'][0]['additional_errors'] + == "No 'model' found in metadata" ) @pytest.mark.tier2 @@ -918,8 +918,8 @@ def test_positive_import_json_output_blank_model_error( ) assert not bool(template['message']['templates'][0]['imported']) assert ( - "Template type was not found, are you missing a plugin?" - == template['message']['templates'][0]['additional_errors'] + template['message']['templates'][0]['additional_errors'] + == "Template type was not found, are you missing a plugin?" ) @pytest.mark.tier2 @@ -965,7 +965,7 @@ def test_positive_export_json_output( template['exported'] for template in exported_templates['message']['templates'] ].count(True) assert exported_count == 17 - assert 'name' in exported_templates['message']['templates'][0].keys() + assert 'name' in exported_templates['message']['templates'][0] assert ( target_sat.execute( f'[ -d {dir_path}/job_templates ] && ' diff --git a/tests/foreman/cli/test_activationkey.py b/tests/foreman/cli/test_activationkey.py index 68c43807fae..b4a0616ed4f 100644 --- a/tests/foreman/cli/test_activationkey.py +++ b/tests/foreman/cli/test_activationkey.py @@ -257,9 +257,8 @@ def test_negative_create_with_usage_limit_with_not_integers(module_org, limit, m module_target_sat.cli_factory.make_activation_key( {'organization-id': module_org.id, 'max-hosts': limit} ) - if isinstance(limit, int): - if limit < 1: - assert 'Max hosts cannot be less than one' in str(raise_ctx) + if isinstance(limit, int) and limit < 1: + assert 'Max hosts cannot be less than one' in str(raise_ctx) if isinstance(limit, str): assert 'Numeric value is required.' in str(raise_ctx) @@ -1404,7 +1403,7 @@ def test_positive_update_autoattach(module_org, module_target_sat): result = module_target_sat.cli.ActivationKey.update( {'auto-attach': new_value, 'id': new_ak['id'], 'organization-id': module_org.id} ) - assert 'Activation key updated.' == result[0]['message'] + assert result[0]['message'] == 'Activation key updated.' @pytest.mark.tier2 diff --git a/tests/foreman/cli/test_computeresource_azurerm.py b/tests/foreman/cli/test_computeresource_azurerm.py index 1621b48d12f..1756a0ed674 100644 --- a/tests/foreman/cli/test_computeresource_azurerm.py +++ b/tests/foreman/cli/test_computeresource_azurerm.py @@ -37,7 +37,7 @@ def azurerm_hostgroup( ): """Sets Hostgroup for AzureRm Host Provisioning""" - hgroup = sat_azure.api.HostGroup( + return sat_azure.api.HostGroup( architecture=sat_azure_default_architecture, compute_resource=module_azurerm_cr, domain=sat_azure_domain, @@ -46,7 +46,6 @@ def azurerm_hostgroup( operatingsystem=sat_azure_default_os, organization=[sat_azure_org], ).create() - return hgroup class TestAzureRMComputeResourceTestCase: @@ -344,29 +343,30 @@ def class_host_ft( Provisions the host on AzureRM using Finish template Later in tests this host will be used to perform assertions """ - with sat_azure.hammer_api_timeout(): - with sat_azure.skip_yum_update_during_provisioning(template='Kickstart default finish'): - host = sat_azure.cli.Host.create( - { - 'name': self.hostname, - 'compute-resource': module_azurerm_cr.name, - 'compute-attributes': self.compute_attrs, - 'interface': self.interfaces_attributes, - 'location-id': sat_azure_loc.id, - 'organization-id': sat_azure_org.id, - 'domain-id': sat_azure_domain.id, - 'domain': sat_azure_domain.name, - 'architecture-id': sat_azure_default_architecture.id, - 'operatingsystem-id': sat_azure_default_os.id, - 'root-password': gen_string('alpha'), - 'image': module_azurerm_custom_finishimg.name, - }, - timeout=1800000, - ) - yield host - with sat_azure.api_factory.satellite_setting('destroy_vm_on_host_delete=True'): - if sat_azure.cli.Host.exists(search=('name', host['name'])): - sat_azure.cli.Host.delete({'name': self.fullhostname}, timeout=1800000) + with sat_azure.hammer_api_timeout(), sat_azure.skip_yum_update_during_provisioning( + template='Kickstart default finish' + ): + host = sat_azure.cli.Host.create( + { + 'name': self.hostname, + 'compute-resource': module_azurerm_cr.name, + 'compute-attributes': self.compute_attrs, + 'interface': self.interfaces_attributes, + 'location-id': sat_azure_loc.id, + 'organization-id': sat_azure_org.id, + 'domain-id': sat_azure_domain.id, + 'domain': sat_azure_domain.name, + 'architecture-id': sat_azure_default_architecture.id, + 'operatingsystem-id': sat_azure_default_os.id, + 'root-password': gen_string('alpha'), + 'image': module_azurerm_custom_finishimg.name, + }, + timeout=1800000, + ) + yield host + with sat_azure.api_factory.satellite_setting('destroy_vm_on_host_delete=True'): + if sat_azure.cli.Host.exists(search=('name', host['name'])): + sat_azure.cli.Host.delete({'name': self.fullhostname}, timeout=1800000) @pytest.fixture(scope='class') def azureclient_host(self, azurermclient, class_host_ft): @@ -472,27 +472,26 @@ def class_host_ud( Provisions the host on AzureRM using UserData template Later in tests this host will be used to perform assertions """ - with sat_azure.hammer_api_timeout(): - with sat_azure.skip_yum_update_during_provisioning( - template='Kickstart default user data' - ): - host = sat_azure.cli.Host.create( - { - 'name': self.hostname, - 'compute-attributes': self.compute_attrs, - 'interface': self.interfaces_attributes, - 'image': module_azurerm_cloudimg.name, - 'hostgroup': azurerm_hostgroup.name, - 'location': sat_azure_loc.name, - 'organization': sat_azure_org.name, - 'operatingsystem-id': sat_azure_default_os.id, - }, - timeout=1800000, - ) - yield host - with sat_azure.api_factory.satellite_setting('destroy_vm_on_host_delete=True'): - if sat_azure.cli.Host.exists(search=('name', host['name'])): - sat_azure.cli.Host.delete({'name': self.fullhostname}, timeout=1800000) + with sat_azure.hammer_api_timeout(), sat_azure.skip_yum_update_during_provisioning( + template='Kickstart default user data' + ): + host = sat_azure.cli.Host.create( + { + 'name': self.hostname, + 'compute-attributes': self.compute_attrs, + 'interface': self.interfaces_attributes, + 'image': module_azurerm_cloudimg.name, + 'hostgroup': azurerm_hostgroup.name, + 'location': sat_azure_loc.name, + 'organization': sat_azure_org.name, + 'operatingsystem-id': sat_azure_default_os.id, + }, + timeout=1800000, + ) + yield host + with sat_azure.api_factory.satellite_setting('destroy_vm_on_host_delete=True'): + if sat_azure.cli.Host.exists(search=('name', host['name'])): + sat_azure.cli.Host.delete({'name': self.fullhostname}, timeout=1800000) @pytest.fixture(scope='class') def azureclient_host(self, azurermclient, class_host_ud): diff --git a/tests/foreman/cli/test_computeresource_libvirt.py b/tests/foreman/cli/test_computeresource_libvirt.py index a53959f277b..2a4720750a0 100644 --- a/tests/foreman/cli/test_computeresource_libvirt.py +++ b/tests/foreman/cli/test_computeresource_libvirt.py @@ -364,7 +364,7 @@ def test_negative_update(libvirt_url, options, module_target_sat): # check attributes have not changed assert result['name'] == comp_res['name'] options.pop('new-name', None) - for key in options.keys(): + for key in options: assert comp_res[key] == result[key] diff --git a/tests/foreman/cli/test_contentview.py b/tests/foreman/cli/test_contentview.py index 0b4ee4041ef..9b261f57218 100644 --- a/tests/foreman/cli/test_contentview.py +++ b/tests/foreman/cli/test_contentview.py @@ -233,7 +233,7 @@ def test_positive_update_filter(self, repo_setup, module_target_sat): } ) cvf = module_target_sat.cli.ContentView.filter.info({'id': cvf['filter-id']}) - assert 'security' == cvf['rules'][0]['types'] + assert cvf['rules'][0]['types'] == 'security' @pytest.mark.tier1 def test_positive_delete_by_id(self, module_org, module_target_sat): diff --git a/tests/foreman/cli/test_docker.py b/tests/foreman/cli/test_docker.py index a4dd51c17c2..10b1d1dd4fc 100644 --- a/tests/foreman/cli/test_docker.py +++ b/tests/foreman/cli/test_docker.py @@ -114,7 +114,7 @@ def test_positive_read_docker_tags(self, repo, module_target_sat): manifests_list = module_target_sat.cli.Docker.manifest.list({'repository-id': repo['id']}) # Some manifests do not have tags associated with it, ignore those # because we want to check the tag information - manifests = [m_iter for m_iter in manifests_list if not m_iter['tags'] == ''] + manifests = [m_iter for m_iter in manifests_list if m_iter['tags'] != ''] assert manifests tags_list = module_target_sat.cli.Docker.tag.list({'repository-id': repo['id']}) # Extract tag names for the repository out of docker tag list diff --git a/tests/foreman/cli/test_domain.py b/tests/foreman/cli/test_domain.py index 8b1c157c657..32f81369592 100644 --- a/tests/foreman/cli/test_domain.py +++ b/tests/foreman/cli/test_domain.py @@ -42,8 +42,7 @@ def valid_create_params(): @filtered_datapoint def invalid_create_params(): """Returns a list of invalid domain create parameters""" - params = [{'name': gen_string(str_type='utf8', length=256)}] - return params + return [{'name': gen_string(str_type='utf8', length=256)}] @filtered_datapoint @@ -66,8 +65,7 @@ def valid_update_params(): @filtered_datapoint def invalid_update_params(): """Returns a list of invalid domain update parameters""" - params = [{'name': ''}, {'name': gen_string(str_type='utf8', length=256)}] - return params + return [{'name': ''}, {'name': gen_string(str_type='utf8', length=256)}] @filtered_datapoint @@ -218,7 +216,7 @@ def test_negative_update(module_domain, options, module_target_sat): module_target_sat.cli.Domain.update(dict(options, id=module_domain.id)) # check - domain not updated result = module_target_sat.cli.Domain.info({'id': module_domain.id}) - for key in options.keys(): + for key in options: assert result[key] == getattr(module_domain, key) diff --git a/tests/foreman/cli/test_errata.py b/tests/foreman/cli/test_errata.py index bbfe7af1380..95bdbc3d256 100644 --- a/tests/foreman/cli/test_errata.py +++ b/tests/foreman/cli/test_errata.py @@ -358,7 +358,7 @@ def filter_sort_errata(sat, org, sort_by_date='issued', filter_by_org=None): elif filter_by_org == 'label': list_param['organization-label'] = org.label - sort_reversed = True if sort_order == 'DESC' else False + sort_reversed = sort_order == 'DESC' errata_list = sat.cli.Erratum.list(list_param) assert len(errata_list) > 0 @@ -1275,7 +1275,7 @@ def test_apply_errata_using_default_content_view(errata_host, module_sca_manifes # job invocation started, check status assert 'created' in _job_invoc[0]['message'] assert (_id := _job_invoc[0]['id']) - assert 'succeeded' == target_sat.cli.JobInvocation().info(options={'id': _id})['status'] + assert target_sat.cli.JobInvocation().info(options={'id': _id})['status'] == 'succeeded' start_and_wait_errata_recalculate(target_sat, errata_host) # Assert that the erratum is no longer applicable @@ -1331,7 +1331,7 @@ def test_update_applicable_package_using_default_content_view(errata_host, targe # job invocation created, assert status assert 'created' in _job_invoc[0]['message'] assert (_id := _job_invoc[0]['id']) - assert 'succeeded' == target_sat.cli.JobInvocation().info(options={'id': _id})['status'] + assert target_sat.cli.JobInvocation().info(options={'id': _id})['status'] == 'succeeded' start_and_wait_errata_recalculate(target_sat, errata_host) # Assert that the package is no longer applicable applicable_packages = target_sat.cli.Package.list( diff --git a/tests/foreman/cli/test_filter.py b/tests/foreman/cli/test_filter.py index 9c12b239089..4108ce07d6b 100644 --- a/tests/foreman/cli/test_filter.py +++ b/tests/foreman/cli/test_filter.py @@ -19,13 +19,12 @@ @pytest.fixture(scope='module') def module_perms(module_target_sat): """Search for provisioning template permissions. Set ``cls.ct_perms``.""" - perms = [ + return [ permission['name'] for permission in module_target_sat.cli.Filter.available_permissions( {"search": "resource_type=User"} ) ] - return perms @pytest.fixture diff --git a/tests/foreman/cli/test_host.py b/tests/foreman/cli/test_host.py index f7e69591f23..e748a50b532 100644 --- a/tests/foreman/cli/test_host.py +++ b/tests/foreman/cli/test_host.py @@ -232,7 +232,7 @@ def parse_cli_entity_list_help_message(help_message): name = name[:-1] # remove colon from name if 'Usage' in name: continue - elif 'Options' in name: + if 'Options' in name: # used together with previous_line when line (message) is appended to previous line options = parse_two_columns(content, options_start_with_dash=True) elif 'field sets' in name: @@ -1061,18 +1061,18 @@ def test_positive_parameter_crud(function_host, target_sat): {'host-id': function_host['id'], 'name': name, 'value': value} ) host = target_sat.cli.Host.info({'id': function_host['id']}) - assert name in host['parameters'].keys() + assert name in host['parameters'] assert value == host['parameters'][name] new_value = valid_data_list()[name] target_sat.cli.Host.set_parameter({'host-id': host['id'], 'name': name, 'value': new_value}) host = target_sat.cli.Host.info({'id': host['id']}) - assert name in host['parameters'].keys() + assert name in host['parameters'] assert new_value == host['parameters'][name] target_sat.cli.Host.delete_parameter({'host-id': host['id'], 'name': name}) host = target_sat.cli.Host.info({'id': host['id']}) - assert name not in host['parameters'].keys() + assert name not in host['parameters'] # -------------------------- HOST PARAMETER SCENARIOS ------------------------- @@ -1098,7 +1098,7 @@ def test_negative_add_parameter(function_host, target_sat): } ) host = target_sat.cli.Host.info({'id': function_host['id']}) - assert name not in host['parameters'].keys() + assert name not in host['parameters'] @pytest.mark.cli_host_parameter diff --git a/tests/foreman/cli/test_leapp_client.py b/tests/foreman/cli/test_leapp_client.py index 6ab248b0f92..4ea36bbf37a 100644 --- a/tests/foreman/cli/test_leapp_client.py +++ b/tests/foreman/cli/test_leapp_client.py @@ -91,8 +91,7 @@ def function_leapp_cv(module_target_sat, module_sca_manifest_org, leapp_repos, m function_leapp_cv.publish() cvv = function_leapp_cv.read().version[0] cvv.promote(data={'environment_ids': module_leapp_lce.id, 'force': True}) - function_leapp_cv = function_leapp_cv.read() - return function_leapp_cv + return function_leapp_cv.read() @pytest.fixture @@ -121,7 +120,7 @@ def leapp_repos( source = upgrade_path['source_version'] target = upgrade_path['target_version'] all_repos = [] - for rh_repo_key in RHEL_REPOS.keys(): + for rh_repo_key in RHEL_REPOS: release_version = RHEL_REPOS[rh_repo_key]['releasever'] if release_version in str(source) or release_version in target: prod = 'rhel' if 'rhel7' in rh_repo_key else rh_repo_key.split('_')[0] diff --git a/tests/foreman/cli/test_registration.py b/tests/foreman/cli/test_registration.py index 212be27b756..e3bc35fa58b 100644 --- a/tests/foreman/cli/test_registration.py +++ b/tests/foreman/cli/test_registration.py @@ -56,7 +56,7 @@ def test_host_registration_end_to_end( # Verify server.hostname and server.port from subscription-manager config assert module_target_sat.hostname == rhel_contenthost.subscription_config['server']['hostname'] - assert CLIENT_PORT == rhel_contenthost.subscription_config['server']['port'] + assert rhel_contenthost.subscription_config['server']['port'] == CLIENT_PORT # Update module_capsule_configured to include module_org/module_location module_target_sat.cli.Capsule.update( @@ -81,7 +81,7 @@ def test_host_registration_end_to_end( module_capsule_configured.hostname == rhel_contenthost.subscription_config['server']['hostname'] ) - assert CLIENT_PORT == rhel_contenthost.subscription_config['server']['port'] + assert rhel_contenthost.subscription_config['server']['port'] == CLIENT_PORT def test_upgrade_katello_ca_consumer_rpm( @@ -118,7 +118,7 @@ def test_upgrade_katello_ca_consumer_rpm( f'rpm -Uvh "http://{target_sat.hostname}/pub/{consumer_cert_name}-1.0-1.noarch.rpm"' ) # Check server URL is not Red Hat CDN's "subscription.rhsm.redhat.com" - assert 'subscription.rhsm.redhat.com' != vm.subscription_config['server']['hostname'] + assert vm.subscription_config['server']['hostname'] != 'subscription.rhsm.redhat.com' assert target_sat.hostname == vm.subscription_config['server']['hostname'] # Get consumer cert source file @@ -139,7 +139,7 @@ def test_upgrade_katello_ca_consumer_rpm( # Install new rpmbuild/RPMS/noarch/katello-ca-consumer-*-2.noarch.rpm assert vm.execute(f'yum install -y rpmbuild/RPMS/noarch/{new_consumer_cert_rpm}') # Check server URL is not Red Hat CDN's "subscription.rhsm.redhat.com" - assert 'subscription.rhsm.redhat.com' != vm.subscription_config['server']['hostname'] + assert vm.subscription_config['server']['hostname'] != 'subscription.rhsm.redhat.com' assert target_sat.hostname == vm.subscription_config['server']['hostname'] # Register as final check diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index 2bf4b6a3ba4..c030e54e113 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -47,7 +47,7 @@ def valid_feature_names(): @pytest.fixture def fixture_sca_vmsetup(request, module_sca_manifest_org, target_sat): """Create VM and register content host to Simple Content Access organization""" - if '_count' in request.param.keys(): + if '_count' in request.param: with Broker( nick=request.param['nick'], host_class=ContentHost, diff --git a/tests/foreman/cli/test_reporttemplates.py b/tests/foreman/cli/test_reporttemplates.py index f778eaa802b..9c9bcf0e5a6 100644 --- a/tests/foreman/cli/test_reporttemplates.py +++ b/tests/foreman/cli/test_reporttemplates.py @@ -706,7 +706,7 @@ def test_positive_generate_ansible_template(module_target_sat): :CaseImportance: Medium """ settings = module_target_sat.cli.Settings.list({'search': 'name=ansible_inventory_template'}) - assert 1 == len(settings) + assert len(settings) == 1 template_name = settings[0]['value'] report_list = module_target_sat.cli.ReportTemplate.list() diff --git a/tests/foreman/cli/test_repository.py b/tests/foreman/cli/test_repository.py index cc1a230bd96..db04dfd3305 100644 --- a/tests/foreman/cli/test_repository.py +++ b/tests/foreman/cli/test_repository.py @@ -652,7 +652,7 @@ def test_negative_update_to_invalid_download_policy(self, repo_options, repo, ta **parametrized( [ {'content-type': content_type, 'download-policy': 'on_demand'} - for content_type in REPO_TYPE.keys() + for content_type in REPO_TYPE if content_type != 'yum' if content_type != 'ostree' ] @@ -2660,7 +2660,7 @@ def test_positive_upload_file_to_file_repo(self, repo_options, repo, target_sat) filesearch = entities.File().search( query={"search": f"name={RPM_TO_UPLOAD} and repository={repo['name']}"} ) - assert RPM_TO_UPLOAD == filesearch[0].name + assert filesearch[0].name == RPM_TO_UPLOAD @pytest.mark.tier1 @pytest.mark.upgrade diff --git a/tests/foreman/cli/test_role.py b/tests/foreman/cli/test_role.py index 5eb4e8569f8..7ccdafdf4f1 100644 --- a/tests/foreman/cli/test_role.py +++ b/tests/foreman/cli/test_role.py @@ -296,7 +296,7 @@ def test_system_admin_role_end_to_end(self, target_sat): ).set({'name': "outofsync_interval", 'value': "32"}) sync_time = target_sat.cli.Settings.list({'search': 'name=outofsync_interval'})[0] # Asserts if the setting was updated successfully - assert '32' == sync_time['value'] + assert sync_time['value'] == '32' # Create another System Admin user using the first one system_admin = target_sat.cli.User.with_user( diff --git a/tests/foreman/cli/test_satellitesync.py b/tests/foreman/cli/test_satellitesync.py index dd80e98df8f..aac7d5f5b46 100644 --- a/tests/foreman/cli/test_satellitesync.py +++ b/tests/foreman/cli/test_satellitesync.py @@ -85,8 +85,7 @@ def export_import_cleanup_module(target_sat, module_org): @pytest.fixture def function_import_org(target_sat): """Creates an Organization for content import.""" - org = target_sat.api.Organization().create() - return org + return target_sat.api.Organization().create() @pytest.fixture @@ -152,14 +151,13 @@ def function_synced_rh_repo(request, target_sat, function_sca_manifest_org): # Update the download policy to 'immediate' and sync target_sat.cli.Repository.update({'download-policy': 'immediate', 'id': repo['id']}) target_sat.cli.Repository.synchronize({'id': repo['id']}, timeout='2h') - repo = target_sat.cli.Repository.info( + return target_sat.cli.Repository.info( { 'organization-id': function_sca_manifest_org.id, 'name': repo_dict['name'], 'product': repo_dict['product'], } ) - return repo @pytest.fixture diff --git a/tests/foreman/cli/test_subscription.py b/tests/foreman/cli/test_subscription.py index c6d053a4659..a7a74f4360c 100644 --- a/tests/foreman/cli/test_subscription.py +++ b/tests/foreman/cli/test_subscription.py @@ -28,7 +28,7 @@ def golden_ticket_host_setup(request, module_sca_manifest_org, module_target_sat ) new_repo = module_target_sat.cli_factory.make_repository({'product-id': new_product['id']}) module_target_sat.cli.Repository.synchronize({'id': new_repo['id']}) - new_ak = module_target_sat.cli_factory.make_activation_key( + return module_target_sat.cli_factory.make_activation_key( { 'lifecycle-environment': 'Library', 'content-view': 'Default Organization View', @@ -36,7 +36,6 @@ def golden_ticket_host_setup(request, module_sca_manifest_org, module_target_sat 'auto-attach': False, } ) - return new_ak @pytest.mark.tier1 @@ -166,7 +165,7 @@ def test_positive_subscription_list(function_entitlement_manifest_org, module_ta {'organization-id': function_entitlement_manifest_org.id}, per_page=False ) for column in ['start-date', 'end-date']: - assert column in subscription_list[0].keys() + assert column in subscription_list[0] @pytest.mark.tier2 diff --git a/tests/foreman/cli/test_templatesync.py b/tests/foreman/cli/test_templatesync.py index 9959ae18459..b0cc31b2003 100644 --- a/tests/foreman/cli/test_templatesync.py +++ b/tests/foreman/cli/test_templatesync.py @@ -44,7 +44,7 @@ def setUpClass(self, module_target_sat): """ # Check all Downloadable templates exists - if not requests.get(FOREMAN_TEMPLATE_IMPORT_URL).status_code == 200: + if requests.get(FOREMAN_TEMPLATE_IMPORT_URL).status_code != 200: pytest.fail('The foreman templates git url is not accessible') # Download the Test Template in test running folder diff --git a/tests/foreman/cli/test_user.py b/tests/foreman/cli/test_user.py index c549b9e667a..3646e301db0 100644 --- a/tests/foreman/cli/test_user.py +++ b/tests/foreman/cli/test_user.py @@ -56,8 +56,8 @@ def roles_helper(): for role_name in valid_usernames_list() + include_list: yield module_target_sat.cli_factory.make_role({'name': role_name}) - stubbed_roles = {role['id']: role for role in roles_helper()} - return stubbed_roles + # return stubbed roles + return {role['id']: role for role in roles_helper()} @pytest.mark.parametrize('email', **parametrized(valid_emails_list())) @pytest.mark.tier2 diff --git a/tests/foreman/cli/test_usergroup.py b/tests/foreman/cli/test_usergroup.py index 6ad115d96f6..1c757b4e766 100644 --- a/tests/foreman/cli/test_usergroup.py +++ b/tests/foreman/cli/test_usergroup.py @@ -22,8 +22,7 @@ @pytest.fixture def function_user_group(target_sat): """Create new usergroup per each test""" - user_group = target_sat.cli_factory.usergroup() - return user_group + return target_sat.cli_factory.usergroup() @pytest.mark.tier1 @@ -230,9 +229,9 @@ def test_negative_automate_bz1437578(ldap_auth_source, function_user_group, modu } ) assert ( - 'Could not create external user group: ' + result == 'Could not create external user group: ' 'Name is not found in the authentication source' 'Name Domain Users is a special group in AD.' ' Unfortunately, we cannot obtain membership information' - ' from a LDAP search and therefore sync it.' == result + ' from a LDAP search and therefore sync it.' ) diff --git a/tests/foreman/conftest.py b/tests/foreman/conftest.py index 59616f233b7..e867e118be3 100644 --- a/tests/foreman/conftest.py +++ b/tests/foreman/conftest.py @@ -66,7 +66,8 @@ def ui_session_record_property(request, record_property): test_file_path = request.node.fspath.strpath if any(directory in test_file_path for directory in test_directories): for fixture in request.node.fixturenames: - if request.fixturename != fixture: - if isinstance(request.getfixturevalue(fixture), Satellite): - sat = request.getfixturevalue(fixture) - sat.record_property = record_property + if request.fixturename != fixture and isinstance( + request.getfixturevalue(fixture), Satellite + ): + sat = request.getfixturevalue(fixture) + sat.record_property = record_property diff --git a/tests/foreman/destructive/test_capsule_loadbalancer.py b/tests/foreman/destructive/test_capsule_loadbalancer.py index a0675abec2b..990a61b8f09 100644 --- a/tests/foreman/destructive/test_capsule_loadbalancer.py +++ b/tests/foreman/destructive/test_capsule_loadbalancer.py @@ -273,7 +273,7 @@ def test_client_register_through_lb( loadbalancer_setup['setup_haproxy']['haproxy'].hostname in rhel_contenthost.subscription_config['server']['hostname'] ) - assert CLIENT_PORT == rhel_contenthost.subscription_config['server']['port'] + assert rhel_contenthost.subscription_config['server']['port'] == CLIENT_PORT assert loadbalancer_setup['module_target_sat'].cli.Host.info( {'name': rhel_contenthost.hostname}, output_format='json' )['content-information']['content-source']['name'] in [ @@ -294,7 +294,7 @@ def test_client_register_through_lb( loadbalancer_setup['setup_haproxy']['haproxy'].hostname in rhel_contenthost.subscription_config['server']['hostname'] ) - assert CLIENT_PORT == rhel_contenthost.subscription_config['server']['port'] + assert rhel_contenthost.subscription_config['server']['port'] == CLIENT_PORT hosts = loadbalancer_setup['module_target_sat'].cli.Host.list( {'organization-id': loadbalancer_setup['module_org'].id} diff --git a/tests/foreman/destructive/test_discoveredhost.py b/tests/foreman/destructive/test_discoveredhost.py index bcf73a14ed7..8034957ec72 100644 --- a/tests/foreman/destructive/test_discoveredhost.py +++ b/tests/foreman/destructive/test_discoveredhost.py @@ -34,7 +34,7 @@ def _read_log(ch, pattern): def _wait_for_log(channel, pattern, timeout=5, delay=0.2): """_read_log method enclosed in wait_for method""" - matching_log = wait_for( + return wait_for( _read_log, func_args=( channel, @@ -45,7 +45,6 @@ def _wait_for_log(channel, pattern, timeout=5, delay=0.2): delay=delay, logger=logger, ) - return matching_log def _assert_discovered_host(host, channel=None, user_config=None, sat=None): diff --git a/tests/foreman/destructive/test_ldap_authentication.py b/tests/foreman/destructive/test_ldap_authentication.py index 304c608734a..58f3121dbec 100644 --- a/tests/foreman/destructive/test_ldap_authentication.py +++ b/tests/foreman/destructive/test_ldap_authentication.py @@ -198,9 +198,8 @@ def test_positive_create_with_https( assert ldap_source['ldap_server']['port'] == '636' with module_target_sat.ui_session( test_name, username, auth_data['ldap_user_passwd'] - ) as ldapsession: - with pytest.raises(NavigationTriesExceeded): - ldapsession.user.search('') + ) as ldapsession, pytest.raises(NavigationTriesExceeded): + ldapsession.user.search('') assert module_target_sat.api.User().search(query={'search': f'login="{username}"'}) diff --git a/tests/foreman/destructive/test_realm.py b/tests/foreman/destructive/test_realm.py index a4baa15e7bf..cbddcdc3bc8 100644 --- a/tests/foreman/destructive/test_realm.py +++ b/tests/foreman/destructive/test_realm.py @@ -87,7 +87,7 @@ def test_positive_realm_info_name( ) request.addfinalizer(lambda: module_target_sat.cli.Realm.delete({'id': realm['id']})) info = module_target_sat.cli.Realm.info({'name': realm['name']}) - for key in info.keys(): + for key in info: assert info[key] == realm[key] @@ -115,7 +115,7 @@ def test_positive_realm_info_id( ) request.addfinalizer(lambda: module_target_sat.cli.Realm.delete({'id': realm['id']})) info = module_target_sat.cli.Realm.info({'id': realm['id']}) - for key in info.keys(): + for key in info: assert info[key] == realm[key] assert info == module_target_sat.cli.Realm.info({'id': realm['id']}) diff --git a/tests/foreman/longrun/test_inc_updates.py b/tests/foreman/longrun/test_inc_updates.py index 7f916b03859..bc44be316ae 100644 --- a/tests/foreman/longrun/test_inc_updates.py +++ b/tests/foreman/longrun/test_inc_updates.py @@ -50,10 +50,9 @@ def dev_lce(module_sca_manifest_org): @pytest.fixture(scope='module') def qe_lce(module_sca_manifest_org, dev_lce): - qe_lce = entities.LifecycleEnvironment( + return entities.LifecycleEnvironment( name='QE', prior=dev_lce, organization=module_sca_manifest_org ).create() - return qe_lce @pytest.fixture(scope='module') @@ -91,8 +90,7 @@ def module_cv(module_sca_manifest_org, sat_client_repo, custom_repo): repository=[sat_client_repo.id, custom_repo.id], ).create() module_cv.publish() - module_cv = module_cv.read() - return module_cv + return module_cv.read() @pytest.fixture(scope='module') diff --git a/tests/foreman/longrun/test_oscap.py b/tests/foreman/longrun/test_oscap.py index 045f18db639..53777de356b 100644 --- a/tests/foreman/longrun/test_oscap.py +++ b/tests/foreman/longrun/test_oscap.py @@ -70,10 +70,7 @@ def default_proxy(module_target_sat): @pytest.fixture(scope='module') def lifecycle_env(module_org): """Create lifecycle environment""" - lce_env = entities.LifecycleEnvironment( - organization=module_org, name=gen_string('alpha') - ).create() - return lce_env + return entities.LifecycleEnvironment(organization=module_org, name=gen_string('alpha')).create() @pytest.fixture(scope='module') diff --git a/tests/foreman/maintain/test_advanced.py b/tests/foreman/maintain/test_advanced.py index 2771994d568..2453f27a3ae 100644 --- a/tests/foreman/maintain/test_advanced.py +++ b/tests/foreman/maintain/test_advanced.py @@ -28,13 +28,12 @@ def get_satellite_capsule_repos( os_major_ver = get_sat_rhel_version().major if product == 'capsule': product = 'satellite-capsule' - repos = [ + return [ f'{product}-{x_y_release}-for-rhel-{os_major_ver}-x86_64-rpms', f'satellite-maintenance-{x_y_release}-for-rhel-{os_major_ver}-x86_64-rpms', f'rhel-{os_major_ver}-for-x86_64-baseos-rpms', f'rhel-{os_major_ver}-for-x86_64-appstream-rpms', ] - return repos def test_positive_advanced_run_service_restart(sat_maintain): diff --git a/tests/foreman/ui/test_acs.py b/tests/foreman/ui/test_acs.py index 726a60c9ccb..40da1c22002 100644 --- a/tests/foreman/ui/test_acs.py +++ b/tests/foreman/ui/test_acs.py @@ -239,7 +239,7 @@ def gen_params(): # It loops through the keys in the parameters dictionary, and uses the keys to create a scenario ID # and then it uses the scenario ID to access the scenario values from the parameters dictionary. # The code then adds the scenario values to the list of scenario values. - for acs in parameters_dict.keys(): + for acs in parameters_dict: if not acs.startswith('_'): for cnt in parameters_dict[acs]: if not cnt.startswith('_'): diff --git a/tests/foreman/ui/test_capsulecontent.py b/tests/foreman/ui/test_capsulecontent.py index f2e8db514e3..43fc34b430f 100644 --- a/tests/foreman/ui/test_capsulecontent.py +++ b/tests/foreman/ui/test_capsulecontent.py @@ -229,4 +229,4 @@ def test_positive_content_counts_for_mixed_cv( # Remove the LCEs from Capsule and ensure they are not listed anymore. session.capsule.edit(module_capsule_configured.hostname, remove_all_lces=True) details = session.capsule.read_details(module_capsule_configured.hostname) - assert 'content' not in details.keys(), 'Content still listed for removed LCEs' + assert 'content' not in details, 'Content still listed for removed LCEs' diff --git a/tests/foreman/ui/test_containerimagetag.py b/tests/foreman/ui/test_containerimagetag.py index 579ce53f3e9..41f8960d96d 100644 --- a/tests/foreman/ui/test_containerimagetag.py +++ b/tests/foreman/ui/test_containerimagetag.py @@ -70,5 +70,5 @@ def test_positive_search(session, module_org, module_product, module_repository) None, ) assert module_product.name == repo_line['Product'] - assert DEFAULT_CV == repo_line['Content View'] + assert repo_line['Content View'] == DEFAULT_CV assert 'Success' in repo_line['Last Sync'] diff --git a/tests/foreman/ui/test_contenthost.py b/tests/foreman/ui/test_contenthost.py index ffbe571c5b2..5f351076e5b 100644 --- a/tests/foreman/ui/test_contenthost.py +++ b/tests/foreman/ui/test_contenthost.py @@ -116,7 +116,7 @@ def get_rhel_lifecycle_support(rhel_version): rhel_lifecycle_status = 'Unknown' if rhel_version not in rhels: return rhel_lifecycle_status - elif rhels.index(rhel_version) <= 1: + if rhels.index(rhel_version) <= 1: rhel_lifecycle_status = 'Full support' elif rhels.index(rhel_version) == 2: rhel_lifecycle_status = 'Approaching end of maintenance support' diff --git a/tests/foreman/ui/test_discoveredhost.py b/tests/foreman/ui/test_discoveredhost.py index 92ea28d185a..64476188f89 100644 --- a/tests/foreman/ui/test_discoveredhost.py +++ b/tests/foreman/ui/test_discoveredhost.py @@ -40,8 +40,7 @@ def _is_host_reachable(host, retries=12, iteration_sleep=5, expect_reachable=Tru result = ssh.command(cmd.format(retries, host, operator, iteration_sleep)) if expect_reachable: return not result.status - else: - return bool(result.status) + return bool(result.status) @pytest.mark.tier3 diff --git a/tests/foreman/ui/test_host.py b/tests/foreman/ui/test_host.py index b3564fb04b1..6db27252587 100644 --- a/tests/foreman/ui/test_host.py +++ b/tests/foreman/ui/test_host.py @@ -60,7 +60,7 @@ def ui_user(ui_user, smart_proxy_location, module_target_sat): @pytest.fixture def scap_policy(scap_content, target_sat): - scap_policy = target_sat.cli_factory.make_scap_policy( + return target_sat.cli_factory.make_scap_policy( { 'name': gen_string('alpha'), 'deploy-by': 'ansible', @@ -70,7 +70,6 @@ def scap_policy(scap_content, target_sat): 'weekday': OSCAP_WEEKDAY['friday'].lower(), } ) - return scap_policy second_scap_policy = scap_policy @@ -1090,8 +1089,8 @@ def test_rex_new_ui(session, target_sat, rex_contenthost): task_status = target_sat.api.ForemanTask(id=task_result[0].id).poll() assert task_status['result'] == 'success' recent_jobs = session.host_new.get_details(hostname, "overview.recent_jobs")['overview'] - assert "Run ls" == recent_jobs['recent_jobs']['finished']['table'][0]['column0'] - assert "succeeded" == recent_jobs['recent_jobs']['finished']['table'][0]['column2'] + assert recent_jobs['recent_jobs']['finished']['table'][0]['column0'] == "Run ls" + assert recent_jobs['recent_jobs']['finished']['table'][0]['column2'] == "succeeded" @pytest.mark.tier4 @@ -1216,18 +1215,18 @@ def test_positive_update_delete_package( if not is_open('BZ:2132680'): product_name = module_repos_collection_with_setup.custom_product.name repos = session.host_new.get_repo_sets(client.hostname, product_name) - assert 'Enabled' == repos[0].status + assert repos[0].status == 'Enabled' session.host_new.override_repo_sets( client.hostname, product_name, "Override to disabled" ) - assert 'Disabled' == repos[0].status + assert repos[0].status == 'Disabled' session.host_new.install_package(client.hostname, FAKE_8_CUSTOM_PACKAGE_NAME) result = client.run(f'yum install -y {FAKE_7_CUSTOM_PACKAGE}') assert result.status != 0 session.host_new.override_repo_sets( client.hostname, product_name, "Override to enabled" ) - assert 'Enabled' == repos[0].status + assert repos[0].status == 'Enabled' # refresh repos on system client.run('subscription-manager repos') # install package @@ -1284,7 +1283,7 @@ def test_positive_update_delete_package( task_status = target_sat.api.ForemanTask(id=task_result[0].id).poll() assert task_status['result'] == 'success' packages = session.host_new.get_packages(client.hostname, FAKE_8_CUSTOM_PACKAGE_NAME) - assert 'table' not in packages.keys() + assert 'table' not in packages result = client.run(f'rpm -q {FAKE_8_CUSTOM_PACKAGE}') assert result.status != 0 @@ -1361,7 +1360,7 @@ def test_positive_apply_erratum( assert task_status['result'] == 'success' # verify values = session.host_new.get_details(client.hostname, widget_names='content.errata') - assert 'table' not in values['content']['errata'].keys() + assert 'table' not in values['content']['errata'] result = client.run( 'yum update --assumeno --security | grep "No packages needed for security"' ) diff --git a/tests/foreman/ui/test_hostcollection.py b/tests/foreman/ui/test_hostcollection.py index 546e70faae0..b6c90d685ec 100644 --- a/tests/foreman/ui/test_hostcollection.py +++ b/tests/foreman/ui/test_hostcollection.py @@ -93,10 +93,9 @@ def vm_host_collection(module_target_sat, module_org_with_parameter, vm_content_ module_target_sat.api.Host().search(query={'search': f'name={host.hostname}'})[0].id for host in vm_content_hosts ] - host_collection = module_target_sat.api.HostCollection( + return module_target_sat.api.HostCollection( host=host_ids, organization=module_org_with_parameter ).create() - return host_collection @pytest.fixture @@ -107,10 +106,9 @@ def vm_host_collection_module_stream( module_target_sat.api.Host().search(query={'search': f'name={host.hostname}'})[0].id for host in vm_content_hosts_module_stream ] - host_collection = module_target_sat.api.HostCollection( + return module_target_sat.api.HostCollection( host=host_ids, organization=module_org_with_parameter ).create() - return host_collection def _run_remote_command_on_content_hosts(command, vm_clients): @@ -136,7 +134,7 @@ def _is_package_installed( if result.status == 0 and expect_installed: installed += 1 break - elif result.status != 0 and not expect_installed: + if result.status != 0 and not expect_installed: installed -= 1 break if ind < retries - 1: @@ -146,8 +144,7 @@ def _is_package_installed( if expect_installed: return installed == len(vm_clients) - else: - return bool(installed) + return bool(installed) def _install_package_with_assertion(vm_clients, package_name): diff --git a/tests/foreman/ui/test_ldap_authentication.py b/tests/foreman/ui/test_ldap_authentication.py index 8c799a72dc8..6fcb71a7efa 100644 --- a/tests/foreman/ui/test_ldap_authentication.py +++ b/tests/foreman/ui/test_ldap_authentication.py @@ -406,9 +406,8 @@ def test_positive_delete_external_roles( ) with target_sat.ui_session( test_name, ldap_data['ldap_user_name'], ldap_data['ldap_user_passwd'] - ) as ldapsession: - with pytest.raises(NavigationTriesExceeded): - ldapsession.location.create({'name': gen_string('alpha')}) + ) as ldapsession, pytest.raises(NavigationTriesExceeded): + ldapsession.location.create({'name': gen_string('alpha')}) @pytest.mark.parametrize('ldap_auth_source', ['AD', 'IPA'], indirect=True) @@ -677,7 +676,7 @@ def test_positive_add_katello_role_with_org( results = session.activationkey.search(ak_name) assert results[0]['Name'] == ak_name session.organization.select(different_org.name) - assert not session.activationkey.search(ak_name)[0]['Name'] == ak_name + assert session.activationkey.search(ak_name)[0]['Name'] != ak_name ak = ( target_sat.api.ActivationKey(organization=module_org) .search(query={'search': f'name={ak_name}'})[0] @@ -761,9 +760,8 @@ def test_positive_login_user_basic_roles( target_sat.api_factory.create_role_permissions(role, permissions) with target_sat.ui_session( test_name, ldap_data['ldap_user_name'], ldap_data['ldap_user_passwd'] - ) as ldapsession: - with pytest.raises(NavigationTriesExceeded): - ldapsession.usergroup.search('') + ) as ldapsession, pytest.raises(NavigationTriesExceeded): + ldapsession.usergroup.search('') with session: session.user.update(ldap_data['ldap_user_name'], {'roles.resources.assigned': [role.name]}) with target_sat.ui_session( @@ -796,9 +794,8 @@ def test_positive_login_user_password_otp( ) with target_sat.ui_session( test_name, default_ipa_host.ipa_otp_username, otp_pass - ) as ldapsession: - with pytest.raises(NavigationTriesExceeded): - ldapsession.user.search('') + ) as ldapsession, pytest.raises(NavigationTriesExceeded): + ldapsession.user.search('') users = target_sat.api.User().search( query={'search': f'login="{default_ipa_host.ipa_otp_username}"'} ) @@ -1215,12 +1212,11 @@ def test_userlist_with_external_admin( # verify the users count with local admin and remote/external admin with target_sat.ui_session( user=idm_admin, password=settings.server.ssh_password - ) as remote_admin_session: - with target_sat.ui_session( - user=settings.server.admin_username, password=settings.server.admin_password - ) as local_admin_session: - assert local_admin_session.user.search(idm_user)[0]['Username'] == idm_user - assert remote_admin_session.user.search(idm_user)[0]['Username'] == idm_user + ) as remote_admin_session, target_sat.ui_session( + user=settings.server.admin_username, password=settings.server.admin_password + ) as local_admin_session: + assert local_admin_session.user.search(idm_user)[0]['Username'] == idm_user + assert remote_admin_session.user.search(idm_user)[0]['Username'] == idm_user @pytest.mark.skip_if_open('BZ:1883209') diff --git a/tests/foreman/ui/test_organization.py b/tests/foreman/ui/test_organization.py index cbca5ac3131..e407f06b6cb 100644 --- a/tests/foreman/ui/test_organization.py +++ b/tests/foreman/ui/test_organization.py @@ -343,7 +343,7 @@ def test_positive_product_view_organization_switch(session, module_org, module_p with session: assert session.product.search(module_product.name) session.organization.select(org_name="Default Organization") - assert not session.product.search(module_product.name) == module_product.name + assert session.product.search(module_product.name) != module_product.name def test_positive_prepare_for_sca_only_organization(target_sat, function_entitlement_manifest_org): diff --git a/tests/foreman/ui/test_provisioningtemplate.py b/tests/foreman/ui/test_provisioningtemplate.py index bc88d687f88..da2b8446dce 100644 --- a/tests/foreman/ui/test_provisioningtemplate.py +++ b/tests/foreman/ui/test_provisioningtemplate.py @@ -200,7 +200,7 @@ def test_positive_verify_supported_templates_rhlogo(target_sat, module_org, modu with target_sat.ui_session() as session: session.organization.select(org_name=module_org.name) session.location.select(loc_name=module_location.name) - for template in random_templates.keys(): + for template in random_templates: assert ( session.provisioningtemplate.is_locked(template) == random_templates[template]['locked'] diff --git a/tests/foreman/ui/test_registration.py b/tests/foreman/ui/test_registration.py index 22c34545ac7..51d608eec4d 100644 --- a/tests/foreman/ui/test_registration.py +++ b/tests/foreman/ui/test_registration.py @@ -539,7 +539,7 @@ def test_positive_host_registration_with_non_admin_user( # Verify server.hostname and server.port from subscription-manager config assert target_sat.hostname == rhel8_contenthost.subscription_config['server']['hostname'] - assert constants.CLIENT_PORT == rhel8_contenthost.subscription_config['server']['port'] + assert rhel8_contenthost.subscription_config['server']['port'] == constants.CLIENT_PORT @pytest.mark.tier2 diff --git a/tests/foreman/ui/test_subscription.py b/tests/foreman/ui/test_subscription.py index 9981e371cd8..45bfcd47d91 100644 --- a/tests/foreman/ui/test_subscription.py +++ b/tests/foreman/ui/test_subscription.py @@ -93,9 +93,8 @@ def test_positive_end_to_end(session, target_sat): ] org = target_sat.api.Organization().create() _, temporary_local_manifest_path = mkstemp(prefix='manifest-', suffix='.zip') - with clone() as manifest: - with open(temporary_local_manifest_path, 'wb') as file_handler: - file_handler.write(manifest.content.read()) + with clone() as manifest, open(temporary_local_manifest_path, 'wb') as file_handler: + file_handler.write(manifest.content.read()) with session: session.organization.select(org.name) # Ignore "Danger alert: Katello::Errors::UpstreamConsumerNotFound'" as server will connect diff --git a/tests/robottelo/conftest.py b/tests/robottelo/conftest.py index d8ffb1ad75b..dbd1fe41b50 100644 --- a/tests/robottelo/conftest.py +++ b/tests/robottelo/conftest.py @@ -1,3 +1,4 @@ +import contextlib import glob import os from pathlib import Path @@ -44,8 +45,6 @@ def exec_test(request, dummy_test): yield report_file for logfile in glob.glob('robottelo*.log'): os.remove(logfile) - try: - os.remove(report_file) - except OSError: + with contextlib.suppress(OSError): # the file might not exist if the test fails prematurely - pass + os.remove(report_file) diff --git a/tests/robottelo/test_cli.py b/tests/robottelo/test_cli.py index c6e8bffd846..a2568f5a584 100644 --- a/tests/robottelo/test_cli.py +++ b/tests/robottelo/test_cli.py @@ -146,9 +146,9 @@ def assert_response_error(self, expected_error, stderr='some error'): def test_add_operating_system(self, construct, execute): """Check command_sub edited when executing add_operating_system""" options = {'foo': 'bar'} - assert 'add-operatingsystem' != Base.command_sub + assert Base.command_sub != 'add-operatingsystem' assert execute.return_value == Base.add_operating_system(options) - assert 'add-operatingsystem' == Base.command_sub + assert Base.command_sub == 'add-operatingsystem' construct.assert_called_once_with(options) execute.assert_called_once_with(construct.return_value) @@ -158,7 +158,7 @@ def test_add_create_with_empty_result(self, construct, execute): """Check command create when result is empty""" execute.return_value = [] assert execute.return_value == Base.create() - assert 'create' == Base.command_sub + assert Base.command_sub == 'create' construct.assert_called_once_with({}) execute.assert_called_once_with(construct.return_value, output_format='csv', timeout=None) @@ -169,7 +169,7 @@ def test_add_create_with_result_dct_without_id(self, construct, execute, info): """Check command create when result has dct but dct hasn't id key""" execute.return_value = [{'not_id': 'foo'}] assert execute.return_value == Base.create() - assert 'create' == Base.command_sub + assert Base.command_sub == 'create' construct.assert_called_once_with({}) execute.assert_called_once_with(construct.return_value, output_format='csv', timeout=None) assert not info.called @@ -184,7 +184,7 @@ def test_add_create_with_result_dct_with_id_not_required_org(self, construct, ex execute.return_value = [{'id': 'foo', 'bar': 'bas'}] Base.command_requires_org = False assert execute.return_value == Base.create() - assert 'create' == Base.command_sub + assert Base.command_sub == 'create' construct.assert_called_once_with({}) execute.assert_called_once_with(construct.return_value, output_format='csv', timeout=None) info.assert_called_once_with({'id': 'foo'}) @@ -199,7 +199,7 @@ def test_add_create_with_result_dct_with_id_required_org(self, construct, execut execute.return_value = [{'id': 'foo', 'bar': 'bas'}] Base.command_requires_org = True assert execute.return_value == Base.create({'organization-id': 'org-id'}) - assert 'create' == Base.command_sub + assert Base.command_sub == 'create' construct.assert_called_once_with({'organization-id': 'org-id'}) execute.assert_called_once_with(construct.return_value, output_format='csv', timeout=None) info.assert_called_once_with({'id': 'foo', 'organization-id': 'org-id'}) @@ -214,7 +214,7 @@ def test_add_create_with_result_dct_id_required_org_error(self, construct, execu Base.command_requires_org = True with pytest.raises(CLIError): Base.create() - assert 'create' == Base.command_sub + assert Base.command_sub == 'create' construct.assert_called_once_with({}) execute.assert_called_once_with(construct.return_value, output_format='csv', timeout=None) @@ -300,7 +300,7 @@ def test_exists_with_option_and_no_empty_return(self, lst_method): my_options = {'search': 'foo=bar'} response = Base.exists(my_options, search=['id', 1]) lst_method.assert_called_once_with(my_options) - assert 1 == response + assert response == 1 @mock.patch('robottelo.cli.base.Base.command_requires_org') def test_info_requires_organization_id(self, _): # noqa: PT019 - not a fixture @@ -366,7 +366,7 @@ def test_info_parsing_response(self, construct, execute, parse): def test_list_with_default_per_page(self, construct, execute): """Check list method set per_page as 1000 by default""" assert execute.return_value == Base.list(options={'organization-id': 1}) - assert 'list' == Base.command_sub + assert Base.command_sub == 'list' construct.assert_called_once_with({'organization-id': 1, 'per-page': 10000}) execute.assert_called_once_with(construct.return_value, output_format='csv') diff --git a/tests/robottelo/test_decorators.py b/tests/robottelo/test_decorators.py index 0f8ac441ce9..6c5e60f568a 100644 --- a/tests/robottelo/test_decorators.py +++ b/tests/robottelo/test_decorators.py @@ -28,12 +28,12 @@ def test_create_and_not_add_to_cache(self, make_foo): """ make_foo(cached=False) assert 'foo' not in decorators.OBJECT_CACHE - assert decorators.OBJECT_CACHE == {} + assert {} == decorators.OBJECT_CACHE def test_build_cache(self, make_foo): """Create a new object and add it to the cache.""" obj = make_foo(cached=True) - assert decorators.OBJECT_CACHE == {'foo': {'id': 42}} + assert {'foo': {'id': 42}} == decorators.OBJECT_CACHE assert id(decorators.OBJECT_CACHE['foo']) == id(obj) def test_return_from_cache(self, make_foo): diff --git a/tests/robottelo/test_dependencies.py b/tests/robottelo/test_dependencies.py index 185f0866737..78b0dc499ea 100644 --- a/tests/robottelo/test_dependencies.py +++ b/tests/robottelo/test_dependencies.py @@ -1,4 +1,5 @@ """Test important behavior in robottelo's direct dependencies""" +import contextlib def test_cryptography(): @@ -115,10 +116,8 @@ def test_tenacity(): def test(): raise Exception('test') - try: + with contextlib.suppress(Exception): test() - except Exception: - pass def test_testimony(): diff --git a/tests/robottelo/test_func_locker.py b/tests/robottelo/test_func_locker.py index ad4ab5c74aa..d0da97431e0 100644 --- a/tests/robottelo/test_func_locker.py +++ b/tests/robottelo/test_func_locker.py @@ -35,9 +35,7 @@ def __init__(self): def read(self): with open(self.file_name) as cf: - content = cf.read() - - return content + return cf.read() def write(self, content): with open(self.file_name, 'wb') as cf: @@ -98,9 +96,10 @@ def simple_recursive_locking_function(): """try to trigger the same lock from the same process, an exception should be expected """ - with func_locker.locking_function(simple_locked_function): - with func_locker.locking_function(simple_locked_function): - pass + with func_locker.locking_function(simple_locked_function), func_locker.locking_function( + simple_locked_function + ): + pass return 'I should not be reached' @@ -126,9 +125,10 @@ def simple_function_to_lock(): def simple_with_locking_function(index=None): global counter_file time.sleep(0.05) - with func_locker.locking_function(simple_locked_function): - with open(_get_function_lock_path('simple_locked_function')) as rf: - content = rf.read() + with func_locker.locking_function(simple_locked_function), open( + _get_function_lock_path('simple_locked_function') + ) as rf: + content = rf.read() if index is not None: saved_counter = int(counter_file.read()) @@ -169,7 +169,7 @@ def simple_scoped_lock_function(): """This function do nothing, when called the lock function must create a lock file """ - return None + return @func_locker.lock_function @@ -182,14 +182,14 @@ def simple_scoped_locking_function(): ): pass - return None + return def simple_function_not_locked(): """This function do nothing, when called with locking, exception must be raised that this function is not locked """ - return None + return class TestFuncLocker: @@ -234,9 +234,10 @@ def test_locker_file_location_when_in_class(self): content = '' assert str(os.getpid()) != content - with func_locker.locking_function(SimpleClass.simple_function_to_lock): - with open(file_path) as rf: - content = rf.read() + with func_locker.locking_function(SimpleClass.simple_function_to_lock), open( + file_path + ) as rf: + content = rf.read() assert str(os.getpid()) == content @@ -248,9 +249,10 @@ def test_locker_file_location_when_in_class(self): content = '' assert str(os.getpid()) != content - with func_locker.locking_function(SimpleClass.simple_function_to_lock_cls): - with open(file_path) as rf: - content = rf.read() + with func_locker.locking_function(SimpleClass.simple_function_to_lock_cls), open( + file_path + ) as rf: + content = rf.read() assert str(os.getpid()) == content @@ -294,9 +296,10 @@ def test_locker_file_location_when_in_class(self): else: content = '' assert str(os.getpid()) != content - with func_locker.locking_function(SimpleClass.SubClass.simple_function_to_lock_cls): - with open(file_path) as rf: - content = rf.read() + with func_locker.locking_function(SimpleClass.SubClass.simple_function_to_lock_cls), open( + file_path + ) as rf: + content = rf.read() assert str(os.getpid()) == content @@ -407,7 +410,7 @@ def test_scoped_with_locking(self): assert os.path.exists(lock_file_path) def test_negative_with_locking_not_locked(self): - - with pytest.raises(func_locker.FunctionLockerError, match=r'.*Cannot ensure locking.*'): - with func_locker.locking_function(simple_function_not_locked): - pass + with pytest.raises( + func_locker.FunctionLockerError, match=r'.*Cannot ensure locking.*' + ), func_locker.locking_function(simple_function_not_locked): + pass diff --git a/tests/upgrades/conftest.py b/tests/upgrades/conftest.py index d75929cb7b4..4c759f66b72 100644 --- a/tests/upgrades/conftest.py +++ b/tests/upgrades/conftest.py @@ -154,8 +154,7 @@ def get_entity_data(scenario_name): """ with open('scenario_entities') as pref: entity_data = json.load(pref) - entity_data = entity_data.get(scenario_name) - return entity_data + return entity_data.get(scenario_name) def get_all_entity_data(): @@ -171,8 +170,7 @@ def get_all_entity_data(): with scenario_name as keys and corresponding attribute data as values. """ with open('scenario_entities') as pref: - entity_data = json.load(pref) - return entity_data + return json.load(pref) def _read_test_data(test_node_id): @@ -334,17 +332,18 @@ def __initiate(config): global POST_UPGRADE global PRE_UPGRADE_TESTS_FILE_PATH PRE_UPGRADE_TESTS_FILE_PATH = getattr(config.option, PRE_UPGRADE_TESTS_FILE_OPTION) - if not [ - upgrade_mark - for upgrade_mark in (PRE_UPGRADE_MARK, POST_UPGRADE_MARK) - if upgrade_mark in config.option.markexpr - ]: - # Raise only if the `tests/upgrades` directory is selected - if 'upgrades' in config.args[0]: - pytest.fail( - f'For upgrade scenarios either {PRE_UPGRADE_MARK} or {POST_UPGRADE_MARK} mark ' - 'must be provided' - ) + if ( + not [ + upgrade_mark + for upgrade_mark in (PRE_UPGRADE_MARK, POST_UPGRADE_MARK) + if upgrade_mark in config.option.markexpr + ] + and 'upgrades' in config.args[0] + ): # Raise only if the `tests/upgrades` directory is selected + pytest.fail( + f'For upgrade scenarios either {PRE_UPGRADE_MARK} or {POST_UPGRADE_MARK} mark ' + 'must be provided' + ) if PRE_UPGRADE_MARK in config.option.markexpr: pre_upgrade_failed_tests = [] PRE_UPGRADE = True diff --git a/tests/upgrades/test_activation_key.py b/tests/upgrades/test_activation_key.py index bac55d78c35..11d37ccdab0 100644 --- a/tests/upgrades/test_activation_key.py +++ b/tests/upgrades/test_activation_key.py @@ -39,8 +39,7 @@ def activation_key_setup(self, request, target_sat): ak = target_sat.api.ActivationKey( content_view=cv, organization=org, name=f"{request.param}_ak" ).create() - ak_details = {'org': org, "cv": cv, 'ak': ak, 'custom_repo': custom_repo} - return ak_details + return {'org': org, "cv": cv, 'ak': ak, 'custom_repo': custom_repo} @pytest.mark.pre_upgrade @pytest.mark.parametrize( diff --git a/tests/upgrades/test_classparameter.py b/tests/upgrades/test_classparameter.py index ba63148b102..b7f8d1c6ed1 100644 --- a/tests/upgrades/test_classparameter.py +++ b/tests/upgrades/test_classparameter.py @@ -82,7 +82,7 @@ def _validate_value(self, data, sc_param): :param sc_param: The Actual Value of parameter """ if data['sc_type'] == 'boolean': - assert sc_param.default_value == (True if data['value'] == '1' else False) + assert sc_param.default_value == (data['value'] == '1') elif data['sc_type'] == 'array': string_list = [str(element) for element in sc_param.default_value] assert str(string_list) == data['value'] diff --git a/tests/upgrades/test_host.py b/tests/upgrades/test_host.py index 642fef7f2b5..5d0e9fda247 100644 --- a/tests/upgrades/test_host.py +++ b/tests/upgrades/test_host.py @@ -72,7 +72,7 @@ def class_host( Later in tests this host will be used to perform assertions """ - host = sat_gce.api.Host( + return sat_gce.api.Host( architecture=sat_gce_default_architecture, compute_attributes=self.compute_attrs, domain=sat_gce_domain, @@ -85,7 +85,6 @@ def class_host( image=module_gce_finishimg, root_pass=gen_string('alphanumeric'), ).create() - return host def google_host(self, googleclient): """Returns the Google Client Host object to perform the assertions""" diff --git a/tests/upgrades/test_puppet.py b/tests/upgrades/test_puppet.py index 5cf7b4e9ae6..b0c96394cc8 100644 --- a/tests/upgrades/test_puppet.py +++ b/tests/upgrades/test_puppet.py @@ -18,8 +18,7 @@ def upgrade_server(request, module_target_sat, pre_configured_capsule): if request.param: return module_target_sat - else: - return pre_configured_capsule + return pre_configured_capsule class TestPuppet: diff --git a/tests/upgrades/test_satellite_maintain.py b/tests/upgrades/test_satellite_maintain.py index 5091f8508fd..6029078bdb6 100644 --- a/tests/upgrades/test_satellite_maintain.py +++ b/tests/upgrades/test_satellite_maintain.py @@ -35,8 +35,7 @@ def satellite_upgradable_version_list(sat_obj): cmd = 'satellite-maintain upgrade list-versions --disable-self-upgrade' list_versions = sat_obj.execute(cmd).stdout regex = re.compile(r'^\d+\.\d+') - upgradeable_versions = [version for version in list_versions if regex.match(version)] - return upgradeable_versions + return [version for version in list_versions if regex.match(version)] @pytest.mark.pre_upgrade def test_pre_satellite_maintain_upgrade_list_versions(self, target_sat): diff --git a/tests/upgrades/test_subscription.py b/tests/upgrades/test_subscription.py index 70e8b53f9c1..116d8956120 100644 --- a/tests/upgrades/test_subscription.py +++ b/tests/upgrades/test_subscription.py @@ -70,7 +70,7 @@ def test_post_manifest_scenario_refresh(self, request, target_sat, pre_upgrade_d history = target_sat.api.Subscription(organization=org).manifest_history( data={'organization_id': org.id} ) - assert "Subscriptions deleted by foreman_admin" == history[0]['statusMessage'] + assert history[0]['statusMessage'] == "Subscriptions deleted by foreman_admin" class TestSubscriptionAutoAttach: From cfe2948d256e2dea7a2f3e9422994f9dea80a312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hellebrandt?= Date: Thu, 7 Mar 2024 17:21:25 +0100 Subject: [PATCH 009/150] CV already published + single LCE (#13972) --- tests/foreman/cli/test_host.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/tests/foreman/cli/test_host.py b/tests/foreman/cli/test_host.py index e748a50b532..fe01b0bc973 100644 --- a/tests/foreman/cli/test_host.py +++ b/tests/foreman/cli/test_host.py @@ -2014,16 +2014,19 @@ def test_negative_without_attach( @pytest.mark.cli_host_subscription @pytest.mark.tier3 def test_negative_without_attach_with_lce( - target_sat, host_subscription_client, function_org, function_lce + target_sat, + host_subscription_client, + function_org, + function_lce, ): """Attempt to enable a repository of a subscription that was not - attached to a host + attached to a host. This test is not using the host_subscription entities except subscription_name and repository_id :id: fc469e70-a7cb-4fca-b0ea-3c9e3dfff849 - :expectedresults: repository not enabled on host + :expectedresults: Repository enabled due to SCA. Why is this "negative"? To keep history, because pre-6.16, this would have failed. :parametrized: yes """ @@ -2035,8 +2038,8 @@ def test_negative_without_attach_with_lce( target_sat.cli_factory.setup_org_for_a_rh_repo( { 'product': PRDS['rhel'], - 'repository-set': REPOSET['rhst7'], - 'repository': REPOS['rhst7']['name'], + 'repository-set': REPOSET['rhsclient7'], + 'repository': REPOS['rhsclient7']['name'], 'organization-id': function_org.id, 'content-view-id': content_view.id, 'lifecycle-environment-id': function_lce.id, @@ -2045,27 +2048,18 @@ def test_negative_without_attach_with_lce( }, force_use_cdn=True, ) - host_lce = target_sat.api.LifecycleEnvironment(organization=function_org).create() - # refresh content view data - content_view.publish() - content_view.read().version[-1].promote(data={'environment_ids': host_lce.id, 'force': False}) # register client host_subscription_client.register_contenthost( function_org.name, - lce=f'{host_lce.name}/{content_view.name}', + lce=f'{function_lce.name}/{content_view.name}', auto_attach=False, ) - # get list of available subscriptions which are matched with default subscription - subscriptions = host_subscription_client.run( - f'subscription-manager list --available --matches "{DEFAULT_SUBSCRIPTION_NAME}" --pool-only' - ) - pool_id = subscriptions.stdout.strip() - # attach to plain RHEL subsctiption - host_subscription_client.subscription_manager_attach_pool([pool_id]) assert host_subscription_client.subscribed - host_subscription_client.enable_repo(REPOS['rhst7']['id']) + res = host_subscription_client.enable_repo(REPOS['rhsclient7']['id']) + assert res.status == 0 + assert f"Repository '{REPOS['rhsclient7']['id']}' is enabled for this system." in res.stdout @pytest.mark.e2e From a98258c2b99711584c19e0301b1145e7257a25f5 Mon Sep 17 00:00:00 2001 From: Omkar Khatavkar Date: Fri, 8 Mar 2024 11:08:39 +0530 Subject: [PATCH 010/150] remove the PRT labels for new commits (#14093) --- .github/workflows/prt_labels.yml | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/prt_labels.yml diff --git a/.github/workflows/prt_labels.yml b/.github/workflows/prt_labels.yml new file mode 100644 index 00000000000..311516fa682 --- /dev/null +++ b/.github/workflows/prt_labels.yml @@ -0,0 +1,49 @@ +name: Remove the PRT label, for the new commit + +on: + pull_request: + types: ["synchronize"] + +jobs: + prt_labels_remover: + name: remove the PRT label when amendments or new commits added to PR + runs-on: ubuntu-latest + if: "(contains(github.event.pull_request.labels.*.name, 'PRT-Passed') || contains(github.event.pull_request.labels.*.name, 'PRT-Failed'))" + steps: + - name: Avoid the race condition as PRT result will be cleaned + run: | + echo "Avoiding the race condition if prt result will be cleaned" && sleep 60 + + - name: Fetch the PRT status + id: prt + uses: omkarkhatavkar/wait-for-status-checks@main + with: + ref: ${{ github.head_ref }} + context: 'Robottelo-Runner' + wait-interval: 2 + count: 5 + + - name: remove the PRT Passed/Failed label, for new commit + if: always() && ${{steps.prt.outputs.result}} == 'not_found' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.CHERRYPICK_PAT }} + script: | + const prNumber = '${{ github.event.number }}'; + const issue = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + }); + const labelsToRemove = ['PRT-Failed', 'PRT-Passed']; + const labelsToRemoveFiltered = labelsToRemove.filter(label => issue.data.labels.some(({ name }) => name === label)); + if (labelsToRemoveFiltered.length > 0) { + await Promise.all(labelsToRemoveFiltered.map(async label => { + await github.rest.issues.removeLabel({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + name: label + }); + })); + } From 063ac02e6d350a02b6cce2eb4fad9376f0a365a5 Mon Sep 17 00:00:00 2001 From: Omkar Khatavkar Date: Fri, 8 Mar 2024 14:08:40 +0530 Subject: [PATCH 011/150] fixed sanity suite, AttributeError due to not matching scope (#14309) --- robottelo/host_helpers/satellite_mixins.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/robottelo/host_helpers/satellite_mixins.py b/robottelo/host_helpers/satellite_mixins.py index 0997bad3b83..3c26862c3bf 100644 --- a/robottelo/host_helpers/satellite_mixins.py +++ b/robottelo/host_helpers/satellite_mixins.py @@ -145,10 +145,8 @@ def upload_manifest(self, org_id, manifest=None, interface='API', timeout=None): :returns: the manifest upload result """ - if ( - not isinstance(manifest, bytes | io.BytesIO) - and not hasattr(manifest, 'content') - or manifest.content is None + if not isinstance(manifest, bytes | io.BytesIO) and ( + not hasattr(manifest, 'content') or manifest.content is None ): manifest = clone() if timeout is None: From 5dab06bf6f7c71f1665da570a998093f2e4f07d6 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Fri, 8 Mar 2024 16:44:49 +0100 Subject: [PATCH 012/150] Fix failing ISS tests (#14315) --- tests/foreman/cli/test_satellitesync.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/foreman/cli/test_satellitesync.py b/tests/foreman/cli/test_satellitesync.py index aac7d5f5b46..1f177a2b053 100644 --- a/tests/foreman/cli/test_satellitesync.py +++ b/tests/foreman/cli/test_satellitesync.py @@ -1235,6 +1235,14 @@ def test_negative_import_incomplete_archive( {'organization-id': function_import_org_with_manifest.id, 'path': import_path} ) assert '1 subtask(s) failed' in error.value.message + target_sat.wait_for_tasks( + search_query=( + 'Actions::Katello::ContentView::Remove and ' + f'organization_id = {function_import_org_with_manifest.id}' + ), + max_tries=5, + poll_rate=10, + ) # Verify no content is imported and the import CV can be deleted imported_cv = target_sat.cli.ContentView.info( @@ -1577,6 +1585,7 @@ def test_positive_export_rerun_failed_import( assert len(importing_cvv) == 1 @pytest.mark.tier3 + @pytest.mark.skip_if_open("BZ:2262379") def test_postive_export_import_ansible_collection_repo( self, target_sat, From cd2622dd541605dd69d19b6cfdbcfdf124f142d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Mar 2024 23:26:07 -0400 Subject: [PATCH 013/150] Bump redis from 5.0.2 to 5.0.3 (#14322) --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index 3971b77f3d9..e776154c7a1 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -1,7 +1,7 @@ # For running tests and checking code quality using these modules. flake8==7.0.0 pytest-cov==4.1.0 -redis==5.0.2 +redis==5.0.3 pre-commit==3.6.2 # For generating documentation. From 6639f79c47bef22c3dcd4d8699e7a37db0f05593 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 00:04:17 -0400 Subject: [PATCH 014/150] Bump pytest from 8.1.0 to 8.1.1 (#14323) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d24cbfaee2c..a2c982fc720 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,7 @@ paramiko==3.4.0 # Temporary until Broker is back on PyPi productmd==1.38 pyotp==2.9.0 python-box==7.1.1 -pytest==8.1.0 +pytest==8.1.1 pytest-order==1.2.0 pytest-services==2.2.1 pytest-mock==3.12.0 From 2c2de86bc782c60bf4fc2c291717543252f088e1 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Mon, 11 Mar 2024 09:40:23 +0100 Subject: [PATCH 015/150] session name for bookmarks (#14242) --- robottelo/constants/__init__.py | 116 +++++++++++++++++++---------- tests/foreman/ui/test_bookmarks.py | 17 ++--- 2 files changed, 85 insertions(+), 48 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 090ca4fcd88..90991ce3df2 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1651,56 +1651,85 @@ class Colored(Box): ] BOOKMARK_ENTITIES = [ - {'name': 'ActivationKey', 'controller': 'katello_activation_keys'}, - {'name': 'Dashboard', 'controller': 'dashboard', 'skip_for_ui': True}, - {'name': 'Audit', 'controller': 'audits', 'skip_for_ui': True}, - {'name': 'Report', 'controller': 'config_reports', 'skip_for_ui': True}, - {'name': 'Task', 'controller': 'foreman_tasks_tasks', 'skip_for_ui': True}, + { + 'name': 'ActivationKey', + 'controller': 'katello_activation_keys', + 'session_name': 'activationkey', + }, + {'name': 'Dashboard', 'controller': 'dashboard', 'session_name': 'dashboard'}, + {'name': 'Audit', 'controller': 'audits', 'session_name': 'audit'}, + { + 'name': 'Report', + 'controller': 'config_reports', + 'setup': entities.Report, + 'session_name': 'configreport', + }, + {'name': 'Task', 'controller': 'foreman_tasks_tasks', 'session_name': 'task'}, # TODO Load manifest for the test_positive_end_to_end from the ui/test_bookmarks.py - # {'name': 'Subscriptions', 'controller': 'subscriptions', 'skip_for_ui': True}, - {'name': 'Product', 'controller': 'katello_products'}, - {'name': 'Repository', 'controller': 'katello_repositories', 'skip_for_ui': True}, - {'name': 'ContentCredential', 'controller': 'katello_content_credentials'}, - {'name': 'SyncPlan', 'controller': 'katello_sync_plans'}, - {'name': 'ContentView', 'controller': 'katello_content_views'}, - {'name': 'Errata', 'controller': 'katello_errata', 'skip_for_ui': True}, - {'name': 'Package', 'controller': 'katello_erratum_packages', 'skip_for_ui': True}, - {'name': 'ContainerImageTag', 'controller': 'katello_docker_tags', 'skip_for_ui': True}, - {'name': 'Host', 'controller': 'hosts', 'setup': entities.Host}, - {'name': 'ContentHost', 'controller': 'hosts', 'skip_for_ui': True}, - {'name': 'HostCollection', 'controller': 'katello_host_collections'}, - {'name': 'Architecture', 'controller': 'architectures'}, + # {'name': 'Subscriptions', 'controller': 'subscriptions','session_name': 'subscription' }, + {'name': 'Product', 'controller': 'katello_products', 'session_name': 'product'}, + {'name': 'Repository', 'controller': 'katello_repositories', 'session_name': 'repository'}, + { + 'name': 'ContentCredential', + 'controller': 'katello_content_credentials', + 'session_name': 'contentcredential', + }, + {'name': 'SyncPlan', 'controller': 'katello_sync_plans', 'session_name': 'syncplan'}, + {'name': 'ContentView', 'controller': 'katello_content_views', 'session_name': 'contentview'}, + {'name': 'Errata', 'controller': 'katello_errata', 'session_name': 'errata'}, + {'name': 'Package', 'controller': 'katello_erratum_packages', 'session_name': 'package'}, + { + 'name': 'ContainerImageTag', + 'controller': 'katello_docker_tags', + 'session_name': 'containerimagetag', + }, + {'name': 'Host', 'controller': 'hosts', 'setup': entities.Host, 'session_name': 'host_new'}, + {'name': 'ContentHost', 'controller': 'hosts', 'session_name': 'contenthost'}, + { + 'name': 'HostCollection', + 'controller': 'katello_host_collections', + 'session_name': 'hostcollection', + }, + {'name': 'Architecture', 'controller': 'architectures', 'session_name': 'architecture'}, { 'name': 'HardwareModel', 'controller': 'models', 'setup': entities.Model, - 'skip_for_ui': True, + 'session_name': 'hardwaremodel', }, { 'name': 'InstallationMedia', 'controller': 'media', + 'session_name': 'media', 'setup': entities.Media, - 'skip_for_ui': True, }, - {'name': 'OperatingSystem', 'controller': 'operatingsystems'}, + { + 'name': 'OperatingSystem', + 'controller': 'operatingsystems', + 'session_name': 'operatingsystem', + }, { 'name': 'PartitionTable', 'controller': 'ptables', 'setup': entities.PartitionTable, - 'skip_for_ui': False, + 'session_name': 'partitiontable', + }, + { + 'name': 'ProvisioningTemplate', + 'controller': 'provisioning_templates', + 'session_name': 'provisioningtemplate', }, - {'name': 'ProvisioningTemplate', 'controller': 'provisioning_templates'}, { 'name': 'HostGroup', 'controller': 'hostgroups', 'setup': entities.HostGroup, - 'skip_for_ui': True, + 'session_name': 'hostgroup', }, { 'name': 'DiscoveryRule', 'controller': 'discovery_rules', - 'skip_for_ui': True, 'setup': entities.DiscoveryRule, + 'session_name': 'discoveryrule', }, { 'name': 'GlobalParameter', @@ -1708,24 +1737,35 @@ class Colored(Box): 'setup': entities.CommonParameter, 'skip_for_ui': True, }, - {'name': 'Role', 'controller': 'ansible_roles', 'setup': entities.Role}, - {'name': 'Variables', 'controller': 'ansible_variables', 'skip_for_ui': True}, - {'name': 'SmartProxy', 'controller': 'smart_proxies', 'skip_for_ui': True}, + {'name': 'Role', 'controller': 'ansible_roles', 'setup': entities.Role, 'session_name': 'role'}, + {'name': 'Variables', 'controller': 'ansible_variables', 'session_name': 'ansiblevariables'}, + {'name': 'Capsules', 'controller': 'smart_proxies', 'session_name': 'capsule'}, { 'name': 'ComputeResource', 'controller': 'compute_resources', 'setup': entities.LibvirtComputeResource, + 'session_name': 'computeresource', + }, + { + 'name': 'ComputeProfile', + 'controller': 'compute_profiles', + 'setup': entities.ComputeProfile, + 'session_name': 'computeprofile', + }, + {'name': 'Subnet', 'controller': 'subnets', 'setup': entities.Subnet, 'session_name': 'subnet'}, + {'name': 'Domain', 'controller': 'domains', 'setup': entities.Domain, 'session_name': 'domain'}, + {'name': 'Realm', 'controller': 'realms', 'setup': entities.Realm, 'session_name': 'realm'}, + {'name': 'Location', 'controller': 'locations', 'session_name': 'location'}, + {'name': 'Organization', 'controller': 'organizations', 'session_name': 'organization'}, + {'name': 'User', 'controller': 'users', 'session_name': 'user'}, + { + 'name': 'UserGroup', + 'controller': 'usergroups', + 'setup': entities.UserGroup, + 'session_name': 'usergroup', }, - {'name': 'ComputeProfile', 'controller': 'compute_profiles', 'setup': entities.ComputeProfile}, - {'name': 'Subnet', 'controller': 'subnets', 'setup': entities.Subnet}, - {'name': 'Domain', 'controller': 'domains', 'setup': entities.Domain}, - {'name': 'Realm', 'controller': 'realms', 'setup': entities.Realm, 'skip_for_ui': True}, - {'name': 'Location', 'controller': 'locations'}, - {'name': 'Organization', 'controller': 'organizations'}, - {'name': 'User', 'controller': 'users'}, - {'name': 'UserGroup', 'controller': 'usergroups', 'setup': entities.UserGroup}, - {'name': 'Role', 'controller': 'roles'}, - {'name': 'Settings', 'controller': 'settings', 'skip_for_ui': True}, + {'name': 'Role', 'controller': 'roles', 'session_name': 'role'}, + {'name': 'Settings', 'controller': 'settings', 'session_name': 'settings'}, ] STRING_TYPES = ['alpha', 'numeric', 'alphanumeric', 'latin1', 'utf8', 'cjk', 'html'] diff --git a/tests/foreman/ui/test_bookmarks.py b/tests/foreman/ui/test_bookmarks.py index f2622ae84a8..563a19102a7 100644 --- a/tests/foreman/ui/test_bookmarks.py +++ b/tests/foreman/ui/test_bookmarks.py @@ -17,7 +17,6 @@ from robottelo.config import user_nailgun_config from robottelo.constants import BOOKMARK_ENTITIES -from robottelo.utils.issue_handlers import is_open @pytest.fixture( @@ -28,23 +27,21 @@ def ui_entity(module_org, module_location, request): required preconditions. """ entity = request.param + entity_name, entity_setup = entity['name'], entity.get('setup') + # Skip the entities, which can't be tested ATM (not implemented in + # airgun) + skip = entity.get('skip_for_ui') + if skip: + pytest.skip(f'{entity_name} not implemented in airgun') # Some pages require at least 1 existing entity for search bar to # appear. Creating 1 entity for such pages - entity_name, entity_setup = entity['name'], entity.get('setup') if entity_setup: - # Skip the entities, which can't be tested ATM (not implemented in - # airgun or have open BZs) - skip = entity.get('skip_for_ui') - if isinstance(skip, tuple | list): - open_issues = {issue for issue in skip if is_open(issue)} - pytest.skip(f'There is/are an open issue(s) {open_issues} with entity {entity_name}') # entities with 1 organization and location if entity_name in ('Host',): entity_setup(organization=module_org, location=module_location).create() # entities with no organizations and locations elif entity_name in ( 'ComputeProfile', - 'GlobalParameter', 'HardwareModel', 'UserGroup', ): @@ -117,7 +114,7 @@ def test_positive_create_bookmark_public( public_name = gen_string('alphanumeric') nonpublic_name = gen_string('alphanumeric') with session: - ui_lib = getattr(session, ui_entity['name'].lower()) + ui_lib = getattr(session, ui_entity['session_name']) for name in (public_name, nonpublic_name): ui_lib.create_bookmark( {'name': name, 'query': gen_string('alphanumeric'), 'public': name == public_name} From dd8f11356f25d937a5fc88810127edaf4cd6ee6e Mon Sep 17 00:00:00 2001 From: Pavel Novotny Date: Mon, 11 Mar 2024 09:53:42 +0100 Subject: [PATCH 016/150] host delete permissions test (#14207) permissions: check user permissions for host delete SAT-21619 (component evaluation). Check for correct user permissions when deleting a host. Because a host deletion action has defined multiple permissions, following modifications have been done: - function `_permission_name` renamed to `_permission_names` and returns list instead of string - new method `TestUserRole.give_user_permissions` that works well with `_permission_names` --- tests/foreman/api/test_permission.py | 45 ++++++++++++++++++---------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/tests/foreman/api/test_permission.py b/tests/foreman/api/test_permission.py index a4267d71f92..eda73028c61 100644 --- a/tests/foreman/api/test_permission.py +++ b/tests/foreman/api/test_permission.py @@ -161,18 +161,20 @@ def test_positive_search(self, target_sat): # FIXME: This method is a hack. This information should somehow be tied # directly to the `Entity` classes. -def _permission_name(entity, which_perm): - """Find a permission name. +def _permission_names(entity, which_perm: str) -> list: + """Find permission names. - Attempt to locate a permission in :data:`robottelo.constants.PERMISSIONS`. - For example, return 'view_architectures' if ``entity`` is ``Architecture`` - and ``which_perm`` is 'read'. + Attempt to locate permissions in :data:`robottelo.constants.PERMISSIONS`. + + Examples: + _permission_names('Architecture', 'read') -> ['view_architectures'] + _permission_names('Host', 'delete') -> ['destroy_discovered_hosts', 'destroy_hosts'] :param entity: A ``nailgun.entity_mixins.Entity`` subclass. :param str which_perm: Either the word "create", "read", "update" or "delete". - :raise: ``LookupError`` if a relevant permission cannot be found, or if - multiple results are found. + :raise: ``LookupError`` if a relevant permission cannot be found + :returns: list of found permission names """ pattern = {'create': '^create_', 'delete': '^destroy_', 'read': '^view_', 'update': '^edit_'}[ which_perm @@ -181,11 +183,11 @@ def _permission_name(entity, which_perm): permissions = PERMISSIONS.get(entity.__name__) or PERMISSIONS.get(f'Katello::{entity.__name__}') for permission in permissions: match = re.match(pattern, permission) - if match is not None: + if match: perm_names.append(permission) - if len(perm_names) != 1: - raise LookupError(f'Could not find the requested permission. Found: {perm_names}') - return perm_names[0] + if not perm_names: + raise LookupError(f'Could not find any "{which_perm}" permission for entity "{entity}"') + return perm_names # This class might better belong in module test_multiple_paths. @@ -226,6 +228,15 @@ def give_user_permission(self, perm_name, target_sat): self.user.role += [role] self.user = self.user.update(['role']) + def give_user_permissions(self, perm_names, target_sat): + """Give ``self.user`` multiple permissions. + Otherwise, works the same as method ``self.give_user_permission``. + + :param list perm_names: permission names + """ + for perm_name in perm_names: + self.give_user_permission(perm_name, target_sat) + def set_taxonomies(self, entity, organization=None, location=None): """Set organization and location for entity if it supports them. @@ -273,7 +284,7 @@ def test_positive_check_create(self, entity_cls, class_org, class_location, targ """ with pytest.raises(HTTPError): entity_cls(self.cfg).create() - self.give_user_permission(_permission_name(entity_cls, 'create'), target_sat) + self.give_user_permissions(_permission_names(entity_cls, 'create'), target_sat) new_entity = self.set_taxonomies(entity_cls(self.cfg), class_org, class_location) # Entities with both org and loc require # additional permissions to set them. @@ -307,14 +318,16 @@ def test_positive_check_read(self, entity_cls, class_org, class_location, target new_entity = new_entity.create() with pytest.raises(HTTPError): entity_cls(self.cfg, id=new_entity.id).read() - self.give_user_permission(_permission_name(entity_cls, 'read'), target_sat) + self.give_user_permissions(_permission_names(entity_cls, 'read'), target_sat) entity_cls(self.cfg, id=new_entity.id).read() @pytest.mark.upgrade @pytest.mark.tier1 @pytest.mark.parametrize( 'entity_cls', - **parametrized([entities.Architecture, entities.Domain, entities.ActivationKey]), + **parametrized( + [entities.Architecture, entities.Domain, entities.ActivationKey, entities.Host] + ), ) def test_positive_check_delete(self, entity_cls, class_org, class_location, target_sat): """Check whether the "destroy_*" role has an effect. @@ -334,7 +347,7 @@ def test_positive_check_delete(self, entity_cls, class_org, class_location, targ new_entity = new_entity.create() with pytest.raises(HTTPError): entity_cls(self.cfg, id=new_entity.id).delete() - self.give_user_permission(_permission_name(entity_cls, 'delete'), target_sat) + self.give_user_permissions(_permission_names(entity_cls, 'delete'), target_sat) entity_cls(self.cfg, id=new_entity.id).delete() with pytest.raises(HTTPError): new_entity.read() # As admin user @@ -371,7 +384,7 @@ def test_positive_check_update(self, entity_cls, class_org, class_location, targ update_entity = entity_cls(self.cfg, id=new_entity.id, name=name) with pytest.raises(HTTPError): update_entity.update(['name']) - self.give_user_permission(_permission_name(entity_cls, 'update'), target_sat) + self.give_user_permissions(_permission_names(entity_cls, 'update'), target_sat) # update() calls read() under the hood, which triggers # permission error if entity_cls is entities.ActivationKey: From 4f213b391af18298ffcaa350a169ebf49cd7100e Mon Sep 17 00:00:00 2001 From: Pavel Novotny Date: Mon, 11 Mar 2024 13:34:28 +0100 Subject: [PATCH 017/150] Hosts: run 'Manage columns' RFE test also for non-admin user (#14247) hosts: run test_positive_manage_table_columns also with non-admin user The test for hosts 'Manage Columns' feature now runs also for a non-admin user. SAT-18169 https://bugzilla.redhat.com/2212499 Related changes: `current_sat_org` and `current_sat_location` fixtures now return the API object instead of the name to align with other similar fixtures in taxonomy.py --- pytest_fixtures/component/taxonomy.py | 4 +- tests/foreman/ui/test_host.py | 54 +++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/pytest_fixtures/component/taxonomy.py b/pytest_fixtures/component/taxonomy.py index e6ac87357cd..c7f53011a84 100644 --- a/pytest_fixtures/component/taxonomy.py +++ b/pytest_fixtures/component/taxonomy.py @@ -23,14 +23,14 @@ def default_location(session_target_sat): def current_sat_org(target_sat): """Return the current organization assigned to the Satellite host""" sat_host = target_sat.api.Host().search(query={'search': f'name={target_sat.hostname}'})[0] - return sat_host.organization.read().name + return sat_host.organization.read() @pytest.fixture def current_sat_location(target_sat): """Return the current location assigned to the Satellite host""" sat_host = target_sat.api.Host().search(query={'search': f'name={target_sat.hostname}'})[0] - return sat_host.location.read().name + return sat_host.location.read() @pytest.fixture diff --git a/tests/foreman/ui/test_host.py b/tests/foreman/ui/test_host.py index 6db27252587..bb4f39655a9 100644 --- a/tests/foreman/ui/test_host.py +++ b/tests/foreman/ui/test_host.py @@ -58,6 +58,42 @@ def ui_user(ui_user, smart_proxy_location, module_target_sat): return ui_user +@pytest.fixture +def ui_admin_user(target_sat): + """Admin user.""" + admin_user = target_sat.api.User().search( + query={'search': f'login={settings.server.admin_username}'} + )[0] + admin_user.password = settings.server.admin_password + + return admin_user + + +@pytest.fixture +def ui_view_hosts_user(target_sat, current_sat_org, current_sat_location): + """User with View hosts role.""" + role = target_sat.api.Role().search(query={'search': 'name="View hosts"'})[0] + password = gen_string('alphanumeric') + user = target_sat.api.User( + admin=False, + location=[current_sat_location], + organization=[current_sat_org], + role=[role], + password=password, + ).create() + user.password = password + + yield user + + user.delete() + + +@pytest.fixture(params=['ui_admin_user', 'ui_view_hosts_user']) +def ui_hosts_columns_user(request): + """Parametrized fixture returning defined users for the UI session.""" + return request.getfixturevalue(request.param) + + @pytest.fixture def scap_policy(scap_content, target_sat): return target_sat.cli_factory.make_scap_policy( @@ -1094,7 +1130,9 @@ def test_rex_new_ui(session, target_sat, rex_contenthost): @pytest.mark.tier4 -def test_positive_manage_table_columns(session, current_sat_org, current_sat_location): +def test_positive_manage_table_columns( + target_sat, test_name, ui_hosts_columns_user, current_sat_org, current_sat_location +): """Set custom columns of the hosts table. :id: e5e18982-cc43-11ed-8562-000c2989e153 @@ -1107,7 +1145,7 @@ def test_positive_manage_table_columns(session, current_sat_org, current_sat_loc :expectedresults: Check if the custom columns were set properly, i.e., are displayed or not displayed in the table. - :BZ: 1813274 + :BZ: 1813274, 2212499 :customerscenario: true """ @@ -1127,9 +1165,11 @@ def test_positive_manage_table_columns(session, current_sat_org, current_sat_loc 'Boot time': True, 'Recommendations': False, } - with session: - session.organization.select(org_name=current_sat_org) - session.location.select(loc_name=current_sat_location) + with target_sat.ui_session( + test_name, ui_hosts_columns_user.login, ui_hosts_columns_user.password + ) as session: + session.organization.select(org_name=current_sat_org.name) + session.location.select(loc_name=current_sat_location.name) session.host.manage_table_columns(columns) displayed_columns = session.host.get_displayed_table_headers() for column, is_displayed in columns.items(): @@ -1160,8 +1200,8 @@ def test_positive_host_details_read_templates( host = target_sat.api.Host().search(query={'search': f'name={target_sat.hostname}'})[0] api_templates = [template['name'] for template in host.list_provisioning_templates()] with session: - session.organization.select(org_name=current_sat_org) - session.location.select(loc_name=current_sat_location) + session.organization.select(org_name=current_sat_org.name) + session.location.select(loc_name=current_sat_location.name) host_detail = session.host_new.get_details(target_sat.hostname, widget_names='details') ui_templates = [ row['column1'].strip() From 64262657ea61aeb20f174ed67d466c8fbcee8ffa Mon Sep 17 00:00:00 2001 From: Jitendra Yejare Date: Mon, 11 Mar 2024 18:25:40 +0530 Subject: [PATCH 018/150] Capsule N-Minus testing (#12939) --- conf/capsule.yaml.template | 2 + conf/dynaconf_hooks.py | 6 +- conftest.py | 1 + pytest_fixtures/core/sat_cap_factory.py | 40 +++++++++++--- pytest_plugins/capsule_n-minus.py | 55 +++++++++++++++++++ robottelo/exceptions.py | 6 ++ robottelo/hosts.py | 20 ++++++- tests/foreman/api/test_capsule.py | 15 ++++- tests/foreman/api/test_capsulecontent.py | 3 + .../foreman/destructive/test_registration.py | 2 + 10 files changed, 135 insertions(+), 15 deletions(-) create mode 100644 pytest_plugins/capsule_n-minus.py diff --git a/conf/capsule.yaml.template b/conf/capsule.yaml.template index 9ef9e48a2c2..b618bf57ea9 100644 --- a/conf/capsule.yaml.template +++ b/conf/capsule.yaml.template @@ -1,4 +1,6 @@ CAPSULE: + # Capsule hostname for N-minus testing + HOSTNAME: VERSION: # The full release version (6.9.2) RELEASE: # populate with capsule version diff --git a/conf/dynaconf_hooks.py b/conf/dynaconf_hooks.py index 4249ce4e604..85baf7d52cb 100644 --- a/conf/dynaconf_hooks.py +++ b/conf/dynaconf_hooks.py @@ -85,9 +85,9 @@ def get_ohsnap_repos(settings): settings, repo='capsule', product='capsule', - release=settings.server.version.release, - os_release=settings.server.version.rhel_version, - snap=settings.server.version.snap, + release=settings.capsule.version.release, + os_release=settings.capsule.version.rhel_version, + snap=settings.capsule.version.snap, ) data['SATELLITE_REPO'] = get_ohsnap_repo_url( diff --git a/conftest.py b/conftest.py index 42682d76249..7645728a06c 100644 --- a/conftest.py +++ b/conftest.py @@ -21,6 +21,7 @@ 'pytest_plugins.requirements.update_requirements', 'pytest_plugins.sanity_plugin', 'pytest_plugins.video_cleanup', + 'pytest_plugins.capsule_n-minus', # Fixtures 'pytest_fixtures.core.broker', 'pytest_fixtures.core.sat_cap_factory', diff --git a/pytest_fixtures/core/sat_cap_factory.py b/pytest_fixtures/core/sat_cap_factory.py index c63a70e4d19..0c23b1ee4d2 100644 --- a/pytest_fixtures/core/sat_cap_factory.py +++ b/pytest_fixtures/core/sat_cap_factory.py @@ -1,4 +1,5 @@ from contextlib import contextmanager +from functools import lru_cache from broker import Broker from packaging.version import Version @@ -37,13 +38,29 @@ def _target_satellite_host(request, satellite_factory): yield +@lru_cache +def cached_capsule_cdn_register(hostname=None): + cap = Capsule.get_host_by_hostname(hostname=hostname) + cap.enable_capsule_downstream_repos() + + @contextmanager def _target_capsule_host(request, capsule_factory): - if 'sanity' not in request.config.option.markexpr: + if 'sanity' not in request.config.option.markexpr and not request.config.option.n_minus: new_cap = capsule_factory() yield new_cap new_cap.teardown() Broker(hosts=[new_cap]).checkin() + elif request.config.option.n_minus: + if not settings.capsule.hostname: + hosts = Capsule.get_hosts_from_inventory(filter="'cap' in @inv.name") + settings.capsule.hostname = hosts[0].hostname + cap = hosts[0] + else: + cap = Capsule.get_host_by_hostname(settings.capsule.hostname) + # Capsule needs RHEL contents for some tests + cached_capsule_cdn_register(hostname=settings.capsule.hostname) + yield cap else: yield @@ -162,9 +179,10 @@ def session_capsule_host(request, capsule_factory): @pytest.fixture -def capsule_configured(capsule_host, target_sat): +def capsule_configured(request, capsule_host, target_sat): """Configure the capsule instance with the satellite from settings.server.hostname""" - capsule_host.capsule_setup(sat_host=target_sat) + if not request.config.option.n_minus: + capsule_host.capsule_setup(sat_host=target_sat) return capsule_host @@ -176,21 +194,23 @@ def large_capsule_configured(large_capsule_host, target_sat): @pytest.fixture(scope='module') -def module_capsule_configured(module_capsule_host, module_target_sat): +def module_capsule_configured(request, module_capsule_host, module_target_sat): """Configure the capsule instance with the satellite from settings.server.hostname""" - module_capsule_host.capsule_setup(sat_host=module_target_sat) + if not request.config.option.n_minus: + module_capsule_host.capsule_setup(sat_host=module_target_sat) return module_capsule_host @pytest.fixture(scope='session') -def session_capsule_configured(session_capsule_host, session_target_sat): +def session_capsule_configured(request, session_capsule_host, session_target_sat): """Configure the capsule instance with the satellite from settings.server.hostname""" - session_capsule_host.capsule_setup(sat_host=session_target_sat) + if not request.config.option.n_minus: + session_capsule_host.capsule_setup(sat_host=session_target_sat) return session_capsule_host @pytest.fixture(scope='module') -def module_capsule_configured_mqtt(module_capsule_configured): +def module_capsule_configured_mqtt(request, module_capsule_configured): """Configure the capsule instance with the satellite from settings.server.hostname, enable MQTT broker""" module_capsule_configured.set_rex_script_mode_provider('pull-mqtt') @@ -201,7 +221,9 @@ def module_capsule_configured_mqtt(module_capsule_configured): result = module_capsule_configured.execute('firewall-cmd --permanent --add-port="1883/tcp"') assert result.status == 0, 'Failed to open mqtt port on capsule' module_capsule_configured.execute('firewall-cmd --reload') - return module_capsule_configured + yield module_capsule_configured + if request.config.option.n_minus: + raise TypeError('The teardown is missed for MQTT configuration undo for nminus testing') @pytest.fixture(scope='module') diff --git a/pytest_plugins/capsule_n-minus.py b/pytest_plugins/capsule_n-minus.py new file mode 100644 index 00000000000..f903e239757 --- /dev/null +++ b/pytest_plugins/capsule_n-minus.py @@ -0,0 +1,55 @@ +# Collection of Capsule Factory fixture tests +# No destructive tests +# Adjust capsule host and capsule_configured host behavior for n_minus testing +# Calculate capsule hostname from inventory just as we do in xDist.py +from robottelo.config import settings +from robottelo.hosts import Capsule + + +def pytest_addoption(parser): + """Add options for pytest to collect tests based on fixtures its using""" + help_text = ''' + Collects tests based on capsule fixtures used by tests and uncollect destructive tests + + Usage: --n-minus + + example: pytest --n-minus tests/foreman + ''' + parser.addoption("--n-minus", action='store_true', default=False, help=help_text) + + +def pytest_collection_modifyitems(items, config): + + if not config.getoption('n_minus', False): + return + + selected = [] + deselected = [] + + for item in items: + is_destructive = item.get_closest_marker('destructive') + # Deselect Destructive tests and tests without capsule_factory fixture + if 'capsule_factory' not in item.fixturenames or is_destructive: + deselected.append(item) + continue + # Ignoring all puppet tests as they are destructive in nature + # and needs its own satellite for verification + if 'session_puppet_enabled_sat' in item.fixturenames: + deselected.append(item) + continue + # Ignoring all satellite maintain tests as they are destructive in nature + # Also dont need them in nminus testing as its not integration testing + if 'sat_maintain' in item.fixturenames and 'satellite' in item.callspec.params.values(): + deselected.append(item) + continue + selected.append(item) + + config.hook.pytest_deselected(items=deselected) + items[:] = selected + + +def pytest_sessionfinish(session, exitstatus): + # Unregister the capsule from CDN after all tests + if session.config.option.n_minus and not session.config.option.collectonly: + caps = Capsule.get_host_by_hostname(hostname=settings.capsule.hostname) + caps.unregister() diff --git a/robottelo/exceptions.py b/robottelo/exceptions.py index 83022dfcd6e..a6100564873 100644 --- a/robottelo/exceptions.py +++ b/robottelo/exceptions.py @@ -75,6 +75,12 @@ class CLIError(Exception): """Indicates that a CLI command could not be run.""" +class CapsuleHostError(Exception): + """Indicates error in capsule configuration etc""" + + pass + + class CLIBaseError(Exception): """Indicates that a CLI command has finished with return code different from zero. diff --git a/robottelo/hosts.py b/robottelo/hosts.py index 06e86a3b9f7..7596411fa56 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -1600,6 +1600,21 @@ def get_features(self): """Get capsule features""" return requests.get(f'https://{self.hostname}:9090/features', verify=False).text + def enable_capsule_downstream_repos(self): + """Enable CDN repos and capsule downstream repos on Capsule Host""" + # CDN Repos + self.register_to_cdn() + for repo in getattr(constants, f"OHSNAP_RHEL{self.os_version.major}_REPOS"): + result = self.enable_repo(repo, force=True) + if result.status: + raise CapsuleHostError(f'Repo enable at capsule host failed\n{result.stdout}') + # Downstream Capsule specific Repos + self.download_repofile( + product='capsule', + release=settings.capsule.version.release, + snap=settings.capsule.version.snap, + ) + def capsule_setup(self, sat_host=None, capsule_cert_opts=None, **installer_kwargs): """Prepare the host and run the capsule installer""" self._satellite = sat_host or Satellite() @@ -1687,7 +1702,10 @@ def run_installer_arg(self, *args, timeout='20m'): timeout=timeout, ) if result.status != 0: - raise SatelliteHostError(f'Failed to execute with argument: {result.stderr}') + raise SatelliteHostError( + f'Failed to execute with arguments: {installer_args} and,' + f' the stderr is {result.stderr}' + ) def set_mqtt_resend_interval(self, value): """Set the time interval in seconds at which the notification should be diff --git a/tests/foreman/api/test_capsule.py b/tests/foreman/api/test_capsule.py index 3d499ccf16e..c255a2fd71a 100644 --- a/tests/foreman/api/test_capsule.py +++ b/tests/foreman/api/test_capsule.py @@ -21,7 +21,7 @@ @pytest.mark.e2e @pytest.mark.upgrade @pytest.mark.tier1 -def test_positive_update_capsule(target_sat, module_capsule_configured): +def test_positive_update_capsule(request, pytestconfig, target_sat, module_capsule_configured): """Update various capsule properties :id: a3d3eaa9-ed8d-42e6-9c83-20251e5ca9af @@ -39,7 +39,7 @@ def test_positive_update_capsule(target_sat, module_capsule_configured): :customerscenario: true """ - new_name = f'{gen_string("alpha")}-{module_capsule_configured.name}' + new_name = f'{gen_string("alpha")}-{module_capsule_configured.hostname}' capsule = target_sat.api.SmartProxy().search( query={'search': f'name = {module_capsule_configured.hostname}'} )[0] @@ -68,6 +68,17 @@ def test_positive_update_capsule(target_sat, module_capsule_configured): capsule = capsule.update(['name']) assert capsule.name == new_name + @request.addfinalizer + def _finalize(): + # Updating the hostname back + if ( + cap := target_sat.api.SmartProxy().search(query={'search': f'name = {new_name}'}) + and pytestconfig.option.n_minus + ): + cap = cap[0] + cap.name = module_capsule_configured.hostname + cap.update(['name']) + # serching for non-default capsule BZ#2077824 capsules = target_sat.api.SmartProxy().search(query={'search': 'id != 1'}) assert len(capsules) > 0 diff --git a/tests/foreman/api/test_capsulecontent.py b/tests/foreman/api/test_capsulecontent.py index 48db1e11a7b..99c2bb816fc 100644 --- a/tests/foreman/api/test_capsulecontent.py +++ b/tests/foreman/api/test_capsulecontent.py @@ -1263,6 +1263,7 @@ def test_positive_capsule_sync_status_persists( def test_positive_remove_capsule_orphans( self, target_sat, + pytestconfig, capsule_configured, function_entitlement_manifest_org, function_lce_library, @@ -1292,6 +1293,8 @@ def test_positive_remove_capsule_orphans( :BZ: 22043089, 2211962 """ + if not pytestconfig.option.n_minus: + pytest.skip('Test cannot be run on n-minus setups session-scoped capsule') # Enable RHST repo and sync it to the Library LCE. repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', diff --git a/tests/foreman/destructive/test_registration.py b/tests/foreman/destructive/test_registration.py index 357e779c5d7..9c8dbfa4929 100644 --- a/tests/foreman/destructive/test_registration.py +++ b/tests/foreman/destructive/test_registration.py @@ -14,6 +14,8 @@ from robottelo.config import settings +pytestmark = pytest.mark.destructive + @pytest.mark.tier3 @pytest.mark.no_containers From 0f075ce10918ed09c3e6ca3e8b81540d104412c8 Mon Sep 17 00:00:00 2001 From: Griffin Sullivan <48397354+Griffin-Sullivan@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:16:15 -0400 Subject: [PATCH 019/150] Fix manifest file transer for fam (#14238) --- tests/foreman/sys/test_fam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/sys/test_fam.py b/tests/foreman/sys/test_fam.py index 1a0d6a92b81..f4500a2b599 100644 --- a/tests/foreman/sys/test_fam.py +++ b/tests/foreman/sys/test_fam.py @@ -49,7 +49,7 @@ def setup_fam(module_target_sat, module_sca_manifest): module_target_sat.execute(f"sed -i '/^live/ s/$(MANIFEST)//' {FAM_ROOT_DIR}/Makefile") # Upload manifest to test playbooks directory - module_target_sat.put(module_sca_manifest.path, module_sca_manifest.name) + module_target_sat.put(str(module_sca_manifest.path), str(module_sca_manifest.name)) module_target_sat.execute( f'mv {module_sca_manifest.name} {FAM_ROOT_DIR}/tests/test_playbooks/data' ) From 2b8c8e98df53efc059358ebc3027b37f1b4392a9 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Mon, 11 Mar 2024 15:48:19 +0100 Subject: [PATCH 020/150] Fix flaky SyncPlans in cli_factory (#14337) --- robottelo/cli/syncplan.py | 11 +++++++++++ robottelo/host_helpers/cli_factory.py | 4 +++- tests/foreman/cli/test_syncplan.py | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/robottelo/cli/syncplan.py b/robottelo/cli/syncplan.py index 3f8b9b8b347..151a72acb84 100644 --- a/robottelo/cli/syncplan.py +++ b/robottelo/cli/syncplan.py @@ -17,9 +17,20 @@ update """ from robottelo.cli.base import Base +from robottelo.exceptions import CLIError class SyncPlan(Base): """Manipulates Katello engine's sync-plan command.""" command_base = 'sync-plan' + + @classmethod + def create(cls, options=None): + """Create a SyncPlan""" + cls.command_sub = 'create' + + if options.get('interval') == 'custom cron' and options.get('cron-expression') is None: + raise CLIError('Missing "cron-expression" option for "custom cron" interval.') + + return super().create(options) diff --git a/robottelo/host_helpers/cli_factory.py b/robottelo/host_helpers/cli_factory.py index 964ec2a97b3..30a28d57479 100644 --- a/robottelo/host_helpers/cli_factory.py +++ b/robottelo/host_helpers/cli_factory.py @@ -140,7 +140,9 @@ def create_object(cli_object, options, values=None, credentials=None): 'sync_plan': { 'description': gen_alpha, 'enabled': 'true', - 'interval': lambda: random.choice(list(constants.SYNC_INTERVAL.values())), + 'interval': lambda: random.choice( + [i for i in constants.SYNC_INTERVAL.values() if i != 'custom cron'] + ), 'name': gen_alpha, 'sync-date': lambda: datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), }, diff --git a/tests/foreman/cli/test_syncplan.py b/tests/foreman/cli/test_syncplan.py index 86f33b68ffb..8669cd49a18 100644 --- a/tests/foreman/cli/test_syncplan.py +++ b/tests/foreman/cli/test_syncplan.py @@ -705,7 +705,7 @@ def test_positive_synchronize_rh_product_future_sync_date( # Verify product has not been synced yet with pytest.raises(AssertionError): validate_task_status(target_sat, repo['id'], org.id, max_tries=1) - validate_repo_content(repo, ['errata', 'packages'], after_sync=False) + validate_repo_content(target_sat, repo, ['errata', 'packages'], after_sync=False) # Wait the rest of expected time logger.info( f"Waiting {(delay * 4 / 5)} seconds to check product {product['name']}" @@ -714,7 +714,7 @@ def test_positive_synchronize_rh_product_future_sync_date( sleep(delay * 4 / 5) # Verify product was synced successfully validate_task_status(target_sat, repo['id'], org.id) - validate_repo_content(repo, ['errata', 'packages']) + validate_repo_content(target_sat, repo, ['errata', 'packages']) @pytest.mark.tier3 From c6c3b61582ab30eac87943364e3ee315aeaf071f Mon Sep 17 00:00:00 2001 From: Jitendra Yejare Date: Mon, 11 Mar 2024 21:45:32 +0530 Subject: [PATCH 021/150] [Component Refresh] Component Names are updated (#14268) Component Names are updated --- testimony.yaml | 14 ++++---------- tests/foreman/api/test_capsule.py | 2 +- tests/foreman/api/test_rhc.py | 2 +- tests/foreman/api/test_rhcloud_inventory.py | 4 ++-- tests/foreman/cli/test_capsule.py | 4 ++-- tests/foreman/cli/test_installer.py | 4 ++-- tests/foreman/cli/test_rhcloud_inventory.py | 4 ++-- tests/foreman/destructive/test_capsule.py | 4 ++-- .../destructive/test_capsule_loadbalancer.py | 2 +- tests/foreman/destructive/test_installer.py | 4 ++-- .../destructive/test_katello_certs_check.py | 2 +- tests/foreman/destructive/test_packages.py | 2 +- tests/foreman/destructive/test_rename.py | 2 +- tests/foreman/installer/test_installer.py | 4 ++-- tests/foreman/maintain/test_advanced.py | 2 +- tests/foreman/maintain/test_backup_restore.py | 2 +- tests/foreman/maintain/test_health.py | 2 +- tests/foreman/maintain/test_maintenance_mode.py | 2 +- tests/foreman/maintain/test_offload_DB.py | 4 ++-- tests/foreman/maintain/test_packages.py | 2 +- tests/foreman/maintain/test_service.py | 2 +- tests/foreman/maintain/test_upgrade.py | 2 +- tests/foreman/sys/test_katello_certs_check.py | 2 +- tests/foreman/ui/test_rhc.py | 2 +- tests/foreman/ui/test_rhcloud_insights.py | 4 ++-- tests/foreman/ui/test_rhcloud_inventory.py | 4 ++-- tests/upgrades/test_capsule.py | 2 +- tests/upgrades/test_performance_tuning.py | 2 +- tests/upgrades/test_satellite_maintain.py | 2 +- 29 files changed, 42 insertions(+), 48 deletions(-) diff --git a/testimony.yaml b/testimony.yaml index e6c210965a2..48d5932db84 100644 --- a/testimony.yaml +++ b/testimony.yaml @@ -25,9 +25,8 @@ CaseComponent: - Branding - BVT - Candlepin - - Capsule + - ForemanProxy - Capsule-Content - - Certificates - ComputeResources - ComputeResources-Azure - ComputeResources-CNV @@ -53,7 +52,7 @@ CaseComponent: - ErrataManagement - Fact - ForemanDebug - - ForemanMaintain + - SatelliteMaintain - Hammer - Hammer-Content - HTTPProxy @@ -64,7 +63,7 @@ CaseComponent: - Hosts-Content - Infobloxintegration - Infrastructure - - Installer + - Installation - InterSatelliteSync - katello-tracer - LDAP @@ -76,7 +75,6 @@ CaseComponent: - Networking - Notifications - OrganizationsandLocations - - Packaging - Parameters - Provisioning - ProvisioningTemplates @@ -89,16 +87,12 @@ CaseComponent: - RemoteExecution - Reporting - Repositories - - RHCloud-CloudConnector - - RHCloud-Insights - - RHCloud-Inventory + - RHCloud - rubygem-foreman-redhat_access - - satellite-change-hostname - SatelliteClone - SCAPPlugin - Search - Security - - SELinux - Settings - SubscriptionManagement - Subscriptions-virt-who diff --git a/tests/foreman/api/test_capsule.py b/tests/foreman/api/test_capsule.py index c255a2fd71a..86aaa089922 100644 --- a/tests/foreman/api/test_capsule.py +++ b/tests/foreman/api/test_capsule.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Capsule +:CaseComponent: ForemanProxy :Team: Platform diff --git a/tests/foreman/api/test_rhc.py b/tests/foreman/api/test_rhc.py index 521b1cb15da..30559fe406e 100644 --- a/tests/foreman/api/test_rhc.py +++ b/tests/foreman/api/test_rhc.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: RHCloud-CloudConnector +:CaseComponent: RHCloud :Team: Platform diff --git a/tests/foreman/api/test_rhcloud_inventory.py b/tests/foreman/api/test_rhcloud_inventory.py index 9cbd70dc2d4..76a33688f90 100644 --- a/tests/foreman/api/test_rhcloud_inventory.py +++ b/tests/foreman/api/test_rhcloud_inventory.py @@ -1,10 +1,10 @@ """API tests for RH Cloud - Inventory, also known as Insights Inventory Upload -:Requirement: RH Cloud - Inventory +:Requirement: RHCloud :CaseAutomation: Automated -:CaseComponent: RHCloud-Inventory +:CaseComponent: RHCloud :Team: Platform diff --git a/tests/foreman/cli/test_capsule.py b/tests/foreman/cli/test_capsule.py index e41759fbc2b..ddcc100326a 100644 --- a/tests/foreman/cli/test_capsule.py +++ b/tests/foreman/cli/test_capsule.py @@ -1,10 +1,10 @@ """Test class for the capsule CLI. -:Requirement: Capsule +:Requirement: ForemanProxy :CaseAutomation: Automated -:CaseComponent: Capsule +:CaseComponent: ForemanProxy :Team: Platform diff --git a/tests/foreman/cli/test_installer.py b/tests/foreman/cli/test_installer.py index 4a42eaa1315..cf0eb838ee0 100644 --- a/tests/foreman/cli/test_installer.py +++ b/tests/foreman/cli/test_installer.py @@ -1,10 +1,10 @@ """Tests For Disconnected Satellite Installation -:Requirement: Installer (disconnected satellite installation) +:Requirement: Installation (disconnected satellite installation) :CaseAutomation: Automated -:CaseComponent: Installer +:CaseComponent: Installation :Team: Platform diff --git a/tests/foreman/cli/test_rhcloud_inventory.py b/tests/foreman/cli/test_rhcloud_inventory.py index e127f6e7382..31847984e03 100644 --- a/tests/foreman/cli/test_rhcloud_inventory.py +++ b/tests/foreman/cli/test_rhcloud_inventory.py @@ -1,10 +1,10 @@ """CLI tests for RH Cloud - Inventory, aka Insights Inventory Upload -:Requirement: RH Cloud - Inventory +:Requirement: RHCloud :CaseAutomation: Automated -:CaseComponent: RHCloud-Inventory +:CaseComponent: RHCloud :Team: Platform diff --git a/tests/foreman/destructive/test_capsule.py b/tests/foreman/destructive/test_capsule.py index 40935c114b9..1cc63f4fbbe 100644 --- a/tests/foreman/destructive/test_capsule.py +++ b/tests/foreman/destructive/test_capsule.py @@ -1,10 +1,10 @@ """Test class for the capsule CLI. -:Requirement: Capsule +:Requirement: ForemanProxy :CaseAutomation: Automated -:CaseComponent: Capsule +:CaseComponent: ForemanProxy :Team: Platform diff --git a/tests/foreman/destructive/test_capsule_loadbalancer.py b/tests/foreman/destructive/test_capsule_loadbalancer.py index 990a61b8f09..67bc0762c11 100644 --- a/tests/foreman/destructive/test_capsule_loadbalancer.py +++ b/tests/foreman/destructive/test_capsule_loadbalancer.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Capsule +:CaseComponent: ForemanProxy :Team: Platform diff --git a/tests/foreman/destructive/test_installer.py b/tests/foreman/destructive/test_installer.py index a020b66f96a..36776213c13 100644 --- a/tests/foreman/destructive/test_installer.py +++ b/tests/foreman/destructive/test_installer.py @@ -1,10 +1,10 @@ """Smoke tests to check installation health -:Requirement: Installer +:Requirement: Installation :CaseAutomation: Automated -:CaseComponent: Installer +:CaseComponent: Installation :Team: Platform diff --git a/tests/foreman/destructive/test_katello_certs_check.py b/tests/foreman/destructive/test_katello_certs_check.py index b1c7b4cb3eb..01c41441823 100644 --- a/tests/foreman/destructive/test_katello_certs_check.py +++ b/tests/foreman/destructive/test_katello_certs_check.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Certificates +:CaseComponent: Installation :Team: Platform diff --git a/tests/foreman/destructive/test_packages.py b/tests/foreman/destructive/test_packages.py index e81eb228268..da9c15f6515 100644 --- a/tests/foreman/destructive/test_packages.py +++ b/tests/foreman/destructive/test_packages.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/destructive/test_rename.py b/tests/foreman/destructive/test_rename.py index d5af1d6cfee..03fd9ff0d6f 100644 --- a/tests/foreman/destructive/test_rename.py +++ b/tests/foreman/destructive/test_rename.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: satellite-change-hostname +:CaseComponent: Installation :Team: Platform diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index 564614f44d5..6c038351914 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -1,10 +1,10 @@ """Smoke tests to check installation health -:Requirement: Installer +:Requirement: Installation :CaseAutomation: Automated -:CaseComponent: Installer +:CaseComponent: Installation :Team: Platform diff --git a/tests/foreman/maintain/test_advanced.py b/tests/foreman/maintain/test_advanced.py index 2453f27a3ae..6a66c9aefcf 100644 --- a/tests/foreman/maintain/test_advanced.py +++ b/tests/foreman/maintain/test_advanced.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/maintain/test_backup_restore.py b/tests/foreman/maintain/test_backup_restore.py index a845e71a166..f81b268e844 100644 --- a/tests/foreman/maintain/test_backup_restore.py +++ b/tests/foreman/maintain/test_backup_restore.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/maintain/test_health.py b/tests/foreman/maintain/test_health.py index e927d85b5a5..9da62960142 100644 --- a/tests/foreman/maintain/test_health.py +++ b/tests/foreman/maintain/test_health.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/maintain/test_maintenance_mode.py b/tests/foreman/maintain/test_maintenance_mode.py index 3cc340f774b..50d130ac55a 100644 --- a/tests/foreman/maintain/test_maintenance_mode.py +++ b/tests/foreman/maintain/test_maintenance_mode.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/maintain/test_offload_DB.py b/tests/foreman/maintain/test_offload_DB.py index ca0f64f87d8..0e1b3ced9d9 100644 --- a/tests/foreman/maintain/test_offload_DB.py +++ b/tests/foreman/maintain/test_offload_DB.py @@ -4,7 +4,7 @@ :CaseAutomation: ManualOnly -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform @@ -28,5 +28,5 @@ def test_offload_internal_db_to_external_db_host(): :expectedresults: Installed successful, all services running - :CaseComponent: Installer + :CaseComponent: Installation """ diff --git a/tests/foreman/maintain/test_packages.py b/tests/foreman/maintain/test_packages.py index 9931d144352..a4c56eac531 100644 --- a/tests/foreman/maintain/test_packages.py +++ b/tests/foreman/maintain/test_packages.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/maintain/test_service.py b/tests/foreman/maintain/test_service.py index 802ca684bb2..7f8c0efad8c 100644 --- a/tests/foreman/maintain/test_service.py +++ b/tests/foreman/maintain/test_service.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/maintain/test_upgrade.py b/tests/foreman/maintain/test_upgrade.py index 13ea31a5de0..0f08f23c6b3 100644 --- a/tests/foreman/maintain/test_upgrade.py +++ b/tests/foreman/maintain/test_upgrade.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform diff --git a/tests/foreman/sys/test_katello_certs_check.py b/tests/foreman/sys/test_katello_certs_check.py index 5bfeed3eee5..640add5a0ae 100644 --- a/tests/foreman/sys/test_katello_certs_check.py +++ b/tests/foreman/sys/test_katello_certs_check.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Certificates +:CaseComponent: Installation :Team: Platform diff --git a/tests/foreman/ui/test_rhc.py b/tests/foreman/ui/test_rhc.py index 0fdefee5bf1..f3ab5eae14f 100644 --- a/tests/foreman/ui/test_rhc.py +++ b/tests/foreman/ui/test_rhc.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: RHCloud-CloudConnector +:CaseComponent: RHCloud :Team: Platform diff --git a/tests/foreman/ui/test_rhcloud_insights.py b/tests/foreman/ui/test_rhcloud_insights.py index 9dcd309055c..2a3cabf789f 100644 --- a/tests/foreman/ui/test_rhcloud_insights.py +++ b/tests/foreman/ui/test_rhcloud_insights.py @@ -1,10 +1,10 @@ """Tests for RH Cloud - Inventory -:Requirement: RH Cloud - Inventory +:Requirement: RHCloud :CaseAutomation: Automated -:CaseComponent: RHCloud-Inventory +:CaseComponent: RHCloud :Team: Platform diff --git a/tests/foreman/ui/test_rhcloud_inventory.py b/tests/foreman/ui/test_rhcloud_inventory.py index e242366bf0a..642bef3b84b 100644 --- a/tests/foreman/ui/test_rhcloud_inventory.py +++ b/tests/foreman/ui/test_rhcloud_inventory.py @@ -1,10 +1,10 @@ """Tests for RH Cloud - Inventory, also known as Insights Inventory Upload -:Requirement: RH Cloud - Inventory +:Requirement: RHCloud :CaseAutomation: Automated -:CaseComponent: RHCloud-Inventory +:CaseComponent: RHCloud :Team: Platform diff --git a/tests/upgrades/test_capsule.py b/tests/upgrades/test_capsule.py index d064b677fbe..c7cf63e9977 100644 --- a/tests/upgrades/test_capsule.py +++ b/tests/upgrades/test_capsule.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Capsule +:CaseComponent: ForemanProxy :Team: Platform diff --git a/tests/upgrades/test_performance_tuning.py b/tests/upgrades/test_performance_tuning.py index 94e40a33ba7..33237e8f561 100644 --- a/tests/upgrades/test_performance_tuning.py +++ b/tests/upgrades/test_performance_tuning.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Installer +:CaseComponent: Installation :Team: Platform diff --git a/tests/upgrades/test_satellite_maintain.py b/tests/upgrades/test_satellite_maintain.py index 6029078bdb6..03abb569e94 100644 --- a/tests/upgrades/test_satellite_maintain.py +++ b/tests/upgrades/test_satellite_maintain.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: ForemanMaintain +:CaseComponent: SatelliteMaintain :Team: Platform From 98f375db26787e031e259ffe332740330bea45ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Gajdu=C5=A1ek?= Date: Mon, 11 Mar 2024 20:09:52 +0100 Subject: [PATCH 022/150] Mark fake secret as "notsecret" (#14336) --- tests/robottelo/test_dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/robottelo/test_dependencies.py b/tests/robottelo/test_dependencies.py index 78b0dc499ea..950cbeebec4 100644 --- a/tests/robottelo/test_dependencies.py +++ b/tests/robottelo/test_dependencies.py @@ -82,7 +82,7 @@ def test_productmd(): def test_pyotp(): import pyotp - fake_secret = 'JBSWY3DPEHPK3PXP' + fake_secret = 'JBSWY3DPEHPK3PXP' # notsecret totp = pyotp.TOTP(fake_secret) assert totp.now() From 73b7bd28bf050135ebf7c563c8cc5a53bb361d9d Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Tue, 12 Mar 2024 13:33:09 +0530 Subject: [PATCH 023/150] Update Ansible tests to reflect the new split Ansible components (#14302) Signed-off-by: Gaurav Talreja --- testimony.yaml | 3 +- tests/foreman/api/test_ansible.py | 91 +++++++++++------------ tests/foreman/cli/test_ansible.py | 12 +-- tests/foreman/cli/test_remoteexecution.py | 2 +- tests/foreman/destructive/test_ansible.py | 11 ++- tests/foreman/ui/test_ansible.py | 8 +- tests/foreman/ui/test_jobinvocation.py | 4 +- tests/foreman/ui/test_remoteexecution.py | 22 +++--- 8 files changed, 73 insertions(+), 80 deletions(-) diff --git a/testimony.yaml b/testimony.yaml index 48d5932db84..c084e207423 100644 --- a/testimony.yaml +++ b/testimony.yaml @@ -15,7 +15,8 @@ CaseComponent: # No spaces allowed - ActivationKeys - AlternateContentSources - - Ansible + - Ansible-ConfigurationManagement + - Ansible-RemoteExecution - AnsibleCollection - API - AuditLog diff --git a/tests/foreman/api/test_ansible.py b/tests/foreman/api/test_ansible.py index cc491b29ea8..515d432423f 100644 --- a/tests/foreman/api/test_ansible.py +++ b/tests/foreman/api/test_ansible.py @@ -4,11 +4,11 @@ :CaseAutomation: Automated -:CaseComponent: Ansible +:CaseComponent: Ansible-ConfigurationManagement :Team: Rocket -:CaseImportance: High +:CaseImportance: Critical """ from fauxfactory import gen_string @@ -19,6 +19,46 @@ from robottelo.utils.issue_handlers import is_open +@pytest.fixture +def filtered_user(target_sat, module_org, module_location): + """ + :steps: + 1. Create a role with a host view filtered + 2. Create a user with that role + 3. Setup a host + """ + role = target_sat.api.Role( + name=gen_string('alpha'), location=[module_location], organization=[module_org] + ).create() + # assign view_hosts (with a filter, to test BZ 1699188), + # view_hostgroups, view_facts permissions to the role + permission_hosts = target_sat.api.Permission().search(query={'search': 'name="view_hosts"'}) + permission_hostgroups = target_sat.api.Permission().search( + query={'search': 'name="view_hostgroups"'} + ) + permission_facts = target_sat.api.Permission().search(query={'search': 'name="view_facts"'}) + target_sat.api.Filter( + permission=permission_hosts, search='name != nonexistent', role=role + ).create() + target_sat.api.Filter(permission=permission_hostgroups, role=role).create() + target_sat.api.Filter(permission=permission_facts, role=role).create() + + password = gen_string('alpha') + user = target_sat.api.User( + role=[role], password=password, location=[module_location], organization=[module_org] + ).create() + + return user, password + + +@pytest.fixture +def rex_host_in_org_and_loc(target_sat, module_org, module_location, rex_contenthost): + host = target_sat.api.Host().search(query={'search': f'name={rex_contenthost.hostname}'})[0] + target_sat.api.Host(id=host.id, organization=[module_org.id]).update(['organization']) + target_sat.api.Host(id=host.id, location=module_location.id).update(['location']) + return host + + @pytest.mark.e2e def test_fetch_and_sync_ansible_playbooks(target_sat): """ @@ -39,8 +79,6 @@ def test_fetch_and_sync_ansible_playbooks(target_sat): 1. Playbooks should be fetched and synced successfully. :BZ: 2115686 - - :CaseAutomation: Automated """ target_sat.execute( "ansible-galaxy collection install -p /usr/share/ansible/collections " @@ -88,9 +126,7 @@ def test_positive_ansible_job_on_host( :BZ: 2164400 - :CaseAutomation: Automated - - :CaseImportance: Critical + :CaseComponent: Ansible-RemoteExecution """ SELECTED_ROLE = 'RedHatInsights.insights-client' if rhel_contenthost.os_version.major <= 7: @@ -161,7 +197,7 @@ def test_positive_ansible_job_on_multiple_host( :BZ: 2167396, 2190464, 2184117 - :CaseAutomation: Automated + :CaseComponent: Ansible-RemoteExecution """ hosts = [rhel9_contenthost, rhel8_contenthost, rhel7_contenthost] SELECTED_ROLE = 'RedHatInsights.insights-client' @@ -286,45 +322,6 @@ def test_add_and_remove_ansible_role_hostgroup(target_sat): assert len(hg_nested_roles) == 0 -@pytest.fixture -def filtered_user(target_sat, module_org, module_location): - """ - :steps: - 1. Create a role with a host view filtered - 2. Create a user with that role - 3. Setup a host - """ - api = target_sat.api - role = api.Role( - name=gen_string('alpha'), location=[module_location], organization=[module_org] - ).create() - # assign view_hosts (with a filter, to test BZ 1699188), - # view_hostgroups, view_facts permissions to the role - permission_hosts = api.Permission().search(query={'search': 'name="view_hosts"'}) - permission_hostgroups = api.Permission().search(query={'search': 'name="view_hostgroups"'}) - permission_facts = api.Permission().search(query={'search': 'name="view_facts"'}) - api.Filter(permission=permission_hosts, search='name != nonexistent', role=role).create() - api.Filter(permission=permission_hostgroups, role=role).create() - api.Filter(permission=permission_facts, role=role).create() - - password = gen_string('alpha') - user = api.User( - role=[role], password=password, location=[module_location], organization=[module_org] - ).create() - - return user, password - - -@pytest.fixture -def rex_host_in_org_and_loc(target_sat, module_org, module_location, rex_contenthost): - api = target_sat.api - host = api.Host().search(query={'search': f'name={rex_contenthost.hostname}'})[0] - host_id = host.id - api.Host(id=host_id, organization=[module_org.id]).update(['organization']) - api.Host(id=host_id, location=module_location.id).update(['location']) - return host - - @pytest.mark.rhel_ver_match('[78]') @pytest.mark.tier2 def test_positive_read_facts_with_filter( diff --git a/tests/foreman/cli/test_ansible.py b/tests/foreman/cli/test_ansible.py index b628c9d8fa2..8cffe15b20d 100644 --- a/tests/foreman/cli/test_ansible.py +++ b/tests/foreman/cli/test_ansible.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Ansible +:CaseComponent: Ansible-ConfigurationManagement :Team: Rocket @@ -41,8 +41,6 @@ def test_positive_ansible_e2e(target_sat, module_org, rhel_contenthost): 2. Job execution must be successful. 3. Operations performed with hammer must be successful. - :CaseAutomation: Automated - :BZ: 2154184 :customerscenario: true @@ -53,7 +51,7 @@ def test_positive_ansible_e2e(target_sat, module_org, rhel_contenthost): SELECTED_ROLE_1 = 'theforeman.foreman_scap_client' SELECTED_VAR = gen_string('alpha') # disable batch tasks to test BZ#2154184 - target_sat.cli.Settings.set({'name': "foreman_tasks_proxy_batch_trigger", 'value': "false"}) + target_sat.cli.Settings.set({'name': 'foreman_tasks_proxy_batch_trigger', 'value': 'false'}) if rhel_contenthost.os_version.major <= 7: rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) assert rhel_contenthost.execute('yum install -y insights-client').status == 0 @@ -121,7 +119,7 @@ def test_positive_ansible_e2e(target_sat, module_org, rhel_contenthost): @pytest.mark.tier2 def test_add_and_remove_ansible_role_hostgroup(target_sat): """ - Test add and remove functionality for ansible roles in hostgroup via cli + Test add and remove functionality for ansible roles in hostgroup via CLI :id: 2c6fda14-4cd2-490a-b7ef-7a08f8164fad @@ -135,11 +133,9 @@ def test_add_and_remove_ansible_role_hostgroup(target_sat): 5. Remove the added ansible roles from the host group :expectedresults: - 1. Ansible role assign/add/remove functionality should work as expected in cli + 1. Ansible role assign/add/remove functionality should work as expected in CLI :BZ: 2029402 - - :CaseAutomation: Automated """ ROLES = [ 'theforeman.foreman_scap_client', diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index c030e54e113..d2ffb7dff6e 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -963,7 +963,7 @@ def test_positive_install_ansible_collection( :id: ad25aee5-4ea3-4743-a301-1c6271856f79 - :CaseComponent: Ansible + :CaseComponent: Ansible-RemoteExecution :Team: Rocket """ diff --git a/tests/foreman/destructive/test_ansible.py b/tests/foreman/destructive/test_ansible.py index 0ff8fc67a1d..01779d6a14a 100644 --- a/tests/foreman/destructive/test_ansible.py +++ b/tests/foreman/destructive/test_ansible.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: Ansible +:CaseComponent: Ansible-ConfigurationManagement :Team: Rocket @@ -21,10 +21,6 @@ def test_positive_persistent_ansible_cfg_change(target_sat): :id: c22fcd47-8627-4230-aa1f-7d4fc8517a0e - :BZ: 1786358 - - :customerscenario: true - :steps: 1. Update value in ansible.cfg. 2. Verify value is updated in the file. @@ -33,6 +29,10 @@ def test_positive_persistent_ansible_cfg_change(target_sat): :expectedresults: Changes in ansible.cfg are persistent after running "satellite-installer". + + :BZ: 1786358 + + :customerscenario: true """ ansible_cfg = '/etc/ansible/ansible.cfg' param = 'local_tmp = /tmp' @@ -49,7 +49,6 @@ def test_positive_import_all_roles(target_sat): :id: 53fe3857-a08f-493d-93c7-3fed331ed391 :steps: - 1. Navigate to the Configure > Roles page. 2. Click the `Import from [hostname]` button. 3. Get total number of importable roles from pagination. diff --git a/tests/foreman/ui/test_ansible.py b/tests/foreman/ui/test_ansible.py index 2026ca8c095..82ffd5bf187 100644 --- a/tests/foreman/ui/test_ansible.py +++ b/tests/foreman/ui/test_ansible.py @@ -4,11 +4,11 @@ :CaseAutomation: Automated -:CaseComponent: Ansible +:CaseComponent: Ansible-ConfigurationManagement :Team: Rocket -:CaseImportance: High +:CaseImportance: Critical """ from fauxfactory import gen_string @@ -111,7 +111,7 @@ def test_positive_config_report_ansible(session, target_sat, module_org, rhel_co 1. Host should be assigned the proper role. 2. Job report should be created. - :CaseImportance: Critical + :CaseComponent: Ansible-RemoteExecution """ SELECTED_ROLE = 'RedHatInsights.insights-client' if rhel_contenthost.os_version.major <= 7: @@ -176,7 +176,7 @@ def test_positive_ansible_custom_role(target_sat, session, module_org, rhel_cont :BZ: 2155392 - :CaseAutomation: Automated + :CaseComponent: Ansible-RemoteExecution """ SELECTED_ROLE = 'custom_role' playbook = f'{robottelo_tmp_dir}/playbook.yml' diff --git a/tests/foreman/ui/test_jobinvocation.py b/tests/foreman/ui/test_jobinvocation.py index c98e512f527..d79d7ee3355 100644 --- a/tests/foreman/ui/test_jobinvocation.py +++ b/tests/foreman/ui/test_jobinvocation.py @@ -126,7 +126,7 @@ def test_positive_schedule_recurring_host_job(self): :id: 5052be04-28ab-4349-8bee-851ef76e4ffa - :caseComponent: Ansible + :caseComponent: Ansible-RemoteExecution :Team: Rocket @@ -152,7 +152,7 @@ def test_positive_schedule_recurring_hostgroup_job(self): :id: c65db99b-11fe-4a32-89d0-0a4692b07efe - :caseComponent: Ansible + :caseComponent: Ansible-RemoteExecution :Team: Rocket diff --git a/tests/foreman/ui/test_remoteexecution.py b/tests/foreman/ui/test_remoteexecution.py index e1e08d070e7..cdfe9c7ec4e 100644 --- a/tests/foreman/ui/test_remoteexecution.py +++ b/tests/foreman/ui/test_remoteexecution.py @@ -288,7 +288,7 @@ def test_positive_ansible_job_check_mode(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-RemoteExecution :Team: Rocket """ @@ -311,7 +311,7 @@ def test_positive_ansible_config_report_failed_tasks_errors(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -335,7 +335,7 @@ def test_positive_ansible_config_report_changes_notice(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -356,7 +356,7 @@ def test_positive_ansible_variables_imported_with_roles(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -377,7 +377,7 @@ def test_positive_roles_import_in_background(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -399,7 +399,7 @@ def test_positive_ansible_roles_ignore_list(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -423,7 +423,7 @@ def test_positive_ansible_variables_installed_with_collection(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -449,7 +449,7 @@ def test_positive_install_ansible_collection_via_job_invocation(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-RemoteExecution :Team: Rocket """ @@ -474,7 +474,7 @@ def test_positive_set_ansible_role_order_per_host(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -501,7 +501,7 @@ def test_positive_set_ansible_role_order_per_hostgroup(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ @@ -527,7 +527,7 @@ def test_positive_matcher_field_highlight(session): :CaseAutomation: NotAutomated - :CaseComponent: Ansible + :CaseComponent: Ansible-ConfigurationManagement :Team: Rocket """ From d9011761b7d4ed4cb4524f75f68cec38124fff3b Mon Sep 17 00:00:00 2001 From: Jitendra Yejare Date: Wed, 13 Mar 2024 16:21:29 +0530 Subject: [PATCH 024/150] Broker dependency updated to resolve ssh2-python limitation/packagever issue (#14275) Broker dependency updated to resolve limitation issue --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a2c982fc720..599d6fa5f3f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,5 +36,5 @@ git+https://github.com/SatelliteQE/nailgun.git@master#egg=nailgun # In the meantime, we install directly from the repo # [1] - https://github.com/ParallelSSH/ssh2-python/issues/193 # [2] - https://github.com/pypi/warehouse/issues/7136 -git+https://github.com/SatelliteQE/broker.git@0.4.5#egg=broker +git+https://github.com/SatelliteQE/broker.git@0.4.7#egg=broker --editable . From 57a505a33bb64062aae3e69d8a1ba91f44384656 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 13 Mar 2024 14:33:27 +0100 Subject: [PATCH 025/150] simplify time expression assertions (#14379) simplify time experssion assertions --- tests/foreman/cli/test_remoteexecution.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index d2ffb7dff6e..3f530054359 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -484,7 +484,6 @@ def test_positive_time_expressions(self, rex_contenthost, target_sat): today = datetime.today() hour = datetime.utcnow().hour last_day_of_month = monthrange(today.year, today.month)[1] - days_to = (2 - today.weekday()) % 7 # cronline uses https://github.com/floraison/fugit fugit_expressions = [ ['@yearly', f'{today.year + 1}/01/01 00:00:00'], @@ -504,11 +503,6 @@ def test_positive_time_expressions(self, rex_contenthost, target_sat): '@hourly', f'{(datetime.utcnow() + timedelta(hours=1)).strftime("%Y/%m/%d %H")}:00:00', ], - [ - '0 0 * * wed-fri', - f'{(today + timedelta(days=(days_to if days_to > 0 else 1))).strftime("%Y/%m/%d")} ' - '00:00:00', - ], # 23 mins after every other hour [ '23 0-23/2 * * *', From 944fe3ef2901e0d2ad5e44989a3e3c93d65c78d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hellebrandt?= Date: Wed, 13 Mar 2024 14:51:56 +0100 Subject: [PATCH 026/150] Close-loop bz2209968 (#14158) --- robottelo/utils/datafactory.py | 18 ++++++ tests/foreman/ui/test_jobinvocation.py | 76 +++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/robottelo/utils/datafactory.py b/robottelo/utils/datafactory.py index c5ccc38ba14..1834e0f87b0 100644 --- a/robottelo/utils/datafactory.py +++ b/robottelo/utils/datafactory.py @@ -364,6 +364,24 @@ def valid_hostgroups_list(): ] +@filtered_datapoint +def valid_hostgroups_list_short(): + """Generates a list of valid host group names. Shorter so they can be nested. + + :return: Returns the valid host group names list + """ + return [ + gen_string('alphanumeric', random.randint(1, 15)), + gen_string('alpha', random.randint(1, 15)), + gen_string('cjk', random.randint(1, 15)), + gen_string('latin1', random.randint(1, 15)), + gen_string('numeric', random.randint(1, 15)), + gen_string('utf8', random.randint(1, 15)), + gen_string('html', random.randint(1, 15)), + gen_string('alphanumeric', random.randint(1, 15)), + ] + + @filtered_datapoint def valid_labels_list(): """Generates a list of valid labels.""" diff --git a/tests/foreman/ui/test_jobinvocation.py b/tests/foreman/ui/test_jobinvocation.py index d79d7ee3355..0394d00a888 100644 --- a/tests/foreman/ui/test_jobinvocation.py +++ b/tests/foreman/ui/test_jobinvocation.py @@ -11,10 +11,15 @@ :CaseImportance: High """ +from collections import OrderedDict + from inflection import camelize import pytest -from robottelo.utils.datafactory import gen_string +from robottelo.utils.datafactory import ( + gen_string, + valid_hostgroups_list_short, +) @pytest.fixture @@ -27,6 +32,75 @@ def module_rhel_client_by_ip(module_org, smart_proxy_location, rhel7_contenthost return rhel7_contenthost +@pytest.mark.tier4 +def test_positive_hostgroups_full_nested_names( + module_org, + smart_proxy_location, + target_sat, +): + """Check that full host group names are displayed when invoking a job + + :id: 2301cd1d-ed82-4168-9f9b-d1661ac8fc5b + + :steps: + + 1. Go to Monitor -> Jobs -> Run job + 2. In "Target hosts and inputs" step, choose "Host groups" targeting + + :expectedresults: Verify that in the dropdown, full hostgroup names are present, e.g. Parent/Child/Grandchild + + :parametrized: yes + + :customerscenario: true + + :BZ: 2209968 + """ + names = valid_hostgroups_list_short() + tree = OrderedDict( + { + 'parent1': {'name': names[0], 'parent': None}, + 'parent2': {'name': names[1], 'parent': None}, + 'child1a': {'name': names[2], 'parent': 'parent1'}, + 'child1b': {'name': names[3], 'parent': 'parent1'}, + 'child2': {'name': names[4], 'parent': 'parent2'}, + 'grandchild1a1': {'name': names[5], 'parent': 'child1a'}, + 'grandchild1a2': {'name': names[6], 'parent': 'child1a'}, + 'grandchild1b': {'name': names[7], 'parent': 'child1b'}, + } + ) + expected_names = [] + for identifier, data in tree.items(): + name = data['name'] + parent_name = None if data['parent'] is None else tree[data['parent']]['name'] + target_sat.cli_factory.hostgroup( + { + 'name': name, + 'parent': parent_name, + 'organization-ids': module_org.id, + 'location-ids': smart_proxy_location.id, + } + ) + expected_name = '' + current = identifier + while current: + expected_name = ( + f"{tree[current]['name']}/{expected_name}" + if expected_name + else tree[current]['name'] + ) + current = tree[current]['parent'] + # we should have something like "parent1/child1a" + expected_names.append(expected_name) + + with target_sat.ui_session() as session: + session.organization.select(module_org.name) + session.location.select(smart_proxy_location.name) + hostgroups = session.jobinvocation.read_hostgroups() + + for name in expected_names: + assert name in hostgroups + + @pytest.mark.tier4 def test_positive_run_default_job_template_by_ip( session, module_org, smart_proxy_location, module_rhel_client_by_ip From 1f96a99e16e9b318bf7fb4198c085c7463e6c505 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 13 Mar 2024 14:57:47 +0100 Subject: [PATCH 027/150] component name changes (#14380) --- testimony.yaml | 3 --- tests/foreman/api/test_ldapauthsource.py | 2 +- tests/foreman/cli/test_ldapauthsource.py | 2 +- tests/foreman/cli/test_sso.py | 2 +- tests/foreman/destructive/test_ldap_authentication.py | 2 +- tests/foreman/destructive/test_ldapauthsource.py | 2 +- tests/foreman/sys/test_dynflow.py | 4 ++-- tests/foreman/ui/test_ldap_authentication.py | 2 +- 8 files changed, 8 insertions(+), 11 deletions(-) diff --git a/testimony.yaml b/testimony.yaml index c084e207423..312e59f197b 100644 --- a/testimony.yaml +++ b/testimony.yaml @@ -47,8 +47,6 @@ CaseComponent: - DiscoveryImage - DiscoveryPlugin - Documentation - - Dynflow - - Email - Entitlements - ErrataManagement - Fact @@ -67,7 +65,6 @@ CaseComponent: - Installation - InterSatelliteSync - katello-tracer - - LDAP - Leappintegration - LifecycleEnvironments - LocalizationInternationalization diff --git a/tests/foreman/api/test_ldapauthsource.py b/tests/foreman/api/test_ldapauthsource.py index fbcc7039193..885d290e741 100644 --- a/tests/foreman/api/test_ldapauthsource.py +++ b/tests/foreman/api/test_ldapauthsource.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: LDAP +:CaseComponent: Authentication :Team: Endeavour diff --git a/tests/foreman/cli/test_ldapauthsource.py b/tests/foreman/cli/test_ldapauthsource.py index 528a47420a5..ce7b625c3a6 100644 --- a/tests/foreman/cli/test_ldapauthsource.py +++ b/tests/foreman/cli/test_ldapauthsource.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: LDAP +:CaseComponent: Authentication :Team: Endeavour diff --git a/tests/foreman/cli/test_sso.py b/tests/foreman/cli/test_sso.py index d8b772a936f..949e021ff48 100644 --- a/tests/foreman/cli/test_sso.py +++ b/tests/foreman/cli/test_sso.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: LDAP +:CaseComponent: Authentication :Team: Endeavour diff --git a/tests/foreman/destructive/test_ldap_authentication.py b/tests/foreman/destructive/test_ldap_authentication.py index 58f3121dbec..33539fff89e 100644 --- a/tests/foreman/destructive/test_ldap_authentication.py +++ b/tests/foreman/destructive/test_ldap_authentication.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: LDAP +:CaseComponent: Authentication :Team: Endeavour diff --git a/tests/foreman/destructive/test_ldapauthsource.py b/tests/foreman/destructive/test_ldapauthsource.py index 020aad9f716..0cebd782532 100644 --- a/tests/foreman/destructive/test_ldapauthsource.py +++ b/tests/foreman/destructive/test_ldapauthsource.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: LDAP +:CaseComponent: Authentication :Team: Endeavour diff --git a/tests/foreman/sys/test_dynflow.py b/tests/foreman/sys/test_dynflow.py index f08f07d4f8d..2b758bcb208 100644 --- a/tests/foreman/sys/test_dynflow.py +++ b/tests/foreman/sys/test_dynflow.py @@ -2,11 +2,11 @@ :CaseAutomation: Automated -:CaseComponent: Dynflow +:CaseComponent: TasksPlugin :Team: Endeavour -:Requirement: Dynflow +:Requirement: TasksPlugin :CaseImportance: High diff --git a/tests/foreman/ui/test_ldap_authentication.py b/tests/foreman/ui/test_ldap_authentication.py index 6fcb71a7efa..a6e3af6d612 100644 --- a/tests/foreman/ui/test_ldap_authentication.py +++ b/tests/foreman/ui/test_ldap_authentication.py @@ -4,7 +4,7 @@ :CaseAutomation: Automated -:CaseComponent: LDAP +:CaseComponent: Authentication :Team: Endeavour From 80c2bbc6b998e7899b35543316e627150e163989 Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Wed, 13 Mar 2024 20:46:20 +0530 Subject: [PATCH 028/150] update fixture name as per expected feature (#14375) * update fixture name as per expected feature * addressed review comments --- tests/foreman/api/test_subscription.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/foreman/api/test_subscription.py b/tests/foreman/api/test_subscription.py index 282dac528b0..ec122ec6bfb 100644 --- a/tests/foreman/api/test_subscription.py +++ b/tests/foreman/api/test_subscription.py @@ -442,7 +442,7 @@ def test_positive_os_restriction_on_repos(): """ -def test_positive_async_endpoint_for_manifest_refresh(target_sat, module_entitlement_manifest_org): +def test_positive_async_endpoint_for_manifest_refresh(target_sat, function_sca_manifest_org): """Verify that manifest refresh is using an async endpoint. Previously this was a single, synchronous endpoint. The endpoint to retrieve manifests is now split into two: an async endpoint to start "exporting" the manifest, and a second endpoint to download the @@ -461,12 +461,12 @@ def test_positive_async_endpoint_for_manifest_refresh(target_sat, module_entitle :BZ: 2066323 """ - sub = target_sat.api.Subscription(organization=module_entitlement_manifest_org) + sub = target_sat.api.Subscription(organization=function_sca_manifest_org) # set log level to 'debug' and restart services target_sat.cli.Admin.logging({'all': True, 'level-debug': True}) target_sat.cli.Service.restart() # refresh manifest and assert new log message to confirm async endpoint - sub.refresh_manifest(data={'organization_id': module_entitlement_manifest_org.id}) + sub.refresh_manifest(data={'organization_id': function_sca_manifest_org.id}) results = target_sat.execute( 'grep "Sending GET request to upstream Candlepin" /var/log/foreman/production.log' ) From 68638084ab35538ed2eba5fe9516057d22daba5c Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 13 Mar 2024 17:47:28 +0100 Subject: [PATCH 029/150] changes in test_positive_run_job_on_host_converted_to_pull_provider (#14394) --- tests/foreman/cli/test_remoteexecution.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index 3f530054359..d892b4dbb4a 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -1302,15 +1302,11 @@ def test_positive_run_job_on_host_converted_to_pull_provider( assert_job_invocation_result( module_target_sat, invocation_command['id'], rhel_contenthost.hostname ) - # check katello-agent runs along ygdrassil (SAT-1671) - result = rhel_contenthost.execute('systemctl status goferd') - assert result.status == 0, 'Failed to start goferd on client' - # run Ansible rex command to prove ssh provider works, remove katello-agent invocation_command = module_target_sat.cli_factory.job_invocation( { - 'job-template': 'Package Action - Ansible Default', - 'inputs': 'state=absent, name=katello-agent', + 'job-template': 'Remove Package - Katello Script Default', + 'inputs': 'package=katello-agent', 'search-query': f"name ~ {rhel_contenthost.hostname}", } ) From c76295b12c3788f602c0d82277bf34d8fe10a810 Mon Sep 17 00:00:00 2001 From: rmynar <64528205+rmynar@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:29:39 +0100 Subject: [PATCH 030/150] remove log check causing false negatives (#14314) --- tests/foreman/installer/test_installer.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index 6c038351914..da64593642e 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -1381,8 +1381,7 @@ def sat_default_install(module_sat_ready_rhels): f'foreman-initial-admin-password {settings.server.admin_password}', ] install_satellite(module_sat_ready_rhels[0], installer_args) - yield module_sat_ready_rhels[0] - common_sat_install_assertions(module_sat_ready_rhels[0]) + return module_sat_ready_rhels[0] @pytest.fixture(scope='module') @@ -1395,8 +1394,7 @@ def sat_non_default_install(module_sat_ready_rhels): 'foreman-proxy-content-pulpcore-hide-guarded-distributions false', ] install_satellite(module_sat_ready_rhels[1], installer_args, enable_fapolicyd=True) - yield module_sat_ready_rhels[1] - common_sat_install_assertions(module_sat_ready_rhels[1]) + return module_sat_ready_rhels[1] @pytest.mark.e2e From d6e3d7fa0980b49cd2ab8fa81dd8276d94cfad81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hellebrandt?= Date: Thu, 14 Mar 2024 10:32:48 +0100 Subject: [PATCH 031/150] Add test for Webpack 5 presence (#14353) --- tests/foreman/sys/test_webpack.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/foreman/sys/test_webpack.py diff --git a/tests/foreman/sys/test_webpack.py b/tests/foreman/sys/test_webpack.py new file mode 100644 index 00000000000..c71e9016e97 --- /dev/null +++ b/tests/foreman/sys/test_webpack.py @@ -0,0 +1,30 @@ +"""Test class for Webpack + +:CaseAutomation: Automated + +:CaseComponent: Installation + +:Requirement: Installation + +:Team: Endeavour + +:CaseImportance: High + +""" +import pytest + + +@pytest.mark.tier2 +def test_positive_webpack5(target_sat): + """Check whether Webpack 5 was used at packaging time + + :id: b7f3fbb2-ef4b-4634-877f-b8ea10373e04 + + :expectedresults: There is a file "public/webpack/foreman_tasks/foreman_tasks_remoteEntry.js" when Webpack 5 has been used. It used to be "public/webpack/foreman-tasks-.js" before. + """ + assert ( + target_sat.execute( + "find /usr/share/gems | grep public/webpack/foreman_tasks/foreman_tasks_remoteEntry.js" + ).status + == 0 + ) From b950e4880be73c5bfed54e90f27594dd6f51ad61 Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Thu, 14 Mar 2024 15:25:44 +0530 Subject: [PATCH 032/150] change a way to upload content into satellite (#14393) --- tests/foreman/api/test_repository.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/foreman/api/test_repository.py b/tests/foreman/api/test_repository.py index 206dddb976f..728249f097c 100644 --- a/tests/foreman/api/test_repository.py +++ b/tests/foreman/api/test_repository.py @@ -2295,13 +2295,14 @@ def test_positive_upload_file_to_file_repo(self, repo, target_sat): :CaseAutomation: Automated """ - repo.upload_content(files={'content': DataFile.RPM_TO_UPLOAD.read_bytes()}) + with open(DataFile.FAKE_FILE_NEW_NAME, 'rb') as handle: + repo.upload_content(files={'content': handle}) assert repo.read().content_counts['file'] == 1 filesearch = target_sat.api.File().search( - query={"search": f"name={constants.RPM_TO_UPLOAD}"} + query={"search": f"name={constants.FAKE_FILE_NEW_NAME}"} ) - assert filesearch[0].name == constants.RPM_TO_UPLOAD + assert filesearch[0].name == constants.FAKE_FILE_NEW_NAME @pytest.mark.tier1 @pytest.mark.upgrade From 672ba8dbe3a81c29b5b36e1548950975346af189 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:41:11 +0100 Subject: [PATCH 033/150] Skip orphan cleanup case for n_minus scenario (#14371) --- tests/foreman/api/test_capsulecontent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/api/test_capsulecontent.py b/tests/foreman/api/test_capsulecontent.py index 99c2bb816fc..7543134f2f9 100644 --- a/tests/foreman/api/test_capsulecontent.py +++ b/tests/foreman/api/test_capsulecontent.py @@ -1293,7 +1293,7 @@ def test_positive_remove_capsule_orphans( :BZ: 22043089, 2211962 """ - if not pytestconfig.option.n_minus: + if pytestconfig.option.n_minus: pytest.skip('Test cannot be run on n-minus setups session-scoped capsule') # Enable RHST repo and sync it to the Library LCE. repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( From c10982fea40ebc31b24315cff4f52c18512afcdc Mon Sep 17 00:00:00 2001 From: David Moore <109112035+damoore044@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:19:47 -0400 Subject: [PATCH 034/150] Assertion Error, time delta/format in 'wait_for_sync()', of capsule content 'last_sync_time' (#14066) Assertion Error for datetime format of 'last sync time' change to sca-only orgs, entitlement orgs are failing assert capsule sync task(s) when invoked, and sync status pre-commit fix, refactor wait_for_sync() into concise steps --- robottelo/host_helpers/capsule_mixins.py | 87 +++++++-- tests/foreman/api/test_capsulecontent.py | 238 +++++++++++++---------- 2 files changed, 209 insertions(+), 116 deletions(-) diff --git a/robottelo/host_helpers/capsule_mixins.py b/robottelo/host_helpers/capsule_mixins.py index 1f3769e0f22..0e7ffd21065 100644 --- a/robottelo/host_helpers/capsule_mixins.py +++ b/robottelo/host_helpers/capsule_mixins.py @@ -1,6 +1,8 @@ -from datetime import datetime +from datetime import datetime, timedelta import time +from dateutil.parser import parse + from robottelo.constants import PUPPET_CAPSULE_INSTALLER, PUPPET_COMMON_INSTALLER_OPTS from robottelo.logging import logger from robottelo.utils.installer import InstallerCommand @@ -60,26 +62,79 @@ def wait_for_tasks( raise AssertionError(f"No task was found using query '{search_query}'") return tasks - def wait_for_sync(self, timeout=600, start_time=None): - """Wait for capsule sync to finish and assert the sync task succeeded""" - # Assert that a task to sync lifecycle environment to the capsule - # is started (or finished already) + def wait_for_sync(self, start_time=None, timeout=600): + """Wait for capsule sync to finish and assert success. + Assert that a task to sync lifecycle environment to the + capsule is started (or finished already), and succeeded. + :raises: ``AssertionError``: If a capsule sync verification fails based on the conditions. + + - Found some active sync task(s) for capsule, or it just finished (recent sync time). + - Any active sync task(s) polled, succeeded, and the capsule last_sync_time is updated. + - last_sync_time after final task is on or newer than start_time. + - The total sync time duration (seconds) is within timeout and not negative. + + :param start_time: (datetime): UTC time to compare against capsule's last_sync_time. + Default: None (current UTC). + :param timeout: (int) maximum seconds for active task(s) and queries to finish. + + :return: + list of polled finished tasks that were in-progress from `active_sync_tasks`. + """ + # Fetch initial capsule sync status + logger.info(f"Waiting for capsule {self.hostname} sync to finish ...") + sync_status = self.nailgun_capsule.content_get_sync(timeout=timeout, synchronous=True) + # Current UTC time for start_time, if not provided if start_time is None: start_time = datetime.utcnow().replace(microsecond=0) - logger.info(f"Waiting for capsule {self.hostname} sync to finish ...") - sync_status = self.nailgun_capsule.content_get_sync() - logger.info(f"Active tasks {sync_status['active_sync_tasks']}") + # 1s margin of safety for rounding + start_time = ( + (start_time - timedelta(seconds=1)) + .replace(microsecond=0) + .strftime('%Y-%m-%d %H:%M:%S UTC') + ) + # Assert presence of recent sync activity: + # one or more ongoing sync tasks for the capsule, + # Or, capsule's last_sync_time is on or after start_time + assert len(sync_status['active_sync_tasks']) or ( + parse(sync_status['last_sync_time']) >= parse(start_time) + ), ( + f"No active or recent sync found for capsule {self.hostname}." + f" `active_sync_tasks` was empty: {sync_status['active_sync_tasks']}," + f" and the `last_sync_time`: {sync_status['last_sync_time']}," + f" was prior to the `start_time`: {start_time}." + ) + sync_tasks = [] + # Poll and verify succeeds, any active sync task from initial status. + logger.info(f"Active tasks: {sync_status['active_sync_tasks']}") + for task in sync_status['active_sync_tasks']: + sync_tasks.append(self.satellite.api.ForemanTask(id=task['id']).poll(timeout=timeout)) + logger.info(f"Active sync task :id {task['id']} succeeded.") + + # Fetch updated capsule status (expect no ongoing sync) + logger.info(f"Querying updated sync status from capsule {self.hostname}.") + updated_status = self.nailgun_capsule.content_get_sync(timeout=timeout, synchronous=True) + # Last sync task end time is the same as capsule's last sync time. + assert parse(updated_status['last_sync_time']) == parse( + updated_status['last_sync_task']['ended_at'] + ), f"`last_sync_time` does not match final task's end time. Capsule: {self.hostname}" + + # Total time taken is not negative (sync prior to start_time), + # and did not exceed timeout. assert ( - len(sync_status['active_sync_tasks']) - or datetime.strptime(sync_status['last_sync_time'], '%Y-%m-%d %H:%M:%S UTC') - >= start_time + timedelta(seconds=0) + <= parse(updated_status['last_sync_time']) - parse(start_time) + <= timedelta(seconds=timeout) + ), ( + f"No recent sync task(s) were found for capsule: {self.hostname}, or task(s) timed out." + f" `last_sync_time`: ({updated_status['last_sync_time']}) was prior to `start_time`: ({start_time})" + f" or exceeded timeout ({timeout}s)." ) + # No failed or active tasks remaining + assert len(updated_status['last_failed_sync_tasks']) == 0 + assert len(updated_status['active_sync_tasks']) == 0 - # Wait till capsule sync finishes and assert the sync task succeeded - for task in sync_status['active_sync_tasks']: - self.satellite.api.ForemanTask(id=task['id']).poll(timeout=timeout) - sync_status = self.nailgun_capsule.content_get_sync() - assert len(sync_status['last_failed_sync_tasks']) == 0 + # return any polled sync tasks, that were initially in-progress + return sync_tasks def get_published_repo_url(self, org, prod, repo, lce=None, cv=None): """Forms url of a repo or CV published on a Satellite or Capsule. diff --git a/tests/foreman/api/test_capsulecontent.py b/tests/foreman/api/test_capsulecontent.py index 7543134f2f9..82a8bf49619 100644 --- a/tests/foreman/api/test_capsulecontent.py +++ b/tests/foreman/api/test_capsulecontent.py @@ -12,7 +12,8 @@ :CaseImportance: High """ -from datetime import datetime + +from datetime import datetime, timedelta import re from time import sleep @@ -20,11 +21,24 @@ from nailgun.entity_mixins import call_entity_method_with_timeout import pytest -from robottelo import constants from robottelo.config import settings from robottelo.constants import ( + CONTAINER_CLIENTS, CONTAINER_REGISTRY_HUB, CONTAINER_UPSTREAM_NAME, + ENVIRONMENT, + FAKE_1_YUM_REPOS_COUNT, + FAKE_3_YUM_REPO_RPMS, + FAKE_3_YUM_REPOS_COUNT, + FAKE_FILE_LARGE_COUNT, + FAKE_FILE_LARGE_URL, + FAKE_FILE_NEW_NAME, + KICKSTART_CONTENT, + PRDS, + REPOS, + REPOSET, + RH_CONTAINER_REGISTRY_HUB, + RPM_TO_UPLOAD, DataFile, ) from robottelo.constants.repos import ANSIBLE_GALAXY, CUSTOM_FILE_REPO @@ -83,14 +97,14 @@ def test_positive_uploaded_content_library_sync( assert repo.read().content_counts['rpm'] == 1 + timestamp = datetime.utcnow().replace(microsecond=0) # Publish new version of the content view cv.publish() + # query sync status as publish invokes sync, task succeeds + module_capsule_configured.wait_for_sync(start_time=timestamp) cv = cv.read() - assert len(cv.version) == 1 - module_capsule_configured.wait_for_sync() - # Verify the RPM published on Capsule caps_repo_url = module_capsule_configured.get_published_repo_url( org=function_org.label, @@ -101,7 +115,7 @@ def test_positive_uploaded_content_library_sync( ) caps_files = get_repo_files_by_url(caps_repo_url) assert len(caps_files) == 1 - assert caps_files[0] == constants.RPM_TO_UPLOAD + assert caps_files[0] == RPM_TO_UPLOAD @pytest.mark.tier4 @pytest.mark.skip_if_not_set('capsule', 'clients', 'fake_manifest') @@ -149,13 +163,13 @@ def test_positive_checksum_sync( assert len(cv.version) == 1 cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Verify repodata's checksum type is sha256, not sha1 on capsule repo_url = module_capsule_configured.get_published_repo_url( org=function_org.label, @@ -182,13 +196,13 @@ def test_positive_checksum_sync( cv.version.sort(key=lambda version: version.id) cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Verify repodata's checksum type has updated to sha1 on capsule repomd = get_repomd(repo_url) checksum_types = re.findall(r'(?<=checksum type=").*?(?=")', repomd) @@ -257,12 +271,13 @@ def test_positive_sync_updated_repo( assert len(cv.version) == 1 cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Upload more content to the repository with open(DataFile.SRPM_TO_UPLOAD, 'rb') as handle: repo.upload_content(files={'content': handle}) @@ -276,12 +291,13 @@ def test_positive_sync_updated_repo( cv.version.sort(key=lambda version: version.id) cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Check the content is synced on the Capsule side properly sat_repo_url = target_sat.get_published_repo_url( org=function_org.label, @@ -357,10 +373,18 @@ def test_positive_capsule_sync( assert len(cv.version) == 1 cvv = cv.version[-1].read() - # Promote content view to lifecycle environment + # prior to trigger (promoting), assert no active sync tasks + active_tasks = module_capsule_configured.nailgun_capsule.content_get_sync( + synchronous=True, timeout=600 + )['active_sync_tasks'] + assert len(active_tasks) == 0 + # Promote content view to lifecycle environment, + # invoking capsule sync task(s) + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 # Content of the published content view in @@ -368,8 +392,6 @@ def test_positive_capsule_sync( # repository assert repo.content_counts['rpm'] == cvv.package_count - module_capsule_configured.wait_for_sync() - # Assert that the content published on the capsule is exactly the # same as in repository on satellite sat_repo_url = target_sat.get_published_repo_url( @@ -404,14 +426,14 @@ def test_positive_capsule_sync( cv = cv.read() cv.version.sort(key=lambda version: version.id) cvv = cv.version[-1].read() - # Promote new content view version to lifecycle environment + # Promote new content view version to lifecycle environment, + # capsule sync task(s) invoked and succeed + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - - module_capsule_configured.wait_for_sync() - # Assert that the value of repomd revision of repository in # lifecycle environment on the capsule has not changed new_lce_revision_capsule = get_repomd_revision(caps_repo_url) @@ -427,21 +449,22 @@ def test_positive_capsule_sync( cv = cv.read() cv.version.sort(key=lambda version: version.id) cvv = cv.version[-1].read() + + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 # Assert that packages count in the repository is updated - assert repo.content_counts['rpm'] == (constants.FAKE_1_YUM_REPOS_COUNT + 1) + assert repo.content_counts['rpm'] == (FAKE_1_YUM_REPOS_COUNT + 1) # Assert that the content of the published content view in # lifecycle environment is exactly the same as content of the # repository assert repo.content_counts['rpm'] == cvv.package_count - module_capsule_configured.wait_for_sync() - # Assert that the content published on the capsule is exactly the # same as in the repository sat_files = get_repo_files_by_url(sat_repo_url) @@ -451,7 +474,7 @@ def test_positive_capsule_sync( @pytest.mark.tier4 @pytest.mark.skip_if_not_set('capsule', 'clients') def test_positive_iso_library_sync( - self, module_capsule_configured, module_entitlement_manifest_org, module_target_sat + self, module_capsule_configured, module_sca_manifest_org, module_target_sat ): """Ensure RH repo with ISOs after publishing to Library is synchronized to capsule automatically @@ -467,18 +490,18 @@ def test_positive_iso_library_sync( # Enable & sync RH repository with ISOs rh_repo_id = module_target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=module_entitlement_manifest_org.id, - product=constants.PRDS['rhsc'], - repo=constants.REPOS['rhsc7_iso']['name'], - reposet=constants.REPOSET['rhsc7_iso'], + org_id=module_sca_manifest_org.id, + product=PRDS['rhsc'], + repo=REPOS['rhsc7_iso']['name'], + reposet=REPOSET['rhsc7_iso'], releasever=None, ) rh_repo = module_target_sat.api.Repository(id=rh_repo_id).read() call_entity_method_with_timeout(rh_repo.sync, timeout=2500) # Find "Library" lifecycle env for specific organization lce = module_target_sat.api.LifecycleEnvironment( - organization=module_entitlement_manifest_org - ).search(query={'search': f'name={constants.ENVIRONMENT}'})[0] + organization=module_sca_manifest_org + ).search(query={'search': f'name={ENVIRONMENT}'})[0] # Associate the lifecycle environment with the capsule module_capsule_configured.nailgun_capsule.content_add_lifecycle_environment( @@ -491,23 +514,23 @@ def test_positive_iso_library_sync( # Create a content view with the repository cv = module_target_sat.api.ContentView( - organization=module_entitlement_manifest_org, repository=[rh_repo] + organization=module_sca_manifest_org, repository=[rh_repo] ).create() # Publish new version of the content view + timestamp = datetime.utcnow() cv.publish() - cv = cv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cv = cv.read() assert len(cv.version) == 1 # Verify ISOs are present on satellite sat_isos = get_repo_files_by_url(rh_repo.full_path, extension='iso') assert len(sat_isos) == 4 - module_capsule_configured.wait_for_sync() - # Verify all the ISOs are present on capsule caps_path = ( - f'{module_capsule_configured.url}/pulp/content/{module_entitlement_manifest_org.label}' + f'{module_capsule_configured.url}/pulp/content/{module_sca_manifest_org.label}' f'/{lce.label}/{cv.label}/content/dist/rhel/server/7/7Server/x86_64/sat-capsule/6.4/' 'iso/' ) @@ -540,8 +563,8 @@ def test_positive_on_demand_sync( the original package from the upstream repo """ repo_url = settings.repos.yum_3.url - packages_count = constants.FAKE_3_YUM_REPOS_COUNT - package = constants.FAKE_3_YUM_REPO_RPMS[0] + packages_count = FAKE_3_YUM_REPOS_COUNT + package = FAKE_3_YUM_REPO_RPMS[0] repo = target_sat.api.Repository( download_policy='on_demand', mirroring_policy='mirror_complete', @@ -573,13 +596,13 @@ def test_positive_on_demand_sync( cvv = cv.version[-1].read() # Promote content view to lifecycle environment + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Verify packages on Capsule match the source caps_repo_url = module_capsule_configured.get_published_repo_url( org=function_org.label, @@ -624,7 +647,7 @@ def test_positive_update_with_immediate_sync( filesystem contains valid links to packages """ repo_url = settings.repos.yum_1.url - packages_count = constants.FAKE_1_YUM_REPOS_COUNT + packages_count = FAKE_1_YUM_REPOS_COUNT repo = target_sat.api.Repository( download_policy='on_demand', mirroring_policy='mirror_complete', @@ -655,13 +678,13 @@ def test_positive_update_with_immediate_sync( cvv = cv.version[-1].read() # Promote content view to lifecycle environment + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Update download policy to 'immediate' repo.download_policy = 'immediate' repo = repo.update(['download_policy']) @@ -683,13 +706,13 @@ def test_positive_update_with_immediate_sync( cv.version.sort(key=lambda version: version.id) cvv = cv.version[-1].read() # Promote content view to lifecycle environment + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Verify the count of RPMs published on Capsule caps_repo_url = module_capsule_configured.get_published_repo_url( org=function_org.label, @@ -730,7 +753,7 @@ def test_positive_capsule_pub_url_accessible(self, module_capsule_configured): @pytest.mark.skip_if_not_set('capsule', 'clients') @pytest.mark.parametrize('distro', ['rhel7', 'rhel8_bos', 'rhel9_bos']) def test_positive_sync_kickstart_repo( - self, target_sat, module_capsule_configured, function_entitlement_manifest_org, distro + self, target_sat, module_capsule_configured, function_sca_manifest_org, distro ): """Sync kickstart repository to the capsule. @@ -751,16 +774,14 @@ def test_positive_sync_kickstart_repo( """ repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=function_entitlement_manifest_org.id, - product=constants.REPOS['kickstart'][distro]['product'], - reposet=constants.REPOS['kickstart'][distro]['reposet'], - repo=constants.REPOS['kickstart'][distro]['name'], - releasever=constants.REPOS['kickstart'][distro]['version'], + org_id=function_sca_manifest_org.id, + product=REPOS['kickstart'][distro]['product'], + reposet=REPOS['kickstart'][distro]['reposet'], + repo=REPOS['kickstart'][distro]['name'], + releasever=REPOS['kickstart'][distro]['version'], ) repo = target_sat.api.Repository(id=repo_id).read() - lce = target_sat.api.LifecycleEnvironment( - organization=function_entitlement_manifest_org - ).create() + lce = target_sat.api.LifecycleEnvironment(organization=function_sca_manifest_org).create() # Associate the lifecycle environment with the capsule module_capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': lce.id} @@ -775,7 +796,7 @@ def test_positive_sync_kickstart_repo( # Create a content view with the repository cv = target_sat.api.ContentView( - organization=function_entitlement_manifest_org, repository=[repo] + organization=function_sca_manifest_org, repository=[repo] ).create() # Sync repository repo.sync(timeout='10m') @@ -788,26 +809,26 @@ def test_positive_sync_kickstart_repo( cvv = cv.version[-1].read() # Promote content view to lifecycle environment + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': lce.id}) - cvv = cvv.read() + module_capsule_configured.wait_for_sync(start_time=timestamp) + cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Check for kickstart content on SAT and CAPS tail = ( - f'rhel/server/7/{constants.REPOS["kickstart"][distro]["version"]}/x86_64/kickstart' + f'rhel/server/7/{REPOS["kickstart"][distro]["version"]}/x86_64/kickstart' if distro == 'rhel7' - else f'{distro.split("_")[0]}/{constants.REPOS["kickstart"][distro]["version"]}/x86_64/baseos/kickstart' # noqa:E501 + else f'{distro.split("_")[0]}/{REPOS["kickstart"][distro]["version"]}/x86_64/baseos/kickstart' # noqa:E501 ) url_base = ( - f'pulp/content/{function_entitlement_manifest_org.label}/{lce.label}/{cv.label}/' + f'pulp/content/{function_sca_manifest_org.label}/{lce.label}/{cv.label}/' f'content/dist/{tail}' ) # Check kickstart specific files - for file in constants.KICKSTART_CONTENT: + for file in KICKSTART_CONTENT: sat_file = target_sat.md5_by_url(f'{target_sat.url}/{url_base}/{file}') caps_file = target_sat.md5_by_url(f'{module_capsule_configured.url}/{url_base}/{file}') assert sat_file == caps_file @@ -887,12 +908,13 @@ def test_positive_sync_container_repo_end_to_end( # Promote the latest CV version into capsule's LCE cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Pull the images from capsule to the content host repo_paths = [ ( @@ -902,7 +924,7 @@ def test_positive_sync_container_repo_end_to_end( for repo in repos ] - for con_client in constants.CONTAINER_CLIENTS: + for con_client in CONTAINER_CLIENTS: result = container_contenthost.execute( f'{con_client} login -u {settings.server.admin_username}' f' -p {settings.server.admin_password} {module_capsule_configured.hostname}' @@ -1005,10 +1027,12 @@ def test_positive_sync_collection_repo( assert function_lce_library.id in [capsule_lce['id'] for capsule_lce in result['results']] # Sync the repo + timestamp = datetime.utcnow() repo.sync(timeout=600) repo = repo.read() assert repo.content_counts['ansible_collection'] == 2 - module_capsule_configured.wait_for_sync() + + module_capsule_configured.wait_for_sync(start_time=timestamp) repo_path = repo.full_path.replace(target_sat.hostname, module_capsule_configured.hostname) coll_path = './collections' @@ -1063,7 +1087,7 @@ def test_positive_sync_file_repo( repo = target_sat.api.Repository( content_type='file', product=function_product, - url=constants.FAKE_FILE_LARGE_URL, + url=FAKE_FILE_LARGE_URL, ).create() repo.sync() @@ -1087,12 +1111,13 @@ def test_positive_sync_file_repo( # Promote the latest CV version into capsule's LCE cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - # Run one more sync, check for status (BZ#1985122) sync_status = module_capsule_configured.nailgun_capsule.content_sync() assert sync_status['result'] == 'success' @@ -1114,8 +1139,8 @@ def test_positive_sync_file_repo( ) sat_files = get_repo_files_by_url(sat_repo_url, extension='iso') caps_files = get_repo_files_by_url(caps_repo_url, extension='iso') - assert len(sat_files) == len(caps_files) == constants.FAKE_FILE_LARGE_COUNT + 1 - assert constants.FAKE_FILE_NEW_NAME in caps_files + assert len(sat_files) == len(caps_files) == FAKE_FILE_LARGE_COUNT + 1 + assert FAKE_FILE_NEW_NAME in caps_files assert sat_files == caps_files for file in sat_files: @@ -1126,7 +1151,7 @@ def test_positive_sync_file_repo( @pytest.mark.tier4 @pytest.mark.skip_if_not_set('capsule') def test_positive_sync_CV_to_multiple_LCEs( - self, target_sat, module_capsule_configured, module_manifest_org + self, target_sat, module_capsule_configured, module_sca_manifest_org ): """Synchronize a CV to multiple LCEs at the same time. All sync tasks should succeed. @@ -1151,19 +1176,19 @@ def test_positive_sync_CV_to_multiple_LCEs( # Sync a repository to the Satellite. repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=module_manifest_org.id, - product=constants.PRDS['rhel'], - repo=constants.REPOS['rhel7_extra']['name'], - reposet=constants.REPOSET['rhel7_extra'], + org_id=module_sca_manifest_org.id, + product=PRDS['rhel'], + repo=REPOS['rhel7_extra']['name'], + reposet=REPOSET['rhel7_extra'], releasever=None, ) repo = target_sat.api.Repository(id=repo_id).read() repo.sync() # Create two LCEs, assign them to the Capsule. - lce1 = target_sat.api.LifecycleEnvironment(organization=module_manifest_org).create() + lce1 = target_sat.api.LifecycleEnvironment(organization=module_sca_manifest_org).create() lce2 = target_sat.api.LifecycleEnvironment( - organization=module_manifest_org, prior=lce1 + organization=module_sca_manifest_org, prior=lce1 ).create() module_capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': [lce1.id, lce2.id]} @@ -1175,7 +1200,7 @@ def test_positive_sync_CV_to_multiple_LCEs( # Create a Content View, add the repository and publish it. cv = target_sat.api.ContentView( - organization=module_manifest_org, repository=[repo] + organization=module_sca_manifest_org, repository=[repo] ).create() cv.publish() cv = cv.read() @@ -1183,16 +1208,20 @@ def test_positive_sync_CV_to_multiple_LCEs( # Promote the CV to both Capsule's LCEs without waiting for Capsule sync task completion. cvv = cv.version[-1].read() + assert len(cvv.environment) == 1 + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': lce1.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 2 + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': lce2.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 3 - # Check all sync tasks finished without errors. - module_capsule_configured.wait_for_sync() - @pytest.mark.tier4 @pytest.mark.skip_if_not_set('capsule') def test_positive_capsule_sync_status_persists( @@ -1235,7 +1264,8 @@ def test_positive_capsule_sync_status_persists( cvv = cv.version[-1].read() timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) - module_capsule_configured.wait_for_sync() + + module_capsule_configured.wait_for_sync(start_time=timestamp) # Delete all capsule sync tasks so that we fall back for audits. task_result = target_sat.execute( @@ -1265,7 +1295,7 @@ def test_positive_remove_capsule_orphans( target_sat, pytestconfig, capsule_configured, - function_entitlement_manifest_org, + function_sca_manifest_org, function_lce_library, ): """Synchronize RPM content to the capsule, disassociate the capsule form the content @@ -1298,10 +1328,10 @@ def test_positive_remove_capsule_orphans( # Enable RHST repo and sync it to the Library LCE. repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=function_entitlement_manifest_org.id, - product=constants.REPOS['rhst8']['product'], - repo=constants.REPOS['rhst8']['name'], - reposet=constants.REPOSET['rhst8'], + org_id=function_sca_manifest_org.id, + product=REPOS['rhst8']['product'], + repo=REPOS['rhst8']['name'], + reposet=REPOSET['rhst8'], ) repo = target_sat.api.Repository(id=repo_id).read() repo.sync() @@ -1334,13 +1364,20 @@ def test_positive_remove_capsule_orphans( sync_status = capsule_configured.nailgun_capsule.content_sync() assert sync_status['result'] == 'success', 'Capsule sync task failed.' + # datetime string (local time) to search for proper task. + timestamp = (datetime.now().replace(microsecond=0) - timedelta(seconds=1)).strftime( + '%B %d, %Y at %I:%M:%S %p' + ) # Run orphan cleanup for the capsule. target_sat.execute( 'foreman-rake katello:delete_orphaned_content RAILS_ENV=production ' f'SMART_PROXY_ID={capsule_configured.nailgun_capsule.id}' ) target_sat.wait_for_tasks( - search_query=('label = Actions::Katello::OrphanCleanup::RemoveOrphans'), + search_query=( + 'label = Actions::Katello::OrphanCleanup::RemoveOrphans' + f' and started_at >= "{timestamp}"' + ), search_rate=5, max_tries=10, ) @@ -1391,7 +1428,7 @@ def test_positive_capsule_sync_openstack_container_repos( content_type='docker', docker_upstream_name=ups_name, product=function_product, - url=constants.RH_CONTAINER_REGISTRY_HUB, + url=RH_CONTAINER_REGISTRY_HUB, upstream_username=settings.subscription.rhn_username, upstream_password=settings.subscription.rhn_password, ).create() @@ -1414,12 +1451,13 @@ def test_positive_capsule_sync_openstack_container_repos( # Promote the latest CV version into capsule's LCE cvv = cv.version[-1].read() + timestamp = datetime.utcnow() cvv.promote(data={'environment_ids': function_lce.id}) + + module_capsule_configured.wait_for_sync(start_time=timestamp) cvv = cvv.read() assert len(cvv.environment) == 2 - module_capsule_configured.wait_for_sync() - @pytest.mark.parametrize( 'repos_collection', [ From 0397a0d1db879dccd84a099e7ee0765df53dda61 Mon Sep 17 00:00:00 2001 From: dosas Date: Fri, 15 Mar 2024 08:35:48 +0100 Subject: [PATCH 035/150] Add posibility to filter tests that require manifester (#14270) --- pytest_plugins/markers.py | 1 + tests/foreman/conftest.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/pytest_plugins/markers.py b/pytest_plugins/markers.py index abf54997bd8..b7e0f8f6346 100644 --- a/pytest_plugins/markers.py +++ b/pytest_plugins/markers.py @@ -24,6 +24,7 @@ def pytest_configure(config): "no_containers: Disable container hosts from being used in favor of VMs", "include_capsule: For satellite-maintain tests to run on Satellite and Capsule both", "capsule_only: For satellite-maintain tests to run only on Capsules", + "manifester: Tests that require manifester", ] markers.extend(module_markers()) for marker in markers: diff --git a/tests/foreman/conftest.py b/tests/foreman/conftest.py index e867e118be3..339eb6016f9 100644 --- a/tests/foreman/conftest.py +++ b/tests/foreman/conftest.py @@ -30,6 +30,8 @@ def pytest_collection_modifyitems(session, items, config): deselected_items = [] for item in items: + if any("manifest" in f for f in getattr(item, "fixturenames", ())): + item.add_marker("manifester") # 1. Deselect tests marked with @pytest.mark.deselect # WONTFIX BZs makes test to be dynamically marked as deselect. deselect = item.get_closest_marker('deselect') From 84e54f220f57fadc44d47a69347eb8e9f42b3d92 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Fri, 15 Mar 2024 14:44:09 +0100 Subject: [PATCH 036/150] addFinalizer in test body (#14036) * reordered addFinalizer in test body * Update tests/foreman/cli/test_errata.py Co-authored-by: Gaurav Talreja * Update tests/foreman/api/test_discoveryrule.py Co-authored-by: Gaurav Talreja * Update tests/foreman/cli/test_errata.py Co-authored-by: Gaurav Talreja * Update tests/foreman/destructive/test_capsule_loadbalancer.py Co-authored-by: Gaurav Talreja --------- Co-authored-by: Gaurav Talreja --- .../api/test_computeresource_libvirt.py | 13 +-- tests/foreman/api/test_discoveryrule.py | 13 +-- tests/foreman/api/test_http_proxy.py | 5 + tests/foreman/api/test_parameters.py | 9 +- tests/foreman/cli/test_classparameters.py | 2 +- tests/foreman/cli/test_computeresource_osp.py | 2 +- tests/foreman/cli/test_discoveredhost.py | 8 +- tests/foreman/cli/test_errata.py | 27 ++---- tests/foreman/cli/test_hammer.py | 13 +-- tests/foreman/cli/test_satellitesync.py | 2 +- tests/foreman/cli/test_subnet.py | 4 +- .../destructive/test_capsule_loadbalancer.py | 8 +- tests/foreman/maintain/test_advanced.py | 63 +++++++------ tests/foreman/maintain/test_health.py | 91 ++++++++++--------- .../foreman/maintain/test_maintenance_mode.py | 9 +- tests/foreman/maintain/test_packages.py | 28 +++--- tests/foreman/ui/test_ansible.py | 13 +-- tests/foreman/ui/test_computeresource_gce.py | 31 ++++--- .../ui/test_computeresource_libvirt.py | 4 +- tests/upgrades/test_contentview.py | 2 +- tests/upgrades/test_host.py | 2 +- tests/upgrades/test_provisioningtemplate.py | 2 +- tests/upgrades/test_subscription.py | 2 +- tests/upgrades/test_usergroup.py | 4 +- 24 files changed, 176 insertions(+), 181 deletions(-) diff --git a/tests/foreman/api/test_computeresource_libvirt.py b/tests/foreman/api/test_computeresource_libvirt.py index 5189af9d445..ad95fb9f202 100644 --- a/tests/foreman/api/test_computeresource_libvirt.py +++ b/tests/foreman/api/test_computeresource_libvirt.py @@ -113,9 +113,9 @@ def test_positive_create_with_name_description( location=[module_location], url=LIBVIRT_URL, ).create() + request.addfinalizer(compresource.delete) assert compresource.name == name assert compresource.description == name - request.addfinalizer(compresource.delete) @pytest.mark.tier2 @@ -134,9 +134,9 @@ def test_positive_create_with_orgs_and_locs(request, module_target_sat): compresource = module_target_sat.api.LibvirtComputeResource( location=locs, organization=orgs, url=LIBVIRT_URL ).create() + request.addfinalizer(compresource.delete) assert {org.name for org in orgs} == {org.read().name for org in compresource.organization} assert {loc.name for loc in locs} == {loc.read().name for loc in compresource.location} - request.addfinalizer(compresource.delete) @pytest.mark.tier2 @@ -175,8 +175,8 @@ def test_negative_create_with_same_name(request, module_target_sat, module_org, cr = module_target_sat.api.LibvirtComputeResource( location=[module_location], name=name, organization=[module_org], url=LIBVIRT_URL ).create() - assert cr.name == name request.addfinalizer(cr.delete) + assert cr.name == name with pytest.raises(HTTPError): module_target_sat.api.LibvirtComputeResource( name=name, @@ -245,19 +245,16 @@ def test_negative_update_same_name(request, module_target_sat, module_org, modul compresource = module_target_sat.api.LibvirtComputeResource( location=[module_location], name=name, organization=[module_org], url=LIBVIRT_URL ).create() + request.addfinalizer(compresource.delete) new_compresource = module_target_sat.api.LibvirtComputeResource( location=[module_location], organization=[module_org], url=LIBVIRT_URL ).create() + request.addfinalizer(new_compresource.delete) new_compresource.name = name with pytest.raises(HTTPError): new_compresource.update(['name']) assert new_compresource.read().name != name - @request.addfinalizer - def _finalize(): - compresource.delete() - new_compresource.delete() - @pytest.mark.tier2 @pytest.mark.parametrize('url', **parametrized({'random': gen_string('alpha'), 'empty': ''})) diff --git a/tests/foreman/api/test_discoveryrule.py b/tests/foreman/api/test_discoveryrule.py index f5dffd5be14..3d1c1f4bf48 100644 --- a/tests/foreman/api/test_discoveryrule.py +++ b/tests/foreman/api/test_discoveryrule.py @@ -171,8 +171,11 @@ def test_positive_multi_provision_with_rule_limit( :CaseImportance: High """ + discovered_host1 = module_target_sat.api_factory.create_discovered_host() + request.addfinalizer(module_target_sat.api.Host(id=discovered_host1['id']).delete) discovered_host2 = module_target_sat.api_factory.create_discovered_host() + request.addfinalizer(module_target_sat.api.DiscoveredHost(id=discovered_host2['id']).delete) rule = module_target_sat.api.DiscoveryRule( max_count=1, hostgroup=module_discovery_hostgroup, @@ -181,14 +184,6 @@ def test_positive_multi_provision_with_rule_limit( organization=[discovery_org], priority=1000, ).create() + request.addfinalizer(rule.delete) result = module_target_sat.api.DiscoveredHost().auto_provision_all() assert '1 discovered hosts were provisioned' in result['message'] - - # Delete discovery rule - @request.addfinalizer - def _finalize(): - rule.delete() - module_target_sat.api.Host(id=discovered_host1['id']).delete() - module_target_sat.api.DiscoveredHost(id=discovered_host2['id']).delete() - with pytest.raises(HTTPError): - rule.read() diff --git a/tests/foreman/api/test_http_proxy.py b/tests/foreman/api/test_http_proxy.py index 50012a0ab70..1bd00051e67 100644 --- a/tests/foreman/api/test_http_proxy.py +++ b/tests/foreman/api/test_http_proxy.py @@ -303,6 +303,11 @@ def test_positive_sync_proxy_with_certificate(request, target_sat, module_org, m :customerscenario: true """ + + @request.addfinalizer + def _finalize(): + target_sat.custom_certs_cleanup() + # Cleanup any existing certs that may conflict target_sat.custom_certs_cleanup() proxy_host = settings.http_proxy.auth_proxy_url.replace('http://', '').replace(':3128', '') diff --git a/tests/foreman/api/test_parameters.py b/tests/foreman/api/test_parameters.py index 1e415d15dc8..5d70374a546 100644 --- a/tests/foreman/api/test_parameters.py +++ b/tests/foreman/api/test_parameters.py @@ -39,7 +39,9 @@ def test_positive_parameter_precedence_impact( param_value = gen_string('alpha') cp = module_target_sat.api.CommonParameter(name=param_name, value=param_value).create() + request.addfinalizer(cp.delete) host = module_target_sat.api.Host(organization=module_org, location=module_location).create() + request.addfinalizer(host.delete) result = [res for res in host.all_parameters if res['name'] == param_name] assert result[0]['name'] == param_name assert result[0]['associated_type'] == 'global' @@ -48,6 +50,7 @@ def test_positive_parameter_precedence_impact( organization=[module_org], group_parameters_attributes=[{'name': param_name, 'value': param_value}], ).create() + request.addfinalizer(hg.delete) host.hostgroup = hg host = host.update(['hostgroup']) result = [res for res in host.all_parameters if res['name'] == param_name] @@ -55,12 +58,6 @@ def test_positive_parameter_precedence_impact( assert result[0]['associated_type'] != 'global' assert result[0]['associated_type'] == 'host group' - @request.addfinalizer - def _finalize(): - host.delete() - hg.delete() - cp.delete() - host.host_parameters_attributes = [{'name': param_name, 'value': param_value}] host = host.update(['host_parameters_attributes']) result = [res for res in host.all_parameters if res['name'] == param_name] diff --git a/tests/foreman/cli/test_classparameters.py b/tests/foreman/cli/test_classparameters.py index a4e75c1f76d..022ceed0aac 100644 --- a/tests/foreman/cli/test_classparameters.py +++ b/tests/foreman/cli/test_classparameters.py @@ -86,8 +86,8 @@ def test_positive_list( location=module_puppet_loc.id, environment=module_puppet['env'].name, ).create() - host.add_puppetclass(data={'puppetclass_id': module_puppet['class']['id']}) request.addfinalizer(host.delete) + host.add_puppetclass(data={'puppetclass_id': module_puppet['class']['id']}) hostgroup = session_puppet_enabled_sat.cli_factory.hostgroup( { 'puppet-environment-id': module_puppet['env'].id, diff --git a/tests/foreman/cli/test_computeresource_osp.py b/tests/foreman/cli/test_computeresource_osp.py index d88daaf1ad8..ff6779056ae 100644 --- a/tests/foreman/cli/test_computeresource_osp.py +++ b/tests/foreman/cli/test_computeresource_osp.py @@ -76,6 +76,7 @@ def test_crud_and_duplicate_name(self, request, id_type, osp_version, target_sat 'url': osp_version, } ) + request.addfinalizer(lambda: self.cr_cleanup(compute_resource['id'], id_type, target_sat)) assert compute_resource['name'] == name assert target_sat.cli.ComputeResource.exists(search=(id_type, compute_resource[id_type])) @@ -102,7 +103,6 @@ def test_crud_and_duplicate_name(self, request, id_type, osp_version, target_sat else: compute_resource = target_sat.cli.ComputeResource.info({'id': compute_resource['id']}) assert new_name == compute_resource['name'] - request.addfinalizer(lambda: self.cr_cleanup(compute_resource['id'], id_type, target_sat)) @pytest.mark.tier3 def test_negative_create_osp_with_url(self, target_sat): diff --git a/tests/foreman/cli/test_discoveredhost.py b/tests/foreman/cli/test_discoveredhost.py index 2cd1297224e..e578f35e1ac 100644 --- a/tests/foreman/cli/test_discoveredhost.py +++ b/tests/foreman/cli/test_discoveredhost.py @@ -70,10 +70,8 @@ def test_rhel_pxe_discovery_provisioning( assert 'Host created' in result[0]['message'] host = sat.api.Host().search(query={"search": f'id={discovered_host.id}'})[0] - assert host - - # teardown request.addfinalizer(lambda: sat.provisioning_cleanup(host.name)) + assert host wait_for( lambda: host.read().build_status_label != 'Pending installation', @@ -131,10 +129,8 @@ def test_rhel_pxeless_discovery_provisioning( ) assert 'Host created' in result[0]['message'] host = sat.api.Host().search(query={"search": f'id={discovered_host.id}'})[0] - assert host - - # teardown request.addfinalizer(lambda: sat.provisioning_cleanup(host.name)) + assert host wait_for( lambda: host.read().build_status_label != 'Pending installation', diff --git a/tests/foreman/cli/test_errata.py b/tests/foreman/cli/test_errata.py index 95bdbc3d256..4af3d9be2d3 100644 --- a/tests/foreman/cli/test_errata.py +++ b/tests/foreman/cli/test_errata.py @@ -688,16 +688,11 @@ def test_positive_list_affected_chosts_by_erratum_restrict_flag( 'inclusion': 'false', } ) - - @request.addfinalizer - def cleanup(): - cv_filter_cleanup( - target_sat, - cv_filter['filter-id'], - module_cv, - module_sca_manifest_org, - module_lce, + request.addfinalizer( + lambda: cv_filter_cleanup( + target_sat, cv_filter['filter-id'], module_cv, module_sca_manifest_org, module_lce ) + ) # Make rule to hide the RPM that creates the need for the installable erratum target_sat.cli_factory.content_view_filter_rule( @@ -861,17 +856,11 @@ def test_host_errata_search_commands( 'inclusion': 'false', } ) - - @request.addfinalizer - def cleanup(): - cv_filter_cleanup( - target_sat, - cv_filter['filter-id'], - module_cv, - module_sca_manifest_org, - module_lce, + request.addfinalizer( + lambda: cv_filter_cleanup( + target_sat, cv_filter['filter-id'], module_cv, module_sca_manifest_org, module_lce ) - + ) # Make rule to exclude the specified bugfix package target_sat.cli_factory.content_view_filter_rule( { diff --git a/tests/foreman/cli/test_hammer.py b/tests/foreman/cli/test_hammer.py index c795352c5ed..aa3bfcf4aeb 100644 --- a/tests/foreman/cli/test_hammer.py +++ b/tests/foreman/cli/test_hammer.py @@ -136,6 +136,13 @@ def test_positive_disable_hammer_defaults(request, function_product, target_sat) :BZ: 1640644, 1368173 """ + + @request.addfinalizer + def _finalize(): + target_sat.cli.Defaults.delete({'param-name': 'organization_id'}) + result = target_sat.execute('hammer defaults list') + assert str(function_product.organization.id) not in result.stdout + target_sat.cli.Defaults.add( {'param-name': 'organization_id', 'param-value': function_product.organization.id} ) @@ -154,12 +161,6 @@ def test_positive_disable_hammer_defaults(request, function_product, target_sat) assert result.status == 0 assert function_product.name in result.stdout - @request.addfinalizer - def _finalize(): - target_sat.cli.Defaults.delete({'param-name': 'organization_id'}) - result = target_sat.execute('hammer defaults list') - assert str(function_product.organization.id) not in result.stdout - @pytest.mark.upgrade def test_positive_check_debug_log_levels(target_sat): diff --git a/tests/foreman/cli/test_satellitesync.py b/tests/foreman/cli/test_satellitesync.py index 1f177a2b053..90dcb18c6d4 100644 --- a/tests/foreman/cli/test_satellitesync.py +++ b/tests/foreman/cli/test_satellitesync.py @@ -2272,6 +2272,7 @@ def test_positive_custom_cdn_with_credential( meta_file = 'metadata.json' crt_file = 'source.crt' pub_dir = '/var/www/html/pub/repos' + request.addfinalizer(lambda: target_sat.execute(f'rm -rf {pub_dir}')) # Export the repository in syncable format and move it # to /var/www/html/pub/repos to mimic custom CDN. @@ -2288,7 +2289,6 @@ def test_positive_custom_cdn_with_credential( exp_dir = exp_dir[0].replace(meta_file, '') assert target_sat.execute(f'mv {exp_dir} {pub_dir}').status == 0 - request.addfinalizer(lambda: target_sat.execute(f'rm -rf {pub_dir}')) target_sat.execute(f'semanage fcontext -a -t httpd_sys_content_t "{pub_dir}(/.*)?"') target_sat.execute(f'restorecon -R {pub_dir}') diff --git a/tests/foreman/cli/test_subnet.py b/tests/foreman/cli/test_subnet.py index 12272ed57c2..74a6e1727fc 100644 --- a/tests/foreman/cli/test_subnet.py +++ b/tests/foreman/cli/test_subnet.py @@ -199,8 +199,8 @@ def test_negative_update_attributes(request, options, module_target_sat): :CaseImportance: Medium """ subnet = module_target_sat.cli_factory.make_subnet() - options['id'] = subnet['id'] request.addfinalizer(lambda: module_target_sat.cli.Subnet.delete({'id': subnet['id']})) + options['id'] = subnet['id'] with pytest.raises(CLIReturnCodeError, match='Could not update the subnet:'): module_target_sat.cli.Subnet.update(options) # check - subnet is not updated @@ -223,8 +223,8 @@ def test_negative_update_address_pool(request, options, module_target_sat): :CaseImportance: Medium """ subnet = module_target_sat.cli_factory.make_subnet() - opts = {'id': subnet['id']} request.addfinalizer(lambda: module_target_sat.cli.Subnet.delete({'id': subnet['id']})) + opts = {'id': subnet['id']} # generate pool range from network address for key, val in options.items(): opts[key] = re.sub(r'\d+$', str(val), subnet['network-addr']) diff --git a/tests/foreman/destructive/test_capsule_loadbalancer.py b/tests/foreman/destructive/test_capsule_loadbalancer.py index 67bc0762c11..3949d2bf71a 100644 --- a/tests/foreman/destructive/test_capsule_loadbalancer.py +++ b/tests/foreman/destructive/test_capsule_loadbalancer.py @@ -191,6 +191,7 @@ def test_loadbalancer_install_package( registration. """ + # Register content host result = rhel7_contenthost.register( org=module_org, @@ -219,6 +220,9 @@ def test_loadbalancer_install_package( if loadbalancer_setup['setup_capsules']['capsule_1'].hostname in result.stdout else loadbalancer_setup['setup_capsules']['capsule_2'] ) + request.addfinalizer( + lambda: registered_to_capsule.power_control(state=VmState.RUNNING, ensure=True) + ) # Remove the packages from the client result = rhel7_contenthost.execute('yum remove -y tree') @@ -231,10 +235,6 @@ def test_loadbalancer_install_package( result = rhel7_contenthost.execute('yum install -y tree') assert result.status == 0 - @request.addfinalizer - def _finalize(): - registered_to_capsule.power_control(state=VmState.RUNNING, ensure=True) - @pytest.mark.rhel_ver_match('[^6]') @pytest.mark.tier1 diff --git a/tests/foreman/maintain/test_advanced.py b/tests/foreman/maintain/test_advanced.py index 6a66c9aefcf..68b00e5c071 100644 --- a/tests/foreman/maintain/test_advanced.py +++ b/tests/foreman/maintain/test_advanced.py @@ -75,6 +75,22 @@ def test_positive_advanced_run_hammer_setup(request, sat_maintain): :BZ: 1830355 """ + + @request.addfinalizer + def _finalize(): + result = sat_maintain.execute( + f'hammer -u admin -p admin user update --login admin --password {default_admin_pass}' + ) + assert result.status == 0 + # Make default admin creds available in MAINTAIN_HAMMER_YML + assert sat_maintain.cli.Advanced.run_hammer_setup().status == 0 + # Make sure default password available in MAINTAIN_HAMMER_YML + result = sat_maintain.execute( + f"grep -i ':password: {default_admin_pass}' {MAINTAIN_HAMMER_YML}" + ) + assert result.status == 0 + assert default_admin_pass in result.stdout + default_admin_pass = settings.server.admin_password result = sat_maintain.execute( f'hammer -u admin -p {default_admin_pass} user update --login admin --password admin' @@ -100,21 +116,6 @@ def test_positive_advanced_run_hammer_setup(request, sat_maintain): assert result.status == 0 assert 'admin' in result.stdout - @request.addfinalizer - def _finalize(): - result = sat_maintain.execute( - f'hammer -u admin -p admin user update --login admin --password {default_admin_pass}' - ) - assert result.status == 0 - # Make default admin creds available in MAINTAIN_HAMMER_YML - assert sat_maintain.cli.Advanced.run_hammer_setup().status == 0 - # Make sure default password available in MAINTAIN_HAMMER_YML - result = sat_maintain.execute( - f"grep -i ':password: {default_admin_pass}' {MAINTAIN_HAMMER_YML}" - ) - assert result.status == 0 - assert default_admin_pass in result.stdout - @pytest.mark.e2e @pytest.mark.upgrade @@ -131,6 +132,12 @@ def test_positive_advanced_run_packages(request, sat_maintain): :expectedresults: packages should install/downgrade/check-update/update. """ + + @request.addfinalizer + def _finalize(): + assert sat_maintain.execute('dnf remove -y walrus').status == 0 + sat_maintain.execute('rm -rf /etc/yum.repos.d/custom_repo.repo') + # Setup custom_repo and install walrus package sat_maintain.create_custom_repos(custom_repo=settings.repos.yum_0.url) result = sat_maintain.cli.Advanced.run_packages_install( @@ -160,11 +167,6 @@ def test_positive_advanced_run_packages(request, sat_maintain): assert result.status == 0 assert 'walrus-5.21-1' in result.stdout - @request.addfinalizer - def _finalize(): - assert sat_maintain.execute('dnf remove -y walrus').status == 0 - sat_maintain.execute('rm -rf /etc/yum.repos.d/custom_repo.repo') - @pytest.mark.parametrize( 'tasks_state', @@ -250,6 +252,7 @@ def test_positive_sync_plan_with_hammer_defaults(request, sat_maintain, module_o :customerscenario: true """ + sat_maintain.cli.Defaults.add({'param-name': 'organization_id', 'param-value': module_org.id}) sync_plans = [] @@ -258,16 +261,6 @@ def test_positive_sync_plan_with_hammer_defaults(request, sat_maintain, module_o sat_maintain.api.SyncPlan(enabled=True, name=name, organization=module_org).create() ) - result = sat_maintain.cli.Advanced.run_sync_plans_disable() - assert 'FAIL' not in result.stdout - assert result.status == 0 - - sync_plans[0].delete() - - result = sat_maintain.cli.Advanced.run_sync_plans_enable() - assert 'FAIL' not in result.stdout - assert result.status == 0 - @request.addfinalizer def _finalize(): sat_maintain.cli.Defaults.delete({'param-name': 'organization_id'}) @@ -278,6 +271,16 @@ def _finalize(): if sync_plan: sync_plans[0].delete() + result = sat_maintain.cli.Advanced.run_sync_plans_disable() + assert 'FAIL' not in result.stdout + assert result.status == 0 + + sync_plans[0].delete() + + result = sat_maintain.cli.Advanced.run_sync_plans_enable() + assert 'FAIL' not in result.stdout + assert result.status == 0 + @pytest.mark.e2e def test_positive_satellite_repositories_setup(sat_maintain): diff --git a/tests/foreman/maintain/test_health.py b/tests/foreman/maintain/test_health.py index 9da62960142..9ba117f72cf 100644 --- a/tests/foreman/maintain/test_health.py +++ b/tests/foreman/maintain/test_health.py @@ -201,6 +201,13 @@ def test_negative_health_check_upstream_repository(sat_maintain, request): :expectedresults: check-upstream-repository health check should fail. """ + + @request.addfinalizer + def _finalize(): + for name in upstream_url: + sat_maintain.execute(f'rm -fr /etc/yum.repos.d/{name}.repo') + sat_maintain.execute('dnf clean all') + for name, url in upstream_url.items(): sat_maintain.create_custom_repos(**{name: url}) result = sat_maintain.cli.Health.check( @@ -216,12 +223,6 @@ def test_negative_health_check_upstream_repository(sat_maintain, request): elif name in ['foreman_repo', 'puppet_repo']: assert 'enabled=0' in result.stdout - @request.addfinalizer - def _finalize(): - for name in upstream_url: - sat_maintain.execute(f'rm -fr /etc/yum.repos.d/{name}.repo') - sat_maintain.execute('dnf clean all') - def test_positive_health_check_available_space(sat_maintain): """Verify available-space check @@ -260,15 +261,16 @@ def test_positive_hammer_defaults_set(sat_maintain, request): :customerscenario: true """ - sat_maintain.cli.Defaults.add({'param-name': 'organization_id', 'param-value': 1}) - result = sat_maintain.cli.Health.check(options={'assumeyes': True}) - assert result.status == 0 - assert 'FAIL' not in result.stdout @request.addfinalizer def _finalize(): sat_maintain.cli.Defaults.delete({'param-name': 'organization_id'}) + sat_maintain.cli.Defaults.add({'param-name': 'organization_id', 'param-value': 1}) + result = sat_maintain.cli.Health.check(options={'assumeyes': True}) + assert result.status == 0 + assert 'FAIL' not in result.stdout + @pytest.mark.include_capsule def test_positive_health_check_hotfix_installed(sat_maintain, request): @@ -288,6 +290,13 @@ def test_positive_health_check_hotfix_installed(sat_maintain, request): :expectedresults: check-hotfix-installed check should detect modified file and installed hotfix. """ + + @request.addfinalizer + def _finalize(): + sat_maintain.execute('rm -fr /etc/yum.repos.d/custom_repo.repo') + sat_maintain.execute('dnf remove -y hotfix-package') + assert sat_maintain.execute(f'sed -i "/#modifying_file/d" {fpath.stdout}').status == 0 + # Verify check-hotfix-installed without hotfix package. result = sat_maintain.cli.Health.check(options={'label': 'check-hotfix-installed'}) assert result.status == 0 @@ -307,12 +316,6 @@ def test_positive_health_check_hotfix_installed(sat_maintain, request): assert 'WARNING' in result.stdout assert 'hotfix-package' in result.stdout - @request.addfinalizer - def _finalize(): - sat_maintain.execute('rm -fr /etc/yum.repos.d/custom_repo.repo') - sat_maintain.execute('dnf remove -y hotfix-package') - assert sat_maintain.execute(f'sed -i "/#modifying_file/d" {fpath.stdout}').status == 0 - @pytest.mark.include_capsule def test_positive_health_check_validate_dnf_config(sat_maintain): @@ -365,6 +368,11 @@ def test_negative_health_check_epel_repository(request, sat_maintain): :expectedresults: check-non-redhat-repository health check should fail. """ + + @request.addfinalizer + def _finalize(): + assert sat_maintain.execute('dnf remove -y epel-release').status == 0 + epel_repo = 'https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm' sat_maintain.execute(f'dnf install -y {epel_repo}') result = sat_maintain.cli.Health.check(options={'label': 'check-non-redhat-repository'}) @@ -372,10 +380,6 @@ def test_negative_health_check_epel_repository(request, sat_maintain): assert result.status == 1 assert 'FAIL' in result.stdout - @request.addfinalizer - def _finalize(): - assert sat_maintain.execute('dnf remove -y epel-release').status == 0 - def test_positive_health_check_old_foreman_tasks(sat_maintain): """Verify check-old-foreman-tasks. @@ -471,6 +475,14 @@ def test_positive_health_check_tftp_storage(sat_maintain, request): :expectedresults: check-tftp-storage health check should pass. """ + + @request.addfinalizer + def _finalize(): + sat_maintain.cli.Settings.set({'name': 'token_duration', 'value': '360'}) + assert ( + sat_maintain.cli.Settings.list({'search': 'name=token_duration'})[0]['value'] == '360' + ) + sat_maintain.cli.Settings.set({'name': 'token_duration', 'value': '2'}) assert sat_maintain.cli.Settings.list({'search': 'name=token_duration'})[0]['value'] == '2' files_to_delete = [ @@ -504,13 +516,6 @@ def test_positive_health_check_tftp_storage(sat_maintain, request): assert result.status == 0 assert 'FAIL' not in result.stdout - @request.addfinalizer - def _finalize(): - sat_maintain.cli.Settings.set({'name': 'token_duration', 'value': '360'}) - assert ( - sat_maintain.cli.Settings.list({'search': 'name=token_duration'})[0]['value'] == '360' - ) - @pytest.mark.include_capsule def test_positive_health_check_env_proxy(sat_maintain): @@ -661,10 +666,20 @@ def test_positive_health_check_corrupted_roles(sat_maintain, request): :BZ: 1703041, 1908846 """ - # Check the filter created to verify the role, resource type, and permissions assigned. role_name = 'test_role' resource_type = gen_string("alpha") sat_maintain.cli.Role.create(options={'name': role_name}) + + @request.addfinalizer + def _finalize(): + resource_type = r"'\''Host'\''" + sat_maintain.execute( + f'''sudo su - postgres -c "psql -d foreman -c 'UPDATE permissions SET + resource_type = {resource_type} WHERE name = {permission_name};'"''' + ) + sat_maintain.cli.Role.delete(options={'name': role_name}) + + # Check the filter created to verify the role, resource type, and permissions assigned. sat_maintain.cli.Filter.create( options={'role': role_name, 'permissions': ['view_hosts', 'console_hosts']} ) @@ -686,15 +701,6 @@ def test_positive_health_check_corrupted_roles(sat_maintain, request): result = sat_maintain.cli.Filter.list(options={'search': role_name}, output_format='yaml') assert result.count('Id') == 4 - @request.addfinalizer - def _finalize(): - resource_type = r"'\''Host'\''" - sat_maintain.execute( - f'''sudo su - postgres -c "psql -d foreman -c 'UPDATE permissions SET - resource_type = {resource_type} WHERE name = {permission_name};'"''' - ) - sat_maintain.cli.Role.delete(options={'name': role_name}) - @pytest.mark.include_capsule def test_positive_health_check_non_rh_packages(sat_maintain, request): @@ -719,6 +725,12 @@ def test_positive_health_check_non_rh_packages(sat_maintain, request): :CaseImportance: High """ + + @request.addfinalizer + def _finalize(): + assert sat_maintain.execute('dnf remove -y walrus').status == 0 + assert sat_maintain.execute('rm -fr /etc/yum.repos.d/custom_repo.repo').status == 0 + sat_maintain.create_custom_repos(custom_repo=settings.repos.yum_0.url) assert ( sat_maintain.cli.Packages.install(packages='walrus', options={'assumeyes': True}).status @@ -730,11 +742,6 @@ def test_positive_health_check_non_rh_packages(sat_maintain, request): assert result.status == 78 assert 'WARNING' in result.stdout - @request.addfinalizer - def _finalize(): - assert sat_maintain.execute('dnf remove -y walrus').status == 0 - assert sat_maintain.execute('rm -fr /etc/yum.repos.d/custom_repo.repo').status == 0 - def test_positive_health_check_duplicate_permissions(sat_maintain): """Verify duplicate-permissions check diff --git a/tests/foreman/maintain/test_maintenance_mode.py b/tests/foreman/maintain/test_maintenance_mode.py index 50d130ac55a..b8d5024e1b1 100644 --- a/tests/foreman/maintain/test_maintenance_mode.py +++ b/tests/foreman/maintain/test_maintenance_mode.py @@ -47,6 +47,11 @@ def test_positive_maintenance_mode(request, sat_maintain, setup_sync_plan): to disable/enable sync-plan, stop/start crond.service and is able to add FOREMAN_MAINTAIN_TABLE rule in nftables. """ + + @request.addfinalizer + def _finalize(): + assert sat_maintain.cli.MaintenanceMode.stop().status == 0 + enable_sync_ids = setup_sync_plan data_yml_path = '/var/lib/foreman-maintain/data.yml' local_data_yml_path = f'{robottelo_tmp_dir}/data.yml' @@ -142,7 +147,3 @@ def test_positive_maintenance_mode(request, sat_maintain, setup_sync_plan): assert 'OK' in result.stdout assert result.status == 1 assert 'Maintenance mode is Off' in result.stdout - - @request.addfinalizer - def _finalize(): - assert sat_maintain.cli.MaintenanceMode.stop().status == 0 diff --git a/tests/foreman/maintain/test_packages.py b/tests/foreman/maintain/test_packages.py index a4c56eac531..f0ae22d6d10 100644 --- a/tests/foreman/maintain/test_packages.py +++ b/tests/foreman/maintain/test_packages.py @@ -160,6 +160,15 @@ def test_positive_fm_packages_install(request, sat_maintain): :expectedresults: Packages get install/update when lock/unlocked. """ + + @request.addfinalizer + def _finalize(): + assert sat_maintain.execute('dnf remove -y zsh').status == 0 + if sat_maintain.__class__.__name__ == 'Satellite': + result = sat_maintain.install(InstallerCommand('lock-package-versions')) + assert result.status == 0 + assert 'Success!' in result.stdout + # Test whether packages are locked or not result = sat_maintain.install(InstallerCommand('lock-package-versions')) assert result.status == 0 @@ -216,14 +225,6 @@ def test_positive_fm_packages_install(request, sat_maintain): assert result.status == 0 assert 'Use foreman-maintain packages install/update ' not in result.stdout - @request.addfinalizer - def _finalize(): - assert sat_maintain.execute('dnf remove -y zsh').status == 0 - if sat_maintain.__class__.__name__ == 'Satellite': - result = sat_maintain.install(InstallerCommand('lock-package-versions')) - assert result.status == 0 - assert 'Success!' in result.stdout - @pytest.mark.include_capsule def test_positive_fm_packages_update(request, sat_maintain): @@ -244,6 +245,12 @@ def test_positive_fm_packages_update(request, sat_maintain): :customerscenario: true """ + + @request.addfinalizer + def _finalize(): + assert sat_maintain.execute('dnf remove -y walrus').status == 0 + sat_maintain.execute('rm -rf /etc/yum.repos.d/custom_repo.repo') + # Setup custom_repo and packages update sat_maintain.create_custom_repos(custom_repo=settings.repos.yum_0.url) disableplugin = '--disableplugin=foreman-protector' @@ -263,8 +270,3 @@ def test_positive_fm_packages_update(request, sat_maintain): result = sat_maintain.execute('rpm -qa walrus') assert result.status == 0 assert 'walrus-5.21-1' in result.stdout - - @request.addfinalizer - def _finalize(): - assert sat_maintain.execute('dnf remove -y walrus').status == 0 - sat_maintain.execute('rm -rf /etc/yum.repos.d/custom_repo.repo') diff --git a/tests/foreman/ui/test_ansible.py b/tests/foreman/ui/test_ansible.py index 82ffd5bf187..89eba62ff56 100644 --- a/tests/foreman/ui/test_ansible.py +++ b/tests/foreman/ui/test_ansible.py @@ -178,6 +178,13 @@ def test_positive_ansible_custom_role(target_sat, session, module_org, rhel_cont :CaseComponent: Ansible-RemoteExecution """ + + @request.addfinalizer + def _finalize(): + result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) + assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] + target_sat.execute('rm -rvf /etc/ansible/roles/custom_role') + SELECTED_ROLE = 'custom_role' playbook = f'{robottelo_tmp_dir}/playbook.yml' data = { @@ -231,12 +238,6 @@ def test_positive_ansible_custom_role(target_sat, session, module_org, rhel_cont session.configreport.delete(rhel_contenthost.hostname) assert len(session.configreport.read()['table']) == 0 - @request.addfinalizer - def _finalize(): - result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) - assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] - target_sat.execute('rm -rvf /etc/ansible/roles/custom_role') - @pytest.mark.tier2 def test_positive_host_role_information(target_sat, function_host): diff --git a/tests/foreman/ui/test_computeresource_gce.py b/tests/foreman/ui/test_computeresource_gce.py index 73f4fb11daf..a25edb1da44 100644 --- a/tests/foreman/ui/test_computeresource_gce.py +++ b/tests/foreman/ui/test_computeresource_gce.py @@ -161,8 +161,17 @@ def test_positive_gce_provision_end_to_end( :expectedresults: Host is provisioned successfully """ + name = f'test{gen_string("alpha", 4).lower()}' hostname = f'{name}.{gce_domain.name}' + + @request.addfinalizer + def _finalize(): + gcehost = sat_gce.api.Host().search(query={'search': f'name={hostname}'}) + if gcehost: + gcehost[0].delete() + googleclient.disconnect() + gceapi_vmname = hostname.replace('.', '-') root_pwd = gen_string('alpha', 15) storage = [{'size': 20}] @@ -214,13 +223,6 @@ def test_positive_gce_provision_end_to_end( # 2.2 GCE Backend Assertions assert gceapi_vm.is_stopping or gceapi_vm.is_stopped - @request.addfinalizer - def _finalize(): - gcehost = sat_gce.api.Host().search(query={'search': f'name={hostname}'}) - if gcehost: - gcehost[0].delete() - googleclient.disconnect() - @pytest.mark.tier4 @pytest.mark.upgrade @@ -247,6 +249,14 @@ def test_positive_gce_cloudinit_provision_end_to_end( """ name = f'test{gen_string("alpha", 4).lower()}' hostname = f'{name}.{gce_domain.name}' + + @request.addfinalizer + def _finalize(): + gcehost = sat_gce.api.Host().search(query={'search': f'name={hostname}'}) + if gcehost: + gcehost[0].delete() + googleclient.disconnect() + gceapi_vmname = hostname.replace('.', '-') storage = [{'size': 20}] root_pwd = gen_string('alpha', random.choice([8, 15])) @@ -290,10 +300,3 @@ def test_positive_gce_cloudinit_provision_end_to_end( assert not sat_gce.api.Host().search(query={'search': f'name="{hostname}"'}) # 2.2 GCE Backend Assertions assert gceapi_vm.is_stopping or gceapi_vm.is_stopped - - @request.addfinalizer - def _finalize(): - gcehost = sat_gce.api.Host().search(query={'search': f'name={hostname}'}) - if gcehost: - gcehost[0].delete() - googleclient.disconnect() diff --git a/tests/foreman/ui/test_computeresource_libvirt.py b/tests/foreman/ui/test_computeresource_libvirt.py index 518e26817b8..42477b8d46a 100644 --- a/tests/foreman/ui/test_computeresource_libvirt.py +++ b/tests/foreman/ui/test_computeresource_libvirt.py @@ -171,10 +171,8 @@ def test_positive_provision_end_to_end( } ) name = f'{hostname}.{module_libvirt_provisioning_sat.domain.name}' - assert session.host.search(name)[0]['Name'] == name - - # teardown request.addfinalizer(lambda: sat.provisioning_cleanup(name)) + assert session.host.search(name)[0]['Name'] == name # Check on Libvirt, if VM exists result = sat.execute( diff --git a/tests/upgrades/test_contentview.py b/tests/upgrades/test_contentview.py index 9b7fa90bb56..2b581297b1e 100644 --- a/tests/upgrades/test_contentview.py +++ b/tests/upgrades/test_contentview.py @@ -87,6 +87,7 @@ def test_cv_postupgrade_scenario(self, request, target_sat, pre_upgrade_data): cv = target_sat.api.ContentView(organization=org.id).search( query={'search': f'name="{cv_name}"'} )[0] + request.addfinalizer(cv.delete) yum_repo = target_sat.api.Repository(organization=org.id).search( query={'search': f'name="{pre_test_name}_yum_repo"'} )[0] @@ -95,7 +96,6 @@ def test_cv_postupgrade_scenario(self, request, target_sat, pre_upgrade_data): query={'search': f'name="{pre_test_name}_file_repo"'} )[0] request.addfinalizer(file_repo.delete) - request.addfinalizer(cv.delete) cv.repository = [] cv.update(['repository']) assert len(cv.read_json()['repositories']) == 0 diff --git a/tests/upgrades/test_host.py b/tests/upgrades/test_host.py index 5d0e9fda247..b60585d63bd 100644 --- a/tests/upgrades/test_host.py +++ b/tests/upgrades/test_host.py @@ -161,6 +161,7 @@ def test_post_create_gce_cr_and_host( pre_upgrade_host = sat_gce.api.Host().search( query={'search': f'name={pre_upgrade_data.provision_host_name}'} )[0] + request.addfinalizer(pre_upgrade_host.delete) org = sat_gce.api.Organization(id=pre_upgrade_host.organization.id).read() loc = sat_gce.api.Location(id=pre_upgrade_host.location.id).read() domain = sat_gce.api.Domain(id=pre_upgrade_host.domain.id).read() @@ -185,7 +186,6 @@ def test_post_create_gce_cr_and_host( image=image, root_pass=gen_string('alphanumeric'), ).create() - request.addfinalizer(pre_upgrade_host.delete) request.addfinalizer(host.delete) assert host.name == f"{self.hostname.lower()}.{domain.name}" assert host.build_status_label == 'Installed' diff --git a/tests/upgrades/test_provisioningtemplate.py b/tests/upgrades/test_provisioningtemplate.py index 9d681a56ead..7c603c30a53 100644 --- a/tests/upgrades/test_provisioningtemplate.py +++ b/tests/upgrades/test_provisioningtemplate.py @@ -105,6 +105,7 @@ def test_post_scenario_provisioning_templates( pre_upgrade_host = module_target_sat.api.Host().search( query={'search': f'id={pre_upgrade_data.provision_host_id}'} )[0] + request.addfinalizer(pre_upgrade_host.delete) org = module_target_sat.api.Organization(id=pre_upgrade_host.organization.id).read() loc = module_target_sat.api.Location(id=pre_upgrade_host.location.id).read() domain = module_target_sat.api.Domain(id=pre_upgrade_host.domain.id).read() @@ -129,7 +130,6 @@ def test_post_scenario_provisioning_templates( root_pass=settings.provisioning.host_root_password, pxe_loader=pxe_loader, ).create() - request.addfinalizer(pre_upgrade_host.delete) request.addfinalizer(new_host.delete) for kind in provisioning_template_kinds: diff --git a/tests/upgrades/test_subscription.py b/tests/upgrades/test_subscription.py index 116d8956120..dc6d33b84b2 100644 --- a/tests/upgrades/test_subscription.py +++ b/tests/upgrades/test_subscription.py @@ -173,5 +173,5 @@ def test_post_subscription_scenario_auto_attach(self, request, target_sat, pre_u sub.delete_manifest(data={'organization_id': org.id}) assert len(sub.search()) == 0 manifester = Manifester(manifest_category=settings.manifest.entitlement) - manifester.allocation_uuid = pre_upgrade_data.allocation_uuid request.addfinalizer(manifester.delete_subscription_allocation) + manifester.allocation_uuid = pre_upgrade_data.allocation_uuid diff --git a/tests/upgrades/test_usergroup.py b/tests/upgrades/test_usergroup.py index 0832602dbb3..11ac95e2af8 100644 --- a/tests/upgrades/test_usergroup.py +++ b/tests/upgrades/test_usergroup.py @@ -102,16 +102,16 @@ def test_post_verify_user_group_membership( user_group = target_sat.api.UserGroup().search( query={'search': f'name={pre_upgrade_data["user_group_name"]}'} ) + request.addfinalizer(user_group[0].delete) auth_source = target_sat.api.AuthSourceLDAP().search( query={'search': f'name={pre_upgrade_data["auth_source_name"]}'} )[0] request.addfinalizer(auth_source.delete) - request.addfinalizer(user_group[0].delete) user = target_sat.api.User().search(query={'search': f'login={ad_data["ldap_user_name"]}'})[ 0 ] - assert user.read().id == user_group[0].read().user[0].id request.addfinalizer(user.delete) + assert user.read().id == user_group[0].read().user[0].id role_list = target_sat.cli.Role.with_user( username=ad_data['ldap_user_name'], password=ad_data['ldap_user_passwd'] ).list() From f21de5284bff8436cd94ff35b82bd76863396bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hellebrandt?= Date: Mon, 18 Mar 2024 09:53:48 +0100 Subject: [PATCH 037/150] Workaround for some ext auth tests for PR13737 which broke CSV handling (#14423) --- pytest_fixtures/component/satellite_auth.py | 4 ++-- tests/foreman/cli/test_ldapauthsource.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pytest_fixtures/component/satellite_auth.py b/pytest_fixtures/component/satellite_auth.py index c6df8df1897..9af5a98287a 100644 --- a/pytest_fixtures/component/satellite_auth.py +++ b/pytest_fixtures/component/satellite_auth.py @@ -456,10 +456,10 @@ def configure_hammer_no_negotiate(parametrized_enrolled_sat): def hammer_logout(parametrized_enrolled_sat): """Logout in Hammer.""" result = parametrized_enrolled_sat.cli.Auth.logout() - assert result[0]['message'] == LOGGEDOUT + assert result.split("\n")[1] == LOGGEDOUT yield result = parametrized_enrolled_sat.cli.Auth.logout() - assert result[0]['message'] == LOGGEDOUT + assert result.split("\n")[1] == LOGGEDOUT @pytest.fixture diff --git a/tests/foreman/cli/test_ldapauthsource.py b/tests/foreman/cli/test_ldapauthsource.py index ce7b625c3a6..e3cb8bb32ab 100644 --- a/tests/foreman/cli/test_ldapauthsource.py +++ b/tests/foreman/cli/test_ldapauthsource.py @@ -134,7 +134,7 @@ def test_positive_refresh_usergroup_with_ad(self, member_group, ad_data, module_ result = module_target_sat.cli.Auth.with_user( username=ad_data['ldap_user_name'], password=ad_data['ldap_user_passwd'] ).status() - assert LOGEDIN_MSG.format(ad_data['ldap_user_name']) in result[0]['message'] + assert LOGEDIN_MSG.format(ad_data['ldap_user_name']) in result.split("\n")[1] module_target_sat.cli.UserGroupExternal.refresh( {'user-group-id': user_group['id'], 'name': member_group} ) From f509f15bb2d80079dbf0375f4c8b865ca40152f4 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:13:08 +0100 Subject: [PATCH 038/150] Add a test case to read Capsules via non-admin user (#14424) Add case to read Capsules via non-admin user --- tests/foreman/api/test_capsulecontent.py | 82 ++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/tests/foreman/api/test_capsulecontent.py b/tests/foreman/api/test_capsulecontent.py index 82a8bf49619..fe471df8eed 100644 --- a/tests/foreman/api/test_capsulecontent.py +++ b/tests/foreman/api/test_capsulecontent.py @@ -18,8 +18,10 @@ from time import sleep from nailgun import client +from nailgun.config import ServerConfig from nailgun.entity_mixins import call_entity_method_with_timeout import pytest +from requests.exceptions import HTTPError from robottelo.config import settings from robottelo.constants import ( @@ -47,9 +49,25 @@ get_repomd, get_repomd_revision, ) +from robottelo.utils.datafactory import gen_string from robottelo.utils.issue_handlers import is_open +@pytest.fixture +def default_non_admin_user(target_sat, default_org, default_location): + """Non-admin user with no roles assigned in the Default org/loc.""" + password = gen_string('alphanumeric') + user = target_sat.api.User( + login=gen_string('alpha'), + password=password, + organization=[default_org], + location=[default_location], + ).create() + user.password = password + yield user + user.delete() + + @pytest.mark.run_in_one_thread class TestCapsuleContentManagement: """Content Management related tests, which exercise katello with pulp @@ -1633,3 +1651,67 @@ def test_positive_content_counts_blank_update( assert ( counts is None or len(counts['content_view_versions']) == 0 ), f"No content counts expected, but got:\n{counts['content_view_versions']}." + + def test_positive_read_with_non_admin_user( + self, + target_sat, + module_capsule_configured, + default_org, + default_non_admin_user, + ): + """Try to list and read Capsules with a non-admin user with and without permissions. + + :id: f3ee19fa-9b91-4b49-b00a-8debee903ce6 + + :setup: + 1. Satellite with registered external Capsule. + 2. Non-admin user without any roles/permissions. + + :steps: + 1. Using the non-admin user try to list all or particular Capsule. + 2. Add Viewer role to the user and try again. + + :expectedresults: + 1. Read should fail without Viewer role. + 2. Read should succeed when Viewer role added. + + :BZ: 2096930 + + :customerscenario: true + """ + # Using the non-admin user try to list all or particular Capsule + user = default_non_admin_user + sc = ServerConfig( + auth=(user.login, user.password), + url=target_sat.url, + verify=settings.server.verify_ca, + ) + + with pytest.raises(HTTPError) as error: + target_sat.api.Capsule(server_config=sc).search() + assert error.value.response.status_code == 403 + assert 'Access denied' in error.value.response.text + + with pytest.raises(HTTPError) as error: + target_sat.api.Capsule( + server_config=sc, id=module_capsule_configured.nailgun_capsule.id + ).read() + assert error.value.response.status_code == 403 + assert 'Access denied' in error.value.response.text + + # Add Viewer role to the user and try again. + v_role = target_sat.api.Role().search(query={'search': 'name="Viewer"'}) + assert len(v_role) == 1, 'Expected just one Viewer to be found.' + user.role = [v_role[0]] + user.update(['role']) + + res = target_sat.api.Capsule(server_config=sc).search() + assert len(res) >= 2, 'Expected at least one internal and one or more external Capsule(s).' + assert {target_sat.hostname, module_capsule_configured.hostname}.issubset( + [caps.name for caps in res] + ), 'Internal and/or external Capsule was not listed.' + + res = target_sat.api.Capsule( + server_config=sc, id=module_capsule_configured.nailgun_capsule.id + ).read() + assert res.name == module_capsule_configured.hostname, 'External Capsule not found.' From 6a59883202c6c482aaa70bd11b23a77f28531329 Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Mon, 18 Mar 2024 20:05:10 +0530 Subject: [PATCH 039/150] validate that cv warning to force promote (#14316) * validate that cv warning to force promote * small change in step Co-authored-by: vsedmik <46570670+vsedmik@users.noreply.github.com> * add new line Co-authored-by: vsedmik <46570670+vsedmik@users.noreply.github.com> * small change in commented line Co-authored-by: vsedmik <46570670+vsedmik@users.noreply.github.com> --------- Co-authored-by: vsedmik <46570670+vsedmik@users.noreply.github.com> --- tests/foreman/cli/test_contentview.py | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/tests/foreman/cli/test_contentview.py b/tests/foreman/cli/test_contentview.py index 9b261f57218..82f12ca1faa 100644 --- a/tests/foreman/cli/test_contentview.py +++ b/tests/foreman/cli/test_contentview.py @@ -4065,6 +4065,75 @@ def test_version_info_by_lce(self, module_org, module_target_sat): ) assert content_view['version'] == '1.0' + def test_positive_validate_force_promote_warning(self, target_sat, function_org): + """Test cv promote shows warning of 'force promotion' for out of sequence LCE + + :id: 1bfb76be-ab40-48b4-b5a3-428a2a9ab99b + + :steps: + 1. Create an environment path ex- Library >> Test >> Preprod >> Prod + 2. Create a CV and publish into the Library + 3. Promote version 1.0 to Preprod, skip Test, this should fail with warning + 4. Promote version 1.0 to Preprod using force, this should success + 5. Try to promote version 1.0 from Preprod to Prod, this should success without warning + + :expectedresults: + 1. CV version 1.0 should be present on Prod LCE + + :CaseImportance: High + + :BZ: 2125728 + + :customerscenario: true + """ + # Create an environment path ex- Library >> Test >> Preprod >> Prod + lce_test = target_sat.cli_factory.make_lifecycle_environment( + {'organization-id': function_org.id} + ) + lce_preprod = target_sat.cli_factory.make_lifecycle_environment( + {'organization-id': function_org.id, 'prior': lce_test['name']} + ) + lce_prod = target_sat.cli_factory.make_lifecycle_environment( + {'organization-id': function_org.id, 'prior': lce_preprod['name']} + ) + + # Create a CV and publish into the Library + cv = target_sat.cli_factory.make_content_view({'organization-id': function_org.id}) + target_sat.cli.ContentView.publish({'id': cv['id']}) + + # Promote version 1.0 to Preprod, skip Test, this should fail with warning + cv_version = target_sat.cli.ContentView.info({'id': cv['id']})['versions'][0] + with pytest.raises(CLIReturnCodeError) as error: + target_sat.cli.ContentView.version_promote( + {'id': cv_version['id'], 'to-lifecycle-environment-id': lce_preprod['id']} + ) + assert ( + 'Cannot promote environment out of sequence. Use force to bypass restriction' + in error.value.stderr + ) + + # Promote version 1.0 to Preprod using force, this should success + target_sat.cli.ContentView.version_promote( + { + 'id': cv_version['id'], + 'to-lifecycle-environment-id': lce_preprod['id'], + 'force': True, + } + ) + promoted_lce = target_sat.cli.ContentView.info({'id': cv['id']})['lifecycle-environments'][ + -1 + ] + assert lce_preprod['id'] == promoted_lce['id'] + + # Try to promote version 1.0 from Preprod to Prod, this should success without warning + target_sat.cli.ContentView.version_promote( + {'id': cv_version['id'], 'to-lifecycle-environment-id': lce_prod['id']} + ) + promoted_lce = target_sat.cli.ContentView.info({'id': cv['id']})['lifecycle-environments'][ + -1 + ] + assert lce_prod['id'] == promoted_lce['id'] + class TestContentViewFileRepo: """Specific tests for Content Views with File Repositories containing From 222a69e577ee3195b34f439e9fc649ef49c5b910 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:20:10 -0400 Subject: [PATCH 040/150] Bump dynaconf[vault] from 3.2.4 to 3.2.5 (#14439) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 599d6fa5f3f..73f21ac47e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ betelgeuse==1.11.0 cryptography==42.0.5 deepdiff==6.7.1 docker==7.0.0 # Temporary until Broker is back on PyPi -dynaconf[vault]==3.2.4 +dynaconf[vault]==3.2.5 fauxfactory==3.1.0 jinja2==3.1.3 manifester==0.0.14 From dd5de39b6d975387239b1fb87846fb5d86e3150f Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:06:27 +0100 Subject: [PATCH 041/150] Add a case to export/import entities with long names (#14438) --- tests/foreman/cli/test_satellitesync.py | 100 ++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/tests/foreman/cli/test_satellitesync.py b/tests/foreman/cli/test_satellitesync.py index 90dcb18c6d4..09ff7391a22 100644 --- a/tests/foreman/cli/test_satellitesync.py +++ b/tests/foreman/cli/test_satellitesync.py @@ -1949,6 +1949,106 @@ def test_positive_export_incremental_syncable_check_content( f'{repomd_refs - drive_files}' ) + @pytest.mark.tier3 + def test_postive_export_import_with_long_name( + self, + target_sat, + config_export_import_settings, + export_import_cleanup_module, + module_org, + function_import_org, + ): + """Export and import content entities (product, repository, CV) with a long name. + + :id: 66d676ab-4e06-446b-b893-e236b26d37d9 + + :steps: + 1. Create product and repository with a long name, sync it. + 2. Export the repository, import it and verify the prod and repo names match the export. + 3. Verify the imported content matches the export. + 4. Create CV with a long name, add the repo and publish. + 5. Export the CV, import it and verify its name matches the export. + 6. Verify the imported content matches the export. + + :expectedresults: + 1. Exports and imports should succeed without any errors and names + and content of imported entities should match the export. + + :BZ: 2124275, 2053329 + + :customerscenario: true + """ + # Create product and repository with a long name, sync it. + product = target_sat.cli_factory.make_product( + {'name': gen_string('alpha', 128), 'organization-id': module_org.id} + ) + repo = target_sat.cli_factory.make_repository( + { + 'name': gen_string('alpha', 128), + 'content-type': 'yum', + 'download-policy': 'immediate', + 'organization-id': module_org.id, + 'product-id': product.id, + } + ) + target_sat.cli.Repository.synchronize({'id': repo.id}) + exported_packages = target_sat.cli.Package.list({'repository-id': repo.id}) + + # Export the repository, import it and verify the prod and repo names match the export. + export = target_sat.cli.ContentExport.completeRepository( + {'id': repo.id, 'organization-id': module_org.id} + ) + import_path = target_sat.move_pulp_archive(module_org, export['message']) + target_sat.cli.ContentImport.repository( + {'organization-id': function_import_org.id, 'path': import_path} + ) + import_repo = target_sat.cli.Repository.info( + { + 'organization-id': function_import_org.id, + 'name': repo.name, + 'product': product.name, + } + ) + + # Verify the imported content matches the export. + imported_packages = target_sat.cli.Package.list({'repository-id': import_repo['id']}) + assert imported_packages == exported_packages, 'Imported content does not match the export' + + # Create CV with a long name, add the repo and publish. + exporting_cv = target_sat.cli_factory.make_content_view( + {'name': gen_string('alpha', 128), 'organization-id': module_org.id} + ) + target_sat.cli.ContentView.add_repository( + { + 'id': exporting_cv.id, + 'organization-id': module_org.id, + 'repository-id': repo.id, + } + ) + target_sat.cli.ContentView.publish({'id': exporting_cv['id']}) + exporting_cv = target_sat.cli.ContentView.info({'id': exporting_cv['id']}) + assert len(exporting_cv['versions']) == 1 + exporting_cvv_id = exporting_cv['versions'][0]['id'] + + # Export the CV, import it and verify its name matches the export. + export = target_sat.cli.ContentExport.completeVersion( + {'id': exporting_cvv_id, 'organization-id': module_org.id} + ) + import_path = target_sat.move_pulp_archive(module_org, export['message']) + target_sat.cli.ContentImport.version( + {'organization-id': function_import_org.id, 'path': import_path} + ) + importing_cv = target_sat.cli.ContentView.info( + {'name': exporting_cv['name'], 'organization-id': function_import_org.id} + ) + assert len(importing_cv['versions']) == 1 + + # Verify the imported content matches the export. + imported_packages = target_sat.cli.Package.list( + {'content-view-version-id': importing_cv['versions'][0]['id']} + ) + assert exported_packages == imported_packages + class TestInterSatelliteSync: """Implements InterSatellite Sync tests in CLI""" From e44a553097568f44bdbb589cbd125b499a00eaed Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 20 Mar 2024 11:42:01 +0100 Subject: [PATCH 042/150] duplicate bookmark negative test fix (#14232) --- robottelo/constants/__init__.py | 22 ++++++++++++++++++---- tests/foreman/ui/test_bookmarks.py | 12 +++++++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 90991ce3df2..99d2ee0fc29 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1655,6 +1655,7 @@ class Colored(Box): 'name': 'ActivationKey', 'controller': 'katello_activation_keys', 'session_name': 'activationkey', + 'old_ui': True, }, {'name': 'Dashboard', 'controller': 'dashboard', 'session_name': 'dashboard'}, {'name': 'Audit', 'controller': 'audits', 'session_name': 'audit'}, @@ -1667,28 +1668,41 @@ class Colored(Box): {'name': 'Task', 'controller': 'foreman_tasks_tasks', 'session_name': 'task'}, # TODO Load manifest for the test_positive_end_to_end from the ui/test_bookmarks.py # {'name': 'Subscriptions', 'controller': 'subscriptions','session_name': 'subscription' }, - {'name': 'Product', 'controller': 'katello_products', 'session_name': 'product'}, + { + 'name': 'Product', + 'controller': 'katello_products', + 'session_name': 'product', + 'old_ui': True, + }, {'name': 'Repository', 'controller': 'katello_repositories', 'session_name': 'repository'}, { 'name': 'ContentCredential', 'controller': 'katello_content_credentials', 'session_name': 'contentcredential', + 'old_ui': True, + }, + { + 'name': 'SyncPlan', + 'controller': 'katello_sync_plans', + 'session_name': 'syncplan', + 'old_ui': True, }, - {'name': 'SyncPlan', 'controller': 'katello_sync_plans', 'session_name': 'syncplan'}, {'name': 'ContentView', 'controller': 'katello_content_views', 'session_name': 'contentview'}, - {'name': 'Errata', 'controller': 'katello_errata', 'session_name': 'errata'}, + {'name': 'Errata', 'controller': 'katello_errata', 'session_name': 'errata', 'old_ui': True}, {'name': 'Package', 'controller': 'katello_erratum_packages', 'session_name': 'package'}, { 'name': 'ContainerImageTag', 'controller': 'katello_docker_tags', 'session_name': 'containerimagetag', + 'old_ui': True, }, {'name': 'Host', 'controller': 'hosts', 'setup': entities.Host, 'session_name': 'host_new'}, - {'name': 'ContentHost', 'controller': 'hosts', 'session_name': 'contenthost'}, + {'name': 'ContentHost', 'controller': 'hosts', 'session_name': 'contenthost', 'old_ui': True}, { 'name': 'HostCollection', 'controller': 'katello_host_collections', 'session_name': 'hostcollection', + 'old_ui': True, }, {'name': 'Architecture', 'controller': 'architectures', 'session_name': 'architecture'}, { diff --git a/tests/foreman/ui/test_bookmarks.py b/tests/foreman/ui/test_bookmarks.py index 563a19102a7..037af909046 100644 --- a/tests/foreman/ui/test_bookmarks.py +++ b/tests/foreman/ui/test_bookmarks.py @@ -11,7 +11,7 @@ :CaseImportance: High """ -from airgun.exceptions import NoSuchElementException +from airgun.exceptions import DisabledWidgetError, NoSuchElementException from fauxfactory import gen_string import pytest @@ -256,8 +256,14 @@ def test_negative_create_with_duplicate_name(session, ui_entity, module_target_s existing_bookmark = session.bookmark.search(bookmark.name)[0] assert existing_bookmark['Name'] == bookmark.name ui_lib = getattr(session, ui_entity['name'].lower()) - # this fails but does not raise UI error, BZ#1992652 closed wontfix - ui_lib.create_bookmark({'name': bookmark.name, 'query': query, 'public': True}) + # this fails but does not raise UI error in old style dialog, BZ#1992652 closed + # wontfix, but new style dialog raises error, both situations occur + old_ui = ui_entity.get('old_ui') + if old_ui: + ui_lib.create_bookmark({'name': bookmark.name, 'query': query, 'public': True}) + else: + with pytest.raises((DisabledWidgetError, NoSuchElementException)): + ui_lib.create_bookmark({'name': bookmark.name, 'query': query, 'public': True}) # assert there are no duplicate bookmarks new_search = session.bookmark.search(bookmark.name) assert len(new_search) == 1 From 011d11c75cb7cd81ba93cb0b16b0bc38d7b4c1b4 Mon Sep 17 00:00:00 2001 From: Jake Callahan Date: Wed, 20 Mar 2024 10:05:01 -0400 Subject: [PATCH 043/150] Bump Broker to 0.4.9 (#14399) * Bump Broker to 0.4.8 Now that Broker is back on PyPI, let's clean up the requirements * update airgun and nailgun dependency definitions these are in line with the newer standard, and required for people using uv. * update broker to 0.4.9 --- requirements.txt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/requirements.txt b/requirements.txt index 73f21ac47e3..9636539201e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,14 @@ # Version updates managed by dependabot betelgeuse==1.11.0 -# broker[docker]==0.4.1 - Temporarily disabled, see below +broker[docker]==0.4.9 cryptography==42.0.5 deepdiff==6.7.1 -docker==7.0.0 # Temporary until Broker is back on PyPi dynaconf[vault]==3.2.5 fauxfactory==3.1.0 jinja2==3.1.3 manifester==0.0.14 navmazing==1.2.2 -paramiko==3.4.0 # Temporary until Broker is back on PyPi productmd==1.38 pyotp==2.9.0 python-box==7.1.1 @@ -30,11 +28,6 @@ wait-for==1.2.0 wrapanapi==3.6.0 # Get airgun, nailgun and upgrade from master -git+https://github.com/SatelliteQE/airgun.git@master#egg=airgun -git+https://github.com/SatelliteQE/nailgun.git@master#egg=nailgun -# Broker currently is unable to push to PyPi due to [1] and [2] -# In the meantime, we install directly from the repo -# [1] - https://github.com/ParallelSSH/ssh2-python/issues/193 -# [2] - https://github.com/pypi/warehouse/issues/7136 -git+https://github.com/SatelliteQE/broker.git@0.4.7#egg=broker +airgun @ git+https://github.com/SatelliteQE/airgun.git@master#egg=airgun +nailgun @ git+https://github.com/SatelliteQE/nailgun.git@master#egg=nailgun --editable . From 720bfc438d21dcd685bea14c068fd408de44990f Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 20 Mar 2024 18:45:58 +0100 Subject: [PATCH 044/150] permission constants updated (#14463) perission constants updated --- robottelo/constants/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 99d2ee0fc29..e7759c773b8 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1089,6 +1089,12 @@ class Colored(Box): 'destroy_locations', 'assign_locations', ], + 'LookupValue': [ + 'edit_lookup_values', + 'create_lookup_values', + 'destroy_lookup_values', + 'view_lookup_values', + ], 'MailNotification': ['view_mail_notifications', 'edit_user_mail_notifications'], 'Medium': ['view_media', 'create_media', 'edit_media', 'destroy_media'], 'Model': ['view_models', 'create_models', 'edit_models', 'destroy_models'], @@ -1120,7 +1126,7 @@ class Colored(Box): 'lock_ptables', ], 'Realm': ['view_realms', 'create_realms', 'edit_realms', 'destroy_realms'], - 'RemoteExecutionFeature': ['edit_remote_execution_features'], + 'RemoteExecutionFeature': ['view_remote_execution_features', 'edit_remote_execution_features'], 'ReportTemplate': [ 'edit_report_templates', 'destroy_report_templates', From 59164b53505ee4955e3a1b2317bf407e896ddf41 Mon Sep 17 00:00:00 2001 From: Omkar Khatavkar Date: Thu, 21 Mar 2024 15:04:27 +0530 Subject: [PATCH 045/150] moving to use pull_request_target for prt_label.yml GHA (#14467) moving to use pull_request_target for prt_labels.yml GHA --- .github/workflows/prt_labels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prt_labels.yml b/.github/workflows/prt_labels.yml index 311516fa682..52dd68589b3 100644 --- a/.github/workflows/prt_labels.yml +++ b/.github/workflows/prt_labels.yml @@ -1,7 +1,7 @@ name: Remove the PRT label, for the new commit on: - pull_request: + pull_request_target: types: ["synchronize"] jobs: From b05da4ee3c6a046c22f73c41938d56f3fb556024 Mon Sep 17 00:00:00 2001 From: dosas Date: Thu, 21 Mar 2024 10:46:49 +0100 Subject: [PATCH 046/150] Fix content_facet_attributes attributes (#14224) --- tests/foreman/api/test_host.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/foreman/api/test_host.py b/tests/foreman/api/test_host.py index 94730d56925..eb3e89dc6aa 100644 --- a/tests/foreman/api/test_host.py +++ b/tests/foreman/api/test_host.py @@ -261,10 +261,10 @@ def test_positive_create_inherit_lce_cv( ).create() host = module_target_sat.api.Host(hostgroup=hostgroup, organization=module_org).create() assert ( - host.content_facet_attributes['lifecycle_environment_id'] + host.content_facet_attributes['lifecycle_environment']['id'] == hostgroup.lifecycle_environment.id ) - assert host.content_facet_attributes['content_view_id'] == hostgroup.content_view.id + assert host.content_facet_attributes['content_view']['id'] == hostgroup.content_view.id @pytest.mark.tier2 @@ -625,16 +625,16 @@ def test_positive_create_and_update_with_content_view( 'lifecycle_environment_id': module_lce_library.id, }, ).create() - assert host.content_facet_attributes['content_view_id'] == module_default_org_view.id - assert host.content_facet_attributes['lifecycle_environment_id'] == module_lce_library.id + assert host.content_facet_attributes['content_view']['id'] == module_default_org_view.id + assert host.content_facet_attributes['lifecycle_environment']['id'] == module_lce_library.id host.content_facet_attributes = { 'content_view_id': module_default_org_view.id, 'lifecycle_environment_id': module_lce_library.id, } host = host.update(['content_facet_attributes']) - assert host.content_facet_attributes['content_view_id'] == module_default_org_view.id - assert host.content_facet_attributes['lifecycle_environment_id'] == module_lce_library.id + assert host.content_facet_attributes['content_view']['id'] == module_default_org_view.id + assert host.content_facet_attributes['lifecycle_environment']['id'] == module_lce_library.id @pytest.mark.tier1 From acd1a548f35785a8c6604087fd33d3aec0ffd27d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 23:53:10 -0400 Subject: [PATCH 047/150] Bump dependabot/fetch-metadata from 1 to 2 (#14478) --- .github/workflows/dependency_merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependency_merge.yml b/.github/workflows/dependency_merge.yml index f76d5a622dd..9d277c8a67d 100644 --- a/.github/workflows/dependency_merge.yml +++ b/.github/workflows/dependency_merge.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v1 + uses: dependabot/fetch-metadata@v2 with: github-token: "${{ secrets.GITHUB_TOKEN }}" From 3608b2ba86d3d271c63d919a55bb08659f08b909 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 00:05:44 -0400 Subject: [PATCH 048/150] Bump pytest-mock from 3.12.0 to 3.14.0 (#14483) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9636539201e..af7b65555dc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ python-box==7.1.1 pytest==8.1.1 pytest-order==1.2.0 pytest-services==2.2.1 -pytest-mock==3.12.0 +pytest-mock==3.14.0 pytest-reportportal==5.4.0 pytest-xdist==3.5.0 pytest-fixturecollection==0.1.2 From 17e284f2d9669b465bd3a8d5060f2cbc7ded8614 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Fri, 22 Mar 2024 12:39:44 +0530 Subject: [PATCH 049/150] Add upgrade marker on ansible destructive tests (#14488) Signed-off-by: Gaurav Talreja --- tests/foreman/destructive/test_ansible.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/destructive/test_ansible.py b/tests/foreman/destructive/test_ansible.py index 01779d6a14a..b57ba89c58f 100644 --- a/tests/foreman/destructive/test_ansible.py +++ b/tests/foreman/destructive/test_ansible.py @@ -13,7 +13,7 @@ """ import pytest -pytestmark = pytest.mark.destructive +pytestmark = [pytest.mark.destructive, pytest.mark.upgrade] def test_positive_persistent_ansible_cfg_change(target_sat): From 1bfd3675a7ff3d798a19e2325c0c27b6cc102b45 Mon Sep 17 00:00:00 2001 From: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:17:40 +0530 Subject: [PATCH 050/150] Add test to sync repo having zst compression (#14398) Signed-off-by: Shubham Ganar --- robottelo/constants/__init__.py | 1 - robottelo/constants/repos.py | 2 +- tests/foreman/api/test_repositories.py | 40 +++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index e7759c773b8..cefabcdcd55 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -2150,7 +2150,6 @@ class Colored(Box): 'option is not present in the /etc/dnf/dnf.conf' ) - # Data File Paths class DataFile(Box): """The boxed Data directory class with its attributes pointing to the Data directory files""" diff --git a/robottelo/constants/repos.py b/robottelo/constants/repos.py index 9738894a689..a0b2a8adeec 100644 --- a/robottelo/constants/repos.py +++ b/robottelo/constants/repos.py @@ -25,6 +25,6 @@ FAKE_0_YUM_REPO_STRING_BASED_VERSIONS = ( 'https://fixtures.pulpproject.org/rpm-string-version-updateinfo/' ) - +FAKE_ZST_REPO = 'https://fixtures.pulpproject.org/rpm-zstd-metadata' ANSIBLE_GALAXY = 'https://galaxy.ansible.com/' ANSIBLE_HUB = 'https://cloud.redhat.com/api/automation-hub/' diff --git a/tests/foreman/api/test_repositories.py b/tests/foreman/api/test_repositories.py index 9c577dd7349..68dc13b0657 100644 --- a/tests/foreman/api/test_repositories.py +++ b/tests/foreman/api/test_repositories.py @@ -18,7 +18,12 @@ from robottelo import constants from robottelo.config import settings -from robottelo.constants import DEFAULT_ARCHITECTURE, MIRRORING_POLICIES, REPOS +from robottelo.constants import ( + DEFAULT_ARCHITECTURE, + MIRRORING_POLICIES, + REPOS, +) +from robottelo.constants.repos import FAKE_ZST_REPO from robottelo.exceptions import CLIReturnCodeError from robottelo.utils.datafactory import parametrized @@ -186,6 +191,39 @@ def test_positive_sync_kickstart_repo(module_sca_manifest_org, target_sat): assert rh_repo.content_counts['rpm'] > 0 +def test_positive_sync_upstream_repo_with_zst_compression( + module_org, module_product, module_target_sat +): + """Sync upstream repo having zst compression and verify it succeeds. + + :id: 1eddff2a-b6b5-420b-a0e8-ba6a05c11ca4 + + :expectedresults: Repo sync is successful and no zst type compression errors are present in /var/log/messages. + + :steps: + + 1. Sync upstream repository having zst type compression. + 2. Assert that no errors related to compression type are present in + /var/log/messages. + 3. Assert that sync was executed properly. + + :BZ: 2241934 + + :customerscenario: true + """ + repo = module_target_sat.api.Repository( + product=module_product, content_type='yum', url=FAKE_ZST_REPO + ).create() + assert repo.read().content_counts['rpm'] == 0 + sync = module_product.sync() + assert sync['result'] == 'success' + assert repo.read().content_counts['rpm'] > 0 + result = module_target_sat.execute( + 'grep pulp /var/log/messages | grep "Cannot detect compression type"' + ) + assert result.status == 1 + + @pytest.mark.tier1 def test_negative_upload_expired_manifest(module_org, target_sat): """Upload an expired manifest and attempt to refresh it From 34db8df07a2a71330530769afd1462e3ec270bbf Mon Sep 17 00:00:00 2001 From: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> Date: Fri, 22 Mar 2024 19:16:49 +0530 Subject: [PATCH 051/150] Modify VMware compute profile test (#14202) Signed-off-by: Shubham Ganar Signed-off-by: Shubham Ganar --- robottelo/constants/__init__.py | 1 - .../foreman/ui/test_computeresource_vmware.py | 241 +++++++----------- 2 files changed, 98 insertions(+), 144 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index cefabcdcd55..de71cdd643f 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1792,7 +1792,6 @@ class Colored(Box): VMWARE_CONSTANTS = { 'folder': 'vm', - 'guest_os': 'Red Hat Enterprise Linux 8 (64 bit)', 'scsicontroller': 'LSI Logic Parallel', 'virtualhw_version': 'Default', 'pool': 'Resources', diff --git a/tests/foreman/ui/test_computeresource_vmware.py b/tests/foreman/ui/test_computeresource_vmware.py index ddf7ca5f33e..a576296ab4c 100644 --- a/tests/foreman/ui/test_computeresource_vmware.py +++ b/tests/foreman/ui/test_computeresource_vmware.py @@ -26,6 +26,7 @@ VMWARE_CONSTANTS, ) from robottelo.utils.datafactory import gen_string +from robottelo.utils.issue_handlers import is_open pytestmark = [pytest.mark.skip_if_not_set('vmware')] @@ -289,32 +290,64 @@ def test_positive_resource_vm_power_management(session, vmware): raise AssertionError('Timed out waiting for VM to toggle power state') from err +@pytest.mark.e2e +@pytest.mark.upgrade @pytest.mark.tier2 @pytest.mark.parametrize('vmware', ['vmware7', 'vmware8'], indirect=True) -def test_positive_select_vmware_custom_profile_guest_os_rhel7(session, vmware): - """Select custom default (3-Large) compute profile guest OS RHEL7. +def test_positive_vmware_custom_profile_end_to_end(session, vmware, request, target_sat): + """Perform end to end testing for VMware compute profile. :id: 24f7bb5f-2aaf-48cb-9a56-d2d0713dfe3d :customerscenario: true - :setup: vmware hostname and credentials. - :steps: 1. Create a compute resource of type vmware. - 2. Provide valid hostname, username and password. - 3. Select the created vmware CR. - 4. Click Compute Profile tab. - 5. Select 3-Large profile - 6. Set Guest OS field to RHEL7 OS. + 2. Update a compute profile with all values - :expectedresults: Guest OS RHEL7 is selected successfully. + :expectedresults: Compute profiles are updated successfully with all the values. - :BZ: 1315277 + :BZ: 1315277, 2266672 """ cr_name = gen_string('alpha') - guest_os_name = 'Red Hat Enterprise Linux 7 (64-bit)' + guest_os_names = [ + 'Red Hat Enterprise Linux 7 (64-bit)', + 'Red Hat Enterprise Linux 8 (64 bit)', + 'Red Hat Enterprise Linux 9 (64 bit)', + ] + compute_profile = ['1-Small', '2-Medium', '3-Large'] + cpus = ['2', '4', '6'] + vm_memory = ['4000', '6000', '8000'] + annotation_notes = gen_string('alpha') + firmware_type = ['Automatic', 'BIOS', 'EFI'] + resource_pool = VMWARE_CONSTANTS['pool'] + folder = VMWARE_CONSTANTS['folder'] + virtual_hw_version = VMWARE_CONSTANTS['virtualhw_version'] + memory_hot_add = True + cpu_hot_add = True + cdrom_drive = True + disk_size = '10 GB' + network = 'VLAN 1001' # hardcoding network here as this test won't be doing actual provisioning + data_store_summary_string = _get_vmware_datastore_summary_string(vmware=vmware) + storage_data = { + 'storage': { + 'controller': VMWARE_CONSTANTS['scsicontroller'], + 'disks': [ + { + 'data_store': data_store_summary_string, + 'size': disk_size, + 'thin_provision': True, + } + ], + } + } + network_data = { + 'network_interfaces': { + 'nic_type': VMWARE_CONSTANTS['network_interface_name'], + 'network': network, + } + } with session: session.computeresource.create( { @@ -326,143 +359,65 @@ def test_positive_select_vmware_custom_profile_guest_os_rhel7(session, vmware): 'provider_content.datacenter.value': settings.vmware.datacenter, } ) - assert session.computeresource.search(cr_name)[0]['Name'] == cr_name - session.computeresource.update_computeprofile( - cr_name, COMPUTE_PROFILE_LARGE, {'provider_content.guest_os': guest_os_name} - ) - values = session.computeresource.read_computeprofile(cr_name, COMPUTE_PROFILE_LARGE) - assert values['provider_content']['guest_os'] == guest_os_name - - -@pytest.mark.tier2 -@pytest.mark.parametrize('vmware', ['vmware7', 'vmware8'], indirect=True) -def test_positive_access_vmware_with_custom_profile(session, vmware): - """Associate custom default (3-Large) compute profile - :id: 751ef765-5091-4322-a0d9-0c9c73009cc4 + @request.addfinalizer + def _finalize(): + cr = target_sat.api.VMWareComputeResource().search(query={'search': f'name={cr_name}'}) + if cr: + target_sat.api.VMWareComputeResource(id=cr[0].id).delete() - :setup: vmware hostname and credentials. - - :steps: - - 1. Create a compute resource of type vmware. - 2. Provide valid hostname, username and password. - 3. Select the created vmware CR. - 4. Click Compute Profile tab. - 5. Edit (3-Large) with valid configurations and submit. - - :expectedresults: The Compute Resource created and associated to compute profile (3-Large) - with provided values. - """ - cr_name = gen_string('alpha') - data_store_summary_string = _get_vmware_datastore_summary_string(vmware=vmware) - cr_profile_data = dict( - cpus='2', - cores_per_socket='2', - memory='1024', - firmware='EFI', - cluster=settings.vmware.cluster, - resource_pool=VMWARE_CONSTANTS.get('pool'), - folder=VMWARE_CONSTANTS.get('folder'), - guest_os=VMWARE_CONSTANTS.get('guest_os'), - virtual_hw_version=VMWARE_CONSTANTS.get('virtualhw_version'), - memory_hot_add=True, - cpu_hot_add=True, - cdrom_drive=True, - annotation_notes=gen_string('alpha'), - network_interfaces=[] - if not settings.provisioning.vlan_id - else [ - dict( - nic_type=VMWARE_CONSTANTS.get('network_interface_name'), - network='VLAN 1001', # hardcoding network here as these test won't be doing actual provisioning - ), - dict( - nic_type=VMWARE_CONSTANTS.get('network_interface_name'), - network='VLAN 1001', - ), - ], - storage=[ - dict( - controller=VMWARE_CONSTANTS.get('scsicontroller'), - disks=[ - dict( - data_store=data_store_summary_string, - size='10 GB', - thin_provision=True, - ), - dict( - data_store=data_store_summary_string, - size='20 GB', - thin_provision=False, - eager_zero=False, - ), - ], - ), - dict( - controller=VMWARE_CONSTANTS.get('scsicontroller'), - disks=[ - dict( - data_store=data_store_summary_string, - size='30 GB', - thin_provision=False, - eager_zero=True, - ) - ], - ), - ], - ) - with session: - session.computeresource.create( - { - 'name': cr_name, - 'provider': FOREMAN_PROVIDERS['vmware'], - 'provider_content.vcenter': vmware.hostname, - 'provider_content.user': settings.vmware.username, - 'provider_content.password': settings.vmware.password, - 'provider_content.datacenter.value': settings.vmware.datacenter, - } - ) assert session.computeresource.search(cr_name)[0]['Name'] == cr_name - session.computeresource.update_computeprofile( - cr_name, - COMPUTE_PROFILE_LARGE, - {f'provider_content.{key}': value for key, value in cr_profile_data.items()}, - ) - values = session.computeresource.read_computeprofile(cr_name, COMPUTE_PROFILE_LARGE) - provider_content = values['provider_content'] - # assert main compute resource profile data updated successfully. - excluded_keys = ['network_interfaces', 'storage'] - expected_value = { - key: value for key, value in cr_profile_data.items() if key not in excluded_keys - } - provided_value = { - key: value for key, value in provider_content.items() if key in expected_value - } - assert provided_value == expected_value - # assert compute resource profile network data updated successfully. - for network_index, expected_network_value in enumerate( - cr_profile_data['network_interfaces'] + for guest_os_name, cprofile, cpu, memory, firmware in zip( + guest_os_names, compute_profile, cpus, vm_memory, firmware_type, strict=True ): - provided_network_value = { - key: value - for key, value in provider_content['network_interfaces'][network_index].items() - if key in expected_network_value - } - assert provided_network_value == expected_network_value - # assert compute resource profile storage data updated successfully. - for controller_index, expected_controller_value in enumerate(cr_profile_data['storage']): - provided_controller_value = provider_content['storage'][controller_index] + session.computeresource.update_computeprofile( + cr_name, + cprofile, + { + 'provider_content.guest_os': guest_os_name, + 'provider_content.cpus': cpu, + 'provider_content.memory': memory, + 'provider_content.cluster': settings.vmware.cluster, + 'provider_content.annotation_notes': annotation_notes, + 'provider_content.virtual_hw_version': virtual_hw_version, + 'provider_content.firmware': firmware, + 'provider_content.resource_pool': resource_pool, + 'provider_content.folder': folder, + 'provider_content.memory_hot_add': memory_hot_add, + 'provider_content.cpu_hot_add': cpu_hot_add, + 'provider_content.cdrom_drive': cdrom_drive, + 'provider_content.storage': [value for value in storage_data.values()], + 'provider_content.network_interfaces': [ + value for value in network_data.values() + ], + }, + ) + values = session.computeresource.read_computeprofile(cr_name, cprofile) + provider_content = values['provider_content'] + assert provider_content['guest_os'] == guest_os_name + assert provider_content['cpus'] == cpu + assert provider_content['memory'] == memory + assert provider_content['cluster'] == settings.vmware.cluster + assert provider_content['annotation_notes'] == annotation_notes + assert provider_content['virtual_hw_version'] == virtual_hw_version + if not is_open('BZ:2266672'): + assert values['provider_content']['firmware'] == firmware + assert provider_content['resource_pool'] == resource_pool + assert provider_content['folder'] == folder + assert provider_content['memory_hot_add'] == memory_hot_add + assert provider_content['cpu_hot_add'] == cpu_hot_add + assert provider_content['cdrom_drive'] == cdrom_drive assert ( - provided_controller_value['controller'] == expected_controller_value['controller'] + provider_content['storage'][0]['controller'] == VMWARE_CONSTANTS['scsicontroller'] ) - for disk_index, expected_disk_value in enumerate(expected_controller_value['disks']): - provided_disk_value = { - key: value - for key, value in provided_controller_value['disks'][disk_index].items() - if key in expected_disk_value - } - assert provided_disk_value == expected_disk_value + assert provider_content['storage'][0]['disks'][0]['size'] == disk_size + assert ( + provider_content['network_interfaces'][0]['nic_type'] + == VMWARE_CONSTANTS['network_interface_name'] + ) + assert provider_content['network_interfaces'][0]['network'] == network + session.computeresource.delete(cr_name) + assert not session.computeresource.search(cr_name) @pytest.mark.tier2 From 980392e8245745e1a030ab97eaadd0d372f3b7f6 Mon Sep 17 00:00:00 2001 From: yanpliu Date: Fri, 22 Mar 2024 15:21:29 -0400 Subject: [PATCH 052/150] virt-who config upgrade duplicate config issue fix (#14378) --- tests/upgrades/test_virtwho.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/upgrades/test_virtwho.py b/tests/upgrades/test_virtwho.py index 3691e3a8d70..95b36ec5749 100644 --- a/tests/upgrades/test_virtwho.py +++ b/tests/upgrades/test_virtwho.py @@ -37,7 +37,7 @@ def form_data(target_sat): 'satellite_url': target_sat.hostname, 'hypervisor_username': esx.hypervisor_username, 'hypervisor_password': esx.hypervisor_password, - 'name': 'preupgrade_virt_who', + 'name': f'preupgrade_virt_who_{gen_string("alpha")}', } @@ -120,6 +120,7 @@ def test_pre_create_virt_who_configuration( 'org_id': org.id, 'org_name': org.name, 'org_label': org.label, + 'name': vhd.name, } ) @@ -146,15 +147,16 @@ def test_post_crud_virt_who_configuration(self, form_data, pre_upgrade_data, tar org_id = pre_upgrade_data.get('org_id') org_name = pre_upgrade_data.get('org_name') org_label = pre_upgrade_data.get('org_label') + name = pre_upgrade_data.get('name') # Post upgrade, Verify virt-who exists and has same status. vhd = target_sat.api.VirtWhoConfig(organization_id=org_id).search( - query={'search': f'name={form_data["name"]}'} + query={'search': f'name={name}'} )[0] if not is_open('BZ:1802395'): assert vhd.status == 'ok' # Verify virt-who status via CLI as we cannot check it via API now - vhd_cli = target_sat.cli.VirtWhoConfig.exists(search=('name', form_data['name'])) + vhd_cli = target_sat.cli.VirtWhoConfig.exists(search=('name', name)) assert ( target_sat.cli.VirtWhoConfig.info({'id': vhd_cli['id']})['general-information'][ 'status' @@ -185,7 +187,7 @@ def test_post_crud_virt_who_configuration(self, form_data, pre_upgrade_data, tar ) virt_who_instance = ( target_sat.api.VirtWhoConfig(organization_id=org_id) - .search(query={'search': f'name={form_data["name"]}'})[0] + .search(query={'search': f'name={name}'})[0] .status ) assert virt_who_instance == 'ok' From 0dc8e5db569ce86021a94e14cf47f3b5fb48b0a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 00:04:52 -0400 Subject: [PATCH 053/150] Bump pytest-cov from 4.1.0 to 5.0.0 (#14501) --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index e776154c7a1..13934c6e896 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -1,6 +1,6 @@ # For running tests and checking code quality using these modules. flake8==7.0.0 -pytest-cov==4.1.0 +pytest-cov==5.0.0 redis==5.0.3 pre-commit==3.6.2 From 883f7038832ca34524c59ea301df78f09e0ad02d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 00:04:56 -0400 Subject: [PATCH 054/150] Bump pre-commit from 3.6.2 to 3.7.0 (#14502) --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index 13934c6e896..9cc9c0300f1 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -2,7 +2,7 @@ flake8==7.0.0 pytest-cov==5.0.0 redis==5.0.3 -pre-commit==3.6.2 +pre-commit==3.7.0 # For generating documentation. sphinx==7.2.6 From 3707488eb17478104f715bc5790b4a5a0d6c84dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Va=C5=A1ina?= Date: Mon, 25 Mar 2024 19:13:33 +0100 Subject: [PATCH 055/150] Test fixes for the Endeavour team (#14512) * Test fixes for Endeavour * Remove comment * Remove comment 2 --- pytest_fixtures/core/contenthosts.py | 10 +++ pytest_plugins/fixture_markers.py | 1 + tests/foreman/ui/test_host.py | 37 --------- tests/foreman/ui/test_jobinvocation.py | 96 ++++++++++++++++-------- tests/foreman/ui/test_remoteexecution.py | 43 ++++++----- 5 files changed, 99 insertions(+), 88 deletions(-) diff --git a/pytest_fixtures/core/contenthosts.py b/pytest_fixtures/core/contenthosts.py index 485591ed7d9..72f39b50796 100644 --- a/pytest_fixtures/core/contenthosts.py +++ b/pytest_fixtures/core/contenthosts.py @@ -161,6 +161,16 @@ def rex_contenthost(request, module_org, target_sat, module_ak_with_cv): yield host +@pytest.fixture +def rex_contenthosts(request, module_org, target_sat, module_ak_with_cv): + request.param['no_containers'] = True + with Broker(**host_conf(request), host_class=ContentHost, _count=2) as hosts: + for host in hosts: + repo = settings.repos['SATCLIENT_REPO'][f'RHEL{host.os_version.major}'] + host.register(module_org, None, module_ak_with_cv.name, target_sat, repo=repo) + yield hosts + + @pytest.fixture def katello_host_tools_tracer_host(rex_contenthost, target_sat): """Install katello-host-tools-tracer, create custom diff --git a/pytest_plugins/fixture_markers.py b/pytest_plugins/fixture_markers.py index f1e87d3b7f7..69f2c6523ee 100644 --- a/pytest_plugins/fixture_markers.py +++ b/pytest_plugins/fixture_markers.py @@ -10,6 +10,7 @@ 'capsule_provisioning_rhel_content', 'module_sync_kickstart_content', 'rex_contenthost', + 'rex_contenthosts', ] diff --git a/tests/foreman/ui/test_host.py b/tests/foreman/ui/test_host.py index bb4f39655a9..7fec6db1f7d 100644 --- a/tests/foreman/ui/test_host.py +++ b/tests/foreman/ui/test_host.py @@ -1092,43 +1092,6 @@ def test_positive_read_details_page_from_new_ui(session, host_ui_options): assert values['overview']['details']['details']['comment'] == 'Host with fake data' -@pytest.mark.tier4 -@pytest.mark.rhel_ver_match('8') -def test_rex_new_ui(session, target_sat, rex_contenthost): - """Run remote execution using the new host details page - - :id: ee625595-4995-43b2-9e6d-633c9b33ff93 - - :steps: - 1. Navigate to Overview tab - 2. Schedule a job - 3. Wait for the job to finish - 4. Job is visible in Recent jobs card - - :expectedresults: Remote execution succeeded and the job is visible on Recent jobs card on - Overview tab - """ - hostname = rex_contenthost.hostname - job_args = { - 'job_category': 'Commands', - 'job_template': 'Run Command - Script Default', - 'template_content.command': 'ls', - } - with session: - session.location.select(loc_name=DEFAULT_LOC) - session.host_new.schedule_job(hostname, job_args) - task_result = target_sat.wait_for_tasks( - search_query=(f'Remote action: Run ls on {hostname}'), - search_rate=2, - max_tries=30, - ) - task_status = target_sat.api.ForemanTask(id=task_result[0].id).poll() - assert task_status['result'] == 'success' - recent_jobs = session.host_new.get_details(hostname, "overview.recent_jobs")['overview'] - assert recent_jobs['recent_jobs']['finished']['table'][0]['column0'] == "Run ls" - assert recent_jobs['recent_jobs']['finished']['table'][0]['column2'] == "succeeded" - - @pytest.mark.tier4 def test_positive_manage_table_columns( target_sat, test_name, ui_hosts_columns_user, current_sat_org, current_sat_location diff --git a/tests/foreman/ui/test_jobinvocation.py b/tests/foreman/ui/test_jobinvocation.py index 0394d00a888..9a67b66e9e5 100644 --- a/tests/foreman/ui/test_jobinvocation.py +++ b/tests/foreman/ui/test_jobinvocation.py @@ -22,16 +22,6 @@ ) -@pytest.fixture -def module_rhel_client_by_ip(module_org, smart_proxy_location, rhel7_contenthost, target_sat): - """Setup a broker rhel client to be used in remote execution by ip""" - rhel7_contenthost.configure_rex(satellite=target_sat, org=module_org) - target_sat.api_factory.update_vm_host_location( - rhel7_contenthost, location_id=smart_proxy_location.id - ) - return rhel7_contenthost - - @pytest.mark.tier4 def test_positive_hostgroups_full_nested_names( module_org, @@ -101,9 +91,12 @@ def test_positive_hostgroups_full_nested_names( assert name in hostgroups -@pytest.mark.tier4 -def test_positive_run_default_job_template_by_ip( - session, module_org, smart_proxy_location, module_rhel_client_by_ip +@pytest.mark.rhel_ver_match('8') +def test_positive_run_default_job_template( + session, + target_sat, + rex_contenthost, + module_org, ): """Run a job template on a host connected by ip @@ -113,7 +106,7 @@ def test_positive_run_default_job_template_by_ip( :steps: - 1. Set remote_execution_connect_by_ip on host to true + 1. Get contenthost with rex enabled 2. Navigate to an individual host and click Run Job 3. Select the job and appropriate template 4. Run the job @@ -122,17 +115,19 @@ def test_positive_run_default_job_template_by_ip( :parametrized: yes """ - hostname = module_rhel_client_by_ip.hostname - with session: + + hostname = rex_contenthost.hostname + + with target_sat.ui_session() as session: session.organization.select(module_org.name) - session.location.select(smart_proxy_location.name) assert session.host.search(hostname)[0]['Name'] == hostname session.jobinvocation.run( { - 'job_category': 'Commands', - 'job_template': 'Run Command - Script Default', - 'search_query': f'name ^ {hostname}', - 'template_content.command': 'ls', + 'category_and_template.job_category': 'Commands', + 'category_and_template.job_template': 'Run Command - Script Default', + 'target_hosts_and_inputs.targetting_type': 'Hosts', + 'target_hosts_and_inputs.targets': hostname, + 'target_hosts_and_inputs.command': 'ls', } ) session.jobinvocation.wait_job_invocation_state(entity_name='Run ls', host_name=hostname) @@ -141,9 +136,47 @@ def test_positive_run_default_job_template_by_ip( @pytest.mark.tier4 -def test_positive_run_custom_job_template_by_ip( - session, module_org, smart_proxy_location, module_rhel_client_by_ip -): +@pytest.mark.rhel_ver_match('8') +def test_rex_through_host_details(session, target_sat, rex_contenthost, module_org): + """Run remote execution using the new host details page + + :id: ee625595-4995-43b2-9e6d-633c9b33ff93 + + :steps: + 1. Navigate to Overview tab + 2. Schedule a job + 3. Wait for the job to finish + 4. Job is visible in Recent jobs card + + :expectedresults: Remote execution succeeded and the job is visible on Recent jobs card on + Overview tab + """ + + hostname = rex_contenthost.hostname + + job_args = { + 'category_and_template.job_category': 'Commands', + 'category_and_template.job_template': 'Run Command - Script Default', + 'target_hosts_and_inputs.command': 'ls', + } + with target_sat.ui_session() as session: + session.organization.select(module_org.name) + session.host_new.schedule_job(hostname, job_args) + task_result = target_sat.wait_for_tasks( + search_query=(f'Remote action: Run ls on {hostname}'), + search_rate=2, + max_tries=30, + ) + task_status = target_sat.api.ForemanTask(id=task_result[0].id).poll() + assert task_status['result'] == 'success' + recent_jobs = session.host_new.get_details(hostname, "overview.recent_jobs")['overview'] + assert recent_jobs['recent_jobs']['finished']['table'][0]['column0'] == "Run ls" + assert recent_jobs['recent_jobs']['finished']['table'][0]['column2'] == "succeeded" + + +@pytest.mark.tier4 +@pytest.mark.rhel_ver_match('8') +def test_positive_run_custom_job_template(session, module_org, target_sat, rex_contenthost): """Run a job template on a host connected by ip :id: e283ae09-8b14-4ce1-9a76-c1bbd511d58c @@ -161,11 +194,12 @@ def test_positive_run_custom_job_template_by_ip( :parametrized: yes """ - hostname = module_rhel_client_by_ip.hostname + + hostname = rex_contenthost.hostname + job_template_name = gen_string('alpha') - with session: + with target_sat.ui_session() as session: session.organization.select(module_org.name) - session.location.select(smart_proxy_location.name) assert session.host.search(hostname)[0]['Name'] == hostname session.jobtemplate.create( { @@ -179,10 +213,10 @@ def test_positive_run_custom_job_template_by_ip( assert session.jobtemplate.search(job_template_name)[0]['Name'] == job_template_name session.jobinvocation.run( { - 'job_category': 'Miscellaneous', - 'job_template': job_template_name, - 'search_query': f'name ^ {hostname}', - 'template_content.command': 'ls', + 'category_and_template.job_category': 'Miscellaneous', + 'category_and_template.job_template': job_template_name, + 'target_hosts_and_inputs.targets': hostname, + 'target_hosts_and_inputs.command': 'ls', } ) job_description = f'{camelize(job_template_name.lower())} with inputs command="ls"' diff --git a/tests/foreman/ui/test_remoteexecution.py b/tests/foreman/ui/test_remoteexecution.py index cdfe9c7ec4e..42f84562570 100644 --- a/tests/foreman/ui/test_remoteexecution.py +++ b/tests/foreman/ui/test_remoteexecution.py @@ -140,7 +140,7 @@ def test_positive_run_custom_job_template_by_ip( @pytest.mark.tier3 @pytest.mark.rhel_ver_list([8]) def test_positive_run_job_template_multiple_hosts_by_ip( - session, module_org, target_sat, registered_hosts + session, module_org, target_sat, rex_contenthosts ): """Run a job template against multiple hosts by ip @@ -158,22 +158,22 @@ def test_positive_run_job_template_multiple_hosts_by_ip( :expectedresults: Verify the job was successfully ran against the hosts """ + host_names = [] - for vm in registered_hosts: + for vm in rex_contenthosts: host_names.append(vm.hostname) vm.configure_rex(satellite=target_sat, org=module_org) - with session: + with target_sat.ui_session() as session: session.organization.select(module_org.name) - session.location.select('Default Location') - hosts = session.host.search(' or '.join([f'name="{hostname}"' for hostname in host_names])) - assert {host['Name'] for host in hosts} == set(host_names) + for host in host_names: + assert session.host.search(host)[0]['Name'] == host + session.host.reset_search() job_status = session.host.schedule_remote_job( host_names, { 'category_and_template.job_category': 'Commands', 'category_and_template.job_template': 'Run Command - Script Default', - 'target_hosts_and_inputs.command': 'ls', - 'schedule.immediate': True, + 'target_hosts_and_inputs.command': 'sleep 5', }, ) assert job_status['overview']['job_status'] == 'Success' @@ -211,19 +211,20 @@ def test_positive_run_scheduled_job_template_by_ip(session, module_org, rex_cont :parametrized: yes """ - job_time = 10 * 60 + job_time = 6 * 60 hostname = rex_contenthost.hostname with session: session.organization.select(module_org.name) session.location.select('Default Location') assert session.host.search(hostname)[0]['Name'] == hostname plan_time = session.browser.get_client_datetime() + datetime.timedelta(seconds=job_time) + command_to_run = 'sleep 10' job_status = session.host.schedule_remote_job( [hostname], { 'category_and_template.job_category': 'Commands', 'category_and_template.job_template': 'Run Command - Script Default', - 'target_hosts_and_inputs.command': 'ls', + 'target_hosts_and_inputs.command': command_to_run, 'schedule.future': True, 'schedule_future_execution.start_at_date': plan_time.strftime("%Y/%m/%d"), 'schedule_future_execution.start_at_time': plan_time.strftime("%H:%M"), @@ -237,34 +238,36 @@ def test_positive_run_scheduled_job_template_by_ip(session, module_org, rex_cont # the job_time must be significantly greater than job creation time. assert job_left_time > 0 assert job_status['overview']['hosts_table'][0]['Host'] == hostname - assert job_status['overview']['hosts_table'][0]['Status'] == 'N/A' + assert job_status['overview']['hosts_table'][0]['Status'] in ('Awaiting start', 'N/A') # sleep 3/4 of the left time time.sleep(job_left_time * 3 / 4) - job_status = session.jobinvocation.read('Run ls', hostname, 'overview.hosts_table') + job_status = session.jobinvocation.read( + f'Run {command_to_run}', hostname, 'overview.hosts_table' + ) assert job_status['overview']['hosts_table'][0]['Host'] == hostname - assert job_status['overview']['hosts_table'][0]['Status'] == 'N/A' + assert job_status['overview']['hosts_table'][0]['Status'] in ('Awaiting start', 'N/A') # recalculate the job left time to be more accurate job_left_time = (plan_time - session.browser.get_client_datetime()).total_seconds() # the last read time should not take more than 1/4 of the last left time assert job_left_time > 0 wait_for( - lambda: session.jobinvocation.read('Run ls', hostname, 'overview.hosts_table')[ - 'overview' - ]['hosts_table'][0]['Status'] + lambda: session.jobinvocation.read( + f'Run {command_to_run}', hostname, 'overview.hosts_table' + )['overview']['hosts_table'][0]['Status'] == 'running', timeout=(job_left_time + 30), delay=1, ) # wait the job to change status to "success" wait_for( - lambda: session.jobinvocation.read('Run ls', hostname, 'overview.hosts_table')[ - 'overview' - ]['hosts_table'][0]['Status'] + lambda: session.jobinvocation.read( + f'Run {command_to_run}', hostname, 'overview.hosts_table' + )['overview']['hosts_table'][0]['Status'] == 'success', timeout=30, delay=1, ) - job_status = session.jobinvocation.read('Run ls', hostname, 'overview') + job_status = session.jobinvocation.read(f'Run {command_to_run}', hostname, 'overview') assert job_status['overview']['job_status'] == 'Success' assert job_status['overview']['hosts_table'][0]['Host'] == hostname assert job_status['overview']['hosts_table'][0]['Status'] == 'success' From b05caa50c23d8a9bc80793d212e865fb48ab1740 Mon Sep 17 00:00:00 2001 From: David Moore <109112035+damoore044@users.noreply.github.com> Date: Tue, 26 Mar 2024 11:14:03 -0400 Subject: [PATCH 056/150] fix UI:Errata test_positive_list (#14514) --- tests/foreman/ui/test_errata.py | 69 +++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/tests/foreman/ui/test_errata.py b/tests/foreman/ui/test_errata.py index 2495399be13..a2eb69a818c 100644 --- a/tests/foreman/ui/test_errata.py +++ b/tests/foreman/ui/test_errata.py @@ -233,8 +233,8 @@ def registered_contenthost( Using SCA and global registration. :note: rhel_contenthost will be parameterized by rhel6 to 9, also -fips for all distros. - to use specific rhel version parameterized contenthost, use pytest.mark.rhel_ver_match() - for marking contenthost version(s) for tests using this fixture. + to use specific rhel version parameterized contenthost; + use pytest.mark.rhel_ver_match() to mark contenthost version(s) for tests using this fixture. :repos: pass as a parameterized request list of upstream URLs for custom repositories. @@ -245,7 +245,6 @@ def registered_contenthost( indirect=True, ) """ - # read indirect parameterization request, could be None try: repos = getattr(request, 'param', repos).copy() except AttributeError: @@ -726,14 +725,24 @@ def test_host_content_errata_tab_pagination( @pytest.mark.tier2 @pytest.mark.skipif((not settings.robottelo.REPOS_HOSTING_URL), reason='Missing repos_hosting_url') -def test_positive_list(session, function_org_with_parameter, lce, target_sat): +def test_positive_list( + module_sca_manifest_org, + function_org, + function_lce, + target_sat, + module_lce, + module_cv, + module_ak, + session, +): """View all errata in an Org :id: 71c7a054-a644-4c1e-b304-6bc34ea143f4 - :Setup: Errata synced on satellite server. - - :steps: Create two Orgs each having a product synced which contains errata. + :steps: + 1. Setup two separate organization fixtures, function and module scope. + 2. Create and sync separate repositories for each org. + 3. Go to UI > Content Types > Errata page. :expectedresults: Check that the errata belonging to one Org is not showing in the other. @@ -741,23 +750,51 @@ def test_positive_list(session, function_org_with_parameter, lce, target_sat): :customerscenario: true """ - org = function_org_with_parameter - rc = target_sat.cli_factory.RepositoryCollection( - repositories=[target_sat.cli_factory.YumRepository(settings.repos.yum_3.url)] + _org_module = module_sca_manifest_org + _org_function = function_org + module_cv = module_cv.read() # for module sca org + # create and sync repository, for module org's errata + target_sat.cli_factory.setup_org_for_a_custom_repo( + { + 'url': CUSTOM_REPO_URL, + 'organization-id': _org_module.id, + 'lifecycle-environment-id': module_lce.id, + 'activationkey-id': module_ak.id, + 'content-view-id': module_cv.id, + }, + ) + # create and sync repository, for function org's errata + target_sat.cli_factory.setup_org_for_a_custom_repo( + { + 'url': CUSTOM_REPO_3_URL, + 'organization-id': _org_function.id, + 'lifecycle-environment-id': function_lce.id, + }, ) - rc.setup_content(org.id, lce.id) + with session: + # View in module org + session.organization.select(org_name=_org_module.name) assert ( session.errata.search(CUSTOM_REPO_ERRATA_ID, applicable=False)[0]['Errata ID'] == CUSTOM_REPO_ERRATA_ID + ), f'Could not find expected errata: {CUSTOM_REPO_ERRATA_ID}, in module org: {_org_module.name}.' + + assert not session.errata.search(CUSTOM_REPO_3_ERRATA_ID, applicable=False), ( + f'Found function org ({_org_function.name}) errata: {CUSTOM_REPO_3_ERRATA_ID},' + f' in module org ({_org_module.name}) as well.' ) - assert not session.errata.search(settings.repos.yum_3.errata[5], applicable=False) - session.organization.select(org_name=org.name) + # View in function org + session.organization.select(org_name=_org_function.name) assert ( - session.errata.search(settings.repos.yum_3.errata[5], applicable=False)[0]['Errata ID'] - == settings.repos.yum_3.errata[5] + session.errata.search(CUSTOM_REPO_3_ERRATA_ID, applicable=False)[0]['Errata ID'] + == CUSTOM_REPO_3_ERRATA_ID + ), f'Could not find expected errata: {CUSTOM_REPO_3_ERRATA_ID}, in function org: {_org_function.name}.' + + assert not session.errata.search(CUSTOM_REPO_ERRATA_ID, applicable=False), ( + f'Found module org ({_org_module.name}) errata: {CUSTOM_REPO_ERRATA_ID},' + f' in function org ({_org_function.name}) as well.' ) - assert not session.errata.search(CUSTOM_REPO_ERRATA_ID, applicable=False) @pytest.mark.tier2 From a5fa4582741e8562476aa38107ff7271c586ae38 Mon Sep 17 00:00:00 2001 From: David Moore <109112035+damoore044@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:20:21 -0400 Subject: [PATCH 057/150] ErrataManagement UI: Update show_count, and errata_tab_pagination cases (#14520) fix UI:Errata test_positive_list (#14514) --- tests/foreman/ui/test_errata.py | 101 +++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 27 deletions(-) diff --git a/tests/foreman/ui/test_errata.py b/tests/foreman/ui/test_errata.py index a2eb69a818c..dadcaf6bef9 100644 --- a/tests/foreman/ui/test_errata.py +++ b/tests/foreman/ui/test_errata.py @@ -234,7 +234,7 @@ def registered_contenthost( :note: rhel_contenthost will be parameterized by rhel6 to 9, also -fips for all distros. to use specific rhel version parameterized contenthost; - use pytest.mark.rhel_ver_match() to mark contenthost version(s) for tests using this fixture. + use `pytest.mark.rhel_ver_match()` to mark contenthost version(s) for tests using this fixture. :repos: pass as a parameterized request list of upstream URLs for custom repositories. @@ -654,10 +654,7 @@ def test_host_content_errata_tab_pagination( pf4_pagination = session.host_new.get_errata_pagination(_chost_name) assert (_read_page := pf4_pagination.read()) assert _read_page != _prior_pagination - # assert per_page and total_pages remained the same - assert pf4_pagination.current_per_page == 5 assert pf4_pagination.current_page == 1 - assert pf4_pagination.total_pages > 1 # total_items decreased by one item_count = pf4_pagination.total_items assert item_count == _prior_app_count - 1 @@ -1194,59 +1191,109 @@ def test_positive_content_host_search_type(session, erratatype_vm): @pytest.mark.tier3 +@pytest.mark.rhel_ver_match('8') @pytest.mark.parametrize( - 'module_repos_collection_with_setup', - [ - { - 'distro': 'rhel7', - 'SatelliteToolsRepository': {}, - 'RHELAnsibleEngineRepository': {'cdn': True}, - 'YumRepository': {'url': settings.repos.yum_9.url}, - } - ], + 'registered_contenthost', + [[CUSTOM_REPO_URL]], indirect=True, ) -def test_positive_show_count_on_content_host_page( - session, module_org_with_parameter, erratatype_vm -): - """Available errata count displayed in Content hosts page +def test_positive_show_count_on_host_pages(session, module_org, registered_contenthost): + """Available errata by type displayed in New Host>Errata page, + and expected count by type in Legacy>Content hosts page. :id: 8575e282-d56e-41dc-80dd-f5f6224417cb :Setup: - 1. Errata synced on satellite server. - 2. Some content hosts are present. + 1. Errata synced on satellite server from custom repository. + 2. Registered host, subscribed to promoted CVV, with repo synced to appliable custom packages and erratum. - :steps: Go to Hosts -> Content Hosts. + :steps: - :expectedresults: The available errata count is displayed. + 1. Go to Hosts -> All Hosts, and Legacy ContentHost -> Hosts. + 2. None of the erratum are installable. + 3. Install all outdated applicable packages via yum. + 4. Recalculate errata applicablity for host. + 5. All of the erratum are now installable, on both pages from step 1. + + :expectedresults: + The available errata count is displayed and updates. + Displayed erratum match between the two content host pages. :BZ: 1484044, 1775427 :customerscenario: true """ - vm = erratatype_vm + vm = registered_contenthost hostname = vm.hostname + assert vm.subscribed + assert vm.execute('subscription-manager repos').status == 0 + assert vm.applicable_errata_count == 0 + with session: session.location.select(loc_name=DEFAULT_LOC) + # new host UI + new_host_values = session.host_new.search(hostname) + assert new_host_values[0]['Name'] == hostname + # None of the erratum are installable + for errata_type in ('Security', 'Bugfix', 'Enhancement'): + installable_errata = None + empty_table = False + try: + # exception will be raised in case of unfound element (dropdown or dropdown entry) + # if an exception was raised, the table is missing/empty (no errata). + installable_errata = session.host_new.get_errata_by_type( + entity_name=hostname, + type=errata_type, + )['content']['errata']['table'] + except Exception: + empty_table = True + assert ( + not installable_errata + ), f'Found some installable {errata_type} errata, when none were expected.' + assert empty_table + # legacy contenthost UI content_host_values = session.contenthost.search(hostname) assert content_host_values[0]['Name'] == hostname installable_errata = content_host_values[0]['Installable Updates']['errata'] - for errata_type in ('security', 'bug_fix', 'enhancement'): - assert int(installable_errata[errata_type]) == 0 + assert ( + int(installable_errata[errata_type]) == 0 + ), f'Found some installable {errata_type} errata, when none were expected.' + # install outdated packages, recalculate errata applicability pkgs = ' '.join(FAKE_9_YUM_OUTDATED_PACKAGES) assert vm.execute(f'yum install -y {pkgs}').status == 0 - + assert vm.execute('subscription-manager repos').status == 0 + assert vm.applicable_errata_count == 5 + + # new host UI (errata tab) + new_host_values = session.host_new.search(hostname) + assert new_host_values[0]['Name'] == hostname + # erratum are installable + security_errata = session.host_new.get_errata_by_type( + entity_name=hostname, + type='Security', + )['content']['errata']['table'] + assert len(security_errata) == FAKE_9_YUM_SECURITY_ERRATUM_COUNT + for errata_type in ('Bugfix', 'Enhancement'): + installable_errata = session.host_new.get_errata_by_type( + entity_name=hostname, + type=errata_type, + )['content']['errata']['table'] + assert ( + len(installable_errata) == 1 + ), f'Expected only one {errata_type} errata to be installable.' + # legacy contenthost UI content_host_values = session.contenthost.search(hostname) assert content_host_values[0]['Name'] == hostname installable_errata = content_host_values[0]['Installable Updates']['errata'] - + # erratum are installable assert int(installable_errata['security']) == FAKE_9_YUM_SECURITY_ERRATUM_COUNT for errata_type in ('bug_fix', 'enhancement'): - assert int(installable_errata[errata_type]) == 1 + assert ( + int(installable_errata[errata_type]) == 1 + ), f'Expected only one {errata_type} errata to be installable.' @pytest.mark.tier3 From 7bd2a078e743377ea03dc400b122792d9f56fe6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 23:23:53 -0400 Subject: [PATCH 058/150] Bump fauxfactory from 3.1.0 to 3.1.1 (#14527) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index af7b65555dc..af0c732479f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ broker[docker]==0.4.9 cryptography==42.0.5 deepdiff==6.7.1 dynaconf[vault]==3.2.5 -fauxfactory==3.1.0 +fauxfactory==3.1.1 jinja2==3.1.3 manifester==0.0.14 navmazing==1.2.2 From ac4b0cfcea803c8653c4476992f5a81d0ccb4c82 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:03:00 +0100 Subject: [PATCH 059/150] Add test case to trigger the reclaim_space task (#14397) * Add test case to trigger the reclaim_space task * Use apypie for apidoc parsing * Address improvement suggestions, rebase --- requirements.txt | 1 + robottelo/hosts.py | 15 +++++++ tests/foreman/api/test_capsulecontent.py | 52 ++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/requirements.txt b/requirements.txt index af0c732479f..4964d7e55d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ # Version updates managed by dependabot +apypie==0.4.0 betelgeuse==1.11.0 broker[docker]==0.4.9 cryptography==42.0.5 diff --git a/robottelo/hosts.py b/robottelo/hosts.py index 7596411fa56..7a250069c95 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -14,6 +14,7 @@ from urllib.parse import urljoin, urlparse, urlunsplit import warnings +import apypie from box import Box from broker import Broker from broker.hosts import Host @@ -1762,6 +1763,7 @@ def __init__(self, hostname=None, **kwargs): # create dummy classes for later population self._api = type('api', (), {'_configured': False}) self._cli = type('cli', (), {'_configured': False}) + self._apidoc = None self.record_property = None def _swap_nailgun(self, new_version): @@ -1815,6 +1817,19 @@ class DecClass(cls): self._api._configured = True return self._api + @property + def apidoc(self): + """Provide Satellite's apidoc via apypie""" + if not self._apidoc: + self._apidoc = apypie.Api( + uri=self.url, + username=settings.server.admin_username, + password=settings.server.admin_password, + api_version=2, + verify_ssl=settings.server.verify_ca, + ).apidoc + return self._apidoc + @property def cli(self): """Import all robottelo cli entities and wrap them under self.cli""" diff --git a/tests/foreman/api/test_capsulecontent.py b/tests/foreman/api/test_capsulecontent.py index fe471df8eed..818a808a4c2 100644 --- a/tests/foreman/api/test_capsulecontent.py +++ b/tests/foreman/api/test_capsulecontent.py @@ -1715,3 +1715,55 @@ def test_positive_read_with_non_admin_user( server_config=sc, id=module_capsule_configured.nailgun_capsule.id ).read() assert res.name == module_capsule_configured.hostname, 'External Capsule not found.' + + def test_positive_reclaim_space( + self, + target_sat, + module_capsule_configured, + ): + """Verify the reclaim_space endpoint spawns the Reclaim space task + and apidoc references the endpoint correctly. + + :id: eb16ed53-0489-4bb9-a0da-8d857a1c7d06 + + :setup: + 1. A registered external Capsule. + + :steps: + 1. Trigger the reclaim space task via API, check it succeeds. + 2. Check the apidoc references the correct endpoint. + + :expectedresults: + 1. Reclaim_space endpoint spawns the Reclaim space task and it succeeds. + 2. Apidoc references the correct endpoint. + + :CaseImportance: Medium + + :BZ: 2218179 + + :customerscenario: true + """ + # Trigger the reclaim space task via API, check it succeeds + task = module_capsule_configured.nailgun_capsule.content_reclaim_space() + assert task, 'No task was created for reclaim space.' + assert ( + 'Actions::Pulp3::CapsuleContent::ReclaimSpace' in task['label'] + ), 'Unexpected task triggered' + assert 'success' in task['result'], 'Reclaim task did not succeed' + + # Check the apidoc references the correct endpoint + try: + reclaim_doc = next( + method + for method in target_sat.apidoc['docs']['resources']['capsule_content']['methods'] + if '/apidoc/v2/capsule_content/reclaim_space' in method['doc_url'] + ) + except StopIteration: + raise AssertionError( + 'Could not find the reclaim_space apidoc at the expected path.' + ) from None + assert len(reclaim_doc['apis']) == 1 + assert reclaim_doc['apis'][0]['http_method'] == 'POST', 'POST method was expected.' + assert ( + reclaim_doc['apis'][0]['api_url'] == '/katello/api/capsules/:id/content/reclaim_space' + ), 'Documented path did not meet the expectation.' From bdb0736f5ee606c173562932f4d59be418235789 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 00:02:35 -0400 Subject: [PATCH 060/150] Bump pytest-reportportal from 5.4.0 to 5.4.1 (#14545) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4964d7e55d5..d1a0f98289f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ pytest==8.1.1 pytest-order==1.2.0 pytest-services==2.2.1 pytest-mock==3.14.0 -pytest-reportportal==5.4.0 +pytest-reportportal==5.4.1 pytest-xdist==3.5.0 pytest-fixturecollection==0.1.2 pytest-ibutsu==2.2.4 From c45789ccad6a6ca1510273a0260bd6cf4346c7d4 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Thu, 28 Mar 2024 11:14:09 +0100 Subject: [PATCH 061/150] rex ui test deduplication (#14537) --- tests/foreman/ui/test_jobinvocation.py | 279 ----------------------- tests/foreman/ui/test_remoteexecution.py | 251 ++++++++++++++++---- 2 files changed, 209 insertions(+), 321 deletions(-) delete mode 100644 tests/foreman/ui/test_jobinvocation.py diff --git a/tests/foreman/ui/test_jobinvocation.py b/tests/foreman/ui/test_jobinvocation.py deleted file mode 100644 index 9a67b66e9e5..00000000000 --- a/tests/foreman/ui/test_jobinvocation.py +++ /dev/null @@ -1,279 +0,0 @@ -"""Test class for Job Invocation procedure - -:Requirement: JobInvocation - -:CaseAutomation: Automated - -:CaseComponent: RemoteExecution - -:Team: Endeavour - -:CaseImportance: High - -""" -from collections import OrderedDict - -from inflection import camelize -import pytest - -from robottelo.utils.datafactory import ( - gen_string, - valid_hostgroups_list_short, -) - - -@pytest.mark.tier4 -def test_positive_hostgroups_full_nested_names( - module_org, - smart_proxy_location, - target_sat, -): - """Check that full host group names are displayed when invoking a job - - :id: 2301cd1d-ed82-4168-9f9b-d1661ac8fc5b - - :steps: - - 1. Go to Monitor -> Jobs -> Run job - 2. In "Target hosts and inputs" step, choose "Host groups" targeting - - :expectedresults: Verify that in the dropdown, full hostgroup names are present, e.g. Parent/Child/Grandchild - - :parametrized: yes - - :customerscenario: true - - :BZ: 2209968 - """ - names = valid_hostgroups_list_short() - tree = OrderedDict( - { - 'parent1': {'name': names[0], 'parent': None}, - 'parent2': {'name': names[1], 'parent': None}, - 'child1a': {'name': names[2], 'parent': 'parent1'}, - 'child1b': {'name': names[3], 'parent': 'parent1'}, - 'child2': {'name': names[4], 'parent': 'parent2'}, - 'grandchild1a1': {'name': names[5], 'parent': 'child1a'}, - 'grandchild1a2': {'name': names[6], 'parent': 'child1a'}, - 'grandchild1b': {'name': names[7], 'parent': 'child1b'}, - } - ) - expected_names = [] - for identifier, data in tree.items(): - name = data['name'] - parent_name = None if data['parent'] is None else tree[data['parent']]['name'] - target_sat.cli_factory.hostgroup( - { - 'name': name, - 'parent': parent_name, - 'organization-ids': module_org.id, - 'location-ids': smart_proxy_location.id, - } - ) - expected_name = '' - current = identifier - while current: - expected_name = ( - f"{tree[current]['name']}/{expected_name}" - if expected_name - else tree[current]['name'] - ) - current = tree[current]['parent'] - # we should have something like "parent1/child1a" - expected_names.append(expected_name) - - with target_sat.ui_session() as session: - session.organization.select(module_org.name) - session.location.select(smart_proxy_location.name) - hostgroups = session.jobinvocation.read_hostgroups() - - for name in expected_names: - assert name in hostgroups - - -@pytest.mark.rhel_ver_match('8') -def test_positive_run_default_job_template( - session, - target_sat, - rex_contenthost, - module_org, -): - """Run a job template on a host connected by ip - - :id: 9a90aa9a-00b4-460e-b7e6-250360ee8e4d - - :Setup: Use pre-defined job template. - - :steps: - - 1. Get contenthost with rex enabled - 2. Navigate to an individual host and click Run Job - 3. Select the job and appropriate template - 4. Run the job - - :expectedresults: Verify the job was successfully ran against the host - - :parametrized: yes - """ - - hostname = rex_contenthost.hostname - - with target_sat.ui_session() as session: - session.organization.select(module_org.name) - assert session.host.search(hostname)[0]['Name'] == hostname - session.jobinvocation.run( - { - 'category_and_template.job_category': 'Commands', - 'category_and_template.job_template': 'Run Command - Script Default', - 'target_hosts_and_inputs.targetting_type': 'Hosts', - 'target_hosts_and_inputs.targets': hostname, - 'target_hosts_and_inputs.command': 'ls', - } - ) - session.jobinvocation.wait_job_invocation_state(entity_name='Run ls', host_name=hostname) - status = session.jobinvocation.read(entity_name='Run ls', host_name=hostname) - assert status['overview']['hosts_table'][0]['Status'] == 'success' - - -@pytest.mark.tier4 -@pytest.mark.rhel_ver_match('8') -def test_rex_through_host_details(session, target_sat, rex_contenthost, module_org): - """Run remote execution using the new host details page - - :id: ee625595-4995-43b2-9e6d-633c9b33ff93 - - :steps: - 1. Navigate to Overview tab - 2. Schedule a job - 3. Wait for the job to finish - 4. Job is visible in Recent jobs card - - :expectedresults: Remote execution succeeded and the job is visible on Recent jobs card on - Overview tab - """ - - hostname = rex_contenthost.hostname - - job_args = { - 'category_and_template.job_category': 'Commands', - 'category_and_template.job_template': 'Run Command - Script Default', - 'target_hosts_and_inputs.command': 'ls', - } - with target_sat.ui_session() as session: - session.organization.select(module_org.name) - session.host_new.schedule_job(hostname, job_args) - task_result = target_sat.wait_for_tasks( - search_query=(f'Remote action: Run ls on {hostname}'), - search_rate=2, - max_tries=30, - ) - task_status = target_sat.api.ForemanTask(id=task_result[0].id).poll() - assert task_status['result'] == 'success' - recent_jobs = session.host_new.get_details(hostname, "overview.recent_jobs")['overview'] - assert recent_jobs['recent_jobs']['finished']['table'][0]['column0'] == "Run ls" - assert recent_jobs['recent_jobs']['finished']['table'][0]['column2'] == "succeeded" - - -@pytest.mark.tier4 -@pytest.mark.rhel_ver_match('8') -def test_positive_run_custom_job_template(session, module_org, target_sat, rex_contenthost): - """Run a job template on a host connected by ip - - :id: e283ae09-8b14-4ce1-9a76-c1bbd511d58c - - :Setup: Create a working job template. - - :steps: - - 1. Set remote_execution_connect_by_ip on host to true - 2. Navigate to an individual host and click Run Job - 3. Select the job and appropriate template - 4. Run the job - - :expectedresults: Verify the job was successfully ran against the host - - :parametrized: yes - """ - - hostname = rex_contenthost.hostname - - job_template_name = gen_string('alpha') - with target_sat.ui_session() as session: - session.organization.select(module_org.name) - assert session.host.search(hostname)[0]['Name'] == hostname - session.jobtemplate.create( - { - 'template.name': job_template_name, - 'template.template_editor.rendering_options': 'Editor', - 'template.template_editor.editor': '<%= input("command") %>', - 'job.provider_type': 'Script', - 'inputs': [{'name': 'command', 'required': True, 'input_type': 'User input'}], - } - ) - assert session.jobtemplate.search(job_template_name)[0]['Name'] == job_template_name - session.jobinvocation.run( - { - 'category_and_template.job_category': 'Miscellaneous', - 'category_and_template.job_template': job_template_name, - 'target_hosts_and_inputs.targets': hostname, - 'target_hosts_and_inputs.command': 'ls', - } - ) - job_description = f'{camelize(job_template_name.lower())} with inputs command="ls"' - session.jobinvocation.wait_job_invocation_state( - entity_name=job_description, host_name=hostname - ) - status = session.jobinvocation.read(entity_name=job_description, host_name=hostname) - assert status['overview']['hosts_table'][0]['Status'] == 'success' - - -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_schedule_recurring_host_job(self): - """Using the new Host UI, schedule a recurring job on a Host - - :id: 5052be04-28ab-4349-8bee-851ef76e4ffa - - :caseComponent: Ansible-RemoteExecution - - :Team: Rocket - - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Assign a role to host. - 4. Navigate to the new UI for the given Host. - 5. Select the Jobs subtab. - 6. Click the Schedule Recurring Job button, and using the popup, schedule a - recurring Job. - 7. Navigate to Job Invocations. - - :expectedresults: The scheduled Job appears in the Job Invocation list at the appointed - time - """ - - -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_schedule_recurring_hostgroup_job(self): - """Using the new recurring job scheduler, schedule a recurring job on a Hostgroup - - :id: c65db99b-11fe-4a32-89d0-0a4692b07efe - - :caseComponent: Ansible-RemoteExecution - - :Team: Rocket - - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Assign a role to host. - 4. Navigate to the Host Group page. - 5. Select the "Configure Ansible Job" action. - 6. Click the Schedule Recurring Job button, and using the popup, schedule a - recurring Job. - 7. Navigate to Job Invocations. - - :expectedresults: The scheduled Job appears in the Job Invocation list at the appointed - time - """ diff --git a/tests/foreman/ui/test_remoteexecution.py b/tests/foreman/ui/test_remoteexecution.py index 42f84562570..307e0d9cbb7 100644 --- a/tests/foreman/ui/test_remoteexecution.py +++ b/tests/foreman/ui/test_remoteexecution.py @@ -1,4 +1,4 @@ -"""Test class for Remote Execution Management UI +"""Test class for Job Invocation procedure :Requirement: Remoteexecution @@ -11,20 +11,97 @@ :CaseImportance: High """ +from collections import OrderedDict import datetime import time +from inflection import camelize import pytest from wait_for import wait_for -from robottelo.utils.datafactory import gen_string +from robottelo.utils.datafactory import ( + gen_string, + valid_hostgroups_list_short, +) + + +@pytest.mark.tier4 +def test_positive_hostgroups_full_nested_names( + module_org, + smart_proxy_location, + target_sat, +): + """Check that full host group names are displayed when invoking a job + + :id: 2301cd1d-ed82-4168-9f9b-d1661ac8fc5b + + :steps: + + 1. Go to Monitor -> Jobs -> Run job + 2. In "Target hosts and inputs" step, choose "Host groups" targeting + + :expectedresults: Verify that in the dropdown, full hostgroup names are present, e.g. Parent/Child/Grandchild + + :parametrized: yes + + :customerscenario: true + + :BZ: 2209968 + """ + names = valid_hostgroups_list_short() + tree = OrderedDict( + { + 'parent1': {'name': names[0], 'parent': None}, + 'parent2': {'name': names[1], 'parent': None}, + 'child1a': {'name': names[2], 'parent': 'parent1'}, + 'child1b': {'name': names[3], 'parent': 'parent1'}, + 'child2': {'name': names[4], 'parent': 'parent2'}, + 'grandchild1a1': {'name': names[5], 'parent': 'child1a'}, + 'grandchild1a2': {'name': names[6], 'parent': 'child1a'}, + 'grandchild1b': {'name': names[7], 'parent': 'child1b'}, + } + ) + expected_names = [] + for identifier, data in tree.items(): + name = data['name'] + parent_name = None if data['parent'] is None else tree[data['parent']]['name'] + target_sat.cli_factory.hostgroup( + { + 'name': name, + 'parent': parent_name, + 'organization-ids': module_org.id, + 'location-ids': smart_proxy_location.id, + } + ) + expected_name = '' + current = identifier + while current: + expected_name = ( + f"{tree[current]['name']}/{expected_name}" + if expected_name + else tree[current]['name'] + ) + current = tree[current]['parent'] + # we should have something like "parent1/child1a" + expected_names.append(expected_name) + + with target_sat.ui_session() as session: + session.organization.select(module_org.name) + session.location.select(smart_proxy_location.name) + hostgroups = session.jobinvocation.read_hostgroups() + + for name in expected_names: + assert name in hostgroups -@pytest.mark.skip_if_open('BZ:2182353') @pytest.mark.rhel_ver_match('8') -@pytest.mark.tier3 -def test_positive_run_default_job_template_by_ip(session, rex_contenthost, module_org): - """Run a job template against a single host by ip +def test_positive_run_default_job_template( + session, + target_sat, + rex_contenthost, + module_org, +): + """Run a job template on a host :id: a21eac46-1a22-472d-b4ce-66097159a868 @@ -32,38 +109,38 @@ def test_positive_run_default_job_template_by_ip(session, rex_contenthost, modul :steps: - 1. Navigate to an individual host and click Run Job - 2. Select the job and appropriate template - 3. Run the job + 1. Get contenthost with rex enabled + 2. Navigate to an individual host and click Run Job + 3. Select the job and appropriate template + 4. Run the job - :expectedresults: Verify the job was successfully ran against the host + :expectedresults: Verify the job was successfully ran against the host, check also using the job widget on the main dashboard :parametrized: yes - :bz: 1898656 + :bz: 1898656, 2182353 :customerscenario: true """ + hostname = rex_contenthost.hostname - with session: + + with target_sat.ui_session() as session: session.organization.select(module_org.name) - session.location.select('Default Location') assert session.host.search(hostname)[0]['Name'] == hostname command = 'ls' - job_status = session.host.schedule_remote_job( - [hostname], + session.jobinvocation.run( { 'category_and_template.job_category': 'Commands', 'category_and_template.job_template': 'Run Command - Script Default', + 'target_hosts_and_inputs.targetting_type': 'Hosts', + 'target_hosts_and_inputs.targets': hostname, 'target_hosts_and_inputs.command': command, - 'advanced_fields.execution_order_randomized': True, - 'schedule.immediate': True, - }, + } ) - assert job_status['overview']['job_status'] == 'Success' - assert job_status['overview']['execution_order'] == 'Execution order: randomized' - assert job_status['overview']['hosts_table'][0]['Host'] == hostname - assert job_status['overview']['hosts_table'][0]['Status'] == 'success' + session.jobinvocation.wait_job_invocation_state(entity_name='Run ls', host_name=hostname) + status = session.jobinvocation.read(entity_name='Run ls', host_name=hostname) + assert status['overview']['hosts_table'][0]['Status'] == 'success' # check status also on the job dashboard job_name = f'Run {command}' @@ -73,16 +150,54 @@ def test_positive_run_default_job_template_by_ip(session, rex_contenthost, modul assert job_name in [job['Name'] for job in success_jobs] -@pytest.mark.skip_if_open('BZ:2182353') +@pytest.mark.tier4 +@pytest.mark.rhel_ver_match('8') +def test_rex_through_host_details(session, target_sat, rex_contenthost, module_org): + """Run remote execution using the new host details page + + :id: ee625595-4995-43b2-9e6d-633c9b33ff93 + + :steps: + 1. Navigate to Overview tab + 2. Schedule a job + 3. Wait for the job to finish + 4. Job is visible in Recent jobs card + + :expectedresults: Remote execution succeeded and the job is visible on Recent jobs card on + Overview tab + """ + + hostname = rex_contenthost.hostname + + job_args = { + 'category_and_template.job_category': 'Commands', + 'category_and_template.job_template': 'Run Command - Script Default', + 'target_hosts_and_inputs.command': 'ls', + } + with target_sat.ui_session() as session: + session.organization.select(module_org.name) + session.host_new.schedule_job(hostname, job_args) + task_result = target_sat.wait_for_tasks( + search_query=(f'Remote action: Run ls on {hostname}'), + search_rate=2, + max_tries=30, + ) + task_status = target_sat.api.ForemanTask(id=task_result[0].id).poll() + assert task_status['result'] == 'success' + recent_jobs = session.host_new.get_details(hostname, "overview.recent_jobs")['overview'] + assert recent_jobs['recent_jobs']['finished']['table'][0]['column0'] == "Run ls" + assert recent_jobs['recent_jobs']['finished']['table'][0]['column2'] == "succeeded" + + +@pytest.mark.tier4 @pytest.mark.rhel_ver_match('8') -@pytest.mark.tier3 @pytest.mark.parametrize( 'ui_user', [{'admin': True}, {'admin': False}], indirect=True, ids=['adminuser', 'nonadminuser'] ) -def test_positive_run_custom_job_template_by_ip( - session, module_org, target_sat, default_location, ui_user, rex_contenthost +def test_positive_run_custom_job_template( + session, module_org, default_location, target_sat, ui_user, rex_contenthost ): - """Run a job template on a host connected by ip + """Run a job template on a host :id: 3a59eb15-67c4-46e1-ba5f-203496ec0b0c @@ -103,13 +218,14 @@ def test_positive_run_custom_job_template_by_ip( :customerscenario: true """ + + hostname = rex_contenthost.hostname ui_user.location.append(target_sat.api.Location(id=default_location.id)) ui_user.update(['location']) - hostname = rex_contenthost.hostname job_template_name = gen_string('alpha') - with session: + with target_sat.ui_session() as session: session.organization.select(module_org.name) - session.location.select('Default Location') + assert session.host.search(hostname)[0]['Name'] == hostname session.jobtemplate.create( { 'template.name': job_template_name, @@ -120,29 +236,29 @@ def test_positive_run_custom_job_template_by_ip( } ) assert session.jobtemplate.search(job_template_name)[0]['Name'] == job_template_name - assert session.host.search(hostname)[0]['Name'] == hostname - job_status = session.host.schedule_remote_job( - [hostname], + session.jobinvocation.run( { 'category_and_template.job_category': 'Miscellaneous', 'category_and_template.job_template': job_template_name, + 'target_hosts_and_inputs.targets': hostname, 'target_hosts_and_inputs.command': 'ls', - 'schedule.immediate': True, - }, + } ) - assert job_status['overview']['job_status'] == 'Success' - assert job_status['overview']['hosts_table'][0]['Host'] == hostname - assert job_status['overview']['hosts_table'][0]['Status'] == 'success' + job_description = f'{camelize(job_template_name.lower())} with inputs command="ls"' + session.jobinvocation.wait_job_invocation_state( + entity_name=job_description, host_name=hostname + ) + status = session.jobinvocation.read(entity_name=job_description, host_name=hostname) + assert status['overview']['hosts_table'][0]['Status'] == 'success' -@pytest.mark.skip_if_open('BZ:2182353') @pytest.mark.upgrade @pytest.mark.tier3 @pytest.mark.rhel_ver_list([8]) -def test_positive_run_job_template_multiple_hosts_by_ip( +def test_positive_run_job_template_multiple_hosts( session, module_org, target_sat, rex_contenthosts ): - """Run a job template against multiple hosts by ip + """Run a job template against multiple hosts :id: c4439ec0-bb80-47f6-bc31-fa7193bfbeeb @@ -185,7 +301,6 @@ def test_positive_run_job_template_multiple_hosts_by_ip( ) -@pytest.mark.skip_if_open('BZ:2182353') @pytest.mark.rhel_ver_match('8') @pytest.mark.tier3 def test_positive_run_scheduled_job_template_by_ip(session, module_org, rex_contenthost): @@ -534,3 +649,55 @@ def test_positive_matcher_field_highlight(session): :Team: Rocket """ + + +@pytest.mark.stubbed +@pytest.mark.tier2 +def test_positive_schedule_recurring_host_job(self): + """Using the new Host UI, schedule a recurring job on a Host + + :id: 5052be04-28ab-4349-8bee-851ef76e4ffa + + :caseComponent: Ansible-RemoteExecution + + :Team: Rocket + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Assign a role to host. + 4. Navigate to the new UI for the given Host. + 5. Select the Jobs subtab. + 6. Click the Schedule Recurring Job button, and using the popup, schedule a + recurring Job. + 7. Navigate to Job Invocations. + + :expectedresults: The scheduled Job appears in the Job Invocation list at the appointed + time + """ + + +@pytest.mark.stubbed +@pytest.mark.tier2 +def test_positive_schedule_recurring_hostgroup_job(self): + """Using the new recurring job scheduler, schedule a recurring job on a Hostgroup + + :id: c65db99b-11fe-4a32-89d0-0a4692b07efe + + :caseComponent: Ansible-RemoteExecution + + :Team: Rocket + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Assign a role to host. + 4. Navigate to the Host Group page. + 5. Select the "Configure Ansible Job" action. + 6. Click the Schedule Recurring Job button, and using the popup, schedule a + recurring Job. + 7. Navigate to Job Invocations. + + :expectedresults: The scheduled Job appears in the Job Invocation list at the appointed + time + """ From c8b9584a9428acc66650c4791dc3c25252254192 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Thu, 28 Mar 2024 15:45:57 +0530 Subject: [PATCH 062/150] Add test coverage for BZ:2187967 (#14464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add test coverage for BZ:2187967 Signed-off-by: Gaurav Talreja * Fix typo in the test metadata suggested by lhellebr Co-authored-by: Lukáš Hellebrandt --------- Signed-off-by: Gaurav Talreja Co-authored-by: Lukáš Hellebrandt --- tests/foreman/api/test_ansible.py | 91 +++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/tests/foreman/api/test_ansible.py b/tests/foreman/api/test_ansible.py index 515d432423f..04b25f2484b 100644 --- a/tests/foreman/api/test_ansible.py +++ b/tests/foreman/api/test_ansible.py @@ -322,6 +322,97 @@ def test_add_and_remove_ansible_role_hostgroup(target_sat): assert len(hg_nested_roles) == 0 +@pytest.mark.e2e +@pytest.mark.tier2 +@pytest.mark.upgrade +def test_positive_ansible_roles_inherited_from_hostgroup( + request, target_sat, module_org, module_location +): + """Verify ansible roles inheritance functionality for host with parent/nested hostgroup via API + + :id: 7672cf86-fa31-11ed-855a-0fd307d2d66g + + :steps: + 1. Create a host, hostgroup and nested hostgroup + 2. Sync a few ansible roles + 3. Assign a few ansible roles to the host, hostgroup, nested hostgroup and verify it. + 4. Update host to be in parent/nested hostgroup and verify roles assigned + + :expectedresults: + 1. Hosts in parent/nested hostgroups must have direct and indirect roles correctly assigned. + + :BZ: 2187967 + + :customerscenario: true + """ + ROLE_NAMES = [ + 'theforeman.foreman_scap_client', + 'RedHatInsights.insights-client', + 'redhat.satellite.compute_resources', + ] + proxy_id = target_sat.nailgun_smart_proxy.id + host = target_sat.api.Host(organization=module_org, location=module_location).create() + hg = target_sat.api.HostGroup(name=gen_string('alpha'), organization=[module_org]).create() + hg_nested = target_sat.api.HostGroup( + name=gen_string('alpha'), parent=hg, organization=[module_org] + ).create() + + @request.addfinalizer + def _finalize(): + host.delete() + hg_nested.delete() + hg.delete() + + target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': ROLE_NAMES}) + ROLES = [ + target_sat.api.AnsibleRoles().search(query={'search': f'name={role}'})[0].id + for role in ROLE_NAMES + ] + + # Assign roles to Host/Hostgroup/Nested Hostgroup and verify it + target_sat.api.Host(id=host.id).add_ansible_role(data={'ansible_role_id': ROLES[0]}) + assert ROLE_NAMES[0] == target_sat.api.Host(id=host.id).list_ansible_roles()[0]['name'] + + target_sat.api.HostGroup(id=hg.id).add_ansible_role(data={'ansible_role_id': ROLES[1]}) + assert ROLE_NAMES[1] == target_sat.api.HostGroup(id=hg.id).list_ansible_roles()[0]['name'] + + target_sat.api.HostGroup(id=hg_nested.id).add_ansible_role(data={'ansible_role_id': ROLES[2]}) + listroles = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() + assert ROLE_NAMES[2] == listroles[0]['name'] + assert listroles[0]['directly_assigned'] + assert ROLE_NAMES[1] == listroles[1]['name'] + assert not listroles[1]['directly_assigned'] + + # Update host to be in nested hostgroup and verify roles assigned + host.hostgroup = hg_nested + host = host.update(['hostgroup']) + listroles_host = target_sat.api.Host(id=host.id).list_ansible_roles() + assert ROLE_NAMES[0] == listroles_host[0]['name'] + assert listroles_host[0]['directly_assigned'] + assert ROLE_NAMES[1] == listroles_host[1]['name'] + assert not listroles_host[1]['directly_assigned'] + assert ROLE_NAMES[2] == listroles_host[2]['name'] + assert not listroles_host[1]['directly_assigned'] + # Verify nested hostgroup doesn't contains the roles assigned to host + listroles_nested_hg = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() + assert ROLE_NAMES[0] not in [role['name'] for role in listroles_nested_hg] + assert ROLE_NAMES[2] == listroles_nested_hg[0]['name'] + assert ROLE_NAMES[1] == listroles_nested_hg[1]['name'] + + # Update host to be in parent hostgroup and verify roles assigned + host.hostgroup = hg + host = host.update(['hostgroup']) + listroles = target_sat.api.Host(id=host.id).list_ansible_roles() + assert ROLE_NAMES[0] == listroles[0]['name'] + assert listroles[0]['directly_assigned'] + assert ROLE_NAMES[1] == listroles[1]['name'] + assert not listroles[1]['directly_assigned'] + # Verify parent hostgroup doesn't contains the roles assigned to host + listroles_hg = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() + assert ROLE_NAMES[0] not in [role['name'] for role in listroles_hg] + assert ROLE_NAMES[1] == listroles_hg[0]['name'] + + @pytest.mark.rhel_ver_match('[78]') @pytest.mark.tier2 def test_positive_read_facts_with_filter( From 1bb1b3ec14bdefc731ab02dff90d5c5859094582 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Thu, 28 Mar 2024 18:47:47 +0530 Subject: [PATCH 063/150] Remove test_positive_matcher_field_highlight (#14550) Remove test_positive_matcher_field_highlight & test_positive_roles_import_in_background Signed-off-by: Gaurav Talreja --- tests/foreman/ui/test_remoteexecution.py | 47 ------------------------ 1 file changed, 47 deletions(-) diff --git a/tests/foreman/ui/test_remoteexecution.py b/tests/foreman/ui/test_remoteexecution.py index 307e0d9cbb7..bb82cd80ebf 100644 --- a/tests/foreman/ui/test_remoteexecution.py +++ b/tests/foreman/ui/test_remoteexecution.py @@ -480,27 +480,6 @@ def test_positive_ansible_variables_imported_with_roles(session): """ -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_roles_import_in_background(session): - """Verify that importing roles does not create a popup that blocks the UI - - :id: 4f1c7b76-9c67-42b2-9a73-980ca1f05abc - - :steps: - - 1. Import Ansible roles - - :expectedresults: Verify that the UI is accessible while roles are importing - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - @pytest.mark.stubbed @pytest.mark.tier3 def test_positive_ansible_roles_ignore_list(session): @@ -625,32 +604,6 @@ def test_positive_set_ansible_role_order_per_hostgroup(session): """ -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_matcher_field_highlight(session): - """Verify that Ansible variable matcher fields change color when modified - - :id: 67b45cfe-31bb-41a8-b88e-27917c68f33e - - :steps: - - 1. Navigate to Configure > Variables > $variablename - 2. Select the "Override" checkbox in the "Default Behavior" section - 3. Click "+Add Matcher" in the "Specify Matcher" section - 4. Select an option from the "Attribute type" dropdown - 5. Add text to the attribute type input field - 6. Add text to the "Value" input field - - :expectedresults: The background of each field turns yellow when a change is made - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - @pytest.mark.stubbed @pytest.mark.tier2 def test_positive_schedule_recurring_host_job(self): From e009caa38f8f3ff357ca0e305b8947508c89dcc5 Mon Sep 17 00:00:00 2001 From: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:29:16 +0530 Subject: [PATCH 064/150] Add e2e marker for vmware test (#14563) Signed-off-by: Shubham Ganar --- tests/foreman/ui/test_computeresource_vmware.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/foreman/ui/test_computeresource_vmware.py b/tests/foreman/ui/test_computeresource_vmware.py index a576296ab4c..82e9d0abaa6 100644 --- a/tests/foreman/ui/test_computeresource_vmware.py +++ b/tests/foreman/ui/test_computeresource_vmware.py @@ -80,9 +80,10 @@ def _get_vmware_datastore_summary_string(data_store_name=settings.vmware.datasto return f'{data_store_name} (free: {free_space}, prov: {prov}, total: {capacity})' +@pytest.mark.e2e @pytest.mark.tier1 @pytest.mark.parametrize('vmware', ['vmware7', 'vmware8'], indirect=True) -def test_positive_end_to_end(session, module_org, module_location, vmware, module_target_sat): +def test_positive_cr_end_to_end(session, module_org, module_location, vmware, module_target_sat): """Perform end-to-end testing for compute resource VMware component. :id: 47fc9e77-5b22-46b4-a76c-3217434fde2f From 85dd8bc209b9d53f6960c394d7e2173e7e8e2868 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:52:48 +0100 Subject: [PATCH 065/150] Add case for special chars in HTTP proxy password (#14538) --- pytest_fixtures/component/http_proxy.py | 7 ++ robottelo/hosts.py | 43 ++++++++++ tests/foreman/ui/test_http_proxy.py | 100 +++++++++++++++++++----- 3 files changed, 132 insertions(+), 18 deletions(-) diff --git a/pytest_fixtures/component/http_proxy.py b/pytest_fixtures/component/http_proxy.py index 8c6095092dd..a98e7409699 100644 --- a/pytest_fixtures/component/http_proxy.py +++ b/pytest_fixtures/component/http_proxy.py @@ -1,6 +1,13 @@ import pytest from robottelo.config import settings +from robottelo.hosts import ProxyHost + + +@pytest.fixture(scope='session') +def session_auth_proxy(session_target_sat): + """Instantiates authenticated HTTP proxy as a session-scoped fixture""" + return ProxyHost(settings.http_proxy.auth_proxy_url) @pytest.fixture diff --git a/robottelo/hosts.py b/robottelo/hosts.py index 7a250069c95..a5d5e2319f7 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -171,6 +171,10 @@ class IPAHostError(Exception): pass +class ProxyHostError(Exception): + pass + + class ContentHost(Host, ContentHostMixins): run = Host.execute default_timeout = settings.server.ssh_client.command_timeout @@ -2560,3 +2564,42 @@ def remove_user_from_usergroup(self, member_username, member_group): ) if result.status != 0: raise IPAHostError('Failed to remove the user from user group') + + +class ProxyHost(Host): + """Class representing HTTP Proxy host""" + + def __init__(self, url, **kwargs): + self._conf_dir = '/etc/squid/' + self._access_log = '/var/log/squid/access.log' + kwargs['hostname'] = urlparse(url).hostname + super().__init__(**kwargs) + + def add_user(self, name, passwd): + """Adds new user to the HTTP Proxy""" + res = self.execute(f"htpasswd -b {self._conf_dir}passwd {name} '{passwd}'") + assert res.status == 0, f'User addition failed on the proxy side: {res.stderr}' + return res + + def remove_user(self, name): + """Removes a user from HTTP Proxy""" + res = self.execute(f'htpasswd -D {self._conf_dir}passwd {name}') + assert res.status == 0, f'User deletion failed on the proxy side: {res.stderr}' + return res + + def get_log(self, which=None, tail=None, grep=None): + """Returns log content from the HTTP Proxy instance + + :param which: Which log file should be read. Defaults to access.log. + :param tail: Use when only the tail of a long log file is needed. + :param grep: Grep for some expression. + :return: Log content found or None + """ + log_file = which or self._access_log + cmd = f'tail -n {tail} {log_file}' if tail else f'cat {log_file}' + if grep: + cmd = f'{cmd} | grep "{grep}"' + res = self.execute(cmd) + if res.status != 0: + raise ProxyHostError(f'Proxy log read failed: {res.stderr}') + return None if res.stdout == '' else res.stdout diff --git a/tests/foreman/ui/test_http_proxy.py b/tests/foreman/ui/test_http_proxy.py index 9e3f1e5b10b..a247058f8b6 100644 --- a/tests/foreman/ui/test_http_proxy.py +++ b/tests/foreman/ui/test_http_proxy.py @@ -11,11 +11,23 @@ :CaseAutomation: Automated """ +from box import Box from fauxfactory import gen_integer, gen_string, gen_url import pytest from robottelo.config import settings -from robottelo.constants import DOCKER_REPO_UPSTREAM_NAME, REPO_TYPE +from robottelo.constants import DOCKER_REPO_UPSTREAM_NAME, REPO_TYPE, REPOS +from robottelo.hosts import ProxyHostError + + +@pytest.fixture +def function_spec_char_user(target_sat, session_auth_proxy): + """Creates a user with special character password on the auth HTTP proxy""" + name = gen_string('alpha').lower() # lower! + passwd = gen_string('punctuation').replace("'", '') + session_auth_proxy.add_user(name, passwd) + yield Box(name=name, passwd=passwd) + session_auth_proxy.remove_user(name) @pytest.mark.tier2 @@ -295,35 +307,87 @@ def test_check_http_proxy_value_repository_details( @pytest.mark.tier3 @pytest.mark.run_in_one_thread -@pytest.mark.stubbed -def test_http_proxy_containing_special_characters(): +def test_http_proxy_containing_special_characters( + request, + target_sat, + session_auth_proxy, + function_spec_char_user, + module_sca_manifest_org, + default_location, +): """Test Manifest refresh and redhat repository sync with http proxy special characters in password. :id: 16082c6a-9320-4a9a-bd6c-5687b099c940 - :customerscenario: true + :setup: + 1. Have an authenticated HTTP proxy. + 2. At the Proxy side create a user with special characters in password + (via function_spec_user fixture), let's call him the spec-char user. :steps: - 1. Navigate to Infrastructure > Http Proxies - 2. Create HTTP Proxy with special characters in password. - 3. Go To to Administer > Settings > content tab - 4. Fill the details related to HTTP Proxy and click on "Test connection" button. - 5. Update the "Default HTTP Proxy" with created above. - 6. Refresh manifest. - 7. Enable and sync any redhat repositories. - - :BZ: 1844840 + 1. Check that no logs exist for the spec-char user at the proxy side yet. + 2. Create a proxy via UI using the spec-char user. + 3. Update settings to use the proxy for the content ops. + 4. Refresh the manifest, check it went through the proxy. + 5. Enable and sync some RH repository, check it went through the proxy. :expectedresults: - 1. "Test connection" button workes as expected. - 2. Manifest refresh, repository enable/disable and repository sync operation - finished successfully. + 1. HTTP proxy can be created via UI using the spec-char user. + 2. Manifest refresh, repository enable and sync succeed and are performed + through the HTTP proxy. - :CaseAutomation: NotAutomated + :BZ: 1844840 - :CaseImportance: High + :customerscenario: true """ + # Check that no logs exist for the spec-char user at the proxy side yet. + with pytest.raises(ProxyHostError): + session_auth_proxy.get_log(tail=100, grep=function_spec_char_user.name) + + # Create a proxy via UI using the spec-char user. + proxy_name = gen_string('alpha') + with target_sat.ui_session() as session: + session.organization.select(org_name=module_sca_manifest_org.name) + session.http_proxy.create( + { + 'http_proxy.name': proxy_name, + 'http_proxy.url': settings.http_proxy.auth_proxy_url, + 'http_proxy.username': function_spec_char_user.name, + 'http_proxy.password': function_spec_char_user.passwd, + 'locations.resources.assigned': [default_location.name], + 'organizations.resources.assigned': [module_sca_manifest_org.name], + } + ) + request.addfinalizer( + lambda: target_sat.api.HTTPProxy() + .search(query={'search': f'name={proxy_name}'})[0] + .delete() + ) + + # Update settings to use the proxy for the content ops. + session.settings.update( + 'name = content_default_http_proxy', + f'{proxy_name} ({settings.http_proxy.auth_proxy_url})', + ) + + # Refresh the manifest, check it went through the proxy. + target_sat.cli.Subscription.refresh_manifest( + {'organization-id': module_sca_manifest_org.id} + ) + assert session_auth_proxy.get_log( + tail=100, grep=f'CONNECT subscription.rhsm.redhat.com.*{function_spec_char_user.name}' + ), 'RHSM connection not found in proxy log' + + # Enable and sync some RH repository, check it went through the proxy. + repo_id = target_sat.api_factory.enable_sync_redhat_repo( + REPOS['rhae2'], module_sca_manifest_org.id + ) + repo = target_sat.api.Repository(id=repo_id).read() + assert session_auth_proxy.get_log( + tail=100, grep=f'CONNECT cdn.redhat.com.*{function_spec_char_user.name}' + ), 'CDN connection not found in proxy log' + assert repo.content_counts['rpm'] > 0, 'Where is my content?!' @pytest.mark.tier2 From 64815689ecffae197b099099338324bc56931fc5 Mon Sep 17 00:00:00 2001 From: yanpliu Date: Fri, 29 Mar 2024 09:05:54 -0400 Subject: [PATCH 066/150] extend the timeout for poor network (#14573) --- robottelo/utils/virtwho.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/robottelo/utils/virtwho.py b/robottelo/utils/virtwho.py index e159a487394..b1cac0012ca 100644 --- a/robottelo/utils/virtwho.py +++ b/robottelo/utils/virtwho.py @@ -210,7 +210,7 @@ def check_message_in_rhsm_log(message): """Check the message exist in /var/log/rhsm/rhsm.log""" wait_for( lambda: 'Host-to-guest mapping being sent to' in get_rhsm_log(), - timeout=10, + timeout=20, delay=2, ) logs = get_rhsm_log() @@ -230,7 +230,7 @@ def _get_hypervisor_mapping(hypervisor_type): """ wait_for( lambda: 'Host-to-guest mapping being sent to' in get_rhsm_log(), - timeout=10, + timeout=20, delay=2, ) logs = get_rhsm_log() From d74201216487e6b056a8e52ebe80be955be01566 Mon Sep 17 00:00:00 2001 From: Griffin Sullivan <48397354+Griffin-Sullivan@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:28:10 -0400 Subject: [PATCH 067/150] Add ohsnap repos for rhel9 (#14578) --- robottelo/constants/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index de71cdd643f..9da20489233 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -263,6 +263,11 @@ class Colored(Box): 'rhel-8-for-x86_64-appstream-rpms', ) +OHSNAP_RHEL9_REPOS = ( + 'rhel-9-for-x86_64-baseos-rpms', + 'rhel-9-for-x86_64-appstream-rpms', +) + # On importing manifests, Red Hat repositories are listed like this: # Product -> RepositorySet -> Repository # We need to first select the Product, then the reposet and then the repos From da06fea37381e8cbdfa950c0927a03e0946737ce Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:26:47 +0200 Subject: [PATCH 068/150] Move RHCloud tests to team Phoenix-subscriptions (#14567) --- tests/foreman/api/test_rhc.py | 2 +- tests/foreman/api/test_rhcloud_inventory.py | 2 +- tests/foreman/cli/test_rhcloud_inventory.py | 2 +- tests/foreman/ui/test_rhc.py | 2 +- tests/foreman/ui/test_rhcloud_insights.py | 2 +- tests/foreman/ui/test_rhcloud_inventory.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/foreman/api/test_rhc.py b/tests/foreman/api/test_rhc.py index 30559fe406e..391277bfb38 100644 --- a/tests/foreman/api/test_rhc.py +++ b/tests/foreman/api/test_rhc.py @@ -6,7 +6,7 @@ :CaseComponent: RHCloud -:Team: Platform +:Team: Phoenix-subscriptions :CaseImportance: High diff --git a/tests/foreman/api/test_rhcloud_inventory.py b/tests/foreman/api/test_rhcloud_inventory.py index 76a33688f90..2eb17f408f3 100644 --- a/tests/foreman/api/test_rhcloud_inventory.py +++ b/tests/foreman/api/test_rhcloud_inventory.py @@ -6,7 +6,7 @@ :CaseComponent: RHCloud -:Team: Platform +:Team: Phoenix-subscriptions :CaseImportance: High diff --git a/tests/foreman/cli/test_rhcloud_inventory.py b/tests/foreman/cli/test_rhcloud_inventory.py index 31847984e03..ed84fd465d7 100644 --- a/tests/foreman/cli/test_rhcloud_inventory.py +++ b/tests/foreman/cli/test_rhcloud_inventory.py @@ -6,7 +6,7 @@ :CaseComponent: RHCloud -:Team: Platform +:Team: Phoenix-subscriptions :CaseImportance: High diff --git a/tests/foreman/ui/test_rhc.py b/tests/foreman/ui/test_rhc.py index f3ab5eae14f..df90a5768ca 100644 --- a/tests/foreman/ui/test_rhc.py +++ b/tests/foreman/ui/test_rhc.py @@ -6,7 +6,7 @@ :CaseComponent: RHCloud -:Team: Platform +:Team: Phoenix-subscriptions :CaseImportance: High diff --git a/tests/foreman/ui/test_rhcloud_insights.py b/tests/foreman/ui/test_rhcloud_insights.py index 2a3cabf789f..3646658c2b0 100644 --- a/tests/foreman/ui/test_rhcloud_insights.py +++ b/tests/foreman/ui/test_rhcloud_insights.py @@ -6,7 +6,7 @@ :CaseComponent: RHCloud -:Team: Platform +:Team: Phoenix-subscriptions :CaseImportance: High diff --git a/tests/foreman/ui/test_rhcloud_inventory.py b/tests/foreman/ui/test_rhcloud_inventory.py index 642bef3b84b..9c98ade0205 100644 --- a/tests/foreman/ui/test_rhcloud_inventory.py +++ b/tests/foreman/ui/test_rhcloud_inventory.py @@ -6,7 +6,7 @@ :CaseComponent: RHCloud -:Team: Platform +:Team: Phoenix-subscriptions :CaseImportance: High From 105df7226d9b7ecab110b2d77deb8a72a1c161c8 Mon Sep 17 00:00:00 2001 From: amolpati30 <151733635+amolpati30@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:56:08 +0530 Subject: [PATCH 069/150] host name & value updated with subnet (#14143) --- tests/foreman/api/test_subnet.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/tests/foreman/api/test_subnet.py b/tests/foreman/api/test_subnet.py index b4882116f8e..99873b537f5 100644 --- a/tests/foreman/api/test_subnet.py +++ b/tests/foreman/api/test_subnet.py @@ -336,9 +336,8 @@ def test_negative_update_parameter(new_name, target_sat): sub_param.update(['name']) -@pytest.mark.stubbed @pytest.mark.tier2 -def test_positive_update_subnet_parameter_host_impact(): +def test_positive_update_subnet_parameter_host_impact(target_sat): """Update in parameter name and value from subnet component updates the parameter in host inheriting that subnet @@ -353,12 +352,29 @@ def test_positive_update_subnet_parameter_host_impact(): :expectedresults: 1. The inherited subnet parameter in host should have - updated name and value - 2. The inherited subnet parameter in host enc should have - updated name and value + updated name and value. :BZ: 1470014 """ + parameter = [{'name': gen_string('alpha'), 'value': gen_string('alpha')}] + org = target_sat.api.Organization().create() + loc = target_sat.api.Location(organization=[org]).create() + org_subnet = target_sat.api.Subnet( + location=[loc], organization=[org], subnet_parameters_attributes=parameter + ).create() + assert parameter[0]['name'] == org_subnet.subnet_parameters_attributes[0]['name'] + assert parameter[0]['value'] == org_subnet.subnet_parameters_attributes[0]['value'] + host = target_sat.api.Host(location=loc, organization=org, subnet=org_subnet).create() + parameter_new_value = [{'name': gen_string('alpha'), 'value': gen_string('alpha')}] + org_subnet.subnet_parameters_attributes = parameter_new_value + org_subnet.update(['subnet_parameters_attributes']) + assert ( + host.subnet.read().subnet_parameters_attributes[0]['name'] == parameter_new_value[0]['name'] + ) + assert ( + host.subnet.read().subnet_parameters_attributes[0]['value'] + == parameter_new_value[0]['value'] + ) @pytest.mark.tier1 From 4cf63ebadf2efd8c9a68a90aa0b685a5be18f911 Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Tue, 2 Apr 2024 21:06:12 +0530 Subject: [PATCH 070/150] cu-case-katello-reimport-scenario (#14572) --- robottelo/constants/__init__.py | 3 ++ tests/foreman/cli/test_subscription.py | 45 +++++++++++++++++++++++- tests/foreman/data/expired-manifest.zip | Bin 0 -> 1255696 bytes 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/foreman/data/expired-manifest.zip diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 9da20489233..bc7d42dc852 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -2154,6 +2154,8 @@ class Colored(Box): 'option is not present in the /etc/dnf/dnf.conf' ) +EXPIRED_MANIFEST = 'expired-manifest.zip' + # Data File Paths class DataFile(Box): """The boxed Data directory class with its attributes pointing to the Data directory files""" @@ -2173,3 +2175,4 @@ class DataFile(Box): PARTITION_SCRIPT_DATA_FILE = DATA_DIR.joinpath(PARTITION_SCRIPT_DATA_FILE) OS_TEMPLATE_DATA_FILE = DATA_DIR.joinpath(OS_TEMPLATE_DATA_FILE) FAKE_3_YUM_REPO_RPMS_ANT = DATA_DIR.joinpath(FAKE_3_YUM_REPO_RPMS[0]) + EXPIRED_MANIFEST_FILE = DATA_DIR.joinpath(EXPIRED_MANIFEST) diff --git a/tests/foreman/cli/test_subscription.py b/tests/foreman/cli/test_subscription.py index a7a74f4360c..c28ba08e61a 100644 --- a/tests/foreman/cli/test_subscription.py +++ b/tests/foreman/cli/test_subscription.py @@ -12,10 +12,12 @@ """ from fauxfactory import gen_string +from manifester import Manifester from nailgun import entities import pytest -from robottelo.constants import PRDS, REPOS, REPOSET +from robottelo.config import settings +from robottelo.constants import EXPIRED_MANIFEST, PRDS, REPOS, REPOSET, DataFile from robottelo.exceptions import CLIReturnCodeError pytestmark = [pytest.mark.run_in_one_thread] @@ -276,3 +278,44 @@ def test_positive_auto_attach_disabled_golden_ticket( with pytest.raises(CLIReturnCodeError) as context: target_sat.cli.Host.subscription_auto_attach({'host-id': host_id}) assert "This host's organization is in Simple Content Access mode" in str(context.value) + + +def test_negative_check_katello_reimport(target_sat, function_org): + """Verify katello:reimport trace should not fail with an TypeError + + :id: b7508a1c-7798-4649-83a3-cf94c7409c96 + + :steps: + 1. Import expired manifest & refresh + 2. Delete expired manifest + 3. Re-import new valid manifest & refresh + + :expectedresults: There should not be an error after reimport manifest + + :customerscenario: true + + :BZ: 2225534, 2253621 + """ + remote_path = f'/tmp/{EXPIRED_MANIFEST}' + target_sat.put(DataFile.EXPIRED_MANIFEST_FILE, remote_path) + # Import expired manifest & refresh + target_sat.cli.Subscription.upload({'organization-id': function_org.id, 'file': remote_path}) + with pytest.raises(CLIReturnCodeError): + target_sat.cli.Subscription.refresh_manifest({'organization-id': function_org.id}) + exec_val = target_sat.execute( + 'grep -i "Katello::HttpErrors::BadRequest: This Organization\'s subscription ' + 'manifest has expired. Please import a new manifest" /var/log/foreman/production.log' + ) + assert exec_val.status + # Delete expired manifest + target_sat.cli.Subscription.delete_manifest({'organization-id': function_org.id}) + # Re-import new manifest & refresh + manifester = Manifester(manifest_category=settings.manifest.golden_ticket) + manifest = manifester.get_manifest() + target_sat.upload_manifest(function_org.id, manifest.content) + ret_val = target_sat.cli.Subscription.refresh_manifest({'organization-id': function_org.id}) + assert 'Candlepin job status: SUCCESS' in ret_val + # Additional check, katello:reimport trace should not fail with TypeError + trace_output = target_sat.execute("foreman-rake katello:reimport --trace") + assert 'TypeError: no implicit conversion of String into Integer' not in trace_output.stdout + assert trace_output.status == 0 diff --git a/tests/foreman/data/expired-manifest.zip b/tests/foreman/data/expired-manifest.zip new file mode 100644 index 0000000000000000000000000000000000000000..8737ba42db2e0cb65d4d9331057d690fed1c71a9 GIT binary patch literal 1255696 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
o^q2n69d<~e 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%0A}qzaP}M`bgQ`2VXKNTid?6{5-tk0CO8|uC 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�Zc?=p) znuw)UGavmlKu$sy8;Yl42Mp!Gc%&5=1n=h-{4^3OKL-fScjzLttLV^u(1QDOs011s zF`~@0(11Dp!y9Pztg#~A({tefxjk;^ZY`l}?9B%_F*{z_!qbUW|zGI9F8OXW=- z4if<#S|T@=#8&HkV=FJ2(JQPA8yXt&$l?i03Z#aw#Z#{i4rvLmBK-_@SmLkH541*i?JINNH%GC4Vuzn}0tFnb>0^uN6>`tBt}d zW$@OQ)_mqfhz@_b1TtgqlcBN=Dj-aSnD<<8=sUu_{z)wn-pSTnsjd0~U!xMp`6IIg zO5%r%>^iieW}0=wlMZT`BMr}O-*)&ItSQxs{S@a%XvT7%ZRwQ@DquFnD^Df+r|_+X zDvD{Zm85Sff?}NzB>d~OTgu7gr9fdRb`MWZ{z~@f zj+Ax&3Du~e{$jA&Whg;wH+K<`QJV%tW$3)rb#Lb=Vvb;0Up4%@TAB5@zW_{^ds40oIX#*+V6|iWYi$>e{f=819!`?F}6RczJY~2xl zt>iW9tC)~utD=#^-KuGg5-fl9P-%Zy{)2%j?!5ELibfb9*_pTQ4N7A4x6%y}e>_>b zPgiI^Pgo#Kd-iP(g@q(=#xV$1muJ)j+&Uav=%HKRIg_G=h&XAOW*aIdDi}kQ1(}wn zwBkrqDqV8;>mm{{cZ{$+@W|{M416<{r@*99TuT%uEL<%zDz2yh*-s-PU0ju8LqSE_ z1#@Ja`J3a=re{nq3vY1=Zw8Q#O5@~vYI#O}4*Ni)ZdS2rvLGm!KPmKTg41Os?-h&R zbv}(Ra(|sS=`%(Wn=f4lcp+m$7emRhxHHp`@PTU;^--AnEw@LLPktM<2B+GHBG)_~ z5E7>L-m9)wf~+$%0&vB9yQe5`Sk}FMRY>?%_F+F2$Csex!nGM2xQS7k`SknRAaIgt zE2CTYFGv{2>j~FsuLFKw3d*Xy2dRiu&sf9SoG#HB_DkKQiT31${~WaV8SL>;PcV2} zg1m?lf(Q%-+;%j$5pVu}=~DdTa_gDzFmXL!p}2bQA{ObIV}5iBt8xc_91<+{AIf;S zru+U1T|oL>blrJ$CV)PZ#@^{6a`sgg^BHuEg+UReB0n9ZKkTXx_}`+}IEJ@qIwPtu z!k7ZIt>;t+)tM`;gvQc)TkZ38w=&6(9#&L}-*~QL2)B)BSFabkcdJrDR=YhIbmrCt zd^|me-U4ojfo1P!@G6->QgW*!=Gcthkp42P?+%j%(?SpS-zmeP2VM3D#C;$)T7Yyh zWh@op`+6g?N|?^xyb)^@wi9g-b!ipLUCi!nb+4n(M-`s%2#*70fByt_mG=cG#u-Mc zWAJ7!lKa_dlYf7 zc+n1mk?QYCz*vKM$p5;$j(-i`inj~mxYgS2)V(nto|ln!mwb`5{FIu2{m+ZTi(OA$st+I@wv$;T8#xjPt*-}LymM#;!1O7 zZt9H{2VrI!sMa81y2z`Fw**q&@a77n%sYMXF(aq8S9k6x;JY6#ll~y4KE|wDygW7+ zF0|s?drH7QL*{*NMM_o<^T@7o!xWdQA?zjCj-)^Sn*h__ip}(H8|q{YWr24Hxurp8 zjNq11y|{m&0p+~Vx}Yvb(rBK|a_)O2Ab3~d*De4&QcCcniFdX$?Jm< z5>83E6=xF34}|ht5qI``UYIZmh!QA&L_w2^lArcY5x;k1P^*w~QT=EM^VCqs>TsvE zpUid)0{$85a!)V>p%ANIZ*4z-j@Q}_XWjv0niD*s0>?`D{E{vDxx*s8!Me<- zmZ8nvqnJ5wcN8)5wFFv69i~+}2GFCYp)@d1h+ou3Q6=J(A?1Q~-9E~`?R$B1_h@+B z9W~~%ml`7}pt=E1x2EDM9U`8*3!E=xw0z$tN%UvEkNbK$(EEsyg?&s%*U( zi1F5o?gG5W9;PW*Rjcji`s$wMt?<@H(L1W&)RFSVYojbfilWt9e$`*zN4)*TP*(w8 zz6EK(J4vkB58fxj=LVi5o>Jt$T}oe!CBRWw|5krvr}1Sgh<gIA!s-9_e1&?A4dk`0z3g{^z{Pir|SYN zK}H+R$lS)0<*fRU=BguE^bNeUrR&>i?JzWKI9!b1{f^>{!RFQKZY5|F%B2Q zp3wxtA6SwP z5X$d85Oswqicj7`*36p%r_0u-n~%^j3xxPAmT{8df?Y+V0MZic@>Pb=ix_k14?sR7 zDQ&MN7TdJMkJCb4E11vi%qMGVW!0-ha%E=latg8cJa9ll-R@W$j!#KS@Og+0( z_A$qdcz&hTVhP-(xi|=*qWG4Xfa|XV$llCn4{rnlStI&YLmZ^u@FAY2r_mRVX3+ZE zvhNdbzbX@`rM%yH)3~VK=PCN#SsIu^gr(&0ySPKT=+b0vXVG#(h{)eaCB(O>P_D$d zRWFa9xPJ4-pv)!A8I2=NO#w1Mg?w_&F+W)PJAWrz>68bV)fe`SL8GA0gWY>TQ$Yx( z9N8199!qHVA_9wkMoy{02(ZJh@ap_>1DlsK8pZ8EQH{HaMcuppJdx&n8&5Ou#(y3l zVcqW7U@8fF?4ZQT+Bpz`A9I#dD(}(!BJ&UXEej}jw~~0_9-}!Z@=a1Ly|-v?@c$S4 z(LfI_1U%|p8EE3)iN0#7~CJ{e>Fgm$pE0~q#^8aS}#=-=|sUKwX0yxci&m2f} zs(7i$#oq-GXS1@|PFVsQwRAoBp3VN?{_4L*laWuEO6cOsan$5T56Z4--&A)Nw+(LbF>Bq)negi}X zdUJDkeQMMAil@;1Ziy6zEF2&d?akdta?>=SBwLB}!XCjQQG}wRJ8ZmP1HveUC|xlUs0>1a7_x~3N9w-MSK*}Kdq+P`rXt5nrOh^r~>U+he*+e=r|$7#u0 zTSomLN#}VL4R`tW#>8I+wFCveP?bR^0WcVKe+ChChd;7#W}5nd^2jtRBe_H*(U2aV z&^ups`DCa^Cl-?(6V40FC>Ale7k+@?rAqX)x^+Q*jSywryw^<|R{3I0wmKM2!^+br zyno(L!1*6$+fvou6#L6|_^T5+5cI_)YhP86<78B3d|jt+LwadKAe#S;)6yx3pJRE* zSS$(MbjIbSV5_wCi#PwSz6DxyeI(UBpMgcD^)dyCa!FEOuE=-iW6CKn-5Qd=?kI=Jtc(ekTeCR`s=EYCfo%jBh?()DnB zA8B^0to?bmFYL3oXm^BUfiG0zc-uFsK5%d_V( zC9(5W?A=_BVZeU<;A*O)y^MaSuia@S%0ZI_`29uA?>FIfbFQnWG3qa!1?OTw1)M24 z>n*7ly;=^S@h=Sj7K^um%MMe!r;Qif1^Hc1Uk$9U%>x4i%4G>X)eHmS>=RIu@!Ejh!%c;V=`yqwS_@*f@Qje;3SiaKc-;%5O5j zvTl>bXoBMf_7M#_2u~|xA(C9wyA7PV`)rt-{@w>a{0fQ5itZ#Ln&<^M1{*sA0XJu8 zMP1*YQmo%3ak;AkTmuOeWM% zaMmeGOt5ae`3@`Eus=#>GmA3{y)m>LYdXteCi>dP+sKCF$=T-fwB}m|s6$#6weW&) zC<<5&>%wWm90F}qqGIkR=@I+k@GO?3i;rxa9_t~k8X*_9wo{zV0-{)w*A2t-O!-t% zlSh)T;B!#Xp1>+Ge4-o6Zi}+!${Vdy&bMe6;sfH-HJa8QhS zRpo+Z(bnA;q#~j7u4g}#nUIZD`q4fESHbri>3r_&fChDOE9Hu{?tdTN;LkjY3#_3q zfvgNl+Eq)(`Bsa!SGBbzl+gT4Htieg#xJUh^Rs>rBflVUqUUb?kdYlM0|S=eV_b03 zI{`1T*2kQB0Nie|D2vP#4V0i?lwf4-1{R$)F25{|AhY>snWlI9H&^O6wSa4v_oo~V zv-5_--2zOU=UY@0Z;yqERD;`}B?}_@qUBE`jlWBj1p=yYe$yaZ8+}=9LQ`<*j5Lkg*7?EG(=a}Z_EBk%eZNmu_mJf3FJD9Eb;f?5W%$5qxb)g0U9-=V%jT@?I{WWY7z7WTw%?QhrwOMj&B8K?GNj@_oTX zj}VvdPd+8k>c?lMGj{2f%hL!yo>oH9c70v6=)?9uuFhL)S#ArXJ-0$ZP9-@bN~R-c zlpL=9@P2=H3LAAOxc6GmoWsp#xkR37{KPKLO9E7sExpo2c8^daY0`!tWOb81O}5lW z8*DiYdu2J14sL_)8=YXVQ)_Q&`>uS=TOSb+ljW7&1L1JUu4sBR`Eoe}S@+c1MIRRFP2WQHwnJI1roJy`ORQ z2A(Jyttj;Hx)4duk>V9-(&Gj+q)we{8F>FlK>H|5j9is}lJq=uU}~X)fGkFyWM+&*wik@H@;hSK5!Id> zerK^PX^@JAFS4PW)xfBKt2JWMTP?rmyDIBpmw0WS5U>9X(q}jFtVFuaCaEai>`#R+ z<{{tYCe=*w#;*z3I&B}r+9Eraa3lqnevgQnp`xp3(u^j4h> zkjcC6V@&48ly5T?2U@JkY$QbS16?BXOCrD#rWMA<7$T2n2a^bta(;Io*}L?!Y@nhF zw@6=ed58a&2z(KZG!D=X$N;m;XXv+{XJRhgaO)%OOifcNX%i4bCOcHv6$eb^i`mMG zz&_Buf@bQo)b_h}#G&w{wCy_}U~jr#X?b7F3-ph@#IS=dtq=W>6GR~Z^9=|T!^nBQ zsTQa85VAsy#(Wpra0vCVr4RQ^oL4j_V8YNpzTBY0G<=l&_p0j0-qBw?+ujwj@FXQc zXIO?IJ{){pzcrTDwJCHxBGORC8v?}2g9w~H-H6uiT_TXjc?W(!^8LWjdY1wdqkcCY zDFhO}`%S>R*qzY-K_gC0KD7GSGSm>V`37Pm7RZ1MazF_{{nEBz96BiWm3utOpP&dF zWbmO=tf-8FoDJlM1%uKe%_X%Eonx119tIlfbMthJ)j* zxT~|g==|jmeIE}^vnqOGsjf{P+H0R>Agp*}?US9gUdS;YeDH!9I?*BCf!Nupk&Qq$ z$;Frx-r%>{Q?=r@-&l6Si;!BDb%F1|=Teiuf5U#FSS3)xM3cLje@$brq1nO*ymx0) z@A#QX(y4f+ab82;a0%y&DJc_>^s;~7QZN(Q1|f-+?MH_eL{gn}Si%od9?-DR$Y9s# z7eP(5@RNPqB0EuZ3SILZ$mx)S_TuL;43y0ng$oJ9V-O?!#+;l;61|~|+ON;O7fbFZ z4Mu&Y;%=1?Tc^+2Ab@`zA|ZFT{^plNGx=||!HS!)a*DpIOo{@6=S(^cBmBp3*)Qsm@rqO~+NN;xW2(!M!XIq`Ia6gjk!g*M|&591@QF(dV7= zB^c|&MpXtN`y|<{sx}t5g;nzP9t}&yzkV$UzQZ;~+g%HWI_#adBq1-A3L?iPS~Wgx z6+IfV1w2mkXL0$C>FjGiGb4hpbH)45cNIgOCr;o4-4ga6;;HiNa%FI8_jl|>e6&*M zy-Gm;6XD}^{UpU-XOlFxZ>9HBoj}g)qiCyG!R#%;ir?LOIB$5i--Rdq((^-D?KD9X zAa;S#p82E$e>}e7Cd==0g6Hsx4+t3S8MaAy7yRzW4tnjAr2QUW4x5x9B zY7=DNhtZ;ISuddS!4a2hsjz}}pP^z9`;iEhmLH?J!Lk1C5q=Xyc>(iT)p2drt->8_ zuXB8gcT&|*=n$U%4$C8KxTEajSKfne;WpLHm%RKI{Yk7pPHX`|9N_0Tn2DhVy{U4) zoD(j$qWNiU9@1@fYBE0A6$yQba&}+!|`wMXNElxn_g`=*j#?qr@(M4`=0sq7Wz4cVE1s_fYi${Jl>Ov7-Y9RdSt6L7mDzc-J;=IRLLJM|C-#snt{4bd5YMqznQ zOOM>FM`!55>)W=aYhEOl6_y3?UZslUltHj#uy=!QAbm(TIMSnEbe67Dszg7aYC0`V z`F)ycSB%>vqBFB;ee>mdK&jr#hLf!7stMay2)jl4cyxR`aytDn2KpVt59Vt(qfJ@> z)7cQ(RQXBdk8o3NjRL7WRL+$yyY38*;Dm1bzKHFosaX|;R7-aJ6!+|vn6HOVQt36k z>MbflA*mF}Nx2kAH1_K=$){51pHw9{!TZU|u9{P?BHAz<^yzOrrWqm&rC&J%185pn>mRcGeHyqjsSnIrj zkN5XIfgmul5Es5x`7GK;{idqk-7U{Jl73O{WZaad51D*Z%f#v6L`d102dq$4>Nj(Z zWT<|CmpfJ4`(;w|7u3^lOZVh3HBrt4g(O|cnatF+$H-f9^$Rj4ez|GMMz>?Tg{MRN zz+i7oV){>?>_44*{$TQ_itUiM+p*%fSh}^-=*S|sTX%KK7QI?5exJR&nCrJOdmOOc zI-v+W^~!8dO0`YC=1lrW_vv}h5l45*s-l`Lah}{?pduG>Ueg1A4>@Ba>4PbNN970> zB{#qfbX$pm1Q&_z;+=X6k%}K8&(o?{PdaK|^FHdh=Yxc2LEjC5N@hkCfTB+0BAOu&UkIX96js*xWR<7)_<8L18JE;m&r1so@>eUO;9_=I2s>4uTi4 z@WE}QL!v!BObOk0f572q&e%$Xqwdotw|JBEfbdRZ5ZEmfhja!&tWf1wHu)-VI$qw0 zf?r_Su_iyFpINBxh5;6Mqo$%5Sk#VaR4J_lEWz~`I;vL-Im$|qj4fw6|xMrK32KPJm}75{bu?v~rshzzy*+cNh?M1Ui0_4|D-nGv}i=)RkSmwW2O zEj@88gxKH)*?L1~JuoHp?J@~7(z!*t>&@#9*J6R6T9tbGZh2YCa4~A}+fCkY4oVvw zl4WPVXc1zTlpU)uwrmERY@A83mty4L2}KbFFmITpk9S&92+8XlJ4m+2Egwy}FQI-Z-vjHJxr-aP2C5yhqIkmgYw7mreruS2lLR)j#L{OXQ?IxN8 zEL*^-5|oPw87s<*2IYaih~)E~)GOn$M)WRF+vAOrm4=k~fcav3EQG$k31*=)B+9Ws z+W1fDBT?Z#BXprPa6Sjm+Ambo1*xH6nydutpx#2S-KkDU^1W_D#YF_Pv;rHW_V=BA zUldn&_}@*=Cl-)8)uxn*BU)~Odw~d^k_26D=|7LMttcBMk1QLQ=ovd|IM zQ-^NX^~&~)!WVa7obxFs|0OP;1|H?WAo2HiI=9+M^6*-bEJ7h?{X)^?hQ@|f;+y&& z;a=uyV4=wU2=i0sUeJ8l`9X>w^Y11)*Js=s=j>X$FbylXn+A2Rd?>>pR11>mF0SC~ z?+CbM2=2*_rk9C~v7xLK*SW2gdSKxrhtb~&8;c*5kbb3rzUyz^9<;LtRw71%UfdO+ z1jHgohW;a%^LkJDb@DIw)k|UJ%L#qs@pRZvuH41|zYU4l8544Ay5w4N|0$IH14fFZ zer-CTPXbfxz)_P7Ly>?YsFh6BTc3=mR~?4PP)TMiG71j{Em`ulSMv)~3^qfEe zY^v}mwHA-QV*L&JWiPUdG5JkGYrZ)=(w96k{VDufUDoCx0!|TWy(AcbxSB_R5hXMf z#e|CR>B1vQ?56%E)>0dv4|&gC7bpdUynb16@|_Afen(E|`nII^0K5ZElu|a<8DmVQ zA3sgqv}x0nc0Wrk5|c7i_Bx;0*e*-S7v9_bnCR9!W?u<85+1-W=*B9Re?xU>T;`Y+ zNxdCu&KPS}o~mTM?PU=W=UuX)3&<^N*QLFq!U#n9^UN^|sJ<$q1O;FHk~ghur+yAM z@_I=~dDRs&E3hc$Aj5I+X|&Izx%P~$2?4w z#>#LWwL4*aZ525>(XQe#6^y4$Mp&X;Fb8uu=)HiPcTaqPM;KC?9{bQ?*m0VZ(pR-G zFO|j?Ott*Q!vcx()CvuhUKs9xM|J^v$uFA&pyFkjp20la5_em~7r(1}?OM~`V)0eF zD8d~lJC`FV9!P}4=_(aPwlRyK?YM~{8$d2`$w1o*h=LmYhWK75Om+2i5Cr;}*o5{! z1yV;@NSQd4gSL**!3SGH4-GRuYbxL*?t`?^*EXfxyY{f9+nmX2*`deWP{>u$rGsz!Et7UP=DivFY6E73egrUg_$kay@a+j)@CgI0M#7r?9tTB1&bWD-XNrL+Rw8-H zF5wpQE$vbe3u*z34hIDyT=e=5hlB}f-xs8m$|_h)h=Nu==ixai5RvQ!cCQYRN<^S! zc?X^uRx&pToK^@WC6fp7L{*K@?kOnXiNKIlw4O63Uklczw*Pzi{c2Zqh+dfqkwGE8 z^sQRc7AW97wOr^+UMtdl!WUd-#wc`t%;5ID->whbH$(5gLSH-YZ{-A?07Cjql^)=9*uC>X z@;w|3bsjZ;SU-l$Be2mo#@n*)+1~x6#LxJ^Ye(dY%y4e<^&sct^P@5Vn+{g<%JO+1 zzB5($#jM%xN%#%fCs2Y;Zl_P6M4D<&n#7wUXhaaWKXAdVe+%k+2`I;^aZiYp)ScgQ zIB(Ta)NVGqeDYMfvUlM9BXO<}p09mCejr`O0cm3#w3g`^ei;B%D3r`C8r<^E`XIE8 z4F#m9uLV08a&@0llICgtO-VcI?5EHwjMnp3Y4@9)xC1PK@taQXe7`_l5?uzeC$sOy zJ-U>c+T9T@bKY-vA;@;Fekw+2y70>uAEPi1yWexnK*dTBE_ct4^js6_4F znBW$r)WQcf`7F5lKh=PIz8{>;S#46Ml)zb)I{&WIqcAG|a(J}hxz*Cdg0te)Y z4hB)Qe3`nb9!_gJc4(1DRUpuNy-A}F$Xm-}AdF#pzjx-;CY_}^kMz`)#iw!dp`NnR zdvEl7MZxGsFKT=|go<{UZO7O~2a1`ZU-@~x>>baAE6jh-Y)2h$sN2}rCWi8_7J(D< z-VNr9U*F+@V&xZ|lk4?fLg7Gr<)610tyQ63+0wY77@_ab2%Nrgeq7hC;@@I!ad)0+ zevj{j6Pr3qo)#>8U&&8OfX6F>>n&-!=w0B*6Uz|>-{RD7kPzg&X7pDmn8Ur^4tc)8leJL3twj$|EHnCI<~dr{_Wcii<& z!mHXk^6SXU;H?huds?z)?#!nd@Yk;fC(`m#_%{t!C)d=*A_36{FF*K9WBMrYX)8R& z%QBCkT%BMJ3Ak>j%vF5N`%9*)oiE*P4KfvYnbQHWVK6}5 zW7satuvfski-lgeRA=_5R|_UrYz+9l(&^K!hLE=*yRgJV_JrdRbfK)pN7nq}El9Dn zyocxuXyKS?m^bNW_qQLl*(AHr(U7QjtgH(Z`jt*cbm&8I+n+9rWDa7m-XYEK{b0tW zw!rq~V55DlCrkg*%2Qh>hS#VuMlx_USpLYATsTLC)o=DAI;OFQE?zq_X-ZDcxrhm{ zPity)%@Eje*4kgh@oq6`wK1U~XSr-~Vda#(&!}PXh4I4c8~6G=gdAl$mkL`5(7Ud9 zi5;N{JaK6$u*rd zn;A~-|3EgkkWLI4b*_F?R+S+zTLP`vLhf#x4k?Ud6D<^-NasED*BUphzz6>!XIbb6*59X4v;MVT9#FH^f z&Vl0r6F>Ic>Mn_PsfeYoGyA~5b5D8hz3><1zf!*2M|%Y3sv9Ku#LBcCibayIccP#- zHf}iXZQrBA&Nfbr9xZI^`+e}2{W2Uc#C$)e$}vCvfJt{LrC!Pv-Uo*7#Kl-oCY4M) zOAZ9vLJXf)Pg77KeX);dlxL36E^f*6&u74X!+?f4y%FO1GZB8Xbkcpzydv{Gzc{pv zCC7wV*p8wVk4v^0*XH~dKhqKKpLH=0oT@M2M%9|JZ{+y#o-2!A+g|%mz(axxZHqQT?`^0qSJ z{Q`e`FfQeH$AcqCM6x?GSK)E|t2%&W(v7;h=m0vxibsmZ3-a~*1(tmVNH=p+s^9jo zk67%e_OLb2{MvDxwrD|&K-UBTOu$o?gA`08zHbI>RHk)Cv^(N&X1!G9JquYs^zQPob;@buB+1FzbjP%3%~qIeO$OAEO?L`+da^yE;ofzYMOO>4*9L^m0?z zYOPI6%|FsPLS5kiZe_nsFWrNN0KZVKFWi?3PUd+IrN4OdgiH24=Gbs7Qi@jCiF0j; z(#-1e$mH_x4rtaVej)Uumf90sQ2?=%Y8&U~U2WsZr2ZKKU1d-o{64^G{z!cwG-WZo zy38!8e;L47XUh})N8fE~HnQSD!-G8~vVSqOC$qG8O4G;w{1#5e(BtVAOYH}_xJmDy z6GUSLyuQ{J2Oe#1-C6fV;7Qh?k@UjH3z=YjA9dM!*YVw^RquS+3U^#}1#9up6_W=E z8W_QVmpVfkfAkzQ_ZinGwn~4St!2Ii^^1Fe74g&cNU^l8&&*&O@$D!+uj~wKagPB0 z5t>g!=yxg(opw&bLiCS_@<|%0SI8;-2bOuQTp2~Rzt!eoFNbY?TQl2*72ie*C^KRIJ8p>M%H$1>5Ek}G@Q9{t1z#W8np}NQqH_uZ!DJAK3DtEsadO&}iI(jnRNPGaz(zA6}8smD1 z9(JNl8yI(F|Is*r8pT5Mnn^ z%AcG6?qlUkldulv-Vrd-;Gz5x&&1RHQT|{&H(O1a{CGu7!T{4zZQT0CtS50%lfz5RFucFheB$1Yg{JeBq$C#`>l_} zUmbHAp5piQ-IqAQ=IQG@06ejgU3#hq|GjQKP8-u@hP2+P5 zo_!>CvWrrfbCCmI0t-CDx5y7K*RBQUNWk_bzx5RxEKQ?7vUi$O5 zh8>4A^bs7ht%oj9Y~7afp|9DC7=tiz?qj-G7i+&;#*$*>QhQ8ZaE{w*PBrrEl~vNa zNxgpbl0~0PAaH97@{%oiWXBKHyD1_h%?FE>lGdF!{1f|qM;mqWJQYRo_$mr2K*thn-W)h(q|x{MSwJwLCg?oWqR2yP3eJkMj_^$WdvAlEL+7Ln*5&X zvD>Qm5RNS?-|=EvS#^BhV`~B3+e5B8tl9-6{no3dAM#t|X^hp9UAnlv&C~Ag;ww`J zd?S*{nbXV%GLD`&;bS2TWKyA^S{j>hD2_GVN$Rdk}jv zUt8Fl>(2CeCLhYII)GL!dEFDKgHmp34&!$5LnxcPnsZRogCQpNI8%`oey`41`fl$f zWhr5UoG8|0;m6*o91Y10(aItm!S0|IHX`tZRT^A*I_q01~RwX|0dBE^3H@=D4@vz-| z4J%v*ytI=3sM&B)qZSAF=Qlx<1D|~l$IZrKqp-h(v5>r|w%|rGwH7(hc<tk+c*kJM>DC{dz9c0_hkwxX)AqA7_0|Q zUed?xo7Kq=(Yq&1=(TD?5O?P^tRtg6*hQ+{ht3B0{a7&cO?S?@I4r~%+hIewG zrA2}W1Ww->LN7A%)!#6e|w_iLu%1Z=8d#_jfl| z=v{cNc?ZoQ@ZT7p#7L60`px?{{q8C*aB%M^}Gm)#=J;Jhd$8YQw zk+>U^VEzO(Axm@?#teylzglOeM!+*32@%0Y^1s>Hd#lNvk9U|PYl-vf9#j(C_mPjx_qNv7D}PP5cL#!abF_+| zuDCMew?Hix-hsu9^e(j~kl*2y<_~Hjg|_v9VKc$krRY{i^eU65RMKX=u_ITg^B?h0 zi0``tcAMEQ1**N?De&FU{EIQ)KB&547Kf7=eJmNJxGcVyzkla*Xy&7N;t%8Kq9~|# zHpWlBnH*0vR73*a?tFvlwX7K4@lKticNXayqD3d7Wkc++w?@Z=Dpm`z!r?=C{6{q` zRlRYV{aLaP2vjF^eb07XBbIBM+s3Cu)Nw8ent=?eaHS|+SZjUT`LLyTIqQl0yHTb* z@gi0D2@sBIyg;7>sWBH&3R0?D2RF*2m7XRfj7m!Jo&&^$-}tMU5-MT@wgahwRL5e} z^A@PR$;{r!n?k_gg2qRVu`9O2m?|ZBOQ=*qBhnsFcr41Ivzhh@-=tl_(P`|d55nq! zEcl~p*qoGAXC#Oy{ZuifYm@GiOl?*@TFj$r+^mr&7Hs7%Oo*~;#dR$9BUAYrC?Y#4 z8L|>ecc7~{s1@o_hy9a$(~(2AuJNN;rRf2VVaF7$Mqb3!Ir?ZS2c+Bt8rZZUSFjbE zp#Ie9HMofZV?XQ?*)cVi%!hqT?8NoVVpQ6$Lk&v zzA1b2qdJ?Ym9dAF=x^(MLzm6LZ*5}rB1=9&q|$11dxjg_Q*YZq?fj1K6zQE_|K8MY zeN@CEzg5eexUTqVO*6KgWiLsnSNE~*vf~GQ0!?#@OS!G>4}j9+Cs22Tw4==DMQ4=9 z`}DQ4o{zj=lk8AfJvL%xCiG6kVk)8H`8)*Hv ze^$)ex3g1E6j1sA{{JFyB%XLcjv>}!%pHP4tUM?%fea-Uij;w{1tv>^F(ED4XI}@| z>72k6f<-Ecbu*i+^`+bha5FE+T1@+fY`eOP68bf(MD7pdK|7xN@uWcL41JgomM}^UiUZg-ZWpu$5e#;v1n%owx+ptl5Pf?Xq>ohH zfQdC3{MZ`+puc_=XN@;$V zHiwbrjNOF+{BrH4VrX0koqz}XiC-LRDck>%;RW5eEitP?y{gmA$NYfej2aE0m)&_{ zc%fUe8<2EZr$J@opCh?=AGC2be~e&_^y-j4-tCO1Q2)^0T4*bRdo>@dh;55^BC}xH zKEg4Olr*{(IR+h>X~Yzp*Q;RyUFp2mIX0L>80W2p^*bJ9NEj;c2i?de@f!Rx8@XNp zwtIbECBJ`gW!qb)&Wx3Do2$SK>bhpb>CvL%&^e=EQ@9#7W?%9;vk#F5YcGAp4H#oI zL#9CJf)}3i@zsm|<+J%KqbR-dER3nE{H4vKwAMX&*#rIA1zgBvSsmX;UGf02yj7LR zM5s{1n6pYob{jX`wX_9q53N353dUckDx);_POstq!iAQi6TC3a^r>qDsOyI;^8qSX zr+f;hOYYw>4s)j+cb9kp^!+M-3tygsuB1<6#}#7=ayYua_eRcAsDSS(y@PmeB^*yh zG=V3LJMSMaqH(|d*Jzo2gbo*}WwI=b>YcWBbxH)5jtI0i@&kU4=@qGzM32 ztJf3)719;Ny8h;|6+{-T0wJBjXsCe@VDg{|f`pv1${%iFV?BtsH>c6f;EqXfeY-)d zZKDg$co0!+AL^66>}j|Qt6Kc8)dIpC!0t@v6rE4pKm~W0S%{yRKgdRCoBc8@pMkCL z#i!f#Px3Kvf?1h+zFilKuVDg6@jHyuH<(sL$|Oq~4tVglzHSM8LpO@*`tCv)lD(?S zX1MkgKDgKp2o0gtAh`++h{nrtWpYuoxqyrCJF+iVv81S;laCnBvLYc@oT%-vxJTb| z1xqxoN%>~o*Z4OXG+@Pywf@d1U-|2s4k1HIE$RmiZU5dy@c0FbV=x2FYF`(!6^xH> z5@+%%B{_eF+%N}RHUWLw&@YYkxb}$$)p-Jd`q)VXf!>kZE`GOM@LDRUZjA9rA6)*L zA@3~t`)`d6@SK550$A~gM@!SOsicb$?KVU{j zOV>)=_Wj^UKB*;>*K?AxnSL?L7I?!9)v2<)b4=V*q*qJ+}4VjH8ref_8iD?RMn3&yxC?wGF#qCI= zJvdr+s_h=B7kiDZ-r1C#4SpRK2r&j!=J0zt*6W3+?SVOki9k!<1LmS$wy zdmWhkdhC;J`n^DDQs1h@tYu)d@BSH=r6juCmGE3X8sXXpdI5T_ld#MFKNe&ihUMcFAc2-zWkr1+J+Z=`>R^llO6f7f({G0H$-1Ikbh z?!x0<_J-#m*w)@ny5YAXY`;x5)IbBk$eSdkRu=;k2i{&MpD^O>;-KPzsFphfct@Jp zuZmtd;vgx3Mu>92DEN?W4(7N6(CE5_9p8H{h_kJ;+a3uVa9BoqYN<;iD;l6`qU zKJ21D*$je)ALsKHB6I)hf(Ya;m$z9?C8YH!R(@kRmRlu6V(;pfgm;lae6J#9g+49X zKTLj7(`Fz*P&wW9aElwjPF%4srci34o_DkZ9dP)CoP>lEQ~qei;^7O0r<6Q$pNeT% zG0xc7Xlw$@!s2y z#s*jk3OOA~7(hiuj1hN$M>Uuy^U8h@hzfen`N^$(xHfDc{tlJ`6p`u2mEgnm`3O&-UE=pKvFj2;p_>dxn~LQ} zw|k=jWx85yde32K^96(0{pO+=*20cj_H~*`VwPe`4P${sK$-M8SddH9B|flq#=jbo z0z82$D~j4wx1Xr@gU?*wxmGpcMk3U7wK8 zYtaL(7;Q5ByX=H%1w5XW!jiMs9DF7NlpoBr;22@{Of*Lnqmfd2KxgYo!01cYMpM_u zN^QxJcKfYE+UQd0R%Pyf`T|8PKapG9P2LJtC@~V0k3JORZ6y&k;{Ya}7yM9??8cxFm^uBLb<4kjB6!11TucY|;N&Oi_M?M&_4{6<2ZeglCboKQC|ngL(o^G;@% zBjtjuW_$6i`)2ELKt95vjLU%6U*N>u!H)Ls;07P+)tBE6dS(S;*EHyTkdCe&UoO_` zO;X>KhddhZn#1{+C%zL7^>TpRz!-yCAbq*yhxeotJADSpk@6N$DW8!8JPNBn?Y^63 z2B(|7i+utLV~JKt;fyE1Aom)NHao@9rlOM27v@*knyrdXywY*{EWdtL>~%>b2fz5I zUT8!o_p&WN%iXa4p)`_5lzJgQo*~7xcyafm0jyj#AMau>j7}SPG6q=r9i~^VrpaQf`V^G0;SOe6CYo#%P zfIwhP`;>y9SG}AY5}i1kJ01D)Yli>Zq)Oq3n;uLk#BMOT?;vZ!?>d7*a~_+AI>s0Q z_B276WsofBk*zXyq#g4utQp-J7pLzG;2O9ek?z1#do_KF>Kc2Ro*TYH_*^BD0HQ97 zG36{o6?+%@7eCO7E<#zJ^K%vM7yettIF2f$j_2ds5i?{W7os>}xoTSISy&J~@`_mWamsO}|=_4fs@32M4PXZnGZ5_j|s z!%=I_%OQhNYf<%EBu_IJJ6)~#r5fa#Da1tTKvohxg(x0muro&e{Ew#dSZ)xBqUfGq zVL?tyk%Pzr1UsV0Ie-1&nVOZVY*&H1`@MS(hz20RZ2XZ&`VCVMtEtc66}o?74x^G& z^*cV>-18xtXwSHtkmwB6I4r(*{+i4FyX;j0I6EPCB*|H*2$NsGv&}`22u{D>osVI( z*?&hLG7>J~!+Wb?`91=euy8F({3q5E6c~O`W_TaeacGd*Gh}|fBH;{|Zr#6mjJZR! zdc!zqm%aC*uPJ6yl>UONKa^l`{D%W7<@r*Pgy_$U-m39>7%hP(4HmH#<|dcnB%KJI zjZ{WV_mVf?*CySt7-z~@cuQ{&n8-pZm4H#zp1Z+Cdi#{5&+jCw8U#lytU_q4fQbO6 zWecXhB!&=Zh8$P6lv%EjE8wGkV%8Y-%ITmdL+Il^Wwk*?ouvB$b$yXJXTg<(p>0cV zOCx1xOHIB=m38!PGg!b1WZ#lxJS~a{rq)n)beYiFcT&g$UhQIx73-oy3YzxSDCz~7 z|NQdxHI-0gW$^w2ME}~*u=WLJE*n+49s6L*P^slt72(mv{+9i=eg379WIR*V>!aE8 zBP3bmKNHVQB!EqGnE%$nqd(I-gip`A!*z12Nkg?EiC?nhPO}pVWDSc!+@Bmrzq5Iv zGj2gai9!Jq`y5nn+#?3}5;U(UNXrmIeiUC{X*f*tnIQ>X6&agyU($2lzLcp${(n=tr{ zy1~ep$R#-Z`j?4yZ#cH}Oj zj+guy03>k_ze5xXxA}vY6(w#gIeESAb9YoHw=FT#Q1&A)nmNv4$i^zbp38 z6X^)m{~E=-aqWo+`J+_O+l$Urp1McsOb(R|bqpTV!LUd1t+6k>&ti#`gq%t-+O8W+=j2Zsz0_R*73APPF<_&ei45=A#*H8@{`- znrD%ak9wW7&6!`^CuCk3aET%qCVu{v-(GGRxN-)UnOZaQPLdvn0+)M`NN+TFD&~m# zc(prhm#+leh-%K+3_zs6Qnjv3-8rT2BLK&thf57*Rc2Y>IZ`2 zGNmE+`_BFz06jp$zum(H$jIc_5*?~=N}B3=)pEf}YE~nxnYBUda#k&g%}@J9OZ$OC zX4Jcn7k(69tF#$iUVzFFdPe@$jJV%^chJd}?kZdpt;g{SGz7wL<(R<4$of z3ptJyMzbUYY>8)VUv3O;CAcbBVebi?8{x1IO=flV*fJ%G#7kguMGi&^t%$YUa9vR*M~djR{Sfo)dGcuvC1-3ZOIK(FulSap%C}XemKVe zW-IV9oEF+z)Ti)qk`1y;i+8`=GpL$RVJ~}K6MOa>YCo=0vLZ0hNCqq3WsPi`OP%bVz(Yw=F(S;eS0 zwBt4g`;g)&bEH@H1a-sRH;%^lLt~p3eK^udR?~j#bB^P{i|7-_BswG`|9yVu^}1L@T=HmOLMb=Kb-bcAA!LDnS5KyPvQc-kPclSme=rlWkr*DrSWZ< ztReUNG(I%1=jy#IwzH*bdF|OZvtOFG3&0+KvX8fPLvPt1kbMrLwA`0{hmjzF_f^{N z3rBy=CQ^ba`EeFi-BfCv!FCb?yaZ8FYCC>pzC)$&?`I26E4*MY8eOk=T{G;9fmawj zJ87Yd{kUo($$s-)CldjQSJe4T;f~3jfq$=rHw1m2uA8s6jYadLyX-F)%*}`)_>7QRde}) zo*;On=;o@+K0xLJ;6Y{jT$9$^V^Q_b^E30^j55(~>-yrtG^-32gy3G^WCl9TA7|<> zBBZNpz`uOe27rX zk3N+FTF!lDi%atI&qGZ5r=qX+TeEEGT6xEK$Fbm2eK!hKZwmCDn|ESMCU&}CKns2y zT}zqqq0i3v(y$A4?i-tp4LIb7aN)|S(?YBBvted9&{!F=Y;!ny-Bx(kcLOy7{(Au`x)AF zlOGmpr9zIs{`!tZhNH6Z(){8*auUKz2(~xS4n(8#^ZOJz(EXuWEEv>*!iexwGQmcu zu@}O}`mCrt+4 z{q_!>Y%T@Ao*G-TZ+}QD+-pekj?Fa%)R<~WX~K`KWp=8$BFppxfgq{Sn083@YUop9 z$s#)QfWUfb1erS^)y{8Rk#2CY1LG2gkufuZLozuQq@9r`R!XOtf)m5uwqrq@iH&be z2*JjU^|dNU_Iu7@FBKL1&H+8Khhs);zfD*yR`JMXJkmk*gUtKWg_*Z>sWBqG^JzKb zr9QmQOO?aceo9Y0n5g5oo})5O zLh))o->h1iPcii-UptC*iUTrW=Ky^{KID12c%q$Q8(uPq&F97##6mt4wA`k6u}sTK7$;z#ioT5UOvoF_>Fbs>Yw2rb&`O8cJROym|_?%COQ8PtfSTW|X6;`K1F$MB1#$U)i3$JlyQD@9|!B~p6(Ps+Sc2yD#G z?=5x;@rd^HYdBE24P)AHiIO_bJ3Ak1DXZ_Hj_A8Hn3F<+4MP$27MeV3R}#3qF()8W z$KJNOVBPHn&B4@fu6%dzYi}zDw0P~5UjFf0m5o(+b7_w>7kz^K9JDF`HYl=hKgH-; zAcpU=rmTP}M(rcF#SxUAbuQ_tITT#0!MAU&UKoavY?a;YlC_A19cWVhTO@||d*)VD z8`L(o8B<7fl5*?YWBYL1igL*r%B1%ZUyy|w+(u|V8I5FPk0sz!kE2_>xBNUF{}8qX zl1_9;PI=_cFG-FgJIzCOEl4>KrdJ=fsSu-rF#Nn*{EOCr#m!$=l3#`_#JcwSq~FG> zk}}<;KB#|3TZzfJi{1Vrz%ZIH_ZR;Hw4Snh9|_XkdkYFcdT-SU3c2U<;TB`;l#5w75Un+h1v{ zzhNlnsc&R5@drsPX|eWbV({I^Aol=rzh8^J`nyp{eJLE0cfa6aQPTT&UI!nF^S78O z$nRH}ogXw0)7}rXX>B%HY}j|g0SI}TQ#?>ohe5-8dncH#df?jRW6~QHr9Fk=%)(aLKwKWPBKkX>YV( zVCW6z?>pls90JoFm|>Fl`}V4y$S`NwPisH6}VG|V=F7UwS&F0c<=2oLeyU?1Cuu5r|9 zvWvoXeTV_DC%;V_c8#g&*)|V+9gpf`CEoR-i@##jcG;i~HvLL9SnV=&IwXl-iP4tV8#THsC z0r0L7N?uhwN=whWKd*%-`8Y&}3l%=@G130=gwy{NvGI|5(B|nnUxGPm;;1+G$G`zG z$Ff2T&8TIEboJ%)sGmIgBGpNvAH*YDdsmiWyrAo=VavzEYH#DZ)WY$v(y}iIn5<9D z60Q07Ua6+QC*pVJJ8mm4t*S5X#U|`x3O{)~za*o+YpoLqHf61|04WFIwi_5_$KTdl z0*i;QqtogcoBjB4p?|~+#B_E5Efj%2JA6$}D#l^|(M|_+QQ^A`P=kqp+!(3&vvU3w zpAzRhZe2>J=HjrLuwzmkQnkU;Fgyvd2y8}B8S8o%;rG?5_12YG01rODq@mywMIbHV z2udHhx?AiU-Vuq+lAp5s?988ZRlZtccY}T~Ka`XFKK=R$cNw5EZQYwwD_(rnR1^hI z#+!`aiL93JFEUYem#>X2KXOve6U#E#`tsbO@K#K|D69VhPFmIV9qr!g)u0@|Y*}BIC6=Aq|+ct4(E+9hD!5`P^Q_w{+;{>&z_Y zwr*IW7r<84$9?(I6wvC5R|I=92ISOUVdN2`fY>(@j!a-D@S8Q+51m;>^P)!tl8bTmFg zo;olbun|4hWf@&mI%Nuv@1X_!PW^IXPN3UsG3aGbtX_8=4c#)+!4fs+wK~H~oCEU-k`|V|eprsjQDFIl?vSV4uq?`cc0c>QRf{>zI#h%geAYvky8_L3p&_w!dUT-@5RaU}*Go|KgjExpe^ z;{_FIS|R$}3h`6*#n||-L{z~Ce$G4S-d=A9YV#@-cc8g!eNDhMCjDI)My zM{vSEe4-P&m{Ibv+g<6cd+gV=@?)dz2Ncrf=XzG%)eH>4Ehk+j|0(_08SM5Q^OAbw z?$5rbcg=B)Lb9o&>Mt+OEx9Mpo~OcgUuQ+mugWk<0A~!>Z@(fbw+6Vi#K%=t7j3;j z#r;-}cSQ+?S7mM4*oK4hX9Cn%+O9AkfWl$;ZpwQX$2G<)U{l;%VMDA4~io zISkv0%zRd%!ApB$o~jnPWf=fNy%o1!5z4=_QQSe4(UmXLQ=AIXXUfIG2N#6^{A?^g zGK%_Z&~9hm{F4IS_BNktR2=gPxlMNG-t6%x>r1&ac&qqbzS$bI4iUYqr+&@`y zk;bqtlC<=z-a!CKupMX9ePjL{@yNcp^HRE)6FJ(RXm@mNOiTssJ*vWewJUV-UY{%N z1gfsHYiP;=*GNA2)N>Z^BDQdZ`_zi{tNq}Ei-lrz4!_ooS;>v#FH8@nwUGB^Gt9@g z+;cq26PO9SnNpEon!y-QjI+`7`Y3UeAA5Z6R7_ebL(_VGN1>JpxJ6dzB99PO3U7kb zvmK~(7&`d9^dFvp(W|t=cS!f^h_A;u_~JN#+?nw2=}nY|)4Um0hSNy9Rrt0OXUatY zk-|&JE2E;Mv%jOi6=FgKLi$$;lJrX(8`v_aUV<+s0`Rq@B|#L9H^@fK1v* z)-1zlzju3mVDEK_M7sB}$FG+TMvn&|0TQnHv`t(VkvWf%CV(!J>^!0-5MBJS&1P=e zm7k=W@cciz9T)3!zu3=6x<#m0!dvVX73ohhEA8(vX3Mcf=3b5?>nhJN{0! z555k|Hb0X%WzE@|WcT$&j-&-(OFl0$pg*h3j}$V|x6}+#*R~n&|9*!ixKQ)_Yzq6= zyv#}*`rq5YqR+sDmA5g!6__W!b^3URe6-J*Ud(%xl&)o!K4?4%9Fz7m-=X9wWaOEs zuatQaVYRuhnZUMcpbCIk;}0cNn9&c8-X(wc#U5a3?EGcQCndlhxIl$_uOyP+Rcx0( zS&VRTQ{aY6y!uXo_ytGE!WS`z8o?L`XR8pOWH`docl(J0d;XW-d_SZoW#?`N@q?N0 zsaiIQ*Wb5F16|t3L8=U#JcseCo^?XrjQsch)!nX`zf-31of8zCb8$ub@uxQ(pp&+I zRR)qKs16`axu6ce=6;nMyrjx|8{NF^(J8KF@P$_gg~WXwTQW*{+xrriWU9&E#LQnYE5DDlel_Kylkt0Xx}Y;s5&k+ax682U%#EnG<~KJR32HQ!1V8;GQAQ1myOn+cw(JMf2~UbM z(ZPK%?+E|<5;zJC<{j26japQV2Ny$&Qkc$LBP!4Gi_&T%D_c>rsTrrTALC= zhn9N6L->7>R9Ai2a4^ulsWLPctLs(s5bl?b_~jk=cnHvz2Ll3_#F7=^@qF1gxAb&7 zBso_R6u!v7Ghh1Wq6_ENW#rAj;IQf;gv_nTRlVeDbui8o;3HkXySVu*(qdeVBSHN5 z@Kn_u8`c->t~|!b_QAs(4Hu7DHyM;38;Ci6@56AX0iZhpiLhzTHvaEAdKhHsyEAPy za&IqX$dMmUtf{AAI??$qElnF=zb>1|7QR+o_6mS)SbU@xt$Iu4U=qEJ%XAzx#^hdW z{hkctr)X<4tk2a#12Q5F;?%w1ot z-rR4VxYafOUE%pu$N5;5`A7;7fV~qI6!Tj|U(q0C#DWhd$3JBFHXYOMHLm~n*7fe} z-HoA>soVSFO~zBstX)n3ar?C2G-uEqbKK@xVImPA!+k*G$KUT#Iym#|H(%zO-joSq z0WFJHu#G`3!Q}&l0#Jif|3N0mGAJcbM1Ezq-(gA$6S5k;bAw!RByoh|Wxf~bmc(g} z@`F{tZmRpz!6RU?WNnJ3qesJuCq~`}kn%(q)& z^50hv0Z5asSO5#_2%cY@pWd6~a^0o--b9SNGXJf!0@(=L@T;LL?vi(I6yi?EHpb%-s7`)#rpS@B1`!<>f zaAVk{K3!3u<1SS1eK`U_#B+K(*_TtW-mYHmqq53IDl#6=EH21D-rEhMI*zxl7{GOO zHn{z5`_$dw4DFYE4#h@oJ9wYF%*1z@7b9b_(1(HY%-6Cme2oxEo%!d3n@9s-m7Dm` zDU8>buQG~HpmChcyMrXFKvR?e*QQ`7nk1K_+ginBhp-l%(ka;1Xo;xt{x=P;`pEUOs!KzbPn(!s-&F+)8WwC9L? zQ`o<5$L4OHT;lmReUP1GpU#82Zx4iR{LP_bR;TUv1snm~e)rC8s8_{k#MfLT=A#@M z@7ayCfY+?(Pi;D)D?p07YV5bNXv0W7{DMM=cQWAq<6l?fK^m!yqFvEOhvHC0Yw3c7 z(LcX2M%{C@@ioKj#op>cmI;{K{C=AJR2&aXTXoGxM_Q-wS8;;G3*tsWs4Rwbkd?t& z-dT;-b(s%+Vq5b_K;GZ?_TYjK@MpyU9{f2ET%Lb^)j;uQ)P)I#V1@}IVS8epHfuUNxw zg^?ai{(BUdjfzMuroIoMkm`UilfC$9D4V~*cD{^Oh2YUPxl+vF;idPcV7BGs)K((% zVsDy=TDLuKJPP)A;nO7nm4LN3$iPyVH~F>ta%sfq@CpSNu5RY<;o85Kcgn?gMdX?~ zs=Ifq#y31;h80za5Ke-^Q-W^>IKN(ugUr{%Uz*jUBr?C->UiY$>Y7fw6f-h=(C zbW!PCwX79}wf6vr95a^q>zI1|#*Tt@QBMt!puC)YMubg?pg ze-`)R0sUEBZ`|VGzvs$XO=2;Sd7ZJ9qrtavR5Cr&Kr^)=vwYYU?* zUy3?9*zhKnVmpct3$Ih+Bo}#eGffJOs`SKg;a+a>=uili! zeYEzTL#wn4u2#W`sWh=TBrx9ZjZCX=A? zquErvHdTK#0&>kR&sGIdjcrAQcR>_vxG*?Gy^g$s_TgtbBVhWZfI1Z)ct(G>KS!qb zJ;IXLk!uY7;&ySXkn&jXm)TP#-O*q36E&$4}gRlf&>Rf5j?)RV3)l&-|+a>Ev{axC86X#JF%rW|=_L(#Wlkg}l#J zjQA@0XJW_FMSi(GSWP=9#_TeZL{jUi09t|I9zCvI?KWO%YV5=hhoKiAY%UPu^Q&EP zyc!sl8omnfH{Hap7V*z;360WW;RfvDD2{ue#%tivK|UhUx-q*(?rG(MQ$G4w%KS8= z-0?FQ-q*IrxHrIJhnuiC8!Qf-UgDEi2uZDhD;%ImA?lJNop_Y#PLaz zfA{DY)dcGHf4uDI0QgeFS|ZfN2$G<DJ(<;NbsgtH$AKSfF$dk9+;h8wI;6E)Uqt*D)S zi~lzAC%)(aynT}}ZxR^;EIt;ReFE08L$6iEb|s^IjOS0h43;xhup+(Z_&4z57kzBE z$@p$`Euh?_q-Pke_}uF_>B0jg$j+?!aM$s$6o!Kxh~2{qGTEXATZ7pzv^1X6DNB@9 z9T-rpOtaVP$E8cyGTtIoTFFBDlACe0^}W@1j>)_0$_erQR0Eg!@FGC6N$v^SOM71d zr6y*erz(E)X8^%^vZI$N0_hxqJKN+L3M$H4spyK!<@N~1k2JaaFiK78x@m?0*i1*p zkVAe6<7nr8ilOvjtEUY!J-Rv|9mEgY&@$G5g_^*lUi&3W&r@!_0<#fn_991iE?hXD~dZ=_*W){uMFW5isq-5RxnQD zmhHE~L}`2X%w?UI_dtz;_aH`-1IuJcZ!9UMA;WWGW=MW&(X5VUjA6;6nx*Xq8DYa{ z{B6SCHkI>kDb{VjV~8Lu!vi3%r!Y^VBFz4I$!&kjP?QrAFY&0MW-n6(F_VGJ;GV=~eyUE)533VX` z^%KwbYgIe^ci8aX&V5JKSgY;^V~!mq-QH#{_9SMag%2TSmQ%ZL$rCb!ufnSCH&>o1 zHW9gZfFF(1B@W;k4xf}}1ud!6Xcu2o))vr9KZ*O*sItdJv$*9Q{K<91q*L%ElDC}? zucS5%dOSg3fou^vXDo=@m+_ibu6N%x9P-QZl}DT1o#BSNAD!jUsAfZABK;jyeaLYcp>kW=3%acqQC%Oq+tq$kknbQLYLT}90&A3h z(h)eROf^c1KgjDoV87LA+SHLUSg-(va~nb2eUny7*mD6Vph2$#y5Hb$6YU58&7u`} zikkf?royn6smU`YKI63?oHh88KJSfCODfztS4ytpOva+s6z-tn8=bb45r&@%Fs_xt zOAj@%rBdAknhsm=3I^uz-@SpHC%l=cthT|VK-b>G0eYf>3KjRLPsS};7(mG5b(rRl zU;-vTFR8I|$+8)vZ#wlowo@bF)OOf1!<*3k#wq_?=+ESwdGIcpm`#8|qB~`E-g?<~ zl}-%X#mOABK_g3yYRbcc68LEmf9J3BrlLSDGrP>`>MJCZchfiyOj1nqN#=jyibvpA zS$)*1tj-6f4|Gz$WZp20vVWNmL=&J6`rro97n(?0+CD>u3xG_*=}5b|Khs8mnATx! zV~-{?ACygEEq;bJ4Rf;t`&MG`~N|>=1NB;no#gEQPNa|U5O~BjVWI65z z7TNdmdvV?m*Ona&m3Ln-HZFe5rvZQH#*2pY?}^N$189s$t>0B33H0lWny2P1X0e83 zcHG)656cW@Zymt?lmxn4)f%J7^8Nb0Z#a9Ii7z4>y398- zZc)$M?p4~z`bCYWj6Ud^mJed#ww`cQM`Rapa2zYxpYe3Nx20B<{a)zT%PWVMqcD8} z7gI2%nGeEcA{JPmC+~eW`)`@G*-cA<3v|e+^s?Za+Dns!R-{J~!**xN)b{<_Zd-2= ziW1Ik<#27E&#q3ma-HAVq1_P_1UKON-zS>BH}4-hjX2|sblpt5G}2-3HcxU&o9>|m z@m*P!Pqc?6BJnDetBCf=vw-*kWlIc|=XZMOnPKNr+{^BmJGx)jPN(&;yp{1+M&{57 z_Bg}aZeqCQM8kSWP*Kbv513ZH?HNiXCfHl5U1fU}*9Yxe)P&{VQt)W&T;u%;e)SvA z?;3_gdn+&Iy_sn0+AcsTd3NA|&%H=SjA)IYNB5h8R+CY$@cis9GQIrmH~d~D>|bm@ z`F^J$uY}^iNc?45Agv8#6?Sb{s8S9II5ZI|OHWnrRTLB-sjM*xl!HNfgJ9!S5K>nJ z|M|jBl7(^UqyYZ;saa^inflb20SRZTWfq?+=%HI4=`vT;C~Y=q-|!W^rW1~9UEsH- ziC)zUt{MceQP%CZpZ9WN>kKo*=H5LUasy$8+~>`ulaKg-R5xpQrOPL z=v=N-0ZM+2i6-anXJyd|Kh@r~MstPuSFuBgA~R1d5o+FoE%rGI?48bSnD`}f-m?K) z*#;;EUEl}Qi^9~s(G3P4yxlS+u55*Hs&y|ed-Nk$dQv}9z*hBhMam{|ZpsMuE#VEQ z{qH&XUtm5(Muv1ckW&2$A0JbN^vp9V6Wos~U}sf+MmEs>Db>%h>fH`MF!=nez`d8X zgENAeQ+jR3b({}rZIenaPdWW*1yy5nznXvwMV|Dd9tJyR_7Slu2sy!U9BaM z(k@wCDVeh2v6bwr@?L%_;RC0IY~Yf5zG^L(R$K`U;9Y_(31T1!6p&TpGJY0JuZs&a z`*ra9usp^T7ai#L_Xny7QVRlcMlYIJsGTW10lD(H*w1Ya5+Gs>n(^5OT4F1BYaM6S2`D#o%q6zkZKs?r4m>y5=er@W@<#w4S9rBMd%<4<(Dac3y=x2GMsk ztv>l}QA})a*h9m&sr5N_mCuSraum7j3^pX5)ZV`ph~K^!zh`?zUWLsY?@gXvVVk&z z$+#NxRr4`%J>%9CGz0mz+@1rayTLm4p#;~NPk^u0P?IeJn zj;gk7IkPWpt@7Xc3rcH>;RYysEuiiOm4FdqIQ}638_JMFsxifOxNi}pC&i0wV_`G+Lb5B!Zb#c=XX8#+MIZ@Bw z;LI(^*tydIL_Xz9uOhvo5ZPn7wm;{`8%EEC#D34`vx0Y5%%2siJO8kBUc1dIQ5e1F zRk)xSFkG4rrkM_R^xiv9e~A7gMX?k)q0FBBt>vJZzVhB-SfxqYU3Pb1p3hy^xbWL=+%;4Ae@BKiF0gTIPZtp#Q zC3#6@@3JH0I}3ddTU1YLb<{Lpuh12r^jw|O4D#DOO@A?zD6p?CxDSAGh@2SH+2^S5 zMw4}hD12g$@vc6&sl!h-_Qku}8$JK(F2eh1&>6Y*34;{0M0-eqocScNO$2J!;&I-s zAg;s=EC2B3{aUhwx@hbzM#HcFy$PFhx#u;KVm67qWB=0l3%JqpCC|Ib{*t_1UXUjD zteE+agln{EC%T*nv zsrm(OHNRCjN`BIcro;IYC{fUZs?Owfh+O$r_}bBcZ(oL`vY=f{IM6V4q;Kg_p4dF= zW@{MwENp-G;%hoJ?s*qmfewyQi)rE>R9OsY0!NkUtDqy+Br+oeZ@f2a&bJ6`cer2X zN+~Z#y~8;Y({D?@gQ(Ax<*=L;giOgIdKFmJaO=PHD}U8?iP0qcc-ku(3<*=5iPNxs z-S!-AUyAh10Gc0GVflMp; zCo#MW!@07}_`!P+VM%Z(?G%`tfeX9!3V}xM4PLem@ijM*7~|F73tI)u&%G)@a}Tu* z{};kSa`MQFr(6)^gISeD7Xvi>x2M^OTwfieD#4)j)$C5DV&DcWO?vr2@FMyjdE_r< z?2GKlEIn(#p}_ zNlwVZl1MR;g)eylECxQ1>+O6Ou$zfjBSGyD=g36ROpaayTbCZIsfxrh;RC1xo5a3^h4 zQ8qJGHS~bb6RuC8Jwec5*=5+0!J283CFF@plzT>Fwr~3dlP=%gB+x+EQ|m;-;B*5ktR4XVt2k@b!t7eXJ0@vI*S3 zGVtA-4*3keh)oyfe}{5O!j6hoqWnVP$WS#V+?6Gg><|Y69o8WZexTPeKcyfb-~0rk z^#fbK{^k2yKnIa0EwFuL{M1BBtj|_`Wco!xEjemrbT^q>kz+?fv@gxtDz3{2us*(; zoQaF!YFkUqxIL;atxMJOSEd{rp~%S~vnFP#)}3g7No=Vu8>Dzr$^&tuW;1@1l!3c1%IY8X*@%h_78Zv&*Amx9Ow!% z|FXc5*D<7fJ#0q3G518AFP+L*RHd&>{o*?PB_?nq{{4fqOx}Q3l93yWZ{@W%ZyfYU z((fmGMsw(W5lew7p=2XJD2IHcxIgtm9-Q{F6DYSKY`do&06hgq6q|&UDuQYuhUSI> zH8=XXwvo-wTXOt0$o1>#e9mYz`xzJb#KHpQLgRj42(Skfbk`4RLa8AVS#C@{gkrgi z3u0_~HB|VNd*-BThvGhiuU5$Z)>3@AQ0%`IlKcXvUfQpz*KugGwXYYFAphVSwQoOY zdWiJ}QrfboJ#lwt<;zVwC z4nCrOV@#38kwyg>Q<*zV;Ab6Zz-+%PMtZHC!B0=-u0-a0o!eK$3q9r+o+T0zjxiL5 z?IPc=C3vAAJUi!m8Qt+#0t--c>Txc+(tcp~#ue^ZTXeIM0^3dnhh?|m>kkzE;8g~# zYUgc?MU8VzqS?bS$22;CPqIlkxjlPrbq}qr1~c>yo;V>VRQY}{AD6oAk2yX3T&RUg zjh|m4v}YzQAN)dB6TptQ4<`&gslzF1_xJTR=7??6(-^&gEJqmhgiF@<3l+i4ytd&E zhd710>LKAvCn-QhEoL_|s%-9#dSgj#GkrwaTc@cl+FVImrsvjp{1w6R`Wc1(XZsQ^ z*-AaHPJkW2Hv$t2`?wh=N!AA@DK9guBnj>kU!B*BGw+WDZ)$CrnxihC4;|uhNV=l> zIjOVB2|&U;V?l^yVpLF_Ot{MhlZV~A&ughSj+JxtFJBybZt7dTAt6rIY;lZv?H@<` z+<0IBTM^1l8;nZp*4xflPb{e62qUBSmy)P07Y`3tH>ssbDp1K3qpe)lEX*kJ<6-0!=qP-MZ(=oU!-@u(zey|GuXw(4#R1Osz8_a@ zzCO4d>@hUmuWnJ{ooUpBzUJSjmf0-q{Tjv03=FhGSHSfx$ko(c8_ z*I0Vfm^`vrm{znU%Uq)z5ehe#JP6B45)`UbE z;^4Jo1kU+dpyXJ_SM=^GMDhvxTN2>sSAmYW) zm>zZKwjzyJ^PqMNZWNS*tJ;|0{29ZQCj8r4SsQ3^5X?sUwU*K|M5D2xDFxQG>Vzvo z{yYap@)XYqO~fR@BnR#_4e~Eg7p)KEM_5t7_^9n3rdoAeXO%qeuZY}Hl4!y&93Ngs z7RG1w9Te+@iN3kULR_vBsm~8Y&34OGz|=Uk>|3mFrk+9|Xh>e%g;yxAZ?@wmX<@TnD%;kQ0K7WCp^qCh8Hcnvk?`2C{`I=GC8;rr@39bkhmRa~r)Ri)7 z7zTBZ#)XyQ!W7oQMbSiiBiP-emzPyM6d%<- zK!5!ja)X~)k8nW9g>#taZ(ohRSl*hk?8nrpRiif4{@%2*u1g5f%!3Z$N@pAhh=Jf1 zYb;6?ic^z-ve2TL1myZ-L#IZ{FAS8S+ACoQ>$lI_aJ#3K&s}9IP=WGNs?_wt;53A3r4q80nSMFM zAW1-@r7B@U5E0?ZF{1R*Wd2!zek*sv3I3+1|!@DJ9P=`EJq4U zK%jLpt8dgejKL@ z@ruRy($*cBy!`jeC#E^sJI6;HZ%%Vw5M0e#?u>`hPjH@@wPdWp5g~g70RHwRY+)Nx z!ijy4mVl@m)Yvp|SJswyzO!@$q{A<*j&Gw{mwqOVZ4eL}lnE~;tct57ek~Z>g zbFT80Yef9Z7PEI794g*BXTGa6DBJPMgw5cNi=ZiQ*AuzmrgsV`DwB9mk3b6)w=$-| zjX98d)=G0>QyDN7zBR=reT9O?rZYQb$pVqRF20(0#0T?F2>U@&FT3pz&jGb(UWN?UKGue!g*N z?xuY1_?KpNN1smB#~Z{`nZSC_vK3-40~f2HVviI^6Gkpm&8+TUt5r1?ODH5Ih223P z_PKl9v7nOTE}#DWx#cf7PO<+%51(et1CPMT0SKM8KPlEN^AV)eU6`ycBcT-Ry3vM^ zQ1{dk`90CFcRg{pi|t{I!`{wWRp(W2O$WXeg}0kJqw2jTExy!AS{31enW^{zNgU*t z8Ak+-{uY+?6epA|5sDTsz;22IHTag=EW$)ZqHPp`lkm1@TPv6)teg{R&yUH8dnH9vb!xIGUg-SRh*9=b_Sf4XNtG2xs z(!<}*H2Z}2C*a}ZwV4w<`hiV-Hu6jTnp{UaDOk(5Q22zQj~seWwk${@NDr20C+bDl zRd`_uM3_KDK*%aLaC6#Gs5H0o_OiTecQ@CSSdNsL0}GwUt2~gJ;p2Nufq+mecV9^2 zTc%+FgkfHiwK*Wyq(!PT?R=Lgz87{edYTPF(ks=T*7ff)&ai=Kd61W+xu8ZrtY!ot zj4i2?9}1iAnukG3TrX^hw_i{!JIxeO}vQUaZ=wu_R|Vuz=kNgr{C;zY8cu9<%wpY#+=9s zrjuaw+FB`2ik3#LpufXNUpAV2vKX9e+bde6Cp3O|)uaBq5e=1o3P5z-7{*n(@y5?y z9n9`#H0cKa9K&OSIm!HfPs%j8jMtuAy&X@JYpJHqsM0o-#%y5MFpP8Y{mn4X*nh@d zcd%71g%9yszQ5!ha^#xDRFma(6>q1hy2{zT9G zu?N@CCZV1$iZIj`8>raElBemtZd?rHBksjK${#@;Q#}7Y+SlXDt(iHo#YLfyaa4$< zvgv~vSb=TL$G{G^{*xpP1dT5YeK#K?$^AXX#0&Fy3NT)jXHdL&eylG@s=YRVHKy~u z8b`qj5h`Dlt*_S;cEdkoaXcf1DM9#(Y>M<>UH$;mM}!k=by5NDOx_9-rRJq)@Oc9b zR31L-bX^<;*|jmJV#fCq|2gZ8cnh?SnZC;`65JLw!r8y5wzbqn)!`fUUds zSC?vT!cs2dl%Ec5^1a@q8L?X`-8ucm0g3w!wT?-4kb7D6xxbnjf$1aDQK-mEfuh6{ zBehp~q_#?q-r$jxA--ts0eSuOj9Ftv-n`?Z1jjJ&S|^(jhr zcojRvQ?q)prk)95?smip>OLI6SRswjYx3C~L-DI?Yfh52 zPBStyPi1RIRW<+o$@( H@@0eXcw<} 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

bWgZYImu_5^*Q0?3l44K>7`JEE08OoOcZ&z#K7g z0zD&UZc69V!zq=>vnJdgxmhWh(lgwS_chMfqOVtUK|p;C9QkXGrp(hY+@c+<`OWhw z%&=sC)@wXW^Yi+&sqb1F`F+6-;-m2Ev5Di<HlEnlgh38GwF~cJ~Oe=64jL3snsm}#B zOoG#gU9WH58K-h+%J)cS_DCi%N2<89fx%&aF5_wZx1nkDVOT82hSSMv6upxIav+G> zcUmi^z^TI`N7pDRnrE&cP@*Be*@1zrspD)~p0u6)C5~*!7usEOiydlfY z%DfCI#x0+qV%kr_*W8{15Km$pzWrKt{5s29BPPhBP!BFR3?Z$*o4DFS0y!5NbXIOU z4;(OeE-(h#cbS}0AHX?YYC>qmu{mFgMoE_=*~D3PDX7U+|M(GfJ&Fs-N3dWuCKZiu z9ty8xKCpi~o&p!6I=9Pg$9fh_L$`nX@&-Sfpb+Je{!kvBpC51FZg!Sj$(3|wQvL1V zxj%^)`5rrfQbJX8hgXvGOM4SL`CAY>GT#Mi&SPZ2Hp z(QkbFWaI3o?L3>A)DqB=1aA6^E&c2zd}Njhzj(yl8|ULMY6DvBdAtS}$;}82r6(Pp zmIc6`DiQVfbij)9rf@Jw4EE&TDK)wW-LKwgJ^8!)0`54|EJaZfmG=1AiNzPoijz%X ze^9+NoFBMmf$CZ1-m3T4F!|zqkI6wC93w?95$5U(g(16pJZ{kDf0QYhmB79s(6+a(P z_`yrrY8!VBbytJ(6SJoaniYaqZ!)k`oBNPjm1)(MIJWwg))7d~xv3#Vx=?fVvEfDace4)GdreTUxs{D$d-m%GXD;7 zpeH9EH6cOy?+Ez~g&$ZcU8mOI?xIOGeNqIhsyU$bvT+bye~!v$%XjE$3Am_#;VW)s zAEr9=n#Q?)k<-Tso^CS9M_}{UULw-54u*gLIg;)D&I@DTyac-rc-I`5#%Dgq9$VEG zA+I2;npjs}kM${RsJ+j1EIqBV%53n}2_TWNPw7{9V(In!{hIx4Awje^_p{O&_G4U{ zW`bjfk2|((Kj~||xE6Fj?n)F4r_4Km;`>A}G7CSe&zySdXp{r?*enl>wH3IP$!SXXRwK)S3VsnInCb`L3k3WEfiR1XD!I*;U#OE2pZ~nw>=6pjPszD@r5Mv zb^7L$2uEXo1?{{HK=6`De{J(>`=Rhx^qZo1fwEiM(Qi4vW~ZE?8W1ZCd)TLlMsp*oXOWQI_9ubRTE0Lr;>Y_!R`?u7`IM`E{k8gn+$%V16?M z=pEeO)@`By$c&Z$X6P;yVm09G{N_e*-bIRM867|(I|uy7cab9R-_|#h^vm9iMuokr z*>GoTO@RF|ESV14_cG+I6=sw2Hu8nsfq9509o5wPtc>z75zbY>CHa`!UQH58fnBV} z*W|eNlS#H60!|h~|MEkjh##~oC>e%_sWXKpa7)i02C%M& zTo#rrpK1O01jatp;0RyGe~HAi^m9#qBllMHCb50U9i`werb!A3Mr^C2!;1!Y-hf`Wv^n^rbClqTj<3Ws0t)d+s^0!$_sh1-Mt#W$P_@2oqI|6; zggBtsVjX#HG5hXQb15j$bF~!Z^>kXcj%{854EjJ0xmH;AK7h{rqVVmvu5vc>a7b!o=HwM91uH#P{ zt5#n|=M*P}fax{-O4M?_PPP!8o&EgS{(UqL(*~uzoSG~ERV^HPR#3=8G*IE@8C-u6 zO3+?jQl2&~*6-geaNflJP#RmA5g!|$n6&GI~D(mm*t(wxX`TA6iAfoR5gY?7*|IFl( zWB&c4oH4TTm2Mf{>Q*-a0^aHWelB>YMQBx=m|tY_``C|>5I_I=fqy$bER;?rs-GY2 z0dH-Jr^ReoF#$s{5o7-py8;pPes)W$704IiE=xJyF&eZ;EWXNc<@o zSf9hEV+9ZS>R|_vk80A4mmV**F(7k_JSZr2Prjc@h48*iWam)(p#!Eq}aJW#p5<$Ve`DKI;B`1bz!c*Q%00vau8(Wtl?M4IK1oijXoK=KHt>{-G{TSTt zvJ1aXKWcW{ zQ-IWW^vaHXHY&?NJ;DX>4Bvx4OJcu;)Vh64rhw--}eM^T)MJVBXVLo2tAo>K>asa6Nyyr&WBql9cv@{oX+k z{@5f}*>c0YA5t@;Q9<*d*wDE+(xd-G5~panH_}3e*ca?vo;USKd%b>)3KyfS$GMGF zT-^!+GQNH^O8Y`MTdHfjEEcCgH1|%$8L@52X!^>jHy5Kq247=NNP`_(XB)Na{FqeF8F#+IzAbGOiY@grM}mO=$mPyP(ISUT8Pn*EP8pCn5zRz z0_{rpO>i=X70FtA1m{}oEd?Iwjg5;4QmOY<>rvcaX1|Kc{RkZ#XY@#};xmq4%LFvL zR=lA3JAuf)5qWs5>E+_ZH?p*5Y|!mQK_&NnA|aEXAtT*d-YepLM0LWmVDUJB=8$mh z>-X1Yn9?>f`maQL+z;&BEE2E|ACWi?u#nNmJT+BgKzC@aEYzG&1=4 zQw-8;^lr1h!j=hAmFXTXSxZJSaWZ=P5!y|wdRRA!QGX%On86bC|E5$eF$Z!Q6=i#v z(G93@#!Y2=RUSv|)FUZdhR#iiW6`#hs-m1OD}G{8EfBn;{#?MU4FzZYbJxE6b#hd`Qper$zlO_vVm%^o>n^w&3WC#ij{sZ7t}yl z)9iPOCf`WmhD?OZd4*a;JxUwMUwrW1!QY`;IrW|@_nKAkTQhE`kxrm>c?6N1B{~bUGrJ?)Omfj$@M5 z9?)iJA=aYW(`NvmZq}A$wr8GX9M?yG66}3!Mq> zq*97zRR&Una0c5I-qoXq@dpy9yG?JW;{60tF%1#XgsS`tWA!EP%hp}06yt=MV$@(c zjCcfa?L1%ixE*L1O5(@vnZXd&%V4_76~ygp$7!EROP{?>8C)8(`u3b%TLGUf^1Vqo z;5pQ=v>o^Ro6z|#^>u5XPk3Pn$hzb9F4*x&Iii0wj?8M$C|$FC!49)YsJiDd7XT~d zS~-8>{bg<|pNt&V_*2``u=?pJmDzAH)eFm;HTu_CUK5gVUN}#^Dfxp=#!~}4TwMkX zX}M()pT_ger}X(o^&G`$uH^@a<%%6yn65)`p1rpY@5pOMf^Vp973!n_9rfPN|2-X0 z9_1V=LxX&j_JpTUF}8#oyzNp=oCv0^!s3WNDc23#8g1kzmW(PlfE?4B^>2|IltN8R zc|%D7^*!!+TDtiphfz`lS)AHl_IgOUD2OgRxL<$E0)}@TjsOJX>y1wW_tl7{mHZ$+0JC=lCfO3E7rdSWRxTAj4a(#B(jfoLpe4bYp5Kj{(Yg7}m;e9o2 zjv~I{9q;X^IJzh;=J~ge&4;La(PZD5#nD_hNLUe>K*9z>kq)JtGn(xxRZP6GRI^a=K%KI z1?kT4Yte3eL8P$9$vCuFirSarXT`V3fLThR$Ce3YSidVBkZ$KhGu{?6>ZuTdV(A-2 znW|fLJ~Fj-WY8%kZf403W3U;pErDWlkcMWln{YE2wm|EH4)$+C`zu%sby#>z%caTT zOmQZHlH?Hx@l2iIjOG!j+A+Ll3KZr|j}_wHDvW! z$u&UZ+wWXqCB3mYRi}AB`A)A-W}#wGA8jNg!F%evwzN>;w!|?`{_-|`@*_;RhxqkfxNB-u%UX51hB9q-b%+vFg0L7tX zH@v;}Q;6COPcD~#EL(0d=JVBuYeuQp^4nY_!QW~#`c`P7;DhSiD?a-&qgw!f9+Z75 z{UMw0O8rRnE#*hKKQT8bBaQU#cSD!$b-ir}G~Gf3iyMw|O0m(ysEAMoX3I>ltqfVq zlZ4npnKN+8TTq3+%Z((zw1r7pjpFTdEh3*8Cx=?|Rmp8PG}}Oy1NvLkQBnH{cb#Zz zEQzpv#?H#~!IGA|sy}jPm*cPYOS2S2D;WftxS?nVhXV<(K>`qjtErYDxax0(E#?Ke zDv6QE(vGxcj^-11>ZBI}^Uaa$oAEGY_hfo6uc`mSo_?`1&FwDR+sLG?`F4jWzH>LL|9pSnJIkX#1 z->Gmd#uYN&#Ax`4!I#8}SZpXF8G&saII}P(#<*pyxYf>_Vt)r%I`DVyBm`d!@Jg4WkN0W6 z7QuyXP0XNlxR5nd}N zC!aLvG|VT9xGd=4v(P~BHz5icd4n`47JhB%@*@We4U`5w)vZn8JAE;Bqm}Cq?!q%a zem$2dTDJ|tCTh$Ipo*JMXNwa#|9SNdm>ma4NcN(9=4*V#ATcS1uWGFt+&0Z z-)O5|6087DZ!hLu<{p+~(*rGY@%#(27tnxu&$~lmXS33L?vHF4l;Cr>%6mII_srfUM7m&wRea+^467fXbidD!5Uo)htidsF@w}R}*IH+ZR|4Y)8mMvgUkJ`XQY9 zKA`lYf~li!)v=xA=HEAm6x>g6(XFIP*TtS)D-Y)V7EOF6sL^j<7jsQRXn^!$w7h^h zqP_+N@oiDVewaDjO@-A#+`q)(Xvdm@Hi6-m5BKdeB*CPdyC*SkG5&->)H6ZyAdY@d zi6k5C+Vr!U-!}>F>$0rZubiPLxpndx}i(jv{<`nS%3)oNu%cD zpskBKrjgrrdMA9ZvUJRO8)7&Zp-Savat-$|(x#cH-?AkuJtIBMl?MQZnVBQT(F`VA z*YXQdwZUY9){)!_o?^bHxZkYK zHBg2u(P(zB2`;NEPk&APxV^-W!&rXayZ@lW`<{@OmukR1AyXrae7AT56RDRdQo>NZ z5OeCCnB7*EYX{YunoQQ!)_CEK`!)K3P1A*1tU%TPCS&11vfq%1(XjPO?}#+%FN8dz z{&rS$kL02OLCLWNrs=ZP5lYF_;_Z`N`a->T4G1o;-DKO56cqeoEB*BkT6Or%z@Xm) zX{2>YVN7FmJF%{`nJUpK4E8ENvKNm`1*zjU^tzp_NJlO&5R{($;bXc0s^UZw93Me|iiQ@+Ud~(@J4+FymB{#+-ln3o zD<_s~#V#0DgV7G%u-~c|9IH)LfaH_eXxA;c{G<&>wE9=4b>fC%|OYQT>~9~vzz(BuPu@CyhJM2vVCtGVJ`%&C0omo(*%4}tqdH^>|ElGB^pI7P@$ zpAEFicEL?!vlKtd?PeI@!desdYo8(AyM!iK%4)On%$`HKh}aNVK8h428ajYslg5jp z4nWZl25f8fm+;y;VD!T3aYOJcV$cDp&Q}U6;#+Z1ll5*39d~|Zp2U8P`~4D#K$xiN zbjr1T=jq$iaSf0l>vj>Q!i4VtGF4o^9Qnms^4f=!)Gtw2^`XwWWm%r$?}$yzX7VIX zSeI)|1j23rr}wWaE>varWV1O z_!B@(0#L(fZ;RPV?WOG_6i21_a82G-U`6(4cT|S8uc;Slq1>`JlO%jNbQb|?o3b3@ zs{ks!c8`uGw9ee)TWM$X@pQ~JD2E_4Y*NTs8tuy=ySoj*%osI;+_scKkNvg?^OFNV zzQ2P<+2J2I?eq{OSyH7>)p^M%J63q~YDCY2zq%mj&fHt@3mVr!ZhH}}L%UUUU?5AQ z7B}1wFx$l{uhKg1ZDX4m=D+F(u}|&u97sqJ3X4;!L+5fI!%N#&>IfbH{<|3Gc*13^ z0s2yKGR6f?RpWtX$Fpt91MQ-7kHnl!Fx@*s;q~i4i^-0eW zm$HS$)#Q<5@Y%Xz;S~jW_y_V^&n!sfCg-pK-H$+X*98h2W20FGq$Y#s+}(IsL=l!q z=%rsZQtwAmeYT*Fu1EtyPmItZPD8(go@$6z3?>jioz`BY3~1^ezYy->?5eL~@$l%8 z30tE@elIoXx!FdJLJ?3qd7Yh>u{XC~2-CiMyo%!M_qRqA&P-MkB0Wz!DKm9zTP?yf zJnrslVOyEe_R}0vF{dX zy(}^ykk%wR^ugD^sYNRDX}KRrt`x!;>$U)izmX^e?KBdh4ld3Qzg@%FQBZ-sQ369& zf?O?{XzU+c$HgoW*rFi2Mc3qx5Jmt}Aw)7``ZOxa96xe>#tiy-l&s0Iz-~@96hq(2Gtay=w!esXEeD5Nb z2vuP)1op>(ljT`oS91j=Vw$O24=@rZdAK*PH7%ojC2-lE_HsPN3zeVaw?`N`dREJoO=R@%h zjz&LtA?Zq45fd^!fK24{wnnkvb_EXl5)9;G2J~}>kWF9pOqPC>*S6?-F+Al03zx&w zi;=j$lw%Q}3IgzddzL1jA|^xZu7kjn*RgvD7ZwULb5L87|sL;xEualS1-yk)?jydlJpQ;rJ>B$%o%Kh=8sFp%&!< z?722s`*_LG=ZMhJ9EsKDu;nlTBeJK?y&y~QfW{07 z7~cxHY$rP(ns2DymMzm{6TczKySOt+Iv4NUr!oo7>&s_m~Wn?Ubm0v4* z`$BSC>7W|lINMWWA=MLPnmzUfSa@@n7yB8=wTeRE@}2lE`T7H93Qi(A1i|vVZe#-ZRt~>pF2h}u^FO)~ z#eZ9pFIbD8swAAj#0QT4s{7AD$Ye%^AjS|qc>WId%4o1V07ZTBS&)|Avm+jNWGxe` z17zrsRC$S?u8fK2&AVc5{@dDYG3QSopl@8t(Cd_J0tKESUov&eEX$sbKR#K~b^dwb z>*vx?@1gsZK}94D$6#j!m=tN>yxArqn32A!)um5>Lj2^mA7h?E!4jcI0!JI0V|EBW z=qpY7bbhjlNed`OzD(p@cUJ1(IwrpuBtBKb0Ic6uE`Y+bSf^a9P zJX}hNhx#uRXVx!G)*qB=*=)F&^|*yBZxjHf&*Q523sVbI_}c{?zqGr*Uw-6$6PQun{M;y7iDdNHv%S9=Y|(Z7H5`6V-sa^5-~8&y zw=t2v7P+d8-e4YPW$QNFzPbSKo$Hy^p14tNsdHY}d{KCGvM@@j7rY)h49fG}Mj>y$ z-Dn=>((hGz<-*giR~H7Kvv8{n-);)oM#J)sopCi@Kj$m(WW2d6hvxa>GUm=4nIv5eMO$WDJ^>l^AcUu@BQ4&~?uwslgQlY$8vsZ)$udN6{+ZPKx z4Eps_|EYL*WEvcZE+O4sKm63?cp*64^x?yeom}`1 zKQ!>BlSO5HcTiluB$P}0zDm>5^d%=5Rwqo}ey!y%)|~ng>-Sl{Bl0VR$a`0zZ(r~O zFqR{o*AS7WaZJ4ZGavUhnNXheKlWnOgY+Fg*=y%=EJTh52er2HNQkjCQo<4_K!IyF z-?N*XH5aBn6=`4aEyd|YT}s>Vz1&q!w2dy(2q@%8qn0e@sO5a54fT7BmP`V6{s>Ld zvmNI9HTF+EMb;rycFlnNDja@{S@os|#u8eIcuM7~@2Z<&6vJI{SCZ5faI^8#1ljWj z&{cgyCO)Bc|1Qu@ZO!1{?5BBcm9#+oW|(nbR@Mc^UA8gPU^@cB1ER?+xD$=shL^@# zdc|MOYxaa5ZuF{H5Uf5b<;7-Fnn$oQb^MieQys`ncZ|xQBM68W(cD{zWlA!cF>XN* z>&;S7-gij9nSOyRE5AW1H15=8NAotR`uK5Nn3?3*6~+HWI57Fktwc-;n&063XNyrh$n1 z?rqmizr)P7NIf9dnQsPjQ$F|+WE2Nm$|E>e=NN`awvP_fOKo3F7l`;yq(S|>jrLYtgfusgKXFtr{+9i#cj#G1)eIS=7T+yRvoB68bNPN9-BdSjOGFpQ2g@g z(u~WJM^+ZJl!Rr9m5gsv)Kxfq4i>$BGe;sf4Dik(gc+50qbwhqXKdm_l_2wL`Ywj| zE`S+(9`>qhw+>QaZQW~qOAub~N8%-x_zMOo_1I1Nr0Z+`;Q0aLTHM&27F0zP%oiLH z@%d7IIK|@n=h5}6C7b-*e|pccU80L8pjR&zZ#N%?cE*mB5Ts@VV@a3aGwm6keCV0v zhiEgxwQrmu`SkjX=WFzLke3P6mCAq{Y6kv*3NfLHwT(=TrJsvgY%4 z5<;{sPWv1srf-z<1WJ5r0Llco(fzd7j^BRq`k!Rh79i8;nvTLN*lvyW>Y_EXU{)a>h+A93^M{pdwuJl zGiYd$0+mq4fJJ9x^L1_w$(~U$e`k0&a^!DXcM(Omf*Es7iHIy^hH!R2_P0q&z<4|R zux%zOoDM|EA`4GcATz#Q;>CWqeSSsia{4XOl6b*UzZZ2>uReh!kQ7Uzg6ce>RSmk* z!jfWO^gV*npL9z;pr`HNF;lG}5a({$>USHBt1rb`omMxNGO~Z!MyDc#A%R|AtOfc@TL-D15Q($pUw=Nixq+R>||z zUK5N1HhwU_*pOh!N_(Kbmgo5;Zpmu3U@XCO(8vBgbZ5-if2UD{b+>a+GkRl=C>O$o z1VOM}hwWlY6zQ*A4o*Fj;Ds;;8S8#XUxuQ|*F_+`_yjwF*W}`@g3QCaxk==9gPRNc zU`5|&dfl~`r~XYK>#fjAqetJw@Wjvht|dP>s$2`=8aT@>aPm+dR<9$GNGW9Sa^eRP zcDs{k5Z(K#Gk!U><`{(weT~(X`l2U^TzB%vemkK1W;|BAL|9>icsU}7TlUj$Id3e8 zi2Uhu0u`5$pvEw6pf9WsDhXtdr;MThI|7bU8ChW7h~oa<>~yxBaPm>5GL4Z6?H#g@ z6bDKmypWsz_}vjK>MYID;H2J9!I~%D;rDp!Gwhm7cFJ&DBIy%K6!p^%_2)R z6a4wWQC`!V3bbEx`3^i&X#rvv@Q}4_wTZb}9^xSYMj14^WR^ zXhcIgrd+5@*W2cvS!n}qYTI-%Xx25q<~P`AI!kXfqEnH-}uwGpPHj zaS<$vXQ+W~`iKbxw92g{KT#D^N{%mPse9BjhW>l~s)t)iX!TOLFGf*i18jvqw@1Sw zpSC^xiyY2bOTd%Wh7nJjP)@Vl%CE!38dJo@GTs!*=Z=8!J6Um8vu+wnuH)Yw$dJ>a zov#@oi%}pP62#V1_JZHS(lbxx-i#hM?nX4DZrL*X#!?9Ox?GQCL&=?z7-x90K{_qr zL#$YU@yy$DzZz6DCt9}&tPW?NSiU&>c9V(|TR3G-C4BZrdtK1+~WEKzV`TlI3-Z293eMieo zu?58OQ<8lR0e7?ST*n3Ocvq+CXMIA#%Z9Da?0mT>(0ujICnr(GYd_Z30=^@?l1iPc z`8SnUE^y$(>{1=IvRtsn=DnMhOniqct!Vnyz891z(=CBwHY&lZf&&OKp~^4&(V&(5 zV9hLhQ1wfFdc=nVKj1pRdg$zD;!g79TE|^GSGOelKCF`=eR?6lc~wA034&oUhfUsY z8Ox);Z`Qz}?iVpI?l6aPY*x@tSI1VhUhWKQBzP)xjVG)wRb!719BhzGz#JU zg5T$lI3~Rm`YMZG$p}*l#6*~z$lL%pJon3#A89hA5}UICC$89OoawOiNa&Z^>I`e}?;GH5T~?^WyO+r{LwNn1u8 zE`Pesxzg24SK%pAbR+`YVxop`MhSsdW}Kjy%t=+GP83v=7Tu-`AN=djQ}i1>bA2+S zELGa061Axo@L2w~tPh1HwcloTXo@{ug6g+Ayy)I{l)OL=HNCe|aL*wNRbl7IVz}i4 z_=dl~LWx|lNC4Me!4rq~ky~1=PC?DKprc9FMm(fpb9FC8BV-o3kHj!%6ELe4MGBL<=3;LPZ+b zj%GX6axLQFb&H0qeO5(j%b@vv=7fm1>rz_}dVU9MLEs9P*F%Q9@EdKC*0&z{c7>$P zTCax#&-euP;!mqc%ai6uNJe{kltmhUCco{|?o>gwrRjlw%g3Z+0in#yi{Op;!*y3^G#|I z&)SK(s0YKeLLf%>A((y3{@9+1uN#d#K0CXBi712dyjwz|J$%IgR?vm9>{k1lWi+GU zOAX-eqO4bMdBt51N8bxJWuo}R6Z9$8r*0a_P_o%`T%v+QIm}=C7mmR8&e1Ecdy?i2JpYI%`P+2j zjnm-lQ*;7v@quMXdpvnGk!G}fB3Lf|F@+GiQCRC9U20JNM#qsx{-7IZO7fmk|He04b;r<8e=){ z#_^ht!g_-G&mjuwSbbBqLH>pLZ1E{G;O46M{gJciUMhq9{wXK4(^C;D}_a`~+fr6fda%@dN)?B`F z@w=c}5vXP5(N7`u!W?)vV1e!NJ85_p-3rKps^$B6HNE)8j=-UM*_{e5esMw|jkU#I zrQ8$&;_z8SzEb-DJU?20gUeu+mi(z`yHBQnLx`;c~z z+CMr^-u)2t4Y0=OZ`?awpz7ip6)tLnqUdA1f!X3UOG8QqZ{t=^!-0v)z1zF-7u97-{i+eb_S=6+pLv_y7Z#rCsss+#)3q}mTrca-M%NErzkJ~zv+1FFyGN?23DB;|V|jbr(a z?OW~kYm?))a1zr){q&~GVitH{lrQxhH8zZy-(8XZ+5^b~8eiye5lL7fbtSLOvXemZ zrM6gkKM7^i;3qpY=%-p0|D8qx7_rlCeu;&?lkP{1Avit7d+g~qgXaqo z$r3mBT61ychu|N$0lAb-N7Lwdl}`p|0V1oi?m*1elx#oISX7x2i-dKK?QBzcuO_iE zD=De0_UyXR8AfcIQwn&k{rH@IMF#dS{yPJ5qz~gxg!8AdC6! zgv&f;jNuN4eWBp}euptO+_}X9Boqw^=n-9_U6M(jp0ldoC0n}BZ1vAE3fyWLVxMr| za{TdM-y-=@RWA;f@@upF0@yS?o|-NNaM*3>AWev}pii-3zAq$jU-K7>-mm40t~W^; zZ~Bppp<*KbVInUUexa+4MerfLQXtxx^}P}9pZHUwx{Fz@mT`#VNzsf@BFRqJrpwf1Q7)hdBI!L6@o>@W6p&sU?JE#H$9&jJa= z?#p>Sg_dG{o$Jv)t??(TVz+c)dg6`8G|a>j#?!G&qG?R-^ZFIfXF9uUiT-BL0*`4G z{qz`*nQD+IK|fq(K&v5tb08UO8G(!OL(S@ad9vSP(^$!LHc_$kmF;{MUOezd)!kWt z+ch7x3<{$irO1QMM`$>Tu3vZ}gg?;e;p)5y9P+dY`F+HPJNwkk1rr(oK34kUZI-bU z!M4G~jPrX?S7Y)36g5v5N|227)=|@CN?JQ52+mvFb!rH$*b)f50kaR+<^)m3e`VVO zX~rFq`1dP)Ogi;B4co7|75E}{3ZkZM(J8@6O25@X>UtBfwgKpjDnB*B)41BpHT=sR zZlLmQG+f-HOd3Z>r%B>@%r2MV%8zNk%v!DgYD7xpnhF77`9?ua^}^=Kv}&?qKN+x+ zXzBT8gl3CbM^!XYdjmM?`vK5hC&5rG__ zbCIAZQ0e_G^xPgTLd}v@LQ4~{aA(ma*te3&oZppZtwsGMR`tWx=Q}P2Ol9tzf!CIH}65#Q?5ljuxld3cBW$5*+4F3ANwpC|4EMzYO_YwJ_b!tUCQ zd^n@Rp~1^K2;2mG%BhT~SB}N&kWp6sVds3W=pwzTK44F#=5Pi#UQ=kPzdPz z;(VlajSkvHa43Jh$j^g`^ lEMKKLz6ONS+H4>@6Wo1pA!Bes!QuU9+UESH&R(K%|r!UQ#&)aCse(Y=LD&R)GnnJ~C4wvVr!rS?8OL6xo%FLQNZWMY+5&-QbBMqog1NjO zsxM&m9Ncrf43+%O1qJqqci-I;X77=*nnioqg)AbLwZimmD8vsauTtcSi7yaba;&=} z=he=#JAYxU8Wlvro;;yJnytW#oCr~Ww@F0lS-v`zzSC;77bXtF7cE(gPc?5Cqbn{wj@WIDS)cQN%|SiIOQ1cTxpkuEzn@m6E%k zQq>81KrFrAj&{+>>E$JgGv6$L;&xoa7h5t=$P8SA{=&2{CpImVJN+OX_{N*Jn3}co zF=jYXm3Ep@(H8a{ym%ev0CuJcTdV5#JS}s^TIg!o?`|oXx#m}e`*lPDFDBn=%(%qb z(fr=SMXwz5Lr9LBar#kTBYRyh7w6Hfc5=;8giO4^zt!q=G9-5@xyC2?L#zmeFJHh^ zpzf3j%Es_=)#1(n@)6xg{-mJcm5TeNP%4{!VTk2mxu7?^Kdd6}EhxFE$_ANkr|aqv zy3hx2?utxm0T7LmsFLKQ9%gH3=mOa-T$u0qZ*-+7uJB$m9x4yRHK*MY{FLip_U12> z1?115`4fQN80Gx%372n%IS!nb{L_0+SGr^f`~ed(EnS4uyCnZx$R0;dH zpi_YY3e?Dy@0~Qb{Uz&Eu54sD9Tj|m1zF$yl}XId%ZW zp&d_?8a5?0`V~PzMV=12L2-6Aq9dijvdH9t7XcNEa4n;pSdKH1D2J;(u?+9PtfRdv zlyO3lZlp;?WaONRaoY4YR|KV|r;?3l%kdl^eUOLUm5rr^4i(t2#j4Ex08LvTUKm+n z>!a0*D|rLL$R`T6SH@|6U!9+#!fX@!D81ezmDN66&3j6ynS$U>84mo;@yGIZU^^ps ze*;zxq}<=LU`}~H&J8#(d=&g=byTDd`M ze$rHtyzubM7;*{2JS8t0)st<#%GVO1tFd*Ly-~&0b_tMRvJo?vM*rZ03b1fT4;>X_frg>The6H|fG3`Gum4CoZ!KqaD2(>J z3I&)Mg>td_NxDf4K-=<+@ zYZjsvN+m)w`^~*DWkE9L z7ejhI=R|+#vrRBJdPRYa)U|NdxjnJ8SZhDdUe=EyHqiy~Y2CW~`w@)K>56?rIyi)m zHcDIqgt2;${&Il>#+w(cEa!2KpL3<6mj{Jjbt^RAaWOCzBP9FeaCLTm&W9bJim`>L zGnX_sr-^Sa1MukgyFI-XUf6_E8IdQ4+WFOo#~p)b$@rT+0)m;;I{rFvjHoL|tmzXt zZV9WO(wl%U5goRX<``d<&fN;9JBQaWGd6$lMqB!;sGybDZBhbw z2jlZy>T8zSGJU{G?e|vT^}U_~qok$l;hbn5`oTs+!ZR#6XW9D9lJvo!l#`Slh{r(I z)M8h_BCL;T`Y<^9CPtiUtM^I@#;;JQi!P-`a#{8yduq5`A8M5Gl;Z8lKH%YSIWIvy zDyI(?T6+=86@!z7kut3@V+kaG>U_PA;`@P7jhS=iI@~W>az*hQ8ZiZk$G85 z$W0ZUilQrVbOtIhS|&xI`X z6(uAc?FK~cA~&qBmL?ba+~|d};$Kh<0oJ{o)G9&LU^APR8(ebRS*HcMLOK7Yx=r&3nCG!9N{nD)_J zB!Tso=Y*g0`ZyBYzY*!0g5YjzIR`eEJ9xB4ekb~OvoBg;&~QEyL-d%H9=UovgA$e@ zDfK0OVTU9#u|r{?!cb$Yc=HE11cE1OSU{hzDd+_X$wh06_OON+W1(jbC5QC+ayJC8 zh%nuSQH`~ts)f!9{dVOGkm>BV*SU5vSM?~E+Jkp$Nbg1+yRGlvtN5%wEwsPOL!;Na zUJhF=DP2-4*BOM#>_Df!qzZH2DyOpBpf|Erb>nIrh`On_R$?sKAt|F-S@Ai1|0`C= zkp95D?|<^vjZd@{tGiOQj6;nlv$~vx?FXew<$J%kG>z*|gAbfvr&hytn~29&|5ewR z5AHJyNaWRez;91cq0HA&I9!%`A~+s}IN4!V6zoy@dahkFM6bPXxaU@^OX$!dZfMW#-~1G#B1A3MkSZ5y*EYeQL$^pplNtc1wWKeF_^re#KWas!#O0uX2B z6{YZxsLo3r-4ZiOb<~z9S5>4ieKy}jmPyke>mZB`uIyVK7DH)*c7c9re7u2UK=Uf% zvbX825i1Q(4LlkQYciFDJW0b+xww(>fv)A3cwyVMof<6KsaIOTc>_;b(&0Zgs_TDs4CYOnZ7 zJ>R_zDoKt|{dmQUhC4zB^cy!wks->0zd_B`co^OYll6|X=y^a$;i#IaSEuv)8U1=z zY4x^ol}k{3=_?qo!LG{hRZ+s~P~Wexap$M2K_ha=F!K%mA=QtcgugtNP2w9);>yeW z;#HY$``k(QB^aqY&4h0qUTaLHzGe~z#%s){GP0_b!jA?*ZUG|}AX7juu$mpJ?UJ_a_qDf_l zYF`XS_j+tt8KSF<@h#3owS0T0;KW=Tl-algW&(fnYIY1GZeyveH@*EX4V%Bu+YJ?l zJBeBsbdeo7MRjnNs3nnG=P3VS#LCgi8<69U8eQEO++9K+wUB!}T**3r)R6ZQA{7dA z{6^t%%GlRT(6*zEcc&itEsKMI8#M4<$1)hLl6&e#xYS-OhkHsSlQ@)3?0nVak3h6!DUJgrvj=9(N(g9=|eQ#*>0XlKCPzH}PUvB8%*`CTL#x>-qvO z2i8AKk?)%a61mZhSnok=4R9t{;vk&PRcp#pfLkg}cGI#8LF8~2r>apg3UGy(N%jd< zBF;j=uZgs6#k88(y#i9&TdP?iHY;ISk$&wF7p3bgd(3 zoiHLdMF0eLsPU1bB#TIpg#{@g2di2@8h^PuIK{it$_1!Mmhp%m34zTX!^lN4`c2Ns zT9g3qK;=~5$AOyu&5(;b9CB8Dm*W0**cRu;lvDgf#qQgqf?qpE<{IS#EbUA-mm5SYiB zC4X0_>QNhiR*V1UAKo~RH}X=E+JM8~{pKE)zXMVaBWlOmh@+s6;~zmP?PLIq=@Fza z%Xs!zyURByxFOTi2d&>&8MTN^zZ!Nyn9=>o?H)8$yOv)yv-Kyb){p+<0dt}6!`a5k zor+Hu|7}jSf{I@ldk&GJokD`bVsF}f;}`{PxU91{NFzvN7Ok7)tPE5H@gg(yp2jVi ze!A3KUz=YCJnQh0^toSH)xW0i(sv&i6%hySEo--lkw|}BDOr*LvfEdR8GC_#5=LcL z5TbaaSkUMzE_Ka)6Sx*7s&~DJp|v`!GiNG>OuH4_D8Jdy0o>wNkx5j?+*zi-?NGs+ z_hyh=RShcVN0fr)Xl;(3q#C~McvQ)jpoYFvr6{o9O$!u(xB0`)qi5*UgLEQQLK0ag z<3?S)csN!(@T;xe57xoXP4iQoqtU~fPa3OQdYcrmHPmBoaVZa-cEuqZaA7j6M2(yA+j$jsxnRB9`0d#&n*bZ#=rFkfFcU5=*rw47d3D z?F`EMlj}ap#|HUc!rRGXLaJa6$kX=&x+-53kJ+*>yv?DM} zVcJYBT$b@(Ee_Q`pwS*Ir*OIoJm?&Jud+lH^Oh_1E29QmHng%`jMH@M>CFy#VmqP< z3g5l4j2kw&L(T6C?x9D0B;ama6vH(q#V7h9VTt<997>X2@TKF2_l@)GMRy*=_Uolo zGm7Z^p^ZL*b)Pr$`h_6SdUdc5l{bH*p);1(j2Kdx`DGmjY&MXh%pC#mkMqzo@y1*D z&1+F2+wjbi>o@6qPq-4ys{(|-jHmEcDw!I%CZ7mIPTp92?phncr@_Kua!(P3n zN)9&$&ao9*&c5to>_d#x=NeB=Ple?LgxqvRnFb`|KJ>zw`$>tHIkg#^PKG2;Vl>J( z1E$$F5dpJ^hR=Bu1bu@=_}33}kB@PXHT|j+J+q(@Ypgqyp+NOIlg5`VJSu!!DH{+h zJ7ybUu)tX`RGK=1;+mE+DJ+de;xFt*FBwMJfEOURyXDsL^(-2|vJe`!Uc(e1-)v1q zHb?Da0C`@fCaI2oAjVi1wy3dn?JSJV6yE;^BdQk@*rSe1=KJJAOsl0XkPVTEhN0#N z=fZKrhY~9YoWC@SBI&Mr>Da=PX8b;S*dl9!yk%yQ^T4pR1jB#Ir2}vAYi9I|SPAv@ zx=h&~3Rmqit~cx6>=RFjHQoo`uUgOorNhOWSS$OzEtEeutICQ%J2UMWFJ%#m`4&$X z{t6qE`JT&KaKY5231QoN|DyW#T~0CPy7<0S&$9OWz7_|Z1YpiZLyJuFz>F$?VRJcy zJsMXcyO4e$amM~NJ1r~+O$l9ARCYWDizt&4^+7NaIReo@5#_7K!^}Bh%UD16Xd2Sb z`I6~pla|}c8Z##OlJwmw(BK|Gf?@E?x^mQ4B2ly426i=KwvV;b zgAzkJW<2{Q^2`}?p}y?e{)}SP#qUfUs`nikK)2qpmnff`f7WeO+k|N7r^8Y{UBWh4 zWf$gCuSe-7+SvNg+TU|}RP+T-P}!gfH~?SP{rzqMrZit<=4?gp*YeWZ#qA@N3`l6* z#z^R_4?lrr%!XK#9_113knOS#%t`{Fy6*tS6m~`0Qa6|{XiQ%tb@O?{I z4~?q*?o!>ES$%GtzYWp$%Y@!i4piBRBIVv7R-Q?N0YY!mi@6o{b7|{29U1(Q5#3S@ zy*%TV1>1ut=*F;r;8YOaWCVQikz3JE?>B5Zj7&Bq(P0yqS9+%=C$gV{ge-6BJ4H-W zz?>@Q**+0wbY2w46siGGMONnY#q!;NM}G+`WyaFKZYN=g`|M8sJ*B!1E=tdhc(0tO zMty`Q^;a+H+OPB>fs*Of=C%(ZZ)tACH1Z=Yxl!#h@+1uZDE9n&zxD54IX?^3#W=Ko zr$05d`6KAxZ`1)4*Afo-mRoR0{a9=t_+G<1;3Ky#A2MAduaOvLU1X%gd|j|g;q2WeTGkl;&o~%`;nPpk*-#vw4AX4Rzj9elJ@%ynZfPC1M26bhi!9&F$xj>y!Us3#+Fn%6-7|qk z>PD95)C>Jp1`+eE&gMfcAqP*o$Zh_#MIXQ?5IJ;sx=vbT%a3=`?9-)AL3&#Y@L!xZ zcIZoT`K`Gu z$Pr8B1by9BYv$z9DvRBm8O2)7V)tVxDShW zxJj4I{;uFUn79MQVCc7fV1q0f@Yf5clD-)x;2Y0QhXv~5yi5+dxTg>2l1 zMHxeCGa&76PgP+i6dqloIe85vTM-LBXH6%pfMilH?}auGJUjM;_tj%ddXu5*s-W2w zIrO~D5*VZ(DKLIQEM3jteV1JYlE)c*{U=;U8iiIqlJhWWG^9Gzj~`n;TL$Vz@R+=z zCf_V+RH(P|ik!@cQhA$B*Yr>-SgQ$`;OxpSBA#{BJL5*y8+Q%ooP5x5W0NU)*rute z7S;PZv7l!}ID5&8mqaly>g=xo80{sRO+4N>pZ)zdTWilx*wtpH3GN`c9L@CCLbbN2 z#R9$-Q?CfA5YP6J4CwX9G~m2X!*+VYYjg-EFlW?ndHXwS*6jN3;C;z6VZznX<~5pq zXTqC~zs4)XMUu{osW}0v3DEQvTq?Aa^AS0Fviz3nf?&_}`YcdRDSa(V$))KBrG?L! z&A8LMiM+&%avrb^ywUZD-)QwO$by`@cmTR&?*U-&|#`fBa^yf~Y6!+D=tg@CRg2{rJGnAi$3Jh0S= zvi>5e7k_~*aCtRd;t=hfi)EiKMsmWd*uy@1H*$b)^^m=vmFkl#fq&hVV;k94trqCd_qAW6&RV(ls^+8VBNG&0YN4Q;v)MQ19}Chhj-k z&@+vaXy+cK5MvqXOKL&cZtY=V{b(>4b+ec)$c5s@dSdd)o*w6e+HUAjY{@6xJ~u#; ze40m2s{`%-BHDw0=h5&dBb*2Axu#qL1U)F22wP0sSj zd`2*k0E>N_9txz)v>jXIjXKZ+C=1raBPWDd0oa{TpC zKEBnwe-~@FAHl8ayyoAc3t@$%HU(}W7I1DH<2GnaLma>7f{Ov0xIwXDx6DAS<} z)4w1laeg!NxpJQP?8oXk^))V~Y$2MAdK@5~h1l`3Kw}0!bE4EB9DYq%%OB>@v%X!^UPR*m8}ug=52b2tUS^Kk*>-EQ@1>Q-MGYT$mbotYTt^mXjF=txH} zDA<9rESm(LtRIK38Mv-6-F03NFjUI+hT-j9(LZ;qY5bv*I3~%8x#N!{fgV<8N?To= zq14KfH>M)y6;=R=S{ED@;U+fjk6ZTn4IkmFd6}IKk zM@rxETgT3F?Nbatr^y69uMvG@$Q9i5+;*jMy4+!tkEYG1%Z`%9tIA=qg6PBkcY^}0 zUKwSFIjIy)%tSmG_!z!eRawb3Z7e>NBdW5)y=h;Dl|~;W;pgaqu{Yg)vde?a@1tiJ zE^fyvU0NdsRlrVRAA6MRoe`ZW@gO@m;eq!3t`YQ-WFq%;3^dVOkhxTr(eO+xcf@zI%6J!dNMIG}2h88=@a@ps!LAY<-cM5?8GjymzvY3* zdMA*HWQ>CzV|~!#JKr}DUH^k21fv5sRcS*)E%Jo$tq}`_xu1L=@yS3}$z%WuOZ``I z@+F6NOwD1EHj+G3Z*=(#_oE_5qlc#ZVO+wYcgqN+#hEL9`$p4mP?8D*IMHca#j9$! z`p)B`@2~Pbjy+!apx8m&T=N!nZ7`vaFDsd9{3Z$(VLx5eebrY2U&n-9O6<$)av{;tY|j1gU|~<+%q<)%MLI*yCy; zsb0LAlO@@6TI-=2XMDSfZ0`QORY~*Z4t7j9>-N;D66|0GxN4=w(-tJMU>cG`dd2x* z@^N{e*N{xscJpf_YjLmSOT$b^Y;3Rg%8njs{jYQnI}j;yB}!8pX7e5u4@c)*sGknzKfh@fBm6*D)YxpOu}a)ApSxRm_Y?@U(QdF2|U& zY$2KvB>7jDVMgq7*9Xa8Dcd%gDj#&nQNQy97sQw33R_(M&gdd1->1Z}g~?8jSmxvl7XfzleA!lsImSRa{drm7hoS)4uWy#Vk(gG) z#e1uEdb;y+{FwJ3OVZ~J>2R)4(Vijz&Jocka=2ZfBxx$kSHv_cZfJX<*m-$SESvv8~XDdTW0xQoc^;7lt5{6V$WLDO5 z{#`R+n@_mhpwJ~Z4*6;=aRaiKCf!Xn9SAuJ;>TadJ4$xvDNxbyVW&-c)KeeC2tid( zGK;E8vM?MZ96yVDZAuK(0>AsavG0aQ^)%00gyAOOjYLN3q+X7vcCcmj=L{43JrM(uERY79Y(1BUAk*MKiv*7WVpF`^W4^mGIBbBYxa*e5l4w z*z;M9(fdtJtrVx%&*S-yv5i+W&r2DxXFgJfO+ckmCC}6At z2+hqG$AuJD;*(6lC@Vf<;A}d{>lALA6xAO2ld7C@hZy$&qQpPk-K^F`>Gm}rz~2M< zwe))A&z}jB4N*2k-gQ)2i&3~^DzlF=kzfP9Q(jQT@b@(s)aVrg3uvlXTMDpZEdQ|b z3x-7T)5|bXAUyx~lO3If37x0=yh^Gz-TQ>SvGL~i2!E5<=i^Ic!1JOEWH$b=i(J-j z|8ws*Og6vxO7+OR+grSB?7>IjL9Gdso=)o-(x;X)DIUl0UOTejQ9yvXW$?Egmx)PQ zZiEeq2+MzIqO>N&b0qm?1qpjAPUAJSPdI{(j@!yV6Fum&qey^1eg@yQu1J|mLKPNi z5szEd8eip0NjnQ7@FD#xbrZyFH(npt6pcFfPVcmrwArdZR=mssPBD1o95b4hEXBMQQAnzA~l0=_3(EBj52#O)lLAVSu zz2uRWW|$yPlDLU_IhfvgXg&zfum>%{*r^HFu*vJvZi{&$uHf(K6L7#*?wZa*bgDZ_ z43=HZ9Su8;Q`#CEMtNVBvbO$|T=;T#S|WK^nNIH<$2;D?_#uT9Ih zV5BT!>@l)+Av_7dckQaI`|v~9HC-BsYx{kB*G4!lPguB&rIZwBL<)TQy2C}vQ7tiJ ztl;_bDy~FQ;D^jr8prp_FfZ$qzkkpdPD5}`QoB0W00zCG$zz>NKD?a7@EK!92Xc{$ z{95@sQV+2DFYbu6meQ=1oDo!@FEE&?r5I)~Pj+Hq z|9ZzjFPAYa?cKT z3DDxJh7Qo$DAXEWI8vkJ4DO;Lf=GnaH~*BnK_#z^G7ZmVXbAi{$;F&c0%PDEzj9#c zj=!H%3|w2g^!wH88bfABl{%zLe!2NxP2N{N7d&>^)`W$!E23;w&o@$AOu~v9&{4MY z=0iftesrsFY@x$teCDqf+qXJv?@De#d6J;TtGyu9(Vao(W``FQgADPs0hO-gfQ{Dn zMxX$Eb7YR*leak3?vpe{&9@HEb_tUtbBzU|zYf7Si!6$wv!djU%T=Cl)&C1(N2# zJd)@!*uR;&AI(MkAt`l`?j&GBmxh~q$6@Z2&zkm67b@-?V5lDNq3#B+>#|>Wqt6y= zkgd|lDz}o1N7?uZIi}v81XF?$es#Ci*@MGc2YS z!Ot5va@HSDP(_NP$v3^l4J=H1Ywsi}heXXydn$D;UNLt&@KFE>K=!{` zs*8AC$e{`Mxxmr*v1A9Y@K3JSDjR*=sC&ymQ^)2or{V8j@wjBB)lZBBv_s~-V)4^( zX@y@T<rbD|+l_-kOWzr#)ft zqY>|FBr6Z(?oBj>I=bdfGd)|!s{_EbI?O-H>{-S*FIKhEv}N+*$HS%&++o>Gnz!D5 z64zYdAH~(dIItO||KMC!h}jJ7yeM4CY7E-XP#C*UY!f$Fc5rwmAr5@7w2)h>NGS`1e*WawhXcHD6M?N7oVC z6&FvdM-ujN>Bvz6xyy~NepKCUwIuTA1}LaBy2d16A& zmG2?u+0YLL4iH#%|0JK-9?H{}nD16Ns@0Q^3MlG4iRJZiHG07pY7*=LY(HD6-#5+& z32(JbsWU(!T9P8d4b2S==Xg=H1md%bQWNX#nu+Ew28$Gzh~;b6x=zkkcd{kV|19Yg zQeWH!cJ?FM;1@1N%is@<<(?ew*KB>6)hr2Z{}P5idVzh}xb^t7cR!g~o~SwZEC52}%`HtzJik`&=GbEd2P!uXQA5YbhWkNk6V95N^upU}F=x=#_|F<5$2y zz1&=s3wYJd9`P4rde?V37LIBBnlh-wfxSuAb2w%>kB@U7AJVxWQmzNb8OO{5u1y}d z9HqbeltJ&WZdB+~KKpW4jrd|x@q<&kXX?!;C?*=|s)G?)@8&QzPL3#g7{EB#;S0o9 z-~FFv7$f<0kyRiq?EBj~3XbVcaIh1ugPP>1nfgXKPR^$ne!6t=0;d4HpS3US zGGg$9DtcaM<+-9aD$74A{6<@&Y|FW14-bIuOwn$F-p>4dBl*%;ppA_hFZ*@V-jUfq zx_8`sh5s^lzQor9NkVYICL#<}U`^pW#9zagehnsH(Huo3>j@xGxlZ_t=sskVqJ9)Q zNPouY`-ok)3+(t?z?J^sQH(}C8P~(w$4x(LI6}&NBXT`ONZ*;{9%Qu2S-e~~`aN~f39?UJ@JEyH!(w5+@2EKl{5N45 z(|7;1SR%@-$Qa`pcd3MkNKKpy+w%py`6L72Z|+wQ`6$j?iDH=eB?NSm0wJZ+Dfh`3 zY;)*))6jRlXiItp7EbH2rSu4*Lv1)doS4P6;SV-)TieSmvY(ZLeaB5knvhQ?4R6;a zs8Q!`A^PwOU)t%S7;E>g?4)#@`~-aVyW3?9ao^cJYW22WR-`FS+MvkTlJAwL&&C6h zji#MI#$T^h?|Rt?oh$$|K+L~DgX39!07|sSqClrwezU*lD?Tl+u&-k`#$ynD9^o5E z;O7YSn)da@QXaNu(LJF&dS0(Q%>z{FJ$pwxRiJ4aFITA*3QgCJmO-4%V1{;Lc|&e# zhjMcvZ1!ieY68LMvh8E-MezVQdjnz!Eypb^Rh3bW)vuOc-5s4~iBq8ZJ~Gc(?ueFrj#~ZlA{x&zk=ah4@+Sa3iJdK@1W-jx0hn}sLuy1_r!}J z*ctaim&6itKnMf+H1ar;Vnd8RA>$|~>RdV70JB03M}XX z@$MmE7O*9R4)PfCdb;2Js|QJ8`J7N@U`K8a26xiK#9(U>>E`E$;U-*;bl3kx4ym|3 zaZvzj1wHDfm)Lj5#pA#&t9s9w?NLw z;zUiEJM}WNd?f8=Lg1?aIR|+N||1Kkq zp6=i|KLu&@B)beni=c8&Z&lU zVPa~Gvn5oF&w{*>-j%l7eLZ|c=S-|0`Wbzfsl)`Z1NsHOydE5cY7&z2y^W!G@uEA@ zr|QRA{t2ISMK_lj<*F$B)6?rHA#?NZ4tW2!0BmH<{O}-xCzoxoH^I0NX|jdiAG^X9 zY^E+7r%ora&KJB&P`ZADcB8RuvK;nARtu!@t9=41kOkwh#i|=22fyGjnkN{pMx@)^ z??+IIlzA@(OIE7Ec3;76le3J+xNm0wY%$bUhO_P$fz{o)6f&k!#U`p?M|MT@Rw1#3 z(>)^%lzRXDShI5wAv@K+K)Ke7lQVRP1jx^e~gCt>YZ9&uN z`+#V5&d!uBA7lwo%Uyx4d~=hvcZ--JD$GfWltTPZB1!Q`cB z+|~Tm0mzis0bK3wXE!`;h$OLG?7r;B9Wmxzd`NV{{hWlMySpisQ@D&#&xv%S1-qgP zaTC)-y9n61p-f@x9 zr5Jw3APTh5HQvFl_X{1IXbf#fMyJL5N1ilDpSgsZ!VA;7J%e@8GyNXAwf)6GP)&p_ z1#kpamW94dAeSW(Z0nC~%BfOubTI5RxXG(u$SF@Q1^TT}`gSZn!@*phXec14AOi{r zgf_MY)@!f}Z za4K#RJZUPOmTYo0Gq zoEgxHkER;SW+H`oiAo}|&J{dLF-jsdmV(9lXFhu|blWA+u9 zUq{%##6)0nsCgBibG_p7o`zzc6NR+l69rM|U2a1)`;!jvC-ge0H%yru*_)x!#A$G3 z8?rEGRiq2OJ*p8%8}G;W7yL5x)ia&N;Fyc+>s>7|kbpw?g^^PsRoVU9*OWECpgAA1 zI+Qcl5>jR4gN0TINo~+h!cHzz9hx&6&c{FN!U3o-6PBK6_hD@hq`8gRCgBbx^vizG z@16f`1Lxz87Lw{1~1pTiCaV`A2{cQyN}6M@|Rj7 z*>}t6^zJ%KMT{?p%UP4;U^0_neK9cy;DrSl@*tY~TIFV13szW!d5|W@l`wq<$L@$) z`@9Z)V`8kUg)-jw&ys0Bhmmg~Jpr{Nya)Qc5BGB!$FLiD4yp(-Gcx)0gh{wdc@X?K z8>@tQOW^nNqrFq~jYy8|!|Vp~)OAbom=|_#`lD*xU)53-kMXaO)u~ZjMdek_J98T* z&P$PMYn1nu;9tL%F)ZFUAl}aFn@(jxdip9r(Sx((2G^1kX~n+p)(+C>anoyXPqfEm zT45pnY!^MeUk&liRA9~uhvsP-qWVFz*7;zQo6eu*aFe@xyL4-)_-8-TCf`W0NQ)c| zJS_V$e|Nt?rOE)co|*jHo4?wxs;D2aG9mLyZ5zFuk`{eOG3qU9kdNF9v-)=+{Pu~= z@KP42Ni6jh9-!*Pl6j@|Um{}#; zoXLZM6ai!&jYC_h%wN}pb?vYV5~0DeTn+4EFvf0hIE;6(bH58PXBnljx zRg(uei_rIFwK_!c_K}_S2c~+}|Hc&R%&_M~etzk~TahsoN>PFi?k4z&9;2MV+%y!4 z?yoY*e8kGfM!)!DaoUEILf;4v=g73vDSH21_$>F#)ZP1Hb$MhEGA#Dh0Es;-vtwvZ zi%awngw6Q=5bgdN9M67h*ic*lw@aZ>w>_r_N!^^4YUz%xysKC};0JNmygK0bH*@WC z8?i^gNW45gvfMA--ka+wTkCLrcyF5BM<@9)?JbzMnPanqkNQi10}*VlFb{A*)?yR# zAx{uWj0R0s>)`>lu;8@YY!`N^!5SMkIK@++MCFg}{w%?FzCX&RSr*t@P4#>A^1rs^e&i~i82H06ZP3!2bU`Ou z8qRVZL}GS(j%J6nJk1I>%#u_Xd9z`FSz%_z9tnkiXx%wDT}@p<^;ze!-3$MIhQLSp z>5g_xSa)4%$tM&$NW1R%2`_)I0Af^qBULn}Q&II2GC9+Gs9XrKr*8i77_leKk0#_$w{JQf zqb;sm1Xg>e2Rx96VRvA2Dh4^fJM}eYnz?(s7|vh$jWd{DU`5g0^wIjNo#|7(gTU3H zZIz(W`UE_r{xa5^$Z3kKYD`QFPI{%SUC(v)hR8zY)J)%y8Zyhh#~C`_A=FI-g?grLaAg=a_D}Q-RUImRO7d>0acY&8 zK#?>b>E>9l{*=!paoJHzwyOsEhvk)~B&f!^;FxQ$$9>ut`u?dS%P4k^8S+1x&SS?} zB?`iOUWEnGge5uW%#L892_~DT{~2A~)kqc|Lvv2mSEA__0az(-oUbjTB||+#_ej3z1;BudU@nNqGq*YfsaTkjHmp67T$UUI??_BaDc` zyCL?R0g;P09u<0Br*-B4igpB$-9JOuW zMbewW!n|GzNX`z;C|s8Mg>QGLD^P|-OisST(yX8$Ln%P4X>V@wXCsbWOWVgVl)#{#O zyKmhZQJn#`uKjSe=UCd84l$ST@1Sc=U9fHoC*2^&&Co^Pp~l_M!g^b0fK3}@pZ50^ zaP!kKKoeP2Rh1#E4H~i-Bu4!RSL$$&pzA~YNSsnFcRXd5bbmiJ9#Rpj*RHwkT38n! z_ybIntWJBi1gdU@uB%W{uz0CNq~0oidR^oh=Zk+s8_C%+ouae&=)P;EoCh_V7tbfK zOC(zhjzF^ZJHR+$2=1>FGuupYWb7Sa{;BTjJ3CIvB72vvA$hPzemhTX&tdK5fMtEv z2OQH5#1fb``BM4hr`kPMsAeCy#H9T(@*K8o`NEc3l-a`E8&eQYyq+Tdap%taJq^R* zYvwcJ6zNj3aBJjzz+LMSB;h);p^y((4}+6j>$H((c(Q_EIbkN`+6@D-%otTESXGj? z;zHKa$;xZ1kNaXGmIRupz0p$sj*f9{X#;zKUvWu`vEWp{Gs%1aR`goKl*+o)J2uR- zyn02)%B>_ggJmUbaQ4FdOo}VHc|xD;*ERk5nZGvq!i|IUCyYt@`YmyK{ zm5;yamS%XfoDT+($loG3{r#3plyP>yFSgtHO@g?y3A+H&xe8`%IjX9VmMuYN)bB^$`Ku$Q`s`oGKbu=jy( zvN+J_u%bE4onrhWYPF`Wm5`+dJWoXimZpezl1F?!&*a_I=UM|6i0qH^3ips>7X>2RU%Jr!;6Jp2cm!6DBJ{Kq^DSA9^ zbSIxupAP8$Qr3#<;6Z-q_XZrj3fqE?j1-P+%)K7ux9X((1>P$Eqrr#C4^ZU!`e)!0 z&nT|r)vbmmU&df8?_3!mx5?#qp54048FY%v~&QGlzfn&dRNFxYn(a0{^&bj{?#>^_Ssy>+D^~=d_Tm|j7ufLkfEq?D& zn{^U{pC>aAc6yQ<()X9*f)J)g|2@|k-7?v6Eu<<3aIZ4Z+4DbPT?Mx=oyFVo&QB^xDs zp#Z8wUrCx8WkPRkPMhInS*WT95Ad{O=AlZ^^l-$55l32NdcIt?aafAjxuHg5qV0gL zPi#V*>_Sy6^qptsPi=FzX3@(mL$P8>a*R>ds{M_+wbu&*NXjp0lE;aNQ^50^5)6O!=6=GVJ(aEPi+to|+{dV|KqBHfwbI1kf{%Up4AW zd3(Lp$>F#}30k&)6D~w)Z&J&W3SxTE{mxn@FYrVLbXyC7>~}2NFDk$*qNj5&7AN}9 zptv?wB(HJSCJNii*tt{)^j|M}5m}-cOqR+yMU=|kVB{XKx9~6ko53;#(`SUAp**xD zC!c!?o}$Mn`^AN|Ydguw447CeE8aNIa5kfKG^;Z=_EO*;AhH9##R(zwlAtJ0#-!S7 z7w|k#l0;T6jQ6FLZx=7TUZNbjoqcGZ)W_OVqx8k<4#2_sMyyc&7b8K>ppxU7y+fEw zpEHE7n>(RV3`<+emo|*l0be1PQXXL*`l*k7#gqX3jI)BhRX)QzldbuH_DqlL`O+Mi zDNnX{COFI5?-K9*)}A*twaMj1HoHmPx=q4?+MLmuJR2DghiN=tncB$TsjnYP=lnxt z$BG~rAsw8EPrRIF#rgN19~y!(-WT`ziG6mfnC_QZ8+Ss>-K)XLU`NA}7V^yYre%4^ zq~z`9Bk46Ty}HX`Amapo`+1MGG!G0Uom3c@KpznbZdde8UwH34sNdl74LUkL1*ZRa z(bAWvRy)!q9?PTQ<~zw}#8x=qszgORAo~QL4t@CIjg8qdzTP9vPT{qHpxoVuh(OqW zLJ(3Zhc@rQ60MziD1J#b0D4n#e$y1zojZ0AE4E^|CY=ygUDR8be%%L(NR*DqWZT0X z)el=mKyV!6Y89=ShMr5n*zFexr%6#h3U|w3GtiOKvh(XNoFXBLDQq~T%hjs~%?*uT zgWV^1bR@(S=C}b6mY^AfSMqNqeruM}Tqbm-Eu&BVQ1A4Yk?LtU@rP?mUzvR7=L$_n zH-bPp3xy{(AWTH_n?Vo)h2v37qgGBflfic4uzZB>*#H&1lFWrR{ARfcDE?s}Vr1&c z|Gp$jX21tKP;-CV7)IlZjt^0mmspl>ADDAq$rT@dN6ki5RZB+}xkx}dkCVGR(}mqO zSmFXRJ78;}p{NhPJanb$?e{Iu)8!BZb5WvL7fJYy+b=eo+aG5($?d*UggvfFzl*vr zP}P&&gUxVehX1~YPWfaG5($28x1WY8U~s||{UQC{wbZ0P(bBI&Kao*G0=)v}2Eb+( zrhZ+ty=i=4XqO|Rn%&f$Yv@CwoIz9d+CizXF3-W!T)rwg%s0nX>2D%4ZaTnfy+rXE z;=gB70^FAHYF6g-w~aZbnc&!xBZK$6SBm(+i-pTj^k0(&m%BA`Oh*+bW z@4Nz*R&#k54Vwy$#w|{cjhb@z_jT)HVS@cnemexv8LJWMx?jJz&Utsr?5-U@TfeWr z7J(hWx!}RY{1-k)tL;DG{h>(rvHkOQWpK1*0D;X-9;+WM#rfz@32SX6?LS09@Kyfk z0wjLu?-VfPT|gM=R(H4hXix9cH3(6QlkT#&BdS{+^fMc{A_rjm!mOJGAQw zzO3N(2yNxI;hW3zw?UYG#^Q&G3vUG2tY7)>B#tin!s2Dq`*fKHpGcON+rkf#Y;DF+ zys)ydaYqMOS&waRl-a#o4*W?=30!yPt>t|(d2 zl%Hh>{uL%*em?D?e~|rypwafSb7lVJpZq0&WOR?FPR4=35U$DKNMpYBtTCMPxtXtw z@i$L`T>zi;5n1{y!zp+D-becW7@}pR`-EU^CBJjH^3&!p3~@y#M>2m(If$}Zd=JVY z`(FS&cC+UD5<#HR3xw3Ot>8C70&=W7yfq{|WqX+#(@e>WWy&{lF6)FF{loJO5!ZbP z7&e>?eB{yY!#o52GKF>`84yxQL1yk#6k!ll;GN|1)p?rbQA$oUKwJ@Ozm&dy07T=7 zGqL`DjKH-bpHz}G=TGHRw*=*DSO}Za3#YLpoNRF+rT#t1%U*F4D)swQ1fkh zuZ7`+dW|$)ece_h=SJ~;Qfu!$(#=&-m{*sS$;Mu%pQZ;N3{}q>z-7M3Z)p1os7_YM zwkgywi0XP;;AN6eK$UBSD&5s_R(_C-=xSyop0Yx_GfD=zjxcTa!})G>qhIr5|{4Of(C0}Do^ z+TzR~W*c@JgWO+U>6BCHkAYTtl&Awv$ieTf<5fffYj+mZkfYPCuu-8hNb__XG@JK` zmhVr4@z)o$gB+W!b+d{(FeoXvi3k!)V^>6;*+@LZ(&H zKcz+!5+7Q_`>0u(V7tZg?+ntdTzpv;q&2{uX)|RX3HEiS1bRs&B+V>lz1_io5{qRI zt|<Fxge*aj2a%NG4zc@uM_iIl*L7@vkD-`~UDEbZ_0n*W!1+Y#{aWwN*Us$VjhCTP^x zX4pI$#&4$RH09TiMgWRu!F%)zf_oXKEZVdQ+Wd^}Vjx-ae$i<+(woFQ*K=Rt{16^a zL6v>PR|!_f;mAPvI|ogtQ#qN^8-(>Zxm~D6c8WeIJ)!8VM+vd{NSQfT82*+Jm!77_ zu2P0ml}Dcd;SPA_Dc=0zDyL?D>-(rd9x*1qCJBf8F2QFY9g|hU7=9-TvsfG)p8=UF zl|!>X0eJLt+s%Q3uoE9F!$DYM_^7V`xbL;R-)2^1WP$^*3UN`+U^ zEYEe$DHrfXJX{HdlzNc#l!|-oSJz>* z`1b+fmhfV&ffg`KvQWpSI!bY<%^bKDdk7+deJaxIO#C=Pa)?M^KR{8C!p9u(;KoN^ zqb%JVpDcqdx5VNI^Z9v}5Ol<^fnjZ5DXXa!+_~MYo|uFVfKXNWEZ~VTHZ6Yi zj4Xg>&|3@!RtCIUgJs)~RzN$2_1%m1<9AzC>$HIuuL0@nLxRD{;u=C-)5uTa!S6HZ z)wNxNSrIeeQdyZMvgmVUX_>#2KZxjAlVy7$GCEq!i$%^@@oHj z{<$=K0)oBJmVLi=Y`1@&emKhPcl!S6>+kyK3-OV{LMY89=a z;`MeMt^n;9$9TrJ>bXNP^|t;vugFUvz4I>tbIFoN0vc(VY+J%Tei?qW)eLv6n%kCe zu|K9jq3qeD=ljV>t#EG)8yQQL0`=b{+`V2XksRq7- z*ZR{oDqBwJAPUZS0J!+IqS5j!f_f!IquYEj^Ho+L#;t!Uo-5X5*7YMY57=;OIJ<&* zC|nT3xd&D;UIbLcwtOayAcAQaA|*QvQ38Ri#owhP>y@uo^LfJN#Phuvg9y%!oY%?k z;hmo;1Gh0ij<|u`$xW$=5$Ri+DC=*XG(?dtH)J{*BtiqiUaz>E`@xHiC->meHc#mX zfujypfWLRou0NaortuJz2_@GJ<$Z63Zz;W?Qm5=RO9?gvN^kq>;Pq&TA>(OpLsB`r z3!phOkMn7dgdy^+jWMP0lM(P`0g*CDlC9+EK4!O}!M;WJ7P6(@Yl#?MW~~Vab2vbF z?To!%era8>`yLOD<4-DilQJn9nDu+7e4P+N!0yv_y`9*qyMzr6)~b1S@bZ}kC`H(GgjB_E%1p)^+km&yIs8ooGtZu9#c`ztr^HI01Y$KR{dlW(Ze; zfFEFwy6KdbsL8v8Y2I+gX@g5V0`uvXcVSM<^%+5>J|_X$;G~EbDSzU>_yDk6$u+Mk zNQ}KR!FpL{QhMwZH}uw>9)-1C<$1weW-`A{Z!V}hr4&m2s+mXvrZ?rlXkILQ+)WNB zWC%(LKZx?ScL*ApRQ|@4jX-#}6e?wRy zOj9lH9TYUFWDsUal1;zWn;*$LoW7G{64n(BkZHgo*j@muoW@iX9yQ=#uL5S z>LfR2M{N@3h5&@F4{G*)f%E00z^$d-j?{+^5DCKBe%ptRx$evK-;XHviyJSUr?XQ3 z&CcQhA7st&$j~huRv=dB{G&C96ifS0@7k?pqV@ z$h_cw?~4^btep7)m4eBngNrs6aMl7#iBsY*ElFNix=qRFVccldix}G()YBWbAbS+9 z9;2oPHZNZv%SV@{8S{LRS)g6Yp1Z1t;45xNvu|^b)~fdxTW|VTIa9PV2N7~2(Rr^w zSzwTf6UFDG%`XMt`U(O3^I_HXZ^8X}_(^vv^{T6O`%CaL=Hb)#VA_+)%6FcGg;Tcd z`f?EXQD%qfq1w9vSE{BYZ81fsK9}Sy*Q+)N6y;iKB>Ylr(Q`MgI&1h{iIxLt!e$+k zX5-W+Pfzcf1&*x_VqO01msKb6gY)8O5Hw^&MA~Z5VbQO_{b-^Nk$cX)u`>6P^JkrO z%KACu9|FK#r1gm7k9n?IHWf%`6t8*k4c#NgA2Np#C8s=t!Fxkq@Fl$IM&7FF^cIrX z@r+Y|5@(<6)c7pxS`&Q(8bz)n7^3nwBvzm$%tZc z0T6GWT|Tv+^X!9XWs;$+@#)4Jt4|AQ0&3BZA3f~i7;^Gg-laHZ2UG@yH9KM4g>*pq z%wA!&stdVa76~)P9_03KdoSg2Fv)GM7M3Q)C)VHFQNAe_jGuC12bS>`m{uko2zF-< zn_?{Sh+o8hsLa9*-gm2iuABS3?vj1nr1(PSl`kuJX`D;+Ut}jfoq$Q~qyTOX)m?__ z(U*DHz(QbKpz14CQ?^d`Y%7!5c*5WMV`q+HD|Zy5a_8L)t0#mhwK)Q=FY@Kf3^AfM zU}M9zsLRCk--4!Y=z4{qf3omk^r}h6cxR$2B3c2yWYfWV?!9#}a0@HhxX>*%30_TJ zI52m~E5de3o>aX0JBAlF(x)X7HmrKJh(Jv@{s~QyE)`P#IzToSN@zywmfJAvaQSin zHoN_Sv5&6u4#nt6rrpOUe_aCG==qTgOirIXFlPDjx7;DHW%yN%?Lid!XLo%bQ7UrM z$tPJ@F}+1Rfv)8P@uNvu2afw~+q;3(uN7YjH#2_*0MxdH6dI1k(m8SC0;NOV+-CLT z{GjDxHM?^YU*2se^kI%}sabF_?X4xUajiXvR&E-ogp)sGx zVV+|6^+GaOx>TDC!^mhqyz*CKz&vY0ThF3o?Ok{95qo_PD-v!6Qw%lpi zwZ&(bn^9n1Yp&e_hAigamUF|!_s|LRHH%+T{1(Mo`fL{q3yC6Hg667u{RtBS-Rfjz z5+z>1HATRLMs_P07@*#ri`xcts%yGwiC^|T^Zt?@h8JA6ea?1o`RG2$QSX}GT`u8k zou8v(zXo3mM$iCekHbiVwVZAUh+t9bn`eoiB*v|%Uu{Q$`UM{HmSPpfAq58`&^z$6 z%AF3({!&;6yqDv3*mDZgGXbrQ*zd4w!)mElB#ga>PeSl^jriX_9*fNbAurc*3N2mj zrH6SO;{eEz-U|kCKi6}tEd+$Lz60_88ps+_lgiLTqE6+L?E6@3($7;f{^ut{@BAQX z5`Qy5iY71>%dV=Y(nRep1R)KbX>V`^b(O`kQ#t7GFLmKqXb!(mHTfN={pW(_J7*<9 z2ACfwIqMKPpz2OL-?3?bvS5y^4@m3xxdxa7vo40|O@VuwU`Nl0Jo4dn3~>-W@&lag z$=bPQfTqp5`jdC-ljftcF5*uD<*&#FSA2}M!n1n(Z3j&q>Y|};DxNG2X$NoMnkMF# zBTT_`(Ga!uS5%ibj$3Vh(;Iz+?fJdKlQPP7iy@Gga~6hPcdkyPoBb&53*galW-HxI z5dUP1X&}07tq__zkl+9h4GxQ5Z$gdy;1o7?U07}D7HjS|@Du?a+5n*JMp0NRL`iWc z;2a;{P$+?H;UBw;ndCsLFIUkx#ff<;lavHgz*4^bgCSIvFi8n;*d{-oZqSi5;I*I2 zSTQp?_4UhEL7(Gs$#qfI-3he3IA_78#lKSCfK4W z(u>1tA8>|6tPg&HfaK!468WP#z*dpPAN=4EK)Dh%cKBi}?~T$Wq+aDq@%WB=nbWBB z9IL)8lwnzv6mGr2ji`CQEe^?3s$e5YUjgg&byumC*zY>^i=c!<9@HZDX)TY8XtyO& zUOD1adD%i@IDvjgJv6Ta8cptt8;5tCzD6R0OvxGR_z5 zN+FDRL0I;KeEZGI$n+Uc8qyY72gp?C7IQmZ#oI{y4Bv84aPVer95zEkX=H^nlKmj7 zg+mQeh-R-w*2wmNy`!a=2JyDi?_7QmMEp;oH>d; zFa^vc7eU8;yIn8XV}1LHeP?uR&THgIQgiwNJea6e3oke z(q>AAPI@G_R|4UQY>DQ;+|R11RQ@SbsL+u4p4Gp7a9@*pbzgt~X_C2^cVLk%34-== zt>}l+1!4t(5h9A>#bc0`mapBv_)0-HNvH$~T=hWmNmWY1z4>Wkmxd@*Y9{UQ{07&j-3I4ZB^@rbimEMl-f`%9&(EOts^k~AMT)u<~xo65>4px!9V6)8ZhpS#& zdL7^@yv+Vyjax6-xStv}#({_Or)bG40%BWy%RPZj6K)~6^Q%uusjI5LY@5DW9;XT* zM8k0iT1Jk+Q%Mt4uyBIG>M~Fd%cldjOnQn2n?{Q8@<~CZSvMqnW3O*1^8G;V08LtQ zGQM6mx+d9??Ktf5l+g!?&NZYXR7B3B++%U$XHAV@c~5!RcpU1*iDUG?Fax^m_=f6? zn;em>ZA1^;OR}?#Wkn_E@o>%jE72`+zrHrxwqx=8?m@u+Eg_^QSKU^)<8nA;M3haAzuTi2`a|eD@3yXN*+K+!Eg3Dhg zwZnnKagB$sr^M8qdsWdz4SIjOyqN92f@xi_sq8l{m8TARJZforpAZ6nsO&|Pdi|`%TrOiZ?JexPf~+!!s!RVIhoqaY7UR6tp@Ey8z8*J>pr5mdfur#|Eiu zzM+4yWncXo99e{3f-M7C`%_ES1UXoq!oIfMZ#gsF1Gy$!JVwFZv6%}>XT-!in10~N zAV0A=rCr&69Rf9PpsbuH)xAh+Hm<(v63>+;tSm&^*bPIyLraT2d7HAN-%A751Jq^w z^eyo`WV^_VB7o;!t(fUvG8x~R9-dEzoCmj|?TTKSIs)8&T9MIFzh>B9CbdkjD9 zD-z)h11EWi@RkjffR{fzeeLwHi5QgHItk9bHN6+Rmy^xU?@mv|Gfb(yTL(0t-B*U5 z*$iZMJ*R@39ccHRcXJZ#U8c?V%SZ7V{*e8>5IiAZ4EU9!-{rwrAIr^$zFaT*(c9|_ zL~&Gbgtn-l{Uz3(Dvz+I;uukd;Q_*>`Us&yWyzP0v@iT^j4;(dqS;^H{0lN;;sZWi zhOLQ-)GrT;@3EWB3!!I^!eSmp=F91D_6~=RQ^Llc5|fiW-CNr?E$8atnnDIBuc6e8 zsb!sAyjx|~gob?Cp)(1BW7+trr#dTP{?9U;@WCG6l!pg>lWYy?PLlO6knpT9Gw1+* zi)vNH$~(1&K$$@N>Bfv~QDA>tUh~d`(8lH&K6TQBZW<(&3Vtfh3ji{-*0TGS;)+sK zeoSrkO56mO5gOqk=8>0C(cFz}DOy9?aLlw>I^=WaRc#cNDq z%dgqSv(R1naT#}Wge>0Q7;@)?Vf3Cax^m)d*UL^#WL35wG-`C5z`=^<5GJZmhybdf!MB0|C!J`^fPmO&^n$!r)R!@?&x zD2nNrBF38DN-5sHtA3~o{8bsiYWL?l2z=xEAGd=a%Jhs%6a4vexGDaIAD!!*gAhtj zfK2{vv^^WT!^l28uGSM31F5Do{ws(?2L8>I#B?L&?t}40GRZe*{&NXTf?=&`9q%Oh z&VD=Pg(Nv}N9IHjG{up4Gc?`d1j|57J5@{~5zt6EyA1d|PQ_ zgZUK%UwXRy^HA3}pax$lhb^^MsJ~T2uELojubYqh401`l9jZ(T5h9FFo$aMKvU!Ms z=`?_#Z;o2Q=fF-J* zX3>Xq`$GW@HcsGFghxnu^V_$!-j)tK>%U9t1k@=aG!2vMb_;G5_df>ngs#~K8;_gQl>_>LV$1EAne z&6Wq8Y1CdD;5hnYZYiB=<<_B3IQwn?dJQ-&nhNsK8$x|5PE!qg>uYwTN&?WKLmIX! z(+s=&w2uv^>(aKpH6tya`JnKk6CjXvfuWqLguajmFh5S2cF$M|(Ok_JIH zn&s6pECcqp^7sJlw4U#Ev6wjhdXtd**-LPOzGg|6Rf7!IJM8mo2i`aI8=w^0cnEoG z_t(Y($mR`-eNm{49Vk6ja!3C?ppD7>pcq1_o`FaLsf|w3w|xLZ`71lsO#K{h+rlFA zb)cJH6bNnPPdXoc@?$D9N1Eo}+SQwapB2NbB`+)W$tU6t^eC9t`|o~LEfkgzzilH{ z+V|&<4+J@D1MMI=*%`TxC`U&>5bKm}mZA(itxd8IIgl!Cw!|M@&PoDt1vDs#{><<}3E`S&PmGL2WKp%d&$( zR$B?e5t?973{LwUNAgy>M}Ios=I-2nh~p&y%q0uafjMz^s@vy1X20dbn@@Nolq(to zPJ2SU)4p*yc+}#HGV~o!>q$F-GXzz@?SOxEy&^V>rw)n^^MfZOL9MyH%d9n_5N{?? zrvtV)ShwTBiB+`?#FFXZ*~05VJ)hLZ_1hx?L9kW9ChP0yGHz@s50Y)rLFDh>EVpcX z9+1qma-U2C>}y%$qYDDwop8K)Ao_J2o8Rfwh1L-w82IL#8=O*`Knnp1PMK-y(hh=#ic_ zkn4?oYHrNo^F1E*F9hg`$@bBmZ-^xwZqGV!KIW1=u)mk_hOF%6iJ_UMer%WKziMG? zhRa+5893epF~$khvMk7TH5-y*yQ%9ooT7MH9to%Sx!=DhC$Rcr%!Wf-6$+mU!Jm>> za<2AOiZ&P!AY@u+;{}=-x$rf${9#*)PuQx*^|t6-kRv!^P0dI9$iDR<>Y}G1yS1ZR zHIoz;GeGCz(_Zy*=YA10`N^jiQGA@HS&)=pGWeP%VtC!CXk@oS_P&CRC>rBb#ITj2 zMzDdOlhY3aL+J6M8n;s^cXgaIY^WYF$JV+cCs~Eziyl9Zn25kGFV}sOG*|OoJM{(w zzzDhPfu?`SPl5Wbr{Fm|?_%ING+iC0(%(jEqT0G-MwEScCPt?0m9`Atw6mgoW59?J zWv~QtKuI*fZ~MKlP-3G$&@^9cAd@ym;`A5P4+z2+tb#y$S|Uik!RiA>k3s^~*v-@~ zZ-ML+FF{-58u`gH>?ViP3a|egfTBz3J7n=C_^7DsIPm@Q#GFUA`w7CvSJe7LvlNefSz0(r@*A%$u7x=O9+nFmY?)x!K=}Fr zzccY)HH{-o$zN$0<1QCr&+6q%Tyha*#Rv|XJkgUMu2{GS;KNJ>np1bT+&Z)?*u7`| zI5zZxL2KdUW%BMzT#0PDKX@94${y%(6m*jb_TVl&3NUu(&|6c8joMbrzz5Z z>0dazY@wD1qVR>^>=Xu(G!=hO{GHF#`v5R)c@UVTKo+*r#u@bLKHgBA(eLG@Hj?SU zc!k6CJV?VK!M&HQmMbJ}a@(0PjV=M8lyGUoj0v1(V&LjJz1}e|bCN~cgTvH)2JCDD zhI$cT!Dk;hkrNabiE}DI7YSVwSoXqJGR&io`|GYyvkkn0Ae!66M5YyC39}rcb&+l_MYIYq+pOFBz zjQ>6w0IdQukfr-wL9dEa=|MV87sgMg5?qE#xq;&ApPEPB*U;}1b(Vt6juNUMsli{aA@jdk(XZLkKU{JkL*FOBxAUL!obx1k z4f`+6*6|zt$iV+mvdba$LY3d|wM;Wj8EWEuv>aXr+DKXNwT_3^j{y8|F6iJkd%KB7 z4*ceQ3Z{l4?_-_mutUXU$c?fZiXcl&pCmbh_O8)ah^jNfxt~DKSyb@%rc|^HEm>mX z$NxPAVu`67l3fPfCG@`1-)plfhs9NY>rT!{UtXKr;p#Si2JZ^0qhvxyp&_e8Cmm7MM}@j*&RN}g2S>}L|(B= z7_!$pvff3}bTgpS?$4ir>eDRlYxL4o<;zvy|F-3Lrv}=t`sN^^U3KsVr!=}_ z*%*<=2touy%twb%&JP-71OSn#q#^wJqM)5)8VTVIS|cm3wM^l!#ez{3v`gFX1Ba}0 z8d?*-BxuGUO927h$`LKNdxPx5;hX&jcjpnJpN@z98_O%6O8KU_CC%}p0&2-en~#m?b5p1?y3^-b8$+L`I%n` zNonzb7r0~^ORl8@`SIL1bcjLF@L8-5?H!GosaoUj34UdgiyW8M0Lycl*Z+#%CD~&Y zFUiNP;FO~%oZK<%JMZl~Dch7H+YX6Mko4}aaRP@dDUa(|w!kc+*I0l00^Su(eoZFb zvxb$v*qBCTyx5UA8*r$EBi?|TpGfL|`}tB|fsf^(EFBGqORntSDa`Vpn_E^6u4CKT zV>KO_T$I_-sss!6oUf|)NLRV_>_;`Y9A)|Rs1_g+V31un?`}Prros;%(SX6%U%IOBs?$t^je4W zW}C}>X4ttq+{P#4Y5hpHGSW$#hX5iFpWs(WZ56-!(E)2`OoUQQ<3VUjZbccrC<2iw zzU!M~AYZ_uuaiTGKiCPTgUbZG5yIZ_rD3GklGF)Ld}ZoGVvJZAcINxG?0=3X@p#2K zRyFq7nOFIej6whDt6KA5AQ3Cc>)vha8l~0t{Bk6vx{&H&}wesTZ zO?1y~@V#YwVjrE^ueK+7(+`4!A3th@a1C;37i2rv-MwND`Q0$fY9GQ4e#l7#3tuB% zM7b;@Tq009leMsUS&p8d#KmDJvMDywk8{h8(ReNqNbYah0hX&Io|rM#VtG3r8`*rO ze>*s!)TP+@T_o$>oZnCST=R~eVgw!3krV}ET}K}eJG-0|-Y;1x9ryllHqT+D+K_GF z0ML86S>}Pml_%FU@om>ly$(Dcle>?Wm$WY60#V_Qm=I`Q+PB~7jf+(C3H*Ev@eRys zb{5T zbUlugbti4G90QIX7L}rkG z)9D{Kx{R3r*=z5MGM|iewTvL##fn%N#rRsqhqO9t*0s;S8SJyvE7A0yvsC=HV zDWPD=&aqmMS_C8U%tEZ>1R7e({EyWry-qZKsW7y}fLV$hLXp_TQ7NSEHNMwd^EiV< zI=E5Q#qvaz_=PAL5+B3894~UiqUeU0*F0habOQ`uVHe7OY1+Q;?Qv|Rn0q5PHXI%|g|LPs%qQGZ6)0~I(Y1H>VyNHW%CiQ5!q5ty;D#Hpm4SB6Y+r1Ze=~}LToE*= zC^!Od5Yd-%zVR+p@tF(6cyb`w1)?@?0RM#6`SI!fz2dCkB&_6tkI+_rYReWGS^~&` z+qRL02O|u-`A;ySkl%wQEm))4_5(`vBsP6|-y@#|h<(VRomLzjKXE|89V|Y$jn%U% zu6d8KQJwXtLkyburA(0jb*UUc%`V>JrY=2i5_3wGS-kWt^Tq#M^>@&g+P{q^WDS{9 zO=&(#*9>KGP+lg3IDWBGz>jJ@8k#EX=4zE~Q{CsZ+vMZfRE_I{AFU_5ofFV@84sPz zzTk!(C#!qa<@~j>Qj6v}YoggHMAS^42<)shXR16S<|Cj~Z83<+I zd*2Bu6lL@WNcWH3x3{D|IY>>5s79gp_&60^z}h#;qYr7~+m3!2aM{I_Q9!Vu2+%-f zAr4ju8h~1ADE~Rwi?N_wCHuBekqrg@TfT}rlw87}|%?U#^1b2R}nPF*AetX>Gj#?^q$;2sptqgKk?tC3e5wpHbq7=-S0#U2- z#H&h(u(&hA9z*+{hVGLHT*V~{a}LLaI%>vq1Lk)Vu1|95->ggFLfdeeVFGA=|M8 z5Dg()BPy_-UH;r(Q+?lbZXEccF~!9#3sOX4!W}w%xAp}6y6 zSZ*D<1|=V7Vxwj7DZQ28^2tCl>vUj%C8I_h3r7$ZfZAV%pkFSd!*PPT=qjtn*47^* zFWP``=EeNXJ{JV;eK{=3Z^!(|+^edysM4{PV%*~Vf?}~kjAx-cCBNW@t1kPOC9{)2XUPG z!s**)dcTK12$yYK2ETc*iLV8^MS%1z|H3HYm53W0?zH20ZUl{%!xGg;PhYj(QWs(= zu+FYC>V-}F9S?a@8X5Wc-RA_fijNPdb$PA4qAJz%seExicjN4W)pU49sv2@SkJ9na zoINE;70D{T!-SbAJ^uv>Ah}{`Uo-lt#KYd6yuw%cQ#V`2oK z>#p9RJ+bQDZ-`7yD~;oX=zJSw~!w{0|r$%3y!8BLhOHO9=$3F1NmUpqZGt}_)^O(FU2e;T+ z>!JaFJR(E--pC~0@P|^1P!)|QyOL_zk5&#FTUDc&izN?q#buF1WBL5BQmJ zh-a~3rdw3J{x&P*^uHx`r^D_r&7-dto_^A=tOg|SN7(&*KhG=pB1I^={mN88|Hc~i zQEK9EVS`()Ucr}@w%SYXwC<%8v^K@`^!XP%=vLu;{YKQ&2m*;StSime?e zu*vsbONiY)8sNbOFaNCRF?Iyr?WNu{s|}43G54*~zM!+lE?^JQ&^_?mIOI>gSO|N; z__HGxYE2l!mKesCE{& zG>4x3Duu63tdXi8PHuSYgmu@<#mq8M-?avFN4rr1XqX#THbz2*oIv)Be>9vXOR{zG z^l9$jTUIQ^sEFeUiSn0**g@VrBznCfVTCGUT7b~lO)Fq=(VEhOVC99?TA@4d_TGM5 zBxR%^3@}OX3gi+cWy((H>MP8T3$MgP`>3*`c_Rd_u_kjk+SFY(B2KbqsS_>{$t(Pa zVbGdw;#w6w;heg&!8E@DSEY$++O7fspI`5?B*7=DeU8zMw#dTIuaL#r*M`-TVvh-- z=|q*i>)O`47ko)Z%pZ?=%qY;J3j97<40BPRYh#6oIwdT>FM>Y*nZ{aZ3TduYu`H|e z%5vR_8ob@YjnjOdPP%v`{aFC4^9(PPl^Sw_Ku!)H^hcPO@<@K#z1|c{emk^?e>i0p zaOaUtEN!-4H>ntUk#tT0KC!(F{0Gf{K=p!Pa4x~m{(^If5Fi0Gkla=tR)?Ss%ajpX z{T=1<$=-!6hx7MP06TSV0-Yllv2EOf-3eRy61G- z{TBz?1k`i@XtdErUgb{>Jw@W+Uq{Dk<5L35%3rM#O0UY84S)P^m0MVIdx zvhilG01bkueQmasm-$CnZn1LXv&7>2I~z|18fDG+u)|?j)19dVTTV9X9V|#G$0f;P z7Xs4q-ONVaZ$%idTr^LDt;Sq0u27 z(Tv%lc*`yC!OPTq87-WaY!N=ykyI!Gh`6^nuK4oCzrAbwBB%7 zy7dw>99EITpZpz%n=wCssp=7*N*zDJGAp?FEj9R7CDyGyJ>&~@Ql)d_e1KuEOHVRd z&=%Wi4^jM0lB6(v6C22>Dow>Zw#99($CAR`#+$9UFr|8J^vY%-XFwnTi_7_9_=Fb7 zCrgZtDF%Wp)*6Z6mvpXEXY2Nv=Z)jLW{<|n8 zRJFpT@ap?GPrfCQO7j)cZ*~2!0v5Iw=A2sM(6QUjymJF@HQu|$?f2eZVtA;EA1aW} zx$Lr0-b0Cb?pZtEg9@pQ{K5N>F!%N~*nV{rusl{9kYLoL>K`e9)-?vwIF#$}+a{G0 zIIKr_MB5yln1D{*wosC4e$Yx&R*Z{V9fD`}cUadAnGqYw|Bb ze+cSOyYjT}@PX1JpJZQCWu#0cP2AR}?pGZc3H7$U>C=)Xbo4X!el@x=8KEYtK9_of z9a3@R9_jpPDT{s7$#jf<@7;eZ7b< zmzpv3(YUM0@Azim`@qu{ZT?AdWqzzJwo^Q`Ld9@5IPwmjH&` zvkUtm5WT@=&�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

dJ*4fHol^1XN#?bpsz~gUqtlz7 zH-c~am0vkRYbcl)QnJSCn4mUzrtps?Y~C^)x&I2;Q|qVp7@Tap!I&2AGpnUDP&0in z*sJ$Ak5->*N)8)KeyQT;8$=m_CGWh~|!R>#0#ww~pFXvaSIrnx0 z*?uV~T{*HG!?!T~ac=Np#DMj!Q#TlKE)W(IP}|uFuI4~AyjlaM{`}=E3mdJp^o03V zqk-8?EcJ}1X?RdqBWL*YpTocrB;PrkzbV@W^KVm@f$@LTpFSu1Ps-|%)VJzu*0b9n zm9$}3_(e&C0n9V!jYVzk|CjpVZ+JI~8tD~SECi)!%h#j5y{vto-mV^Tg)1X`>#5r7W?${< zTC4Wc{drdRY*`4%7_{yyYUmwFC~#;$n3yMQ;_|sEAJcW04g;LW-1niCRWk&Gb`&L@su)s?2yuATujP97P2yb z*=LAtVA#H`CRBFF{@GV??>F-R+L#!&3*u=C_;kq@IxL(IpUbJw<>S;Fu5=ysdnj~Us}~~sY87v zOWr`h9W><3s7FL`X7PKA>yrV^+sVzQ7r7QE-uX4Wbe^Jg`En0G8McI9r`Q%;Y_pom z({OB4k5K~4DK~V0El#*rqNBr4pSo3NY1HJ0GCHj%PIwL7H&cOA+d*d|nu6<2i8c!Y zM;w)0l{6l#$xv-U9r*tIZkvdv9L4P8Cx-z}vJB5$28b@KY+v5l(Z^kJT0oH9ma3@x zOT>nAN4l@249n{MTjR6c-B7Z*ePaXuhdSq^K6!4>P!XA+L24e(3vmkq$;~wlX%V?3wFt5uu$X*1nwUKu zTIaLMv3l8fZBFqUvxE421w5G0UOmcSxbt?aRLR_;rkh`>?goWl=_k`3Cna%jFFRpr2&3np}-cCpwrC2M;=j=wZ(c&$78zpn((TSXi@)f6}L zi^2~!<`@7zK*7HwHUr_FrYv3S)4NyGH2B?iT5m61HRr769Dt?x>X%PL+O~Za^K#}k zU-|0o`FZ>|LJWW7t*0glRN%jb;3Nvz5N!&6U*l42lghvUVa?(mCp{F~`FHy)F3^}6 zA5b8mDboM_pTqf|1Ds>!u*Hrw_B)#JNi0}v$?VD-(^X%Eb|;vUN)c{AP{vhOwvAPp z85ivBmV|1nHRrNv_OBXk7Dj!+_uK#lLvaLAWDx^*F~G8`)G`^cQw=Dgj<^4*qMT%i zKBSE1L`fMJu&$Kp@~*#Z$tt-VqeC6e@p@TbwdgXlp3nT7U#tzVA8fP`3OM}bvgw=! z#uN<#)_7h)!t}MVUc6V+kFprUa}K*khykd^I)owt3H#L|%|6IG9PHyp(_xf2OsR|P zZ()M{gJmLw0?5It^L;;pE2bP~@?(rNi8Yski#q@OYPyQ}!H%*)BDHh<;NE-% zYiQ>@r~0}u3i->$jT`;(T=Msw6U8rb0q4D)^9hv!BTo$ljD%_M0O##v%T_+&lfL^M zYw@7om|wx+^^MGA3f@BaRe5gb;X2*-%yy>f!h#=I!dE{1i5Q3lYo4YjFvwKOwYAiB z5(PL()P0I_AXJh+mrMaAKD`tSX!U-Qz(M*{9t!h!qkL%h7Q=CJEwdfk;h(R0ovk$Q ze%tkj7iqvz$_6g&8)!H%7+4)q`qJ%5N#(dN&XW+lUq#j5zuYJXFw-F76S!bt%*n7uG$jlhbZ@+LcE-np=8|B>T~fJRZ6dG@Ai2%S zq1eGw1PuWf_4VI9C;-Gd$AomnE+HAwv7F>lb(s#%ENU*iDqGxzXCrZehB)&Z(vGN; zL{rDs9NTVPAu%;hIi&tn8aHu)YMA-w(GG6pO7o|wsuBY_8jYOnG-&ld!DjhMh9^1_ z%oMrxH?UvgZPZy3YoNe6Wp_L~v;%(ROu8_ba6R2u7w{`>B1+xUYOUEA%{6UFH<8$S zp$Qyo$uD)DM}6q^*yJ;)ag@-g*8?xMl~VRoRq zJ?$HWJ?#+t%4##?9BJ+$6Y$*y$KiSmokp*CG@fUoI{xk@foJpB^C^ z?)Lr(YeKY>7>&dRk)d`E&l_LWY<=hRKH#)xlE*bQW_|4j{Ti+35319bqnTuuG|2id zbvBPehHH|s6Bc=LJ0QpA>s3k~arqd7D>#Ik;4q4xzQ+Ew)v{y3@tC-9uX?5Y*)l&b z<>9DeYt#?`^Su7$Yg$IOD=>gLg{|3DJ^(@ZHT(Wdwk%zsU9B&Dr>l0c^cV%Kd@Y$9osDkJA-kbkNXUM5R_VVYM|h!rVc1fct0Tci;Gk?D zLJ!jTKHJJBV&bo;Eod@^>#nfxC^LTZ*w3&xLPPy<)7R6UFt~dl3^fZX+=>yp0ul$I zbzO7*N|*fSfU&0YJy5@zl>*(xSG*S2Ac}dWt+6`!=&D&)g(s&OT3TyGw#jL8LlnAa z^Q?-;M>`Dgg6i@4Q%ur!S^XE%@8jR5Vl7rvCKYfXpe_FYU0MCNFr?$K`7ghUwCQuv z${|;%p|C#BvintOl@*N~YIg3iU~d@dBe;^<=j#RpH^5qFYCP0a@OYi#?EMW3Ux_}D zic&FnknsADaM;LmsYt3m$FxRe6|D=cd3#Y$w>|olp2$`ZIxf=;6cv`My@Nmo6UMq{`@9>R^DN4RouPrz}S6$ zyIYhInikCUT>mwTt{SHF+s&!YEshG1x}T*^sPypWWVhk>W;rU|`%41$XM!E|?JL}F z*7A7H#9F|>vZb;TKYNC9v0J4D>#YK4z(P?ss%ySeSgLGlQ6jFwqQ_Ia?IL!&Doy@s za=1)4`tAL#G3~pHU9837;}}J9J|rKf$P_zO9OYHf_$^Jw_A(-Gd2CS)DI~okP*$PA z67b+v9zpK907XC0eVmr>(*{0Ohubax^s@{5=WpKgzMg?!Dn(n5cqN8FUS^qElzmuS zMh&TPFbTVE6I}Y!L{cD1CKwH#+3CPb`ucX{)L zG&B*Is(iLXZsup>1}V9;ue)2g0Gxo4$!R`SkF)gw+bwN}<;bjzf`+XECZ+l0VEAJ= zEWlH*h!miNw4Rw4!h^I(#{itO3Qq7y(N7N(lgX8c7Kgzf9BozxZaOUujdA!htkpwj zVTZCxuhY7%(Et$vqMqR1RSy(%Ya6&A*JHnw2T#*=(@<>3c=9`$#$8ZXY|FWorg+or zqJ7AUL2wcQoYdtJzODDov{nqERzI-PW#Pf0#tfg7O@Gm^7x_^HcviMmD;zt^S!|2rBiiLKnXC9;#&3U_2sx`@q=rxHq zJX=?T=c$l1f{Hwad6)G)Qpt9{sg+#471DbRe*;5730z{F+1<^OZ>#1HfmT?bL;zk$ z_IS4+A#ad3*UyVAWQ6|Ofj}$hZ&oXZU2{1Cv)QAb(mIYt{skupK}nBdAZiH~Xn?7A3{m(z%wvxf62=zeQo zHPsx$msQwVaiBtZfL5+9CEhRGs&;tZ(o*sJ=yo9Ncc|rLsTW}E!|@`t^3Z%_LIu=M zr(PUe7r!na0iEXUnIxwfxa&7e5W^Olp_MTl?Mjx4yDC!!$fndD-%rHIaui%#IL72+iL{H8PBpv9+F5oB@UQC#3??vAF z%CD4?B|;rnV$UsspUobZO`!>z=dp+#ZKylBPSbH?u?|aCCn?k8I1uQXASz1cSBd;% zS?Y{}U;}Z=eN0y?P-J}h zT@dH}A`4ALF1Q7Zn}8$Ee?Tg>APND@Re>+K@I3{FSDZ7CWT3w+@3aSk`GBjJAZQUp zSnTIkD9+43G~a9uXcS8L_A4{o41!fQo#)GbVYymO31!@75)^(6C@h8-xVzBrZ0G8v z0N75qXFH=`LaH--1>z;uwQa)dM z6b&NVqe*3&AVnNw zou;EYwaWKeV`&+BT)(hF8(&4HT6=>~ia^b?c^T21mu(Hn*`=baxLI8)6^3aq5*9 zuZeXGkFNdmO-#D9>SLPN{q@nx?r+y#M=?#j4OTq0dWqZRFT1AAb8s}wKj+pWC|U)` zPwkQ&j(PuXmHMbF&pN#1tGy+$SbcYFIjHW{zw)qt`I`H8XJ=B;H|ym3)5f^6)X#Xf zPCQ0+(#LGk-tgOtyRZ0f>gJ)FB2{X;CuqCtkbX?8V9rUQaRNU}XPNYBqIQ$h*r&-^U*p_cg9X6DnaSDdQ#tx$(tLMu z^x;10AeB<=+r#i?`HKHdnqmS`n;|Gle1ykf$>%*=WW^h_ILFC>ysg7`>hpDPB*%l`bM@Xh#uo5&?ScdxdY zxw6^VY!oWl%Zht<_lJeP`sIjDaEf>aLkn`gyG3Xmj_>huYk0WYG@aw|x8ws1M{IsP zawB2iNjDGdVFV=813r`WE+MFdmRjW5`OZ@aT)d<~1bAiRJg1``nl~269tB~Te+N+1 z*&CyfB$i|op>dNKeLbD@y{!w~81dKY_GY4K#-=}wUG|_-Cg4c56XA}CK^@&oINyS; z?Xs9~?aob7%6faCq6?Vm_7^M;rD#m*jKD&tB`z~Hd^ps6pRAA@>q<5O5jah(0Lq!3B4O{ zX`Dk@@I>KCARHm;#LFXQKVQR{nl{>xW*sZ5bJ86R-M%~=V|GJU+*0_-eUci* z<~!rV3|SU^N7(`xufnadxMQjLk#iIoET~*i*uqr3tRI*{EndarB z5>ah=q$Dq!<>jdAnUmYM`U;Yqg7p6(Ex>Aw+z1zw&TNo$gN2YV8pt$e^oEgQF?@K6 z{VW~fm8!>F=OOr#ppyeQwLn^LPz-f1EJ{$$3X&KEKWa3!X zdyf$Z#G$urQ3nbF%=F6?0-hSVS!l(C-RYtE;0?uamav@5q_Bp=1wz7bb~tJtLIJsB zsFhwUQL}z$4*59UzMIsDl}%Sq)k>}o33>vZlTDa*LO6h!D48x6g3oEP6jfNc&{Q8gj)b;_W2?Pl`@-&a5t?Ke^Yf z?CQ<3tro~>u~p~>vloBR@;B!Z3k1vRo;(#J{_*g{21KjPQ*EJYw>u><&q$S2+&F$* z_WMF6C-zpMrPCja08yF3`qbH!!}| z<5JJuoKhet0poLIFo#1@O*W=Z;k^fL!}3;6Fximv(Ar~O`APWNHOgbnZJkBIi%wfE zK48KUg$e6$g{ZDucs8;3{5-Y~ZkTv>B}sagBrGKJd5&0Wka?V&@BOkjc_4zAbl9=J zUEb+bc~4$6SbfsyZ~?67aFp`W?3B(=A{oUiIu%zKyFC!o$(%~d#I>73_R^l zoNbh6>{SEl2$PNBbigthk@XLgK$;F|8t+D1)`@@+-x?yheyJ^rJa1l4#ZlMGMx5!3 zLIO}ICrC5ps^;YRVopi1=tf1zTC9Ocp1fmjl1N1I%DSXmIJF{a$OWtkEb#M6zrOJp zBD-t4hX)BHFR8S|)}N23uD9a)OM=bse~)f7l&lsogaiVT^8MdMCG&qp<$t_<(xy(p z#G~@7ty1()?=ih=q8s*SYW|mrtH=9NiC*C_ z5I|4~+z2awKkKNIFUE5dzRDiXKA3G5{+tX3ZGTAt8lCkEKC} zt12iQ6ojcI15IAt_CajEu&_83uwLSOHzB)&En*ZrIssz*eMAYv z`lW2vXf+V-6b926Qy1#?Ims04Yf_MTTgml#6GpU^QW~X97oN1<@^`q4V%(noAzO6^ zR*X*1t_$M2+do3H)73OK%eJ5BQ!;QtJ+jzdb~LuIo^!ANZrVS7E4b+PkHBR6 zpEF8kw*Q+Gqi2(_#g6es6W&OmeO+-XQc4+M7t^+`$9irGYl}G|j7ZJ2%5v1oC$w1n z<43iTg-t;$mXu0=rEo86snax<`@#LXyO*(|k0GJOuqG1>C5I#h*kblB>;Ww$X|sY|HP>C`}Gfj zg8R=l?H>Bp*f+(u)1zzKx`u;6F5f(E?{6=LzX6`_59{|swn+J z{YztODi4M@@~`=aa#K|KZtV?wKkq!t{ns(dwyO$W98TCLl0&wCr+ggW-9JkG)zE6% z+rfh)_!iF7@?GG)#uV`Tx!J?qIBfGtV!$-`e7YovVAz_I-d#idI6JE{$ounJ@bNOE zaaN%IeCnv%n$g6qH%_f%R<5D*RYr@@^cAhHfZ49>(Bo~%V8`(D+OaY9?sk8AcQI4( znnNw&+fn_|??+&fWkK*mNJvS9w#HNuF2xd+hMrp@)?Jwvi z-#BGD(`kxsol2qbMc%xWRz z0%)<|28ax|H0RKj5*T#OIm$W}Up&e|dP;6y-dmargp#e>x8{R$*UoC4XaDxbL1;bj zT+MH|@|UCL;ic2NeTY&5`+!_G3WE{7~dw79b&Y_iI_!sf@u{;Ynahvp-=j&wbDxJ9m19ObRaBx9R%BeG$BTm z^vL*sgnEPvH_c&{`(%wU@NSnftv2JZE7V0dB}ve|9#0GRNrUa z2JlwQRB&&Pgf8CjBvxYJnI^>&Qi2voc9cp|(@c#ky-a8}CYzKIvhrp_h{a~prpCVM z;Z=!3w7;$tg~jDd`8!~NdjTY-JRn8kL5#Nrq$k1W5_Yn#TMu+bNQueG2no%B;2bwz zP)R8$YdMC$rP_k?w zR;1`*UUvUW2oBOV5CP9kGQ=L%D5Z$p#LemR9v;;&*tx9aGD00Cjw+>pb zJiI06-qa%odk*j6jopb!lMz=4sYVzpon$1l48}-P>`HspY{qi7eh4Kq#4wJifnHvu zibbacshs=KR;Z2yYE~SQ1+n{uKjvn9cG~p*=q*a6Tpc3#xcnE^^=dAiN;zyM2^Ga# z@^T?abwcU&klDO_XgZ+yR-CgLU6qN7Q77wHK*YMWDC8ZI9=Pmi>|u2z3QKQG8ue!I zLoG=65yGUv$1Lx@dk^R4UCXW)2DpxqNYtd~gX!Oo_$&qm5v6cw zt3qb?pw3}2{WNVtArX?L7{WzpF{H0t!n$Boh^J#5X{;$J{Znsd#>b z#mUVbEx^NjhC(2I!+9Lm{H3qXd~?-yWt5h@fSqBpNCyh@kk!AsZbd{&B}rm{e>Ws$ zT=S(fvLF|<+{+9p16d{X$u&OZ@XooHNvxOgBugk1>(RVG2rL3CaS3e`q{}jr1@=|T z*j;+nd{6IZUP4*?mMhDT69jkK+~#$fsz?Igy1oB z_9b9(o0|RwXFR){tRY5N2_+UuSjX+YrwwZ%w$upne9ZWSzL@#~FWPKwpRBWpErN0) ze7|JKTrVKEiGk5`M&jI;rS;gkpzJJEA=9#)G*Ge+Xt*p{8AkGHIF}d*mZi113)2Zx zJQQLptg=;m*e_h@Nq<1PWW_GV>+2=v^U=;NBdLmABAP_3goKc?)zA=(%T;ZGN#{9G<3bFbQ7mpo=Iis0H0od)#w$~doJ2o#YA_Q+5W)$=TPKyF0U*_&j z_E7VJ7EhmNJlWASCoG;~cpa|(_B>~*&aMjBw0|_fWS#wV^$C8C?I=cclV40J94blh zsvJrRNhWd-T&G=KGJ)`M;&IqmycMa7QGI<%(+J4KObw8`t4W2H6wN}eNJljiy$){e zIq(p@QWLDbH_zUA3_VcKq{Y%j4uOWPkgr(!NgNSq<(WYITN9GSrr&hEh*JktHmi(` zSZ)^w^tocXS{qPdtXOt4KV6cL2~jylYePdU`PspTo8M z!nElwaWXXj^&@e3JI>3)tmule3C1NEYWJFK1;3#COz|ks>==VKMy>9^?kqUJ{wCAR z%@qD7kSIYyR^&kG6!d8GWU*2?GG(Quo|@E>-1Ior zfD6gunn=^{q>P3X^Kst$@aJmc@W3JZbnfOvE*$f+)cI2@An-igvX0QpZ$$WCE-t|k z?CC8fVhW5r=8(j&7$6ZUxGC?w2T#Q+1C$INNEXk)RG}5y3JoiexCK)uSmCa}edzW|Ri@Nxc(AO&o8oG`!474^5|&d=p?a6@#K$rr1HrDq-Ql zBJbqwj<#%)nf#)Y2R4%0(}L&-!X~3dF3jx-QLOV>bmOxoFiowR!BrCBqsc>}^V{5h zH9?EI7e~C&PmLJDPNkopIEc!jV-5fl3|Mqco)zExQP3q2@cB{D&|fGLM?oBtcZ8Ds zxbYA4Z!_TJ3}QYzQ?&l~Pu_Ews6hNV54RV)5WM@KGYdX8hJscV53@Cq>RXA?Y%FMS zu@nmJ=f_iwuv0^Yp9UB~KROS*Q}(}HrM3=7gZL9O;8o7#V^5s$0svP3PwP&NdKrw@~LA=DD!pVux4+qBG**DO4& zZOR(AXdCKAaU3PSJ4H61&S2q~&~{Yj=aog1nw-PtEWi%>1=A$P7MU4>LzSn86_Wdh z)44e{U)4~#ZAjCxg4cJJV$dQ~hSfcQqx*u3Ck`#snlpSZ3RX}Jdf*sue*DYo;N|U5DR&^TSeijuF?}q2p$bI+;BJmLu0U{ipu5iVoWrSzvJ_&U z3wg{p^0x0_qg!5`j8R);j?T_mTx{9*hSFG~2;l_dRGd0(YNMBK>-5RL;bdX1T`1&Z zt`U`*<-z6`*)wtEv77?-nK&}y_QkScDt*NVrfS659AI_}ZG>X{&F=|yX$JxN9kOWb zN_PztKpB#wFr}+)R5y)sx$u#1-YXnKArBiPoZ9${ooo&sMx#P+ei#!Ly6X8(x)y>H zUGtKTihtn$z$}3nU9t&Gx6r^TTDt|qsq&(2u3E;(gaAhS`j>5-$n)`JNV4&&IfN9O zBIhZabf&i>h_9%H7$O0+DDzlVVBU9v&k-@~uL(*y9~7!Z!Vaym|72p*%*TZMK;tT0IdH5nZ#$#MfQB>MyWO9S#FMqsgX zA)rdxkNeHY$ssV&(%=Q+5kkK$3XHUAlCa_7r33VJv+e|lvYD)It?rq1v5lw&bXW#+ zeN{x}uG~0|Qu3acWE+!zy2@Nw#WTu@n)FBD{wk_%ALEpjB{7S(R+$Iax9Lfj`>#py zs8tp%^Ur)*``weyJn=;lb2|nr5Q@35v<91EOVXUQB~PlMSj6BM>xk6M3Lb(n(1dZB zng^@#+1;*fFMQt$CDQVs^n4vogOwZ@JHS6HiAuC|(#AOHJf} zA#H##FC1s)d{BTGj_9mApE(4g;uofGVri;B}q1)t_#U9@LG<(ub{+cioT@^~1({G8&m`xu} z;FZ5O;7Uu;F~T*G?~{Bg8AQR!W{U%gj2nR^FP)ju+Dt2|;wSU?RgLYBaH@15zbSk@i_BMBY?cGAlb zuS-+SYV$XS)oanU>W`|QmXFH-(=Ug7Z*WO5oxs$*@^`6fuc~Ll=O@(VyuF@`f}H4C z72)F_iq*EdHrsaB|M<6YVnd<5L4bfp{%0u5%=TX>Yv=H540-G~jL@-IaP$G+?e4wa z6^_$9FIGBgA!YEPWWH^2>iC0@BhGQRM?xy4^6|~>Ha|S1rJ@WVer#!urJ3a?>#amU zYh?wH|03~4D!nL_3V(QPq8p!Vik7w~uJn{ai6f@;1Nf~c?`F`Mccafv)jZ*ei_R;v z!J04bG{99owy;ww`Ot$_-?KN%(R|{oUjJV57x4S1kryN2QE_MOFb46t<+X0}X_w#j za>bcVXRVjO9C3@Gcgy=(v)(&o*C3!1ouQsRXT`Q>XZh;;+#rDW=jryx{ykyEw>qFv zzyU$Ppq9KK!QWrK@%mI|Ap7Tgrs+t--roTK_tH(h!+XHD`%=Mb^@a(b-*0W%_7u5* zr-r;ahxe(KLnn4V-|o(nJ@-AkKJR8EkJp9`zu1Y#f*;NgKC%!|UO)cmBc*(q0EL_S zZNA%LN|yVx9Z0O_fW6%qhSQaf{Fr+6f~z+|f*Owm3q`xNkk*bTU;eG-kQrkp1H|=q zTgKY4ErsTY?vc0po0qqf-h`PcpTm>h`ac-eyAd7^0p}+ah~GK8YXJ^*%O7{&W6vBj zLp20|n3buO;r4v|afa&C+i(Q~_>nmH938w{2iHu*-`XpWUD|6i8U}GA1lfDXirb&x zZ4rn3;oVypYq~2xJG1J~PbSY+U+*k2zrR~PTLQYfH+t~lBZjoFl@#j!{O!q8ZL9+2cPmqVk`e0B>UJ!iB(_R6+I$=bYJe7te!%8 za$ouesq8>~e^s;VuQjW_V&3L?o&b|BrsT5M&GFW%U+b~A+wAr`bN1F8vaPS+_Wb=3 zU?8A+H2$fpN-->}B*IU?cd^v?s|V@##L4X%&W0$`n& zo|$g~Nu$Wcu&JS4Vbx6L5h9bh8gXZ2BYhwmIRKy@d7j+0aFlPAr6f^K`b+aC_!MMw#sQ&b#VMUq4ua1a%FCs9zIs zliqKd-x#MC=2 ztEKp1+#-Te{=6^^nDlkjq^pW)*hTE;Y^|`I`g&~I5Btgs&9lWsHxc3k631JNte(ucf7aJ1&nb;YH%v80!ax(BHAiYGO-nq)B;CfDO!t}uR$dn z6dIW}KU1e>p{kmJZ_A_~|8MFH>tKf^k|!()(-DSTQdfm)b;kY*V$DW5DI2(`i|v zkGOQH!%5@Ul0(50datDhgPF}!JwbsunW>3pK=3oWtnkUQ}zcn?BfBP|s= z&>5GdA5=wJxwGbm^WdgMs~y}iFN{`dZUv5z+D+NWNcOGAm*#7z$Cu!SX^YNe8@&zx zz<^a#VQXn9nLqf3A7)PUTl?XT$#zD;`cIcK($qBC=b?o_`arhY20aHO!D8exQeW1E zGs92x4n}x8=OgrzYeTzQE1ZWB>RzR$@by~^CBHElS*96O@||dC4v`Tv1iH_!rsgv; zTMYA>p|KjonO&A<322fVz7yLb)u#cV5YqWNH5^626Dzgxf6!X)&!~ytVuO!mz|_T4 z3Sv#sg{G3Uo1*8vzGH*YV$-s6naW%(sAip>$wOdDA$woD39ijFTNdXEzBWV!e9imZx?X;J^Hot&4ljmI%_UH%YGn!dNvF7EKAkE+f=}e*!oexC zM;;{v$EhMESFnGy^gLYLX;OM~PwK5cap`sG)^Qx_-;zZwu{clSX)<6hojkaE#2sB% zwwhXbQE7R1+`OoYUXZD1OW1DLD5Cttc+jL4d*a^n9%-R@!^NwW9-E0lD>tczqBp?J zq=PVI)xyYYT3&>z4aPg)&xoWFuX3i1c#o~w_MQu_?hS+c_oW#T)hWgN0XhXb3l}+Xb`6d^yB3MpKu!wFf3;a@m{`MT<&sY!G`Qi=6aA}TkLu>B zAYo0?x1>G4%3;!9oLI@`!au|D8^Xy|+`QB^pZsC6y@?tcRYE2v8UNS%akFbMCW#a) zUeuo!Yv^Zq+*k&ck5g|||M;#yl(2cc%~osDEZycK#a>NjmfaLAKG-b{5PM^|;oN0LN)&kCiBy=kEy$-ZbQH2hbTXqaXp2E#`A}!TFpNB)8U{Axx(T)* z@Vf9-d4=;wnh(PCd6c%tzhUOy>SKbs#J_1gL*>ci=D1k0zgO(Q%rj33C!nVHH@#s* zF2mxIEgCm%(P#xBe^F6vD1QO*bu_}@6>hPrKcE&aYPuOTAUlVL>hcq8x}Tuo{0h6_ zo>bLSKBbJ!05F$V-(S{DFEHxgOy6C)AvC)(- z8EXKF-Dpi=wBX}_erz*lqBOcKHHEv5ngwOY+a!f${I%`qa%fY^+i$ zSW_Fd#)iL=fX@TDfQY6u46l*q38LpP(Iys~y|_LK&ir zB>ROTq7jqDSE)K~%_MM{(^;C#&8ALxp(hg}Yk`-#h*r7mmLWTLHe*hecwwnPDQk)O zQo6*x#rW{otVIdrSKZdza=RItoEQx|BI6L#)tCrk59)sLRtGCB3BhO z5|$=;EZRWL{Sia02334nwAqU6;Cv}8@=jJ21GX!+X#zooJAj%oTXhGTGHnAG~XvN#Q>$G>-+OYo6Cn`^!-%fZg{D1cr>=QAvC}Sg0 zI)E_PVRU85(+Wh6G(||}2dMK8&`340kDR?dJt~K+x*H}O$1B_rV!B2IJ&E$dJsy}h+t;TbZ~rssKCo`z|!@T4^r+qsXf!1ta#C% zoMtbbTsaP;m`EvJcTj^TNxNmDHlMBdmbDiKbU zJjGz#rTR$-Og*si75$}y6OTg6)%{_>Wmo~}R2aq0wtWz9*_;C)g}7@Ao*j=I6-VeW#%;u)ax5K;tJs-z z$q4Q*onmCaqo1?kEzm|Ip?O?OvsB+p<7daSFkue-BhTl6bS~xOh3XRc&lPylz$^xT z0Ut+a^dzBk98di0?<8*Ci3-J%Pa_(JZy$}i@;=&pRbP3YI)!+Ls)QheFK8)=2gcrY zY8m$%gNhVenR@b!gKLw4<7wl#jBDqm%z%ZDUar`KoLSVToPdqbsADUpn70boFH`_3 z=C88oWx%~fjsSIYQ*hdMgTDR6VQS~Bqu-Q;kD)mt^V%UF`>9HlPNuSrpIIKWG(GmR z&a}7vv}cr{Ft$rVI03OsO89Y2lF`y1GzCgZHQ+~h%n9{WOtZXg_Y3)6Pa+a{W@-Z| z*(WNiSjnkt9@q*n>G4+M^;x?013b%P`a=iux^c?cdz$fqFd8}OC19Eens~isKPy>y zN~;SYIjAs)AH+1Vo0GAVl|m!0+9%8VR3tbkA|v7e6)8y9l(np``BU=~1Y5eZ$8FXK_pkaM3 z0uU&DC8TZpjTEEsRvo!@vtu0CzwRKUrB-%CPzX5SMdr8`H=PSErP4!rDrB4gti?PP zke11OTb8Fq^aFn2=5G2f1s?yUj3H4Shq~(vwxMpR{=g*}`^D&hr(>*p5HX?c#SW2v zKs37tRBX3wZ}DTTBH4SbB7C4L`y31maE#yERkz3L)maQLs?M5G{zne+LTjJGap^if(>|Fx_lrWMp^z;>YEN90j9WPPP+7 zO1G9g1tWN7r4sUjgAf=8Md)>K{KnAEAP9L~D?3GlVTQ9BTB&X@ZGTHTrdgp;p(`o8 zD;{aDC1^dFU~%EmWc0G7rc1HkwM_6?3(7DT9n1sW07{|J6^cy1YdRWLf!Xje&SWGy zIJQQn=f@44OliqrNom}-(oeR0h+4LMj!HQzpoaPZoVvrw$x+h zATOUfb=w}*&5Cok?rIL4VFScJ!oA?a?4acBY-{Y-N&;1l54uuslH+da1)FI`LeB*o zr#70XjuSl(I@*qAk5=W6y#ZeZ(Z*%gC7EQ|c`R8K!Xo ztW>lRZT8w^W5+3Rp_UOZ(u85O96RPL*Q?wH*|y!$Wb`F1XOeb(te5RrDya6*Jyu#x zfe$&yHvKs#Z@Fy(-ZOO4yD_vUy}^!&lsf4nh+%o_U0?d7Wn;Lotdhbnl-!8~Na@)c zpwlSY<*S2HG*^ACBpf^rIagGoxpe0pQOAsP)tBcjxd3g3ktKA*KPxsr|Mphuz0A5( zpaKDXrTovc@Yw$AtyFT@WJDVK{hup+8(>h0?NuT-E%H^;I#$_L6H$l_=E>7eiq%zn zeika+t5&GSU_|)Ee{Eg9_jVY#9z>Zz2ZKqWqdb=Zyv0hcsI4g#IW32;xsM*X6uBvh z%VoMA7PX&kw)0Vh=wBTae>*VmG2)ebV$#o}+J^I*wRP02!NW;w6KVZd;~dE_Sp<)8 zOdW}A8K>zo7b{?bWzyCV2g0&tLzX%fwM(UGKCo~TU{Q4q;21)XGr2NT0wK!VNuJ1R z*r;piR7v07TU>7(h_Yby94<=F?p8V(H(WJ)Wuq*MNzsC3jLwQ$O zSQ#Y>7noJ%U8yO}qu-rmX$oklFQe7P?3fDyxoSUJmw#VTz{W`aaCh{*>*jT|2-Cwp zPVvb1mY%M1=3S2%Q^s%=*%GCUT#pArCFHZ*c zAg5SoMVMW8@KRC4gp5gx3}S)iG(L12XTnCu!0pUGR=d1g{SEtnoV{arCRi6O8rxRI zcw*bOZQHh!ij9hGI~Aj1+p5?$Z&!D}XN+^d_4x~X?8Q0PoCTTXb@!rSpxEdf;iE88 zXMA?NPd@|EHH;X204d07=$w+Tj$zKF>jX}aCAagiTV|mu#t&ob;wKT_2+;e)iwG(8 zGw2*y?jkx(*p9M!E!;zqR=K061Q43llOu`oOG#qSuRA0xJ`D< zvW@F1^XGQ;mTs+b8|(arXGRnVz#U5lb=YpQ*Dc&LpKF{?khS*=*QfU1mzUO#2;yza zeQRRYde)9UXHr=uGr#O;8RyeR*uDM#UKz*eg>nag00CM3XPPAoC(HjB!v7QcyD*yH zU6q_?8zqAS#(`R3DzX$x!p+67woBx6TSU0oHt*==nkkBH0)439deBNotJ)Q(898U8so5oei!PWg_<70WX= z9A?aSOJjXgEow$49GqnTt~T}CzoCyD3LjiP3r1C)S_{_f=qdFNFU8tJ9KFk0FY(Bf z_w~ZGMxypEm;_l`v;X`2jQsgm{n^=AE|+!BpYyXPtquNd8`F9}enpYDdR8A$POY?Z zR#M!+CN;z1@(qp~3r-0e$cRN&i7Z2YiYlv~VtxbL)oeyxNnQ;Tj2I|R zLQuy+3)|rJyhdlFEn+?%e&PJzeEQT5G5|L~$iFOoeyloLQ94Bzc(*loXI`%Ovgf7i z;&7+^19}`-(&sOzob(BMFX*&C&W#n1II4eGMwi1?B&_ zKa0s{xp(SoiO^D${mwRht=h0y$lb423a*VOX4b&i#K+ZKopfOBmn|X69iYO0Rx(XU zwF#zpQW7DhjhfO;qj+P7v}iB5P@=KMChFfM+{GZ2y(s{&4piu%UO-LM($8N4wThu$ zfGte1L8bjdtZ!*-F7!tGNB z%j}T6Y8KhW{Q<~7$+sREeYfXo#V7ir;uKKf7U&e~>oL8Is*%wDM`uqAC8vo}-Xd{> z{DS7htookz=pFtD`-qghCRIMhg(?L7iVJ$bAome0_a0?ShF!^w4^fZ7bOb;W%1AY`I@7crK_s#)`0Au~=J-Jtck?GGA0PAYzIlB|>aDIMV{o z4ET_^VD_zp@f6BBW-L4OyUDg1_v&@{sE~zw2+f%XJ&g<_H5a1q<0(CA0K{T@-4*HuG*q%^J;wcF#VXey4|yqrg* zn*||BoLy`z2B*dS1RTpE=OEFnL1`1TaX~+8Q+XC;K!(@W`!Bb7ehPx@xL_L=96w9C zcZvMul$Yvg@%8!*Y<-e-FF0wVZiyDkgyQpw0EpRurzt0vcdGOup1{G`n`5)Q<5=orVN*>e z`g6hm+|)c`8>=i3{>8W6Rkd3Vk5$jJILybpOwW}{pg_%?2Pzff71;q;O%WEZ#ou5u?uF6x;KJIb}82!X(xNno;{oA8E`o3>7 zZr}YW7_VMOc;Jq-0jgpHc?y6ogT`5rY>do&-8Oryd3AA4vb=z>`MIjDeb(@f#3j+0T899A2DqUT!`meR#-71xa!D==y(Ce?{;dQ_w{easJuMM zlD_oWDhT+ev+HH+aeZAjV(<~dil67LJBfmG6Sl~n?~>a5 zS)xPMZR}Cxpxj7&h!uVmc{oi0V;FL7f(@)jx#F{VsA!?IfCg?_ZN#zQv<7}auDJRN zaC?y60z@r#b#dNFjOi55(cPM&_dZ)b-{57B5bY_1mF?kgjAnI%2?QN`XEub6K$T4I zHw?;3%xB#?t*wKn{eX_323VNo4sl+A{GUw(J^kkHr-*YP{r@wwaX#O zUioG}{!YHg6$b@_e}zKbe^xnVV*OvwplH4Rr}K?O_O(c79kn|z^261&80G>vYGW0` zt+p2##a>7{Sx|mlCMA=P<8aBGCdY>vWRq@xT-`I5@)YQR%=an=3E|)ybTCt=u*fE|U%a`>EQr3;mao-rNvkv^LC@-kaW@vf-9gBv z;I}XrgCV*=FkTjAV>FuJevMlM7#ei8lzuxr!vm{O&BD5>($g4oybo>fD+iYs*>9^t zLZj3#%hl;#bVJQeV&P(*poN?#}gMX{5_j7~SJ2iTun@3AqN+$A^8F0fS*)`q%! zB?qmGT>zuvSYN<>u)Opu-c&AYlqxbb7M)4wy+bfO1QYUnq9KkSnLG}Scd zhN=_{R(&ZtUo(FX5?PaL2c9=RoOcme(IsV<(r&}91=X?I-cZ?ASeYQ`?qKu`(7M)a zPib$YwtCW$vLer`*F|v;+kx&r`ypZ4h;6Vbc=HeG+2(Q!Vw^*2x-d6zon=}3xGr#N zD?j#3wV~$4Jb|!yHLRjnca*fbiJw(iwsaRYTV!xMt4AHP)jNM_TPr&#XJdMQ{jFY6 ze4>~T_5aiaGcy0vO?1Tx%Ksx8KA$u+=+bfCa4#jnK=eJpi)bME0xCwj6}yD``}H<$ zB}!}#59{4wX7^KUr_c=8cWS!O2`{0?A|EN(6mzQa%TOeDApns_e=xg0S@1=j)yj03 zR;nmnG+q%gZB!t}S;2y-Ub-u(dp`M@HSCCL#`Pu5WW!HKFG$Cu$kF zxeTZaE~N7|Eqwo&4vOE^HNSfHImj@rV-_FBUKKEEMZa+J`ylu3s>2BNhE0m|_%OZU7e61ngIWr0g?)zM>PyWst;)8iT1i(N*WFY_j zk^jvaY5Ml_f1J|(DxeG^GFdHB>pVXL6As$yVvWq5< z70|;*!I>jC4ur{(I4qG~qou+0JF3M72{Hi6D_uSRT?emE(hX;x142LN!5X$Hj!M1> z^i=vph4zt(ocR=%N@6AFw2?!1K=6VQRgdhSzd+(rb>Xv23HXd?Bbvop{eUJf-gMvs_ z=te48U8OP~qCqiRkoE>Gl5a;pA7$1F_a2_R6O8DkH!lz!Z9t($by>xU4v>og<=90o zY9?sRBGpKFSo3gq!l-&ygL~FmhbfVP6-Ij98V|wz*1r{wevM^2v($fP-Q66`1=I(~ z?4Pzut5n}Us-_cmrtDW^o~KJFSYKo+boP3q-=N5(@WL%?i|xzK41!HkK5I&X?*_?_ zyQ+b-n*trlM4im(5-UUTPJ@2)9&Em6pheU7vWUuwmOn0?Wshtz)7c{dcd_0Pn}#?i zBl!A+0*^wm;}e>}tDF>X4OP(@=OOt`c+6;qVH=|#L{;r&>6HVUJ_7GW5E^>bM;3nr zU|k^Pq3w&`MDYne>RZNfh2Ks6;SHHDK2Cc- zd9m4M_T=-5zv;5msvB8PcP_0!0t&zsqZ|{r{~*z3Qzz1o#3RR_UxNUA2;3 zQcB7(5wePwpcstX)l|RUY>u3D6NLbh1FCS2vA(ecTh7sU(LN9%!T~%B47jp3Yz~Ev z#+*5(o)?c4^DO)sCFU6t;+iP?7wL+NlUGeaY(Hx*kWj--wHi!cWOrLLYWAXXl4$l> zpeY&lHMx}dt+`sB$%#>sFnyt#r2Cug1_H^VOY(H*0p1I*@k%!x;ntw|%uEorXw21^ zU%(~SLJi^cu5yNCu`b@|ApI%#U`!5g&2BNVOc(tVFg8EIxfiYmvm8 zLDubcLkDc=xqu;Ke@{$8hE|TJxq@c*j#yV_qmnpGKa(a2I0F<6<(dhqMU z2x9@1xiq;#mDD`tY()_kYaxJUyaDG>4gAc8g1Xer6(+H{!^-tGp*SbZ)xZ@2aj6W# zpqbmwnOdDj)u6m3SlPg+t)xs+!a;+9v&K*YWx3~E&pMV(;SfDo-CVyE&uV#d{#J4> zO@7(o6ZpymfRh+t1U=v9!l4{Qut5u#No5y+9Y%6(pO_n)d1#Dhm zvYtb~O}9!#xAdr0Vk=WPtW?-+)tj}zRvF!bE?puzSna|zS#HOfc!C_R(*e;7ov^Og z*+uI#7{9K1CRNxPynoPptuZiN0~xh0kGNoS3Kfk|d=l$RaF%Q^m)&a;Dy!b#-Y z)62yQq-J)Og5tO-DAMhceaB-o?9%mCFH-N)_2RM%mDsEex)mb8bww2a7C$s5TEF%& z0*qF#3@TJi%qC4~B&wv*27%xFoPd)@HZbjrc(Xq4W?B*0aj6+8^}G9#5)x_9FlE2u z>zd3+RfIWjEd~D-4$r^jdPWdb#;^>334zN~%lHo`fg7ZdleLt>iRmz=qod7I8QjrDChY8LDQJs=cw1*#!XlJs4HrfUT zI&y$FccKU5yN6N)$_z*71~e_6y56Q9(>X5g1%F5 z=lLoa2|9$4&0={c1t*A?h>ANlX40Cqf@{gb)AWg}R$KBPcFS6jtdTX*<8<0J_S}}W zXG;9XF%B0f;iIzJ1%a$VAhfRF;ESlT^+F5S$cr^%Doq)u?W))ci^;DqF|mHN-L07% zS6e5e=3VB}u&R2M`oIp>iaE}v%?+W03fPTWt2&fXE3rW!ArRIVML+8CgBfcrp}kua2ffS4JT%~pgY4WirB4ZKBQhGp$qZ#&B^n9>@R?kM5#+Ac0!Ed|_dPpYC^*zpxD!5iL|Z)1HnC2tN374%BI=56uGAq!htA|YNaEs|d zGHGjVW(%((MT_*Ls3|+FjdY%~8`{fNho|jATA-RROlC`EXiI}{(@Ux^1gJ}<+aPLR zdJRDp+CGfacJLV$RG})Z6iP5TY>A6*w-<(XlRgjU+==XA%%3aX4dNnhZ~c0zrhz{i ze^Bo~ogSdVcl*^5*n6>=25mEXkx8wY%*jQPPkXzOjd9E6B3LimO(=Ff<*VqS&Hc=r zY$d?BjWY@$6zHC+sBFNoPxnt6!g|YDV?!W)3_n_n%POK#@7PT}AOxYZGB{*Gx=UM{ zj|W*=2v|1V1pYoUuszUiexNg!rAhUeg+_%qKB|?Ddv-CnQ~R2Y@RLh7(meBYhQ>la z#H}~|g7cK}+lB0YCo+wBk(s*;2Xko_LAFz}@TpqR$GSt`aeVaIk;TOPcH{7(hm}|u zts`F8=tTMF@7OYOfozwWTE5^ob%MU!j~>;XW7-4*Gu_7OvN@ggY4-C+v7y%(lf<(4 z_)p(K@Ptm9b5a-{s0U?SSpD>}$={SNNr|_}{y~>PR_6=Scq{C2yqV~vldLQxiOVv< zT^YPsAaG$C(1>z6?quE<)G@h!c)!dayV;WnW>K3Br)|RW%!J5nr3%fU_LW~%nmT4$ z;a0R`_8v+!p5>t%{O`}`nGpgg!dVMc(< zqb2s^b~zB3IAC}%h0si(UP$O=b@#(&&y?EKMep6!2HI^zhGOZXL5-KWn)u{4xoy)) z%}J9i5SciIZxCLpPS$iomO(xB>KRIiQ=DFgGNk*5AX>=;i4;IFpm5=fjOxjy zxMss|m-;m*SIuriO7E$E6S=nw^Rk+AqspO`a+gu+DSCv(0LmQODFuru8r^|ZC|t=$ zOr*U7MN)GuIu3E4VC}rmlVvKKJUkHOCab8v3*ZiPa}0%#)14yv0yY9WT~1)L+>7wB zBZl*{r^Z1X{(J?u#d3$bH7wr>ar*R!q__V{;K1bTuaEqn*8VFAg9snLp$XGJaU^PT zS*=Ky;cz>cR~=V=x|6r!v)K*ppBnBlhU+lf@K6&kzYErZCWwpQ%)sTa_^iIjv=@3H zCSAs~4}KuFyPxBoYc}D@Ojpdz zgNMgWIf6Z+3(0*ot!z7yoM^NFC{w&Wc(kkeaGZ@kkX2WAe)3~WS~anJbj53Xy<-}iNF$z z5nF;M#-B@!1TGqQag%H^tddAeMW|JLNIuU(LBB`qF2+5T6X>g|Unrp#SA-x1r@EQc zSt&nzH+T!;ISaD^N>KYDmQ&(oA{qoF@g4xI#8peM@y*}tbmgV#hIVseN$g(II-p?K z#$=6#X=?j=Te11xw?GNlC+`{Y6(M;}8xpV$G-W#!P^ybao4d1qpOiirL~!-aosyU9 z(fEGPIEJ>G&@L(`%41UU#T2>1Jqr`*=z}bUeBRq(Ua}*X`5hY40|wUuT4!L}s~1ug zLufiZ`h`$*;})=ATVtXtajG$@mek}%b|y4;mvT;-yi{T0+y2eRgBme|4l|p-(xmc= zn_hLaUB{bCrJ?kaKa(rqb;}J%Y#HKQbYu-mXUP zwBPk9{Hw$Y{bx{&k@?>aG4sYglLKw|3q9oVR|)Jd0VzO_ZO0auZmDW9yCs(_1*n|S zH{dBY#mb7Ww;brv;>j^1oVfvh@L{~m z-d?_%8%#N>*>10V7`XDAjk;WXX7+v!6V#|9wH~~J7Ss|t&HlOhS*CfDvWX%v|zOMhq$LA82I+^8Ml*SMW^1=X}mm8@5j{9>nCILAe-UmZYC!iu4*&G zy%PyF_`B}uL+?GDh|V_>7aOOJkYsClj*Zg z#S7I|gGaB&w~1}9Z}SE`iSPYxw@`&Jrp0nu$KHpY8hI{f(UK)4v55T4Yz9} zZ2U1Vxurpp{=1o0JU^KVpJz5mVfd;fQ7W(~NbM0%#tv{O2$@__kZu)Nv>t2HVewdy z`j$NU%k?+auEagz%|13M6=e}loNw)njgsdKQ#r_?1|$P-t*@z>aYP+!@_B>Uiue2T zJ#oIAW08)XI2TgHhGA>7P&28xVSSyw5W5;|T%dGHfKtQBac{{{Gd+%7*}izhZpEu74g(g4c4V&8SVK2^?NhQy)VnYf>q1a@^SyAa z4z)@$<|&77WcNKNibi3;tV%da-7&{9*EtAWmK)~Mpe=9K=@!eL!?y$&5w7!f*sS~@ z0~Sg{icO1#?ydbo$=kd_m zm$^6ar=>yj`UU=A`Y9?qbB5d60c-qjpE{E{mBt^`Y52fN2p!8HO~pREgjI#Hyb#s) zlG-;VnJo|P=GC81M$pc{!XIUqe{-rje^P4s{8g%Hx&C{p{@;-Be`eeZaEpiYqL`$^ z11yjxSz)xlOZ8r=g=G>a!k-z}269Y!{xC3gu~v)X@xkZw z_o-lx;!>~72P23$srILGjbL7?%* z(s~{HiF!;J?+uZ`uo?{c0(r8{#$$tzd(WW8cSgWr&NCke>sBI(6;sH`EuLR;R0FyajbQA0Zj56t zlix<^m4$I{A~_{q1E+3Gz-iEG5D**>z0D@6D4AC}`n^Z1gJ&-CUzPrSpn*q`ZU#G90JJmIOP`b2Y*Q})J>v^9Y!F3wPko71ulwTf>!VPP?F(Y!J|+kt}*P~K|Yq;g1Hwp8bx^eKv~5+sHu z4xLRjsS09CwEY#A9;k0wY6I@qJm5g&YhUbJxuZ?)r7ga>0(Y9TA0r((3BIyO$2O{s zky)ugP0xiHxKwkj;ve2`HlskvuMH%O`=Hr#nT(OEO~wVoybd(s)n%1NYvI7!dCKowUT{#$=+Af(yrm7BJTtTC?>fK;-g7za0lYebcl5X z&5akdt})xLR;P-p>4TbTA*jWlnNw@^ksdSG{o;+)DGBS7@abj~!Pb^~?Zj6)rVZkMj)dWHvO8 zk8uvKW+t!7$>Nel1zuttk75EpBY`3xW+d{MqX$QGd%m-KO#8H4RZdN1E!t>3L}bE` z$>H%pozY+Ljky9(8B~!8iE-aG`E`IJ8s~0tSc|VJ9S?)dPVPn4- zBA7n`>TbLqCyCT4H^Q*gs&!02>JSD5J!g#|3ra?oV-ryC8&Fx47o6{us0cUUxERdx z&xqaetzj>98TRo-NJi0uA{<}Y29`XD?DY$n*>3W)KavO}BC$uIQ^cy(qmSZ)R5WI3 zT-8XYdn;e)T)9ql6C0%nS4L%X9LN)GjKY9jp%vLqp=$y#+dB%Jvj#^A)8}6}mwdKb zZPM!eDtdA1nt;H+VxNmL517CEac&?K=O$ZNhgDf=%k(X>f~sF3s~>a^b&`v=cq;Kf zbzem)mVZ%0eS=Pr-o-K4PY+D!SuImHA&WEMHmof*y<)mlUE0aXYA~02E`)G6bJ2;T z0d+^N$dDaHo3qBq8#A|_<1%NiqvC|0m06`7Iamyb_=)mD|HD-v3%i*-e6sHr9;k9J z!OJs+E;{^-bZ%HdoIRbLvLvO+wBAm%zerm$EfCvhforIycQ2*Sj0k^Hd1u^%hBue4 zV6SJ&LmVRDsJ*D`Q?44@qoX_yO9jc$3~1TXq2DGI+TA&5<0YZq9thLv>;eLJ#fyF0 z+1|FXiv{VzH|iTUP&^zBd^cE?zSgEZ*<#h4r459?p77@qHST$NiKz)PEF6%c>0BYa z$y{^6?;xKwQjDdMib{~*Tc~HfKsj9a<*F0*FbrIKY?Hi!?e$5b@33 z<+VT!zvbfW{7RpgVk<#5Gxugz$-`c2rQ391PEO2?{}Cj>gqt~v{41XE$p3ph|LYx^ zZu^HR67Us?{4vAi-SBN)^1Ye*WQ9v;4t)q9+(H+TzD+)!Uwq#que6p}Oxm3K1HvCF zb$|ZE#fxK;6A@r0z@dOfyzIuEdZAV0ec>jwjF`PsXuD2e!`)?T5uB0qQ2Uc`@_sF{6RB!g-IaFJ93tBtYybkLA|QB;iR55C3n+bbFEF2BJV?2~qa5*UJY-0Ub|L*k#f4IKXYo^4RiF5NjG6vK*zP(_c)Pm^yZ z_Vb~sQ$&h}#!)NFirI!Yg4Tg}DqLqH1)7A1(h2PmWV)reOX>x_P70o0#T;Cgd=!=; zw_NCORwO&Jur^0css6G~G6DzXsIB$5zOMX6Tceo~fW0JpfNTQqX#ZAi|Etc>(Gu?? zT}dKaLNbp=x}22y6il?Hv8+2{YHNfcc1Fhz0~C4|N!XThkJN>8mg+@G%R&sGc~=na zj{DWDimJ*0gyd?DtHkPec}cX^00Lx(_BG&AN5v)-x0db#m!Rpx*JG?*L|aIHUR%Em z|1n))i#MbqVTHol_F*8Db5zoYFd<4FTD&&mx4$`u?g9Acs-Eld3CTx6Qd(CfmOYq0B{B8l2)07%>;;IEM{vm@Y3GL7V^1n1`0Ef zVYDoypg&3+-*42>n@{~?$SAzcl=rDMt;&YNROsX&N#Y;`hD9E98{L={#GH!O(+8a? z)0fF<$Ox@5F~Evdil?{X zp+&)yRiiQ8;NXBazlgodrLF7l@_?}A$8I3PnK^$PRH}#!b4($Mhs&^ck|jF6Zbh>F zpv&s@Ln;?FpB-~cce^Q3JDV7Dy`^&r_xg9*pcMfV7fY%zUooRoLNqcJdrS#akO^5p z_<^M!$>`;p1n9klR;-+O?(Gk%A}6J>E81~wQ;lwig96RiiSUDd6@-pMSUF=UC$7>B znh!RDS6iu`Vp=(WjOh7e=Jfq1-0tx@V2V|f`q;>5`wVjQ{PYh4@@X@P&)LpS4silH zzPz|!wGwOTD1l>(=v63q;8dOL8fTE`#{_8TA|;7%{^rrBeRE*1mpfR-2hDoFBX4!K z^&D8GN!ZM!Yvf2|m#Tp+g@QDQ7|9*w&|AETD_hYuJ+-dmTfkQ&v>~gVTUG`Q_t=hs z?0n@hGf`U4j2`1#C})43SVJBpk2lc*sZ0<`8W0Kx5aXbslJ4n3wu}E%LetBEn+^aK z^Mao|I9a~~&)l(jM(Ip}4J>@JA|qs8gA+I?hM4Je-f)?~43vo<`|1HYg|9Z87Nkj| z1+60r7$Y+7>E-$cwA4_yUQ4=Exip*+?FAoN&loQ)dVfk;ka{<4ai60Py@?P&mNK&z zigGCos;%DBT=!8scjOwNK;}EeHn&_R!H(Vwf99l&T~#p-nHN$7nk7lrbYL0*~n=>nZc^s`AwjM{1n1|F)W$F!}=a<1+CRK7sz@}?E%aKC~X$OpyaeneKWL1 zUBcQepPi;C(>*^EeeOZ`7!**r7khnZH>fS0*DSX}REWNdkau8YEjpT^K9Oo=dZy}R z3wiY-ZDQdXP}zN?^0b>{mw3LHy}E>G>dz{s*6Tf`Zq6+*a|sc2nF`ecx2;!i{gge3 zkap%8+;-~p%Hr&832VRowi3|m>l)_XyX%-qbNcmr++@I1fMDX|Z^bI91{bo8|0htG znd4u@pS277LN+X*YyUx^r{8i>VYXW@Et>__%{gkUZAm5N1aKS?tRNF#uRRwX*&<8@a&UwBc>z8h5~6stU!}yo!ODlaU>Dnr%VCtD&b|@u-Yx)H{rZoUnva*nYy` zOsS}yG!_XhEyORIZi0wF-2SGvIBS(TKKuP-i-q^_=X)*u%tNi=qZ?Gt zJ)NPl)DJ=E)w@_drL+AeYte&BW8P#2OMb4Z@aP}hpek^x6!bCg(AU72y(GWtf%O^4 zT3s@3=dxzB-jXhJacXZDWreU9_PBUp{(N$a`tJKop|YH=2(8{_y(yKFYRjuzx2c?d zT$(6Zp(GT>j*h8v+fcVV~KRY=dE&oi?ekaqYjL6hba|MY(ZINir zf|{``^NTN$*WTXSbu~QsTkg)tJuCvPBlebMu#7)c{CFx(5vI3Y^v4&tWRAcV+ugFa z3ij1tA_eG2Tcx%VXIBzzsIJW#qRIU$JlyapCC3Oc0ew4x6ny}{r?~lGS@`s7zyijI5*94=@p&8rn zl1Bu0E|sH>8s|O*jJsh zOPrHx^-5PK_YYk&jKh5lvrDGwNw_gz`YT*v6U0kBEP^Rw;=bYKzJx_dm3GHlQ|N4e z{mnFqYu>3s1OoyR{m+0IGsnND4%vT8@Bh_y5Z((1#ZoD8izYz6AnCKD0{Hz9r+-%#(q9&ocnbfxoPZBzxD6VK zn(;=POfg{rBT~u-zx1F_XA!LN#<@rSZoZKPvzPl>!N#8YU>T1PL*CCZ5sIchoE0G-DA03T8)e~8ILA32ys0;ASCzw*S!7A zA!d?uuwqZC7f+eU69lcp{LWviTa6T^e$vv9Ri7f#h~DS-p6L7?dXl_2_MPzSf|?lc z4;c^b8y+W!<*h}n>v4LzoA&s7O#C)iok#23Hr_|zUrJjaP9H;k7f*MurQ5IF{gC?G z(no_m&zD*5>^-)6xASu9n`pzHbUpgPUUrEyO!c0{@swtu>YtY*I$=f=2N9^b9uXn6J- zwR91d*+A5<)oCBIm!6u_)w2VH=|Ls}WF#n(C>}9n%G6?hwD`1aiyU4|Yf7JxVdyve zUlmOy4A_Y8r2N{lmpWyri1Z;N224en7pCz7Iq(Ny^lSosEa=;F&2S@laGeSP78r>{ zs6rGn!K_ew;!(!*h% zuTl1CZnAEwtdF#OIb`!qD;);rJEq~?Yz`>KiHc$Xj>quC2p3QXqMe6$Oh zO$>yzbAx1PeDkF7Q)RBAyU3%=ei5-kz|jMMGjN)9;1gC4ea}vy>2WZ^?r+w#8><;e_<_^`V}%+)U@ZC<%bYG!rU3{f_{a7YJCnha5BRk# z@go>;s2wuQ5wfTv40`=6G3Yuku>LXYxd2tetTBwyJ5hIb7#CX(( zIPQ-|Na9S%B1}y%qcbq1zta$tM2r^On4J?ylmtJS*3idGBMN6RL{I|i2@B#sP|fS! z`cXZK!plywm?zJxF{)Bg#vs1<7)ul!Oj=t z*M8Sq2m`2+BqC`YG#7NiIpnn(Es}<^rSM)4bj_cs3M2U!xN`9JG*HWKEcS#@(aOl+ ziZkhQQLv`u(S~M{zqy&auVZ?#usB1qD`%OI#wM{L3(J}((pDABL=1eQvm`CmFO+4Z zzMu3doMsD}u}u>8tzctkZH_O>3zm@%Pti!!zp2gzq?2GN8>foE&;`g9VH(*)u6{@} zm5dN$DUBv)+e;{Q%M!q2Ol@?>C(*Qi*--8r<;Yv>YCCximXMGA)2$OT#e(+yjIn z@BQfRCjfLG7UHUlLSUB|8`wI!`$c%GflW9i>cek|?+xf#ed^q2)jJ^=st!UNZXy_k zZ}Ue}ShUM3ikk8GrIk0o_^!;Jm=Odgk=_bjDSX@Oal=}tP-1|S10B&Co-22#0u=Oj z7BL)SYLWWuk(i3lTAg`S+RdBouF$!4tJiavxC56iASAXH4h4(Jx|xqsRU+gsKY1&T zT=&r4>9%@?1KJ7FJfajfs$Jtisj;naNyXM7B1T*KkYa6-LW{PeW-tvF7c(EWcPL{B!^G>q_$h!i(TQbxA1q3TZuov(-= zDC^nU@H{gS>{51{HW{qa)mmTxVq!>D<{M73Se)e?PGUg^r0vJ}r{mS{FmWR6EyOCN zD5~w&$Y(36vAwbKZy!&4!V4fpU&VoM`X#BF&!mjACJ$~onkZ}x8v*$k;Q5h~!FXX9 z`iAn`lJOUQgUAwemFt#luI-_8Eq#=%_68(%EB4m}Om6{=f*NlcCzj^%BBxIBLr~}H zDKobWE=;VdmyGftsR&=(uGn+9%_0O1ES65Rsv0ZkbL zVNzq1!|iFEiVhpt3AOEyTam-=oSDr+)2>JOi$#)GKOJu2Je|l#?f=|x{r-D0z@(b&LjVQ>g8a`nTuf~LP6nA* z_L&@5e>04X=0gqrzC5^9*InGT7SG9T=UK2Fa99!@hVIu?KeneiY!ht_;GpAQL>C33 z84u@cb8B-;pRA&hNdbz&i(n%Pv0>!OEgQIX;a_37 zwZC<(RY7Z^J`&!{AH50cp=UadKU7khBO+BqCCgeskR;CvcZ#GRS`6w6&Pcu0pvya# za?;b%(z1bH+0L?!-3>xetJ~9kD&d(iXfNdd1rV+iV23)JCVtKLGJds-=lT{P2Pw%tc)ZOt2=GL#jrwpd zp0#?iX_|HQ>*_j7jOST+h@@FF6kU8gh}yBG!NYt--wGFaCEppe%`uXgo795$U53cR zfyaG>41sm?iW;;^DvELm8(a?wykStD#Sznd5W{4kRuJ8kFwpR3xExdc|2RA6=1lf) z?Z>vAiEZ1sW7`wk_QbYrdty7e!-<`VZD*1^d++l*r|LZa?ehYo?p=yjiz+3u8rbKc*I=GD6@+fTk&Ldv<_M?FMBx2b6lVRy} z!RkRa7fHj%?^Wmhey>=vOIx%^VEZj03%n6Uf+_)=unU=Yq->bwOmQwpzdi=?mwWqL z&bEX9jI;<%0^H`6G|!$ik40b#8?K7JW7I+agiWmXnWuHU7oIRL<=&|%3e)y0W=@uL zIT>Oj0sD*Ho(eV?-jS|}cYCxI7*&RA^eJGz&i*vO7B7Ka*PM8z+%L>fp`(A}sQ zpFw$H50FGB#h)x^SfY zKj>J0R>#p4Fdn5mP4XN1jLbQe2varaj+D$8J|-kD*sl>V(TLfuF*EDY^xsSgW|0!K zvr7XjuEzfmZla1!CWBS>pT?=hKMb}5F}Qv*>!&3dlS#qGc_;;w*;e@+V2pAs{qY@C zx~;=VjV7MFR1}G!#2c`9F zLgn%L>^s?Dzx2Kge>n|W;O)~jQ)*FkRwrhshVS`n3hWe#vi_7If5fH5VOW(_&GdaZFNK&2AxNCl=~30_MJWD`>36L7C9n9V~$ z44gE6I88V(*TgPW6vc^_Y-B^_tKuX0teDa(M@) zh=uObTR|*Rzn!0H)O>y~!ko?)sM%ZJgel|i*+kP*uRK0#*b?)tZcWDu@NfR$_}w!8 z*}HNq7E?DXp8{$@H-6MTm8DitVR^SHj>)7+zrjw&mUFJ5?xQLb3tuRoyq#A62|W#= zNNLeZyyniHdlgdFQ@;H^=f%j7W==!LBmXU(!ylFhsezr?ARBU}We_rgNm#R= zrJZBun-wE-eVQ9|Sa4S@Yitf|;tx=XQA?6GdAs@RZ=Z869&3{OhxIb;w@#nE{-rfc z<+QK4zH2Ro!y-A(!Eic;@g*#BFMeDco9GG@SXv1Mo*l_=>R~b0zFa zSmq_%oYY{lht8 z`0%`QXg(gb0~$29k-i`m;}D9}s39Ma-t1g^Pp?Y2&XE;nK)V`ng6Wz| ztxE&=71xd(Nnf$GGL`BEZzX6x;aq(E+Yx>=INQ}{!NC4n_|qOlY6Wf!wY|-ezT3-Q z*t?^RIDCzyd(-i%R!mv|OG*kEVcX@PL`QMMeO$x8u*Q?Pr(pvze#s0w9vjJJh%Zuz zfBH5QdF!UcfPp#8$2stl35p#bJ$%8RfC#1^bezxnz=)q^1=(k0leo7AAzACeSLzfi zz@w*!DBYpgnw=4XF1O0r@bN1C{jQh4yu!}&>oS;0{#hu z1IQ;)_bDOKP)H2LMOF5;sl}$>Nzux!-C+llw_;rHC3eqpTdLpI{W=)~A*Q1}(=O37 z{-`kS708R5ry~y-$|XzC$phG}a^ImKSGa&nf;)o8A)!?Nj;Z74LjbATuYz9&JBZwU z|FwTNY}N!~7aRm6p7h`QCAR-B&(!obXI;oijx)HwUX|M_qrRZNUS`c|q{99=ol&8` zbS)_Mi@Zuh)Wi};abPqj{+`L>m`$WC5}K(4Il>!BD&irXS6*(D3~eQW{v{csj!N;+dD;f`NRP&&h> z@5zXhpg4TsM`*y_{2TLUMjbGJGcWMC3-pE>-h8pkBr?5=VAY8z3_PL96w4EMB|6{L z)MlAW&Qi|8lY5v(0MiRqJsHbY)?q-a70}wYHyP$ zS-YhO(>OQ%!w;9sZ(*K{h(z4v#Uq^q0hS1%aLhChW)B`j%x7B(R!?vGBbQdZxr(RI zBtJ<)Qo5KwFokbBtJ+~hC(mA&I^JF{vT27m(HZ?kX^$AGF&3~Pf+1-+zQ9|wq9UA0 z(-Lw7N@q>F#@w~4ssB;SNfa@vkNZP*UJT^cVWj^ncs~*`MT>Du~r$4=dIwgnL0Xzk@pKj#@)Z z^emV^1ahL1$I6S`vFx*}e6=L)r8lKsC;8hJ8mn6Q?}`K4?BnX3J+$x{H<8;L==Bgy z-|0s294)#EH0buP!CcLe3-C$o$XwNL7dGQKntPH)I8hfa9M=ZVK-I-mrLvovtTidq zFS+ok@TXq7c3VdUK;+sPRA=li(P(yV3=o$`T3t-O#Oz}Jx{t(6yAnH9b4o)(T^^3t zw^c?jZMV=G_`K;;P#aQLjeL?Nm|VmZcAYiI7M0}_Fi(5resq$boq}ES6BCz^S#@^o zt;8o_Mg~G4)r?EaAT>cXwWV*8@R_>U{lx+xiXm#1Vy=-rCqy;`nD28v4sd_`l_=bd z81u_61K@S&BsRG01ka%D$U1gujz^v{bJe|@kRSkk$c9<4{p9hS_)eCD<1^O0KN$m8 z&cZDYx!Nk3yBf}_8w371bPlq~+ExEm@Ei31-WG8DPhw+(^Y6rl@I%qa)aj3=N2hc* zNpyPsSXu^VgaKi|7%Yp!lBp z+-QhalX&-Q25+2DVI-LkqqRX}FdGVWir!h3@FP|UmqSZ1D?R5p>zptO^ zvfnI1uBhwZi3W!(?NXx-+=r}{$`+G*fA&mmZM#{p4K-uq# zJ!j}ER82Kw#6|Uwq8i+>LBOnb$T(S@UEM5Y`kn~4=9$x1GHQPZ`l^!hsUYu%3bRORm(q!%9#BPW z1xxS;wc9<~s6<{9kM59XA}s+biD0Kc4#~LX6sDZZq^#27btIsiFPUceae6!9kGA#( ze4@7jbexGZEj3i#IY-e6(}3=q)DP{t0?UY)Swg$d1!YcF?rK`3F!9KFIU<{l;h)?` zozOA?@S|heS-Q=(=p=rBAm)U{%f>`Zi+goZPlZq`b6!-)wKI_i_9Pw(gdJ1*<$ttCmPwqNe*wGFsbmW{@*5lOLkJ0ATC zdu3+kM*VC&*y;#j#{Ka#UOdO4+o$JXQkZd%N>W(P2=KTteoe(k5dTu+WDFZbhviFRw#R2VOGramsvi41LSIuu@6yQ0XKnY}yH9ur($ zmeCV~ka0hel}i~W3K!Tb8{7>{x!O#BR8&Qos%y3{4)t9TwK{xFJ)Be5T6OKr5yk7TBGBa^44^CFfL%^s-N+#6BNi#~RLjvX3)sDw`2d z&Lv18Z7G!#!~BNWzQf;j!b~(|EI{=B*rKs$87Nph1bD>lKug&BWk61)kC7Wo{Y2#1z|K}q<{DTSwr>?m{X5q*I!~I zT*rbL=l5Pp@h;}3Cy}8SR7xsB;|gg-45kTZY^;z&)VOHMD5`SD%n<#SamSy?O`&0) zpf|Ti&r#8z1s=>1UUz|eD=X&>FppLBuk6o)|G`oAd3ME&R5J^#uv6X;gp2S(hLFpf zr3J(=98u_etH5N$1jB&X!7`4r3d)f7d_|`invd3}ZGajWlt>~`Jy0}hOVqvHyU?Ud zAP@5F%m6s+jZjpAiYx2UdbZiZY%|Q}FX%2{WCZu3(q(kR9$Z70nqYQ^KqVj!3`^`5 zaRpX5j(DmYMm0UUu#LmcTT|82s-jHkgj5!<`?|b(pT71>PujvLDT;pX-#w#Z@DnST zHuXrntE(SERQ{GB2tJH58f531qsGN?AFU(5Q7-bt1Pwlqx*@-DjH^(|s)%AP(oqRw z`&L#npfNvS4uyN@T9qi$q!4V>O9~oo5M=^EPxAPIQ9u0XvEwMAxeGT;12N2A^T-75;-9b(8K^u$icI`E8Ug>Nqo%YL_yeGLCo%?L4=F1lgV7o@S;lck1$va(Z#CUoKoj06UW9t`as&|secF^TS6 zZKPKUdm1><@cmUvJrapeqixKg0QVe}0hLZe$dGtC;!!|SsKMyb6g&(XXrUq1HIKsX zpEq+?d7&GH03hWy!0Ge;k9B2dIp54Ard zEu&E%0S%vhQI`u64ipI?I~C~4BDZLiwo~xCJ6bj9CqQ58GN2_nSyrL$r1?KRCdOkj z!3{_dkWtHjZzlg60%hlr&5JSi_cTnS)$Jh*f6sGR$Xk?apHHXhVA0+>6LvvzxRUeorgsn?rbss18qHtQoIuNq=&^E3m2^V zEQw&QCiP9fapv@v6o3@)yh|QSuBc1=84|t|J%fXO@hL_1Y}J6c-V7|rTX*^fDjEuQ z`<8~>R0b9+eB34-LyLL0i2{3x92TVk9!*S39%j~J#2~O6>#>g)Uyr&j2R(;!-ud&> znZwGVbvELt>b$d~HnyQ)r7IP-8)Kgh7N7HGT94AJ9M#dT;NYW&dZy%P_JNwp_qbCRuq;d|g>oNS*SA(}rqXS&5edKX01Inu_8uvrbD9_D z%)nrJmaL+-kNgcNe-Dt9ZKx>Z(@T&dDWb&F2$Aa$99JZ>hH+XVk#y=fQ;7F>Pcc&L zNNX|z3)gPjxAH;CP7i_X=}jLl{tdQUF_NtzAU=o>eVu}0sLl|xUp*_;_Qv&t**+;{a@crZU1nBZ2K)GJH;lSg)UIy*)tY)&pD!j=5Pw@K9Py?#YXt7Kd1~2==*EAe)Lh8DOla!<2a`M@Bt7WB9mt6w zyS?b?4sL8~xoiiszsmO3wqqdRV&R;Ha;{V_x|05C^{~HVSYmvbVh$4rNZjJkky>KG7 z-l~Ov+KCoruj@NsY4x0rsIJx$wz}Q1FVD`0>nGhaby7bj3K* zzmgRH0`?M&jtWKzT_A6x`MeXzVzJ-yK1MrHRwB07SPUB;#5!xWYHErV7+Ppvbe3Jr zDHYGGup%Rr#SG-E7Xt2qOub8~DQgv`8ucHqFH`d`J@!MZk9d9LtIY(UWs{NThDF`y zhsi)uVkaGT4`RLI+)!*Z#JDNko(fh`90uGyue`q6q)Ar9YZL7GXkFGCAdwC|2$sVe zZ>JCN%kGM|#$xmdgru{YO#tu;qau)uF3mEO%sS{r0%E~By2cM^r?tifO*7MAknMBf zW-MXj7Wz12J}w!T(T6(DesVh?K)Q6daP(3p%-j@Vgwt1J2l<`jqS~?c+9!*SkU1S8 zO)DX1={>^B-iRuRL|)QQmk~@3O(wvcO2&D_tvXC4-)&m4!@amo@uw0Ub}wpdX=jM> zWs%bfm&<{eiY6okMG2KAfJ&Sg?>t=meb6G^;stn$T;nI-KG@8R;Kd6fMwkVA7#-{m93sGZAX!!9)*{$AQs#~=!M51 zIbYK{&jQ1)#@Artm-TBiJol?lVDhraXBKb8bZV;{lHH|-O<|PIrgc|AeDI9!o~aOZ zD(^IJ^sFuMKV29-Z?fDOFc6S5^nd^1zCRq|7=JJ$*rTB8y6TKY{; zF`7mIAxo? zpMAdw6^?MGe>_Nq%HTrNrsq8L*R);c;4^OBP#BK8f9Gs?t)MwxwKRsU$(?g>2-?-x%H&{tJ64^(!&q&b`}I1_;(&Fv z^6X)+P`!sfeO)czYk0Z&>TQ_jan-u+OMACapMBKp5U}Cv{nMC1_j+Bb!Taqs8Uk`l zs+EZ?cK^t(^;yW{Yh9=b*{rpM;$6+Jq%_@=!zZTY&Qi;VgU?MHi|_1`GrQ?&j~Jb) z9QXlUzb?3(u1231=dsN(#&_X){C;HD{c-r{pzy1gL`UE2yM@C!^znNDJGRsI_E+_1 zq1Tjau0z%Fd4nNg{?fI&%YO5IId0dn_CnNJA!4)XlfHy()>6ys!&cJAT=yrg%}SvJ zn|pY3tHebP=EqKNh2&3#HHq9}Cdz9R-#!)v|HnKUyopqR#T%Rnb~ zrza7MJS>#3$K^P1&c}d(<%D(O^XiBNPl!Lx<`pF%}jgpXk5;3_x2N9 z8E%V5X4$yzzllj7$TyS#-lL6Ssa8y>?A5r>OzeJI?YB|7_Ch& zVbe0MY&cM-XHAo?N^=G4lA{G~qY$?lvTGEqtk*cSQB87ZF#&rbxg3)xx5jNU%V}_N zBFlJ?87_DR#XAy5`IiM5%DXLubAD_OWp)HQOu7EBm6<%1nWF?l3v8nr5z7G42KBF& z=hbofhgDLWxgpdfyri-pUb3Lb0M!LC6(pNR-er@83c#VK>VW-*^e*MpZ5fDjH^CiR z^!Ry9{m?jiOfA`ba%`Q+1tLt#C@Oi{w+wP+i%Mgdpu&Qu(A}R*A+>&$6uXVfp+f^3 zw%HoyX3!SchxSN1*dzAtQ`!5c98YI?Iw0+0>Ds|q3+$DJV$^u*Qc>$E${gL16`d_1 z!pogTA?>%KmAsJ)1hR^v(7Z8q^dzxXxr?hDiww@_mH3+#S-PTlPb^rD6vpJ*j{Pti zBcNpc6wq*_*VX-z!&xiZmB-==_TlpSCyQI(`9>6&b2;KD0QwY5H5ITamwXcPj{VFE z8!apC8N*w`iST47CgmZ$)P$*D`l*mzTufJxSL!|m=*Z_?`Vsk8pBsgQY;j@}uFr^c z5B<2;y|Akiyr~NGTYL&9uDU51Ga^sa#x{CRRv2zaB8-{Qix4X?rna&6q%Au8ak5IZ zso+TBmGHaAf#BRja7e*$TP~8|j0=MF^?o`MiskD;)2T)_{LV4VhI!15NL$o1uFuD$ zt6Mywl041*iR>3CEhHj81G?Y%L!s;&LGLV=uq^Zl(1M!M;#%q@sbI9cZCQS@xB%&2LsDO8(m!aA9mP)LahoDiq2E;Uzcfzb;8wb;h(HV=={`CHCnv!qI^*K)?A2lRZ@Ua~hD$J1(VvkI1IJ!$9Ua_ri%Kec~>f&=|=(fc8U zbkKvLfcQf<8U{n>_f#D!&XaAhgqkNqBuo9_lK2fsed#H^qtSGdoxJT~edusxEo+>? zz+BbP;yZyh$-6hWjhbWV%Z4&pT{05F!)*_lIPF%}+qD0#F(dkCJ zQ$#iqpK30xbXRMr#N1h+y67hAps9)bbnk#lzZ;Up!eU*m2Q`UUtdv^^Awx&o3g7-Fl#tF7jr5Twnc*j zvAXG@D`UG|ep|0)$=M;Iew}Cj3oGgUsiD@$7E1!FH`IkeETamHH|AI=nO=dCXqpca z6H8RPbZU2^4;UpPI0D3>S>!9DS= zdh45Y&tji|g0L0c*M!^?Ts=xYet)?YBbw%+X#bXon}y^$isec_*3sHC7xtU`g-G;; zFoY!JXq>*;vixurZ^#BGq>i}r${xsyHGLE$TM+FxOJa#eV)?$kO38*n?~4rGeW;&_ z;gmKUl2s_cI?}hsXp&#@64#JShlWe+XslNPS%@3!V&WUMa5tbuU&$iS$3DaMbnT)y z3}nZ~CiZ>6?3e;$gu|Pi3_dV_Io@9{cwu9`c2bd93&69JGvV#qVtw6#8fmkA&s&(i zZWYQ^&XF{HUe8c8lr$H&^i?d9?Tnf9G7huKBqw7l2EKEz>m3!plh)led&qJow4jjX z)yEV2cunpZza|IH{yg!sWZVluCLLf)YEbo-MFY02)@WA)8l7{rX=px4Uhukkzu!Ig8c z13ea@9jE~?GqBCj8f~C8eMU>N{oWHXN_QT(s%ZNA*?-JJ@Q>`9vQzy8(Mdo8Fc1oeDb_4a+eTS>wNGOeUsL1u#BH}7dY z*}kJs6Yq2KsM>c16AC7L?L(#TK)y1Rg=~>*jh1Di($9Kqkq&Tv)}0ob8HW zf*RJ?J3`;UX$~zHjBR=w+Wk>bW>W$AvrHu$>X|hQ<+}$3C28}WBqEoPv#MW3>dC$h zWP~M%(%i0-`=FueVMr^o8)sreL~tStrsNEUIFHd1aiIH)Rgbk!yeuxDTFMVc0-k}o z>RFTzLw*@!dbMK1t583Q5;LWIL8Hi;{zViKirzK(d>-_&YB%#82UR{{f93 zd1xnZBeksFygbXc3|jaeX7Z9O&xz->*|p<*!kmh6B2w^BTSy4B%G#&Q0Y*Wo(3Ulj z!pTS=6GaP5?0yp^{48}?!v#pg70Uc>Hp9jv3V9`wP~;@gtIZBE-cY zL4NyQ9+W`{xKk77GC-b>rNZ9w6qDi#!lLG3u%6+sEKMzUwo->yEPci$z$HA3#bITb zoaKi+&0%mW$^l+4p);Pm z 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

-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 Date: Tue, 2 Apr 2024 23:45:16 -0400 Subject: [PATCH 071/150] Bump pytest-order from 1.2.0 to 1.2.1 (#14593) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d1a0f98289f..db9eb3d0986 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,7 @@ productmd==1.38 pyotp==2.9.0 python-box==7.1.1 pytest==8.1.1 -pytest-order==1.2.0 +pytest-order==1.2.1 pytest-services==2.2.1 pytest-mock==3.14.0 pytest-reportportal==5.4.1 From 932b588adffc0e8017c81124782b51667d5a06d1 Mon Sep 17 00:00:00 2001 From: Griffin Sullivan <48397354+Griffin-Sullivan@users.noreply.github.com> Date: Wed, 3 Apr 2024 03:54:07 -0400 Subject: [PATCH 072/150] Fix foreman service test (#14583) --- tests/foreman/maintain/test_service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/foreman/maintain/test_service.py b/tests/foreman/maintain/test_service.py index 7f8c0efad8c..3ff33790055 100644 --- a/tests/foreman/maintain/test_service.py +++ b/tests/foreman/maintain/test_service.py @@ -225,7 +225,9 @@ def test_positive_foreman_service(sat_maintain): assert 'foreman' in result.stdout result = sat_maintain.cli.Service.status(options={'only': 'httpd'}) assert result.status == 0 - result = sat_maintain.cli.Health.check(options={'assumeyes': True}) + result = sat_maintain.cli.Health.check( + options={'assumeyes': True, 'whitelist': 'check-tftp-storage'} + ) assert result.status == 0 assert 'foreman' in result.stdout assert sat_maintain.cli.Service.start(options={'only': 'foreman'}).status == 0 From 9687508361e085b41c512128b3f3183fc26f1249 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Wed, 3 Apr 2024 18:49:53 +0530 Subject: [PATCH 073/150] Move TestAnsibleREX CLI tests to Ansible module (#14577) Signed-off-by: Gaurav Talreja --- tests/foreman/cli/test_ansible.py | 604 +++++++++++++++++----- tests/foreman/cli/test_remoteexecution.py | 413 +-------------- 2 files changed, 487 insertions(+), 530 deletions(-) diff --git a/tests/foreman/cli/test_ansible.py b/tests/foreman/cli/test_ansible.py index 8cffe15b20d..707acbcfec9 100644 --- a/tests/foreman/cli/test_ansible.py +++ b/tests/foreman/cli/test_ansible.py @@ -4,156 +4,520 @@ :CaseAutomation: Automated -:CaseComponent: Ansible-ConfigurationManagement - :Team: Rocket :CaseImportance: High - """ +from time import sleep + from fauxfactory import gen_string import pytest from robottelo.config import settings -@pytest.mark.e2e -@pytest.mark.no_containers -@pytest.mark.rhel_ver_match('[^6].*') -def test_positive_ansible_e2e(target_sat, module_org, rhel_contenthost): +def assert_job_invocation_result( + sat, invocation_command_id, client_hostname, expected_result='success' +): + """Asserts the job invocation finished with the expected result and fetches job output + when error occurs. Result is one of: success, pending, error, warning""" + result = sat.cli.JobInvocation.info({'id': invocation_command_id}) + try: + assert result[expected_result] == '1' + except AssertionError as err: + raise AssertionError( + 'host output: {}'.format( + ' '.join( + sat.cli.JobInvocation.get_output( + {'id': invocation_command_id, 'host': client_hostname} + ) + ) + ) + ) from err + + +@pytest.mark.upgrade +class TestAnsibleCfgMgmt: + """Test class for Configuration Management with Ansible + + :CaseComponent: Ansible-ConfigurationManagement """ - Test successful execution of Ansible Job on host. - :id: 0c52bc63-a41a-4f48-a980-fe49b4ecdbdc + @pytest.mark.e2e + @pytest.mark.no_containers + @pytest.mark.rhel_ver_match('[^6].*') + def test_positive_ansible_e2e( + self, target_sat, module_sca_manifest_org, module_ak_with_cv, rhel_contenthost + ): + """ + Test successful execution of Ansible Job on host. - :steps: - 1. Register a content host with satellite - 2. Import a role into satellite - 3. Assign that role to a host - 4. Assert that the role and variable were assigned to the host successfully - 5. Run the Ansible playbook associated with that role - 6. Check if the job is executed successfully. - 7. Disassociate the Role from the host. - 8. Delete the assigned ansible role + :id: 0c52bc63-a41a-4f48-a980-fe49b4ecdbdc - :expectedresults: - 1. Host should be assigned the proper role. - 2. Job execution must be successful. - 3. Operations performed with hammer must be successful. + :steps: + 1. Register a content host with satellite + 2. Import a role into satellite + 3. Assign that role to a host + 4. Assert that the role and variable were assigned to the host successfully + 5. Run the Ansible playbook associated with that role + 6. Check if the job is executed successfully. + 7. Disassociate the Role from the host. + 8. Delete the assigned ansible role - :BZ: 2154184 + :expectedresults: + 1. Host should be assigned the proper role. + 2. Job execution must be successful. + 3. Operations performed with hammer must be successful. - :customerscenario: true + :BZ: 2154184 - :CaseImportance: Critical - """ - SELECTED_ROLE = 'RedHatInsights.insights-client' - SELECTED_ROLE_1 = 'theforeman.foreman_scap_client' - SELECTED_VAR = gen_string('alpha') - # disable batch tasks to test BZ#2154184 - target_sat.cli.Settings.set({'name': 'foreman_tasks_proxy_batch_trigger', 'value': 'false'}) - if rhel_contenthost.os_version.major <= 7: - rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) - assert rhel_contenthost.execute('yum install -y insights-client').status == 0 - rhel_contenthost.install_katello_ca(target_sat) - rhel_contenthost.register_contenthost(module_org.label, force=True) - assert rhel_contenthost.subscribed - rhel_contenthost.add_rex_key(satellite=target_sat) - proxy_id = target_sat.nailgun_smart_proxy.id - target_host = rhel_contenthost.nailgun_host - - target_sat.cli.Ansible.roles_sync( - {'role-names': f'{SELECTED_ROLE},{SELECTED_ROLE_1}', 'proxy-id': proxy_id} - ) + :customerscenario: true + """ + SELECTED_ROLE = 'RedHatInsights.insights-client' + SELECTED_ROLE_1 = 'theforeman.foreman_scap_client' + SELECTED_VAR = gen_string('alpha') + proxy_id = target_sat.nailgun_smart_proxy.id + # disable batch tasks to test BZ#2154184 + target_sat.cli.Settings.set({'name': 'foreman_tasks_proxy_batch_trigger', 'value': 'false'}) + result = rhel_contenthost.register( + module_sca_manifest_org, None, module_ak_with_cv.name, target_sat + ) + assert result.status == 0, f'Failed to register host: {result.stderr}' + if rhel_contenthost.os_version.major <= 7: + rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) + assert rhel_contenthost.execute('yum install -y insights-client').status == 0 + target_host = rhel_contenthost.nailgun_host - result = target_sat.cli.Host.ansible_roles_add( - {'id': target_host.id, 'ansible-role': SELECTED_ROLE} - ) - assert 'Ansible role has been associated.' in result[0]['message'] + target_sat.cli.Ansible.roles_sync( + {'role-names': f'{SELECTED_ROLE},{SELECTED_ROLE_1}', 'proxy-id': proxy_id} + ) + result = target_sat.cli.Host.ansible_roles_add( + {'id': target_host.id, 'ansible-role': SELECTED_ROLE} + ) + assert 'Ansible role has been associated.' in result[0]['message'] - target_sat.cli.Ansible.variables_create( - {'variable': SELECTED_VAR, 'ansible-role': SELECTED_ROLE} - ) + target_sat.cli.Ansible.variables_create( + {'variable': SELECTED_VAR, 'ansible-role': SELECTED_ROLE} + ) - assert SELECTED_ROLE, ( - SELECTED_VAR in target_sat.cli.Ansible.variables_info({'name': SELECTED_VAR}).stdout - ) - template_id = ( - target_sat.api.JobTemplate() - .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] - .id - ) - job = target_sat.api.JobInvocation().run( - synchronous=False, - data={ - 'job_template_id': template_id, - 'targeting_type': 'static_query', - 'search_query': f'name = {rhel_contenthost.hostname}', - }, - ) - target_sat.wait_for_tasks( - f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 - ) - result = target_sat.api.JobInvocation(id=job['id']).read() - assert result.succeeded == 1 + assert SELECTED_ROLE, ( + SELECTED_VAR in target_sat.cli.Ansible.variables_info({'name': SELECTED_VAR}).stdout + ) + template_id = ( + target_sat.api.JobTemplate() + .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] + .id + ) + job = target_sat.api.JobInvocation().run( + synchronous=False, + data={ + 'job_template_id': template_id, + 'targeting_type': 'static_query', + 'search_query': f'name = {rhel_contenthost.hostname}', + }, + ) + target_sat.wait_for_tasks( + f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 + ) + result = target_sat.api.JobInvocation(id=job['id']).read() + assert result.succeeded == 1 - result = target_sat.cli.Host.ansible_roles_assign( - {'id': target_host.id, 'ansible-roles': f'{SELECTED_ROLE},{SELECTED_ROLE_1}'} - ) - assert 'Ansible roles were assigned to the host' in result[0]['message'] + result = target_sat.cli.Host.ansible_roles_assign( + {'id': target_host.id, 'ansible-roles': f'{SELECTED_ROLE},{SELECTED_ROLE_1}'} + ) + assert 'Ansible roles were assigned to the host' in result[0]['message'] - result = target_sat.cli.Host.ansible_roles_remove( - {'id': target_host.id, 'ansible-role': SELECTED_ROLE} - ) - assert 'Ansible role has been disassociated.' in result[0]['message'] + result = target_sat.cli.Host.ansible_roles_remove( + {'id': target_host.id, 'ansible-role': SELECTED_ROLE} + ) + assert 'Ansible role has been disassociated.' in result[0]['message'] - result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) - assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] + result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) + assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] - assert SELECTED_ROLE, ( - SELECTED_VAR not in target_sat.cli.Ansible.variables_info({'name': SELECTED_VAR}).stdout - ) + assert SELECTED_ROLE, ( + SELECTED_VAR not in target_sat.cli.Ansible.variables_info({'name': SELECTED_VAR}).stdout + ) + @pytest.mark.e2e + @pytest.mark.tier2 + def test_add_and_remove_ansible_role_hostgroup(self, target_sat): + """ + Test add and remove functionality for ansible roles in hostgroup via CLI -@pytest.mark.e2e -@pytest.mark.tier2 -def test_add_and_remove_ansible_role_hostgroup(target_sat): - """ - Test add and remove functionality for ansible roles in hostgroup via CLI + :id: 2c6fda14-4cd2-490a-b7ef-7a08f8164fad + + :customerscenario: true + + :steps: + 1. Create a hostgroup + 2. Sync few ansible roles + 3. Assign a few ansible roles with the host group + 4. Add some ansible role with the host group + 5. Remove the added ansible roles from the host group - :id: 2c6fda14-4cd2-490a-b7ef-7a08f8164fad + :expectedresults: + 1. Ansible role assign/add/remove functionality should work as expected in CLI - :customerscenario: true + :BZ: 2029402 + """ + ROLES = [ + 'theforeman.foreman_scap_client', + 'redhat.satellite.hostgroups', + 'RedHatInsights.insights-client', + ] + proxy_id = target_sat.nailgun_smart_proxy.id + hg_name = gen_string('alpha') + result = target_sat.cli.HostGroup.create({'name': hg_name}) + assert result['name'] == hg_name + target_sat.cli.Ansible.roles_sync({'role-names': ROLES, 'proxy-id': proxy_id}) + result = target_sat.cli.HostGroup.ansible_roles_assign( + {'name': hg_name, 'ansible-roles': f'{ROLES[1]},{ROLES[2]}'} + ) + assert 'Ansible roles were assigned to the hostgroup' in result[0]['message'] + result = target_sat.cli.HostGroup.ansible_roles_add( + {'name': hg_name, 'ansible-role': ROLES[0]} + ) + assert 'Ansible role has been associated.' in result[0]['message'] + result = target_sat.cli.HostGroup.ansible_roles_remove( + {'name': hg_name, 'ansible-role': ROLES[0]} + ) + assert 'Ansible role has been disassociated.' in result[0]['message'] - :steps: - 1. Create a hostgroup - 2. Sync few ansible roles - 3. Assign a few ansible roles with the host group - 4. Add some ansible role with the host group - 5. Remove the added ansible roles from the host group - :expectedresults: - 1. Ansible role assign/add/remove functionality should work as expected in CLI +@pytest.mark.tier3 +@pytest.mark.upgrade +class TestAnsibleREX: + """Test class for remote execution via Ansible - :BZ: 2029402 + :CaseComponent: Ansible-RemoteExecution """ - ROLES = [ - 'theforeman.foreman_scap_client', - 'redhat.satellite.hostgroups', - 'RedHatInsights.insights-client', - ] - proxy_id = target_sat.nailgun_smart_proxy.id - hg_name = gen_string('alpha') - result = target_sat.cli.HostGroup.create({'name': hg_name}) - assert result['name'] == hg_name - target_sat.cli.Ansible.roles_sync({'role-names': ROLES, 'proxy-id': proxy_id}) - result = target_sat.cli.HostGroup.ansible_roles_assign( - {'name': hg_name, 'ansible-roles': f'{ROLES[1]},{ROLES[2]}'} - ) - assert 'Ansible roles were assigned to the hostgroup' in result[0]['message'] - result = target_sat.cli.HostGroup.ansible_roles_add({'name': hg_name, 'ansible-role': ROLES[0]}) - assert 'Ansible role has been associated.' in result[0]['message'] - result = target_sat.cli.HostGroup.ansible_roles_remove( - {'name': hg_name, 'ansible-role': ROLES[0]} + + @pytest.mark.pit_client + @pytest.mark.pit_server + @pytest.mark.rhel_ver_match('[^6]') + def test_positive_run_effective_user_job(self, rex_contenthost, target_sat): + """Tests Ansible REX job having effective user runs successfully + + :id: a5fa20d8-c2bd-4bbf-a6dc-bf307b59dd8c + + :steps: + 0. Create a VM and register to SAT and prepare for REX (ssh key) + 1. Run Ansible Command job for the host to create a user + 2. Run Ansible Command job using effective user + 3. Check the job result at the host is done under that user + + :expectedresults: multiple asserts along the code + + :parametrized: yes + """ + client = rex_contenthost + # create a user on client via remote job + username = gen_string('alpha') + filename = gen_string('alpha') + make_user_job = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Ansible Default', + 'inputs': f'command=useradd -m {username}', + 'search-query': f'name ~ {client.hostname}', + } + ) + assert_job_invocation_result(target_sat, make_user_job['id'], client.hostname) + # create a file as new user + invocation_command = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Ansible Default', + 'inputs': f'command=touch /home/{username}/{filename}', + 'search-query': f'name ~ {client.hostname}', + 'effective-user': username, + } + ) + assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) + + # check the file owner + result = client.execute( + f'''stat -c '%U' /home/{username}/{filename}''', + ) + # assert the file is owned by the effective user + assert username == result.stdout.strip('\n'), 'file ownership mismatch' + + @pytest.mark.rhel_ver_list([8]) + def test_positive_run_reccuring_job(self, rex_contenthost, target_sat): + """Tests Ansible REX reccuring job runs successfully multiple times + + :id: 49b0d31d-58f9-47f1-aa5d-561a1dcb0d66 + + :setup: + 1. Create a VM, register to SAT and configure REX (ssh-key) + + :steps: + 1. Run recurring Ansible Command job for the host + 2. Check the multiple job results at the host + + :expectedresults: multiple asserts along the code + + :bz: 2129432 + + :customerscenario: true + + :parametrized: yes + """ + client = rex_contenthost + invocation_command = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Ansible Default', + 'inputs': 'command=ls', + 'search-query': f'name ~ {client.hostname}', + 'cron-line': '* * * * *', # every minute + 'max-iteration': 2, # just two runs + } + ) + result = target_sat.cli.JobInvocation.info({'id': invocation_command['id']}) + sleep(150) + rec_logic = target_sat.cli.RecurringLogic.info({'id': result['recurring-logic-id']}) + assert rec_logic['state'] == 'finished' + assert rec_logic['iteration'] == '2' + # 2129432 + rec_logic_keys = rec_logic.keys() + assert 'action' in rec_logic_keys + assert 'last-occurrence' in rec_logic_keys + assert 'next-occurrence' in rec_logic_keys + assert 'state' in rec_logic_keys + assert 'purpose' in rec_logic_keys + assert 'iteration' in rec_logic_keys + assert 'iteration-limit' in rec_logic_keys + + @pytest.mark.rhel_ver_list([8]) + def test_positive_run_concurrent_jobs(self, rex_contenthosts, target_sat): + """Tests Ansible REX concurent jobs without batch trigger + + :id: ad0f108c-03f2-49c7-8732-b1056570567b + + :steps: + 1. Create 2 hosts, disable foreman_tasks_proxy_batch_trigger + 2. Run Ansible Command job with concurrency-setting + + :expectedresults: multiple asserts along the code + + :BZ: 1817320 + + :customerscenario: true + + :parametrized: yes + """ + clients = rex_contenthosts + param_name = 'foreman_tasks_proxy_batch_trigger' + target_sat.cli.GlobalParameter().set({'name': param_name, 'value': 'false'}) + output_msgs = [] + invocation_command = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Ansible Default', + 'inputs': 'command=ls', + 'search-query': f'name ~ {clients[0].hostname} or name ~ {clients[1].hostname}', + 'concurrency-level': 2, + } + ) + for vm in clients: + output_msgs.append( + 'host output from {}: {}'.format( + vm.hostname, + ' '.join( + target_sat.cli.JobInvocation.get_output( + {'id': invocation_command['id'], 'host': vm.hostname} + ) + ), + ) + ) + result = target_sat.cli.JobInvocation.info({'id': invocation_command['id']}) + assert result['success'] == '2', output_msgs + target_sat.cli.GlobalParameter().delete({'name': param_name}) + assert len(target_sat.cli.GlobalParameter().list({'search': param_name})) == 0 + + @pytest.mark.rhel_ver_list([8]) + def test_positive_run_serial(self, rex_contenthosts, target_sat): + """Tests subtasks in a job run one by one when concurrency level set to 1 + + :id: 5ce39447-82d0-42df-81be-16ed3d67a2a4 + + :setup: + 1. Create 2 hosts, register to SAT and configure REX (ssh-key) + + :steps: + 1. Run a bash command job with concurrency level 1 + + :expectedresults: First subtask should run immediately, second one after the first one finishes + + :parametrized: yes + """ + hosts = rex_contenthosts + output_msgs = [] + template_file = f'/root/{gen_string("alpha")}.template' + target_sat.execute( + f"echo 'rm /root/test-<%= @host %>; echo $(date +%s) >> /root/test-<%= @host %>; sleep 120; echo $(date +%s) >> /root/test-<%= @host %>' > {template_file}" + ) + template = target_sat.cli.JobTemplate.create( + { + 'name': gen_string('alpha'), + 'file': template_file, + 'job-category': 'Commands', + 'provider-type': 'script', + } + ) + invocation = target_sat.cli_factory.job_invocation( + { + 'job-template': template['name'], + 'search-query': f'name ~ {hosts[0].hostname} or name ~ {hosts[1].hostname}', + 'concurrency-level': 1, + } + ) + for vm in hosts: + output_msgs.append( + 'host output from {}: {}'.format( + vm.hostname, + ' '.join( + target_sat.cli.JobInvocation.get_output( + {'id': invocation['id'], 'host': vm.hostname} + ) + ), + ) + ) + result = target_sat.cli.JobInvocation.info({'id': invocation['id']}) + assert result['success'] == '2', output_msgs + # assert for time diffs + file1 = hosts[0].execute('cat /root/test-$(hostname)').stdout + file2 = hosts[1].execute('cat /root/test-$(hostname)').stdout + file1_start, file1_end = map(int, file1.rstrip().split('\n')) + file2_start, file2_end = map(int, file2.rstrip().split('\n')) + if file1_start > file2_start: + file1_start, file1_end, file2_start, file2_end = ( + file2_start, + file2_end, + file1_start, + file1_end, + ) + assert file1_end - file1_start >= 120 + assert file2_end - file2_start >= 120 + assert file2_start >= file1_end # the jobs did NOT run concurrently + + @pytest.mark.e2e + @pytest.mark.no_containers + @pytest.mark.pit_server + @pytest.mark.rhel_ver_match('[^6].*') + @pytest.mark.skipif( + (not settings.robottelo.repos_hosting_url), reason='Missing repos_hosting_url' ) - assert 'Ansible role has been disassociated.' in result[0]['message'] + def test_positive_run_packages_and_services_job( + self, rhel_contenthost, module_sca_manifest_org, module_ak_with_cv, target_sat + ): + """Tests Ansible REX job can install packages and start services + + :id: 47ed82fb-77ca-43d6-a52e-f62bae5d3a42 + + :setup: + 1. Create a VM, register to SAT and configure REX (ssh-key) + + :steps: + 1. Run Ansible Package job for the host to install a package + 2. Check the package is present at the host + 3. Run Ansible Service job for the host to start a service + 4. Check the service is started on the host + + :expectedresults: multiple asserts along the code + + :bz: 1872688, 1811166 + + :customerscenario: true + + :parametrized: yes + """ + client = rhel_contenthost + packages = ['tapir'] + result = client.register( + module_sca_manifest_org, + None, + module_ak_with_cv.name, + target_sat, + repo=settings.repos.yum_3.url, + ) + assert result.status == 0, f'Failed to register host: {result.stderr}' + # install package + invocation_command = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Package Action - Ansible Default', + 'inputs': 'state=latest, name={}'.format(*packages), + 'search-query': f'name ~ {client.hostname}', + } + ) + assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) + result = client.run(f'rpm -q {" ".join(packages)}') + assert result.status == 0 + + # stop a service + service = 'rsyslog' + invocation_command = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Service Action - Ansible Default', + 'inputs': f'state=stopped, name={service}', + 'search-query': f"name ~ {client.hostname}", + } + ) + assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) + result = client.execute(f'systemctl status {service}') + assert result.status == 3 + + # start it again + invocation_command = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Service Action - Ansible Default', + 'inputs': f'state=started, name={service}', + 'search-query': f'name ~ {client.hostname}', + } + ) + assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) + result = client.execute(f'systemctl status {service}') + assert result.status == 0 + + @pytest.mark.rhel_ver_list([8]) + def test_positive_install_ansible_collection(self, rex_contenthost, target_sat): + """Test whether Ansible collection can be installed via Ansible REX + + :id: ad25aee5-4ea3-4743-a301-1c6271856f79 + + :steps: + 1. Upload a manifest. + 2. Register content host to Satellite with REX setup + 3. Enable Ansible repo on content host. + 4. Install ansible or ansible-core package + 5. Run REX job to install Ansible collection on content host. + + :expectedresults: Ansible collection can be installed on content host via REX. + """ + client = rex_contenthost + # Enable Ansible repository and Install ansible or ansible-core package + client.create_custom_repos(rhel8_aps=settings.repos.rhel8_os.appstream) + assert client.execute('dnf -y install ansible-core').status == 0 + + collection_job = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Ansible Collection - Install from Galaxy', + 'inputs': 'ansible_collections_list="oasis_roles.system"', + 'search-query': f'name ~ {client.hostname}', + } + ) + result = target_sat.cli.JobInvocation.info({'id': collection_job['id']}) + assert result['success'] == '1' + collection_path = client.execute('ls /etc/ansible/collections/ansible_collections').stdout + assert 'oasis_roles' in collection_path + + # Extend test with custom collections_path advanced input field + collection_job = target_sat.cli_factory.job_invocation( + { + 'job-template': 'Ansible Collection - Install from Galaxy', + 'inputs': 'ansible_collections_list="oasis_roles.system", collections_path="~/"', + 'search-query': f'name ~ {client.hostname}', + } + ) + result = target_sat.cli.JobInvocation.info({'id': collection_job['id']}) + assert result['success'] == '1' + collection_path = client.execute('ls ~/ansible_collections').stdout + assert 'oasis_roles' in collection_path diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index d892b4dbb4a..67231123ec1 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -16,7 +16,6 @@ import random from time import sleep -from broker import Broker from dateutil.relativedelta import FR, relativedelta from fauxfactory import gen_string import pytest @@ -24,8 +23,7 @@ from robottelo import constants from robottelo.config import settings -from robottelo.constants import FAKE_4_CUSTOM_PACKAGE, PRDS, REPOS, REPOSET -from robottelo.hosts import ContentHost +from robottelo.constants import FAKE_4_CUSTOM_PACKAGE from robottelo.utils import ohsnap from robottelo.utils.datafactory import filtered_datapoint, parametrized @@ -44,24 +42,6 @@ def valid_feature_names(): ] -@pytest.fixture -def fixture_sca_vmsetup(request, module_sca_manifest_org, target_sat): - """Create VM and register content host to Simple Content Access organization""" - if '_count' in request.param: - with Broker( - nick=request.param['nick'], - host_class=ContentHost, - _count=request.param['_count'], - ) as clients: - for client in clients: - client.configure_rex(satellite=target_sat, org=module_sca_manifest_org) - yield clients - else: - with Broker(nick=request.param['nick'], host_class=ContentHost) as client: - client.configure_rex(satellite=target_sat, org=module_sca_manifest_org) - yield client - - @pytest.fixture def infra_host(request, target_sat, module_capsule_configured): infra_hosts = {'target_sat': target_sat, 'module_capsule_configured': module_capsule_configured} @@ -230,10 +210,9 @@ def test_positive_run_custom_job_template(self, rex_contenthost, module_org, tar @pytest.mark.tier3 @pytest.mark.upgrade - @pytest.mark.no_containers @pytest.mark.rhel_ver_list([8]) def test_positive_run_default_job_template_multiple_hosts( - self, registered_hosts, module_target_sat + self, rex_contenthosts, module_target_sat ): """Run default job template against multiple hosts @@ -243,7 +222,7 @@ def test_positive_run_default_job_template_multiple_hosts( :parametrized: yes """ - clients = registered_hosts + clients = rex_contenthosts invocation_command = module_target_sat.cli_factory.job_invocation( { 'job-template': 'Run Command - Script Default', @@ -622,392 +601,6 @@ def test_recurring_with_unreachable_host(self, module_target_sat, rhel_contentho assert cli.JobInvocation.info({'id': invocation.id})['failed'] != '0' -class TestAnsibleREX: - """Test class for remote execution via Ansible""" - - @pytest.mark.tier3 - @pytest.mark.upgrade - @pytest.mark.pit_client - @pytest.mark.pit_server - @pytest.mark.rhel_ver_list([7, 8, 9]) - def test_positive_run_effective_user_job(self, rex_contenthost, target_sat): - """Tests Ansible REX job having effective user runs successfully - - :id: a5fa20d8-c2bd-4bbf-a6dc-bf307b59dd8c - - :steps: - - 0. Create a VM and register to SAT and prepare for REX (ssh key) - - 1. Run Ansible Command job for the host to create a user - - 2. Run Ansible Command job using effective user - - 3. Check the job result at the host is done under that user - - :expectedresults: multiple asserts along the code - - :CaseAutomation: Automated - - :parametrized: yes - """ - client = rex_contenthost - # create a user on client via remote job - username = gen_string('alpha') - filename = gen_string('alpha') - make_user_job = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Run Command - Ansible Default', - 'inputs': f"command=useradd -m {username}", - 'search-query': f"name ~ {client.hostname}", - } - ) - assert_job_invocation_result(target_sat, make_user_job['id'], client.hostname) - # create a file as new user - invocation_command = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Run Command - Ansible Default', - 'inputs': f"command=touch /home/{username}/{filename}", - 'search-query': f"name ~ {client.hostname}", - 'effective-user': f'{username}', - } - ) - assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) - # check the file owner - result = client.execute( - f'''stat -c '%U' /home/{username}/{filename}''', - ) - # assert the file is owned by the effective user - assert username == result.stdout.strip('\n'), "file ownership mismatch" - - @pytest.mark.tier3 - @pytest.mark.upgrade - @pytest.mark.rhel_ver_list([8]) - def test_positive_run_reccuring_job(self, rex_contenthost, target_sat): - """Tests Ansible REX reccuring job runs successfully multiple times - - :id: 49b0d31d-58f9-47f1-aa5d-561a1dcb0d66 - - :steps: - - 0. Create a VM and register to SAT and prepare for REX (ssh key) - - 1. Run recurring Ansible Command job for the host - - 2. Check the multiple job results at the host - - :expectedresults: multiple asserts along the code - - :CaseAutomation: Automated - - :customerscenario: true - - :bz: 2129432 - - :parametrized: yes - """ - client = rex_contenthost - invocation_command = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Run Command - Ansible Default', - 'inputs': 'command=ls', - 'search-query': f"name ~ {client.hostname}", - 'cron-line': '* * * * *', # every minute - 'max-iteration': 2, # just two runs - } - ) - result = target_sat.cli.JobInvocation.info({'id': invocation_command['id']}) - sleep(150) - rec_logic = target_sat.cli.RecurringLogic.info({'id': result['recurring-logic-id']}) - assert rec_logic['state'] == 'finished' - assert rec_logic['iteration'] == '2' - # 2129432 - rec_logic_keys = rec_logic.keys() - assert 'action' in rec_logic_keys - assert 'last-occurrence' in rec_logic_keys - assert 'next-occurrence' in rec_logic_keys - assert 'state' in rec_logic_keys - assert 'purpose' in rec_logic_keys - assert 'iteration' in rec_logic_keys - assert 'iteration-limit' in rec_logic_keys - - @pytest.mark.tier3 - @pytest.mark.no_containers - def test_positive_run_concurrent_jobs(self, registered_hosts, target_sat): - """Tests Ansible REX concurent jobs without batch trigger - - :id: ad0f108c-03f2-49c7-8732-b1056570567b - - :steps: - - 0. Create 2 hosts, disable foreman_tasks_proxy_batch_trigger - - 1. Run Ansible Command job with concurrency-setting - - :expectedresults: multiple asserts along the code - - :CaseAutomation: Automated - - :customerscenario: true - - :BZ: 1817320 - - :parametrized: yes - """ - param_name = 'foreman_tasks_proxy_batch_trigger' - target_sat.cli.GlobalParameter().set({'name': param_name, 'value': 'false'}) - clients = registered_hosts - output_msgs = [] - invocation_command = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Run Command - Ansible Default', - 'inputs': 'command=ls', - 'search-query': f'name ~ {clients[0].hostname} or name ~ {clients[1].hostname}', - 'concurrency-level': 2, - } - ) - for vm in clients: - output_msgs.append( - 'host output from {}: {}'.format( - vm.hostname, - ' '.join( - target_sat.cli.JobInvocation.get_output( - {'id': invocation_command['id'], 'host': vm.hostname} - ) - ), - ) - ) - result = target_sat.cli.JobInvocation.info({'id': invocation_command['id']}) - assert result['success'] == '2', output_msgs - target_sat.cli.GlobalParameter().delete({'name': param_name}) - assert len(target_sat.cli.GlobalParameter().list({'search': param_name})) == 0 - - @pytest.mark.tier3 - @pytest.mark.no_containers - def test_positive_run_serial(self, registered_hosts, target_sat): - """Tests subtasks in a job run one by one when concurrency level set to 1 - - :id: 5ce39447-82d0-42df-81be-16ed3d67a2a4 - - :Setup: - 0. Create 2 hosts - - :steps: - - 0. Run a bash command job with concurrency level 1 - - :expectedresults: First subtask should run immediately, second one after the first one finishes - - :CaseAutomation: Automated - - :parametrized: yes - """ - hosts = registered_hosts - output_msgs = [] - template_file = f"/root/{gen_string('alpha')}.template" - target_sat.execute( - f"echo 'rm /root/test-<%= @host %>; echo $(date +%s) >> /root/test-<%= @host %>; sleep 120; echo $(date +%s) >> /root/test-<%= @host %>' > {template_file}" - ) - template = target_sat.cli.JobTemplate.create( - { - 'name': gen_string('alpha'), - 'file': template_file, - 'job-category': 'Commands', - 'provider-type': 'script', - } - ) - invocation = target_sat.cli_factory.job_invocation( - { - 'job-template': template['name'], - 'search-query': f'name ~ {hosts[0].hostname} or name ~ {hosts[1].hostname}', - 'concurrency-level': 1, - } - ) - for vm in hosts: - output_msgs.append( - 'host output from {}: {}'.format( - vm.hostname, - ' '.join( - target_sat.cli.JobInvocation.get_output( - {'id': invocation['id'], 'host': vm.hostname} - ) - ), - ) - ) - result = target_sat.cli.JobInvocation.info({'id': invocation['id']}) - assert result['success'] == '2', output_msgs - # assert for time diffs - file1 = hosts[0].execute('cat /root/test-$(hostname)').stdout - file2 = hosts[1].execute('cat /root/test-$(hostname)').stdout - file1_start, file1_end = map(int, file1.rstrip().split('\n')) - file2_start, file2_end = map(int, file2.rstrip().split('\n')) - if file1_start > file2_start: - file1_start, file1_end, file2_start, file2_end = ( - file2_start, - file2_end, - file1_start, - file1_end, - ) - assert file1_end - file1_start >= 120 - assert file2_end - file2_start >= 120 - assert file2_start >= file1_end # the jobs did NOT run concurrently - - @pytest.mark.tier3 - @pytest.mark.upgrade - @pytest.mark.e2e - @pytest.mark.no_containers - @pytest.mark.pit_server - @pytest.mark.rhel_ver_match('[^6].*') - @pytest.mark.skipif( - (not settings.robottelo.repos_hosting_url), reason='Missing repos_hosting_url' - ) - def test_positive_run_packages_and_services_job( - self, rhel_contenthost, module_org, module_ak_with_cv, target_sat - ): - """Tests Ansible REX job can install packages and start services - - :id: 47ed82fb-77ca-43d6-a52e-f62bae5d3a42 - - :steps: - - 0. Create a VM and register to SAT and prepare for REX (ssh key) - - 1. Run Ansible Package job for the host to install a package - - 2. Check the package is present at the host - - 3. Run Ansible Service job for the host to start a service - - 4. Check the service is started on the host - - :expectedresults: multiple asserts along the code - - :CaseAutomation: Automated - - :bz: 1872688, 1811166 - - :CaseImportance: Critical - - :customerscenario: true - - :parametrized: yes - """ - client = rhel_contenthost - packages = ['tapir'] - client.register( - module_org, - None, - module_ak_with_cv.name, - target_sat, - repo=settings.repos.yum_3.url, - ) - # install package - invocation_command = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Package Action - Ansible Default', - 'inputs': 'state=latest, name={}'.format(*packages), - 'search-query': f'name ~ {client.hostname}', - } - ) - assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) - result = client.run(f'rpm -q {" ".join(packages)}') - assert result.status == 0 - - # stop a service - service = "rsyslog" - invocation_command = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Service Action - Ansible Default', - 'inputs': f'state=stopped, name={service}', - 'search-query': f"name ~ {client.hostname}", - } - ) - assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) - result = client.execute(f'systemctl status {service}') - assert result.status == 3 - - # start it again - invocation_command = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Service Action - Ansible Default', - 'inputs': f'state=started, name={service}', - 'search-query': f'name ~ {client.hostname}', - } - ) - assert_job_invocation_result(target_sat, invocation_command['id'], client.hostname) - result = client.execute(f'systemctl status {service}') - assert result.status == 0 - - @pytest.mark.tier3 - @pytest.mark.parametrize( - 'fixture_sca_vmsetup', [{'nick': 'rhel8'}], ids=['rhel8'], indirect=True - ) - def test_positive_install_ansible_collection( - self, fixture_sca_vmsetup, module_sca_manifest_org, target_sat - ): - """Test whether Ansible collection can be installed via REX - - :steps: - 1. Upload a manifest. - 2. Enable and sync Ansible repository. - 3. Register content host to Satellite. - 4. Enable Ansible repo on content host. - 5. Install ansible package. - 6. Run REX job to install Ansible collection on content host. - - :id: ad25aee5-4ea3-4743-a301-1c6271856f79 - - :CaseComponent: Ansible-RemoteExecution - - :Team: Rocket - """ - # Configure repository to prepare for installing ansible on host - target_sat.cli.RepositorySet.enable( - { - 'basearch': 'x86_64', - 'name': REPOSET['rhae2.9_el8'], - 'organization-id': module_sca_manifest_org.id, - 'product': PRDS['rhae'], - 'releasever': '8', - } - ) - target_sat.cli.Repository.synchronize( - { - 'name': REPOS['rhae2.9_el8']['name'], - 'organization-id': module_sca_manifest_org.id, - 'product': PRDS['rhae'], - } - ) - client = fixture_sca_vmsetup - client.execute('subscription-manager refresh') - client.execute(f'subscription-manager repos --enable {REPOS["rhae2.9_el8"]["id"]}') - client.execute('dnf -y install ansible') - collection_job = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Ansible Collection - Install from Galaxy', - 'inputs': 'ansible_collections_list="oasis_roles.system"', - 'search-query': f'name ~ {client.hostname}', - } - ) - result = target_sat.cli.JobInvocation.info({'id': collection_job['id']}) - assert result['success'] == '1' - collection_path = client.execute('ls /etc/ansible/collections/ansible_collections').stdout - assert 'oasis_roles' in collection_path - - # Extend test with custom collections_path advanced input field - collection_job = target_sat.cli_factory.job_invocation( - { - 'job-template': 'Ansible Collection - Install from Galaxy', - 'inputs': 'ansible_collections_list="oasis_roles.system", collections_path="~/"', - 'search-query': f'name ~ {client.hostname}', - } - ) - result = target_sat.cli.JobInvocation.info({'id': collection_job['id']}) - assert result['success'] == '1' - collection_path = client.execute('ls ~/ansible_collections').stdout - assert 'oasis_roles' in collection_path - - class TestRexUsers: """Tests related to remote execution users""" From 0f122798073a8f4d8b8bb06c99902d1110d567c8 Mon Sep 17 00:00:00 2001 From: dosas Date: Wed, 3 Apr 2024 16:44:04 +0200 Subject: [PATCH 074/150] Docker repos now support on demand policy (#14608) https://github.com/Katello/katello/commit/d2c20af6911adb02ca9005350a9f2c1ad1f8140b --- tests/foreman/api/test_repository.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/api/test_repository.py b/tests/foreman/api/test_repository.py index 728249f097c..5ac276e194d 100644 --- a/tests/foreman/api/test_repository.py +++ b/tests/foreman/api/test_repository.py @@ -489,7 +489,7 @@ def test_negative_update_to_invalid_download_policy(self, repo, target_sat): [ {'content_type': content_type, 'download_policy': 'on_demand'} for content_type in constants.REPO_TYPE - if content_type != 'yum' + if content_type not in ['yum', 'docker'] ] ), indirect=True, From de6fc12f7a796207b0123faf2e5f94d1b042b7f4 Mon Sep 17 00:00:00 2001 From: Griffin Sullivan <48397354+Griffin-Sullivan@users.noreply.github.com> Date: Wed, 3 Apr 2024 11:15:57 -0400 Subject: [PATCH 075/150] Update Platform tests that have hard coded content host versions (#14317) --- pytest_fixtures/core/contenthosts.py | 15 ++++- pytest_plugins/fixture_markers.py | 1 + .../destructive/test_capsule_loadbalancer.py | 66 ++++++++++++------- tests/foreman/maintain/test_upgrade.py | 17 +++-- 4 files changed, 69 insertions(+), 30 deletions(-) diff --git a/pytest_fixtures/core/contenthosts.py b/pytest_fixtures/core/contenthosts.py index 72f39b50796..d2bbb4cce39 100644 --- a/pytest_fixtures/core/contenthosts.py +++ b/pytest_fixtures/core/contenthosts.py @@ -45,6 +45,15 @@ def rhel_contenthost(request): yield host +@pytest.fixture(scope='module') +def module_rhel_contenthost(request): + """A module-level fixture that provides a content host object parametrized""" + # Request should be parametrized through pytest_fixtures.fixture_markers + # unpack params dict + with Broker(**host_conf(request), host_class=ContentHost) as host: + yield host + + @pytest.fixture(params=[{'rhel_version': '7'}]) def rhel7_contenthost(request): """A function-level fixture that provides a rhel7 content host object""" @@ -278,8 +287,10 @@ def sat_upgrade_chost(): def custom_host(request): """A rhel content host that passes custom host config through request.param""" deploy_args = request.param - # if 'deploy_rhel_version' is not set, let's default to RHEL 8 - deploy_args['deploy_rhel_version'] = deploy_args.get('deploy_rhel_version', '8') + # if 'deploy_rhel_version' is not set, let's default to what's in content_host.yaml + deploy_args['deploy_rhel_version'] = deploy_args.get( + 'deploy_rhel_version', settings.content_host.default_rhel_version + ) deploy_args['workflow'] = 'deploy-rhel' with Broker(**deploy_args, host_class=Satellite) as host: yield host diff --git a/pytest_plugins/fixture_markers.py b/pytest_plugins/fixture_markers.py index 69f2c6523ee..909e7a53634 100644 --- a/pytest_plugins/fixture_markers.py +++ b/pytest_plugins/fixture_markers.py @@ -5,6 +5,7 @@ TARGET_FIXTURES = [ 'rhel_contenthost', + 'module_rhel_contenthost', 'content_hosts', 'module_provisioning_rhel_content', 'capsule_provisioning_rhel_content', diff --git a/tests/foreman/destructive/test_capsule_loadbalancer.py b/tests/foreman/destructive/test_capsule_loadbalancer.py index 3949d2bf71a..cf36aac8a9f 100644 --- a/tests/foreman/destructive/test_capsule_loadbalancer.py +++ b/tests/foreman/destructive/test_capsule_loadbalancer.py @@ -14,6 +14,7 @@ import pytest from wrapanapi import VmState +from robottelo import constants from robottelo.config import settings from robottelo.constants import CLIENT_PORT, DataFile from robottelo.utils.installer import InstallerCommand @@ -22,34 +23,50 @@ @pytest.fixture(scope='module') -def content_for_client(module_target_sat, module_org, module_lce, module_cv, module_ak): +def content_for_client(module_target_sat, module_sca_manifest_org, module_lce, module_cv): """Setup content to be used by haproxy and client :return: Activation key, client lifecycle environment(used by setup_capsules()) """ - module_target_sat.cli_factory.setup_org_for_a_custom_repo( - { - 'url': settings.repos.RHEL7_OS, - 'organization-id': module_org.id, - 'content-view-id': module_cv.id, - 'lifecycle-environment-id': module_lce.id, - 'activationkey-id': module_ak.id, - } - ) - return {'client_ak': module_ak, 'client_lce': module_lce} + rhel_ver = settings.content_host.default_rhel_version + baseos = f'rhel{rhel_ver}_bos' + appstream = f'rhel{rhel_ver}_aps' + + rh_repos = [] + for repo in [baseos, appstream]: + synced_repo_id = module_target_sat.api_factory.enable_sync_redhat_repo( + constants.REPOS[repo], module_sca_manifest_org.id + ) + repo = module_target_sat.api.Repository(id=synced_repo_id).read() + rh_repos.append(repo) + + module_cv.repository = rh_repos + module_cv.update(['repository']) + module_cv.publish() + module_cv = module_cv.read() + cvv = module_cv.version[0] + cvv.promote(data={'environment_ids': module_lce.id}) + module_cv = module_cv.read() + ak = module_target_sat.api.ActivationKey( + content_view=module_cv, + environment=module_lce, + organization=module_sca_manifest_org, + ).create() + + return {'client_ak': ak, 'client_lce': module_lce} @pytest.fixture(scope='module') def setup_capsules( module_org, - rhel7_contenthost_module, + module_rhel_contenthost, module_lb_capsule, module_target_sat, content_for_client, ): """Install capsules with loadbalancer options""" - extra_cert_var = {'foreman-proxy-cname': rhel7_contenthost_module.hostname} - extra_installer_var = {'certs-cname': rhel7_contenthost_module.hostname} + extra_cert_var = {'foreman-proxy-cname': module_rhel_contenthost.hostname} + extra_installer_var = {'certs-cname': module_rhel_contenthost.hostname} for capsule in module_lb_capsule: capsule.register_to_cdn() @@ -92,20 +109,20 @@ def setup_capsules( @pytest.fixture(scope='module') def setup_haproxy( module_org, - rhel7_contenthost_module, + module_rhel_contenthost, content_for_client, module_target_sat, setup_capsules, ): """Install and configure haproxy and setup logging""" - haproxy = rhel7_contenthost_module + haproxy = module_rhel_contenthost # Using same AK for haproxy just for packages haproxy_ak = content_for_client['client_ak'] haproxy.execute('firewall-cmd --add-service RH-Satellite-6-capsule') haproxy.execute('firewall-cmd --runtime-to-permanent') haproxy.install_katello_ca(module_target_sat) haproxy.register_contenthost(module_org.label, haproxy_ak.name) - result = haproxy.execute('yum install haproxy policycoreutils-python -y') + result = haproxy.execute('yum install haproxy policycoreutils-python-utils -y') assert result.status == 0 haproxy.execute('rm -f /etc/haproxy/haproxy.cfg') haproxy.session.sftp_write( @@ -171,8 +188,9 @@ def loadbalancer_setup( @pytest.mark.e2e @pytest.mark.tier1 +@pytest.mark.rhel_ver_list([settings.content_host.default_rhel_version]) def test_loadbalancer_install_package( - loadbalancer_setup, setup_capsules, rhel7_contenthost, module_org, module_location, request + loadbalancer_setup, setup_capsules, rhel_contenthost, module_org, module_location, request ): r"""Install packages on a content host regardless of the registered capsule being available @@ -193,7 +211,7 @@ def test_loadbalancer_install_package( """ # Register content host - result = rhel7_contenthost.register( + result = rhel_contenthost.register( org=module_org, loc=module_location, activation_keys=loadbalancer_setup['content_for_client']['client_ak'].name, @@ -203,15 +221,15 @@ def test_loadbalancer_install_package( assert result.status == 0, f'Failed to register host: {result.stderr}' # Try package installation - result = rhel7_contenthost.execute('yum install -y tree') + result = rhel_contenthost.execute('yum install -y tree') assert result.status == 0 hosts = loadbalancer_setup['module_target_sat'].cli.Host.list( {'organization-id': loadbalancer_setup['module_org'].id} ) - assert rhel7_contenthost.hostname in [host['name'] for host in hosts] + assert rhel_contenthost.hostname in [host['name'] for host in hosts] - result = rhel7_contenthost.execute('rpm -qa | grep katello-ca-consumer') + result = rhel_contenthost.execute('rpm -qa | grep katello-ca-consumer') # Find which capsule the host is registered to since it's RoundRobin # The following also asserts the above result @@ -225,14 +243,14 @@ def test_loadbalancer_install_package( ) # Remove the packages from the client - result = rhel7_contenthost.execute('yum remove -y tree') + result = rhel_contenthost.execute('yum remove -y tree') assert result.status == 0 # Power off the capsule that the client is registered to registered_to_capsule.power_control(state=VmState.STOPPED, ensure=True) # Try package installation again - result = rhel7_contenthost.execute('yum install -y tree') + result = rhel_contenthost.execute('yum install -y tree') assert result.status == 0 diff --git a/tests/foreman/maintain/test_upgrade.py b/tests/foreman/maintain/test_upgrade.py index 0f08f23c6b3..a79094f7a6b 100644 --- a/tests/foreman/maintain/test_upgrade.py +++ b/tests/foreman/maintain/test_upgrade.py @@ -98,8 +98,14 @@ def test_positive_repositories_validate(sat_maintain): @pytest.mark.parametrize( 'custom_host', [ - {'deploy_rhel_version': '8', 'deploy_flavor': 'satqe-ssd.disk.xxxl'}, - {'deploy_rhel_version': '8', 'deploy_flavor': 'satqe-ssd.standard.std'}, + { + 'deploy_rhel_version': settings.server.version.rhel_version, + 'deploy_flavor': 'satqe-ssd.disk.xxxl', + }, + { + 'deploy_rhel_version': settings.server.version.rhel_version, + 'deploy_flavor': 'satqe-ssd.standard.std', + }, ], ids=['default', 'medium'], indirect=True, @@ -118,15 +124,18 @@ def test_negative_pre_upgrade_tuning_profile_check(request, custom_host): :expectedresults: Pre-upgrade check fails. """ profile = request.node.callspec.id + rhel_major = custom_host.os_version.major sat_version = ".".join(settings.server.version.release.split('.')[0:2]) - # Register to CDN for RHEL8 repos, download and enable last y stream's ohsnap repos, + # Register to CDN for RHEL repos, download and enable last y stream's ohsnap repos, # and enable the satellite module and install it on the host custom_host.register_to_cdn() last_y_stream = last_y_stream_version( SATELLITE_VERSION if sat_version == 'stream' else sat_version ) custom_host.download_repofile(product='satellite', release=last_y_stream) - custom_host.execute('dnf -y module enable satellite:el8 && dnf -y install satellite') + custom_host.execute( + f'dnf -y module enable satellite:el{rhel_major} && dnf -y install satellite' + ) # Install with development tuning profile to get around installer checks custom_host.execute( 'satellite-installer --scenario satellite --tuning development', From 9fc762a387d329926009229d5e52047371a81bb9 Mon Sep 17 00:00:00 2001 From: David Moore <109112035+damoore044@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:45:43 -0400 Subject: [PATCH 076/150] Errata with swidtags setup and modular update (#14494) Repair setup for package w/ swidtag, install and modular update --- tests/foreman/api/test_errata.py | 163 +++++++++++++++++++++---------- 1 file changed, 114 insertions(+), 49 deletions(-) diff --git a/tests/foreman/api/test_errata.py b/tests/foreman/api/test_errata.py index da257c8d983..81974401a9f 100644 --- a/tests/foreman/api/test_errata.py +++ b/tests/foreman/api/test_errata.py @@ -1353,7 +1353,6 @@ def _set_prerequisites_for_swid_repos(vm): f'curl --insecure --remote-name {settings.repos.swid_tools_repo}', vm ) _run_remote_command_on_content_host('mv *swid*.repo /etc/yum.repos.d', vm) - _run_remote_command_on_content_host(r'subscription-manager repos --enable \*', vm) _run_remote_command_on_content_host('yum install -y swid-tools', vm) _run_remote_command_on_content_host('yum install -y dnf-plugin-swidtags', vm) @@ -1365,37 +1364,47 @@ def _validate_swid_tags_installed(vm, module_name): assert module_name in result +@pytest.fixture +def errata_host_lce(module_sca_manifest_org, target_sat): + """Create and return a new lce in module SCA org.""" + return target_sat.api.LifecycleEnvironment(organization=module_sca_manifest_org).create() + + @pytest.mark.tier3 @pytest.mark.upgrade @pytest.mark.pit_client -@pytest.mark.parametrize( - 'function_repos_collection_with_manifest', - [{'YumRepository': {'url': settings.repos.swid_tag.url, 'distro': 'rhel8'}}], - indirect=True, -) @pytest.mark.no_containers +@pytest.mark.rhel_ver_match('8') def test_errata_installation_with_swidtags( - function_repos_collection_with_manifest, rhel8_contenthost, target_sat + module_sca_manifest_org, + rhel_contenthost, + errata_host_lce, + target_sat, ): """Verify errata installation with swid_tags and swid tags get updated after module stream update. :id: 43a59b9a-eb9b-4174-8b8e-73d923b1e51e + :setup: + + 1. rhel8 contenthost checked out, using org with simple content access. + 2. create satellite repositories having rhel8 baseOS, prereqs, custom content w/ swid tags. + 3. associate repositories to org, lifecycle environment, and cv. Sync all content. + 4. publish & promote to environment, content view version with all content. + 5. create activation key, for registering host to cv. + :steps: - 1. create product and repository having swid tags - 2. create content view and published it with repository - 3. create activation key and register content host - 4. create rhel8, swid repos on content host - 5. install swid-tools, dnf-plugin-swidtags packages on content host - 6. install older module stream and generate errata, swid tag - 7. assert errata count, swid tags are generated - 8. install errata vis updating module stream - 9. assert errata count and swid tag after module update + 1. register host using cv's activation key, assert succeeded. + 2. install swid-tools, dnf-plugin-swidtags packages on content host. + 3. install older module stream and generate errata, swid tag. + 4. assert errata count, swid tags are generated. + 5. install errata via updating module stream. + 6. assert errata count and swid tag changed after module update. - :expectedresults: swid tags should get updated after errata installation via - module stream update + :expectedresults: + swid tags should get updated after errata installation via module stream update :CaseAutomation: Automated @@ -1406,44 +1415,100 @@ def test_errata_installation_with_swidtags( """ module_name = 'kangaroo' version = '20180704111719' - # setup base_rhel8 and sat_tools repos - rhel8_contenthost.create_custom_repos( - **{ - 'baseos': settings.repos.rhel8_os.baseos, - 'appstream': settings.repos.rhel8_os.appstream, - } - ) - function_repos_collection_with_manifest.setup_virtual_machine(rhel8_contenthost) + org = module_sca_manifest_org + lce = errata_host_lce + cv = target_sat.api.ContentView( + organization=org, + environment=[lce], + ).create() - # install older module stream - rhel8_contenthost.add_rex_key(satellite=target_sat) - _set_prerequisites_for_swid_repos(rhel8_contenthost) - _run_remote_command_on_content_host( - f'dnf -y module install {module_name}:0:{version}', rhel8_contenthost + repos = { + 'base_os': settings.repos.rhel8_os.baseos, # base rhel8 + 'sat_tools': settings.repos.rhel8_os.appstream, # swid prereqs + 'swid_tags': settings.repos.swid_tag.url, # module stream pkgs and errata + } + # associate repos with sat, org, lce, cv, and sync + for r in repos: + target_sat.cli_factory.setup_org_for_a_custom_repo( + { + 'url': repos[r], + 'organization-id': org.id, + 'lifecycle-environment-id': lce.id, + 'content-view-id': cv.id, + }, + ) + # promote newest cv version with all repos/content + cv = cv_publish_promote( + sat=target_sat, + org=org, + cv=cv, + lce=lce, + )['content-view'] + # ak in env, tied to content-view + ak = target_sat.api.ActivationKey( + organization=org, + environment=lce, + content_view=cv, + ).create() + # register host with ak, succeeds + result = rhel_contenthost.register( + activation_keys=ak.name, + target=target_sat, + org=org, + loc=None, ) - target_sat.cli.Host.errata_recalculate({'host-id': rhel8_contenthost.nailgun_host.id}) + assert result.status == 0, f'Failed to register the host {target_sat.hostname},\n{result}' + assert ( + rhel_contenthost.subscribed + ), f'Failed to subscribe the host {target_sat.hostname}, to content.' + result = rhel_contenthost.execute(r'subscription-manager repos --enable \*') + assert result.status == 0, f'Failed to enable repositories with subscription-manager,\n{result}' + + # install outdated module stream package + _set_prerequisites_for_swid_repos(rhel_contenthost) + result = rhel_contenthost.execute(f'dnf -y module install {module_name}:0:{version}') + assert ( + result.status == 0 + ), f'Failed to install module stream package: {module_name}:0:{version}.\n{result.stdout}' + # recalculate errata after install of old module stream + rhel_contenthost.execute('subscription-manager repos') + # validate swid tags Installed - before_errata_apply_result = _run_remote_command_on_content_host( - f"swidq -i -n {module_name} | grep 'File' | grep -o 'rpm-.*.swidtag'", - rhel8_contenthost, - return_result=True, + result = rhel_contenthost.execute( + f'swidq -i -n {module_name} | grep "File" | grep -o "rpm-.*.swidtag"', + ) + assert ( + result.status == 0 + ), f'An error occured trying to fetch swid tags for {module_name}.\n{result}' + before_errata_apply_result = result.stdout + assert before_errata_apply_result != '', f'Found no swid tags contained in {module_name}.' + assert (app_errata_count := rhel_contenthost.applicable_errata_count) == 1, ( + f'Found {rhel_contenthost.applicable_errata_count} applicable errata,' + f' after installing {module_name}:0:{version}, expected 1.' ) - assert before_errata_apply_result != '' - assert (applicable_errata_count := rhel8_contenthost.applicable_errata_count) == 1 # apply modular errata - _run_remote_command_on_content_host(f'dnf -y module update {module_name}', rhel8_contenthost) - _run_remote_command_on_content_host('dnf -y upload-profile', rhel8_contenthost) - target_sat.cli.Host.errata_recalculate({'host-id': rhel8_contenthost.nailgun_host.id}) - rhel8_contenthost.execute('subscription-manager repos') - applicable_errata_count -= 1 - assert rhel8_contenthost.applicable_errata_count == applicable_errata_count - after_errata_apply_result = _run_remote_command_on_content_host( - f"swidq -i -n {module_name} | grep 'File'| grep -o 'rpm-.*.swidtag'", - rhel8_contenthost, - return_result=True, + result = rhel_contenthost.execute(f'dnf -y module update {module_name}') + assert ( + result.status == 0 + ), f'Failed to update module stream package: {module_name}.\n{result.stdout}' + assert rhel_contenthost.execute('dnf -y upload-profile').status == 0 + + # recalculate and check errata after modular update + rhel_contenthost.execute('subscription-manager repos') + app_errata_count -= 1 + assert rhel_contenthost.applicable_errata_count == app_errata_count, ( + f'Found {rhel_contenthost.applicable_errata_count} applicable errata, after modular update of {module_name},' + f' expected {app_errata_count}.' + ) + # swidtags were updated based on package version + result = rhel_contenthost.execute( + f'swidq -i -n {module_name} | grep "File" | grep -o "rpm-.*.swidtag"', ) - # swidtags get updated based on package version + assert ( + result.status == 0 + ), f'An error occured trying to fetch swid tags for {module_name}.\n{result}' + after_errata_apply_result = result.stdout assert before_errata_apply_result != after_errata_apply_result From fc64c780a956902ef2665084260039902f1f7272 Mon Sep 17 00:00:00 2001 From: Shweta Singh Date: Thu, 4 Apr 2024 18:30:40 +0530 Subject: [PATCH 077/150] Verify a variable created and added to the host (#14477) --- tests/foreman/ui/test_ansible.py | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/foreman/ui/test_ansible.py b/tests/foreman/ui/test_ansible.py index 89eba62ff56..57fae0a8731 100644 --- a/tests/foreman/ui/test_ansible.py +++ b/tests/foreman/ui/test_ansible.py @@ -275,6 +275,81 @@ def test_positive_host_role_information(target_sat, function_host): assert all_assigned_roles_table[0]["Name"] == SELECTED_ROLE +@pytest.mark.rhel_ver_match('8') +def test_positive_assign_ansible_role_variable_on_host( + target_sat, rhel_contenthost, module_activation_key, module_org, module_location, request +): + """Verify ansible variable is added to the role and attached to the host. + + :id: 7ec4fe19-5a08-4b10-bb4e-7327dd68699a + + :BZ: 2170727 + + :customerscenario: true + + :steps: + + 1. Create an Ansible variable with array type and set the default value. + 2. Enable both 'Merge Overrides' and 'Merge Default'. + 3. Add the variable to a role and attach the role to the host. + 4. Verify that ansible role and variable is added to the host. + + :expectedresults: The role and variable is successfully added to the host. + """ + + @request.addfinalizer + def _finalize(): + result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) + assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] + + key = gen_string('alpha') + SELECTED_ROLE = 'redhat.satellite.activation_keys' + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) + command = target_sat.api.RegistrationCommand( + organization=module_org, + location=module_location, + activation_keys=[module_activation_key.name], + ).create() + result = rhel_contenthost.execute(command) + assert result.status == 0, f'Failed to register host: {result.stderr}' + target_host = rhel_contenthost.nailgun_host + default_value = '[\"test\"]' + parameter_type = 'array' + with target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) + session.location.select(loc_name=module_location.name) + session.ansiblevariables.create_with_overrides( + { + 'key': key, + 'ansible_role': SELECTED_ROLE, + 'override': 'true', + 'parameter_type': parameter_type, + 'default_value': default_value, + 'validator_type': None, + 'attribute_order': 'domain \n fqdn \n hostgroup \n os', + 'merge_default': 'true', + 'merge_overrides': 'true', + 'matcher_section.params': [ + { + 'attribute_type': {'matcher_key': 'os', 'matcher_value': 'fedora'}, + 'value': '[\'13\']', + } + ], + } + ) + result = target_sat.cli.Host.ansible_roles_assign( + {'id': target_host.id, 'ansible-roles': SELECTED_ROLE} + ) + assert 'Ansible roles were assigned' in result[0]['message'] + values = session.host_new.get_details(rhel_contenthost.hostname, 'ansible')['ansible'][ + 'variables' + ]['table'] + assert (key, SELECTED_ROLE, default_value, parameter_type) in [ + (var['Name'], var['Ansible role'], var['Value'], var['Type']) for var in values + ] + + @pytest.mark.stubbed @pytest.mark.tier2 def test_positive_role_variable_information(self): From 1bf74b5bc06aea63cd374428a387bb7beae55049 Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Thu, 4 Apr 2024 22:54:40 +0530 Subject: [PATCH 078/150] cu-case-verify-worker-hosts-queue-1-service-has-proceed (#14621) --- tests/foreman/cli/test_errata.py | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/foreman/cli/test_errata.py b/tests/foreman/cli/test_errata.py index 4af3d9be2d3..0dc3e091654 100644 --- a/tests/foreman/cli/test_errata.py +++ b/tests/foreman/cli/test_errata.py @@ -12,6 +12,7 @@ """ from datetime import date, datetime, timedelta from operator import itemgetter +import re from broker import Broker import pytest @@ -1534,3 +1535,44 @@ def test_errata_list_by_contentview_filter(module_sca_manifest_org, module_targe ) ) assert errata_count != errata_count_cvf + + +@pytest.mark.rhel_ver_match('8') +def test_positive_verify_errata_recalculate_tasks(target_sat, errata_host): + """Verify 'Actions::Katello::Applicability::Hosts::BulkGenerate' tasks proceed on 'worker-hosts-queue-1.service' + + :id: d5f89df2-b8fb-4aec-839d-b548b0aadc0c + + :setup: Register host which has applicable errata with satellite + + :steps: + 1. Run 'hammer host errata recalculate --host-id NUMBER' (will trigger inside errata_host fixture) + 2. Check systemctl or journalctl or /var/log/messages for 'dynflow-sidekiq@worker-hosts-queue-1.service' + + :expectedresults: worker-hosts-queue-1 should proceed with task and this can be cross verify using unique PID + + :customerscenario: true + + :BZ: 2249736 + """ + # Recalculate errata command has triggered inside errata_host fixture + + # get PID of 'worker-hosts-queue-1' from /var/log/messages + message_log = target_sat.execute( + 'grep "dynflow-sidekiq@worker-hosts-queue-1" /var/log/messages | tail -1' + ) + assert message_log.status == 0 + pattern_1 = r'\[(.*?)\]' # pattern to capture PID of 'worker-hosts-queue-1' + match = re.search(pattern_1, message_log.stdout) + pid_log_message = match.group(1) + + # get PID of 'worker-hosts-queue-1' from systemctl command output + systemctl_log = target_sat.execute( + 'systemctl status dynflow-sidekiq@worker-hosts-queue-1.service | grep -i "Main PID:"' + ) + assert systemctl_log.status == 0 + pattern_2 = r'\: (.*?) \(' # pattern to capture PID of 'worker-hosts-queue-1' + match = re.search(pattern_2, systemctl_log.stdout) + pid_systemctl_cmd = match.group(1) + + assert pid_log_message == pid_systemctl_cmd From 5b90cea24ad727c9d112d672996148b9dd27b8cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 23:14:31 -0400 Subject: [PATCH 079/150] Bump lewagon/wait-on-check-action from 1.3.3 to 1.3.4 (#14628) --- .github/workflows/auto_cherry_pick_merge.yaml | 2 +- .github/workflows/dependency_merge.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto_cherry_pick_merge.yaml b/.github/workflows/auto_cherry_pick_merge.yaml index 5ee0c3b7bad..63a579e3ed7 100644 --- a/.github/workflows/auto_cherry_pick_merge.yaml +++ b/.github/workflows/auto_cherry_pick_merge.yaml @@ -40,7 +40,7 @@ jobs: - name: Wait for other status checks to Pass id: waitforstatuschecks - uses: lewagon/wait-on-check-action@v1.3.3 + uses: lewagon/wait-on-check-action@v1.3.4 with: ref: ${{ github.head_ref }} repo-token: ${{ secrets.CHERRYPICK_PAT }} diff --git a/.github/workflows/dependency_merge.yml b/.github/workflows/dependency_merge.yml index 9d277c8a67d..f549c5c6e69 100644 --- a/.github/workflows/dependency_merge.yml +++ b/.github/workflows/dependency_merge.yml @@ -51,7 +51,7 @@ jobs: - name: Wait for other status checks to Pass id: waitforstatuschecks - uses: lewagon/wait-on-check-action@v1.3.3 + uses: lewagon/wait-on-check-action@v1.3.4 with: ref: ${{ github.head_ref }} repo-token: ${{ secrets.CHERRYPICK_PAT }} From 4ad590a12682216e02c5122bfc509448c38df624 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Fri, 5 Apr 2024 13:17:35 +0530 Subject: [PATCH 080/150] Move ansible API tests to Ansible-Cfgmgmt and REX classes (#14626) Signed-off-by: Gaurav Talreja --- tests/foreman/api/test_ansible.py | 753 +++++++++++++++--------------- 1 file changed, 382 insertions(+), 371 deletions(-) diff --git a/tests/foreman/api/test_ansible.py b/tests/foreman/api/test_ansible.py index 04b25f2484b..435501d0696 100644 --- a/tests/foreman/api/test_ansible.py +++ b/tests/foreman/api/test_ansible.py @@ -51,163 +51,313 @@ def filtered_user(target_sat, module_org, module_location): return user, password -@pytest.fixture -def rex_host_in_org_and_loc(target_sat, module_org, module_location, rex_contenthost): - host = target_sat.api.Host().search(query={'search': f'name={rex_contenthost.hostname}'})[0] - target_sat.api.Host(id=host.id, organization=[module_org.id]).update(['organization']) - target_sat.api.Host(id=host.id, location=module_location.id).update(['location']) - return host +@pytest.mark.upgrade +class TestAnsibleCfgMgmt: + """Test class for Configuration Management with Ansible + :CaseComponent: Ansible-ConfigurationManagement -@pytest.mark.e2e -def test_fetch_and_sync_ansible_playbooks(target_sat): """ - Test Ansible Playbooks api for fetching and syncing playbooks - - :id: 17b4e767-1494-4960-bc60-f31a0495c09f - :customerscenario: true + @pytest.mark.e2e + def test_fetch_and_sync_ansible_playbooks(self, target_sat): + """ + Test Ansible Playbooks api for fetching and syncing playbooks - :steps: + :id: 17b4e767-1494-4960-bc60-f31a0495c09f - 1. Install ansible collection with playbooks. - 2. Try to fetch the playbooks via api. - 3. Sync the playbooks. - 4. Assert the count of playbooks fetched and synced are equal. + :steps: + 1. Install ansible collection with playbooks. + 2. Try to fetch the playbooks via api. + 3. Sync the playbooks. + 4. Assert the count of playbooks fetched and synced are equal. - :expectedresults: - 1. Playbooks should be fetched and synced successfully. + :expectedresults: + 1. Playbooks should be fetched and synced successfully. - :BZ: 2115686 - """ - target_sat.execute( - "ansible-galaxy collection install -p /usr/share/ansible/collections " - "xprazak2.forklift_collection" - ) - proxy_id = target_sat.nailgun_smart_proxy.id - playbook_fetch = target_sat.api.AnsiblePlaybooks().fetch(data={'proxy_id': proxy_id}) - playbooks_count = len(playbook_fetch['results']['playbooks_names']) - playbook_sync = target_sat.api.AnsiblePlaybooks().sync(data={'proxy_id': proxy_id}) - assert playbook_sync['action'] == "Sync playbooks" - - target_sat.wait_for_tasks( - search_query=(f'id = {playbook_sync["id"]}'), - poll_timeout=100, - ) - task_details = target_sat.api.ForemanTask().search( - query={'search': f'id = {playbook_sync["id"]}'} - ) - assert task_details[0].result == 'success' - assert len(task_details[0].output['result']['created']) == playbooks_count - - -@pytest.mark.e2e -@pytest.mark.no_containers -@pytest.mark.rhel_ver_match('[^6].*') -def test_positive_ansible_job_on_host( - target_sat, module_org, module_location, module_ak_with_synced_repo, rhel_contenthost -): - """ - Test successful execution of Ansible Job on host. + :BZ: 2115686 - :id: c8dcdc54-cb98-4b24-bff9-049a6cc36acb - - :steps: - 1. Register a content host with satellite - 2. Import a role into satellite - 3. Assign that role to a host - 4. Assert that the role was assigned to the host successfully - 5. Run the Ansible playbook associated with that role - 6. Check if the job is executed. - - :expectedresults: - 1. Host should be assigned the proper role. - 2. Job execution must be successful. - - :BZ: 2164400 - - :CaseComponent: Ansible-RemoteExecution - """ - SELECTED_ROLE = 'RedHatInsights.insights-client' - if rhel_contenthost.os_version.major <= 7: - rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) - assert rhel_contenthost.execute('yum install -y insights-client').status == 0 - result = rhel_contenthost.register( - module_org, module_location, module_ak_with_synced_repo.name, target_sat - ) - assert result.status == 0, f'Failed to register host: {result.stderr}' - proxy_id = target_sat.nailgun_smart_proxy.id - target_host = rhel_contenthost.nailgun_host - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) - role_id = target_sat.api.AnsibleRoles().search(query={'search': f'name={SELECTED_ROLE}'})[0].id - target_sat.api.Host(id=target_host.id).add_ansible_role(data={'ansible_role_id': role_id}) - host_roles = target_host.list_ansible_roles() - assert host_roles[0]['name'] == SELECTED_ROLE - assert target_host.name == rhel_contenthost.hostname - - template_id = ( - target_sat.api.JobTemplate() - .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] - .id - ) - job = target_sat.api.JobInvocation().run( - synchronous=False, - data={ - 'job_template_id': template_id, - 'targeting_type': 'static_query', - 'search_query': f'name = {rhel_contenthost.hostname}', - }, - ) - target_sat.wait_for_tasks( - f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 - ) - result = target_sat.api.JobInvocation(id=job['id']).read() - assert result.succeeded == 1 - target_sat.api.Host(id=target_host.id).remove_ansible_role(data={'ansible_role_id': role_id}) - host_roles = target_host.list_ansible_roles() - assert len(host_roles) == 0 + :customerscenario: true + """ + target_sat.execute( + "ansible-galaxy collection install -p /usr/share/ansible/collections " + "xprazak2.forklift_collection" + ) + proxy_id = target_sat.nailgun_smart_proxy.id + playbook_fetch = target_sat.api.AnsiblePlaybooks().fetch(data={'proxy_id': proxy_id}) + playbooks_count = len(playbook_fetch['results']['playbooks_names']) + playbook_sync = target_sat.api.AnsiblePlaybooks().sync(data={'proxy_id': proxy_id}) + assert playbook_sync['action'] == "Sync playbooks" + + target_sat.wait_for_tasks( + search_query=(f'id = {playbook_sync["id"]}'), + poll_timeout=100, + ) + task_details = target_sat.api.ForemanTask().search( + query={'search': f'id = {playbook_sync["id"]}'} + ) + assert task_details[0].result == 'success' + assert len(task_details[0].output['result']['created']) == playbooks_count + + @pytest.mark.e2e + @pytest.mark.tier2 + def test_add_and_remove_ansible_role_hostgroup(self, target_sat): + """ + Test add and remove functionality for ansible roles in hostgroup via API + + :id: 7672cf86-fa31-11ed-855a-0fd307d2d66b + + :steps: + 1. Create a hostgroup and a nested hostgroup + 2. Sync a few ansible roles + 3. Assign a few ansible roles with the host group + 4. Add some ansible role with the host group + 5. Add some ansible roles to the nested hostgroup + 6. Remove the added ansible roles from the parent and nested hostgroup + + :expectedresults: + 1. Ansible role assign/add/remove functionality should work as expected in API + + :BZ: 2164400 + """ + ROLE_NAMES = [ + 'theforeman.foreman_scap_client', + 'redhat.satellite.hostgroups', + 'RedHatInsights.insights-client', + 'redhat.satellite.compute_resources', + ] + hg = target_sat.api.HostGroup(name=gen_string('alpha')).create() + hg_nested = target_sat.api.HostGroup(name=gen_string('alpha'), parent=hg).create() + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': ROLE_NAMES}) + ROLES = [ + target_sat.api.AnsibleRoles().search(query={'search': f'name={role}'})[0].id + for role in ROLE_NAMES + ] + # Assign first 2 roles to HG and verify it + target_sat.api.HostGroup(id=hg.id).assign_ansible_roles( + data={'ansible_role_ids': ROLES[:2]} + ) + for r1, r2 in zip( + target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:2], strict=True + ): + assert r1['name'] == r2 + + # Add next role from list to HG and verify it + target_sat.api.HostGroup(id=hg.id).add_ansible_role(data={'ansible_role_id': ROLES[2]}) + for r1, r2 in zip( + target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:3], strict=True + ): + assert r1['name'] == r2 + + # Add next role to nested HG, and verify roles are also nested to HG along with assigned role + # Also, ensure the parent HG does not contain the roles assigned to nested HGs + target_sat.api.HostGroup(id=hg_nested.id).add_ansible_role( + data={'ansible_role_id': ROLES[3]} + ) + for r1, r2 in zip( + target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles(), + [ROLE_NAMES[-1]] + ROLE_NAMES[:-1], + strict=True, + ): + assert r1['name'] == r2 + + for r1, r2 in zip( + target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:3], strict=True + ): + assert r1['name'] == r2 + + # Remove roles assigned one by one from HG and nested HG + for role in ROLES[:3]: + target_sat.api.HostGroup(id=hg.id).remove_ansible_role(data={'ansible_role_id': role}) + hg_roles = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() + assert len(hg_roles) == 0 + + for role in ROLES: + target_sat.api.HostGroup(id=hg_nested.id).remove_ansible_role( + data={'ansible_role_id': role} + ) + hg_nested_roles = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() + assert len(hg_nested_roles) == 0 + + @pytest.mark.e2e + @pytest.mark.tier2 + def test_positive_ansible_roles_inherited_from_hostgroup( + self, request, target_sat, module_org, module_location + ): + """Verify ansible roles inheritance functionality for host with parent/nested hostgroup via API + :id: 7672cf86-fa31-11ed-855a-0fd307d2d66g -@pytest.mark.no_containers -def test_positive_ansible_job_on_multiple_host( - target_sat, - module_org, - rhel9_contenthost, - rhel8_contenthost, - rhel7_contenthost, - module_location, - module_ak_with_synced_repo, -): - """Test execution of Ansible job on multiple hosts simultaneously. + :steps: + 1. Create a host, hostgroup and nested hostgroup + 2. Sync a few ansible roles + 3. Assign a few ansible roles to the host, hostgroup, nested hostgroup and verify it. + 4. Update host to be in parent/nested hostgroup and verify roles assigned - :id: 9369feef-466c-40d3-9d0d-65520d7f21ef + :expectedresults: + 1. Hosts in parent/nested hostgroups must have direct and indirect roles correctly assigned. - :customerscenario: true + :BZ: 2187967 - :steps: - 1. Register multiple content hosts with satellite - 2. Import a role into satellite - 3. Assign that role to all host - 4. Trigger ansible job keeping all host in a single query - 5. Check the passing and failing of individual hosts - 6. Check if one of the job on a host is failed resulting into whole job is marked as failed. + :customerscenario: true + """ + ROLE_NAMES = [ + 'theforeman.foreman_scap_client', + 'RedHatInsights.insights-client', + 'redhat.satellite.compute_resources', + ] + proxy_id = target_sat.nailgun_smart_proxy.id + host = target_sat.api.Host(organization=module_org, location=module_location).create() + hg = target_sat.api.HostGroup(name=gen_string('alpha'), organization=[module_org]).create() + hg_nested = target_sat.api.HostGroup( + name=gen_string('alpha'), parent=hg, organization=[module_org] + ).create() + + @request.addfinalizer + def _finalize(): + host.delete() + hg_nested.delete() + hg.delete() + + target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': ROLE_NAMES}) + ROLES = [ + target_sat.api.AnsibleRoles().search(query={'search': f'name={role}'})[0].id + for role in ROLE_NAMES + ] + + # Assign roles to Host/Hostgroup/Nested Hostgroup and verify it + target_sat.api.Host(id=host.id).add_ansible_role(data={'ansible_role_id': ROLES[0]}) + assert ROLE_NAMES[0] == target_sat.api.Host(id=host.id).list_ansible_roles()[0]['name'] + + target_sat.api.HostGroup(id=hg.id).add_ansible_role(data={'ansible_role_id': ROLES[1]}) + assert ROLE_NAMES[1] == target_sat.api.HostGroup(id=hg.id).list_ansible_roles()[0]['name'] + + target_sat.api.HostGroup(id=hg_nested.id).add_ansible_role( + data={'ansible_role_id': ROLES[2]} + ) + listroles = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() + assert ROLE_NAMES[2] == listroles[0]['name'] + assert listroles[0]['directly_assigned'] + assert ROLE_NAMES[1] == listroles[1]['name'] + assert not listroles[1]['directly_assigned'] + + # Update host to be in nested hostgroup and verify roles assigned + host.hostgroup = hg_nested + host = host.update(['hostgroup']) + listroles_host = target_sat.api.Host(id=host.id).list_ansible_roles() + assert ROLE_NAMES[0] == listroles_host[0]['name'] + assert listroles_host[0]['directly_assigned'] + assert ROLE_NAMES[1] == listroles_host[1]['name'] + assert not listroles_host[1]['directly_assigned'] + assert ROLE_NAMES[2] == listroles_host[2]['name'] + assert not listroles_host[1]['directly_assigned'] + # Verify nested hostgroup doesn't contains the roles assigned to host + listroles_nested_hg = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() + assert ROLE_NAMES[0] not in [role['name'] for role in listroles_nested_hg] + assert ROLE_NAMES[2] == listroles_nested_hg[0]['name'] + assert ROLE_NAMES[1] == listroles_nested_hg[1]['name'] + + # Update host to be in parent hostgroup and verify roles assigned + host.hostgroup = hg + host = host.update(['hostgroup']) + listroles = target_sat.api.Host(id=host.id).list_ansible_roles() + assert ROLE_NAMES[0] == listroles[0]['name'] + assert listroles[0]['directly_assigned'] + assert ROLE_NAMES[1] == listroles[1]['name'] + assert not listroles[1]['directly_assigned'] + # Verify parent hostgroup doesn't contains the roles assigned to host + listroles_hg = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() + assert ROLE_NAMES[0] not in [role['name'] for role in listroles_hg] + assert ROLE_NAMES[1] == listroles_hg[0]['name'] + + @pytest.mark.rhel_ver_match('[78]') + @pytest.mark.tier2 + def test_positive_read_facts_with_filter( + self, target_sat, rex_contenthost, filtered_user, module_org, module_location + ): + """Read host's Ansible facts as a user with a role that has host filter + + :id: 483d5faf-7a4c-4cb7-b14f-369768ad99b0 + + :steps: + 1. Run Ansible roles on a host + 2. Using API, read Ansible facts of that host + + :expectedresults: Ansible facts returned + + :BZ: 1699188 + + :customerscenario: true + """ + user, password = filtered_user + host = rex_contenthost.nailgun_host + host.organization = module_org + host.location = module_location + host.update(['organization', 'location']) + + # gather ansible facts by running ansible roles on the host + host.play_ansible_roles() + if is_open('BZ:2216471'): + wait_for( + lambda: len(rex_contenthost.nailgun_host.get_facts()) > 0, + timeout=30, + delay=2, + ) + user_cfg = user_nailgun_config(user.login, password) + # get facts through API + user_facts = ( + target_sat.api.Host(server_config=user_cfg) + .search(query={'search': f'name={rex_contenthost.hostname}'})[0] + .get_facts() + ) + assert 'subtotal' in user_facts + assert user_facts['subtotal'] == 1 + assert 'results' in user_facts + assert rex_contenthost.hostname in user_facts['results'] + assert len(user_facts['results'][rex_contenthost.hostname]) > 0 - :expectedresults: - 1. One of the jobs failing on a single host must impact the overall result as failed. - :BZ: 2167396, 2190464, 2184117 +class TestAnsibleREX: + """Test class for remote execution via Ansible :CaseComponent: Ansible-RemoteExecution """ - hosts = [rhel9_contenthost, rhel8_contenthost, rhel7_contenthost] - SELECTED_ROLE = 'RedHatInsights.insights-client' - for host in hosts: - result = host.register( + + @pytest.mark.e2e + @pytest.mark.no_containers + @pytest.mark.rhel_ver_match('[^6].*') + def test_positive_ansible_job_on_host( + self, target_sat, module_org, module_location, module_ak_with_synced_repo, rhel_contenthost + ): + """Test successful execution of Ansible Job on host. + + :id: c8dcdc54-cb98-4b24-bff9-049a6cc36acb + + :steps: + 1. Register a content host with satellite + 2. Import a role into satellite + 3. Assign that role to a host + 4. Assert that the role was assigned to the host successfully + 5. Run the Ansible playbook associated with that role + 6. Check if the job is executed. + + :expectedresults: + 1. Host should be assigned the proper role. + 2. Job execution must be successful. + + :BZ: 2164400 + """ + SELECTED_ROLE = 'RedHatInsights.insights-client' + if rhel_contenthost.os_version.major <= 7: + rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) + assert rhel_contenthost.execute('yum install -y insights-client').status == 0 + result = rhel_contenthost.register( module_org, module_location, module_ak_with_synced_repo.name, target_sat ) assert result.status == 0, f'Failed to register host: {result.stderr}' proxy_id = target_sat.nailgun_smart_proxy.id - target_host = host.nailgun_host + target_host = rhel_contenthost.nailgun_host target_sat.api.AnsibleRoles().sync( data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} ) @@ -217,244 +367,105 @@ def test_positive_ansible_job_on_multiple_host( target_sat.api.Host(id=target_host.id).add_ansible_role(data={'ansible_role_id': role_id}) host_roles = target_host.list_ansible_roles() assert host_roles[0]['name'] == SELECTED_ROLE + assert target_host.name == rhel_contenthost.hostname - template_id = ( - target_sat.api.JobTemplate() - .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] - .id - ) - job = target_sat.api.JobInvocation().run( - synchronous=False, - data={ - 'job_template_id': template_id, - 'targeting_type': 'static_query', - 'search_query': f'name ^ ({hosts[0].hostname} && {hosts[1].hostname} ' - f'&& {hosts[2].hostname})', - }, - ) - target_sat.wait_for_tasks( - f'resource_type = JobInvocation and resource_id = {job["id"]}', - poll_timeout=1000, - must_succeed=False, - ) - result = target_sat.api.JobInvocation(id=job['id']).read() - assert result.succeeded == 2 # SELECTED_ROLE working on rhel8/rhel9 clients - assert result.failed == 1 # SELECTED_ROLE failing on rhel7 client - assert result.status_label == 'failed' - - -@pytest.mark.e2e -@pytest.mark.tier2 -@pytest.mark.upgrade -def test_add_and_remove_ansible_role_hostgroup(target_sat): - """ - Test add and remove functionality for ansible roles in hostgroup via API - - :id: 7672cf86-fa31-11ed-855a-0fd307d2d66b - - :steps: - 1. Create a hostgroup and a nested hostgroup - 2. Sync a few ansible roles - 3. Assign a few ansible roles with the host group - 4. Add some ansible role with the host group - 5. Add some ansible roles to the nested hostgroup - 6. Remove the added ansible roles from the parent and nested hostgroup - - :expectedresults: - 1. Ansible role assign/add/remove functionality should work as expected in API - - :BZ: 2164400 - """ - ROLE_NAMES = [ - 'theforeman.foreman_scap_client', - 'redhat.satellite.hostgroups', - 'RedHatInsights.insights-client', - 'redhat.satellite.compute_resources', - ] - hg = target_sat.api.HostGroup(name=gen_string('alpha')).create() - hg_nested = target_sat.api.HostGroup(name=gen_string('alpha'), parent=hg).create() - proxy_id = target_sat.nailgun_smart_proxy.id - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': ROLE_NAMES}) - ROLES = [ - target_sat.api.AnsibleRoles().search(query={'search': f'name={role}'})[0].id - for role in ROLE_NAMES - ] - # Assign first 2 roles to HG and verify it - target_sat.api.HostGroup(id=hg.id).assign_ansible_roles(data={'ansible_role_ids': ROLES[:2]}) - for r1, r2 in zip( - target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:2], strict=True - ): - assert r1['name'] == r2 - - # Add next role from list to HG and verify it - target_sat.api.HostGroup(id=hg.id).add_ansible_role(data={'ansible_role_id': ROLES[2]}) - for r1, r2 in zip( - target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:3], strict=True - ): - assert r1['name'] == r2 - - # Add next role to nested HG, and verify roles are also nested to HG along with assigned role - # Also, ensure the parent HG does not contain the roles assigned to nested HGs - target_sat.api.HostGroup(id=hg_nested.id).add_ansible_role(data={'ansible_role_id': ROLES[3]}) - for r1, r2 in zip( - target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles(), - [ROLE_NAMES[-1]] + ROLE_NAMES[:-1], - strict=True, - ): - assert r1['name'] == r2 - - for r1, r2 in zip( - target_sat.api.HostGroup(id=hg.id).list_ansible_roles(), ROLE_NAMES[:3], strict=True + template_id = ( + target_sat.api.JobTemplate() + .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] + .id + ) + job = target_sat.api.JobInvocation().run( + synchronous=False, + data={ + 'job_template_id': template_id, + 'targeting_type': 'static_query', + 'search_query': f'name = {rhel_contenthost.hostname}', + }, + ) + target_sat.wait_for_tasks( + f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 + ) + result = target_sat.api.JobInvocation(id=job['id']).read() + assert result.succeeded == 1 + target_sat.api.Host(id=target_host.id).remove_ansible_role( + data={'ansible_role_id': role_id} + ) + host_roles = target_host.list_ansible_roles() + assert len(host_roles) == 0 + + @pytest.mark.no_containers + def test_positive_ansible_job_on_multiple_host( + self, + target_sat, + module_org, + rhel9_contenthost, + rhel8_contenthost, + rhel7_contenthost, + module_location, + module_ak_with_synced_repo, ): - assert r1['name'] == r2 - - # Remove roles assigned one by one from HG and nested HG - for role in ROLES[:3]: - target_sat.api.HostGroup(id=hg.id).remove_ansible_role(data={'ansible_role_id': role}) - hg_roles = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() - assert len(hg_roles) == 0 - - for role in ROLES: - target_sat.api.HostGroup(id=hg_nested.id).remove_ansible_role( - data={'ansible_role_id': role} + """Test execution of Ansible job on multiple hosts simultaneously. + + :id: 9369feef-466c-40d3-9d0d-65520d7f21ef + + :customerscenario: true + + :steps: + 1. Register multiple content hosts with satellite + 2. Import a role into satellite + 3. Assign that role to all host + 4. Trigger ansible job keeping all host in a single query + 5. Check the passing and failing of individual hosts + 6. Check if one of the job on a host is failed resulting into whole job is marked as failed. + + :expectedresults: + 1. One of the jobs failing on a single host must impact the overall result as failed. + + :BZ: 2167396, 2190464, 2184117 + """ + hosts = [rhel9_contenthost, rhel8_contenthost, rhel7_contenthost] + SELECTED_ROLE = 'RedHatInsights.insights-client' + for host in hosts: + result = host.register( + module_org, module_location, module_ak_with_synced_repo.name, target_sat + ) + assert result.status == 0, f'Failed to register host: {result.stderr}' + proxy_id = target_sat.nailgun_smart_proxy.id + target_host = host.nailgun_host + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} + ) + role_id = ( + target_sat.api.AnsibleRoles() + .search(query={'search': f'name={SELECTED_ROLE}'})[0] + .id + ) + target_sat.api.Host(id=target_host.id).add_ansible_role( + data={'ansible_role_id': role_id} + ) + host_roles = target_host.list_ansible_roles() + assert host_roles[0]['name'] == SELECTED_ROLE + + template_id = ( + target_sat.api.JobTemplate() + .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] + .id ) - hg_nested_roles = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() - assert len(hg_nested_roles) == 0 - - -@pytest.mark.e2e -@pytest.mark.tier2 -@pytest.mark.upgrade -def test_positive_ansible_roles_inherited_from_hostgroup( - request, target_sat, module_org, module_location -): - """Verify ansible roles inheritance functionality for host with parent/nested hostgroup via API - - :id: 7672cf86-fa31-11ed-855a-0fd307d2d66g - - :steps: - 1. Create a host, hostgroup and nested hostgroup - 2. Sync a few ansible roles - 3. Assign a few ansible roles to the host, hostgroup, nested hostgroup and verify it. - 4. Update host to be in parent/nested hostgroup and verify roles assigned - - :expectedresults: - 1. Hosts in parent/nested hostgroups must have direct and indirect roles correctly assigned. - - :BZ: 2187967 - - :customerscenario: true - """ - ROLE_NAMES = [ - 'theforeman.foreman_scap_client', - 'RedHatInsights.insights-client', - 'redhat.satellite.compute_resources', - ] - proxy_id = target_sat.nailgun_smart_proxy.id - host = target_sat.api.Host(organization=module_org, location=module_location).create() - hg = target_sat.api.HostGroup(name=gen_string('alpha'), organization=[module_org]).create() - hg_nested = target_sat.api.HostGroup( - name=gen_string('alpha'), parent=hg, organization=[module_org] - ).create() - - @request.addfinalizer - def _finalize(): - host.delete() - hg_nested.delete() - hg.delete() - - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': ROLE_NAMES}) - ROLES = [ - target_sat.api.AnsibleRoles().search(query={'search': f'name={role}'})[0].id - for role in ROLE_NAMES - ] - - # Assign roles to Host/Hostgroup/Nested Hostgroup and verify it - target_sat.api.Host(id=host.id).add_ansible_role(data={'ansible_role_id': ROLES[0]}) - assert ROLE_NAMES[0] == target_sat.api.Host(id=host.id).list_ansible_roles()[0]['name'] - - target_sat.api.HostGroup(id=hg.id).add_ansible_role(data={'ansible_role_id': ROLES[1]}) - assert ROLE_NAMES[1] == target_sat.api.HostGroup(id=hg.id).list_ansible_roles()[0]['name'] - - target_sat.api.HostGroup(id=hg_nested.id).add_ansible_role(data={'ansible_role_id': ROLES[2]}) - listroles = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() - assert ROLE_NAMES[2] == listroles[0]['name'] - assert listroles[0]['directly_assigned'] - assert ROLE_NAMES[1] == listroles[1]['name'] - assert not listroles[1]['directly_assigned'] - - # Update host to be in nested hostgroup and verify roles assigned - host.hostgroup = hg_nested - host = host.update(['hostgroup']) - listroles_host = target_sat.api.Host(id=host.id).list_ansible_roles() - assert ROLE_NAMES[0] == listroles_host[0]['name'] - assert listroles_host[0]['directly_assigned'] - assert ROLE_NAMES[1] == listroles_host[1]['name'] - assert not listroles_host[1]['directly_assigned'] - assert ROLE_NAMES[2] == listroles_host[2]['name'] - assert not listroles_host[1]['directly_assigned'] - # Verify nested hostgroup doesn't contains the roles assigned to host - listroles_nested_hg = target_sat.api.HostGroup(id=hg_nested.id).list_ansible_roles() - assert ROLE_NAMES[0] not in [role['name'] for role in listroles_nested_hg] - assert ROLE_NAMES[2] == listroles_nested_hg[0]['name'] - assert ROLE_NAMES[1] == listroles_nested_hg[1]['name'] - - # Update host to be in parent hostgroup and verify roles assigned - host.hostgroup = hg - host = host.update(['hostgroup']) - listroles = target_sat.api.Host(id=host.id).list_ansible_roles() - assert ROLE_NAMES[0] == listroles[0]['name'] - assert listroles[0]['directly_assigned'] - assert ROLE_NAMES[1] == listroles[1]['name'] - assert not listroles[1]['directly_assigned'] - # Verify parent hostgroup doesn't contains the roles assigned to host - listroles_hg = target_sat.api.HostGroup(id=hg.id).list_ansible_roles() - assert ROLE_NAMES[0] not in [role['name'] for role in listroles_hg] - assert ROLE_NAMES[1] == listroles_hg[0]['name'] - - -@pytest.mark.rhel_ver_match('[78]') -@pytest.mark.tier2 -def test_positive_read_facts_with_filter( - target_sat, rex_contenthost, filtered_user, rex_host_in_org_and_loc -): - """ - Read host's Ansible facts as a user with a role that has host filter - - :id: 483d5faf-7a4c-4cb7-b14f-369768ad99b0 - - 1. Run Ansible roles on a host - 2. Using API, read Ansible facts of that host - - :expectedresults: Ansible facts returned - - :BZ: 1699188 - - :customerscenario: true - """ - user, password = filtered_user - host = rex_host_in_org_and_loc - - # gather ansible facts by running ansible roles on the host - host.play_ansible_roles() - if is_open('BZ:2216471'): - host_wait = target_sat.api.Host().search( - query={'search': f'name={rex_contenthost.hostname}'} - )[0] - wait_for( - lambda: len(host_wait.get_facts()) > 0, - timeout=30, - delay=2, + job = target_sat.api.JobInvocation().run( + synchronous=False, + data={ + 'job_template_id': template_id, + 'targeting_type': 'static_query', + 'search_query': f'name ^ ({hosts[0].hostname} && {hosts[1].hostname} ' + f'&& {hosts[2].hostname})', + }, ) - - user_cfg = user_nailgun_config(user.login, password) - host = target_sat.api.Host(server_config=user_cfg).search( - query={'search': f'name={rex_contenthost.hostname}'} - )[0] - # get facts through API - facts = host.get_facts() - assert 'subtotal' in facts - assert facts['subtotal'] == 1 - assert 'results' in facts - assert rex_contenthost.hostname in facts['results'] - assert len(facts['results'][rex_contenthost.hostname]) > 0 + target_sat.wait_for_tasks( + f'resource_type = JobInvocation and resource_id = {job["id"]}', + poll_timeout=1000, + must_succeed=False, + ) + result = target_sat.api.JobInvocation(id=job['id']).read() + assert result.succeeded == 2 # SELECTED_ROLE working on rhel8/rhel9 clients + assert result.failed == 1 # SELECTED_ROLE failing on rhel7 client + assert result.status_label == 'failed' From 844c249b943cbc62b8a7543bd5791b56258bfb13 Mon Sep 17 00:00:00 2001 From: Omkar Khatavkar Date: Fri, 5 Apr 2024 14:36:10 +0530 Subject: [PATCH 081/150] addition of auto-branching process as part of github action (#14385) --- .github/workflows/auto_branching.yml | 317 +++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 .github/workflows/auto_branching.yml diff --git a/.github/workflows/auto_branching.yml b/.github/workflows/auto_branching.yml new file mode 100644 index 00000000000..432e7aa22cd --- /dev/null +++ b/.github/workflows/auto_branching.yml @@ -0,0 +1,317 @@ +### The auto-branching workflow triggered through a dispatch request from the CI +name: auto-branching + +# Run on workflow dispatch from CI +on: + workflow_dispatch: + inputs: + target_branch: + type: string + description: branch to be created from the master + stream_version: + type: string + description: new stream version of satellite + +jobs: + check-group-membership: + runs-on: ubuntu-latest + outputs: + member: ${{steps.check_membership.outputs.member}} + + steps: + - name: Check if the user is a member of repository-admins group + id: check_membership + run: | + # Use GitHub API to check if the user triggering the workflow is a member of satellite-admin group + MEMBER=$(curl -s -H "Authorization: token ${{ secrets._REPO_ADMIN_TOKEN }}" \ + "https://api.github.com/orgs/satelliteQE/teams/repository-admins/memberships/${{ github.actor }}") + if [[ $(echo "$MEMBER" | jq -r '.state') == "active" ]]; then + echo "User is a member of satellite-admin group." + echo "member=true" >> $GITHUB_OUTPUT + else + echo "User is not a member of satellite-admin group." + echo "member=false" >> $GITHUB_OUTPUT + exit 1 + fi + + auto-branching-new-downstream-release: + name: ${{ github.event.inputs.target_branch }} - raise PR with changes + runs-on: ubuntu-latest + needs: check-group-membership + if: ${{ needs.check-group-membership.outputs.member == 'true' }} + + steps: + - uses: actions/checkout@v4 + + - name: Create the ${{ github.event.inputs.target_branch }} branch + id: create-branch + uses: peterjgrainger/action-create-branch@v2.2.0 + env: + GITHUB_TOKEN: ${{ secrets._REPO_ADMIN_TOKEN }} + with: + branch: ${{ github.event.inputs.target_branch }} + + - name: Create label for the ${{ github.event.inputs.target_branch }} branch + id: create-label + run: | + curl -X POST \ + -H "Authorization: token ${{ secrets._REPO_ADMIN_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/${{ github.repository }}/labels \ + -d "{\"name\":\"${{ github.event.inputs.target_branch }}\",\"color\":\"fbca04\"}" + + - name: Switch to ${{ github.event.inputs.target_branch }} branch + run: git checkout -b "${{ github.event.inputs.target_branch }}" + + - name: Checkout from ${{ github.event.inputs.target_branch }} branch for auto-branching changes + id: checkout-to-auto-branch + run: | + branch_name="auto-branching-${{ github.event.inputs.target_branch }}-$(date '+%s')" + git checkout -b "$branch_name" + echo "branch_name=$branch_name" >> $GITHUB_OUTPUT + + - name: Update target branch label in dependabot yml file + id: update-dependabot + run: | + # Read the dependabot.yml file + FILE_PATH="./.github/dependabot.yml" + TARGET_BRANCH="${{ github.event.inputs.target_branch }}" + # Append the target branch label to the labels node + awk -v target="'$TARGET_BRANCH'" '/^ *labels:/ {$0 = $0 "\n - " target} 1' "$FILE_PATH" > temp.yml && mv temp.yml "$FILE_PATH" + + - name: Update repository URLs in requirements.txt + id: update-repo-urls + run: | + # Define the file path + FILE_PATH="./requirements.txt" + # Define the replacement strings + replacements=( + "airgun @ git+https://github.com/SatelliteQE/airgun.git@master#egg=airgun|airgun @ git+https://github.com/SatelliteQE/airgun.git@${{ github.event.inputs.target_branch }}#egg=airgun" + "nailgun @ git+https://github.com/SatelliteQE/nailgun.git@master#egg=nailgun|nailgun @ git+https://github.com/SatelliteQE/nailgun.git@${{ github.event.inputs.target_branch }}#egg=nailgun" + ) + # Create a temporary file + TEMP_FILE=$(mktemp) + # Perform replacements using a for loop + for replacement in "${replacements[@]}"; do + old_url=$(echo "$replacement" | cut -d'|' -f1) + new_url=$(echo "$replacement" | cut -d'|' -f2) + sed "s|${old_url}|${new_url}|g" "$FILE_PATH" > "$TEMP_FILE" && mv "$TEMP_FILE" "$FILE_PATH" + done + + - name: Remove the dispatch release GHA + id: remove-dispatch-release-gha + run: | + rm -rf ./.github/workflows/dispatch_release.yml + rm -rf ./.github/workflows/auto_branching.yml + + - name: Remove lines with @pytest.mark.stream + id: remove-mark-stream + run: | + # Loop through files in the folder + grep -rl "tests/foreman" -e '@pytest\.mark\.stream' | while IFS= read -r file; do + awk '!/@pytest\.mark\.stream/' "$file" > temp && mv temp "$file" + done + + - name: Update version in setup.py + run: sed -i "s/version=['\"][0-9.]*['\"]\+/version='${{ github.event.inputs.target_branch }}'/" setup.py + + - name: Update the Constants in __init__.py file + run: | + old_url="https://raw.githubusercontent.com/SatelliteQE/robottelo/master/tests/foreman/data/uri.sh" + new_url="https://raw.githubusercontent.com/SatelliteQE/robottelo/${{ github.event.inputs.target_branch }}/tests/foreman/data/uri.sh" + FILE_PATH="./robottelo/constants/__init__.py" + awk '/SAT_NON_GA_VERSIONS =/ { sub(/\[[^,]*, /, "[", $0) } 1' "$FILE_PATH" > temp && mv temp "$FILE_PATH" + sed -i.bak "s|${old_url}|${new_url}|" "$FILE_PATH" + rm "$FILE_PATH.bak" + + - name: git status + run: git status + + - name: git diff + run: git diff + + - name: Commit changes + run: | + git config --local user.email Satellite-QE.satqe.com && git config --local user.name Satellite-QE + git add setup.py ./tests/foreman ./robottelo/* ./requirements.txt ./.github/* + git commit -m "Changes for ${{ github.event.inputs.target_branch }} new branch" + git push origin ${{steps.checkout-to-auto-branch.outputs.branch_name}} + + - name: Create pull request + id: create_pr + run: | + title="[${{ github.event.inputs.target_branch }}]: Changes for ${{ github.event.inputs.target_branch }} new branch" + body=" + ### Problem Statement + New ${{ github.event.inputs.target_branch }} branch + ### Solution + - Dependabot labels are updated for new branch + - Removed dispatch release GHA from ${{ github.event.inputs.target_branch }} as we are releasing only master changes + - Airgun and Nailgun Requirements uses ${{ github.event.inputs.target_branch }} branch + - Constants are using new version now + - Stream tests removed + - Setup.py uses new version + " + pr_number=$(gh pr create --title "$title" --body "$body" --base "${{ github.event.inputs.target_branch }}" | awk -F'/' '{print $NF}') + echo "$pr_number" + echo "pr_number=$pr_number" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets._REPO_ADMIN_TOKEN }} + + - name: Add the prt comment for running the sanity tests + id: add-parent-prt-comment + uses: thollander/actions-comment-pull-request@v2 + with: + message: | + trigger: test-robottelo + pr_number: ${{ steps.create_pr.outputs.pr_number }} + GITHUB_TOKEN: ${{ secrets._REPO_ADMIN_TOKEN }} + + - name: add the no-cherrypick label + uses: actions/github-script@v7 + with: + github-token: ${{ secrets._REPO_ADMIN_TOKEN }} + script: | + github.rest.issues.addLabels({ + issue_number: ${{ steps.create_pr.outputs.pr_number }}, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ["No-CherryPick"] + }) + + branch-protection: + runs-on: ubuntu-latest + needs: auto-branching-new-downstream-release + if: success() + steps: + - name: Create branch protection + run: | + TOKEN=${{ secrets._REPO_ADMIN_TOKEN }} + OWNER=${{ github.repository_owner }} + REPO=${{ github.event.repository.name }} + BRANCH="${{ github.event.inputs.target_branch }}" # Adjust branch name as needed + # Branch protection payload + PROTECTION_PAYLOAD='{ + "required_status_checks": { + "strict": true, + "contexts": ["Code Quality (3.10)", "Code Quality (3.11)", "Code Quality (3.12)", "Enforcing cherrypick labels"] + }, + "required_linear_history": true, + "enforce_admins": null, + "required_pull_request_reviews": null, + "restrictions": null, + "allow_force_pushes": null, + "allow_deletions": null + }' + # Call GitHub API to update branch protection + PROTECTION_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" \ + -X PUT \ + -H "Accept: application/vnd.github.luke-cage-preview+json" \ + -H "Authorization: token $TOKEN" \ + -d "$PROTECTION_PAYLOAD" \ + "https://api.github.com/repos/$OWNER/$REPO/branches/$BRANCH/protection") + + if [[ $PROTECTION_RESPONSE -eq 200 ]]; then + echo "Branch protection successfully updated." + echo "protection-outcome=success" >> "$GITHUB_OUTPUT" + else + echo "Failed to update branch protection. HTTP status code: $PROTECTION_RESPONSE" + echo "protection-outcome=failure" >> "$GITHUB_OUTPUT" + exit 1 + fi + + auto-branching-master: + name: master - raise PR with changes + runs-on: ubuntu-latest + needs: check-group-membership + if: ${{ needs.check-group-membership.outputs.member == 'true' }} + + steps: + - name: Checkout Robottelo + uses: actions/checkout@v4 + + - name: Update target branch label in dependabot yml file + id: update-dependabot + run: | + # Read the dependabot.yml file + FILE_PATH="./.github/dependabot.yml" + TARGET_BRANCH="${{ github.event.inputs.target_branch }}" + # Append the target branch label to the labels node + awk -v target="'$TARGET_BRANCH'" '/^ *labels:/ {$0 = $0 "\n - " target} 1' "$FILE_PATH" > temp.yml && mv temp.yml "$FILE_PATH" + + - name: Remove lines with @pytest.mark.stream + id: remove-mark-stream + run: | + # Loop through files in the folder + grep -rl "tests/foreman" -e '@pytest\.mark\.stream' | while IFS= read -r file; do + awk '!/@pytest\.mark\.stream/' "$file" > temp && mv temp "$file" + done + + - name: Update the Constants in __init__.py file + run: | + version="${{ github.event.inputs.target_branch }}" + ga_version="${{ github.event.inputs.ga_version }}" + old_stream_version="${version%.z}" + new_stream_version="${{ github.event.inputs.stream_version }}" + non_ga_versions="['$old_stream_version', '$new_stream_version']" + FILE_PATH="./robottelo/constants/__init__.py" + # update the version + sed -i.bak "s/SATELLITE_VERSION = \"$old_stream_version\"/SATELLITE_VERSION = \"$new_stream_version\"/" "$FILE_PATH" + sed -i.bak "s/ SATELLITE_VERSION: \"$old_stream_version\"/ SATELLITE_VERSION: \"$new_stream_version\"/" ./conf/robottelo.yaml.template + sed -i.bak "s/SAT_NON_GA_VERSIONS = \[.*\]/SAT_NON_GA_VERSIONS = $non_ga_versions/" "$FILE_PATH" + rm "$FILE_PATH.bak" "./conf/robottelo.yaml.template.bak" + + - name: git status + run: git status + + - name: git diff + run: git diff + + - name: Commit changes + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + branch_name="auto-branching-${{ github.event.inputs.target_branch }}-$(date '+%s')" + git checkout -b "$branch_name" + git add setup.py ./tests/foreman ./robottelo/* ./requirements.txt ./.github/* ./conf/robottelo.yaml.template + git commit -m "Changes for new ${{ github.event.inputs.target_branch }} branch" + git remote -vvv + git push origin "$branch_name" + + - name: Create pull request + id: create_pr + run: | + title="[master]: Changes for new ${{ github.event.inputs.target_branch }} branch" + body=" + ### Problem Statement + New ${{ github.event.inputs.target_branch }} downstream and master points to stream that is ${{ github.event.inputs.stream_version }} + ### Solution + - Dependabot.yaml cherrypicks to ${{ github.event.inputs.target_branch }} + - Robottelo conf and constants now uses ${{ github.event.inputs.stream_version }} and ${{ github.event.inputs.target_branch }} satellite versions + " + pr_number=$(gh pr create --title "$title" --body "$body" --base "master" | awk -F'/' '{print $NF}') + echo "$pr_number" + echo "pr_number=$pr_number" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets._REPO_ADMIN_TOKEN }} + + - name: Add the prt comment for running the sanity tests + id: add-parent-prt-comment + uses: thollander/actions-comment-pull-request@v2 + with: + message: | + trigger: test-robottelo + pr_number: ${{ steps.create_pr.outputs.pr_number }} + GITHUB_TOKEN: ${{ secrets._REPO_ADMIN_TOKEN }} + + - name: add the no-cherrypick label + uses: actions/github-script@v7 + with: + github-token: ${{ secrets._REPO_ADMIN_TOKEN }} + script: | + github.rest.issues.addLabels({ + issue_number: ${{ steps.create_pr.outputs.pr_number }}, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ["No-CherryPick"] + }) From 5ad4d39d7fe0c8535eb3af86f8a86556cce55139 Mon Sep 17 00:00:00 2001 From: dosas Date: Fri, 5 Apr 2024 14:12:33 +0200 Subject: [PATCH 082/150] Make test parametrization more readable (#14569) --- tests/foreman/api/test_repository.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/foreman/api/test_repository.py b/tests/foreman/api/test_repository.py index 5ac276e194d..f42c33f86c7 100644 --- a/tests/foreman/api/test_repository.py +++ b/tests/foreman/api/test_repository.py @@ -485,14 +485,13 @@ def test_negative_update_to_invalid_download_policy(self, repo, target_sat): @pytest.mark.tier1 @pytest.mark.parametrize( 'repo_options', - **datafactory.parametrized( - [ - {'content_type': content_type, 'download_policy': 'on_demand'} - for content_type in constants.REPO_TYPE - if content_type not in ['yum', 'docker'] - ] - ), + [ + {'content_type': content_type, 'download_policy': 'on_demand'} + for content_type in constants.REPO_TYPE + if content_type not in ['yum', 'docker'] + ], indirect=True, + ids=lambda x: x['content_type'], ) def test_negative_create_non_yum_with_download_policy(self, repo_options, target_sat): """Verify that non-YUM repositories cannot be created with From dc21432ee139abeef159f5e2502577d401b8716f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:14:33 -0400 Subject: [PATCH 083/150] Bump testimony from 2.3.0 to 2.4.0 (#14648) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index db9eb3d0986..4232d0513e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,7 +24,7 @@ pytest-ibutsu==2.2.4 PyYAML==6.0.1 requests==2.31.0 tenacity==8.2.3 -testimony==2.3.0 +testimony==2.4.0 wait-for==1.2.0 wrapanapi==3.6.0 From 5a31c05dbead47a406a47e05454416389661cde9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 00:07:42 -0400 Subject: [PATCH 084/150] Bump peterjgrainger/action-create-branch from 2.2.0 to 3.0.0 (#14653) --- .github/workflows/auto_branching.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto_branching.yml b/.github/workflows/auto_branching.yml index 432e7aa22cd..6afb0cfa164 100644 --- a/.github/workflows/auto_branching.yml +++ b/.github/workflows/auto_branching.yml @@ -45,7 +45,7 @@ jobs: - name: Create the ${{ github.event.inputs.target_branch }} branch id: create-branch - uses: peterjgrainger/action-create-branch@v2.2.0 + uses: peterjgrainger/action-create-branch@v3.0.0 env: GITHUB_TOKEN: ${{ secrets._REPO_ADMIN_TOKEN }} with: From 22cbda23823b1deedd01f8fbdee20c054335857f Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Mon, 8 Apr 2024 08:55:31 +0200 Subject: [PATCH 085/150] bookmark entities reduced parametrization (#14542) --- robottelo/constants/__init__.py | 121 +++------------------------- tests/foreman/api/test_bookmarks.py | 4 +- tests/foreman/ui/test_bookmarks.py | 6 +- tests/upgrades/test_bookmarks.py | 10 +-- 4 files changed, 23 insertions(+), 118 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index bc7d42dc852..8bda8f3e777 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1661,77 +1661,20 @@ class Colored(Box): 'Viewer', ] -BOOKMARK_ENTITIES = [ +BOOKMARK_ENTITIES_SELECTION = [ { 'name': 'ActivationKey', 'controller': 'katello_activation_keys', 'session_name': 'activationkey', 'old_ui': True, }, - {'name': 'Dashboard', 'controller': 'dashboard', 'session_name': 'dashboard'}, - {'name': 'Audit', 'controller': 'audits', 'session_name': 'audit'}, - { - 'name': 'Report', - 'controller': 'config_reports', - 'setup': entities.Report, - 'session_name': 'configreport', - }, - {'name': 'Task', 'controller': 'foreman_tasks_tasks', 'session_name': 'task'}, - # TODO Load manifest for the test_positive_end_to_end from the ui/test_bookmarks.py - # {'name': 'Subscriptions', 'controller': 'subscriptions','session_name': 'subscription' }, - { - 'name': 'Product', - 'controller': 'katello_products', - 'session_name': 'product', - 'old_ui': True, - }, - {'name': 'Repository', 'controller': 'katello_repositories', 'session_name': 'repository'}, - { - 'name': 'ContentCredential', - 'controller': 'katello_content_credentials', - 'session_name': 'contentcredential', - 'old_ui': True, - }, - { - 'name': 'SyncPlan', - 'controller': 'katello_sync_plans', - 'session_name': 'syncplan', - 'old_ui': True, - }, - {'name': 'ContentView', 'controller': 'katello_content_views', 'session_name': 'contentview'}, {'name': 'Errata', 'controller': 'katello_errata', 'session_name': 'errata', 'old_ui': True}, - {'name': 'Package', 'controller': 'katello_erratum_packages', 'session_name': 'package'}, - { - 'name': 'ContainerImageTag', - 'controller': 'katello_docker_tags', - 'session_name': 'containerimagetag', - 'old_ui': True, - }, {'name': 'Host', 'controller': 'hosts', 'setup': entities.Host, 'session_name': 'host_new'}, - {'name': 'ContentHost', 'controller': 'hosts', 'session_name': 'contenthost', 'old_ui': True}, { - 'name': 'HostCollection', - 'controller': 'katello_host_collections', - 'session_name': 'hostcollection', - 'old_ui': True, - }, - {'name': 'Architecture', 'controller': 'architectures', 'session_name': 'architecture'}, - { - 'name': 'HardwareModel', - 'controller': 'models', - 'setup': entities.Model, - 'session_name': 'hardwaremodel', - }, - { - 'name': 'InstallationMedia', - 'controller': 'media', - 'session_name': 'media', - 'setup': entities.Media, - }, - { - 'name': 'OperatingSystem', - 'controller': 'operatingsystems', - 'session_name': 'operatingsystem', + 'name': 'UserGroup', + 'controller': 'usergroups', + 'setup': entities.UserGroup, + 'session_name': 'usergroup', }, { 'name': 'PartitionTable', @@ -1739,58 +1682,18 @@ class Colored(Box): 'setup': entities.PartitionTable, 'session_name': 'partitiontable', }, + { + 'name': 'Product', + 'controller': 'katello_products', + 'session_name': 'product', + 'old_ui': True, + }, { 'name': 'ProvisioningTemplate', 'controller': 'provisioning_templates', 'session_name': 'provisioningtemplate', }, - { - 'name': 'HostGroup', - 'controller': 'hostgroups', - 'setup': entities.HostGroup, - 'session_name': 'hostgroup', - }, - { - 'name': 'DiscoveryRule', - 'controller': 'discovery_rules', - 'setup': entities.DiscoveryRule, - 'session_name': 'discoveryrule', - }, - { - 'name': 'GlobalParameter', - 'controller': 'common_parameters', - 'setup': entities.CommonParameter, - 'skip_for_ui': True, - }, - {'name': 'Role', 'controller': 'ansible_roles', 'setup': entities.Role, 'session_name': 'role'}, - {'name': 'Variables', 'controller': 'ansible_variables', 'session_name': 'ansiblevariables'}, - {'name': 'Capsules', 'controller': 'smart_proxies', 'session_name': 'capsule'}, - { - 'name': 'ComputeResource', - 'controller': 'compute_resources', - 'setup': entities.LibvirtComputeResource, - 'session_name': 'computeresource', - }, - { - 'name': 'ComputeProfile', - 'controller': 'compute_profiles', - 'setup': entities.ComputeProfile, - 'session_name': 'computeprofile', - }, - {'name': 'Subnet', 'controller': 'subnets', 'setup': entities.Subnet, 'session_name': 'subnet'}, - {'name': 'Domain', 'controller': 'domains', 'setup': entities.Domain, 'session_name': 'domain'}, - {'name': 'Realm', 'controller': 'realms', 'setup': entities.Realm, 'session_name': 'realm'}, - {'name': 'Location', 'controller': 'locations', 'session_name': 'location'}, - {'name': 'Organization', 'controller': 'organizations', 'session_name': 'organization'}, - {'name': 'User', 'controller': 'users', 'session_name': 'user'}, - { - 'name': 'UserGroup', - 'controller': 'usergroups', - 'setup': entities.UserGroup, - 'session_name': 'usergroup', - }, - {'name': 'Role', 'controller': 'roles', 'session_name': 'role'}, - {'name': 'Settings', 'controller': 'settings', 'session_name': 'settings'}, + {'name': 'Repository', 'controller': 'katello_repositories', 'session_name': 'repository'}, ] STRING_TYPES = ['alpha', 'numeric', 'alphanumeric', 'latin1', 'utf8', 'cjk', 'html'] diff --git a/tests/foreman/api/test_bookmarks.py b/tests/foreman/api/test_bookmarks.py index b51ac194cb3..5d5833ef563 100644 --- a/tests/foreman/api/test_bookmarks.py +++ b/tests/foreman/api/test_bookmarks.py @@ -17,11 +17,11 @@ import pytest from requests.exceptions import HTTPError -from robottelo.constants import BOOKMARK_ENTITIES +from robottelo.constants import BOOKMARK_ENTITIES_SELECTION from robottelo.utils.datafactory import invalid_values_list, valid_data_list # List of unique bookmark controller values, preserving order -CONTROLLERS = list(dict.fromkeys(entity['controller'] for entity in BOOKMARK_ENTITIES)) +CONTROLLERS = list(dict.fromkeys(entity['controller'] for entity in BOOKMARK_ENTITIES_SELECTION)) @pytest.mark.tier1 diff --git a/tests/foreman/ui/test_bookmarks.py b/tests/foreman/ui/test_bookmarks.py index 037af909046..096f8fdf7cd 100644 --- a/tests/foreman/ui/test_bookmarks.py +++ b/tests/foreman/ui/test_bookmarks.py @@ -16,11 +16,13 @@ import pytest from robottelo.config import user_nailgun_config -from robottelo.constants import BOOKMARK_ENTITIES +from robottelo.constants import BOOKMARK_ENTITIES_SELECTION @pytest.fixture( - scope='module', params=BOOKMARK_ENTITIES, ids=(i['name'] for i in BOOKMARK_ENTITIES) + scope='module', + params=BOOKMARK_ENTITIES_SELECTION, + ids=(i['name'] for i in BOOKMARK_ENTITIES_SELECTION), ) def ui_entity(module_org, module_location, request): """Collects the list of all applicable UI entities for testing and does all diff --git a/tests/upgrades/test_bookmarks.py b/tests/upgrades/test_bookmarks.py index b0d04cfa985..ff53bcdb30b 100644 --- a/tests/upgrades/test_bookmarks.py +++ b/tests/upgrades/test_bookmarks.py @@ -13,7 +13,7 @@ """ import pytest -from robottelo.constants import BOOKMARK_ENTITIES +from robottelo.constants import BOOKMARK_ENTITIES_SELECTION class TestPublicDisableBookmark: @@ -45,7 +45,7 @@ def test_pre_create_public_disable_bookmark(self, request, target_sat): :CaseImportance: Critical """ - for entity in BOOKMARK_ENTITIES: + for entity in BOOKMARK_ENTITIES_SELECTION: book_mark_name = entity["name"] + request.node.name bm = target_sat.api.Bookmark( controller=entity['controller'], @@ -77,7 +77,7 @@ def test_post_create_public_disable_bookmark(self, dependent_scenario_name, targ :CaseImportance: Critical """ pre_test_name = dependent_scenario_name - for entity in BOOKMARK_ENTITIES: + for entity in BOOKMARK_ENTITIES_SELECTION: book_mark_name = entity["name"] + pre_test_name bm = target_sat.api.Bookmark().search(query={'search': f'name="{book_mark_name}"'})[0] assert bm.controller == entity['controller'] @@ -115,7 +115,7 @@ def test_pre_create_public_enable_bookmark(self, request, target_sat): :customerscenario: true """ - for entity in BOOKMARK_ENTITIES: + for entity in BOOKMARK_ENTITIES_SELECTION: book_mark_name = entity["name"] + request.node.name bm = target_sat.api.Bookmark( controller=entity['controller'], @@ -145,7 +145,7 @@ def test_post_create_public_enable_bookmark(self, dependent_scenario_name, targe :CaseImportance: Critical """ pre_test_name = dependent_scenario_name - for entity in BOOKMARK_ENTITIES: + for entity in BOOKMARK_ENTITIES_SELECTION: book_mark_name = entity["name"] + pre_test_name bm = target_sat.api.Bookmark().search(query={'search': f'name="{book_mark_name}"'})[0] assert bm.controller == entity['controller'] From c736ab48a22c833d1780e5f9cfdf3acc71d13ebc Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Mon, 8 Apr 2024 08:56:48 +0200 Subject: [PATCH 086/150] cli e2e fix (#13999) --- tests/foreman/endtoend/test_cli_endtoend.py | 34 +++++++++------------ 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/tests/foreman/endtoend/test_cli_endtoend.py b/tests/foreman/endtoend/test_cli_endtoend.py index 30de18bd960..dc44d6691f7 100644 --- a/tests/foreman/endtoend/test_cli_endtoend.py +++ b/tests/foreman/endtoend/test_cli_endtoend.py @@ -70,7 +70,7 @@ def test_positive_cli_find_admin_user(module_target_sat): @pytest.mark.e2e @pytest.mark.upgrade @pytest.mark.skipif((not settings.robottelo.REPOS_HOSTING_URL), reason='Missing repos_hosting_url') -def test_positive_cli_end_to_end(function_entitlement_manifest, target_sat, rhel_contenthost): +def test_positive_cli_end_to_end(function_sca_manifest, target_sat, rhel_contenthost): """Perform end to end smoke tests using RH and custom repos. 1. Create a new user with admin permissions @@ -110,12 +110,11 @@ def test_positive_cli_end_to_end(function_entitlement_manifest, target_sat, rhel # step 2.1: Create a new organization org = _create(user, target_sat.cli.Org, {'name': gen_alphanumeric()}) - target_sat.cli.SimpleContentAccess.disable({'organization-id': org['id']}) # step 2.2: Clone and upload manifest - target_sat.put(f'{function_entitlement_manifest.path}', f'{function_entitlement_manifest.name}') + target_sat.put(f'{function_sca_manifest.path}', f'{function_sca_manifest.name}') target_sat.cli.Subscription.upload( - {'file': f'{function_entitlement_manifest.name}', 'organization-id': org['id']} + {'file': f'{function_sca_manifest.name}', 'organization-id': org['id']} ) # step 2.3: Create a new lifecycle environment @@ -226,20 +225,9 @@ def test_positive_cli_end_to_end(function_entitlement_manifest, target_sat, rhel ) # step 2.13: Add the products to the activation key - subscription_list = target_sat.cli.Subscription.with_user(user['login'], user['password']).list( + target_sat.cli.Subscription.with_user(user['login'], user['password']).list( {'organization-id': org['id']}, per_page=False ) - for subscription in subscription_list: - if subscription['name'] == constants.DEFAULT_SUBSCRIPTION_NAME: - target_sat.cli.ActivationKey.with_user( - user['login'], user['password'] - ).add_subscription( - { - 'id': activation_key['id'], - 'quantity': 1, - 'subscription-id': subscription['id'], - } - ) # step 2.13.1: Enable product content target_sat.cli.ActivationKey.with_user(user['login'], user['password']).content_override( @@ -266,14 +254,22 @@ def test_positive_cli_end_to_end(function_entitlement_manifest, target_sat, rhel ) content_host = target_sat.cli.Host.with_user(user['login'], user['password']).info( - {'id': content_host['id']} + {'id': content_host['id']}, output_format='json' ) + # check that content view matches what we passed - assert content_host['content-information']['content-view']['name'] == content_view['name'] + assert ( + content_host['content-information']['content-view-environments']['1']['content-view'][ + 'name' + ] + == content_view['name'] + ) # check that lifecycle environment matches assert ( - content_host['content-information']['lifecycle-environment']['name'] + content_host['content-information']['content-view-environments']['1'][ + 'lifecycle-environment' + ]['name'] == lifecycle_environment['name'] ) From 349c75a2e8b091bac289994b9dc9ed0db414dcff Mon Sep 17 00:00:00 2001 From: Pavel Novotny Date: Mon, 8 Apr 2024 09:07:30 +0200 Subject: [PATCH 087/150] notifications: new test for notification_recipients endpoint (#14592) This new test verifies that endpoint `/notification_recipients` works and returns correct data structure. It covers bug https://bugzilla.redhat.com/2249970 where this broken endpoint caused some web UI pages to fail to load. --- tests/foreman/api/test_notifications.py | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/foreman/api/test_notifications.py b/tests/foreman/api/test_notifications.py index 5ed5c940678..4a43be0084e 100644 --- a/tests/foreman/api/test_notifications.py +++ b/tests/foreman/api/test_notifications.py @@ -333,3 +333,32 @@ def test_positive_notification_failed_repo_sync(failed_repo_sync_task, root_mail body_text = mime_body.as_string() assert product_name in body_text assert f'/foreman_tasks/tasks/{task_id}' in body_text + + +@pytest.mark.tier1 +def test_positive_notification_recipients(target_sat): + """Check that endpoint `/notification_recipients` works and returns correct data structure. + + :id: 10e0fac2-f11f-11ee-ba60-000c2989e153 + + :steps: + 1. Do a GET request to /notification_recipients endpoint. + 2. Check the returned data structure for expected keys. + + :BZ: 2249970 + + :customerscenario: true + """ + notification_keys = [ + 'id', + 'seen', + 'level', + 'text', + 'created_at', + 'group', + 'actions', + ] + + recipients = target_sat.api.NotificationRecipients().read() + for notification in recipients.notifications: + assert set(notification_keys) == set(notification.keys()) From ca8ab783ccb7e10240515830a3b344f3a7c6c0f6 Mon Sep 17 00:00:00 2001 From: dosas Date: Mon, 8 Apr 2024 09:13:21 +0200 Subject: [PATCH 088/150] Make oscap profile configurable in settings file (#14535) to enable tests for OS other than rhel --- conf/oscap.yaml.template | 2 ++ pytest_fixtures/component/oscap.py | 2 +- robottelo/config/validators.py | 7 ++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/conf/oscap.yaml.template b/conf/oscap.yaml.template index bfeec7103fb..f23ec46ffb9 100644 --- a/conf/oscap.yaml.template +++ b/conf/oscap.yaml.template @@ -1,2 +1,4 @@ OSCAP: CONTENT_PATH: /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml + # see: robottelo/constants/__init__.py OSCAP_PROFILE + PROFILE: security7 diff --git a/pytest_fixtures/component/oscap.py b/pytest_fixtures/component/oscap.py index e8a7d230603..786788914f2 100644 --- a/pytest_fixtures/component/oscap.py +++ b/pytest_fixtures/component/oscap.py @@ -39,7 +39,7 @@ def scap_content(import_ansible_roles, module_target_sat): scap_profile_id = [ profile['id'] for profile in scap_info.scap_content_profiles - if OSCAP_PROFILE['security7'] in profile['title'] + if OSCAP_PROFILE[settings.oscap.profile] in profile['title'] ][0] return { "title": title, diff --git a/robottelo/config/validators.py b/robottelo/config/validators.py index f598821839d..013be110fe0 100644 --- a/robottelo/config/validators.py +++ b/robottelo/config/validators.py @@ -225,7 +225,12 @@ Validator( 'oscap.content_path', must_exist=True, - ) + ), + Validator( + 'oscap.profile', + default='security7', + must_exist=True, + ), ], osp=[ Validator( From f1799c9018dca08e7a12c0880d24f20c59eb6b4f Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:04:15 +0200 Subject: [PATCH 089/150] HTTP Proxy UI fixes (#14646) * HTTP Proxy UI fixes * Docstring fix --- tests/foreman/ui/test_http_proxy.py | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/tests/foreman/ui/test_http_proxy.py b/tests/foreman/ui/test_http_proxy.py index a247058f8b6..10d2249be30 100644 --- a/tests/foreman/ui/test_http_proxy.py +++ b/tests/foreman/ui/test_http_proxy.py @@ -38,8 +38,6 @@ def test_positive_create_update_delete(module_org, module_location, target_sat): :id: 0c7cdf3d-778f-427a-9a2f-42ad7c23aa15 :expectedresults: All expected CRUD actions finished successfully - - :CaseImportance: High """ http_proxy_name = gen_string('alpha', 15) updated_proxy_name = gen_string('alpha', 15) @@ -65,8 +63,8 @@ def test_positive_create_update_delete(module_org, module_location, target_sat): assert http_proxy_values['http_proxy']['name'] == http_proxy_name assert http_proxy_values['http_proxy']['url'] == http_proxy_url assert http_proxy_values['http_proxy']['username'] == username - assert http_proxy_values['locations']['resources']['assigned'][0] == module_location.name - assert http_proxy_values['organizations']['resources']['assigned'][0] == module_org.name + assert module_location.name in http_proxy_values['locations']['resources']['assigned'] + assert module_org.name in http_proxy_values['organizations']['resources']['assigned'] # Update http_proxy with new name session.http_proxy.update(http_proxy_name, {'http_proxy.name': updated_proxy_name}) assert session.http_proxy.search(updated_proxy_name)[0]['Name'] == updated_proxy_name @@ -210,7 +208,7 @@ def test_set_default_http_proxy(module_org, module_location, setting_update, tar :steps: 1. Navigate to Infrastructure > Http Proxies 2. Create a Http Proxy - 3. GoTo to Administer > Settings > content tab + 3. Go to Administer > Settings > Content tab 4. Update the "Default HTTP Proxy" with created above. 5. Update "Default HTTP Proxy" to "no global default". @@ -251,29 +249,30 @@ def test_set_default_http_proxy(module_org, module_location, setting_update, tar def test_check_http_proxy_value_repository_details( function_org, function_location, function_product, setting_update, target_sat ): - """Deleted Global Http Proxy is reflected in repository details page". + """Global Http Proxy is reflected in repository details page". :id: 3f64255a-ef6c-4acb-b99b-e5579133b564 :steps: 1. Create Http Proxy (Go to Infrastructure > Http Proxies > New Http Proxy) - 2. GoTo to Administer > Settings > content tab + 2. Go to Administer > Settings > Content tab 3. Update the "Default HTTP Proxy" with created above. - 4. Create repository with Global Default Http Proxy. - 5. Delete the Http Proxy + 4. Create repository, check the Global Default Http Proxy is used. + 5. Delete the Http Proxy. + 6. Check it no longer appears on the Settings and repository page. :BZ: 1820193 :parametrized: yes :expectedresults: - 1. After deletion of "Default Http Proxy" its field on settings page should be - set to no global defult - 2. "HTTP Proxy" field in repository details page should be set to Global Default (None). + 1. Repository is automatically created with relevant Global Default Http Proxy. + 2. After Http Proxy deletion + - its field on Settings page should be set to Empty. + - "HTTP Proxy" field in repository details page should be set to Global Default (None). :CaseImportance: Medium """ - property_name = setting_update.name repo_name = gen_string('alpha') http_proxy_a = target_sat.api.HTTPProxy( @@ -297,10 +296,15 @@ def test_check_http_proxy_value_repository_details( 'repo_content.upstream_url': settings.repos.yum_0.url, }, ) + repo_values = session.repository.read(function_product.name, repo_name) + assert ( + repo_values['repo_content']['http_proxy_policy'] + == f'Global Default ({http_proxy_a.name})' + ) + session.http_proxy.delete(http_proxy_a.name) result = session.settings.read(f'name = {property_name}') assert result['table'][0]['Value'] == "Empty" - session.repository.search(function_product.name, repo_name)[0]['Name'] repo_values = session.repository.read(function_product.name, repo_name) assert repo_values['repo_content']['http_proxy_policy'] == 'Global Default (None)' From 0528a150ca68c50ac39f3a25cbe1ab834ce112ab Mon Sep 17 00:00:00 2001 From: Shweta Singh Date: Tue, 9 Apr 2024 02:31:32 +0530 Subject: [PATCH 090/150] Make tests SCA-Compliant (#14679) --- tests/foreman/api/test_registration.py | 4 ++-- tests/foreman/cli/test_logging.py | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/foreman/api/test_registration.py b/tests/foreman/api/test_registration.py index 5b7554b480e..04b23933309 100644 --- a/tests/foreman/api/test_registration.py +++ b/tests/foreman/api/test_registration.py @@ -227,7 +227,7 @@ def test_negative_capsule_without_registration_enabled( module_target_sat, module_capsule_configured, module_ak_with_cv, - module_entitlement_manifest_org, + module_sca_manifest_org, module_location, ): """Verify registration with Capsule, when registration isn't configured in installer @@ -241,7 +241,7 @@ def test_negative_capsule_without_registration_enabled( :expectedresults: Registration fails with HTTP error code 422 and an error message. """ - org = module_entitlement_manifest_org + org = module_sca_manifest_org nc = module_capsule_configured.nailgun_smart_proxy module_target_sat.api.SmartProxy(id=nc.id, organization=[org]).update(['organization']) diff --git a/tests/foreman/cli/test_logging.py b/tests/foreman/cli/test_logging.py index 8d315b3e59c..bb7daceb606 100644 --- a/tests/foreman/cli/test_logging.py +++ b/tests/foreman/cli/test_logging.py @@ -14,7 +14,6 @@ import re from fauxfactory import gen_string -from nailgun import entities import pytest from robottelo.config import settings @@ -130,7 +129,7 @@ def test_positive_logging_from_foreman_proxy(target_sat): @pytest.mark.tier4 -def test_positive_logging_from_candlepin(module_org, module_entitlement_manifest, target_sat): +def test_positive_logging_from_candlepin(module_org, module_sca_manifest, target_sat): """Check logging after manifest upload. :id: 8c06e501-52d7-4baf-903e-7de9caffb066 @@ -148,7 +147,7 @@ def test_positive_logging_from_candlepin(module_org, module_entitlement_manifest # get the number of lines in the source log before the test line_count_start = target_sat.execute(f'wc -l < {source_log}').stdout.strip('\n') # command for this test - with module_entitlement_manifest as manifest: + with module_sca_manifest as manifest: target_sat.upload_manifest(module_org.id, manifest, interface='CLI') # get the number of lines in the source log after the test line_count_end = target_sat.execute(f'wc -l < {source_log}').stdout.strip('\n') @@ -185,12 +184,12 @@ def test_positive_logging_from_dynflow(module_org, target_sat): POST_line_found = False source_log = '/var/log/foreman/production.log' test_logfile = '/var/tmp/logfile_dynflow' - product = entities.Product(organization=module_org).create() + product = target_sat.api.Product(organization=module_org).create() repo_name = gen_string('alpha') # get the number of lines in the source log before the test line_count_start = target_sat.execute(f'wc -l < {source_log}').stdout.strip('\n') # command for this test - new_repo = entities.Repository(name=repo_name, product=product).create() + new_repo = target_sat.api.Repository(name=repo_name, product=product).create() logger.info(f'Created Repo {new_repo.name} for dynflow log test') # get the number of lines in the source log after the test line_count_end = target_sat.execute(f'wc -l < {source_log}').stdout.strip('\n') From 8fdd6b0e13b1c46f04f4f4f0ef1095e8db23bcd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:37:51 +0530 Subject: [PATCH 091/150] Bump deepdiff from 6.7.1 to 7.0.1 (#14680) Bumps [deepdiff](https://github.com/seperman/deepdiff) from 6.7.1 to 7.0.1. - [Release notes](https://github.com/seperman/deepdiff/releases) - [Changelog](https://github.com/seperman/deepdiff/blob/master/docs/changelog.rst) - [Commits](https://github.com/seperman/deepdiff/compare/6.7.1...7.0.1) --- updated-dependencies: - dependency-name: deepdiff dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4232d0513e7..2adc13eb18f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ apypie==0.4.0 betelgeuse==1.11.0 broker[docker]==0.4.9 cryptography==42.0.5 -deepdiff==6.7.1 +deepdiff==7.0.1 dynaconf[vault]==3.2.5 fauxfactory==3.1.1 jinja2==3.1.3 From 0cf4cc6b984f5a10628e017c85a06a24be8bffec Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:26:31 +0200 Subject: [PATCH 092/150] DRPM removal, SRPM fix (#14675) * Get rid of deprecated DRPM repo tests * Fix SRPM repo tests --- robottelo/constants/repos.py | 2 +- tests/foreman/api/test_notifications.py | 2 +- tests/foreman/api/test_repository.py | 15 ++--- tests/foreman/cli/test_repository.py | 88 ------------------------- 4 files changed, 6 insertions(+), 101 deletions(-) diff --git a/robottelo/constants/repos.py b/robottelo/constants/repos.py index a0b2a8adeec..9d968a3830b 100644 --- a/robottelo/constants/repos.py +++ b/robottelo/constants/repos.py @@ -12,7 +12,7 @@ CUSTOM_RPM_SHA = 'https://fixtures.pulpproject.org/rpm-with-sha/' CUSTOM_RPM_SHA_512 = 'https://fixtures.pulpproject.org/rpm-with-sha-512/' FAKE_5_YUM_REPO = 'https://rplevka.fedorapeople.org/fakerepo01/' -FAKE_YUM_DRPM_REPO = 'https://fixtures.pulpproject.org/drpm-signed/' +FAKE_YUM_MISSING_REPO = 'https://fixtures.pulpproject.org/missing-repo/' FAKE_YUM_SRPM_REPO = 'https://fixtures.pulpproject.org/srpm-signed/' FAKE_YUM_SRPM_DUPLICATE_REPO = 'https://fixtures.pulpproject.org/srpm-duplicate/' FAKE_YUM_MD5_REPO = 'https://fixtures.pulpproject.org/rpm-with-md5/' diff --git a/tests/foreman/api/test_notifications.py b/tests/foreman/api/test_notifications.py index 4a43be0084e..72749d57520 100644 --- a/tests/foreman/api/test_notifications.py +++ b/tests/foreman/api/test_notifications.py @@ -222,7 +222,7 @@ def long_running_task(target_sat): def fake_yum_repo(target_sat): """Create a fake YUM repo. Delete it afterwards.""" repo = target_sat.api.Repository( - content_type='yum', url=repo_constants.FAKE_YUM_DRPM_REPO + content_type='yum', url=repo_constants.FAKE_YUM_MISSING_REPO ).create() yield repo diff --git a/tests/foreman/api/test_repository.py b/tests/foreman/api/test_repository.py index f42c33f86c7..ac43bef83f8 100644 --- a/tests/foreman/api/test_repository.py +++ b/tests/foreman/api/test_repository.py @@ -50,12 +50,6 @@ def repo_options_custom_product(request, module_org, module_target_sat): return options -@pytest.fixture -def env(module_org, module_target_sat): - """Create a new puppet environment.""" - return module_target_sat.api.Environment(organization=[module_org]).create() - - @pytest.fixture def repo(repo_options, module_target_sat): """Create a new repository.""" @@ -2098,7 +2092,7 @@ class TestSRPMRepository: @pytest.mark.upgrade @pytest.mark.tier2 def test_positive_srpm_upload_publish_promote_cv( - self, module_org, env, repo, module_target_sat + self, module_org, module_lce, repo, module_target_sat ): """Upload SRPM to repository, add repository to content view and publish, promote content view @@ -2132,7 +2126,6 @@ def test_positive_srpm_upload_publish_promote_cv( @pytest.mark.upgrade @pytest.mark.tier2 - @pytest.mark.skip('Uses deprecated SRPM repository') @pytest.mark.skipif( (not settings.robottelo.REPOS_HOSTING_URL), reason='Missing repos_hosting_url' ) @@ -2141,7 +2134,7 @@ def test_positive_srpm_upload_publish_promote_cv( **datafactory.parametrized({'fake_srpm': {'url': repo_constants.FAKE_YUM_SRPM_REPO}}), indirect=True, ) - def test_positive_repo_sync_publish_promote_cv(self, module_org, env, repo, target_sat): + def test_positive_repo_sync_publish_promote_cv(self, module_org, module_lce, repo, target_sat): """Synchronize repository with SRPMs, add repository to content view and publish, promote content view @@ -2165,8 +2158,8 @@ def test_positive_repo_sync_publish_promote_cv(self, module_org, env, repo, targ >= 3 ) - cv.version[0].promote(data={'environment_ids': env.id, 'force': False}) - assert len(target_sat.api.Srpms().search(query={'environment_id': env.id})) == 3 + cv.version[0].promote(data={'environment_ids': module_lce.id, 'force': False}) + assert len(target_sat.api.Srpms().search(query={'environment_id': module_lce.id})) >= 3 class TestSRPMRepositoryIgnoreContent: diff --git a/tests/foreman/cli/test_repository.py b/tests/foreman/cli/test_repository.py index db04dfd3305..4a70086781f 100644 --- a/tests/foreman/cli/test_repository.py +++ b/tests/foreman/cli/test_repository.py @@ -41,7 +41,6 @@ CUSTOM_FILE_REPO, CUSTOM_RPM_SHA, FAKE_5_YUM_REPO, - FAKE_YUM_DRPM_REPO, FAKE_YUM_MD5_REPO, FAKE_YUM_SRPM_REPO, ) @@ -2529,93 +2528,6 @@ def test_positive_sync_publish_promote_cv(self, repo, module_org, target_sat): assert lce['id'] in [lc['id'] for lc in cv['lifecycle-environments']] -@pytest.mark.skip_if_open("BZ:1682951") -class TestDRPMRepository: - """Tests specific to using repositories containing delta RPMs.""" - - @pytest.mark.tier2 - @pytest.mark.skip("Uses deprecated DRPM repository") - @pytest.mark.parametrize( - 'repo_options', **parametrized([{'url': FAKE_YUM_DRPM_REPO}]), indirect=True - ) - def test_positive_sync(self, repo, module_org, module_product, target_sat): - """Synchronize repository with DRPMs - - :id: a645966c-750b-40ef-a264-dc3bb632b9fd - - :parametrized: yes - - :expectedresults: drpms can be listed in repository - """ - target_sat.cli.Repository.synchronize({'id': repo['id']}) - result = target_sat.execute( - f"ls /var/lib/pulp/published/yum/https/repos/{module_org.label}/Library" - f"/custom/{module_product.label}/{repo['label']}/drpms/ | grep .drpm" - ) - assert result.status == 0 - assert result.stdout - - @pytest.mark.tier2 - @pytest.mark.skip("Uses deprecated DRPM repository") - @pytest.mark.parametrize( - 'repo_options', **parametrized([{'url': FAKE_YUM_DRPM_REPO}]), indirect=True - ) - def test_positive_sync_publish_cv(self, repo, module_org, module_product, target_sat): - """Synchronize repository with DRPMs, add repository to content view - and publish content view - - :id: 014bfc80-4622-422e-a0ec-755b1d9f845e - - :parametrized: yes - - :expectedresults: drpms can be listed in content view - """ - target_sat.cli.Repository.synchronize({'id': repo['id']}) - cv = target_sat.cli_factory.make_content_view({'organization-id': module_org.id}) - target_sat.cli.ContentView.add_repository({'id': cv['id'], 'repository-id': repo['id']}) - target_sat.cli.ContentView.publish({'id': cv['id']}) - result = target_sat.execute( - f"ls /var/lib/pulp/published/yum/https/repos/{module_org.label}/content_views/" - f"{cv['label']}/1.0/custom/{module_product.label}/{repo['label']}/drpms/ | grep .drpm" - ) - assert result.status == 0 - assert result.stdout - - @pytest.mark.tier2 - @pytest.mark.upgrade - @pytest.mark.skip("Uses deprecated DRPM repository") - @pytest.mark.parametrize( - 'repo_options', **parametrized([{'url': FAKE_YUM_DRPM_REPO}]), indirect=True - ) - def test_positive_sync_publish_promote_cv(self, repo, module_org, module_product, target_sat): - """Synchronize repository with DRPMs, add repository to content view, - publish and promote content view to lifecycle environment - - :id: a01cb12b-d388-4902-8532-714f4e28ec56 - - :parametrized: yes - - :expectedresults: drpms can be listed in content view in proper - lifecycle environment - """ - lce = target_sat.cli_factory.make_lifecycle_environment({'organization-id': module_org.id}) - target_sat.cli.Repository.synchronize({'id': repo['id']}) - cv = target_sat.cli_factory.make_content_view({'organization-id': module_org.id}) - target_sat.cli.ContentView.add_repository({'id': cv['id'], 'repository-id': repo['id']}) - target_sat.cli.ContentView.publish({'id': cv['id']}) - content_view = target_sat.cli.ContentView.info({'id': cv['id']}) - cvv = content_view['versions'][0] - target_sat.cli.ContentView.version_promote( - {'id': cvv['id'], 'to-lifecycle-environment-id': lce['id']} - ) - result = target_sat.execute( - f"ls /var/lib/pulp/published/yum/https/repos/{module_org.label}/{lce['label']}" - f"/{cv['label']}/custom/{module_product.label}/{repo['label']}/drpms/ | grep .drpm" - ) - assert result.status == 0 - assert result.stdout - - class TestFileRepository: """Specific tests for File Repositories""" From 21580fc40d64e0daaa31bf72d135bdd4d1fc9469 Mon Sep 17 00:00:00 2001 From: dosas Date: Tue, 9 Apr 2024 09:46:51 +0200 Subject: [PATCH 093/150] Add filter for ldap related tests (#14540) --- pytest_plugins/markers.py | 1 + tests/foreman/conftest.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/pytest_plugins/markers.py b/pytest_plugins/markers.py index b7e0f8f6346..e5d9855a179 100644 --- a/pytest_plugins/markers.py +++ b/pytest_plugins/markers.py @@ -25,6 +25,7 @@ def pytest_configure(config): "include_capsule: For satellite-maintain tests to run on Satellite and Capsule both", "capsule_only: For satellite-maintain tests to run only on Capsules", "manifester: Tests that require manifester", + "ldap: Tests related to ldap authentication", ] markers.extend(module_markers()) for marker in markers: diff --git a/tests/foreman/conftest.py b/tests/foreman/conftest.py index 339eb6016f9..1be6ba294e6 100644 --- a/tests/foreman/conftest.py +++ b/tests/foreman/conftest.py @@ -32,6 +32,8 @@ def pytest_collection_modifyitems(session, items, config): for item in items: if any("manifest" in f for f in getattr(item, "fixturenames", ())): item.add_marker("manifester") + if any("ldap" in f for f in getattr(item, "fixturenames", ())): + item.add_marker("ldap") # 1. Deselect tests marked with @pytest.mark.deselect # WONTFIX BZs makes test to be dynamically marked as deselect. deselect = item.get_closest_marker('deselect') From 590e1758f9cc6f8100277e49d9d7345904c0442c Mon Sep 17 00:00:00 2001 From: Lukas Pramuk Date: Tue, 9 Apr 2024 15:13:53 +0200 Subject: [PATCH 094/150] Safely bump ruff-pre-commit to v0.3.0 (#14692) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 08c10775ce1..3cc02263f06 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,7 +13,7 @@ repos: hooks: - id: black - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.277 + rev: v0.3.0 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] From ce6777ccb748227e8fba884a4a4df9c7b1ddaa2b Mon Sep 17 00:00:00 2001 From: Pavel Novotny Date: Tue, 9 Apr 2024 15:58:44 +0200 Subject: [PATCH 095/150] notifications: no long tasks email for certain users (#14674) notifications: exclude some users from long-running tasks email Bugzilla: https://bugzilla.redhat.com/2245056 Verify that users with disabled account or disabled email don't receive email notifications about long-running tasks. --- tests/foreman/api/test_notifications.py | 75 +++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/foreman/api/test_notifications.py b/tests/foreman/api/test_notifications.py index 72749d57520..f2477ad3291 100644 --- a/tests/foreman/api/test_notifications.py +++ b/tests/foreman/api/test_notifications.py @@ -43,6 +43,17 @@ def admin_user_with_localhost_email(target_sat): user.delete() +@pytest.fixture +def admin_user_with_custom_settings(request, admin_user_with_localhost_email): + """Admin user with custom properties set via parametrization. + `request.param` should be a dict-like value. + """ + for key, value in request.param.items(): + setattr(admin_user_with_localhost_email, key, value) + admin_user_with_localhost_email.update(list(request.param.keys())) + return admin_user_with_localhost_email + + @pytest.fixture def sysadmin_user_with_subscription_reposync_fail(target_sat): """System admin user with `root@localhost` e-mail @@ -162,6 +173,25 @@ def wait_for_failed_repo_sync_mail( ) +@pytest.fixture +def wait_for_no_long_running_task_mail(target_sat, clean_root_mailbox, long_running_task): + """Wait and check that no long-running task ID is found in the Satellite's mbox file.""" + timeout = 120 + try: + wait_for_mail( + sat_obj=target_sat, + mailbox_file=clean_root_mailbox, + contains_string=long_running_task["task"]["id"], + timeout=timeout, + ) + except AssertionError: + return True + raise AssertionError( + f'E-mail with long running task ID "{long_running_task["task"]["id"]}" ' + f'should not have arrived to mailbox {clean_root_mailbox}!' + ) + + @pytest.fixture def root_mailbox_copy(target_sat, clean_root_mailbox): """Parsed local system copy of the Satellite's root user mailbox. @@ -362,3 +392,48 @@ def test_positive_notification_recipients(target_sat): recipients = target_sat.api.NotificationRecipients().read() for notification in recipients.notifications: assert set(notification_keys) == set(notification.keys()) + + +@pytest.mark.tier3 +@pytest.mark.parametrize( + 'admin_user_with_custom_settings', + [ + pytest.param({'disabled': True, 'mail_enabled': True}, id='account_disabled'), + pytest.param({'disabled': False, 'mail_enabled': False}, id='mail_disabled'), + ], + indirect=True, +) +@pytest.mark.usefixtures( + 'reschedule_long_running_tasks_notification', + 'wait_for_no_long_running_task_mail', +) +def test_negative_no_notification_for_long_running_tasks( + admin_user_with_custom_settings, long_running_task, root_mailbox_copy +): + """Check that an e-mail notification for a long-running task + (i.e., running or paused for more than two days) + is NOT sent to users with disabled account or disabled e-mail. + + :id: 03b41216-f39b-11ee-b9ea-000c2989e153 + + :setup: + 1. Create an admin user with e-mail address set and: + a. account disabled & mail enabled + b. account enabled & mail disabled + + :steps: + 1. Create a long-running task. + 3. For each user, wait and check that the notification e-mail has NOT been sent. + + :BZ: 2245056 + + :customerscenario: true + """ + assert admin_user_with_custom_settings + task_id = long_running_task['task']['id'] + assert task_id + + for email in root_mailbox_copy: + assert ( + task_id not in email.as_string() + ), f'Unexpected notification e-mail with long-running task ID {task_id} found in user mailbox!' From a13c05ddb8ce76c7440a24a2d20871e66b76645f Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Wed, 10 Apr 2024 14:09:47 +0530 Subject: [PATCH 096/150] Fix teardown of bootdisk tests with request.addfinalizer (#14701) Signed-off-by: Gaurav Talreja --- tests/foreman/cli/test_bootdisk.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/foreman/cli/test_bootdisk.py b/tests/foreman/cli/test_bootdisk.py index 4775c3bbdea..5e0ca29eec6 100644 --- a/tests/foreman/cli/test_bootdisk.py +++ b/tests/foreman/cli/test_bootdisk.py @@ -20,6 +20,7 @@ @pytest.mark.rhel_ver_match('[^6]') def test_positive_bootdisk_download_https( + request, module_location, module_sync_kickstart_content, module_provisioning_capsule, @@ -79,8 +80,12 @@ def test_positive_bootdisk_download_https( 'lifecycle-environment-id': module_lce_library.id, } ) + + @request.addfinalizer + def _finalize(): + module_target_sat.api.Host(id=host.id).delete() + module_target_sat.api.Media(id=media['id']).delete() + # Check if full-host bootdisk can be downloaded. bootdisk = module_target_sat.cli.Bootdisk.host({'host-id': host['id'], 'full': 'true'}) assert 'Successfully downloaded host disk image' in bootdisk['message'] - module_target_sat.api.Host(id=host.id).delete() - module_target_sat.api.Media(id=media['id']).delete() From d37f76c3c9b6be2a49922f960015e70c5aa68202 Mon Sep 17 00:00:00 2001 From: Lukas Pramuk Date: Wed, 10 Apr 2024 12:53:57 +0200 Subject: [PATCH 097/150] Fix Capsule.install when used w/o kwargs (#14693) --- robottelo/hosts.py | 19 ++----------------- tests/foreman/api/test_capsule.py | 2 +- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/robottelo/hosts.py b/robottelo/hosts.py index a5d5e2319f7..d06eb127547 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -1597,7 +1597,8 @@ def install(self, installer_obj=None, cmd_args=None, cmd_kwargs=None): """General purpose installer""" if not installer_obj: command_opts = {'scenario': self.__class__.__name__.lower()} - command_opts.update(cmd_kwargs) + if cmd_kwargs: + command_opts.update(cmd_kwargs) installer_obj = InstallerCommand(*cmd_args, **command_opts) return self.execute(installer_obj.get_command(), timeout=0) @@ -1696,22 +1697,6 @@ def set_rex_script_mode_provider(self, mode='ssh'): if result.status != 0: raise SatelliteHostError(f'Failed to enable pull provider: {result.stdout}') - def run_installer_arg(self, *args, timeout='20m'): - """Run an installer argument on capsule""" - installer_args = list(args) - installer_command = InstallerCommand( - installer_args=installer_args, - ) - result = self.execute( - installer_command.get_command(), - timeout=timeout, - ) - if result.status != 0: - raise SatelliteHostError( - f'Failed to execute with arguments: {installer_args} and,' - f' the stderr is {result.stderr}' - ) - def set_mqtt_resend_interval(self, value): """Set the time interval in seconds at which the notification should be re-sent to the mqtt host until the job is picked up or cancelled""" diff --git a/tests/foreman/api/test_capsule.py b/tests/foreman/api/test_capsule.py index 86aaa089922..48dd6d4b75b 100644 --- a/tests/foreman/api/test_capsule.py +++ b/tests/foreman/api/test_capsule.py @@ -46,7 +46,7 @@ def test_positive_update_capsule(request, pytestconfig, target_sat, module_capsu # refresh features features = capsule.refresh() - module_capsule_configured.run_installer_arg('enable-foreman-proxy-plugin-openscap') + module_capsule_configured.install(cmd_args=['enable-foreman-proxy-plugin-openscap']) features_new = capsule.refresh() assert len(features_new["features"]) == len(features["features"]) + 1 assert 'Openscap' in [feature["name"] for feature in features_new["features"]] From f8fe6b8b6490b9ddf1e390274bcd8af5486fff8c Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Wed, 10 Apr 2024 17:11:46 +0530 Subject: [PATCH 098/150] SAT-23362-update-fixture-as-per-new-feature(6.16) (#14673) * SAT-23362-update-fixture-as-per-new-feature(6.16) * fix fixture name and reposet name from constants --- robottelo/constants/__init__.py | 8 ++++---- tests/foreman/api/test_repository.py | 18 +++++++----------- tests/foreman/cli/test_repositories.py | 2 +- tests/foreman/ui/test_repository.py | 4 ++-- tests/foreman/ui/test_sync.py | 6 +++--- 5 files changed, 17 insertions(+), 21 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 8bda8f3e777..8857efd00a3 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -311,9 +311,9 @@ class Colored(Box): 'kickstart': { 'rhel6': 'Red Hat Enterprise Linux 6 Server (Kickstart)', 'rhel7': 'Red Hat Enterprise Linux 7 Server (Kickstart)', - 'rhel8': 'Red Hat Enterprise Linux 8 for x86_64 - BaseOS (Kickstart)', + 'rhel8_bos': 'Red Hat Enterprise Linux 8 for x86_64 - BaseOS (Kickstart)', 'rhel8_aps': 'Red Hat Enterprise Linux 8 for x86_64 - AppStream (Kickstart)', - 'rhel9': 'Red Hat Enterprise Linux 9 for x86_64 - BaseOS (Kickstart)', + 'rhel9_bos': 'Red Hat Enterprise Linux 9 for x86_64 - BaseOS (Kickstart)', 'rhel9_aps': 'Red Hat Enterprise Linux 9 for x86_64 - AppStream (Kickstart)', }, 'rhel8_bos': 'Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs)', @@ -538,7 +538,7 @@ class Colored(Box): 'id': 'rhel-8-for-x86_64-baseos-kickstart', 'name': 'Red Hat Enterprise Linux 8 for x86_64 - BaseOS Kickstart 8.9', 'version': '8.9', - 'reposet': REPOSET['kickstart']['rhel8'], + 'reposet': REPOSET['kickstart']['rhel8_bos'], 'product': PRDS['rhel8'], 'distro': 'rhel8', }, @@ -554,7 +554,7 @@ class Colored(Box): 'id': 'rhel-9-for-x86_64-baseos-kickstart', 'name': 'Red Hat Enterprise Linux 9 for x86_64 - BaseOS Kickstart 9.3', 'version': '9.3', - 'reposet': REPOSET['kickstart']['rhel9'], + 'reposet': REPOSET['kickstart']['rhel9_bos'], 'product': PRDS['rhel9'], 'distro': 'rhel9', }, diff --git a/tests/foreman/api/test_repository.py b/tests/foreman/api/test_repository.py index ac43bef83f8..e253b9c957f 100644 --- a/tests/foreman/api/test_repository.py +++ b/tests/foreman/api/test_repository.py @@ -1115,7 +1115,7 @@ def test_module_stream_repository_crud_operations(self, repo): with pytest.raises(HTTPError): repo.read() - def test_positive_recreate_pulp_repositories(self, module_entitlement_manifest_org, target_sat): + def test_positive_recreate_pulp_repositories(self, module_sca_manifest_org, target_sat): """Verify that deleted Pulp Repositories can be recreated using the command 'foreman-rake katello:correct_repositories COMMIT=true' @@ -1130,7 +1130,7 @@ def test_positive_recreate_pulp_repositories(self, module_entitlement_manifest_o """ repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=module_entitlement_manifest_org.id, + org_id=module_sca_manifest_org.id, product=constants.PRDS['rhel'], repo=constants.REPOS['rhst7']['name'], reposet=constants.REPOSET['rhst7'], @@ -1428,9 +1428,7 @@ def test_positive_sync_sha_repo(self, repo, target_sat): assert result.status == 1 @pytest.mark.tier2 - def test_positive_sync_repo_null_contents_changed( - self, module_entitlement_manifest_org, target_sat - ): + def test_positive_sync_repo_null_contents_changed(self, module_sca_manifest_org, target_sat): """test for null contents_changed parameter on actions::katello::repository::sync. :id: f3923940-e097-4da3-aba7-b14dbcda857b @@ -1448,7 +1446,7 @@ def test_positive_sync_repo_null_contents_changed( """ repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=module_entitlement_manifest_org.id, + org_id=module_sca_manifest_org.id, product=constants.PRDS['rhel'], repo=constants.REPOS['rhst7']['name'], reposet=constants.REPOSET['rhst7'], @@ -1471,9 +1469,7 @@ def test_positive_sync_repo_null_contents_changed( if isinstance(ver, int) ], ) - def test_positive_sync_kickstart_check_os( - self, module_entitlement_manifest_org, distro, target_sat - ): + def test_positive_sync_kickstart_check_os(self, module_sca_manifest_org, distro, target_sat): """Sync rhel KS repo and assert that OS was created :id: f84bcf1b-717e-40e7-82ee-000eead45249 @@ -1488,10 +1484,10 @@ def test_positive_sync_kickstart_check_os( 1. OS with corresponding version was created. """ - distro = f'rhel{distro} + "_bos"' if distro > 7 else f'rhel{distro}' + distro = f'rhel{distro}_bos' if distro > 7 else f'rhel{distro}' repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', - org_id=module_entitlement_manifest_org.id, + org_id=module_sca_manifest_org.id, product=constants.REPOS['kickstart'][distro]['product'], reposet=constants.REPOSET['kickstart'][distro], repo=constants.REPOS['kickstart'][distro]['name'], diff --git a/tests/foreman/cli/test_repositories.py b/tests/foreman/cli/test_repositories.py index cf6e10db5c0..fdbe9948b09 100644 --- a/tests/foreman/cli/test_repositories.py +++ b/tests/foreman/cli/test_repositories.py @@ -116,7 +116,7 @@ def test_positive_disable_rh_repo_with_basearch(module_target_sat, module_entitl disabled_repo = module_target_sat.cli.RepositorySet.disable( { 'basearch': DEFAULT_ARCHITECTURE, - 'name': REPOSET['kickstart']['rhel8'], + 'name': REPOSET['kickstart']['rhel8_bos'], 'product-id': repo.product.id, 'organization-id': module_entitlement_manifest_org.id, 'releasever': REPOS['kickstart']['rhel8_aps']['version'], diff --git a/tests/foreman/ui/test_repository.py b/tests/foreman/ui/test_repository.py index 1d9d40e10bb..b8ac36f6449 100644 --- a/tests/foreman/ui/test_repository.py +++ b/tests/foreman/ui/test_repository.py @@ -831,7 +831,7 @@ def test_positive_delete_random_docker_repo(session, module_org, module_target_s @pytest.mark.tier2 -def test_positive_delete_rhel_repo(session, module_entitlement_manifest_org, target_sat): +def test_positive_delete_rhel_repo(session, module_sca_manifest_org, target_sat): """Enable and sync a Red Hat Repository, and then delete it :id: e96f369d-3e58-4824-802e-0b7e99d6d207 @@ -847,7 +847,7 @@ def test_positive_delete_rhel_repo(session, module_entitlement_manifest_org, tar repository_name = sat_tools_repo.data['repository'] product_name = sat_tools_repo.data['product'] with session: - session.organization.select(module_entitlement_manifest_org.name) + session.organization.select(module_sca_manifest_org.name) session.redhatrepository.enable( sat_tools_repo.data['repository-set'], sat_tools_repo.data['arch'], diff --git a/tests/foreman/ui/test_sync.py b/tests/foreman/ui/test_sync.py index d4351bc4923..44cfc7483b8 100644 --- a/tests/foreman/ui/test_sync.py +++ b/tests/foreman/ui/test_sync.py @@ -40,7 +40,7 @@ def module_custom_product(module_org, module_target_sat): @pytest.mark.skip_if_not_set('fake_manifest') @pytest.mark.tier2 @pytest.mark.upgrade -def test_positive_sync_rh_repos(session, target_sat, module_entitlement_manifest_org): +def test_positive_sync_rh_repos(session, target_sat, module_sca_manifest_org): """Create Content RedHat Sync with two repos. :id: e30f6509-0b65-4bcc-a522-b4f3089d3911 @@ -57,7 +57,7 @@ def test_positive_sync_rh_repos(session, target_sat, module_entitlement_manifest for distro, repo in zip(distros, repos, strict=True) ] for repo_collection in repo_collections: - repo_collection.setup(module_entitlement_manifest_org.id, synchronize=False) + repo_collection.setup(module_sca_manifest_org.id, synchronize=False) repo_paths = [ ( repo.repo_data['product'], @@ -68,7 +68,7 @@ def test_positive_sync_rh_repos(session, target_sat, module_entitlement_manifest for repo in repos ] with session: - session.organization.select(org_name=module_entitlement_manifest_org.name) + session.organization.select(org_name=module_sca_manifest_org.name) results = session.sync_status.synchronize(repo_paths) assert len(results) == len(repo_paths) assert all([result == 'Syncing Complete.' for result in results]) From 4f5c857c73f5815d83f178f1f18a28bcce8de60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Gajdu=C5=A1ek?= Date: Wed, 10 Apr 2024 14:50:45 +0200 Subject: [PATCH 099/150] Remove pre-commit GitHub Action from our CI/CQ (#14717) --- .github/workflows/pull_request.yml | 3 --- .pre-commit-config.yaml | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 04d41e73d36..fa46d2f5066 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -41,9 +41,6 @@ jobs: cp broker_settings.yaml.example broker_settings.yaml cp .env.example .env - - name: Pre Commit Checks - uses: pre-commit/action@v3.0.1 - - name: Collect Tests run: | # To skip vault login in pull request checks diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3cc02263f06..c93c0b50203 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,8 @@ # configuration for pre-commit git hooks +ci: + autofix_prs: false # disable autofixing PRs + repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 From 807365ad8df654e18dfa7a6581896a95a6a5dad5 Mon Sep 17 00:00:00 2001 From: Lukas Pramuk Date: Wed, 10 Apr 2024 14:56:34 +0200 Subject: [PATCH 100/150] Coverage of BZ#2245081 ansible callback on capsule (#14658) --- pytest_fixtures/core/sat_cap_factory.py | 12 +++++++++ tests/foreman/installer/test_installer.py | 31 +++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/pytest_fixtures/core/sat_cap_factory.py b/pytest_fixtures/core/sat_cap_factory.py index 0c23b1ee4d2..3cfebdee160 100644 --- a/pytest_fixtures/core/sat_cap_factory.py +++ b/pytest_fixtures/core/sat_cap_factory.py @@ -250,6 +250,18 @@ def module_lb_capsule(retry_limit=3, delay=300, **broker_args): Broker(hosts=cap_hosts.out).checkin() +@pytest.fixture(scope='module') +def module_capsule_configured_ansible(module_capsule_configured): + """Configure the capsule instance with Ansible feature enabled""" + result = module_capsule_configured.install( + cmd_args=[ + 'enable-foreman-proxy-plugin-ansible', + ] + ) + assert result.status == 0, 'Installer failed to enable ansible plugin.' + return module_capsule_configured + + @pytest.fixture(scope='module') def module_capsule_configured_async_ssh(module_capsule_configured): """Configure the capsule instance with the satellite from settings.server.hostname, diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index da64593642e..f57647f23b8 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -1777,6 +1777,37 @@ def test_installer_cap_pub_directory_accessibility(capsule_configured): assert 'Success!' in command_output.stdout +def test_installer_capsule_with_enabled_ansible(module_capsule_configured_ansible): + """Enables Ansible feature on external Capsule and checks the callback is set correctly + + :id: d60c475e-f4e7-11ee-af8a-98fa9b11ac24 + + :steps: + 1. Have a Satellite with external Capsule integrated + 2. Enable Ansible feature on external Capsule + 3. Check the ansible callback plugin on external Capsule + + :expectedresults: + Ansible callback plugin is overridden to "redhat.satellite.foreman" + + :CaseImportance: High + + :BZ: 2245081 + + :customerscenario: true + """ + ansible_env = '/etc/foreman-proxy/ansible.env' + downstream_callback = 'redhat.satellite.foreman' + callback_whitelist = module_capsule_configured_ansible.execute( + f"awk -F= '/ANSIBLE_CALLBACK_WHITELIST/{{print$2}}' {ansible_env}" + ) + assert callback_whitelist.stdout.strip('" \n') == downstream_callback + callbacks_enabled = module_capsule_configured_ansible.execute( + f"awk -F= '/ANSIBLE_CALLBACKS_ENABLED/{{print$2}}' {ansible_env}" + ) + assert callbacks_enabled.stdout.strip('" \n') == downstream_callback + + @pytest.mark.tier1 @pytest.mark.build_sanity @pytest.mark.first_sanity From 00eb874359c405a3c0c75b56b8ea3fe730b85c82 Mon Sep 17 00:00:00 2001 From: Shweta Singh Date: Thu, 11 Apr 2024 02:15:59 +0530 Subject: [PATCH 101/150] Test failures fixes for ui/test_registration.py (#14001) UI test fixes --- pytest_fixtures/component/activationkey.py | 10 + tests/foreman/ui/test_registration.py | 236 ++++++++++++++------- 2 files changed, 165 insertions(+), 81 deletions(-) diff --git a/pytest_fixtures/component/activationkey.py b/pytest_fixtures/component/activationkey.py index 982775670ae..8101a446ffa 100644 --- a/pytest_fixtures/component/activationkey.py +++ b/pytest_fixtures/component/activationkey.py @@ -15,6 +15,16 @@ def module_activation_key(module_sca_manifest_org, module_target_sat): ).create() +@pytest.fixture +def function_activation_key(function_sca_manifest_org, target_sat): + """Create activation key using default CV and library environment.""" + return target_sat.api.ActivationKey( + content_view=function_sca_manifest_org.default_content_view.id, + environment=function_sca_manifest_org.library.id, + organization=function_sca_manifest_org, + ).create() + + @pytest.fixture(scope='module') def module_ak(module_lce, module_org, module_target_sat): return module_target_sat.api.ActivationKey( diff --git a/tests/foreman/ui/test_registration.py b/tests/foreman/ui/test_registration.py index 51d608eec4d..9d223340a35 100644 --- a/tests/foreman/ui/test_registration.py +++ b/tests/foreman/ui/test_registration.py @@ -14,13 +14,16 @@ import re from airgun.exceptions import DisabledWidgetError -from airgun.session import Session from fauxfactory import gen_string import pytest from robottelo import constants from robottelo.config import settings -from robottelo.constants import FAKE_1_CUSTOM_PACKAGE, FAKE_7_CUSTOM_PACKAGE, REPO_TYPE +from robottelo.constants import ( + FAKE_1_CUSTOM_PACKAGE, + FAKE_7_CUSTOM_PACKAGE, + REPO_TYPE, +) pytestmark = pytest.mark.tier1 @@ -64,9 +67,9 @@ def test_positive_verify_default_values_for_global_registration( @pytest.mark.tier2 def test_positive_org_loc_change_for_registration( module_activation_key, - module_org, + module_sca_manifest_org, module_location, - target_sat, + module_target_sat, ): """Changing the organization and location to check if correct org and loc is updated on the global registration page as well as in the command @@ -76,15 +79,20 @@ def test_positive_org_loc_change_for_registration( :CaseImportance: Medium """ - new_org = target_sat.api.Organization().create() - new_loc = target_sat.api.Location().create() - target_sat.api.ActivationKey(organization=new_org).create() - with target_sat.ui_session() as session: - session.organization.select(org_name=module_org.name) + new_org = module_target_sat.api.Organization().create() + new_loc = module_target_sat.api.Location().create() + ak = module_target_sat.api.ActivationKey(organization=new_org).create() + with module_target_sat.ui_session() as session: + session.organization.select(org_name=module_sca_manifest_org.name) session.location.select(loc_name=module_location.name) - cmd = session.host.get_register_command() + cmd = session.host.get_register_command( + { + 'general.activation_keys': module_activation_key.name, + 'general.insecure': True, + } + ) expected_pairs = [ - f'organization_id={module_org.id}', + f'organization_id={module_sca_manifest_org.id}', f'location_id={module_location.id}', ] for pair in expected_pairs: @@ -92,7 +100,12 @@ def test_positive_org_loc_change_for_registration( # changing the org and loc to check if correct org and loc is updated on the registration command session.organization.select(org_name=new_org.name) session.location.select(loc_name=new_loc.name) - cmd = session.host.get_register_command() + cmd = session.host.get_register_command( + { + 'general.activation_keys': ak.name, + 'general.insecure': True, + } + ) expected_pairs = [ f'organization_id={new_org.id}', f'location_id={new_loc.id}', @@ -102,9 +115,7 @@ def test_positive_org_loc_change_for_registration( def test_negative_global_registration_without_ak( - module_target_sat, - module_org, - module_location, + module_target_sat, function_org, function_location ): """Attempt to register a host without ActivationKey @@ -113,8 +124,8 @@ def test_negative_global_registration_without_ak( :expectedresults: Generate command is disabled without ActivationKey """ with module_target_sat.ui_session() as session: - session.organization.select(org_name=module_org.name) - session.location.select(loc_name=module_location.name) + session.organization.select(org_name=function_org.name) + session.location.select(loc_name=function_location.name) with pytest.raises(DisabledWidgetError) as context: session.host.get_register_command() assert 'Generate registration command button is disabled' in str(context.value) @@ -125,14 +136,13 @@ def test_negative_global_registration_without_ak( @pytest.mark.tier3 @pytest.mark.rhel_ver_match('[^6]') def test_positive_global_registration_end_to_end( - session, module_activation_key, module_org, smart_proxy_location, default_os, default_smart_proxy, rhel_contenthost, - target_sat, + module_target_sat, ): """Host registration form produces a correct registration command and host is registered successfully with it, remote execution and insights are set up @@ -150,25 +160,27 @@ def test_positive_global_registration_end_to_end( """ # make sure global parameters for rex and insights are set to true insights_cp = ( - target_sat.api.CommonParameter() + module_target_sat.api.CommonParameter() .search(query={'search': 'name=host_registration_insights'})[0] .read() ) rex_cp = ( - target_sat.api.CommonParameter() + module_target_sat.api.CommonParameter() .search(query={'search': 'name=host_registration_remote_execution'})[0] .read() ) if not insights_cp.value: - target_sat.api.CommonParameter(id=insights_cp.id, value=1).update(['value']) + module_target_sat.api.CommonParameter(id=insights_cp.id, value=1).update(['value']) if not rex_cp.value: - target_sat.api.CommonParameter(id=rex_cp.id, value=1).update(['value']) + module_target_sat.api.CommonParameter(id=rex_cp.id, value=1).update(['value']) # rex interface iface = 'eth0' # fill in the global registration form - with session: + with module_target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) + session.location.select(loc_name=smart_proxy_location.name) cmd = session.host.get_register_command( { 'general.operating_system': default_os.title, @@ -219,7 +231,7 @@ def test_positive_global_registration_end_to_end( assert result.status == 0 assert datetime.now(tzinfo).strftime('%Y-%m-%d') in result.stdout # Set "Connect to host using IP address" - target_sat.api.Parameter( + module_target_sat.api.Parameter( host=rhel_contenthost.hostname, name='remote_execution_connect_by_ip', parameter_type='boolean', @@ -227,7 +239,7 @@ def test_positive_global_registration_end_to_end( ).create() # run insights-client via REX command = "insights-client --status" - invocation_command = target_sat.cli_factory.job_invocation( + invocation_command = module_target_sat.cli_factory.job_invocation( { 'job-template': 'Run Command - Script Default', 'inputs': f'command={command}', @@ -236,24 +248,24 @@ def test_positive_global_registration_end_to_end( ) # results provide all info but job invocation might not be finished yet result = ( - target_sat.api.JobInvocation() + module_target_sat.api.JobInvocation() .search( query={'search': f'id={invocation_command["id"]} and host={rhel_contenthost.hostname}'} )[0] .read() ) # make sure that task is finished - task_result = target_sat.wait_for_tasks( + task_result = module_target_sat.wait_for_tasks( search_query=(f'id = {result.task.id}'), search_rate=2, max_tries=60 ) assert task_result[0].result == 'success' host = ( - target_sat.api.Host() + module_target_sat.api.Host() .search(query={'search': f'name={rhel_contenthost.hostname}'})[0] .read() ) for interface in host.interface: - interface_result = target_sat.api.Interface(host=host.id).search( + interface_result = module_target_sat.api.Interface(host=host.id).search( query={'search': f'{interface.id}'} )[0] # more interfaces can be inside the host @@ -263,11 +275,8 @@ def test_positive_global_registration_end_to_end( @pytest.mark.tier2 def test_global_registration_form_populate( - module_org, - session, - module_ak_with_cv, - module_lce, - module_promoted_cv, + function_sca_manifest_org, + function_activation_key, default_architecture, default_os, target_sat, @@ -298,21 +307,26 @@ def test_global_registration_form_populate( group_params = {'name': 'host_packages', 'value': constants.FAKE_0_CUSTOM_PACKAGE} parent_hg = target_sat.api.HostGroup( name=hg_name, - organization=[module_org], - lifecycle_environment=module_lce, + organization=[function_sca_manifest_org], + lifecycle_environment=function_sca_manifest_org.library.id, architecture=default_architecture, operatingsystem=default_os, - content_view=module_promoted_cv, + content_view=function_sca_manifest_org.default_content_view.id, group_parameters_attributes=[group_params], ).create() target_sat.api.HostGroup(name=hg_nested_name, parent=parent_hg).create() new_org = target_sat.api.Organization().create() - new_ak = target_sat.api.ActivationKey(organization=new_org).create() - with session: + new_ak = target_sat.api.ActivationKey( + content_view=new_org.default_content_view, + environment=target_sat.api.LifecycleEnvironment(id=new_org.library.id), + organization=new_org, + ).create() + with target_sat.ui_session() as session: + session.organization.select(org_name=function_sca_manifest_org.name) session.hostgroup.update( f'{hg_name}/{hg_nested_name}', { - 'activation_keys.activation_keys': module_ak_with_cv.name, + 'activation_keys.activation_keys': function_activation_key.name, }, ) cmd = session.host.get_register_command( @@ -324,15 +338,15 @@ def test_global_registration_form_populate( full_read=True, ) assert hg_nested_name in cmd['general']['host_group'] - assert module_ak_with_cv.name in cmd['general']['activation_key_helper'] + assert function_activation_key.name in cmd['general']['activation_key_helper'] assert constants.FAKE_0_CUSTOM_PACKAGE in cmd['advanced']['install_packages_helper'] session.organization.select(org_name=new_org.name) + session.browser.refresh() cmd = session.host.get_register_command( { - 'general.organization': new_org.name, - 'general.operating_system': default_os.title, 'general.insecure': True, + 'advanced.force': True, }, full_read=True, ) @@ -341,10 +355,10 @@ def test_global_registration_form_populate( @pytest.mark.tier2 -@pytest.mark.usefixtures('enable_capsule_for_registration') +@pytest.mark.rhel_ver_match('8') @pytest.mark.no_containers def test_global_registration_with_gpg_repo_and_default_package( - session, module_activation_key, default_os, default_smart_proxy, rhel8_contenthost + module_activation_key, rhel_contenthost, target_sat, module_org ): """Host registration form produces a correct registration command and host is registered successfully with gpg repo enabled and have default package @@ -365,15 +379,14 @@ def test_global_registration_with_gpg_repo_and_default_package( :parametrized: yes """ - client = rhel8_contenthost + client = rhel_contenthost repo_name = 'foreman_register' repo_url = settings.repos.gr_yum_repo.url repo_gpg_url = settings.repos.gr_yum_repo.gpg_url - with session: + with target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) cmd = session.host.get_register_command( { - 'general.operating_system': default_os.title, - 'general.capsule': default_smart_proxy.name, 'general.activation_keys': module_activation_key.name, 'general.insecure': True, 'advanced.force': True, @@ -406,9 +419,9 @@ def test_global_registration_with_gpg_repo_and_default_package( @pytest.mark.tier3 -@pytest.mark.usefixtures('enable_capsule_for_registration') +@pytest.mark.rhel_ver_match('9') def test_global_re_registration_host_with_force_ignore_error_options( - session, module_activation_key, default_os, default_smart_proxy, rhel7_contenthost + module_activation_key, rhel_contenthost, module_target_sat, module_org ): """If the ignore_error and force checkbox is checked then registered host can get re-registered without any error. @@ -426,12 +439,11 @@ def test_global_re_registration_host_with_force_ignore_error_options( :parametrized: yes """ - client = rhel7_contenthost - with session: + client = rhel_contenthost + with module_target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) cmd = session.host.get_register_command( { - 'general.operating_system': default_os.title, - 'general.capsule': default_smart_proxy.name, 'general.activation_keys': module_activation_key.name, 'general.insecure': True, 'advanced.force': True, @@ -448,9 +460,9 @@ def test_global_re_registration_host_with_force_ignore_error_options( @pytest.mark.tier2 -@pytest.mark.usefixtures('enable_capsule_for_registration') +@pytest.mark.rhel_ver_match('8') def test_global_registration_token_restriction( - session, module_activation_key, rhel8_contenthost, default_os, default_smart_proxy, target_sat + module_activation_key, rhel_contenthost, module_target_sat, module_org ): """Global registration token should be only used for registration call, it should be restricted for any other api calls. @@ -466,12 +478,11 @@ def test_global_registration_token_restriction( :parametrized: yes """ - client = rhel8_contenthost - with session: + client = rhel_contenthost + with module_target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) cmd = session.host.get_register_command( { - 'general.operating_system': default_os.title, - 'general.capsule': default_smart_proxy.name, 'general.activation_keys': module_activation_key.name, 'general.insecure': True, } @@ -481,20 +492,21 @@ def test_global_registration_token_restriction( auth_header = re.search(pattern, cmd).group() # build curl - curl_users = f'curl -X GET -k -H {auth_header} -i {target_sat.url}/api/users/' - curl_hosts = f'curl -X GET -k -H {auth_header} -i {target_sat.url}/api/hosts/' + curl_users = f'curl -X GET -k -H {auth_header} -i {module_target_sat.url}/api/users/' + curl_hosts = f'curl -X GET -k -H {auth_header} -i {module_target_sat.url}/api/hosts/' for curl_cmd in (curl_users, curl_hosts): result = client.execute(curl_cmd) assert result.status == 0 assert 'Unable to authenticate user' in result.stdout +@pytest.mark.rhel_ver_match('8') def test_positive_host_registration_with_non_admin_user( test_name, module_sca_manifest_org, module_location, - target_sat, - rhel8_contenthost, + module_target_sat, + rhel_contenthost, module_activation_key, ): """Register hosts from a non-admin user with only register_hosts, edit_hosts @@ -506,14 +518,14 @@ def test_positive_host_registration_with_non_admin_user( """ user_password = gen_string('alpha') org = module_sca_manifest_org - role = target_sat.api.Role(organization=[org]).create() + role = module_target_sat.api.Role(organization=[org]).create() user_permissions = { 'Organization': ['view_organizations'], 'Host': ['view_hosts'], } - target_sat.api_factory.create_role_permissions(role, user_permissions) - user = target_sat.api.User( + module_target_sat.api_factory.create_role_permissions(role, user_permissions) + user = module_target_sat.api.User( role=[role], admin=False, password=user_password, @@ -522,10 +534,12 @@ def test_positive_host_registration_with_non_admin_user( default_organization=org, default_location=module_location, ).create() - role = target_sat.cli.Role.info({'name': 'Register hosts'}) - target_sat.cli.User.add_role({'id': user.id, 'role-id': role['id']}) + role = module_target_sat.cli.Role.info({'name': 'Register hosts'}) + module_target_sat.cli.User.add_role({'id': user.id, 'role-id': role['id']}) - with Session(test_name, user=user.login, password=user_password) as session: + with module_target_sat.ui_session( + test_name, user=user.login, password=user_password + ) as session: cmd = session.host_new.get_register_command( { @@ -534,17 +548,19 @@ def test_positive_host_registration_with_non_admin_user( } ) - result = rhel8_contenthost.execute(cmd) + result = rhel_contenthost.execute(cmd) assert result.status == 0, f'Failed to register host: {result.stderr}' # Verify server.hostname and server.port from subscription-manager config - assert target_sat.hostname == rhel8_contenthost.subscription_config['server']['hostname'] - assert rhel8_contenthost.subscription_config['server']['port'] == constants.CLIENT_PORT + assert ( + module_target_sat.hostname == rhel_contenthost.subscription_config['server']['hostname'] + ) + assert rhel_contenthost.subscription_config['server']['port'] == constants.CLIENT_PORT @pytest.mark.tier2 def test_positive_global_registration_form( - session, module_activation_key, module_org, smart_proxy_location, default_os, target_sat + module_activation_key, module_org, smart_proxy_location, default_os, target_sat ): """Host registration form produces a correct curl command for various inputs @@ -572,7 +588,9 @@ def test_positive_global_registration_form( organization=[module_org], location=[smart_proxy_location] ).create() iface = 'eth0' - with session: + with target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) + session.location.select(loc_name=smart_proxy_location.name) cmd = session.host.get_register_command( { 'advanced.setup_insights': 'Yes (override)' if insights_value else 'No (override)', @@ -603,10 +621,10 @@ def test_positive_global_registration_form( @pytest.mark.tier2 +@pytest.mark.rhel_ver_match('8') def test_global_registration_with_capsule_host( - session, capsule_configured, - rhel8_contenthost, + rhel_contenthost, module_org, module_location, module_product, @@ -633,7 +651,7 @@ def test_global_registration_with_capsule_host( :CaseAutomation: Automated """ - client = rhel8_contenthost + client = rhel_contenthost repo = target_sat.api.Repository( url=settings.repos.yum_1.url, content_type=REPO_TYPE['yum'], @@ -677,7 +695,7 @@ def test_global_registration_with_capsule_host( # Wait till capsule sync finishes for task in sync_status['active_sync_tasks']: target_sat.api.ForemanTask(id=task['id']).poll() - with session: + with target_sat.ui_session() as session: session.organization.select(org_name=module_org.name) session.location.select(loc_name=module_location.name) cmd = session.host.get_register_command( @@ -697,3 +715,59 @@ def test_global_registration_with_capsule_host( assert result.status == 0 assert module_lce_library.name in result.stdout assert module_org.name in result.stdout + + +@pytest.mark.tier2 +@pytest.mark.rhel_ver_match('[^6].*') +def test_subscription_manager_install_from_repository( + module_activation_key, module_os, rhel_contenthost, target_sat, module_org +): + """Host registration form produces a correct registration command and + subscription-manager can be installed from a custom repository before + registration is completed. + + :id: b7a44f32-90b2-4fd6-b65b-5a3d2a5c5deb + + :customerscenario: true + + :expectedresults: Host is successfully registered, repo is enabled + on advanced tab and subscription-manager is installed. + + :steps: + 1. Create activation-key + 2. Open the global registration form, add repo and activation key + 3. Add 'subscription-manager' to install packages field + 4. Check subscription-manager was installed from repo_name + + :parametrized: yes + + :BZ: 1923320 + """ + client = rhel_contenthost + repo_name = 'foreman_register' + rhel_ver = rhel_contenthost.os_version.major + repo_url = settings.repos.get(f'rhel{rhel_ver}_os') + if isinstance(repo_url, dict): + repo_url = repo_url['baseos'] + # Ensure subs-man is installed from repo_name by removing existing package. + result = client.execute('rpm --erase --nodeps subscription-manager') + assert result.status == 0 + with target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) + cmd = session.host.get_register_command( + { + 'general.operating_system': module_os.title, + 'general.activation_keys': module_activation_key.name, + 'general.insecure': True, + 'advanced.force': True, + 'advanced.install_packages': 'subscription-manager', + 'advanced.repository': repo_url, + } + ) + + # run curl + result = client.execute(cmd) + assert result.status == 0 + result = client.execute('yum repolist') + assert repo_name in result.stdout + assert result.status == 0 From 5716a33d2a0c807cbae8c023dafc159e4a36bf9e Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Thu, 11 Apr 2024 09:36:15 +0200 Subject: [PATCH 102/150] Fix tests failing on enabling satellite/capsule module (#14676) --- pytest_fixtures/core/sat_cap_factory.py | 2 +- robottelo/hosts.py | 13 +++++++++++++ tests/foreman/destructive/test_clone.py | 2 +- tests/foreman/installer/test_installer.py | 6 ++---- tests/foreman/sys/test_katello_certs_check.py | 5 +---- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/pytest_fixtures/core/sat_cap_factory.py b/pytest_fixtures/core/sat_cap_factory.py index 3cfebdee160..9634c6c4fcb 100644 --- a/pytest_fixtures/core/sat_cap_factory.py +++ b/pytest_fixtures/core/sat_cap_factory.py @@ -358,7 +358,7 @@ def installer_satellite(request): release=settings.server.version.release, snap=settings.server.version.snap, ) - sat.execute('dnf -y module enable satellite:el8 && dnf -y install satellite') + sat.install_satellite_or_capsule_package() installed_version = sat.execute('rpm --query satellite').stdout assert sat_version in installed_version # Install Satellite diff --git a/robottelo/hosts.py b/robottelo/hosts.py index d06eb127547..21932336231 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -1739,6 +1739,19 @@ def cli(self): self._cli._configured = True return self._cli + def install_satellite_or_capsule_package(self): + """Install Satellite/Capsule package. + Note: Make sure required repos are enabled before using this. + """ + if self.os_version.major == 8: + assert ( + self.execute( + f'dnf -y module enable {self.product_rpm_name}:el{self.os_version.major}' + ).status + == 0 + ) + assert self.execute(f'dnf -y install {self.product_rpm_name}').status == 0 + class Satellite(Capsule, SatelliteMixins): product_rpm_name = 'satellite' diff --git a/tests/foreman/destructive/test_clone.py b/tests/foreman/destructive/test_clone.py index fade8abcf6a..7100084b358 100644 --- a/tests/foreman/destructive/test_clone.py +++ b/tests/foreman/destructive/test_clone.py @@ -90,7 +90,7 @@ def test_positive_clone_backup( for repo in getattr(constants, f"OHSNAP_RHEL{rhel_version}_REPOS"): sat_ready_rhel.enable_repo(repo, force=True) # Enabling satellite module - assert sat_ready_rhel.execute(f'dnf module enable -y satellite:el{rhel_version}').status == 0 + sat_ready_rhel.install_satellite_or_capsule_package() # Install satellite-clone assert sat_ready_rhel.execute('yum install satellite-clone -y').status == 0 # Disabling CDN repos as we install from dogfdood diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index f57647f23b8..0aaab90bc5c 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -1358,7 +1358,7 @@ def install_satellite(satellite, installer_args, enable_fapolicyd=False): satellite.execute('dnf -y install fapolicyd && systemctl enable --now fapolicyd').status == 0 ) - satellite.execute('dnf -y module enable satellite:el8 && dnf -y install satellite') + satellite.install_satellite_or_capsule_package() if enable_fapolicyd: assert satellite.execute('rpm -q foreman-fapolicyd').status == 0 assert satellite.execute('rpm -q foreman-proxy-fapolicyd').status == 0 @@ -1441,9 +1441,7 @@ def test_capsule_installation(sat_non_default_install, cap_ready_rhel, setting_u ).status == 0 ) - cap_ready_rhel.execute( - 'dnf -y module enable satellite-capsule:el8 && dnf -y install satellite-capsule' - ) + cap_ready_rhel.install_satellite_or_capsule_package() assert cap_ready_rhel.execute('rpm -q foreman-proxy-fapolicyd').status == 0 # Setup Capsule setup_capsule(sat_non_default_install, cap_ready_rhel, org) diff --git a/tests/foreman/sys/test_katello_certs_check.py b/tests/foreman/sys/test_katello_certs_check.py index 640add5a0ae..820501f3713 100644 --- a/tests/foreman/sys/test_katello_certs_check.py +++ b/tests/foreman/sys/test_katello_certs_check.py @@ -44,10 +44,7 @@ def test_positive_install_sat_with_katello_certs(certs_data, sat_ready_rhel): ) sat_ready_rhel.register_to_cdn() sat_ready_rhel.execute('dnf -y update') - result = sat_ready_rhel.execute( - 'dnf -y module enable satellite:el8 && dnf -y install satellite' - ) - assert result.status == 0 + sat_ready_rhel.install_satellite_or_capsule_package() command = InstallerCommand( scenario='satellite', certs_server_cert=f'/root/{certs_data["cert_file_name"]}', From d110fcda62e694646e1dcfb6844fc5729a69ed52 Mon Sep 17 00:00:00 2001 From: Shweta Singh Date: Thu, 11 Apr 2024 14:23:15 +0530 Subject: [PATCH 103/150] Update PRT Label Remove (#14707) Update PRT Level Remove --- .github/workflows/prt_labels.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/prt_labels.yml b/.github/workflows/prt_labels.yml index 52dd68589b3..072a46ba196 100644 --- a/.github/workflows/prt_labels.yml +++ b/.github/workflows/prt_labels.yml @@ -8,7 +8,7 @@ jobs: prt_labels_remover: name: remove the PRT label when amendments or new commits added to PR runs-on: ubuntu-latest - if: "(contains(github.event.pull_request.labels.*.name, 'PRT-Passed') || contains(github.event.pull_request.labels.*.name, 'PRT-Failed'))" + if: "(contains(github.event.pull_request.labels.*.name, 'PRT-Passed'))" steps: - name: Avoid the race condition as PRT result will be cleaned run: | @@ -23,7 +23,7 @@ jobs: wait-interval: 2 count: 5 - - name: remove the PRT Passed/Failed label, for new commit + - name: remove the PRT Passed label, for new commit if: always() && ${{steps.prt.outputs.result}} == 'not_found' uses: actions/github-script@v7 with: @@ -35,7 +35,7 @@ jobs: repo: context.repo.repo, issue_number: prNumber, }); - const labelsToRemove = ['PRT-Failed', 'PRT-Passed']; + const labelsToRemove = ['PRT-Passed']; const labelsToRemoveFiltered = labelsToRemove.filter(label => issue.data.labels.some(({ name }) => name === label)); if (labelsToRemoveFiltered.length > 0) { await Promise.all(labelsToRemoveFiltered.map(async label => { From a04f4a1ffef310a2139b4d7f4ebc58693d34dba7 Mon Sep 17 00:00:00 2001 From: Gaurav Talreja Date: Thu, 11 Apr 2024 14:28:46 +0530 Subject: [PATCH 104/150] Move TestAnsibleREX UI tests to Ansible module (#14605) Signed-off-by: Gaurav Talreja --- tests/foreman/ui/test_ansible.py | 949 ++++++++++++++--------- tests/foreman/ui/test_remoteexecution.py | 268 ------- 2 files changed, 587 insertions(+), 630 deletions(-) diff --git a/tests/foreman/ui/test_ansible.py b/tests/foreman/ui/test_ansible.py index 57fae0a8731..3fa3a4d6838 100644 --- a/tests/foreman/ui/test_ansible.py +++ b/tests/foreman/ui/test_ansible.py @@ -1,15 +1,12 @@ -"""Test class for Ansible Roles and Variables pages +"""Test class for Ansible-ConfigurationManagement and Ansible-RemoteExecution components :Requirement: Ansible :CaseAutomation: Automated -:CaseComponent: Ansible-ConfigurationManagement - :Team: Rocket :CaseImportance: Critical - """ from fauxfactory import gen_string import pytest @@ -19,395 +16,623 @@ from robottelo.config import robottelo_tmp_dir, settings -def test_positive_create_and_delete_variable(target_sat): - """Create an Ansible variable with the minimum required values, then delete the variable. - - :id: 7006d7c7-788a-4447-a564-d6b03ec06aaf - - :steps: - - 1. Import Ansible roles if none have been imported yet. - 2. Create an Ansible variable with only a name and an assigned Ansible role. - 3. Verify that the Ansible variable has been created. - 4. Delete the Ansible variable. - 5. Verify that the Ansible Variable has been deleted. +class TestAnsibleCfgMgmt: + """Test class for Configuration Management with Ansible - :expectedresults: The variable is successfully created and deleted. + :CaseComponent: Ansible-ConfigurationManagement """ - key = gen_string('alpha') - - SELECTED_ROLE = 'redhat.satellite.activation_keys' - proxy_id = target_sat.nailgun_smart_proxy.id - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) - with target_sat.ui_session() as session: - session.ansiblevariables.create( - { - 'key': key, - 'ansible_role': SELECTED_ROLE, - } + + @pytest.mark.tier2 + def test_positive_create_and_delete_variable(self, target_sat): + """Create an Ansible variable with the minimum required values, then delete the variable. + + :id: 7006d7c7-788a-4447-a564-d6b03ec06aaf + + :steps: + 1. Import Ansible roles if none have been imported yet. + 2. Create an Ansible variable with only a name and an assigned Ansible role. + 3. Verify that the Ansible variable has been created. + 4. Delete the Ansible variable. + 5. Verify that the Ansible Variable has been deleted. + + :expectedresults: The variable is successfully created and deleted. + """ + key = gen_string('alpha') + SELECTED_ROLE = 'redhat.satellite.activation_keys' + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} + ) + with target_sat.ui_session() as session: + session.ansiblevariables.create( + { + 'key': key, + 'ansible_role': SELECTED_ROLE, + } + ) + assert session.ansiblevariables.search(key)[0]['Name'] == key + session.ansiblevariables.delete(key) + assert not session.ansiblevariables.search(key) + + @pytest.mark.tier3 + def test_positive_create_variable_with_overrides(self, target_sat): + """Create an Ansible variable with all values populated. + + :id: 90acea37-4c2f-42e5-92a6-0c88148f4fb6 + + :steps: + 1. Import Ansible roles if none have been imported yet. + 2. Create an Anible variable, populating all fields on the creation form. + 3. Verify that the Ansible variable was created successfully. + 4. Delete the Ansible variable. + 5. Verify that the Ansible Variable has been deleted. + + :expectedresults: The variable is successfully created. + """ + key = gen_string('alpha') + SELECTED_ROLE = 'redhat.satellite.activation_keys' + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} + ) + with target_sat.ui_session() as session: + session.ansiblevariables.create_with_overrides( + { + 'key': key, + 'description': 'this is a description', + 'ansible_role': SELECTED_ROLE, + 'parameter_type': 'integer', + 'default_value': '11', + 'validator_type': 'list', + 'validator_rule': '11, 12, 13', + 'attribute_order': 'domain \n fqdn \n hostgroup \n os', + 'matcher_section.params': [ + { + 'attribute_type': {'matcher_key': 'os', 'matcher_value': 'fedora'}, + 'value': '13', + } + ], + } + ) + assert session.ansiblevariables.search(key)[0]['Name'] == key + session.ansiblevariables.delete(key) + assert not session.ansiblevariables.search(key) + + @pytest.mark.tier2 + def test_positive_host_role_information(self, target_sat, function_host): + """Assign Ansible Role to a Host and verify that the information + in the new UI is displayed correctly + + :id: 7da913ef-3b43-4bfa-9a45-d895431c8b56 + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Assign one role to the RHEL host. + 4. Navigate to the new UI for the given Host. + 5. Select the 'Ansible' tab, then the 'Inventory' sub-tab. + + :expectedresults: Roles assigned directly to the Host are visible on the subtab. + """ + SELECTED_ROLE = 'RedHatInsights.insights-client' + + location = function_host.location.read() + organization = function_host.organization.read() + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} + ) + target_sat.cli.Host.ansible_roles_assign( + {'id': function_host.id, 'ansible-roles': SELECTED_ROLE} + ) + host_roles = function_host.list_ansible_roles() + assert host_roles[0]['name'] == SELECTED_ROLE + with target_sat.ui_session() as session: + session.organization.select(organization.name) + session.location.select(location.name) + ansible_roles_table = session.host_new.get_ansible_roles(function_host.name) + assert ansible_roles_table[0]['Name'] == SELECTED_ROLE + all_assigned_roles_table = session.host_new.get_ansible_roles_modal(function_host.name) + assert all_assigned_roles_table[0]['Name'] == SELECTED_ROLE + + @pytest.mark.rhel_ver_match('8') + def test_positive_assign_ansible_role_variable_on_host( + self, + request, + target_sat, + rhel_contenthost, + module_activation_key, + module_org, + module_location, + ): + """Verify ansible variable is added to the role and attached to the host. + + :id: 7ec4fe19-5a08-4b10-bb4e-7327dd68699a + + :BZ: 2170727 + + :customerscenario: true + + :steps: + 1. Create an Ansible variable with array type and set the default value. + 2. Enable both 'Merge Overrides' and 'Merge Default'. + 3. Add the variable to a role and attach the role to the host. + 4. Verify that ansible role and variable is added to the host. + + :expectedresults: The role and variable is successfully added to the host. + """ + + @request.addfinalizer + def _finalize(): + result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) + assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] + + key = gen_string('alpha') + SELECTED_ROLE = 'redhat.satellite.activation_keys' + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} ) - assert session.ansiblevariables.search(key)[0]['Name'] == key - session.ansiblevariables.delete(key) - assert not session.ansiblevariables.search(key) + command = target_sat.api.RegistrationCommand( + organization=module_org, + location=module_location, + activation_keys=[module_activation_key.name], + ).create() + result = rhel_contenthost.execute(command) + assert result.status == 0, f'Failed to register host: {result.stderr}' + target_host = rhel_contenthost.nailgun_host + default_value = '[\"test\"]' + parameter_type = 'array' + with target_sat.ui_session() as session: + session.organization.select(org_name=module_org.name) + session.location.select(loc_name=module_location.name) + session.ansiblevariables.create_with_overrides( + { + 'key': key, + 'ansible_role': SELECTED_ROLE, + 'override': 'true', + 'parameter_type': parameter_type, + 'default_value': default_value, + 'validator_type': None, + 'attribute_order': 'domain \n fqdn \n hostgroup \n os', + 'merge_default': 'true', + 'merge_overrides': 'true', + 'matcher_section.params': [ + { + 'attribute_type': {'matcher_key': 'os', 'matcher_value': 'fedora'}, + 'value': '[\'13\']', + } + ], + } + ) + result = target_sat.cli.Host.ansible_roles_assign( + {'id': target_host.id, 'ansible-roles': SELECTED_ROLE} + ) + assert 'Ansible roles were assigned' in result[0]['message'] + values = session.host_new.get_details(rhel_contenthost.hostname, 'ansible')['ansible'][ + 'variables' + ]['table'] + assert (key, SELECTED_ROLE, default_value, parameter_type) in [ + (var['Name'], var['Ansible role'], var['Value'], var['Type']) for var in values + ] + + @pytest.mark.stubbed + @pytest.mark.tier2 + def test_positive_role_variable_information(self): + """Create and assign variables to an Ansible Role and verify that the information in + the new UI is displayed correctly + + :id: 4ab2813a-6b83-4907-b104-0473465814f5 + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Create a host group and assign one of the Ansible roles to the host group. + 4. Assign the host to the host group. + 5. Assign one roles to the RHEL host. + 6. Create a variable and associate it with the role assigned to the Host. + 7. Create a variable and associate it with the role assigned to the Hostgroup. + 8. Navigate to the new UI for the given Host. + 9. Select the 'Ansible' tab, then the 'Variables' sub-tab. + + :expectedresults: The variables information for the given Host is visible. + """ + + @pytest.mark.stubbed + @pytest.mark.tier2 + def test_positive_assign_role_in_new_ui(self): + """Using the new Host UI, assign a role to a Host + + :id: 044f38b4-cff2-4ddc-b93c-7e9f2826d00d + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Navigate to the new UI for the given Host. + 4. Select the 'Ansible' tab + 5. Click the 'Assign Ansible Roles' button. + 6. Using the popup, assign a role to the Host. + + :expectedresults: The Role is successfully assigned to the Host, and visible on the UI + """ + + @pytest.mark.stubbed + @pytest.mark.tier2 + def test_positive_remove_role_in_new_ui(self): + """Using the new Host UI, remove the role(s) of a Host + + :id: d6de5130-45f6-4349-b490-fbde2aed082c + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Assign a role to the host. + 4. Navigate to the new UI for the given Host. + 5. Select the 'Ansible' tab + 6. Click the 'Edit Ansible roles' button. + 7. Using the popup, remove the assigned role from the Host. + + :expectedresults: Role is successfully removed from the Host, and not visible on the UI + """ + + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_ansible_config_report_failed_tasks_errors(self): + """Check that failed Ansible tasks show as errors in the config report + + :id: 1a91e534-143f-4f35-953a-7ad8b7d2ddf3 + + :steps: + 1. Import Ansible roles + 2. Assign Ansible roles to a host + 3. Run Ansible roles on host + + :expectedresults: Verify that any task failures are listed as errors in the config report + + :CaseAutomation: NotAutomated + """ + + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_ansible_config_report_changes_notice(self): + """Check that Ansible tasks that make changes on a host show as notice in the config report + + :id: 8c90f179-8b70-4932-a477-75dc3566c437 + + :steps: + 1. Import Ansible Roles + 2. Assign Ansible roles to a host + 3. Run Ansible Roles on a host + :expectedresults: Verify that any tasks that make changes on the host + are listed as notice in the config report -def test_positive_create_variable_with_overrides(target_sat): - """Create an Ansible variable with all values populated. + :CaseAutomation: NotAutomated + """ - :id: 90acea37-4c2f-42e5-92a6-0c88148f4fb6 + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_ansible_variables_imported_with_roles(self): + """Verify that, when Ansible roles are imported, their variables are imported simultaneously - :steps: + :id: 107c53e8-5a8a-4291-bbde-fbd66a0bb85e - 1. Import Ansible roles if none have been imported yet. - 2. Create an Anible variable, populating all fields on the creation form. - 3. Verify that the Ansible variable was created successfully. + :steps: + 1. Import Ansible roles + 2. Navigate to Configure > Variables - :expectedresults: The variable is successfully created. - """ - key = gen_string('alpha') - - SELECTED_ROLE = 'redhat.satellite.activation_keys' - proxy_id = target_sat.nailgun_smart_proxy.id - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) - with target_sat.ui_session() as session: - session.ansiblevariables.create_with_overrides( - { - 'key': key, - 'description': 'this is a description', - 'ansible_role': SELECTED_ROLE, - 'parameter_type': 'integer', - 'default_value': '11', - 'validator_type': 'list', - 'validator_rule': '11, 12, 13', - 'attribute_order': 'domain \n fqdn \n hostgroup \n os', - 'matcher_section.params': [ - { - 'attribute_type': {'matcher_key': 'os', 'matcher_value': 'fedora'}, - 'value': '13', - } - ], - } - ) - assert session.ansiblevariables.search(key)[0]['Name'] == key + :expectedresults: Verify that any variables in the role were also imported to Satellite + :CaseAutomation: NotAutomated + """ -@pytest.mark.pit_server -@pytest.mark.no_containers -@pytest.mark.rhel_ver_match('[^6]') -def test_positive_config_report_ansible(session, target_sat, module_org, rhel_contenthost): - """Test Config Report generation with Ansible Jobs. + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_ansible_roles_ignore_list(self): + """Verify that the ignore list setting prevents selected roles from being available for import - :id: 118e25e5-409e-44ba-b908-217da9722576 + :id: 6fa1d8f0-b583-4a07-88eb-c9ae7fcd0219 - :steps: - 1. Register a content host with satellite - 2. Import a role into satellite - 3. Assign that role to a host - 4. Assert that the role was assigned to the host successfully - 5. Run the Ansible playbook associated with that role - 6. Check if the report is created successfully + :steps: + 1. Add roles to the ignore list in Administer > Settings > Ansible + 2. Navigate to Configure > Roles - :expectedresults: - 1. Host should be assigned the proper role. - 2. Job report should be created. + :expectedresults: Verify that any roles on the ignore list are not available for import - :CaseComponent: Ansible-RemoteExecution - """ - SELECTED_ROLE = 'RedHatInsights.insights-client' - if rhel_contenthost.os_version.major <= 7: - rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) - assert rhel_contenthost.execute('yum install -y insights-client').status == 0 - rhel_contenthost.install_katello_ca(target_sat) - rhel_contenthost.register_contenthost(module_org.label, force=True) - assert rhel_contenthost.subscribed - rhel_contenthost.add_rex_key(satellite=target_sat) - id = target_sat.nailgun_smart_proxy.id - target_host = rhel_contenthost.nailgun_host - target_sat.api.AnsibleRoles().sync(data={'proxy_id': id, 'role_names': [SELECTED_ROLE]}) - target_sat.cli.Host.ansible_roles_assign({'id': target_host.id, 'ansible-roles': SELECTED_ROLE}) - host_roles = target_host.list_ansible_roles() - assert host_roles[0]['name'] == SELECTED_ROLE - template_id = ( - target_sat.api.JobTemplate() - .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] - .id - ) - job = target_sat.api.JobInvocation().run( - synchronous=False, - data={ - 'job_template_id': template_id, - 'targeting_type': 'static_query', - 'search_query': f'name = {rhel_contenthost.hostname}', - }, - ) - target_sat.wait_for_tasks( - f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 - ) - result = target_sat.api.JobInvocation(id=job['id']).read() - assert result.succeeded == 1 - with session: - session.location.select(constants.DEFAULT_LOC) - assert session.host.search(target_host.name)[0]['Name'] == rhel_contenthost.hostname - session.configreport.search(rhel_contenthost.hostname) - session.configreport.delete(rhel_contenthost.hostname) - assert len(session.configreport.read()['table']) == 0 - - -@pytest.mark.no_containers -@pytest.mark.rhel_ver_match('9') -def test_positive_ansible_custom_role(target_sat, session, module_org, rhel_contenthost, request): - """ - Test Config report generation with Custom Ansible Role + :CaseAutomation: NotAutomated + """ - :id: 3551068a-ccfc-481c-b7ec-8fe2b8a802bf + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_ansible_variables_installed_with_collection(self): + """Verify that installing an Ansible collection also imports + any variables associated with the collection - :customerscenario: true + :id: 7ff88022-fe9b-482f-a6bb-3922036a1e1c - :steps: - 1. Register a content host with satellite - 2. Create a custom role and import into satellite - 3. Assign that role to a host - 4. Assert that the role was assigned to the host successfully - 5. Run the Ansible playbook associated with that role - 6. Check if the report is created successfully + :steps: + 1. Install an Ansible collection + 2. Navigate to Configure > Variables - :expectedresults: - 1. Config report should be generated for a custom role run. + :expectedresults: Verify that any variables associated with the collection + are present on Configure > Variables - :BZ: 2155392 + :CaseAutomation: NotAutomated + """ - :CaseComponent: Ansible-RemoteExecution - """ + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_set_ansible_role_order_per_host(self): + """Verify that role run order can be set and this order is respected when roles are run - @request.addfinalizer - def _finalize(): - result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) - assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] - target_sat.execute('rm -rvf /etc/ansible/roles/custom_role') - - SELECTED_ROLE = 'custom_role' - playbook = f'{robottelo_tmp_dir}/playbook.yml' - data = { - 'name': 'Copy ssh keys', - 'copy': { - 'src': '/var/lib/foreman-proxy/ssh/{{ item }}', - 'dest': '/root/.ssh', - 'owner': 'root', - "group": 'root', - 'mode': '0400', - }, - 'with_items': ['id_rsa_foreman_proxy.pub', 'id_rsa_foreman_proxy'], - } - with open(playbook, 'w') as f: - yaml.dump(data, f, sort_keys=False, default_flow_style=False) - target_sat.execute('mkdir /etc/ansible/roles/custom_role') - target_sat.put(playbook, '/etc/ansible/roles/custom_role/playbook.yaml') - rhel_contenthost.install_katello_ca(target_sat) - rhel_contenthost.register_contenthost(module_org.label, force=True) - assert rhel_contenthost.subscribed - rhel_contenthost.add_rex_key(satellite=target_sat) - proxy_id = target_sat.nailgun_smart_proxy.id - target_host = rhel_contenthost.nailgun_host - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) - target_sat.cli.Host.ansible_roles_assign({'id': target_host.id, 'ansible-roles': SELECTED_ROLE}) - host_roles = target_host.list_ansible_roles() - assert host_roles[0]['name'] == SELECTED_ROLE - - template_id = ( - target_sat.api.JobTemplate() - .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] - .id - ) - job = target_sat.api.JobInvocation().run( - synchronous=False, - data={ - 'job_template_id': template_id, - 'targeting_type': 'static_query', - 'search_query': f'name = {rhel_contenthost.hostname}', - }, - ) - target_sat.wait_for_tasks( - f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 - ) - result = target_sat.api.JobInvocation(id=job['id']).read() - assert result.succeeded == 1 - with session: - session.location.select(constants.DEFAULT_LOC) - assert session.host.search(target_host.name)[0]['Name'] == rhel_contenthost.hostname - session.configreport.search(rhel_contenthost.hostname) - session.configreport.delete(rhel_contenthost.hostname) - assert len(session.configreport.read()['table']) == 0 - - -@pytest.mark.tier2 -def test_positive_host_role_information(target_sat, function_host): - """Assign Ansible Role to a Host and verify that the information - in the new UI is displayed correctly - - :id: 7da913ef-3b43-4bfa-9a45-d895431c8b56 - - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Assign one role to the RHEL host. - 4. Navigate to the new UI for the given Host. - 5. Select the 'Ansible' tab, then the 'Inventory' sub-tab. - - :expectedresults: Roles assigned directly to the Host are visible on the subtab. - """ - SELECTED_ROLE = 'RedHatInsights.insights-client' - - location = function_host.location.read() - organization = function_host.organization.read() - proxy_id = target_sat.nailgun_smart_proxy.id - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) - target_sat.cli.Host.ansible_roles_assign( - {'id': function_host.id, 'ansible-roles': SELECTED_ROLE} - ) - host_roles = function_host.list_ansible_roles() - assert host_roles[0]['name'] == SELECTED_ROLE - with target_sat.ui_session() as session: - session.location.select(location.name) - session.organization.select(organization.name) - ansible_roles_table = session.host_new.get_ansible_roles(function_host.name) - assert ansible_roles_table[0]["Name"] == SELECTED_ROLE - all_assigned_roles_table = session.host_new.get_ansible_roles_modal(function_host.name) - assert all_assigned_roles_table[0]["Name"] == SELECTED_ROLE - - -@pytest.mark.rhel_ver_match('8') -def test_positive_assign_ansible_role_variable_on_host( - target_sat, rhel_contenthost, module_activation_key, module_org, module_location, request -): - """Verify ansible variable is added to the role and attached to the host. - - :id: 7ec4fe19-5a08-4b10-bb4e-7327dd68699a - - :BZ: 2170727 - - :customerscenario: true - - :steps: - - 1. Create an Ansible variable with array type and set the default value. - 2. Enable both 'Merge Overrides' and 'Merge Default'. - 3. Add the variable to a role and attach the role to the host. - 4. Verify that ansible role and variable is added to the host. - - :expectedresults: The role and variable is successfully added to the host. - """ + :id: 24fbcd60-7cd1-46ff-86ac-16d6b436202c - @request.addfinalizer - def _finalize(): - result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) - assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] - - key = gen_string('alpha') - SELECTED_ROLE = 'redhat.satellite.activation_keys' - proxy_id = target_sat.nailgun_smart_proxy.id - target_sat.api.AnsibleRoles().sync(data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]}) - command = target_sat.api.RegistrationCommand( - organization=module_org, - location=module_location, - activation_keys=[module_activation_key.name], - ).create() - result = rhel_contenthost.execute(command) - assert result.status == 0, f'Failed to register host: {result.stderr}' - target_host = rhel_contenthost.nailgun_host - default_value = '[\"test\"]' - parameter_type = 'array' - with target_sat.ui_session() as session: - session.organization.select(org_name=module_org.name) - session.location.select(loc_name=module_location.name) - session.ansiblevariables.create_with_overrides( - { - 'key': key, - 'ansible_role': SELECTED_ROLE, - 'override': 'true', - 'parameter_type': parameter_type, - 'default_value': default_value, - 'validator_type': None, - 'attribute_order': 'domain \n fqdn \n hostgroup \n os', - 'merge_default': 'true', - 'merge_overrides': 'true', - 'matcher_section.params': [ - { - 'attribute_type': {'matcher_key': 'os', 'matcher_value': 'fedora'}, - 'value': '[\'13\']', - } - ], - } - ) - result = target_sat.cli.Host.ansible_roles_assign( - {'id': target_host.id, 'ansible-roles': SELECTED_ROLE} - ) - assert 'Ansible roles were assigned' in result[0]['message'] - values = session.host_new.get_details(rhel_contenthost.hostname, 'ansible')['ansible'][ - 'variables' - ]['table'] - assert (key, SELECTED_ROLE, default_value, parameter_type) in [ - (var['Name'], var['Ansible role'], var['Value'], var['Type']) for var in values - ] - - -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_role_variable_information(self): - """Create and assign variables to an Ansible Role and verify that the information in - the new UI is displayed correctly - - :id: 4ab2813a-6b83-4907-b104-0473465814f5 - - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Create a host group and assign one of the Ansible roles to the host group. - 4. Assign the host to the host group. - 5. Assign one roles to the RHEL host. - 6. Create a variable and associate it with the role assigned to the Host. - 7. Create a variable and associate it with the role assigned to the Hostgroup. - 8. Navigate to the new UI for the given Host. - 9. Select the 'Ansible' tab, then the 'Variables' sub-tab. - - :expectedresults: The variables information for the given Host is visible. - """ + :steps: + 1. Enable a host for remote execution + 2. Navigate to Hosts > All Hosts > $hostname > Edit > Ansible Roles + 3. Assign more than one role to the host + 4. Use the drag-and-drop mechanism to change the order of the roles + 5. Run Ansible roles on the host + :expectedresults: The roles are run in the specified order -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_assign_role_in_new_ui(self): - """Using the new Host UI, assign a role to a Host + :CaseAutomation: NotAutomated + """ - :id: 044f38b4-cff2-4ddc-b93c-7e9f2826d00d + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_set_ansible_role_order_per_hostgroup(self): + """Verify that role run order can be set and that this order is respected when roles are run - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Navigate to the new UI for the given Host. - 4. Select the 'Ansible' tab - 5. Click the 'Assign Ansible Roles' button. - 6. Using the popup, assign a role to the Host. + :id: 9eb5bc8e-081a-45b9-8751-f4220c944da6 - :expectedresults: The Role is successfully assigned to the Host, and shows up on the UI - """ + :steps: + 1. Enable a host for remote execution + 2. Create a host group + 3. Navigate to Configure > Host Groups > $hostgroup > Ansible Roles + 4. Assign more than one role to the host group + 5. Use the drag-and-drop mechanism to change the order of the roles + 6. Add the host to the host group + 7. Run Ansible roles on the host group + :expectedresults: The roles are run in the specified order -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_remove_role_in_new_ui(self): - """Using the new Host UI, remove the role(s) of a Host + :CaseAutomation: NotAutomated + """ - :id: d6de5130-45f6-4349-b490-fbde2aed082c - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Assign a role to the host. - 4. Navigate to the new UI for the given Host. - 5. Select the 'Ansible' tab - 6. Click the 'Edit Ansible roles' button. - 7. Using the popup, remove the assigned role from the Host. +class TestAnsibleREX: + """Test class for remote execution via Ansible - :expectedresults: The Role is successfully removed from the Host, and no longer shows - up on the UI + :CaseComponent: Ansible-RemoteExecution """ + + @pytest.mark.tier2 + @pytest.mark.pit_server + @pytest.mark.no_containers + @pytest.mark.rhel_ver_match('[^6]') + def test_positive_config_report_ansible( + self, target_sat, module_org, module_ak_with_cv, rhel_contenthost + ): + """Test Config Report generation with Ansible Jobs. + + :id: 118e25e5-409e-44ba-b908-217da9722576 + + :steps: + 1. Register a content host with satellite + 2. Import a role into satellite + 3. Assign that role to a host + 4. Assert that the role was assigned to the host successfully + 5. Run the Ansible playbook associated with that role + 6. Check if the report is created successfully + + :expectedresults: + 1. Host should be assigned the proper role. + 2. Job report should be created. + """ + SELECTED_ROLE = 'RedHatInsights.insights-client' + if rhel_contenthost.os_version.major <= 7: + rhel_contenthost.create_custom_repos(rhel7=settings.repos.rhel7_os) + assert rhel_contenthost.execute('yum install -y insights-client').status == 0 + result = rhel_contenthost.register(module_org, None, module_ak_with_cv.name, target_sat) + assert result.status == 0, f'Failed to register host: {result.stderr}' + id = target_sat.nailgun_smart_proxy.id + target_host = rhel_contenthost.nailgun_host + target_sat.api.AnsibleRoles().sync(data={'proxy_id': id, 'role_names': [SELECTED_ROLE]}) + target_sat.cli.Host.ansible_roles_assign( + {'id': target_host.id, 'ansible-roles': SELECTED_ROLE} + ) + host_roles = target_host.list_ansible_roles() + assert host_roles[0]['name'] == SELECTED_ROLE + template_id = ( + target_sat.api.JobTemplate() + .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] + .id + ) + job = target_sat.api.JobInvocation().run( + synchronous=False, + data={ + 'job_template_id': template_id, + 'targeting_type': 'static_query', + 'search_query': f'name = {rhel_contenthost.hostname}', + }, + ) + target_sat.wait_for_tasks( + f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 + ) + result = target_sat.api.JobInvocation(id=job['id']).read() + assert result.succeeded == 1 + with target_sat.ui_session() as session: + session.organization.select(module_org.name) + session.location.select(constants.DEFAULT_LOC) + assert session.host.search(target_host.name)[0]['Name'] == rhel_contenthost.hostname + session.configreport.search(rhel_contenthost.hostname) + session.configreport.delete(rhel_contenthost.hostname) + assert len(session.configreport.read()['table']) == 0 + + @pytest.mark.no_containers + @pytest.mark.rhel_ver_match('9') + def test_positive_ansible_custom_role( + self, target_sat, module_org, module_ak_with_cv, rhel_contenthost, request + ): + """ + Test Config report generation with Custom Ansible Role + + :id: 3551068a-ccfc-481c-b7ec-8fe2b8a802bf + + :steps: + 1. Register a content host with satellite + 2. Create a custom role and import into satellite + 3. Assign that role to a host + 4. Assert that the role was assigned to the host successfully + 5. Run the Ansible playbook associated with that role + 6. Check if the report is created successfully + + :expectedresults: + 1. Config report should be generated for a custom role run. + + :BZ: 2155392 + + :customerscenario: true + """ + + @request.addfinalizer + def _finalize(): + result = target_sat.cli.Ansible.roles_delete({'name': SELECTED_ROLE}) + assert f'Ansible role [{SELECTED_ROLE}] was deleted.' in result[0]['message'] + target_sat.execute('rm -rvf /etc/ansible/roles/custom_role') + + SELECTED_ROLE = 'custom_role' + playbook = f'{robottelo_tmp_dir}/playbook.yml' + data = { + 'name': 'Copy ssh keys', + 'copy': { + 'src': '/var/lib/foreman-proxy/ssh/{{ item }}', + 'dest': '/root/.ssh', + 'owner': 'root', + "group": 'root', + 'mode': '0400', + }, + 'with_items': ['id_rsa_foreman_proxy.pub', 'id_rsa_foreman_proxy'], + } + with open(playbook, 'w') as f: + yaml.dump(data, f, sort_keys=False, default_flow_style=False) + target_sat.execute('mkdir /etc/ansible/roles/custom_role') + target_sat.put(playbook, '/etc/ansible/roles/custom_role/playbook.yaml') + + result = rhel_contenthost.register(module_org, None, module_ak_with_cv.name, target_sat) + assert result.status == 0, f'Failed to register host: {result.stderr}' + proxy_id = target_sat.nailgun_smart_proxy.id + target_host = rhel_contenthost.nailgun_host + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} + ) + target_sat.cli.Host.ansible_roles_assign( + {'id': target_host.id, 'ansible-roles': SELECTED_ROLE} + ) + host_roles = target_host.list_ansible_roles() + assert host_roles[0]['name'] == SELECTED_ROLE + + template_id = ( + target_sat.api.JobTemplate() + .search(query={'search': 'name="Ansible Roles - Ansible Default"'})[0] + .id + ) + job = target_sat.api.JobInvocation().run( + synchronous=False, + data={ + 'job_template_id': template_id, + 'targeting_type': 'static_query', + 'search_query': f'name = {rhel_contenthost.hostname}', + }, + ) + target_sat.wait_for_tasks( + f'resource_type = JobInvocation and resource_id = {job["id"]}', poll_timeout=1000 + ) + result = target_sat.api.JobInvocation(id=job['id']).read() + assert result.succeeded == 1 + with target_sat.ui_session() as session: + session.organization.select(module_org.name) + session.location.select(constants.DEFAULT_LOC) + assert session.host.search(target_host.name)[0]['Name'] == rhel_contenthost.hostname + session.configreport.search(rhel_contenthost.hostname) + session.configreport.delete(rhel_contenthost.hostname) + assert len(session.configreport.read()['table']) == 0 + + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_ansible_job_check_mode(self): + """Run a job on a host with enable_roles_check_mode parameter enabled + + :id: 7aeb7253-e555-4e28-977f-71f16d3c32e2 + + :steps: + 1. Set the value of the ansible_roles_check_mode parameter to true on a host + 2. Associate one or more Ansible roles with the host + 3. Run Ansible roles against the host + + :expectedresults: Verify that the roles were run in check mode + (i.e. no changes were made on the host) + + :CaseAutomation: NotAutomated + """ + + @pytest.mark.stubbed + @pytest.mark.tier3 + def test_positive_install_ansible_collection_via_job_invocation(self): + """Verify that Ansible collections can be installed on hosts via job invocations + + :id: d4096aef-f6fc-41b6-ae56-d19b1f49cd42 + + :steps: + 1. Enable a host for remote execution + 2. Navigate to Hosts > Schedule Remote Job + 3. Select "Ansible Galaxy" as the job category + 4. Select "Ansible Collection - Install from Galaxy" as the job template + 5. Enter a collection in the ansible_collections_list field + 6. Click "Submit" + + :expectedresults: The Ansible collection is successfully installed on the host + + :CaseAutomation: NotAutomated + """ + + @pytest.mark.stubbed + @pytest.mark.tier2 + def test_positive_schedule_recurring_host_job(self): + """Using the new Host UI, schedule a recurring job on a Host + + :id: 5052be04-28ab-4349-8bee-851ef76e4ffa + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Assign a role to host. + 4. Navigate to the new UI for the given Host. + 5. Select the Jobs subtab. + 6. Click the Schedule Recurring Job button, and using the popup, schedule a + recurring Job. + 7. Navigate to Job Invocations. + + :expectedresults: Scheduled Job appears in the Job Invocation list at the appointed time + """ + + @pytest.mark.stubbed + @pytest.mark.tier2 + def test_positive_schedule_recurring_hostgroup_job(self): + """Using the new recurring job scheduler, schedule a recurring job on a Hostgroup + + :id: c65db99b-11fe-4a32-89d0-0a4692b07efe + + :steps: + 1. Register a RHEL host to Satellite. + 2. Import all roles available by default. + 3. Assign a role to host. + 4. Navigate to the Host Group page. + 5. Select the "Configure Ansible Job" action. + 6. Click the Schedule Recurring Job button, and using the popup, schedule a + recurring Job. + 7. Navigate to Job Invocations. + + :expectedresults: Scheduled Job appears in the Job Invocation list at the appointed time + """ diff --git a/tests/foreman/ui/test_remoteexecution.py b/tests/foreman/ui/test_remoteexecution.py index bb82cd80ebf..e34f49772af 100644 --- a/tests/foreman/ui/test_remoteexecution.py +++ b/tests/foreman/ui/test_remoteexecution.py @@ -386,271 +386,3 @@ def test_positive_run_scheduled_job_template_by_ip(session, module_org, rex_cont assert job_status['overview']['job_status'] == 'Success' assert job_status['overview']['hosts_table'][0]['Host'] == hostname assert job_status['overview']['hosts_table'][0]['Status'] == 'success' - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_ansible_job_check_mode(session): - """Run a job on a host with enable_roles_check_mode parameter enabled - - :id: 7aeb7253-e555-4e28-977f-71f16d3c32e2 - - :steps: - - 1. Set the value of the ansible_roles_check_mode parameter to true on a host - 2. Associate one or more Ansible roles with the host - 3. Run Ansible roles against the host - - :expectedresults: Verify that the roles were run in check mode - (i.e. no changes were made on the host) - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-RemoteExecution - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_ansible_config_report_failed_tasks_errors(session): - """Check that failed Ansible tasks show as errors in the config report - - :id: 1a91e534-143f-4f35-953a-7ad8b7d2ddf3 - - :steps: - - 1. Import Ansible roles - 2. Assign Ansible roles to a host - 3. Run Ansible roles on host - - :expectedresults: Verify that any task failures are listed as errors in the config report - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_ansible_config_report_changes_notice(session): - """Check that Ansible tasks that make changes on a host show as notice in the config report - - :id: 8c90f179-8b70-4932-a477-75dc3566c437 - - :steps: - - 1. Import Ansible Roles - 2. Assign Ansible roles to a host - 3. Run Ansible Roles on a host - - :expectedresults: Verify that any tasks that make changes on the host - are listed as notice in the config report - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_ansible_variables_imported_with_roles(session): - """Verify that, when Ansible roles are imported, their variables are imported simultaneously - - :id: 107c53e8-5a8a-4291-bbde-fbd66a0bb85e - - :steps: - - 1. Import Ansible roles - - :expectedresults: Verify that any variables in the role were also imported to Satellite - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_ansible_roles_ignore_list(session): - """Verify that the ignore list setting prevents selected roles from being available for import - - :id: 6fa1d8f0-b583-4a07-88eb-c9ae7fcd0219 - - :steps: - - 1. Add roles to the ignore list in Administer > Settings > Ansible - 2. Navigate to Configure > Roles - - :expectedresults: Verify that any roles on the ignore list are not available for import - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_ansible_variables_installed_with_collection(session): - """Verify that installing an Ansible collection also imports - any variables associated with the collection - - :id: 7ff88022-fe9b-482f-a6bb-3922036a1e1c - - :steps: - - 1. Install an Ansible collection - 2. Navigate to Configure > Variables - - :expectedresults: Verify that any variables associated with the collection - are present on Configure > Variables - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_install_ansible_collection_via_job_invocation(session): - """Verify that Ansible collections can be installed on hosts via job invocations - - :id: d4096aef-f6fc-41b6-ae56-d19b1f49cd42 - - :steps: - - 1. Enable a host for remote execution - 2. Navigate to Hosts > Schedule Remote Job - 3. Select "Ansible Galaxy" as the job category - 4. Select "Ansible Collection - Install from Galaxy" as the job template - 5. Enter a collection in the ansible_collections_list field - 6. Click "Submit" - - :expectedresults: The Ansible collection is successfully installed on the host - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-RemoteExecution - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_set_ansible_role_order_per_host(session): - """Verify that role run order can be set and that this order is respected when roles are run - - :id: 24fbcd60-7cd1-46ff-86ac-16d6b436202c - - :steps: - - 1. Enable a host for remote execution - 2. Navigate to Hosts > All Hosts > $hostname > Edit > Ansible Roles - 3. Assign more than one role to the host - 4. Use the drag-and-drop mechanism to change the order of the roles - 5. Run Ansible roles on the host - - :expectedresults: The roles are run in the specified order - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier3 -def test_positive_set_ansible_role_order_per_hostgroup(session): - """Verify that role run order can be set and that this order is respected when roles are run - - :id: 9eb5bc8e-081a-45b9-8751-f4220c944da6 - - :steps: - - 1. Enable a host for remote execution - 2. Create a host group - 3. Navigate to Configure > Host Groups > $hostgroup > Ansible Roles - 4. Assign more than one role to the host group - 5. Use the drag-and-drop mechanism to change the order of the roles - 6. Add the host to the host group - 7. Run Ansible roles on the host group - - :expectedresults: The roles are run in the specified order - - :CaseAutomation: NotAutomated - - :CaseComponent: Ansible-ConfigurationManagement - - :Team: Rocket - """ - - -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_schedule_recurring_host_job(self): - """Using the new Host UI, schedule a recurring job on a Host - - :id: 5052be04-28ab-4349-8bee-851ef76e4ffa - - :caseComponent: Ansible-RemoteExecution - - :Team: Rocket - - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Assign a role to host. - 4. Navigate to the new UI for the given Host. - 5. Select the Jobs subtab. - 6. Click the Schedule Recurring Job button, and using the popup, schedule a - recurring Job. - 7. Navigate to Job Invocations. - - :expectedresults: The scheduled Job appears in the Job Invocation list at the appointed - time - """ - - -@pytest.mark.stubbed -@pytest.mark.tier2 -def test_positive_schedule_recurring_hostgroup_job(self): - """Using the new recurring job scheduler, schedule a recurring job on a Hostgroup - - :id: c65db99b-11fe-4a32-89d0-0a4692b07efe - - :caseComponent: Ansible-RemoteExecution - - :Team: Rocket - - :steps: - 1. Register a RHEL host to Satellite. - 2. Import all roles available by default. - 3. Assign a role to host. - 4. Navigate to the Host Group page. - 5. Select the "Configure Ansible Job" action. - 6. Click the Schedule Recurring Job button, and using the popup, schedule a - recurring Job. - 7. Navigate to Job Invocations. - - :expectedresults: The scheduled Job appears in the Job Invocation list at the appointed - time - """ From 77357537603657467a07b3b44664e6207d79e34f Mon Sep 17 00:00:00 2001 From: vijay sawant Date: Thu, 11 Apr 2024 15:44:11 +0530 Subject: [PATCH 105/150] comp audit - use global registration method (#14738) --- tests/foreman/cli/test_repository.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/foreman/cli/test_repository.py b/tests/foreman/cli/test_repository.py index 4a70086781f..7120bedf34c 100644 --- a/tests/foreman/cli/test_repository.py +++ b/tests/foreman/cli/test_repository.py @@ -2006,8 +2006,7 @@ def test_positive_accessible_content_status( :CaseImportance: Critical """ - rhel7_contenthost.install_katello_ca(target_sat) - rhel7_contenthost.register_contenthost(module_org.label, module_ak_with_synced_repo['name']) + rhel7_contenthost.register(module_org, None, module_ak_with_synced_repo['name'], target_sat) assert rhel7_contenthost.subscribed rhel7_contenthost.run('yum repolist') access_log = target_sat.execute( From ac18e5124ee26929b00b13f05befdbdc67e3b3ed Mon Sep 17 00:00:00 2001 From: David Moore <109112035+damoore044@users.noreply.github.com> Date: Thu, 11 Apr 2024 10:30:52 -0400 Subject: [PATCH 106/150] [RFE] Should not be able to publish the content-view, while repository sync in-progress (#14677) [RFE] Should not be able to publish the content-view, while repository sync in-progress. --- tests/foreman/api/test_contentview.py | 49 +++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/foreman/api/test_contentview.py b/tests/foreman/api/test_contentview.py index c822234a628..2cbeaf50860 100644 --- a/tests/foreman/api/test_contentview.py +++ b/tests/foreman/api/test_contentview.py @@ -11,6 +11,7 @@ :CaseImportance: High """ +from datetime import datetime, timedelta import random from fauxfactory import gen_integer, gen_string, gen_utf8 @@ -532,6 +533,54 @@ def test_positive_add_to_composite(self, content_view, module_org, module_target # composite CV → CV version → CV == CV assert composite_cv.component[0].read().content_view.id == content_view.id + @pytest.mark.tier2 + def test_negative_publish_during_repo_sync(self, content_view, module_target_sat): + """Attempt to publish a new version of the content-view, + while an associated repository is being synced. + + :id: c272fff7-a679-4844-a261-80830cdd5694 + + :BZ: 1957144 + + :steps: + 1. Add repository to content-view + 2. Perform asynchronous repository sync + 3. Attempt to publish a version of the content-view, while repo sync ongoing. + + :expectedresults: + 1. User cannot publish during repository sync. + 2. HTTP exception raised, assert publish task failed for expected reason, + repo sync task_id found in humanized error, content-view versions unchanged. + """ + # add repository to content-view + content_view.repository = [self.yum_repo] + content_view.update(['repository']) + content_view = content_view.read() + existing_versions = content_view.version + timestamp = (datetime.utcnow() - timedelta(seconds=1)).strftime('%Y-%m-%d %H:%M') + + # perform async repository sync, while still in progress- + # attempt to publish a new version of the content view. + repo_task_id = self.yum_repo.sync(synchronous=False)['id'] + with pytest.raises(HTTPError) as InternalServerError: + content_view.publish() + assert str(content_view.id) in str(InternalServerError) + + # search for failed publish task + task_action = 'Actions::Katello::ContentView::Publish' + task_search = module_target_sat.api.ForemanTask().search( + query={'search': f'{task_action} and started_at >= "{timestamp}"'} + ) + assert len(task_search) == 1 + task_id = task_search[0].id + # task failed for expected reason + task = module_target_sat.api.ForemanTask(id=task_id).poll(must_succeed=False) + assert task['result'] == 'error' + assert len(task['humanized']['errors']) == 1 + assert repo_task_id in task['humanized']['errors'][0] + # no new versions of content view, any existing remained the same + assert content_view.read().version == existing_versions + @pytest.mark.tier2 def test_negative_add_components_to_composite( self, content_view, module_org, module_target_sat From 8eea8dcb1399574be063701b467c199bdd9e2bbb Mon Sep 17 00:00:00 2001 From: dosas Date: Thu, 11 Apr 2024 17:03:32 +0200 Subject: [PATCH 107/150] Ensure correct finalizer order (#14620) the host was not deleted before the hostgroup see: https://github.com/pytest-dev/pytest/issues/10023#issuecomment-1148514756 --- tests/foreman/api/test_parameters.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/foreman/api/test_parameters.py b/tests/foreman/api/test_parameters.py index 5d70374a546..8e2865fbb93 100644 --- a/tests/foreman/api/test_parameters.py +++ b/tests/foreman/api/test_parameters.py @@ -26,8 +26,8 @@ def test_positive_parameter_precedence_impact( :steps: 1. Create Global Parameter - 2. Create host and verify global parameter is assigned - 3. Create Host Group with parameter + 2. Create Host Group with parameter + 3. Create host and verify global parameter is assigned 4. Assign hostgroup to host created above and verify hostgroup parameter is assigned. 5. Add parameter on the host directly, and verify that this should take precedence over Host group and Global Parameter @@ -40,18 +40,21 @@ def test_positive_parameter_precedence_impact( cp = module_target_sat.api.CommonParameter(name=param_name, value=param_value).create() request.addfinalizer(cp.delete) - host = module_target_sat.api.Host(organization=module_org, location=module_location).create() - request.addfinalizer(host.delete) - result = [res for res in host.all_parameters if res['name'] == param_name] - assert result[0]['name'] == param_name - assert result[0]['associated_type'] == 'global' hg = module_target_sat.api.HostGroup( organization=[module_org], group_parameters_attributes=[{'name': param_name, 'value': param_value}], ).create() request.addfinalizer(hg.delete) + + host = module_target_sat.api.Host(organization=module_org, location=module_location).create() + request.addfinalizer(host.delete) + result = [res for res in host.all_parameters if res['name'] == param_name] + assert result[0]['name'] == param_name + assert result[0]['associated_type'] == 'global' + host.hostgroup = hg + host = host.update(['hostgroup']) result = [res for res in host.all_parameters if res['name'] == param_name] assert result[0]['name'] == param_name From 1a432dfb897d5404571036112363075865d87de0 Mon Sep 17 00:00:00 2001 From: yanpliu Date: Thu, 11 Apr 2024 14:49:01 -0400 Subject: [PATCH 108/150] content host set location to Default Location (#14497) content host set location to Default_Organization --- tests/foreman/virtwho/ui/test_esx_sca.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/foreman/virtwho/ui/test_esx_sca.py b/tests/foreman/virtwho/ui/test_esx_sca.py index a4c45dd4960..3656ba09038 100644 --- a/tests/foreman/virtwho/ui/test_esx_sca.py +++ b/tests/foreman/virtwho/ui/test_esx_sca.py @@ -243,7 +243,12 @@ def test_positive_filtering_option( @pytest.mark.tier2 def test_positive_last_checkin_status( - self, module_sca_manifest_org, virtwho_config_ui, form_data_ui, org_session + self, + module_sca_manifest_org, + virtwho_config_ui, + form_data_ui, + org_session, + default_location, ): """Verify the Last Checkin status on Content Hosts Page. @@ -265,6 +270,7 @@ def test_positive_last_checkin_status( ) time_now = org_session.browser.get_client_datetime() assert org_session.virtwho_configure.search(name)[0]['Status'] == 'ok' + org_session.location.select(default_location.name) checkin_time = org_session.contenthost.search(hypervisor_name)[0]['Last Checkin'] # 10 mins margin to check the Last Checkin time assert ( From e3b813764030bdc3f1a9a00f34161a0a98f993b7 Mon Sep 17 00:00:00 2001 From: Tasos Papaioannou Date: Thu, 11 Apr 2024 17:01:07 -0400 Subject: [PATCH 109/150] Fix ssh command usage (#14703) --- robottelo/cli/base.py | 2 +- tests/robottelo/test_cli.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/robottelo/cli/base.py b/robottelo/cli/base.py index 8d258500b27..d276cd741fa 100644 --- a/robottelo/cli/base.py +++ b/robottelo/cli/base.py @@ -200,7 +200,7 @@ def execute( command, ) response = ssh.command( - cmd.encode('utf-8'), + cmd, hostname=hostname or cls.hostname or settings.server.hostname, output_format=output_format, timeout=timeout, diff --git a/tests/robottelo/test_cli.py b/tests/robottelo/test_cli.py index a2568f5a584..e6d6de2dd7b 100644 --- a/tests/robottelo/test_cli.py +++ b/tests/robottelo/test_cli.py @@ -258,7 +258,7 @@ def test_execute_with_raw_response(self, settings, command): response = Base.execute('some_cmd', return_raw_response=True) ssh_cmd = 'LANG=en_US hammer -v -u admin -p password some_cmd' command.assert_called_once_with( - ssh_cmd.encode('utf-8'), + ssh_cmd, hostname=mock.ANY, output_format=None, timeout=None, @@ -277,7 +277,7 @@ def test_execute_with_performance(self, settings, command, handle_resp): response = Base.execute('some_cmd', hostname=None, output_format='json') ssh_cmd = 'LANG=en_US time -p hammer -v -u admin -p password --output=json some_cmd' command.assert_called_once_with( - ssh_cmd.encode('utf-8'), + ssh_cmd, hostname=mock.ANY, output_format='json', timeout=None, From f51bc59a4223c9289f4aee4b15335629187acf41 Mon Sep 17 00:00:00 2001 From: Lukas Pramuk Date: Fri, 12 Apr 2024 11:24:30 +0200 Subject: [PATCH 110/150] Assert installer status when enabling OpenSCAP (#14755) --- tests/foreman/api/test_capsule.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/foreman/api/test_capsule.py b/tests/foreman/api/test_capsule.py index 48dd6d4b75b..7cbb989f940 100644 --- a/tests/foreman/api/test_capsule.py +++ b/tests/foreman/api/test_capsule.py @@ -46,7 +46,8 @@ def test_positive_update_capsule(request, pytestconfig, target_sat, module_capsu # refresh features features = capsule.refresh() - module_capsule_configured.install(cmd_args=['enable-foreman-proxy-plugin-openscap']) + result = module_capsule_configured.install(cmd_args=['enable-foreman-proxy-plugin-openscap']) + assert result.status == 0, 'Installer failed when enabling OpenSCAP plugin.' features_new = capsule.refresh() assert len(features_new["features"]) == len(features["features"]) + 1 assert 'Openscap' in [feature["name"] for feature in features_new["features"]] From b0a7895d4b801ee814804e91ac27a57ee6f91b74 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Fri, 12 Apr 2024 11:42:52 +0200 Subject: [PATCH 111/150] updated hammer commands tree (#14760) --- tests/foreman/data/hammer_commands.json | 1102 ++++++++++------------- 1 file changed, 460 insertions(+), 642 deletions(-) diff --git a/tests/foreman/data/hammer_commands.json b/tests/foreman/data/hammer_commands.json index bf09ea854b1..648888532e7 100644 --- a/tests/foreman/data/hammer_commands.json +++ b/tests/foreman/data/hammer_commands.json @@ -746,7 +746,13 @@ "value": null }, { - "help": "Print help --------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------|-----|---------|----- | x | x | x | x | x | x | x | x | limit | x | x | attach | x | x | version | x | x | environment | x | x | view | x | x | collections/id | x | x | collections/name | x | x | overrides/content label | x | x | overrides/name | x | x | overrides/value | x | x | purpose/service level | x | x | purpose/purpose usage | x | x | purpose/purpose role | x | x | purpose/purpose addons | x | x | --------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Show hosts associated to an activation key", + "name": "show-hosts", + "shortname": null, + "value": "BOOLEAN" + }, + { + "help": "Print help --------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------|-----|---------|----- | x | x | x | x | x | x | x | x | limit | x | x | attach | x | x | version | x | x | environment | x | x | view | x | x | hosts/id | x | x | hosts/name | x | x | collections/id | x | x | collections/name | x | x | overrides/content label | x | x | overrides/name | x | x | overrides/value | x | x | purpose/service level | x | x | purpose/purpose usage | x | x | purpose/purpose role | x | x | purpose/purpose addons | x | x | --------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -1449,6 +1455,71 @@ } ], "subcommands": [ + { + "description": "Modify alternate content sources in bulk", + "name": "bulk", + "options": [ + { + "help": "Print help", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [ + { + "description": "Destroy alternate content sources", + "name": "destroy", + "options": [ + { + "help": "List of alternate content source ids", + "name": "ids", + "shortname": null, + "value": "LIST" + }, + { + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] + }, + { + "description": "Refresh alternate content sources", + "name": "refresh", + "options": [ + { + "help": "List of alternate content source ids", + "name": "ids", + "shortname": null, + "value": "LIST" + }, + { + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] + }, + { + "description": "Refresh all alternate content sources", + "name": "refresh-all", + "options": [ + { + "help": "Print help", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] + } + ] + }, { "description": "Create an alternate content source to download content from during repository syncing. Note: alternate content sources are global and affect ALL sync actions on their capsules regardless of organization.", "name": "create", @@ -1612,7 +1683,7 @@ "value": "VALUE" }, { - "help": "Print help ------------------------------|-----|---------|----- | ALL | DEFAULT | THIN ------------------------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | url | x | x | type | x | x | content source type | x | x | username | x | x | Subpaths/ | x | x | Products/id | x | x | Products/organization id | x | x | Products/name | x | x | Products/label | x | x | proxies/id | x | x | proxies/name | x | x | proxies/url | x | x | proxies/download policy | x | x | ------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ------------------------------|-----|---------|----- | ALL | DEFAULT | THIN ------------------------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | url | x | x | type | x | x | content source type | x | x | username | x | x | ssl | x | x | ca cert/id | x | x | ca cert/name | x | x | client cert/id | x | x | client cert/name | x | x | client key/id | x | x | client key/name | x | x | Subpaths/ | x | x | Products/id | x | x | Products/organization id | x | x | Products/name | x | x | Products/label | x | x | proxies/id | x | x | proxies/name | x | x | proxies/url | x | x | proxies/download policy | x | x | ------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -4108,7 +4179,7 @@ "value": "VALUE" }, { - "help": "Print help --------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------|-----|---------|----- | x | x | x at | x | x | name | x | x | x proxy name | x | x | name | x | x | | x | x | | x | x | | x | x | --------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string Values: compliant, incompliant, inconclusive string Values: true, false string string integer integer string string string integer string Values: host, policy datetime string string integer text string string string integer string string datetime text string text string string", + "help": "Print help --------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------|-----|---------|----- | x | x | x at | x | x | name | x | x | x proxy name | x | x | name | x | x | | x | x | | x | x | | x | x | --------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string Values: compliant, incompliant, inconclusive string Values: true, false string string integer integer string string string integer string Values: host, policy datetime lifecycle_environment string integer text string string string integer string string datetime text string text string string", "name": "help", "shortname": "h", "value": null @@ -4321,6 +4392,31 @@ ], "subcommands": [] }, + { + "description": "Authenticate against external source (IPA/PAM) with credentials", + "name": "basic-external", + "options": [ + { + "help": "Print help", + "name": "help", + "shortname": "h", + "value": null + }, + { + "help": "Password to access the remote system", + "name": "password", + "shortname": "p", + "value": "VALUE" + }, + { + "help": "Username to access the remote system you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "username", + "shortname": "u", + "value": "VALUE" + } + ], + "subcommands": [] + }, { "description": "Negotiate the login credentials from the auth ticket (Kerberos)", "name": "negotiate", @@ -6230,7 +6326,7 @@ "value": null }, { - "help": "Print help -------------------------------------------------------------------|-----|-------- | ALL | DEFAULT -------------------------------------------------------------------|-----|-------- environments/name | x | x environments/organization | x | x environments/content views/name | x | x environments/content views/composite | x | x environments/content views/last published | x | x environments/content views/content/hosts | x | x environments/content views/content/products | x | x environments/content views/content/yum repos | x | x environments/content views/content/container image repos | x | x environments/content views/content/packages | x | x environments/content views/content/package groups | x | x environments/content views/content/errata | x | x -------------------------------------------------------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ---------------------------------------------------------------------------------|-----|-------- | ALL | DEFAULT ---------------------------------------------------------------------------------|-----|-------- environments/name | x | x environments/organization | x | x environments/content views/name | x | x environments/content views/composite | x | x environments/content views/last published | x | x environments/content views/repositories/repository id | x | x environments/content views/repositories/repository name | x | x environments/content views/repositories/content counts/warning | x | x environments/content views/repositories/content counts/packages | x | x environments/content views/repositories/content counts/srpms | x | x environments/content views/repositories/content counts/module streams | x | x environments/content views/repositories/content counts/package groups | x | x environments/content views/repositories/content counts/errata | x | x environments/content views/repositories/content counts/debian packages | x | x environments/content views/repositories/content counts/container tags | x | x environments/content views/repositories/content counts/container ma... | x | x environments/content views/repositories/content counts/container ma... | x | x environments/content views/repositories/content counts/files | x | x environments/content views/repositories/content counts/ansible coll... | x | x environments/content views/repositories/content counts/ostree refs | x | x environments/content views/repositories/content counts/python packages | x | x ---------------------------------------------------------------------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -6293,6 +6389,37 @@ ], "subcommands": [] }, + { + "description": "Reclaim space from all On Demand repositories on a capsule", + "name": "reclaim-space", + "options": [ + { + "help": "Do not wait for the task", + "name": "async", + "shortname": null, + "value": null + }, + { + "help": "Id of the capsule", + "name": "id", + "shortname": null, + "value": "NUMBER" + }, + { + "help": "Name to search by", + "name": "name", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] + }, { "description": "Remove lifecycle environments from the capsule", "name": "remove-lifecycle-environment", @@ -6505,6 +6632,49 @@ } ], "subcommands": [] + }, + { + "description": "Update content counts for the capsule", + "name": "update-counts", + "options": [ + { + "help": "Do not wait for the task", + "name": "async", + "shortname": null, + "value": null + }, + { + "help": "Id of the capsule", + "name": "id", + "shortname": null, + "value": "NUMBER" + }, + { + "help": "Name to search by", + "name": "name", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Organization name", + "name": "organization", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Organization ID", + "name": "organization-id", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] } ] }, @@ -6816,7 +6986,7 @@ "value": null }, { - "help": "Print help -----------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | | x | x | | x | x | | x | x | Features/name | x | x | Features/version | x | x | Locations/ | x | x | Organizations/ | x | x | at | x | x | at | x | x | -----------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help -----------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | | x | x | | x | x | count | x | x | Features/name | x | x | Features/version | x | x | Locations/ | x | x | Organizations/ | x | x | at | x | x | at | x | x | -----------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -7523,7 +7693,7 @@ "value": null }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --interface: Libvirt: --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default OpenStack: --interface: oVirt: --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile Rackspace: --interface: VMware: --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware AzureRM: --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) GCE: --interface:", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --interface: Libvirt: --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default OpenStack: --interface: oVirt: --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile VMware: --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware AzureRM: --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) GCE: --interface:", "name": "help", "shortname": "h", "value": null @@ -7602,7 +7772,7 @@ "value": "KEY_VALUE_LIST" }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 OpenStack: --volume: oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virto or virto_scsi Rackspace: --volume: VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) GCE: --volume: size_gb Volume size in GB, integer value", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 OpenStack: --volume: oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virtio or virtio_scsi VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) GCE: --volume: size_gb Volume size in GB, integer value", "name": "help", "shortname": "h", "value": null @@ -7693,7 +7863,7 @@ "value": "KEY_VALUE_LIST" }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virto or virto_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. Rackspace: --volume: --interface: --compute-attributes: flavor_id VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virtio or virtio_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", "name": "help", "shortname": "h", "value": null @@ -7942,7 +8112,7 @@ "value": "KEY_VALUE_LIST" }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virto or virto_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. Rackspace: --volume: --interface: --compute-attributes: flavor_id VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virtio or virtio_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", "name": "help", "shortname": "h", "value": null @@ -8027,7 +8197,7 @@ "value": null }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --interface: Libvirt: --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default OpenStack: --interface: oVirt: --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile Rackspace: --interface: VMware: --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware AzureRM: --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) GCE: --interface:", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --interface: Libvirt: --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default OpenStack: --interface: oVirt: --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile VMware: --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware AzureRM: --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) GCE: --interface:", "name": "help", "shortname": "h", "value": null @@ -8112,7 +8282,7 @@ "value": "NUMBER" }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 OpenStack: --volume: oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virto or virto_scsi Rackspace: --volume: VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) GCE: --volume: size_gb Volume size in GB, integer value", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 OpenStack: --volume: oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virtio or virtio_scsi VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) GCE: --volume: size_gb Volume size in GB, integer value", "name": "help", "shortname": "h", "value": null @@ -10749,7 +10919,7 @@ "value": null }, { - "help": "Print help --------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------|-----|---------|----- | x | x | x | x | x | at | x | x | | x | x | status/applied | x | x | status/restarted | x | x | status/failed | x | x | status/restart failures | x | x | status/skipped | x | x | status/pending | x | x | metrics/config_retrieval | x | x | metrics/exec | x | x | metrics/file | x | x | metrics/package | x | x | metrics/service | x | x | metrics/user | x | x | metrics/yumrepo | x | x | metrics/filebucket | x | x | metrics/cron | x | x | metrics/total | x | x | Logs/resource | x | x | Logs/message | x | x | --------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help --------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------|-----|---------|----- | x | x | x | x | x | at | x | x | | x | x | status/applied | x | x | status/restarted | x | x | status/failed | x | x | status/restart failures | x | x | status/skipped | x | x | status/pending | x | x | metrics/config retrieval | x | x | metrics/exec | x | x | metrics/file | x | x | metrics/package | x | x | metrics/service | x | x | metrics/user | x | x | metrics/yumrepo | x | x | metrics/filebucket | x | x | metrics/cron | x | x | metrics/total | x | x | Logs/resource | x | x | Logs/message | x | x | --------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -11216,7 +11386,7 @@ "value": null }, { - "help": "Export formats. Choose syncable if content is to be imported via repository sync. Choose importable if content is to be imported via hammer content-import. Defaults to importable. Possible value(s): 'syncable', 'importable'", + "help": "Export formats.Choose syncable if the exported content needs to be in a yum format. This option is only available for yum, file repositories. Choose importable if the importing server uses the same version and exported content needs to be one of yum, file, ansible_collection, docker repositories. Possible value(s): 'syncable', 'importable'", "name": "format", "shortname": null, "value": "ENUM" @@ -11271,7 +11441,7 @@ "value": "NUMBER" }, { - "help": "Export formats. Choose syncable if content is to be imported via repository sync. Choose importable if content is to be imported via hammer content-import. Defaults to importable. Possible value(s): 'syncable', 'importable'", + "help": "Export formats.Choose syncable if the exported content needs to be in a yum format. This option is only available for yum, file repositories. Choose importable if the importing server uses the same version and exported content needs to be one of yum, file, ansible_collection, docker repositories. Possible value(s): 'syncable', 'importable'", "name": "format", "shortname": null, "value": "ENUM" @@ -11374,7 +11544,7 @@ "value": null }, { - "help": "Export formats. Choose syncable if content is to be imported via repository sync. Choose importable if content is to be imported via hammer content-import. Defaults to importable. Possible value(s): 'syncable', 'importable'", + "help": "Export formats.Choose syncable if the exported content needs to be in a yum format. This option is only available for yum, file repositories. Choose importable if the importing server uses the same version and exported content needs to be one of yum, file, ansible_collection, docker repositories. Possible value(s): 'syncable', 'importable'", "name": "format", "shortname": null, "value": "ENUM" @@ -11528,6 +11698,12 @@ "shortname": null, "value": null }, + { + "help": "Export formats.Choose syncable if the exported content needs to be in a yum format. This option is only available for yum, file repositories. Choose importable if the importing server uses the same version and exported content needs to be one of yum, file, ansible_collection, docker repositories. Possible value(s): 'syncable', 'importable'", + "name": "format", + "shortname": null, + "value": "ENUM" + }, { "help": "Export history id used for incremental export. If not provided the most recent export history will be used.", "name": "from-history-id", @@ -11583,6 +11759,12 @@ "shortname": null, "value": "NUMBER" }, + { + "help": "Export formats.Choose syncable if the exported content needs to be in a yum format. This option is only available for yum, file repositories. Choose importable if the importing server uses the same version and exported content needs to be one of yum, file, ansible_collection, docker repositories. Possible value(s): 'syncable', 'importable'", + "name": "format", + "shortname": null, + "value": "ENUM" + }, { "help": "Export history id used for incremental export. If not provided the most recent export history will be used.", "name": "from-history-id", @@ -11686,6 +11868,12 @@ "shortname": null, "value": null }, + { + "help": "Export formats.Choose syncable if the exported content needs to be in a yum format. This option is only available for yum, file repositories. Choose importable if the importing server uses the same version and exported content needs to be one of yum, file, ansible_collection, docker repositories. Possible value(s): 'syncable', 'importable'", + "name": "format", + "shortname": null, + "value": "ENUM" + }, { "help": "Export history id used for incremental export. If not provided the most recent export history will be used.", "name": "from-history-id", @@ -14335,7 +14523,7 @@ "value": "LIST" }, { - "help": "Print help ----------------|-----|---------|----- | ALL | DEFAULT | THIN ----------------|-----|---------|----- view id | x | x | x | x | x | x | x | x | | x | x | published | x | x | ids | x | x | ----------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string boolean boolean integer string string integer", + "help": "Print help ----------------|-----|---------|----- | ALL | DEFAULT | THIN ----------------|-----|---------|----- view id | x | x | x | x | x | x | x | x | | x | x | published | x | x | ids | x | x | ----------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string boolean string boolean integer string string integer", "name": "help", "shortname": "h", "value": null @@ -14419,6 +14607,12 @@ "shortname": null, "value": "VALUE" }, + { + "help": "Check audited changes and proceed only if content or filters have changed since last publish", + "name": "publish-only-if-needed", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "Specify the list of units in each repo", "name": "repos-units", @@ -15148,6 +15342,12 @@ "shortname": null, "value": "NUMBER" }, + { + "help": "Whether or not to return filters applied to the content view version", + "name": "include-applied-filters", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "VALUE/NUMBER Name/Id of associated lifecycle environment", "name": "lifecycle-environment", @@ -15191,7 +15391,7 @@ "value": "VALUE" }, { - "help": "Print help -----------------------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------------------|-----|---------|----- | x | x | x | x | x | | x | x | x | x | x | view id | x | x | view name | x | x | view label | x | x | environments/id | x | x | environments/name | x | x | environments/label | x | x | Repositories/id | x | x | Repositories/name | x | x | Repositories/label | x | x | -----------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ---------------------------------------------|-----|---------|----- | ALL | DEFAULT | THIN ---------------------------------------------|-----|---------|----- | x | x | x | x | x | | x | x | x | x | x | view id | x | x | view name | x | x | view label | x | x | environments/id | x | x | environments/name | x | x | environments/label | x | x | Repositories/id | x | x | Repositories/name | x | x | Repositories/label | x | x | applied filters | x | x | filters/id | x | x | filters/name | x | x | filters/type | x | x | filters/inclusion | x | x | filters/original packages | x | x | filters/original module streams | x | x | filters/rules/id | x | x | filters/rules/name | x | x | filters/rules/uuid | x | x | filters/rules/module stream id | x | x | filters/rules/types/ | x | x | filters/rules/architecture | x | x | filters/rules/content view filter id | x | x | filters/rules/errata id | x | x | filters/rules/date type | x | x | filters/rules/start date | x | x | filters/rules/end date | x | x | solving | x | x | ---------------------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -15239,12 +15439,24 @@ "shortname": null, "value": "LIST" }, + { + "help": "Filter content view versions that contain the file", + "name": "file-id", + "shortname": null, + "value": "NUMBER" + }, { "help": "Whether or not to show all results", "name": "full-result", "shortname": null, "value": "BOOLEAN" }, + { + "help": "Whether or not to return filters applied to the content view version", + "name": "include-applied-filters", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "VALUE/NUMBER Filter versions by environment", "name": "lifecycle-environment", @@ -15257,6 +15469,12 @@ "shortname": null, "value": null }, + { + "help": "Filter out default content views", + "name": "nondefault", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "Sort field and order, eg. 'id DESC'", "name": "order", @@ -15452,7 +15670,7 @@ "value": null }, { - "help": "Force metadata regeneration to proceed. Dangerous when repositories use the 'Complete Mirroring' mirroring policy", + "help": "Force metadata regeneration to proceed. Dangerous operation when version has repositories with the 'Complete Mirroring' mirroring policy", "name": "force", "shortname": null, "value": "BOOLEAN" @@ -18486,6 +18704,18 @@ "shortname": null, "value": "VALUE" }, + { + "help": "VALUE/NUMBER (--environment-id is deprecated: Use --lifecycle-environment-id instead)", + "name": "environment", + "shortname": null, + "value": null + }, + { + "help": "VALUE/NUMBER (--environment-id is deprecated: Use --lifecycle-environment-id instead)", + "name": "environment-id", + "shortname": null, + "value": null + }, { "help": "Return errata that are applicable to one or more hosts (defaults to true if host_id is specified)", "name": "errata-restrict-applicable", @@ -18523,10 +18753,16 @@ "value": null }, { - "help": "Environment id", + "help": "VALUE/NUMBER Environment name/id", + "name": "lifecycle-environment", + "shortname": null, + "value": null + }, + { + "help": "VALUE/NUMBER Environment name/id", "name": "lifecycle-environment-id", "shortname": null, - "value": "NUMBER" + "value": null }, { "help": "Sort field and order, eg. 'id DESC'", @@ -21265,7 +21501,7 @@ "value": "KEY_VALUE_LIST" }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string parameters accept format defined by its schema (bold are required; <> contains acceptable type; [] contains acceptable value): \"\u001b[1mname\u001b[0m=\\,\u001b[1mvalue\u001b[0m=\\,parameter_type=[string|boolean|integer|real|array|hash|yaml|json]\\,hidden_value=[true|false|1|0], ... \" \"product_id=\\,product_name=\\,arch=\\,version=, ... \" mac ip Possible values: interface, bmc, bond, bridge name subnet_id domain_id identifier true/false true/false, each managed hosts needs to have one primary interface. true/false true/false virtual=true: tag VLAN tag, this attribute has precedence over the subnet VLAN ID. Only for virtual interfaces. attached_to Identifier of the interface to which this interface belongs, e.g. eth1. type=bond: mode Possible values: balance-rr, active-backup, balance-xor, broadcast, 802.3ad, balance-tlb, balance-alb attached_devices Identifiers of slave interfaces, e.g. [eth1,eth2] bond_options type=bmc: provider always IPMI username password \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order start Boolean (expressed as 0 or 1), whether to start the machine or not OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virto or virto_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. start Boolean, set 1 to start the vm Rackspace: --volume: --interface: --compute-attributes: flavor_id VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order start Must be a 1 or 0, whether to start the machine or not AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string parameters accept format defined by its schema (bold are required; <> contains acceptable type; [] contains acceptable value): \"\u001b[1mname\u001b[0m=\\,\u001b[1mvalue\u001b[0m=\\,parameter_type=[string|boolean|integer|real|array|hash|yaml|json]\\,hidden_value=[true|false|1|0], ... \" \"product_id=\\,product_name=\\,arch=\\,version=, ... \" mac ip Possible values: interface, bmc, bond, bridge name subnet_id domain_id identifier true/false true/false, each managed hosts needs to have one primary interface. true/false true/false virtual=true: tag VLAN tag, this attribute has precedence over the subnet VLAN ID. Only for virtual interfaces. attached_to Identifier of the interface to which this interface belongs, e.g. eth1. type=bond: mode Possible values: balance-rr, active-backup, balance-xor, broadcast, 802.3ad, balance-tlb, balance-alb attached_devices Identifiers of slave interfaces, e.g. [eth1,eth2] bond_options type=bmc: provider always IPMI username password \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order start Boolean (expressed as 0 or 1), whether to start the machine or not OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virtio or virtio_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. start Boolean, set 1 to start the vm VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order start Must be a 1 or 0, whether to start the machine or not AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", "name": "help", "shortname": "h", "value": null @@ -21575,77 +21811,11 @@ ], "subcommands": [ { - "description": "Schedule errata for installation using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_errata_install`.", "name": "apply", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "List of Errata ids to install. Will be removed in a future release", - "name": "errata-ids", - "shortname": null, - "value": "LIST" - }, - { - "help": "Whether or not to show all results", - "name": "full-result", - "shortname": null, - "value": "BOOLEAN" - }, - { - "help": "VALUE/NUMBER Host name/id", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Host name/id", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "Sort field and order, eg. 'id DESC'", - "name": "order", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Page number, starting at 1", - "name": "page", - "shortname": null, - "value": "NUMBER" - }, - { - "help": "Number of results per page to return", - "name": "per-page", - "shortname": null, - "value": "NUMBER" - }, - { - "help": "Search string for erratum to perform an action on", - "name": "search", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Field to sort the results on", - "name": "sort-by", - "shortname": null, - "value": "VALUE" - }, - { - "help": "How to order the sorted results (e.g. ASC for ascending)", - "name": "sort-order", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -22012,7 +22182,7 @@ "value": "BOOLEAN" }, { - "help": "Print help --------------------------------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------------------------------|-----|---------|----- | x | x | x | x | x | | x | x | x | x | x | | x | x | group | x | x | resource | x | x | profile | x | x | name | x | x | | x | x | | x | x | at | x | x | report | x | x | (seconds) | x | x | Status/global status | x | x | Status/build status | x | x | Network/ipv4 address | x | x | Network/ipv6 address | x | x | Network/mac | x | x | Network/subnet ipv4 | x | x | Network/subnet ipv6 | x | x | Network/domain | x | x | Network/service provider/sp name | x | x | Network/service provider/sp ip | x | x | Network/service provider/sp mac | x | x | Network/service provider/sp subnet | x | x | interfaces/id | x | x | interfaces/identifier | x | x | interfaces/type | x | x | interfaces/mac address | x | x | interfaces/ipv4 address | x | x | interfaces/ipv6 address | x | x | interfaces/fqdn | x | x | system/architecture | x | x | system/operating system | x | x | system/build | x | x | system/medium | x | x | system/partition table | x | x | system/pxe loader | x | x | system/custom partition table | x | x | system/image | x | x | system/image file | x | x | system/use image | x | x | Parameters/ | x | x | parameters/ | x | x | info/owner | x | x | info/owner id | x | x | info/owner type | x | x | info/enabled | x | x | info/model | x | x | info/comment | x | x | proxy | x | x | information/content view/id | x | x | information/content view/name | x | x | information/lifecycle environment/id | x | x | information/lifecycle environment/name | x | x | information/content source/id | x | x | information/content source/name | x | x | information/kickstart repository/id | x | x | information/kickstart repository/name | x | x | information/applicable packages | x | x | information/upgradable packages | x | x | information/applicable errata/enhancement | x | x | information/applicable errata/bug fix | x | x | information/applicable errata/security | x | x | information/uuid | x | x | information/last checkin | x | x | information/release version | x | x | information/autoheal | x | x | information/registered to | x | x | information/registered at | x | x | information/registered by activation keys/ | x | x | information/system purpose/service level | x | x | information/system purpose/purpose usage | x | x | information/system purpose/purpose role | x | x | information/system purpose/purpose addons | x | x | status | x | x | collections/id | x | x | collections/name | x | x | --------------------------------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help -------------------------------------------------------------------------|-----|---------|----- | ALL | DEFAULT | THIN -------------------------------------------------------------------------|-----|---------|----- | x | x | x | x | x | | x | x | x | x | x | | x | x | group | x | x | resource | x | x | profile | x | x | name | x | x | | x | x | | x | x | at | x | x | report | x | x | (seconds) | x | x | Status/global status | x | x | Status/build status | x | x | Network/ipv4 address | x | x | Network/ipv6 address | x | x | Network/mac | x | x | Network/subnet ipv4 | x | x | Network/subnet ipv6 | x | x | Network/domain | x | x | Network/service provider/sp name | x | x | Network/service provider/sp ip | x | x | Network/service provider/sp mac | x | x | Network/service provider/sp subnet | x | x | interfaces/id | x | x | interfaces/identifier | x | x | interfaces/type | x | x | interfaces/mac address | x | x | interfaces/ipv4 address | x | x | interfaces/ipv6 address | x | x | interfaces/fqdn | x | x | system/architecture | x | x | system/operating system | x | x | system/build | x | x | system/medium | x | x | system/partition table | x | x | system/pxe loader | x | x | system/custom partition table | x | x | system/image | x | x | system/image file | x | x | system/use image | x | x | Parameters/ | x | x | parameters/ | x | x | info/owner | x | x | info/owner id | x | x | info/owner type | x | x | info/enabled | x | x | info/model | x | x | info/comment | x | x | proxy | x | x | information/content view environments/content view/id | x | x | information/content view environments/content view/name | x | x | information/content view environments/content view/composite | x | x | information/content view environments/lifecycle environment/id | x | x | information/content view environments/lifecycle environment/name | x | x | information/content source/id | x | x | information/content source/name | x | x | information/kickstart repository/id | x | x | information/kickstart repository/name | x | x | information/applicable packages | x | x | information/upgradable packages | x | x | information/applicable errata/enhancement | x | x | information/applicable errata/bug fix | x | x | information/applicable errata/security | x | x | information/uuid | x | x | information/last checkin | x | x | information/release version | x | x | information/autoheal | x | x | information/registered to | x | x | information/registered at | x | x | information/registered by activation keys/ | x | x | information/system purpose/service level | x | x | information/system purpose/purpose usage | x | x | information/system purpose/purpose role | x | x | information/system purpose/purpose addons | x | x | status | x | x | collections/id | x | x | collections/name | x | x | -------------------------------------------------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -22812,7 +22982,7 @@ "value": "BOOLEAN" }, { - "help": "Print help -----------------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------------|-----|---------|----- | x | x | x | x | x | x system | x | x | group | x | x | | x | x | | x | x | status | x | x | | x | | | x | | information | x | | view | x | x | environment | x | x | | x | | | x | | | x | | status | x | x | -----------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string Values: mismatched, matched, not_specified string string string date string string boolean boot_time Values: true, false Values: built, pending, token_expired, build_failed text string integer string string integer datetime integer string integer Values: security_needed, errata_needed, updated, unknown Values: ok, error string Values: ok, warning, error string string string string string integer string string boolean string integer string infrastructure_facet.foreman infrastructure_facet.smart_proxy_id Values: reporting, no_report Values: disconnect, sync integer string datetime string string job_invocation.id string job_invocation.result Values: cancelled, failed, pending, success datetime datetime string integer string integer string Values: true, false string string string integer string string string integer string string string string integer string string string string string integer string Values: mismatched, matched, not_specified string integer datetime string string reported.boot_time reported.cores reported.disks_total reported.kernel_version reported.ram reported.sockets reported.virtual Values: true, false string string text Values: mismatched, matched, not_specified string Values: mismatched, matched, not_specified string status.applied integer status.enabled Values: true, false status.failed integer status.failed_restarts integer status.interesting Values: true, false status.pending integer status.restarted integer status.skipped integer string subnet.name text string subnet6.name text string string Values: valid, partial, invalid, unknown, disabled, unsubscribed_hypervisor string Values: reboot_needed, process_restart_needed, updated string string text Values: mismatched, matched, not_specified user.firstname string user.lastname string user.login string user.mail string string usergroup.name string string", + "help": "Print help -----------------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------------|-----|---------|----- | x | x | x | x | x | x system | x | x | group | x | x | | x | x | | x | x | status | x | x | | x | | | x | | information | x | | view | x | x | environment | x | x | | x | | | x | | | x | | status | x | x | -----------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string Values: mismatched, matched, not_specified string string date string string boolean boot_time Values: true, false Values: built, pending, token_expired, build_failed text string integer configuration_status.applied integer configuration_status.enabled Values: true, false configuration_status.failed integer configuration_status.failed_restarts integer configuration_status.interesting Values: true, false configuration_status.pending integer configuration_status.restarted integer configuration_status.skipped integer string string datetime integer string integer Values: security_needed, errata_needed, updated, unknown Values: ok, error string Values: ok, warning, error string string string string string integer string string boolean string integer string infrastructure_facet.foreman Values: true, false infrastructure_facet.smart_proxy_id Values: reporting, no_report Values: disconnect, sync integer string datetime string string job_invocation.id string job_invocation.result Values: cancelled, failed, pending, success datetime datetime string string integer string Values: true, false string string string integer string string string integer string string string string integer string string string string string integer string Values: mismatched, matched, not_specified Values: PXELinux_BIOS, PXELinux_UEFI, Grub_UEFI, Grub2_BIOS, Grub2_ELF, Grub2_UEFI, Grub2_UEFI_SecureBoot, Grub2_UEFI_HTTP, Grub2_UEFI_HTTPS, Grub2_UEFI_HTTPS_SecureBoot, iPXE_Embedded, iPXE_UEFI_HTTP, iPXE_Chain_BIOS, iPXE_Chain_UEFI string integer datetime string string reported.bios_release_date reported.bios_vendor reported.bios_version reported.boot_time reported.cores reported.disks_total reported.kernel_version reported.ram reported.sockets reported.virtual Values: true, false string string Values: full_support, maintenance_support, approaching_end_of_maintenance, extended_support, approaching_end_of_support, support_ended text Values: mismatched, matched, not_specified string Values: mismatched, matched, not_specified string status.applied integer status.enabled Values: true, false status.failed integer status.failed_restarts integer status.interesting Values: true, false status.pending integer status.restarted integer status.skipped integer string subnet.name text string subnet6.name text string string Values: valid, partial, invalid, unknown, disabled, unsubscribed_hypervisor string Values: reboot_needed, process_restart_needed, updated string string text Values: mismatched, matched, not_specified user.firstname string user.lastname string user.login string user.mail string string usergroup.name string string", "name": "help", "shortname": "h", "value": null @@ -22833,35 +23003,11 @@ ], "subcommands": [ { - "description": "Install packages remotely using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_install`.", "name": "install", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "List of package names", - "name": "packages", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -22943,35 +23089,11 @@ "subcommands": [] }, { - "description": "Uninstall packages remotely using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_remove`.", "name": "remove", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "List of package names", - "name": "packages", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -22980,35 +23102,11 @@ "subcommands": [] }, { - "description": "Update packages remotely using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_update`.", "name": "upgrade", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "List of packages names", - "name": "packages", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -23017,29 +23115,11 @@ "subcommands": [] }, { - "description": "Update packages remotely using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_update`.", "name": "upgrade-all", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -23050,7 +23130,7 @@ ] }, { - "description": "Manage package-groups on your hosts", + "description": "Manage package-groups on your hosts. These commands are no longer available Use the remote execution equivalent", "name": "package-group", "options": [ { @@ -23062,35 +23142,11 @@ ], "subcommands": [ { - "description": "Install packages remotely using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_group_install`.", "name": "install", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "List of package group names (Deprecated)", - "name": "groups", - "shortname": null, - "value": "LIST" - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -23099,35 +23155,11 @@ "subcommands": [] }, { - "description": "Uninstall packages remotely using katello-agent. NOTE: Katello-agent is deprecated and will be removed in a future release. Consider using remote execution instead.", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_group_remove`.", "name": "remove", "options": [ { - "help": "Do not wait for the task", - "name": "async", - "shortname": null, - "value": null - }, - { - "help": "List of package group names (Deprecated)", - "name": "groups", - "shortname": null, - "value": "LIST" - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/id of the host", - "name": "host-id", - "shortname": null, - "value": null - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -24749,7 +24781,7 @@ "value": "KEY_VALUE_LIST" }, { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string parameters accept format defined by its schema (bold are required; <> contains acceptable type; [] contains acceptable value): \"name=\\,value=\\,parameter_type=[string|boolean|integer|real|array|hash|yaml|json]\\,hidden_value=[true|false|1|0], ... \" \"product_id=\\,product_name=\\,arch=\\,version=, ... \" mac ip Possible values: interface, bmc, bond, bridge name subnet_id domain_id identifier true/false true/false, each managed hosts needs to have one primary interface. true/false true/false virtual=true: tag VLAN tag, this attribute has precedence over the subnet VLAN ID. Only for virtual interfaces. attached_to Identifier of the interface to which this interface belongs, e.g. eth1. type=bond: mode Possible values: balance-rr, active-backup, balance-xor, broadcast, 802.3ad, balance-tlb, balance-alb attached_devices Identifiers of slave interfaces, e.g. [eth1,eth2] bond_options type=bmc: provider always IPMI username password \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order start Boolean (expressed as 0 or 1), whether to start the machine or not OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virto or virto_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. start Boolean, set 1 to start the vm Rackspace: --volume: --interface: --compute-attributes: flavor_id VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order start Must be a 1 or 0, whether to start the machine or not AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string parameters accept format defined by its schema (bold are required; <> contains acceptable type; [] contains acceptable value): \"name=\\,value=\\,parameter_type=[string|boolean|integer|real|array|hash|yaml|json]\\,hidden_value=[true|false|1|0], ... \" \"product_id=\\,product_name=\\,arch=\\,version=, ... \" mac ip Possible values: interface, bmc, bond, bridge name subnet_id domain_id identifier true/false true/false, each managed hosts needs to have one primary interface. true/false true/false virtual=true: tag VLAN tag, this attribute has precedence over the subnet VLAN ID. Only for virtual interfaces. attached_to Identifier of the interface to which this interface belongs, e.g. eth1. type=bond: mode Possible values: balance-rr, active-backup, balance-xor, broadcast, 802.3ad, balance-tlb, balance-alb attached_devices Identifiers of slave interfaces, e.g. [eth1,eth2] bond_options type=bmc: provider always IPMI username password \u001b[1mNOTE:\u001b[0m Bold attributes are required. EC2: --volume: --interface: --compute-attributes: availability_zone flavor_id groups security_group_ids managed_ip Libvirt: --volume: \u001b[1mpool_name\u001b[0m One of available storage pools \u001b[1mcapacity\u001b[0m String value, e.g. 10G allocation Initial allocation, e.g. 0G format_type Possible values: raw, qcow2 --interface: compute_type Possible values: bridge, network compute_bridge Name of interface according to type compute_model Possible values: virtio, rtl8139, ne2k_pci, pcnet, e1000 compute_network Libvirt instance network, e.g. default --compute-attributes: \u001b[1mcpus\u001b[0m Number of CPUs \u001b[1mmemory\u001b[0m String, amount of memory, value in bytes cpu_mode Possible values: default, host-model, host-passthrough boot_order Device names to specify the boot order start Boolean (expressed as 0 or 1), whether to start the machine or not OpenStack: --volume: --interface: --compute-attributes: availability_zone boot_from_volume flavor_ref image_ref tenant_id security_groups network oVirt: --volume: size_gb Volume size in GB, integer value storage_domain ID or name of storage domain bootable Boolean, set 1 for bootable, only one volume can be bootable preallocate Boolean, set 1 to preallocate wipe_after_delete Boolean, set 1 to wipe disk after delete interface Disk interface name, must be ide, virtio or virtio_scsi --interface: compute_name Compute name, e.g. eth0 compute_network Select one of available networks for a cluster, must be an ID or a name compute_interface Interface type compute_vnic_profile Vnic Profile --compute-attributes: cluster ID or name of cluster to use template Hardware profile to use cores Integer value, number of cores sockets Integer value, number of sockets memory Amount of memory, integer value in bytes ha Boolean, set 1 to high availability display_type Possible values: VNC, SPICE keyboard_layout Possible values: ar, de-ch, es, fo, fr-ca, hu, ja, mk, no, pt-br, sv, da, en-gb, et, fr, fr-ch, is, lt, nl, pl, ru, th, de, en-us, fi, fr-be, hr, it, lv, nl-be, pt, sl, tr. Not usable if display type is SPICE. start Boolean, set 1 to start the vm VMware: --volume: name storage_pod Storage Pod ID from VMware datastore Datastore ID from VMware mode persistent/independent_persistent/independent_nonpersistent size_gb Integer number, volume size in GB thin true/false eager_zero true/false controller_key Associated SCSI controller key --interface: compute_type Type of the network adapter, for example one of: VirtualVmxnet3 VirtualE1000 See documentation center for your version of vSphere to find more details about available adapter types: https://www.vmware.com/support/pubs/ compute_network Network ID or Network Name from VMware --compute-attributes: \u001b[1mcluster\u001b[0m Cluster ID from VMware \u001b[1mcorespersocket\u001b[0m Number of cores per socket (applicable to hardware versions < 10 only) \u001b[1mcpus\u001b[0m CPU count \u001b[1mmemory_mb\u001b[0m Integer number, amount of memory in MB \u001b[1mpath\u001b[0m Path to folder \u001b[1mresource_pool\u001b[0m Resource Pool ID from VMware firmware automatic/bios/efi guest_id Guest OS ID form VMware hardware_version Hardware version ID from VMware memoryHotAddEnabled Must be a 1 or 0, lets you add memory resources while the machine is on cpuHotAddEnabled Must be a 1 or 0, lets you add CPU resources while the machine is on add_cdrom Must be a 1 or 0, Add a CD-ROM drive to the virtual machine annotation Annotation Notes scsi_controllers List with SCSI controllers definitions type - ID of the controller from VMware key - Key of the controller (e.g. 1000) boot_order Device names to specify the boot order start Must be a 1 or 0, whether to start the machine or not AzureRM: --volume: disk_size_gb Volume Size in GB (integer value) data_disk_caching Data Disk Caching (None, ReadOnly, ReadWrite) --interface: compute_network Select one of available Azure Subnets, must be an ID compute_public_ip Public IP (None, Static, Dynamic) compute_private_ip Static Private IP (expressed as true or false) --compute-attributes: resource_group Existing Azure Resource Group of user vm_size VM Size, eg. Standard_A0 etc. username The Admin username password The Admin password platform OS type eg. Linux ssh_key_data SSH key for passwordless authentication os_disk_caching OS disk caching premium_os_disk Premium OS Disk, Boolean as 0 or 1 script_command Custom Script Command script_uris Comma seperated file URIs GCE: --volume: size_gb Volume size in GB, integer value --interface: --compute-attributes: machine_type network associate_external_ip", "name": "help", "shortname": "h", "value": null @@ -25010,7 +25042,7 @@ "subcommands": [] }, { - "description": "Manipulate errata for a host collection", + "description": "Manage errata on your host collections. These commands are no longer available. Use the remote execution equivalent", "name": "erratum", "options": [ { @@ -25022,53 +25054,11 @@ ], "subcommands": [ { - "description": "Install errata on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_errata_install`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "install", "options": [ { - "help": "List of Errata to install", - "name": "errata", - "shortname": null, - "value": "LIST" - }, - { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25197,7 +25187,7 @@ "value": "BOOLEAN" }, { - "help": "Print help ------------|-----|---------|----- | ALL | DEFAULT | THIN ------------|-----|---------|----- | x | x | x | x | x | x | x | | | x | | | x | | ------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string Values: mismatched, matched, not_specified string string string date string string boolean boot_time Values: true, false Values: built, pending, token_expired, build_failed text string integer string string integer datetime integer string integer Values: security_needed, errata_needed, updated, unknown Values: ok, error string Values: ok, warning, error string string string string string integer string string boolean string integer string infrastructure_facet.foreman infrastructure_facet.smart_proxy_id Values: reporting, no_report Values: disconnect, sync integer string datetime string string job_invocation.id string job_invocation.result Values: cancelled, failed, pending, success datetime datetime string integer string integer string Values: true, false string string string integer string string string integer string string string string integer string string string string string integer string Values: mismatched, matched, not_specified string integer datetime string string reported.boot_time reported.cores reported.disks_total reported.kernel_version reported.ram reported.sockets reported.virtual Values: true, false string string text Values: mismatched, matched, not_specified string Values: mismatched, matched, not_specified string status.applied integer status.enabled Values: true, false status.failed integer status.failed_restarts integer status.interesting Values: true, false status.pending integer status.restarted integer status.skipped integer string subnet.name text string subnet6.name text string string Values: valid, partial, invalid, unknown, disabled, unsubscribed_hypervisor string Values: reboot_needed, process_restart_needed, updated string string text Values: mismatched, matched, not_specified user.firstname string user.lastname string user.login string user.mail string string usergroup.name string string", + "help": "Print help ------------|-----|---------|----- | ALL | DEFAULT | THIN ------------|-----|---------|----- | x | x | x | x | x | x | x | | | x | | | x | | ------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string Values: mismatched, matched, not_specified string string date string string boolean boot_time Values: true, false Values: built, pending, token_expired, build_failed text string integer configuration_status.applied integer configuration_status.enabled Values: true, false configuration_status.failed integer configuration_status.failed_restarts integer configuration_status.interesting Values: true, false configuration_status.pending integer configuration_status.restarted integer configuration_status.skipped integer string string datetime integer string integer Values: security_needed, errata_needed, updated, unknown Values: ok, error string Values: ok, warning, error string string string string string integer string string boolean string integer string infrastructure_facet.foreman Values: true, false infrastructure_facet.smart_proxy_id Values: reporting, no_report Values: disconnect, sync integer string datetime string string job_invocation.id string job_invocation.result Values: cancelled, failed, pending, success datetime datetime string string integer string Values: true, false string string string integer string string string integer string string string string integer string string string string string integer string Values: mismatched, matched, not_specified Values: PXELinux_BIOS, PXELinux_UEFI, Grub_UEFI, Grub2_BIOS, Grub2_ELF, Grub2_UEFI, Grub2_UEFI_SecureBoot, Grub2_UEFI_HTTP, Grub2_UEFI_HTTPS, Grub2_UEFI_HTTPS_SecureBoot, iPXE_Embedded, iPXE_UEFI_HTTP, iPXE_Chain_BIOS, iPXE_Chain_UEFI string integer datetime string string reported.bios_release_date reported.bios_vendor reported.bios_version reported.boot_time reported.cores reported.disks_total reported.kernel_version reported.ram reported.sockets reported.virtual Values: true, false string string Values: full_support, maintenance_support, approaching_end_of_maintenance, extended_support, approaching_end_of_support, support_ended text Values: mismatched, matched, not_specified string Values: mismatched, matched, not_specified string status.applied integer status.enabled Values: true, false status.failed integer status.failed_restarts integer status.interesting Values: true, false status.pending integer status.restarted integer status.skipped integer string subnet.name text string subnet6.name text string string Values: valid, partial, invalid, unknown, disabled, unsubscribed_hypervisor string Values: reboot_needed, process_restart_needed, updated string string text Values: mismatched, matched, not_specified user.firstname string user.lastname string user.login string user.mail string string usergroup.name string string", "name": "help", "shortname": "h", "value": null @@ -25370,7 +25360,7 @@ "subcommands": [] }, { - "description": "Manipulate packages for a host collection", + "description": "Manage packages on your host collections. These commands are no longer available. Use the remote execution equivalent", "name": "package", "options": [ { @@ -25382,53 +25372,11 @@ ], "subcommands": [ { - "description": "Install packages on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_install`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "install", "options": [ { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Comma-separated list of packages to install", - "name": "packages", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25437,53 +25385,11 @@ "subcommands": [] }, { - "description": "Remove packages on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_remove`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "remove", "options": [ { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Comma-separated list of packages to install", - "name": "packages", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25492,53 +25398,11 @@ "subcommands": [] }, { - "description": "Update packages on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_package_update`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "update", "options": [ { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Comma-separated list of packages to install", - "name": "packages", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25549,7 +25413,7 @@ ] }, { - "description": "Manipulate package-groups for a host collection", + "description": "Manage package-groups on your host collections. These commands are no longer available. Use the remote execution equivalent", "name": "package-group", "options": [ { @@ -25561,53 +25425,11 @@ ], "subcommands": [ { - "description": "Install package-groups on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_group_install`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "install", "options": [ { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Comma-separated list of package-groups to install", - "name": "package-groups", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25616,53 +25438,11 @@ "subcommands": [] }, { - "description": "Remove package-groups on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_group_remove`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "remove", "options": [ { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Comma-separated list of package-groups to install", - "name": "package-groups", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25671,53 +25451,11 @@ "subcommands": [] }, { - "description": "Update package-groups on content hosts contained within a host collection", + "description": "Not supported. Use the remote execution equivalent `hammer job-invocation create --feature katello_group_update`. Specify the host collection with the --search-query parameter, e.g. `--search-query \"host_collection = MyCollection\"` or `--search-query \"host_collection_id=6\"`", "name": "update", "options": [ { - "help": "Host Collection ID", - "name": "id", - "shortname": null, - "value": "VALUE" - }, - { - "help": "Host Collection Name", - "name": "name", - "shortname": null, - "value": "VALUE" - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-title", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Name/Title/Label/Id of associated organization", - "name": "organization-label", - "shortname": null, - "value": null - }, - { - "help": "Comma-separated list of package-groups to install", - "name": "package-groups", - "shortname": null, - "value": "LIST" - }, - { - "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help", "name": "help", "shortname": "h", "value": null @@ -25910,19 +25648,19 @@ "value": "BOOLEAN" }, { - "help": "VALUE/NUMBER Name/title/id of the Host group to register the host in", + "help": "VALUE/NUMBER Name/title/id of the Host group to register the host in", "name": "hostgroup", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Name/title/id of the Host group to register the host in", + "help": "VALUE/NUMBER Name/title/id of the Host group to register the host in", "name": "hostgroup-id", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Name/title/id of the Host group to register the host in", + "help": "VALUE/NUMBER Name/title/id of the Host group to register the host in", "name": "hostgroup-title", "shortname": null, "value": null @@ -25940,67 +25678,55 @@ "value": "BOOLEAN" }, { - "help": "Expiration of the authorization token (in hours)", + "help": "Expiration of the authorization token (in hours), 0 means 'unlimited'.", "name": "jwt-expiration", "shortname": null, "value": "NUMBER" }, { - "help": "VALUE/NUMBER Lifecycle environment for the host.", - "name": "lifecycle-environment", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Lifecycle environment for the host.", - "name": "lifecycle-environment-id", - "shortname": null, - "value": null - }, - { - "help": "VALUE/NUMBER Set the current location context for the request", + "help": "VALUE/NUMBER Set the current location context for the request", "name": "location", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Set the current location context for the request", + "help": "VALUE/NUMBER Set the current location context for the request", "name": "location-id", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Set the current location context for the request", + "help": "VALUE/NUMBER Set the current location context for the request", "name": "location-title", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Title/id of the Operating System to register the host in. Operating system must have a `host_init_config` template assigned", + "help": "VALUE/NUMBER Title/id of the Operating System to register the host in. Operating system must have a `host_init_config` template assigned", "name": "operatingsystem", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Title/id of the Operating System to register the host in. Operating system must have a `host_init_config` template assigned", + "help": "VALUE/NUMBER Title/id of the Operating System to register the host in. Operating system must have a `host_init_config` template assigned", "name": "operatingsystem-id", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Set the current organization context for the request", + "help": "VALUE/NUMBER Set the current organization context for the request", "name": "organization", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Set the current organization context for the request", + "help": "VALUE/NUMBER Set the current organization context for the request", "name": "organization-id", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Set the current organization context for the request", + "help": "VALUE/NUMBER Set the current organization context for the request", "name": "organization-title", "shortname": null, "value": null @@ -26048,13 +25774,13 @@ "value": "BOOLEAN" }, { - "help": "VALUE/NUMBER Name/id of the Capsule. This Capsule must have enabled both the 'Templates' and 'Registration' features", + "help": "VALUE/NUMBER Name/id of the Capsule. This Capsule must have enabled both the 'Templates' and 'Registration' features", "name": "smart-proxy", "shortname": null, "value": null }, { - "help": "VALUE/NUMBER Name/id of the Capsule. This Capsule must have enabled both the 'Templates' and 'Registration' features", + "help": "VALUE/NUMBER Name/id of the Capsule. This Capsule must have enabled both the 'Templates' and 'Registration' features", "name": "smart-proxy-id", "shortname": null, "value": null @@ -28387,8 +28113,8 @@ "value": "ENUM" }, { - "help": "Distribute tasks over N seconds", - "name": "time-span", + "help": "Override the global time to pickup interval for this invocation only", + "name": "time-to-pickup", "shortname": null, "value": "NUMBER" }, @@ -28442,7 +28168,7 @@ "value": null }, { - "help": "Print help --------------------|-----|-------- | ALL | DEFAULT --------------------|-----|-------- | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x ordering | x | x | x | x category | x | x | x | x line | x | x logic id | x | x | x | x --------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help --------------------|-----|-------- | ALL | DEFAULT --------------------|-----|-------- | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x ordering | x | x | x | x category | x | x | x | x line | x | x logic id | x | x to pickup | x | x | x | x --------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -28663,6 +28389,12 @@ "description": "Create a job template", "name": "create", "options": [ + { + "help": "Enable the callback plugin for this template", + "name": "ansible-callback-enabled", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "", "name": "audit-comment", @@ -29131,7 +28863,7 @@ "value": null }, { - "help": "Print help ---------------|-----|---------|----- | ALL | DEFAULT | THIN ---------------|-----|---------|----- | x | x | x | x | x | x category | x | x | | x | x | | x | x | | x | x | | x | x | Locations/ | x | x | Organizations/ | x | x | ---------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help -------------------------|-----|---------|----- | ALL | DEFAULT | THIN -------------------------|-----|---------|----- | x | x | x | x | x | x category | x | x | | x | x | | x | x | callback enabled | x | x | | x | x | | x | x | Locations/ | x | x | Organizations/ | x | x | -------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -29222,6 +28954,12 @@ "description": "Update a job template", "name": "update", "options": [ + { + "help": "Enable the callback plugin for this template", + "name": "ansible-callback-enabled", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "", "name": "audit-comment", @@ -29607,10 +29345,10 @@ "value": "VALUE" }, { - "help": "Set true if you want to see only library environments Possible value(s): 'true', 'false'", + "help": "Set true if you want to see only library environments", "name": "library", "shortname": null, - "value": "ENUM" + "value": "BOOLEAN" }, { "help": "Filter only environments containing this name", @@ -29679,6 +29417,12 @@ "description": "List environment paths", "name": "paths", "options": [ + { + "help": "Show whether each lifecycle environment is associated with the given Capsule id.", + "name": "content-source-id", + "shortname": null, + "value": "NUMBER" + }, { "help": "Show specified fields or predefined field sets only. (See below)", "name": "fields", @@ -33221,7 +32965,7 @@ "help": "If product certificates should be used to authenticate to a custom CDN.", "name": "custom-cdn-auth-enabled", "shortname": null, - "value": "VALUE" + "value": "BOOLEAN" }, { "help": "Id of the Organization", @@ -34529,6 +34273,12 @@ "shortname": null, "value": "VALUE" }, + { + "help": "Whether Simple Content Access should be enabled for the organization.", + "name": "simple-content-access", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "Capsule names/ids", "name": "smart-proxies", @@ -37384,7 +37134,7 @@ "value": "BOOLEAN" }, { - "help": "Print help -----------------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------------|-----|---------|----- | x | x | x | x | x | x system | x | x | group | x | x | | x | x | | x | x | status | x | x | | x | | | x | | information | x | | view | x | x | environment | x | x | | x | | | x | | | x | | status | x | x | -----------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string Values: mismatched, matched, not_specified string string string date string string boolean boot_time Values: true, false Values: built, pending, token_expired, build_failed text string integer string string integer datetime integer string integer Values: security_needed, errata_needed, updated, unknown Values: ok, error string Values: ok, warning, error string string string string string integer string string boolean string integer string infrastructure_facet.foreman infrastructure_facet.smart_proxy_id Values: reporting, no_report Values: disconnect, sync integer string datetime string string job_invocation.id string job_invocation.result Values: cancelled, failed, pending, success datetime datetime string integer string integer string Values: true, false string string string integer string string string integer string string string string integer string string string string string integer string Values: mismatched, matched, not_specified string integer datetime string string reported.boot_time reported.cores reported.disks_total reported.kernel_version reported.ram reported.sockets reported.virtual Values: true, false string string text Values: mismatched, matched, not_specified string Values: mismatched, matched, not_specified string status.applied integer status.enabled Values: true, false status.failed integer status.failed_restarts integer status.interesting Values: true, false status.pending integer status.restarted integer status.skipped integer string subnet.name text string subnet6.name text string string Values: valid, partial, invalid, unknown, disabled, unsubscribed_hypervisor string Values: reboot_needed, process_restart_needed, updated string string text Values: mismatched, matched, not_specified user.firstname string user.lastname string user.login string user.mail string string usergroup.name string string", + "help": "Print help -----------------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------------|-----|---------|----- | x | x | x | x | x | x system | x | x | group | x | x | | x | x | | x | x | status | x | x | | x | | | x | | information | x | | view | x | x | environment | x | x | | x | | | x | | | x | | status | x | x | -----------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string Values: mismatched, matched, not_specified string string date string string boolean boot_time Values: true, false Values: built, pending, token_expired, build_failed text string integer configuration_status.applied integer configuration_status.enabled Values: true, false configuration_status.failed integer configuration_status.failed_restarts integer configuration_status.interesting Values: true, false configuration_status.pending integer configuration_status.restarted integer configuration_status.skipped integer string string datetime integer string integer Values: security_needed, errata_needed, updated, unknown Values: ok, error string Values: ok, warning, error string string string string string integer string string boolean string integer string infrastructure_facet.foreman Values: true, false infrastructure_facet.smart_proxy_id Values: reporting, no_report Values: disconnect, sync integer string datetime string string job_invocation.id string job_invocation.result Values: cancelled, failed, pending, success datetime datetime string string integer string Values: true, false string string string integer string string string integer string string string string integer string string string string string integer string Values: mismatched, matched, not_specified Values: PXELinux_BIOS, PXELinux_UEFI, Grub_UEFI, Grub2_BIOS, Grub2_ELF, Grub2_UEFI, Grub2_UEFI_SecureBoot, Grub2_UEFI_HTTP, Grub2_UEFI_HTTPS, Grub2_UEFI_HTTPS_SecureBoot, iPXE_Embedded, iPXE_UEFI_HTTP, iPXE_Chain_BIOS, iPXE_Chain_UEFI string integer datetime string string reported.bios_release_date reported.bios_vendor reported.bios_version reported.boot_time reported.cores reported.disks_total reported.kernel_version reported.ram reported.sockets reported.virtual Values: true, false string string Values: full_support, maintenance_support, approaching_end_of_maintenance, extended_support, approaching_end_of_support, support_ended text Values: mismatched, matched, not_specified string Values: mismatched, matched, not_specified string status.applied integer status.enabled Values: true, false status.failed integer status.failed_restarts integer status.interesting Values: true, false status.pending integer status.restarted integer status.skipped integer string subnet.name text string subnet6.name text string string Values: valid, partial, invalid, unknown, disabled, unsubscribed_hypervisor string Values: reboot_needed, process_restart_needed, updated string string text Values: mismatched, matched, not_specified user.firstname string user.lastname string user.login string user.mail string string usergroup.name string string", "name": "help", "shortname": "h", "value": null @@ -38647,7 +38397,7 @@ "value": null }, { - "help": "Print help -------------------------------------------------------------------|-----|-------- | ALL | DEFAULT -------------------------------------------------------------------|-----|-------- environments/name | x | x environments/organization | x | x environments/content views/name | x | x environments/content views/composite | x | x environments/content views/last published | x | x environments/content views/content/hosts | x | x environments/content views/content/products | x | x environments/content views/content/yum repos | x | x environments/content views/content/container image repos | x | x environments/content views/content/packages | x | x environments/content views/content/package groups | x | x environments/content views/content/errata | x | x -------------------------------------------------------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ---------------------------------------------------------------------------------|-----|-------- | ALL | DEFAULT ---------------------------------------------------------------------------------|-----|-------- environments/name | x | x environments/organization | x | x environments/content views/name | x | x environments/content views/composite | x | x environments/content views/last published | x | x environments/content views/repositories/repository id | x | x environments/content views/repositories/repository name | x | x environments/content views/repositories/content counts/warning | x | x environments/content views/repositories/content counts/packages | x | x environments/content views/repositories/content counts/srpms | x | x environments/content views/repositories/content counts/module streams | x | x environments/content views/repositories/content counts/package groups | x | x environments/content views/repositories/content counts/errata | x | x environments/content views/repositories/content counts/debian packages | x | x environments/content views/repositories/content counts/container tags | x | x environments/content views/repositories/content counts/container ma... | x | x environments/content views/repositories/content counts/container ma... | x | x environments/content views/repositories/content counts/files | x | x environments/content views/repositories/content counts/ansible coll... | x | x environments/content views/repositories/content counts/ostree refs | x | x environments/content views/repositories/content counts/python packages | x | x ---------------------------------------------------------------------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -38710,6 +38460,37 @@ ], "subcommands": [] }, + { + "description": "Reclaim space from all On Demand repositories on a capsule", + "name": "reclaim-space", + "options": [ + { + "help": "Do not wait for the task", + "name": "async", + "shortname": null, + "value": null + }, + { + "help": "Id of the capsule", + "name": "id", + "shortname": null, + "value": "NUMBER" + }, + { + "help": "Name to search by", + "name": "name", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] + }, { "description": "Remove lifecycle environments from the capsule", "name": "remove-lifecycle-environment", @@ -38922,6 +38703,49 @@ } ], "subcommands": [] + }, + { + "description": "Update content counts for the capsule", + "name": "update-counts", + "options": [ + { + "help": "Do not wait for the task", + "name": "async", + "shortname": null, + "value": null + }, + { + "help": "Id of the capsule", + "name": "id", + "shortname": null, + "value": "NUMBER" + }, + { + "help": "Name to search by", + "name": "name", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Organization name", + "name": "organization", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Organization ID", + "name": "organization-id", + "shortname": null, + "value": "VALUE" + }, + { + "help": "Print help you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "name": "help", + "shortname": "h", + "value": null + } + ], + "subcommands": [] } ] }, @@ -39233,7 +39057,7 @@ "value": null }, { - "help": "Print help -----------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | | x | x | | x | x | | x | x | Features/name | x | x | Features/version | x | x | Locations/ | x | x | Organizations/ | x | x | at | x | x | at | x | x | -----------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help -----------------|-----|---------|----- | ALL | DEFAULT | THIN -----------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | | x | x | | x | x | count | x | x | Features/name | x | x | Features/version | x | x | Locations/ | x | x | Organizations/ | x | x | at | x | x | at | x | x | -----------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -40112,7 +39936,7 @@ "value": null }, { - "help": "Print help ----------------|-----|-------- | ALL | DEFAULT ----------------|-----|-------- | x | x line | x | x | x | x occurrence | x | x occurrence | x | x | x | x limit | x | x until | x | x | x | x ----------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ----------------|-----|-------- | ALL | DEFAULT ----------------|-----|-------- | x | x line | x | x | x | x occurrence | x | x occurrence | x | x count | x | x | x | x occurrence | x | x occurrence | x | x | x | x limit | x | x limit | x | x until | x | x | x | x | x | x ----------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -40191,7 +40015,7 @@ "value": "VALUE" }, { - "help": "Print help ----------|-----|-------- | ALL | DEFAULT ----------|-----|-------- | x | x line | x | x | x | x time | x | x | x | x ----------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ----------------|-----|-------- | ALL | DEFAULT ----------------|-----|-------- | x | x line | x | x count | x | x | x | x occurrence | x | x occurrence | x | x | x | x limit | x | x time | x | x | x | x | x | x ----------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -40536,7 +40360,7 @@ "value": null }, { - "help": "Print help --------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------|-----|---------|----- | x | x | x | x | x | at | x | x | | x | x | status/applied | x | x | status/restarted | x | x | status/failed | x | x | status/restart failures | x | x | status/skipped | x | x | status/pending | x | x | metrics/config_retrieval | x | x | metrics/exec | x | x | metrics/file | x | x | metrics/package | x | x | metrics/service | x | x | metrics/user | x | x | metrics/yumrepo | x | x | metrics/filebucket | x | x | metrics/cron | x | x | metrics/total | x | x | Logs/resource | x | x | Logs/message | x | x | --------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help --------------------------------|-----|---------|----- | ALL | DEFAULT | THIN --------------------------------|-----|---------|----- | x | x | x | x | x | at | x | x | | x | x | status/applied | x | x | status/restarted | x | x | status/failed | x | x | status/restart failures | x | x | status/skipped | x | x | status/pending | x | x | metrics/config retrieval | x | x | metrics/exec | x | x | metrics/file | x | x | metrics/package | x | x | metrics/service | x | x | metrics/user | x | x | metrics/yumrepo | x | x | metrics/filebucket | x | x | metrics/cron | x | x | metrics/total | x | x | Logs/resource | x | x | Logs/message | x | x | --------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -41789,12 +41613,6 @@ "shortname": null, "value": "VALUE" }, - { - "help": "Comma-separated list of tags to sync for Container Image repository (Deprecated)", - "name": "docker-tags-whitelist", - "shortname": null, - "value": "LIST" - }, { "help": "Name of the upstream docker repository", "name": "docker-upstream-name", @@ -41850,7 +41668,7 @@ "value": "ENUM" }, { - "help": "List of content units to ignore while syncing a yum repository. Must be subset of srpm", + "help": "List of content units to ignore while syncing a yum repository. Must be subset of srpm,treeinfo", "name": "ignorable-content", "shortname": null, "value": "LIST" @@ -41874,10 +41692,10 @@ "value": "VALUE" }, { - "help": "True if this repository when synced has to be mirrored from the source and stale rpms removed (Deprecated)", - "name": "mirror-on-sync", + "help": "Time to expire yum metadata in seconds. Only relevant for custom yum repositories.", + "name": "metadata-expire", "shortname": null, - "value": "BOOLEAN" + "value": "NUMBER" }, { "help": "Policy to set for mirroring content. Must be one of additive. Possible value(s): 'additive', 'mirror_complete', 'mirror_content_only'", @@ -41916,7 +41734,7 @@ "value": null }, { - "help": "Versionsentifies whether the repository should be disabled on a client with a non-matching OS version. Pass [] to enable regardless of OS version. Maximum length 1; allowed tags are: rhel-6, rhel-7, rhel-8, rhel-9", + "help": "Versionsentifies whether the repository should be unavailable on a client with a non-matching OS version. Pass [] to make repo available for clients regardless of OS version. Maximum length 1; allowed tags are: rhel-6, rhel-7, rhel-8, rhel-9", "name": "os-versions", "shortname": null, "value": "LIST" @@ -42012,6 +41830,12 @@ "description": "Destroy a custom repository", "name": "delete", "options": [ + { + "help": "Delete content view filters that have this repository as the last associated repository. Defaults to true. If false, such filters will now apply to all repositories in the content view.", + "name": "delete-empty-repo-filters", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "", "name": "id", @@ -42128,7 +41952,7 @@ "value": null }, { - "help": "Print help ----------------------------------------------|-----|---------|----- | ALL | DEFAULT | THIN ----------------------------------------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | | x | x | hat repository | x | x | type | x | x | type | x | x | policy | x | x | | x | x | via http | x | x | at | x | x | path | x | x | policy | x | x | repository name | x | x | image tags filter | x | x | repository name | x | x | content units | x | x | proxy/id | x | x | proxy/name | x | x | proxy/http proxy policy | x | x | Product/id | x | x | Product/name | x | x | key/id | x | x | key/name | x | x | Sync/status | x | x | Sync/last sync date | x | x | | x | x | | x | x | counts/packages | x | x | counts/source rpms | x | x | counts/package groups | x | x | counts/errata | x | x | counts/container image manifest lists | x | x | counts/container image manifests | x | x | counts/container image tags | x | x | counts/files | x | x | counts/module streams | x | x | ----------------------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ----------------------------------------|-----|---------|----- | ALL | DEFAULT | THIN ----------------------------------------|-----|---------|----- | x | x | x | x | x | x | x | x | | x | x | | x | x | hat repository | x | x | type | x | x | label | x | x | type | x | x | policy | x | x | | x | x | via http | x | x | at | x | x | path | x | x | policy | x | x | expiration | x | x | repository name | x | x | image tags filter | x | x | repository name | x | x | content units | x | x | proxy/id | x | x | proxy/name | x | x | proxy/http proxy policy | x | x | Product/id | x | x | Product/name | x | x | key/id | x | x | key/name | x | x | Sync/status | x | x | Sync/last sync date | x | x | | x | x | | x | x | counts/packages | x | x | counts/srpms | x | x | counts/module streams | x | x | counts/package groups | x | x | counts/errata | x | x | counts/debian packages | x | x | counts/container tags | x | x | counts/container manifests | x | x | counts/container manifest lists | x | x | counts/files | x | x | counts/ansible collections | x | x | counts/ostree refs | x | x | counts/python packages | x | x | ----------------------------------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -42363,7 +42187,7 @@ "value": "VALUE" }, { - "help": "Print help -------------|-----|---------|----- | ALL | DEFAULT | THIN -------------|-----|---------|----- | x | x | x | x | x | x | x | x | type | x | x | | x | x | -------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string integer text string boolean string string string string string string string integer string Values: true, false", + "help": "Print help --------------|-----|---------|----- | ALL | DEFAULT | THIN --------------|-----|---------|----- | x | x | x | x | x | x | x | x | type | x | x | label | x | x | | x | x | --------------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string string integer text string boolean string string string string string string string integer string Values: true, false", "name": "help", "shortname": "h", "value": null @@ -42516,7 +42340,7 @@ "value": null }, { - "help": "Force metadata regeneration to proceed. Dangerous when repositories use the 'Complete Mirroring' mirroring policy.", + "help": "Force metadata regeneration to proceed. Dangerous when repositories use the 'Complete Mirroring' mirroring policy", "name": "force", "shortname": null, "value": "BOOLEAN" @@ -42667,6 +42491,12 @@ "description": "Show the available repository types", "name": "types", "options": [ + { + "help": "When set to 'True' repository types that are creatable will be returned", + "name": "creatable", + "shortname": null, + "value": "BOOLEAN" + }, { "help": "Show specified fields or predefined field sets only. (See below)", "name": "fields", @@ -42758,12 +42588,6 @@ "shortname": null, "value": "VALUE" }, - { - "help": "Comma-separated list of tags to sync for Container Image repository (Deprecated)", - "name": "docker-tags-whitelist", - "shortname": null, - "value": "LIST" - }, { "help": "Name of the upstream docker repository", "name": "docker-upstream-name", @@ -42825,7 +42649,7 @@ "value": "NUMBER" }, { - "help": "List of content units to ignore while syncing a yum repository. Must be subset of srpm", + "help": "List of content units to ignore while syncing a yum repository. Must be subset of srpm,treeinfo", "name": "ignorable-content", "shortname": null, "value": "LIST" @@ -42843,10 +42667,10 @@ "value": "LIST" }, { - "help": "True if this repository when synced has to be mirrored from the source and stale rpms removed (Deprecated)", - "name": "mirror-on-sync", + "help": "Time to expire yum metadata in seconds. Only relevant for custom yum repositories.", + "name": "metadata-expire", "shortname": null, - "value": "BOOLEAN" + "value": "NUMBER" }, { "help": "Policy to set for mirroring content. Must be one of additive. Possible value(s): 'additive', 'mirror_complete', 'mirror_content_only'", @@ -42885,7 +42709,7 @@ "value": "VALUE" }, { - "help": "Versionsentifies whether the repository should be disabled on a client with a non-matching OS version. Pass [] to enable regardless of OS version. Maximum length 1; allowed tags are: rhel-6, rhel-7, rhel-8, rhel-9", + "help": "Versionsentifies whether the repository should be unavailable on a client with a non-matching OS version. Pass [] to make repo available for clients regardless of OS version. Maximum length 1; allowed tags are: rhel-6, rhel-7, rhel-8, rhel-9", "name": "os-versions", "shortname": null, "value": "LIST" @@ -43492,6 +43316,12 @@ "shortname": null, "value": null }, + { + "help": "Limit content to Red Hat / custom Possible value(s): 'redhat', 'custom'", + "name": "repository-type", + "shortname": null, + "value": "ENUM" + }, { "help": "Search string", "name": "search", @@ -43511,13 +43341,13 @@ "value": "BOOLEAN" }, { - "help": "If true, return custom repository sets along with redhat repos", + "help": "If true, return custom repository sets along with redhat repos. Will be ignored if repository_type is supplied.", "name": "with-custom", "shortname": null, "value": "BOOLEAN" }, { - "help": "Print help -------|-----|---------|----- | ALL | DEFAULT | THIN -------|-----|---------|----- | x | x | x | x | x | | x | x | x -------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string Values: true, false string string string string integer string", + "help": "Print help -------|-----|---------|----- | ALL | DEFAULT | THIN -------|-----|---------|----- | x | x | x | x | x | | x | x | x -------|-----|---------|----- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string string string Values: true, false string string string string integer string Values: true, false", "name": "help", "shortname": "h", "value": null @@ -44977,7 +44807,7 @@ ], "subcommands": [ { - "description": "Disable simple content access for a manifest", + "description": "Disable simple content access for a manifest. WARNING: Simple Content Access will be required for all organizations in Satellite 6.16.", "name": "disable", "options": [ { @@ -45063,7 +44893,7 @@ "subcommands": [] }, { - "description": "Check if the specified organization has Simple Content Access enabled", + "description": "Check if the specified organization has Simple Content Access enabled. WARNING: Simple Content Access will be required for all organizations in Satellite 6.16.", "name": "status", "options": [ { @@ -49085,7 +48915,7 @@ "value": "BOOLEAN" }, { - "help": "For values of type search, this is the resource the value searches in Possible value(s): 'AnsibleRole', 'AnsibleVariable', 'Architecture', 'Audit', 'AuthSource', 'Bookmark', 'ComputeProfile', 'ComputeResource', 'ConfigReport', 'DiscoveryRule', 'Domain', 'ExternalUsergroup', 'FactValue', 'Filter', 'ForemanOpenscap::ArfReport', 'ForemanOpenscap::OvalContent', 'ForemanOpenscap::OvalPolicy', 'ForemanOpenscap::Policy', 'ForemanOpenscap::ScapContent', 'ForemanOpenscap::TailoringFile', 'ForemanTasks::RecurringLogic', 'ForemanTasks::Task', 'ForemanVirtWhoConfigure::Config', 'Host', 'Hostgroup', 'HttpProxy', 'Image', 'InsightsHit', 'JobInvocation', 'JobTemplate', 'Katello::ActivationKey', 'Katello::AlternateContentSource', 'Katello::ContentCredential', 'Katello::ContentView', 'Katello::HostCollection', 'Katello::KTEnvironment', 'Katello::Product', 'Katello::Subscription', 'Katello::SyncPlan', 'KeyPair', 'Location', 'MailNotification', 'Medium', 'Model', 'Operatingsystem', 'Organization', 'Parameter', 'PersonalAccessToken', 'ProvisioningTemplate', 'Ptable', 'Realm', 'RemoteExecutionFeature', 'ReportTemplate', 'Role', 'Setting', 'SmartProxy', 'SshKey', 'Subnet', 'Template', 'TemplateInvocation', 'User', 'Usergroup', 'Webhook', 'WebhookTemplate'", + "help": "For values of type search, this is the resource the value searches in Possible value(s): 'AnsibleRole', 'AnsibleVariable', 'Architecture', 'Audit', 'AuthSource', 'Bookmark', 'ComputeProfile', 'ComputeResource', 'ConfigReport', 'DiscoveryRule', 'Domain', 'ExternalUsergroup', 'FactValue', 'Filter', 'ForemanOpenscap::ArfReport', 'ForemanOpenscap::OvalContent', 'ForemanOpenscap::OvalPolicy', 'ForemanOpenscap::Policy', 'ForemanOpenscap::ScapContent', 'ForemanOpenscap::TailoringFile', 'ForemanTasks::RecurringLogic', 'ForemanTasks::Task', 'ForemanVirtWhoConfigure::Config', 'Host', 'Hostgroup', 'HttpProxy', 'Image', 'InsightsHit', 'JobInvocation', 'JobTemplate', 'Katello::ActivationKey', 'Katello::AlternateContentSource', 'Katello::ContentCredential', 'Katello::ContentView', 'Katello::HostCollection', 'Katello::KTEnvironment', 'Katello::Product', 'Katello::Subscription', 'Katello::SyncPlan', 'KeyPair', 'Location', 'LookupValue', 'MailNotification', 'Medium', 'Model', 'Operatingsystem', 'Organization', 'Parameter', 'PersonalAccessToken', 'ProvisioningTemplate', 'Ptable', 'Realm', 'RemoteExecutionFeature', 'ReportTemplate', 'Role', 'Setting', 'SmartProxy', 'SshKey', 'Subnet', 'Template', 'TemplateInvocation', 'User', 'Usergroup', 'Webhook', 'WebhookTemplate'", "name": "resource-type", "shortname": null, "value": "ENUM" @@ -49449,7 +49279,7 @@ "value": "BOOLEAN" }, { - "help": "For values of type search, this is the resource the value searches in Possible value(s): 'AnsibleRole', 'AnsibleVariable', 'Architecture', 'Audit', 'AuthSource', 'Bookmark', 'ComputeProfile', 'ComputeResource', 'ConfigReport', 'DiscoveryRule', 'Domain', 'ExternalUsergroup', 'FactValue', 'Filter', 'ForemanOpenscap::ArfReport', 'ForemanOpenscap::OvalContent', 'ForemanOpenscap::OvalPolicy', 'ForemanOpenscap::Policy', 'ForemanOpenscap::ScapContent', 'ForemanOpenscap::TailoringFile', 'ForemanTasks::RecurringLogic', 'ForemanTasks::Task', 'ForemanVirtWhoConfigure::Config', 'Host', 'Hostgroup', 'HttpProxy', 'Image', 'InsightsHit', 'JobInvocation', 'JobTemplate', 'Katello::ActivationKey', 'Katello::AlternateContentSource', 'Katello::ContentCredential', 'Katello::ContentView', 'Katello::HostCollection', 'Katello::KTEnvironment', 'Katello::Product', 'Katello::Subscription', 'Katello::SyncPlan', 'KeyPair', 'Location', 'MailNotification', 'Medium', 'Model', 'Operatingsystem', 'Organization', 'Parameter', 'PersonalAccessToken', 'ProvisioningTemplate', 'Ptable', 'Realm', 'RemoteExecutionFeature', 'ReportTemplate', 'Role', 'Setting', 'SmartProxy', 'SshKey', 'Subnet', 'Template', 'TemplateInvocation', 'User', 'Usergroup', 'Webhook', 'WebhookTemplate'", + "help": "For values of type search, this is the resource the value searches in Possible value(s): 'AnsibleRole', 'AnsibleVariable', 'Architecture', 'Audit', 'AuthSource', 'Bookmark', 'ComputeProfile', 'ComputeResource', 'ConfigReport', 'DiscoveryRule', 'Domain', 'ExternalUsergroup', 'FactValue', 'Filter', 'ForemanOpenscap::ArfReport', 'ForemanOpenscap::OvalContent', 'ForemanOpenscap::OvalPolicy', 'ForemanOpenscap::Policy', 'ForemanOpenscap::ScapContent', 'ForemanOpenscap::TailoringFile', 'ForemanTasks::RecurringLogic', 'ForemanTasks::Task', 'ForemanVirtWhoConfigure::Config', 'Host', 'Hostgroup', 'HttpProxy', 'Image', 'InsightsHit', 'JobInvocation', 'JobTemplate', 'Katello::ActivationKey', 'Katello::AlternateContentSource', 'Katello::ContentCredential', 'Katello::ContentView', 'Katello::HostCollection', 'Katello::KTEnvironment', 'Katello::Product', 'Katello::Subscription', 'Katello::SyncPlan', 'KeyPair', 'Location', 'LookupValue', 'MailNotification', 'Medium', 'Model', 'Operatingsystem', 'Organization', 'Parameter', 'PersonalAccessToken', 'ProvisioningTemplate', 'Ptable', 'Realm', 'RemoteExecutionFeature', 'ReportTemplate', 'Role', 'Setting', 'SmartProxy', 'SshKey', 'Subnet', 'Template', 'TemplateInvocation', 'User', 'Usergroup', 'Webhook', 'WebhookTemplate'", "name": "resource-type", "shortname": null, "value": "ENUM" @@ -50053,7 +49883,7 @@ "value": "LIST" }, { - "help": "User's timezone Possible value(s): 'International Date Line West', 'American Samoa', 'Midway Island', 'Hawaii', 'Alaska', 'Pacific Time (US & Canada)', 'Tijuana', 'Arizona', 'Mazatlan', 'Mountain Time (US & Canada)', 'Central America', 'Central Time (US & Canada)', 'Chihuahua', 'Guadalajara', 'Mexico City', 'Monterrey', 'Saskatchewan', 'Bogota', 'Eastern Time (US & Canada)', 'Indiana (East)', 'Lima', 'Quito', 'Atlantic Time (Canada)', 'Caracas', 'Georgetown', 'La Paz', 'Puerto Rico', 'Santiago', 'Newfoundland', 'Brasilia', 'Buenos Aires', 'Greenland', 'Montevideo', 'Mid-Atlantic', 'Azores', 'Cape Verde Is.', 'Casablanca', 'Dublin', 'Edinburgh', 'Lisbon', 'London', 'Monrovia', 'UTC', 'Amsterdam', 'Belgrade', 'Berlin', 'Bern', 'Bratislava', 'Brussels', 'Budapest', 'Copenhagen', 'Ljubljana', 'Madrid', 'Paris', 'Prague', 'Rome', 'Sarajevo', 'Skopje', 'Stockholm', 'Vienna', 'Warsaw', 'West Central Africa', 'Zagreb', 'Zurich', 'Athens', 'Bucharest', 'Cairo', 'Harare', 'Helsinki', 'Jerusalem', 'Kaliningrad', 'Kyiv', 'Pretoria', 'Riga', 'Sofia', 'Tallinn', 'Vilnius', 'Baghdad', 'Istanbul', 'Kuwait', 'Minsk', 'Moscow', 'Nairobi', 'Riyadh', 'St. Petersburg', 'Volgograd', 'Tehran', 'Abu Dhabi', 'Baku', 'Muscat', 'Samara', 'Tbilisi', 'Yerevan', 'Kabul', 'Ekaterinburg', 'Islamabad', 'Karachi', 'Tashkent', 'Chennai', 'Kolkata', 'Mumbai', 'New Delhi', 'Sri Jayawardenepura', 'Kathmandu', 'Almaty', 'Astana', 'Dhaka', 'Urumqi', 'Rangoon', 'Bangkok', 'Hanoi', 'Jakarta', 'Krasnoyarsk', 'Novosibirsk', 'Beijing', 'Chongqing', 'Hong Kong', 'Irkutsk', 'Kuala Lumpur', 'Perth', 'Singapore', 'Taipei', 'Ulaanbaatar', 'Osaka', 'Sapporo', 'Seoul', 'Tokyo', 'Yakutsk', 'Adelaide', 'Darwin', 'Brisbane', 'Canberra', 'Guam', 'Hobart', 'Melbourne', 'Port Moresby', 'Sydney', 'Vladivostok', 'Magadan', 'New Caledonia', 'Solomon Is.', 'Srednekolymsk', 'Auckland', 'Fiji', 'Kamchatka', 'Marshall Is.', 'Wellington', 'Chatham Is.', 'Nuku'alofa', 'Samoa', 'Tokelau Is.'", + "help": "User's timezone Possible value(s): 'International Date Line West', 'American Samoa', 'Midway Island', 'Hawaii', 'Alaska', 'Pacific Time (US & Canada)', 'Tijuana', 'Arizona', 'Mazatlan', 'Mountain Time (US & Canada)', 'Central America', 'Central Time (US & Canada)', 'Chihuahua', 'Guadalajara', 'Mexico City', 'Monterrey', 'Saskatchewan', 'Bogota', 'Eastern Time (US & Canada)', 'Indiana (East)', 'Lima', 'Quito', 'Atlantic Time (Canada)', 'Caracas', 'Georgetown', 'La Paz', 'Puerto Rico', 'Santiago', 'Newfoundland', 'Brasilia', 'Buenos Aires', 'Montevideo', 'Greenland', 'Mid-Atlantic', 'Azores', 'Cape Verde Is.', 'Casablanca', 'Dublin', 'Edinburgh', 'Lisbon', 'London', 'Monrovia', 'UTC', 'Amsterdam', 'Belgrade', 'Berlin', 'Bern', 'Bratislava', 'Brussels', 'Budapest', 'Copenhagen', 'Ljubljana', 'Madrid', 'Paris', 'Prague', 'Rome', 'Sarajevo', 'Skopje', 'Stockholm', 'Vienna', 'Warsaw', 'West Central Africa', 'Zagreb', 'Zurich', 'Athens', 'Bucharest', 'Cairo', 'Harare', 'Helsinki', 'Jerusalem', 'Kaliningrad', 'Kyiv', 'Pretoria', 'Riga', 'Sofia', 'Tallinn', 'Vilnius', 'Baghdad', 'Istanbul', 'Kuwait', 'Minsk', 'Moscow', 'Nairobi', 'Riyadh', 'St. Petersburg', 'Volgograd', 'Tehran', 'Abu Dhabi', 'Baku', 'Muscat', 'Samara', 'Tbilisi', 'Yerevan', 'Kabul', 'Almaty', 'Ekaterinburg', 'Islamabad', 'Karachi', 'Tashkent', 'Chennai', 'Kolkata', 'Mumbai', 'New Delhi', 'Sri Jayawardenepura', 'Kathmandu', 'Astana', 'Dhaka', 'Urumqi', 'Rangoon', 'Bangkok', 'Hanoi', 'Jakarta', 'Krasnoyarsk', 'Novosibirsk', 'Beijing', 'Chongqing', 'Hong Kong', 'Irkutsk', 'Kuala Lumpur', 'Perth', 'Singapore', 'Taipei', 'Ulaanbaatar', 'Osaka', 'Sapporo', 'Seoul', 'Tokyo', 'Yakutsk', 'Adelaide', 'Darwin', 'Brisbane', 'Canberra', 'Guam', 'Hobart', 'Melbourne', 'Port Moresby', 'Sydney', 'Vladivostok', 'Magadan', 'New Caledonia', 'Solomon Is.', 'Srednekolymsk', 'Auckland', 'Fiji', 'Kamchatka', 'Marshall Is.', 'Wellington', 'Chatham Is.', 'Nuku'alofa', 'Samoa', 'Tokelau Is.'", "name": "timezone", "shortname": null, "value": "ENUM" @@ -51625,7 +51455,7 @@ "value": "LIST" }, { - "help": "User's timezone Possible value(s): 'International Date Line West', 'American Samoa', 'Midway Island', 'Hawaii', 'Alaska', 'Pacific Time (US & Canada)', 'Tijuana', 'Arizona', 'Mazatlan', 'Mountain Time (US & Canada)', 'Central America', 'Central Time (US & Canada)', 'Chihuahua', 'Guadalajara', 'Mexico City', 'Monterrey', 'Saskatchewan', 'Bogota', 'Eastern Time (US & Canada)', 'Indiana (East)', 'Lima', 'Quito', 'Atlantic Time (Canada)', 'Caracas', 'Georgetown', 'La Paz', 'Puerto Rico', 'Santiago', 'Newfoundland', 'Brasilia', 'Buenos Aires', 'Greenland', 'Montevideo', 'Mid-Atlantic', 'Azores', 'Cape Verde Is.', 'Casablanca', 'Dublin', 'Edinburgh', 'Lisbon', 'London', 'Monrovia', 'UTC', 'Amsterdam', 'Belgrade', 'Berlin', 'Bern', 'Bratislava', 'Brussels', 'Budapest', 'Copenhagen', 'Ljubljana', 'Madrid', 'Paris', 'Prague', 'Rome', 'Sarajevo', 'Skopje', 'Stockholm', 'Vienna', 'Warsaw', 'West Central Africa', 'Zagreb', 'Zurich', 'Athens', 'Bucharest', 'Cairo', 'Harare', 'Helsinki', 'Jerusalem', 'Kaliningrad', 'Kyiv', 'Pretoria', 'Riga', 'Sofia', 'Tallinn', 'Vilnius', 'Baghdad', 'Istanbul', 'Kuwait', 'Minsk', 'Moscow', 'Nairobi', 'Riyadh', 'St. Petersburg', 'Volgograd', 'Tehran', 'Abu Dhabi', 'Baku', 'Muscat', 'Samara', 'Tbilisi', 'Yerevan', 'Kabul', 'Ekaterinburg', 'Islamabad', 'Karachi', 'Tashkent', 'Chennai', 'Kolkata', 'Mumbai', 'New Delhi', 'Sri Jayawardenepura', 'Kathmandu', 'Almaty', 'Astana', 'Dhaka', 'Urumqi', 'Rangoon', 'Bangkok', 'Hanoi', 'Jakarta', 'Krasnoyarsk', 'Novosibirsk', 'Beijing', 'Chongqing', 'Hong Kong', 'Irkutsk', 'Kuala Lumpur', 'Perth', 'Singapore', 'Taipei', 'Ulaanbaatar', 'Osaka', 'Sapporo', 'Seoul', 'Tokyo', 'Yakutsk', 'Adelaide', 'Darwin', 'Brisbane', 'Canberra', 'Guam', 'Hobart', 'Melbourne', 'Port Moresby', 'Sydney', 'Vladivostok', 'Magadan', 'New Caledonia', 'Solomon Is.', 'Srednekolymsk', 'Auckland', 'Fiji', 'Kamchatka', 'Marshall Is.', 'Wellington', 'Chatham Is.', 'Nuku'alofa', 'Samoa', 'Tokelau Is.'", + "help": "User's timezone Possible value(s): 'International Date Line West', 'American Samoa', 'Midway Island', 'Hawaii', 'Alaska', 'Pacific Time (US & Canada)', 'Tijuana', 'Arizona', 'Mazatlan', 'Mountain Time (US & Canada)', 'Central America', 'Central Time (US & Canada)', 'Chihuahua', 'Guadalajara', 'Mexico City', 'Monterrey', 'Saskatchewan', 'Bogota', 'Eastern Time (US & Canada)', 'Indiana (East)', 'Lima', 'Quito', 'Atlantic Time (Canada)', 'Caracas', 'Georgetown', 'La Paz', 'Puerto Rico', 'Santiago', 'Newfoundland', 'Brasilia', 'Buenos Aires', 'Montevideo', 'Greenland', 'Mid-Atlantic', 'Azores', 'Cape Verde Is.', 'Casablanca', 'Dublin', 'Edinburgh', 'Lisbon', 'London', 'Monrovia', 'UTC', 'Amsterdam', 'Belgrade', 'Berlin', 'Bern', 'Bratislava', 'Brussels', 'Budapest', 'Copenhagen', 'Ljubljana', 'Madrid', 'Paris', 'Prague', 'Rome', 'Sarajevo', 'Skopje', 'Stockholm', 'Vienna', 'Warsaw', 'West Central Africa', 'Zagreb', 'Zurich', 'Athens', 'Bucharest', 'Cairo', 'Harare', 'Helsinki', 'Jerusalem', 'Kaliningrad', 'Kyiv', 'Pretoria', 'Riga', 'Sofia', 'Tallinn', 'Vilnius', 'Baghdad', 'Istanbul', 'Kuwait', 'Minsk', 'Moscow', 'Nairobi', 'Riyadh', 'St. Petersburg', 'Volgograd', 'Tehran', 'Abu Dhabi', 'Baku', 'Muscat', 'Samara', 'Tbilisi', 'Yerevan', 'Kabul', 'Almaty', 'Ekaterinburg', 'Islamabad', 'Karachi', 'Tashkent', 'Chennai', 'Kolkata', 'Mumbai', 'New Delhi', 'Sri Jayawardenepura', 'Kathmandu', 'Astana', 'Dhaka', 'Urumqi', 'Rangoon', 'Bangkok', 'Hanoi', 'Jakarta', 'Krasnoyarsk', 'Novosibirsk', 'Beijing', 'Chongqing', 'Hong Kong', 'Irkutsk', 'Kuala Lumpur', 'Perth', 'Singapore', 'Taipei', 'Ulaanbaatar', 'Osaka', 'Sapporo', 'Seoul', 'Tokyo', 'Yakutsk', 'Adelaide', 'Darwin', 'Brisbane', 'Canberra', 'Guam', 'Hobart', 'Melbourne', 'Port Moresby', 'Sydney', 'Vladivostok', 'Magadan', 'New Caledonia', 'Solomon Is.', 'Srednekolymsk', 'Auckland', 'Fiji', 'Kamchatka', 'Marshall Is.', 'Wellington', 'Chatham Is.', 'Nuku'alofa', 'Samoa', 'Tokelau Is.'", "name": "timezone", "shortname": null, "value": "ENUM" @@ -52794,12 +52624,6 @@ "shortname": null, "value": "BOOLEAN" }, - { - "help": "The frequency of VM-to-host mapping updates for AHV(in seconds)", - "name": "ahv-update-interval", - "shortname": null, - "value": "NUMBER" - }, { "help": "Hypervisor blacklist, applicable only when filtering mode is set to 2. Wildcards and regular expressions are supported, multiple records must be separated by comma.", "name": "blacklist", @@ -53207,7 +53031,7 @@ "value": null }, { - "help": "Print help -----------------------------------------|-----|-------- | ALL | DEFAULT -----------------------------------------|-----|-------- information/id | x | x information/name | x | x information/hypervisor type | x | x information/hypervisor server | x | x information/hypervisor username | x | x information/configuration file | x | x information/ahv prism flavor | x | x information/ahv update frequency | x | x information/enable ahv debug | x | x information/status | x | x Schedule/interval | x | x Schedule/last report at | x | x Connection/satellite server | x | x Connection/hypervisor id | x | x Connection/filtering | x | x Connection/excluded hosts | x | x Connection/filtered hosts | x | x Connection/filter host parents | x | x Connection/exclude host parents | x | x Connection/debug mode | x | x Connection/ignore proxy | x | x proxy/http proxy id | x | x proxy/http proxy name | x | x proxy/http proxy url | x | x Locations/ | x | x Organizations/ | x | x -----------------------------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", + "help": "Print help ----------------------------------------|-----|-------- | ALL | DEFAULT ----------------------------------------|-----|-------- information/id | x | x information/name | x | x information/hypervisor type | x | x information/hypervisor server | x | x information/hypervisor username | x | x information/configuration file | x | x information/ahv prism flavor | x | x information/enable ahv debug | x | x information/status | x | x Schedule/interval | x | x Schedule/last report at | x | x Connection/satellite server | x | x Connection/hypervisor id | x | x Connection/filtering | x | x Connection/excluded hosts | x | x Connection/filtered hosts | x | x Connection/filter host parents | x | x Connection/exclude host parents | x | x Connection/debug mode | x | x Connection/ignore proxy | x | x proxy/http proxy id | x | x proxy/http proxy name | x | x proxy/http proxy url | x | x Locations/ | x | x Organizations/ | x | x ----------------------------------------|-----|-------- you can find option types and the value an option can accept: One of true/false, yes/no, 1/0 Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format Possible values are described in the option's description Path to a file Comma-separated list of key=value. JSON is acceptable and preferred way for such parameters Comma separated list of values. Values containing comma should be quoted or escaped with backslash. JSON is acceptable and preferred way for such parameters Any combination of possible values described in the option's description Numeric value. Integer Comma separated list of values defined by a schema. JSON is acceptable and preferred way for such parameters Value described in the option's description. Mostly simple string", "name": "help", "shortname": "h", "value": null @@ -53304,12 +53128,6 @@ "shortname": null, "value": "BOOLEAN" }, - { - "help": "The frequency of VM-to-host mapping updates for AHV(in seconds)", - "name": "ahv-update-interval", - "shortname": null, - "value": "NUMBER" - }, { "help": "Hypervisor blacklist, applicable only when filtering mode is set to 2. Wildcards and regular expressions are supported, multiple records must be separated by comma.", "name": "blacklist", @@ -53506,7 +53324,7 @@ "value": "BOOLEAN" }, { - "help": "Possible value(s): 'actions.katello.content_view.promote_succeeded', 'actions.katello.content_view.publish_succeeded', 'actions.katello.repository.sync_succeeded', 'actions.remote_execution.run_host_job_ansible_configure_cloud_connector_succeeded', 'actions.remote_execution.run_host_job_ansible_enable_web_console_succeeded', 'actions.remote_execution.run_host_job_ansible_run_capsule_upgrade_succeeded', 'actions.remote_execution.run_host_job_ansible_run_host_succeeded', 'actions.remote_execution.run_host_job_ansible_run_insights_plan_succeeded', 'actions.remote_execution.run_host_job_ansible_run_playbook_succeeded', 'actions.remote_execution.run_host_job_foreman_openscap_run_oval_scans_succeeded', 'actions.remote_execution.run_host_job_foreman_openscap_run_scans_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_remove_succeeded', 'actions.remote_execution.run_host_job_katello_group_update_succeeded', 'actions.remote_execution.run_host_job_katello_host_tracer_resolve_succeeded', 'actions.remote_execution.run_host_job_katello_module_stream_action_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_succeeded', 'actions.remote_execution.run_host_job_katello_package_remove_succeeded', 'actions.remote_execution.run_host_job_katello_package_update_succeeded', 'actions.remote_execution.run_host_job_katello_packages_remove_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_packages_update_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_service_restart_succeeded', 'actions.remote_execution.run_host_job_leapp_preupgrade_succeeded', 'actions.remote_execution.run_host_job_leapp_remediation_plan_succeeded', 'actions.remote_execution.run_host_job_leapp_upgrade_succeeded', 'actions.remote_execution.run_host_job_puppet_run_host_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_connector_run_playbook_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_remediate_hosts_succeeded', 'actions.remote_execution.run_host_job_succeeded', 'build_entered', 'build_exited', 'content_view_created', 'content_view_destroyed', 'content_view_updated', 'domain_created', 'domain_destroyed', 'domain_updated', 'host_created', 'host_destroyed', 'host_updated', 'hostgroup_created', 'hostgroup_destroyed', 'hostgroup_updated', 'model_created', 'model_destroyed', 'model_updated', 'status_changed', 'subnet_created', 'subnet_destroyed', 'subnet_updated', 'user_created', 'user_destroyed', 'user_updated'", + "help": "Possible value(s): 'actions.katello.capsule_content.sync_failed', 'actions.katello.capsule_content.sync_succeeded', 'actions.katello.content_view.promote_failed', 'actions.katello.content_view.promote_succeeded', 'actions.katello.content_view.publish_failed', 'actions.katello.content_view.publish_succeeded', 'actions.katello.repository.sync_failed', 'actions.katello.repository.sync_succeeded', 'actions.remote_execution.run_host_job_ansible_configure_cloud_connector_failed', 'actions.remote_execution.run_host_job_ansible_configure_cloud_connector_succeeded', 'actions.remote_execution.run_host_job_ansible_enable_web_console_failed', 'actions.remote_execution.run_host_job_ansible_enable_web_console_succeeded', 'actions.remote_execution.run_host_job_ansible_run_capsule_upgrade_failed', 'actions.remote_execution.run_host_job_ansible_run_capsule_upgrade_succeeded', 'actions.remote_execution.run_host_job_ansible_run_host_failed', 'actions.remote_execution.run_host_job_ansible_run_host_succeeded', 'actions.remote_execution.run_host_job_ansible_run_insights_plan_failed', 'actions.remote_execution.run_host_job_ansible_run_insights_plan_succeeded', 'actions.remote_execution.run_host_job_ansible_run_playbook_failed', 'actions.remote_execution.run_host_job_ansible_run_playbook_succeeded', 'actions.remote_execution.run_host_job_failed', 'actions.remote_execution.run_host_job_foreman_openscap_run_oval_scans_failed', 'actions.remote_execution.run_host_job_foreman_openscap_run_oval_scans_succeeded', 'actions.remote_execution.run_host_job_foreman_openscap_run_scans_failed', 'actions.remote_execution.run_host_job_foreman_openscap_run_scans_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_by_search_failed', 'actions.remote_execution.run_host_job_katello_errata_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_failed', 'actions.remote_execution.run_host_job_katello_errata_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_install_failed', 'actions.remote_execution.run_host_job_katello_group_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_remove_failed', 'actions.remote_execution.run_host_job_katello_group_remove_succeeded', 'actions.remote_execution.run_host_job_katello_group_update_failed', 'actions.remote_execution.run_host_job_katello_group_update_succeeded', 'actions.remote_execution.run_host_job_katello_host_tracer_resolve_failed', 'actions.remote_execution.run_host_job_katello_host_tracer_resolve_succeeded', 'actions.remote_execution.run_host_job_katello_module_stream_action_failed', 'actions.remote_execution.run_host_job_katello_module_stream_action_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_by_search_failed', 'actions.remote_execution.run_host_job_katello_package_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_failed', 'actions.remote_execution.run_host_job_katello_package_install_succeeded', 'actions.remote_execution.run_host_job_katello_package_remove_failed', 'actions.remote_execution.run_host_job_katello_package_remove_succeeded', 'actions.remote_execution.run_host_job_katello_package_update_failed', 'actions.remote_execution.run_host_job_katello_package_update_succeeded', 'actions.remote_execution.run_host_job_katello_packages_remove_by_search_failed', 'actions.remote_execution.run_host_job_katello_packages_remove_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_packages_update_by_search_failed', 'actions.remote_execution.run_host_job_katello_packages_update_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_service_restart_failed', 'actions.remote_execution.run_host_job_katello_service_restart_succeeded', 'actions.remote_execution.run_host_job_leapp_preupgrade_failed', 'actions.remote_execution.run_host_job_leapp_preupgrade_succeeded', 'actions.remote_execution.run_host_job_leapp_remediation_plan_failed', 'actions.remote_execution.run_host_job_leapp_remediation_plan_succeeded', 'actions.remote_execution.run_host_job_leapp_upgrade_failed', 'actions.remote_execution.run_host_job_leapp_upgrade_succeeded', 'actions.remote_execution.run_host_job_puppet_run_host_failed', 'actions.remote_execution.run_host_job_puppet_run_host_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_connector_run_playbook_failed', 'actions.remote_execution.run_host_job_rh_cloud_connector_run_playbook_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_remediate_hosts_failed', 'actions.remote_execution.run_host_job_rh_cloud_remediate_hosts_succeeded', 'actions.remote_execution.run_host_job_run_script_failed', 'actions.remote_execution.run_host_job_run_script_succeeded', 'actions.remote_execution.run_host_job_succeeded', 'actions.remote_execution.run_hosts_job_ansible_configure_cloud_connector_failed', 'actions.remote_execution.run_hosts_job_ansible_configure_cloud_connector_running', 'actions.remote_execution.run_hosts_job_ansible_configure_cloud_connector_succeeded', 'actions.remote_execution.run_hosts_job_ansible_enable_web_console_failed', 'actions.remote_execution.run_hosts_job_ansible_enable_web_console_running', 'actions.remote_execution.run_hosts_job_ansible_enable_web_console_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_capsule_upgrade_failed', 'actions.remote_execution.run_hosts_job_ansible_run_capsule_upgrade_running', 'actions.remote_execution.run_hosts_job_ansible_run_capsule_upgrade_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_host_failed', 'actions.remote_execution.run_hosts_job_ansible_run_host_running', 'actions.remote_execution.run_hosts_job_ansible_run_host_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_insights_plan_failed', 'actions.remote_execution.run_hosts_job_ansible_run_insights_plan_running', 'actions.remote_execution.run_hosts_job_ansible_run_insights_plan_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_playbook_failed', 'actions.remote_execution.run_hosts_job_ansible_run_playbook_running', 'actions.remote_execution.run_hosts_job_ansible_run_playbook_succeeded', 'actions.remote_execution.run_hosts_job_failed', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_oval_scans_failed', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_oval_scans_running', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_oval_scans_succeeded', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_scans_failed', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_scans_running', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_scans_succeeded', 'actions.remote_execution.run_hosts_job_katello_errata_install_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_errata_install_by_search_running', 'actions.remote_execution.run_hosts_job_katello_errata_install_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_errata_install_failed', 'actions.remote_execution.run_hosts_job_katello_errata_install_running', 'actions.remote_execution.run_hosts_job_katello_errata_install_succeeded', 'actions.remote_execution.run_hosts_job_katello_group_install_failed', 'actions.remote_execution.run_hosts_job_katello_group_install_running', 'actions.remote_execution.run_hosts_job_katello_group_install_succeeded', 'actions.remote_execution.run_hosts_job_katello_group_remove_failed', 'actions.remote_execution.run_hosts_job_katello_group_remove_running', 'actions.remote_execution.run_hosts_job_katello_group_remove_succeeded', 'actions.remote_execution.run_hosts_job_katello_group_update_failed', 'actions.remote_execution.run_hosts_job_katello_group_update_running', 'actions.remote_execution.run_hosts_job_katello_group_update_succeeded', 'actions.remote_execution.run_hosts_job_katello_host_tracer_resolve_failed', 'actions.remote_execution.run_hosts_job_katello_host_tracer_resolve_running', 'actions.remote_execution.run_hosts_job_katello_host_tracer_resolve_succeeded', 'actions.remote_execution.run_hosts_job_katello_module_stream_action_failed', 'actions.remote_execution.run_hosts_job_katello_module_stream_action_running', 'actions.remote_execution.run_hosts_job_katello_module_stream_action_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_install_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_package_install_by_search_running', 'actions.remote_execution.run_hosts_job_katello_package_install_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_install_failed', 'actions.remote_execution.run_hosts_job_katello_package_install_running', 'actions.remote_execution.run_hosts_job_katello_package_install_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_remove_failed', 'actions.remote_execution.run_hosts_job_katello_package_remove_running', 'actions.remote_execution.run_hosts_job_katello_package_remove_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_update_failed', 'actions.remote_execution.run_hosts_job_katello_package_update_running', 'actions.remote_execution.run_hosts_job_katello_package_update_succeeded', 'actions.remote_execution.run_hosts_job_katello_packages_remove_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_packages_remove_by_search_running', 'actions.remote_execution.run_hosts_job_katello_packages_remove_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_packages_update_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_packages_update_by_search_running', 'actions.remote_execution.run_hosts_job_katello_packages_update_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_service_restart_failed', 'actions.remote_execution.run_hosts_job_katello_service_restart_running', 'actions.remote_execution.run_hosts_job_katello_service_restart_succeeded', 'actions.remote_execution.run_hosts_job_leapp_preupgrade_failed', 'actions.remote_execution.run_hosts_job_leapp_preupgrade_running', 'actions.remote_execution.run_hosts_job_leapp_preupgrade_succeeded', 'actions.remote_execution.run_hosts_job_leapp_remediation_plan_failed', 'actions.remote_execution.run_hosts_job_leapp_remediation_plan_running', 'actions.remote_execution.run_hosts_job_leapp_remediation_plan_succeeded', 'actions.remote_execution.run_hosts_job_leapp_upgrade_failed', 'actions.remote_execution.run_hosts_job_leapp_upgrade_running', 'actions.remote_execution.run_hosts_job_leapp_upgrade_succeeded', 'actions.remote_execution.run_hosts_job_puppet_run_host_failed', 'actions.remote_execution.run_hosts_job_puppet_run_host_running', 'actions.remote_execution.run_hosts_job_puppet_run_host_succeeded', 'actions.remote_execution.run_hosts_job_rh_cloud_connector_run_playbook_failed', 'actions.remote_execution.run_hosts_job_rh_cloud_connector_run_playbook_running', 'actions.remote_execution.run_hosts_job_rh_cloud_connector_run_playbook_succeeded', 'actions.remote_execution.run_hosts_job_rh_cloud_remediate_hosts_failed', 'actions.remote_execution.run_hosts_job_rh_cloud_remediate_hosts_running', 'actions.remote_execution.run_hosts_job_rh_cloud_remediate_hosts_succeeded', 'actions.remote_execution.run_hosts_job_run_script_failed', 'actions.remote_execution.run_hosts_job_run_script_running', 'actions.remote_execution.run_hosts_job_run_script_succeeded', 'actions.remote_execution.run_hosts_job_running', 'actions.remote_execution.run_hosts_job_succeeded', 'build_entered', 'build_exited', 'content_view_created', 'content_view_destroyed', 'content_view_updated', 'domain_created', 'domain_destroyed', 'domain_updated', 'host_created', 'host_destroyed', 'host_facts_updated', 'host_updated', 'hostgroup_created', 'hostgroup_destroyed', 'hostgroup_updated', 'model_created', 'model_destroyed', 'model_updated', 'status_changed', 'subnet_created', 'subnet_destroyed', 'subnet_updated', 'user_created', 'user_destroyed', 'user_updated'", "name": "event", "shortname": null, "value": "ENUM" @@ -53846,7 +53664,7 @@ "value": "BOOLEAN" }, { - "help": "Possible value(s): 'actions.katello.content_view.promote_succeeded', 'actions.katello.content_view.publish_succeeded', 'actions.katello.repository.sync_succeeded', 'actions.remote_execution.run_host_job_ansible_configure_cloud_connector_succeeded', 'actions.remote_execution.run_host_job_ansible_enable_web_console_succeeded', 'actions.remote_execution.run_host_job_ansible_run_capsule_upgrade_succeeded', 'actions.remote_execution.run_host_job_ansible_run_host_succeeded', 'actions.remote_execution.run_host_job_ansible_run_insights_plan_succeeded', 'actions.remote_execution.run_host_job_ansible_run_playbook_succeeded', 'actions.remote_execution.run_host_job_foreman_openscap_run_oval_scans_succeeded', 'actions.remote_execution.run_host_job_foreman_openscap_run_scans_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_remove_succeeded', 'actions.remote_execution.run_host_job_katello_group_update_succeeded', 'actions.remote_execution.run_host_job_katello_host_tracer_resolve_succeeded', 'actions.remote_execution.run_host_job_katello_module_stream_action_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_succeeded', 'actions.remote_execution.run_host_job_katello_package_remove_succeeded', 'actions.remote_execution.run_host_job_katello_package_update_succeeded', 'actions.remote_execution.run_host_job_katello_packages_remove_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_packages_update_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_service_restart_succeeded', 'actions.remote_execution.run_host_job_leapp_preupgrade_succeeded', 'actions.remote_execution.run_host_job_leapp_remediation_plan_succeeded', 'actions.remote_execution.run_host_job_leapp_upgrade_succeeded', 'actions.remote_execution.run_host_job_puppet_run_host_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_connector_run_playbook_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_remediate_hosts_succeeded', 'actions.remote_execution.run_host_job_succeeded', 'build_entered', 'build_exited', 'content_view_created', 'content_view_destroyed', 'content_view_updated', 'domain_created', 'domain_destroyed', 'domain_updated', 'host_created', 'host_destroyed', 'host_updated', 'hostgroup_created', 'hostgroup_destroyed', 'hostgroup_updated', 'model_created', 'model_destroyed', 'model_updated', 'status_changed', 'subnet_created', 'subnet_destroyed', 'subnet_updated', 'user_created', 'user_destroyed', 'user_updated'", + "help": "Possible value(s): 'actions.katello.capsule_content.sync_failed', 'actions.katello.capsule_content.sync_succeeded', 'actions.katello.content_view.promote_failed', 'actions.katello.content_view.promote_succeeded', 'actions.katello.content_view.publish_failed', 'actions.katello.content_view.publish_succeeded', 'actions.katello.repository.sync_failed', 'actions.katello.repository.sync_succeeded', 'actions.remote_execution.run_host_job_ansible_configure_cloud_connector_failed', 'actions.remote_execution.run_host_job_ansible_configure_cloud_connector_succeeded', 'actions.remote_execution.run_host_job_ansible_enable_web_console_failed', 'actions.remote_execution.run_host_job_ansible_enable_web_console_succeeded', 'actions.remote_execution.run_host_job_ansible_run_capsule_upgrade_failed', 'actions.remote_execution.run_host_job_ansible_run_capsule_upgrade_succeeded', 'actions.remote_execution.run_host_job_ansible_run_host_failed', 'actions.remote_execution.run_host_job_ansible_run_host_succeeded', 'actions.remote_execution.run_host_job_ansible_run_insights_plan_failed', 'actions.remote_execution.run_host_job_ansible_run_insights_plan_succeeded', 'actions.remote_execution.run_host_job_ansible_run_playbook_failed', 'actions.remote_execution.run_host_job_ansible_run_playbook_succeeded', 'actions.remote_execution.run_host_job_failed', 'actions.remote_execution.run_host_job_foreman_openscap_run_oval_scans_failed', 'actions.remote_execution.run_host_job_foreman_openscap_run_oval_scans_succeeded', 'actions.remote_execution.run_host_job_foreman_openscap_run_scans_failed', 'actions.remote_execution.run_host_job_foreman_openscap_run_scans_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_by_search_failed', 'actions.remote_execution.run_host_job_katello_errata_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_errata_install_failed', 'actions.remote_execution.run_host_job_katello_errata_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_install_failed', 'actions.remote_execution.run_host_job_katello_group_install_succeeded', 'actions.remote_execution.run_host_job_katello_group_remove_failed', 'actions.remote_execution.run_host_job_katello_group_remove_succeeded', 'actions.remote_execution.run_host_job_katello_group_update_failed', 'actions.remote_execution.run_host_job_katello_group_update_succeeded', 'actions.remote_execution.run_host_job_katello_host_tracer_resolve_failed', 'actions.remote_execution.run_host_job_katello_host_tracer_resolve_succeeded', 'actions.remote_execution.run_host_job_katello_module_stream_action_failed', 'actions.remote_execution.run_host_job_katello_module_stream_action_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_by_search_failed', 'actions.remote_execution.run_host_job_katello_package_install_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_package_install_failed', 'actions.remote_execution.run_host_job_katello_package_install_succeeded', 'actions.remote_execution.run_host_job_katello_package_remove_failed', 'actions.remote_execution.run_host_job_katello_package_remove_succeeded', 'actions.remote_execution.run_host_job_katello_package_update_failed', 'actions.remote_execution.run_host_job_katello_package_update_succeeded', 'actions.remote_execution.run_host_job_katello_packages_remove_by_search_failed', 'actions.remote_execution.run_host_job_katello_packages_remove_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_packages_update_by_search_failed', 'actions.remote_execution.run_host_job_katello_packages_update_by_search_succeeded', 'actions.remote_execution.run_host_job_katello_service_restart_failed', 'actions.remote_execution.run_host_job_katello_service_restart_succeeded', 'actions.remote_execution.run_host_job_leapp_preupgrade_failed', 'actions.remote_execution.run_host_job_leapp_preupgrade_succeeded', 'actions.remote_execution.run_host_job_leapp_remediation_plan_failed', 'actions.remote_execution.run_host_job_leapp_remediation_plan_succeeded', 'actions.remote_execution.run_host_job_leapp_upgrade_failed', 'actions.remote_execution.run_host_job_leapp_upgrade_succeeded', 'actions.remote_execution.run_host_job_puppet_run_host_failed', 'actions.remote_execution.run_host_job_puppet_run_host_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_connector_run_playbook_failed', 'actions.remote_execution.run_host_job_rh_cloud_connector_run_playbook_succeeded', 'actions.remote_execution.run_host_job_rh_cloud_remediate_hosts_failed', 'actions.remote_execution.run_host_job_rh_cloud_remediate_hosts_succeeded', 'actions.remote_execution.run_host_job_run_script_failed', 'actions.remote_execution.run_host_job_run_script_succeeded', 'actions.remote_execution.run_host_job_succeeded', 'actions.remote_execution.run_hosts_job_ansible_configure_cloud_connector_failed', 'actions.remote_execution.run_hosts_job_ansible_configure_cloud_connector_running', 'actions.remote_execution.run_hosts_job_ansible_configure_cloud_connector_succeeded', 'actions.remote_execution.run_hosts_job_ansible_enable_web_console_failed', 'actions.remote_execution.run_hosts_job_ansible_enable_web_console_running', 'actions.remote_execution.run_hosts_job_ansible_enable_web_console_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_capsule_upgrade_failed', 'actions.remote_execution.run_hosts_job_ansible_run_capsule_upgrade_running', 'actions.remote_execution.run_hosts_job_ansible_run_capsule_upgrade_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_host_failed', 'actions.remote_execution.run_hosts_job_ansible_run_host_running', 'actions.remote_execution.run_hosts_job_ansible_run_host_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_insights_plan_failed', 'actions.remote_execution.run_hosts_job_ansible_run_insights_plan_running', 'actions.remote_execution.run_hosts_job_ansible_run_insights_plan_succeeded', 'actions.remote_execution.run_hosts_job_ansible_run_playbook_failed', 'actions.remote_execution.run_hosts_job_ansible_run_playbook_running', 'actions.remote_execution.run_hosts_job_ansible_run_playbook_succeeded', 'actions.remote_execution.run_hosts_job_failed', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_oval_scans_failed', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_oval_scans_running', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_oval_scans_succeeded', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_scans_failed', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_scans_running', 'actions.remote_execution.run_hosts_job_foreman_openscap_run_scans_succeeded', 'actions.remote_execution.run_hosts_job_katello_errata_install_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_errata_install_by_search_running', 'actions.remote_execution.run_hosts_job_katello_errata_install_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_errata_install_failed', 'actions.remote_execution.run_hosts_job_katello_errata_install_running', 'actions.remote_execution.run_hosts_job_katello_errata_install_succeeded', 'actions.remote_execution.run_hosts_job_katello_group_install_failed', 'actions.remote_execution.run_hosts_job_katello_group_install_running', 'actions.remote_execution.run_hosts_job_katello_group_install_succeeded', 'actions.remote_execution.run_hosts_job_katello_group_remove_failed', 'actions.remote_execution.run_hosts_job_katello_group_remove_running', 'actions.remote_execution.run_hosts_job_katello_group_remove_succeeded', 'actions.remote_execution.run_hosts_job_katello_group_update_failed', 'actions.remote_execution.run_hosts_job_katello_group_update_running', 'actions.remote_execution.run_hosts_job_katello_group_update_succeeded', 'actions.remote_execution.run_hosts_job_katello_host_tracer_resolve_failed', 'actions.remote_execution.run_hosts_job_katello_host_tracer_resolve_running', 'actions.remote_execution.run_hosts_job_katello_host_tracer_resolve_succeeded', 'actions.remote_execution.run_hosts_job_katello_module_stream_action_failed', 'actions.remote_execution.run_hosts_job_katello_module_stream_action_running', 'actions.remote_execution.run_hosts_job_katello_module_stream_action_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_install_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_package_install_by_search_running', 'actions.remote_execution.run_hosts_job_katello_package_install_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_install_failed', 'actions.remote_execution.run_hosts_job_katello_package_install_running', 'actions.remote_execution.run_hosts_job_katello_package_install_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_remove_failed', 'actions.remote_execution.run_hosts_job_katello_package_remove_running', 'actions.remote_execution.run_hosts_job_katello_package_remove_succeeded', 'actions.remote_execution.run_hosts_job_katello_package_update_failed', 'actions.remote_execution.run_hosts_job_katello_package_update_running', 'actions.remote_execution.run_hosts_job_katello_package_update_succeeded', 'actions.remote_execution.run_hosts_job_katello_packages_remove_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_packages_remove_by_search_running', 'actions.remote_execution.run_hosts_job_katello_packages_remove_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_packages_update_by_search_failed', 'actions.remote_execution.run_hosts_job_katello_packages_update_by_search_running', 'actions.remote_execution.run_hosts_job_katello_packages_update_by_search_succeeded', 'actions.remote_execution.run_hosts_job_katello_service_restart_failed', 'actions.remote_execution.run_hosts_job_katello_service_restart_running', 'actions.remote_execution.run_hosts_job_katello_service_restart_succeeded', 'actions.remote_execution.run_hosts_job_leapp_preupgrade_failed', 'actions.remote_execution.run_hosts_job_leapp_preupgrade_running', 'actions.remote_execution.run_hosts_job_leapp_preupgrade_succeeded', 'actions.remote_execution.run_hosts_job_leapp_remediation_plan_failed', 'actions.remote_execution.run_hosts_job_leapp_remediation_plan_running', 'actions.remote_execution.run_hosts_job_leapp_remediation_plan_succeeded', 'actions.remote_execution.run_hosts_job_leapp_upgrade_failed', 'actions.remote_execution.run_hosts_job_leapp_upgrade_running', 'actions.remote_execution.run_hosts_job_leapp_upgrade_succeeded', 'actions.remote_execution.run_hosts_job_puppet_run_host_failed', 'actions.remote_execution.run_hosts_job_puppet_run_host_running', 'actions.remote_execution.run_hosts_job_puppet_run_host_succeeded', 'actions.remote_execution.run_hosts_job_rh_cloud_connector_run_playbook_failed', 'actions.remote_execution.run_hosts_job_rh_cloud_connector_run_playbook_running', 'actions.remote_execution.run_hosts_job_rh_cloud_connector_run_playbook_succeeded', 'actions.remote_execution.run_hosts_job_rh_cloud_remediate_hosts_failed', 'actions.remote_execution.run_hosts_job_rh_cloud_remediate_hosts_running', 'actions.remote_execution.run_hosts_job_rh_cloud_remediate_hosts_succeeded', 'actions.remote_execution.run_hosts_job_run_script_failed', 'actions.remote_execution.run_hosts_job_run_script_running', 'actions.remote_execution.run_hosts_job_run_script_succeeded', 'actions.remote_execution.run_hosts_job_running', 'actions.remote_execution.run_hosts_job_succeeded', 'build_entered', 'build_exited', 'content_view_created', 'content_view_destroyed', 'content_view_updated', 'domain_created', 'domain_destroyed', 'domain_updated', 'host_created', 'host_destroyed', 'host_facts_updated', 'host_updated', 'hostgroup_created', 'hostgroup_destroyed', 'hostgroup_updated', 'model_created', 'model_destroyed', 'model_updated', 'status_changed', 'subnet_created', 'subnet_destroyed', 'subnet_updated', 'user_created', 'user_destroyed', 'user_updated'", "name": "event", "shortname": null, "value": "ENUM" From 2a30688f3782004573bbfe0a0ecba156d70c02ff Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Fri, 12 Apr 2024 13:59:02 +0200 Subject: [PATCH 112/150] sca entitement for dashboard test (#14763) --- tests/foreman/ui/test_dashboard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/foreman/ui/test_dashboard.py b/tests/foreman/ui/test_dashboard.py index b55891475ef..5cc044e1e5c 100644 --- a/tests/foreman/ui/test_dashboard.py +++ b/tests/foreman/ui/test_dashboard.py @@ -193,7 +193,7 @@ def test_positive_task_status(session, target_sat): ) def test_positive_user_access_with_host_filter( test_name, - function_entitlement_manifest_org, + function_sca_manifest_org, module_location, rhel_contenthost, target_sat, @@ -221,7 +221,7 @@ def test_positive_user_access_with_host_filter( """ user_login = gen_string('alpha') user_password = gen_string('alphanumeric') - org = function_entitlement_manifest_org + org = function_sca_manifest_org lce = target_sat.api.LifecycleEnvironment(organization=org).create() # create a role with necessary permissions role = target_sat.api.Role().create() From 483aecc2d3cdd20bf3803d981458cc0f58aeece6 Mon Sep 17 00:00:00 2001 From: Griffin Sullivan <48397354+Griffin-Sullivan@users.noreply.github.com> Date: Fri, 12 Apr 2024 09:30:42 -0400 Subject: [PATCH 113/150] Fix and update capsule certificate validation (#14748) --- .../destructive/test_katello_certs_check.py | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/tests/foreman/destructive/test_katello_certs_check.py b/tests/foreman/destructive/test_katello_certs_check.py index 01c41441823..ce42047973a 100644 --- a/tests/foreman/destructive/test_katello_certs_check.py +++ b/tests/foreman/destructive/test_katello_certs_check.py @@ -15,8 +15,6 @@ import pytest -from robottelo.utils.issue_handlers import is_open - pytestmark = pytest.mark.destructive @@ -214,42 +212,31 @@ def test_positive_validate_capsule_certificate(capsule_certs_teardown): :CaseAutomation: Automated """ file_setup, target_sat = capsule_certs_teardown - DNS_Check = False + # extract the cert from the tar file result = target_sat.execute( f'tar -xf {file_setup["tmp_dir"]}/capsule_certs.tar ' f'--directory {file_setup["tmp_dir"]}/ ' ) assert result.status == 0, 'Extraction to working directory failed.' - # Extract raw data from RPM to a file - target_sat.execute( - 'rpm2cpio {0}/ssl-build/{1}/' - '{1}-qpid-router-server*.rpm' - '>> {0}/ssl-build/{1}/cert-raw-data'.format( - file_setup['tmp_dir'], file_setup['capsule_hostname'] - ) - ) + # Extract the cert data from file cert-raw-data and write to cert-data target_sat.execute( - 'openssl x509 -noout -text -in {0}/ssl-build/{1}/cert-raw-data' + 'openssl x509 -noout -text -in {0}/ssl-build/{1}/{1}-apache.crt' '>> {0}/ssl-build/{1}/cert-data'.format( file_setup['tmp_dir'], file_setup['capsule_hostname'] ) ) + # use same location on remote and local for cert_file target_sat.get(file_setup['caps_cert_file']) + # search the file for the line with DNS with open(file_setup['caps_cert_file']) as file: for line in file: if re.search(r'\bDNS:', line): match = re.search(r'{}'.format(file_setup['capsule_hostname']), line) assert match, 'No proxy name found.' - if is_open('BZ:1747581'): - DNS_Check = True - else: - match = re.search(r'\[]', line) - assert not match, 'Incorrect parsing of alternative proxy name.' - DNS_Check = True + match = re.search(r'\[]', line) + assert not match, 'Incorrect parsing of alternative proxy name.' break - # if no match for "DNS:" found, then raise error. - assert DNS_Check, 'Cannot find Subject Alternative Name' From f3d0aefa4422a3204c6e834593a332f1091f6425 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Fri, 12 Apr 2024 17:36:46 +0200 Subject: [PATCH 114/150] Flip entitlement to SCA in destructive caps content (#14761) --- tests/foreman/destructive/test_capsulecontent.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/foreman/destructive/test_capsulecontent.py b/tests/foreman/destructive/test_capsulecontent.py index 12f3455c08d..d060ae29c78 100644 --- a/tests/foreman/destructive/test_capsulecontent.py +++ b/tests/foreman/destructive/test_capsulecontent.py @@ -23,7 +23,7 @@ @pytest.mark.tier4 @pytest.mark.skip_if_not_set('capsule') def test_positive_sync_without_deadlock( - target_sat, large_capsule_configured, function_entitlement_manifest_org + target_sat, large_capsule_configured, function_sca_manifest_org ): """Synchronize one bigger repo published in multiple CVs to a blank Capsule. Assert that the sync task succeeds and no deadlock happens. @@ -54,7 +54,7 @@ def test_positive_sync_without_deadlock( # the lower rpms count. When the BZ is fixed, reconsider upscale to RHEL7 repo or similar. repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch=constants.DEFAULT_ARCHITECTURE, - org_id=function_entitlement_manifest_org.id, + org_id=function_sca_manifest_org.id, product=constants.REPOS['rhscl7']['product'], repo=constants.REPOS['rhscl7']['name'], reposet=constants.REPOSET['rhscl7'], @@ -63,7 +63,7 @@ def test_positive_sync_without_deadlock( repo = target_sat.api.Repository(id=repo_id).read() repo.sync(timeout='60m') - cv = target_sat.publish_content_view(function_entitlement_manifest_org, repo) + cv = target_sat.publish_content_view(function_sca_manifest_org, repo) for _ in range(4): copy_id = target_sat.api.ContentView(id=cv.id).copy(data={'name': gen_alpha()})['id'] @@ -75,9 +75,9 @@ def test_positive_sync_without_deadlock( proxy.update(['download_policy']) nailgun_capsule = large_capsule_configured.nailgun_capsule - lce = target_sat.api.LifecycleEnvironment( - organization=function_entitlement_manifest_org - ).search(query={'search': f'name={constants.ENVIRONMENT}'})[0] + lce = target_sat.api.LifecycleEnvironment(organization=function_sca_manifest_org).search( + query={'search': f'name={constants.ENVIRONMENT}'} + )[0] nailgun_capsule.content_add_lifecycle_environment(data={'environment_id': lce.id}) result = nailgun_capsule.content_lifecycle_environments() assert len(result['results']) == 1 @@ -89,7 +89,7 @@ def test_positive_sync_without_deadlock( @pytest.mark.tier4 @pytest.mark.skip_if_not_set('capsule') def test_positive_sync_without_deadlock_after_rpm_trim_changelog( - target_sat, capsule_configured, function_entitlement_manifest_org + target_sat, capsule_configured, function_sca_manifest_org ): """Promote a CV published with larger repos into multiple LCEs, assign LCEs to blank Capsule. Assert that the sync task succeeds and no deadlock happens. @@ -115,7 +115,7 @@ def test_positive_sync_without_deadlock_after_rpm_trim_changelog( :BZ: 2170535, 2218661 """ - org = function_entitlement_manifest_org + org = function_sca_manifest_org rh_repos = [] tasks = [] LCE_COUNT = 10 From 4a1c2e3b6a6c67ad755889ec550754b871fbcb5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:31:53 -0400 Subject: [PATCH 115/150] Bump pascalgn/automerge-action from 0.16.2 to 0.16.3 (#14767) --- .github/workflows/auto_cherry_pick_merge.yaml | 2 +- .github/workflows/dependency_merge.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto_cherry_pick_merge.yaml b/.github/workflows/auto_cherry_pick_merge.yaml index 63a579e3ed7..32bb94dec6c 100644 --- a/.github/workflows/auto_cherry_pick_merge.yaml +++ b/.github/workflows/auto_cherry_pick_merge.yaml @@ -67,7 +67,7 @@ jobs: - id: automerge name: Auto merge of cherry-picked PRs. - uses: "pascalgn/automerge-action@v0.16.2" + uses: "pascalgn/automerge-action@v0.16.3" env: GITHUB_TOKEN: "${{ secrets.CHERRYPICK_PAT }}" MERGE_LABELS: "AutoMerge_Cherry_Picked, Auto_Cherry_Picked" diff --git a/.github/workflows/dependency_merge.yml b/.github/workflows/dependency_merge.yml index f549c5c6e69..9db5b452fb9 100644 --- a/.github/workflows/dependency_merge.yml +++ b/.github/workflows/dependency_merge.yml @@ -61,7 +61,7 @@ jobs: - id: automerge name: Auto merge of dependabot PRs. - uses: "pascalgn/automerge-action@v0.16.2" + uses: "pascalgn/automerge-action@v0.16.3" env: GITHUB_TOKEN: "${{ secrets.CHERRYPICK_PAT }}" MERGE_LABELS: "dependencies" From 21e1d4184a0b35f5bb72a5770326ee9088b54421 Mon Sep 17 00:00:00 2001 From: yanpliu Date: Mon, 15 Apr 2024 09:06:44 -0400 Subject: [PATCH 116/150] virt-who config SCA-compliant (#14775) --- tests/upgrades/test_virtwho.py | 48 +++++++--------------------------- 1 file changed, 9 insertions(+), 39 deletions(-) diff --git a/tests/upgrades/test_virtwho.py b/tests/upgrades/test_virtwho.py index 95b36ec5749..e86868ebf37 100644 --- a/tests/upgrades/test_virtwho.py +++ b/tests/upgrades/test_virtwho.py @@ -57,7 +57,7 @@ class TestScenarioPositiveVirtWho: @pytest.mark.pre_upgrade def test_pre_create_virt_who_configuration( - self, form_data, save_test_data, target_sat, function_entitlement_manifest + self, form_data, save_test_data, target_sat, module_sca_manifest_org ): """Create and deploy virt-who configuration. @@ -69,57 +69,27 @@ def test_pre_create_virt_who_configuration( 1. Config can be created and deployed by command. 2. No error msg in /var/log/rhsm/rhsm.log. 3. Report is sent to satellite. - 4. Virtual sku can be generated and attached. """ - org = target_sat.api.Organization(name=ORG_DATA['name']).create() - target_sat.api.Location(organization=[org]).create() - org.sca_disable() - target_sat.upload_manifest(org.id, function_entitlement_manifest.content) - form_data.update({'organization_id': org.id}) + form_data.update({'organization_id': module_sca_manifest_org.id}) vhd = target_sat.api.VirtWhoConfig(**form_data).create() assert vhd.status == 'unknown' - command = get_configure_command(vhd.id, org=org.name) + command = get_configure_command(vhd.id, org=module_sca_manifest_org.name) hypervisor_name, guest_name = deploy_configure_by_command( - command, form_data['hypervisor_type'], debug=True, org=org.label + command, form_data['hypervisor_type'], debug=True, org=module_sca_manifest_org.label ) virt_who_instance = ( - target_sat.api.VirtWhoConfig(organization_id=org.id) + target_sat.api.VirtWhoConfig(organization_id=module_sca_manifest_org.id) .search(query={'search': f'name={form_data["name"]}'})[0] .status ) assert virt_who_instance == 'ok' - hosts = [ - (hypervisor_name, f'product_id={settings.virtwho.sku.vdc_physical} and type=NORMAL'), - (guest_name, f'product_id={settings.virtwho.sku.vdc_physical} and type=STACK_DERIVED'), - ] - for hostname, sku in hosts: - host = target_sat.cli.Host.list({'search': hostname})[0] - subscriptions = target_sat.cli.Subscription.list( - {'organization-id': org.id, 'search': sku} - ) - vdc_id = subscriptions[0]['id'] - if 'type=STACK_DERIVED' in sku: - for item in subscriptions: - if hypervisor_name.lower() in item['type']: - vdc_id = item['id'] - break - target_sat.api.HostSubscription(host=host['id']).add_subscriptions( - data={'subscriptions': [{'id': vdc_id, 'quantity': 'Automatic'}]} - ) - result = ( - target_sat.api.Host(organization=org.id) - .search(query={'search': hostname})[0] - .read_json() - ) - assert result['subscription_status_label'] == 'Fully entitled' - save_test_data( { 'hypervisor_name': hypervisor_name, 'guest_name': guest_name, - 'org_id': org.id, - 'org_name': org.name, - 'org_label': org.label, + 'org_id': module_sca_manifest_org.id, + 'org_name': module_sca_manifest_org.name, + 'org_label': module_sca_manifest_org.label, 'name': vhd.name, } ) @@ -174,7 +144,7 @@ def test_post_crud_virt_who_configuration(self, form_data, pre_upgrade_data, tar .search(query={'search': hostname})[0] .read_json() ) - assert result['subscription_status_label'] == 'Fully entitled' + assert result['subscription_status_label'] == 'Simple Content Access' # Verify the virt-who config-file exists. config_file = get_configure_file(vhd.id) From db5b3d5a3cffb8a827782b4ea4e979fb59c5a38a Mon Sep 17 00:00:00 2001 From: rmynar <64528205+rmynar@users.noreply.github.com> Date: Mon, 15 Apr 2024 15:58:17 +0200 Subject: [PATCH 117/150] Add coverage for BZ1964539 (#14519) --- tests/foreman/installer/test_installer.py | 35 +++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index 0aaab90bc5c..32c1a507d92 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -1392,8 +1392,13 @@ def sat_non_default_install(module_sat_ready_rhels): f'foreman-initial-admin-password {settings.server.admin_password}', 'foreman-rails-cache-store type:file', 'foreman-proxy-content-pulpcore-hide-guarded-distributions false', + 'enable-foreman-plugin-discovery', + 'foreman-proxy-plugin-discovery-install-images true', ] install_satellite(module_sat_ready_rhels[1], installer_args, enable_fapolicyd=True) + module_sat_ready_rhels[1].execute( + 'dnf -y --disableplugin=foreman-protector install foreman-discovery-image' + ) return module_sat_ready_rhels[1] @@ -1837,3 +1842,33 @@ def test_satellite_installation(installer_satellite): assert installer_satellite.execute('rpm -q foreman-redis').status == 0 settings_file = installer_satellite.load_remote_yaml_file(FOREMAN_SETTINGS_YML) assert settings_file.rails_cache_store.type == 'redis' + + +@pytest.mark.pit_server +@pytest.mark.parametrize('package', ['nmap-ncat']) +def test_weak_dependency(sat_non_default_install, package): + """Check if Satellite and its (sub)components do not require certain (potentially insecure) packages. On an existing Satellite the package has to be either not installed or can be safely removed. + + :id: c7988920-2f8c-4646-bde9-8823a3ca96bb + + :steps: + 1. Use satellite with non-default setup (for 'nmap-ncat' enable foreman discovery plugin and install foreman-discovery-image) + 2. Attempt to remove the package + + :expectedresults: + 1. The package can be either not installed or can be removed without removing any Satellite or Foreman packages + + :BZ: 1964539 + + :customerscenario: true + """ + result = sat_non_default_install.execute(f'dnf remove -y {package} --setopt tsflags=test') + + # no satellite or foreman package to be removed + assert 'satellite' not in result.stdout.lower() + assert 'foreman' not in result.stdout.lower() + # package not installed (nothing to remove) or safely removable + assert ( + 'No packages marked for removal.' in result.stderr + or 'Transaction test succeeded.' in result.stdout + ) From 4b9be13004192749b9fdb75db298ce561dc8dee7 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:05:12 +0200 Subject: [PATCH 118/150] Flip SyncPlan tests to SCA (#14784) --- tests/foreman/api/test_syncplan.py | 8 ++++---- tests/foreman/cli/test_syncplan.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/foreman/api/test_syncplan.py b/tests/foreman/api/test_syncplan.py index 3ecbfac8714..860d2e1486b 100644 --- a/tests/foreman/api/test_syncplan.py +++ b/tests/foreman/api/test_syncplan.py @@ -783,7 +783,7 @@ def test_positive_synchronize_custom_products_future_sync_date(module_org, reque @pytest.mark.run_in_one_thread @pytest.mark.tier4 def test_positive_synchronize_rh_product_past_sync_date( - request, function_entitlement_manifest_org, target_sat + request, function_sca_manifest_org, target_sat ): """Create a sync plan with past datetime as a sync date, add a RH product and verify the product gets synchronized on the next sync @@ -799,7 +799,7 @@ def test_positive_synchronize_rh_product_past_sync_date( """ interval = 60 * 60 # 'hourly' sync interval in seconds delay = 2 * 60 - org = function_entitlement_manifest_org + org = function_sca_manifest_org repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', org_id=org.id, @@ -851,7 +851,7 @@ def test_positive_synchronize_rh_product_past_sync_date( @pytest.mark.tier4 @pytest.mark.upgrade def test_positive_synchronize_rh_product_future_sync_date( - request, function_entitlement_manifest_org, target_sat + request, function_sca_manifest_org, target_sat ): """Create a sync plan with sync date in a future and sync one RH product with it automatically. @@ -861,7 +861,7 @@ def test_positive_synchronize_rh_product_future_sync_date( :expectedresults: Product is synchronized successfully. """ delay = 2 * 60 # delay for sync date in seconds - org = function_entitlement_manifest_org + org = function_sca_manifest_org repo_id = target_sat.api_factory.enable_rhrepo_and_fetchid( basearch='x86_64', org_id=org.id, diff --git a/tests/foreman/cli/test_syncplan.py b/tests/foreman/cli/test_syncplan.py index 8669cd49a18..129686447f4 100644 --- a/tests/foreman/cli/test_syncplan.py +++ b/tests/foreman/cli/test_syncplan.py @@ -580,7 +580,7 @@ def test_positive_synchronize_custom_products_future_sync_date(module_org, reque @pytest.mark.tier4 @pytest.mark.upgrade def test_positive_synchronize_rh_product_past_sync_date( - target_sat, function_entitlement_manifest_org, request + target_sat, function_sca_manifest_org, request ): """Create a sync plan with past datetime as a sync date, add a RH product and verify the product gets synchronized on the next sync @@ -594,7 +594,7 @@ def test_positive_synchronize_rh_product_past_sync_date( """ interval = 60 * 60 # 'hourly' sync interval in seconds delay = 2 * 60 - org = function_entitlement_manifest_org + org = function_sca_manifest_org target_sat.cli.RepositorySet.enable( { 'name': REPOSET['rhva6'], @@ -647,7 +647,7 @@ def test_positive_synchronize_rh_product_past_sync_date( @pytest.mark.tier4 @pytest.mark.upgrade def test_positive_synchronize_rh_product_future_sync_date( - target_sat, function_entitlement_manifest_org, request + target_sat, function_sca_manifest_org, request ): """Create a sync plan with sync date in a future and sync one RH product with it automatically. @@ -661,7 +661,7 @@ def test_positive_synchronize_rh_product_future_sync_date( cron_multiple = 5 # sync event is on every multiple of this value, starting from 00 mins delay = (cron_multiple) * 60 # delay for sync date in seconds guardtime = 180 # do not start test less than 2 mins before the next sync event - org = function_entitlement_manifest_org + org = function_sca_manifest_org target_sat.cli.RepositorySet.enable( { 'name': REPOSET['rhva6'], From e021d3c526353a69baff80c39b6a0e3c0f4a9601 Mon Sep 17 00:00:00 2001 From: Shweta Singh Date: Tue, 16 Apr 2024 17:52:55 +0530 Subject: [PATCH 119/150] Remove the sub-man status (#14783) --- tests/foreman/api/test_convert2rhel.py | 4 ---- tests/foreman/cli/test_registration.py | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/tests/foreman/api/test_convert2rhel.py b/tests/foreman/api/test_convert2rhel.py index d7033ab427c..c78d06f0acc 100644 --- a/tests/foreman/api/test_convert2rhel.py +++ b/tests/foreman/api/test_convert2rhel.py @@ -291,8 +291,6 @@ def test_convert2rhel_oracle(module_target_sat, oracle, activation_key_rhel, ver or host_content['operatingsystem_name'].startswith(f'RedHat {version}') or host_content['operatingsystem_name'].startswith(f'RHEL {version}') ) - assert host_content['subscription_status_label'] == 'Simple Content Access' - assert host_content['subscription_status'] == 5 @pytest.mark.e2e @@ -349,5 +347,3 @@ def test_convert2rhel_centos(module_target_sat, centos, activation_key_rhel, ver or host_content['operatingsystem_name'].startswith(f'RedHat {version}') or host_content['operatingsystem_name'].startswith(f'RHEL {version}') ) - assert host_content['subscription_status_label'] == 'Simple Content Access' - assert host_content['subscription_status'] == 5 diff --git a/tests/foreman/cli/test_registration.py b/tests/foreman/cli/test_registration.py index e3bc35fa58b..34f3fb7f7b6 100644 --- a/tests/foreman/cli/test_registration.py +++ b/tests/foreman/cli/test_registration.py @@ -203,9 +203,9 @@ def test_positive_force_register_twice(module_ak_with_cv, module_org, rhel_conte assert f'The system has been registered with ID: {reg_id_new}' in str(result.stdout) assert reg_id_new != reg_id_old assert ( - target_sat.cli.Host.info({'name': rhel_contenthost.hostname})['subscription-information'][ - 'uuid' - ] + target_sat.cli.Host.info({'name': rhel_contenthost.hostname}, output_format='json')[ + 'subscription-information' + ]['uuid'] == reg_id_new ) From 869694e9aa80389bad80224dbabeaaf91d5cabc2 Mon Sep 17 00:00:00 2001 From: vsedmik <46570670+vsedmik@users.noreply.github.com> Date: Tue, 16 Apr 2024 21:54:07 +0200 Subject: [PATCH 120/150] Add some randomness to CV publish break down (#14782) * Add some randomness to CV publish break down * Parametrize for f-m service restart too --- tests/foreman/destructive/test_contentview.py | 105 ++++++++++-------- 1 file changed, 58 insertions(+), 47 deletions(-) diff --git a/tests/foreman/destructive/test_contentview.py b/tests/foreman/destructive/test_contentview.py index 03af433a939..d6b39f7556b 100644 --- a/tests/foreman/destructive/test_contentview.py +++ b/tests/foreman/destructive/test_contentview.py @@ -11,6 +11,9 @@ :CaseImportance: High """ +import random +from time import sleep + from nailgun.entity_mixins import TaskFailedError import pytest @@ -19,73 +22,81 @@ pytestmark = pytest.mark.destructive +@pytest.fixture(scope='module') +def module_big_repos(module_target_sat, module_sca_manifest_org): + """Enables and syncs three bigger RH repos""" + repos = [] + for tag in ['rhel7_optional', 'rhel7_extra', 'rhel7_sup']: + id = module_target_sat.api_factory.enable_rhrepo_and_fetchid( + basearch=constants.DEFAULT_ARCHITECTURE, + org_id=module_sca_manifest_org.id, + product=constants.REPOS[tag]['product'], + repo=constants.REPOS[tag]['name'], + reposet=constants.REPOS[tag]['reposet'], + releasever=constants.REPOS[tag]['releasever'], + ) + repo = module_target_sat.api.Repository(id=id).read() + repos.append(repo) + repo.sync(synchronous=False) + module_target_sat.wait_for_tasks( + search_query=( + f'label = Actions::Katello::Repository::Sync and organization_id = {module_sca_manifest_org.id}' + ), + poll_timeout=750, + search_rate=10, + max_tries=75, + ) + return repos + + @pytest.mark.tier4 @pytest.mark.run_in_one_thread -def test_positive_reboot_recover_cv_publish(target_sat, function_entitlement_manifest_org): +@pytest.mark.parametrize('reboot', [True, False], ids=['vm_reboot', 'fm_restart']) +def test_positive_reboot_recover_cv_publish( + module_target_sat, module_sca_manifest_org, module_big_repos, reboot +): """Reboot the Satellite during publish and resume publishing :id: cceae727-81db-40a4-9c26-05ca6e93464e - :steps: - 1. Create and publish a Content View - 2. Reboot the Satellite while publish is running - 3. Check Foreman Tasks + :parametrized: yes - :expectedresults: Publish continues after reboot and finishes successfully + :setup: + 1. Enable and sync 3 bigger RH repos. - :CaseImportance: High + :steps: + 1. Create and publish a Content View with the setup repos. + 2. Reboot or restart the Satellite while publish is running. + 3. Check Foreman Tasks. - :CaseAutomation: Automated + :expectedresults: Publish continues after reboot/restart and finishes successfully. """ - org = function_entitlement_manifest_org - rhel7_extra = target_sat.api_factory.enable_rhrepo_and_fetchid( - basearch='x86_64', - org_id=org.id, - product=constants.PRDS['rhel'], - repo=constants.REPOS['rhel7_extra']['name'], - reposet=constants.REPOSET['rhel7_extra'], - releasever=None, - ) - rhel7_optional = target_sat.api_factory.enable_rhrepo_and_fetchid( - basearch='x86_64', - org_id=org.id, - product=constants.PRDS['rhel'], - repo=constants.REPOS['rhel7_optional']['name'], - reposet=constants.REPOSET['rhel7_optional'], - releasever=constants.REPOS['rhel7_optional']['releasever'], - ) - rhel7_sup = target_sat.api_factory.enable_rhrepo_and_fetchid( - basearch='x86_64', - org_id=org.id, - product=constants.PRDS['rhel'], - repo=constants.REPOS['rhel7_sup']['name'], - reposet=constants.REPOSET['rhel7_sup'], - releasever=constants.REPOS['rhel7_sup']['releasever'], - ) - rhel7_extra = target_sat.api.Repository(id=rhel7_extra).read() - rhel7_optional = target_sat.api.Repository(id=rhel7_optional).read() - rhel7_sup = target_sat.api.Repository(id=rhel7_sup).read() - for repo in [rhel7_extra, rhel7_optional, rhel7_sup]: - repo.sync(timeout=1200) - cv = target_sat.api.ContentView( - organization=org, + cv = module_target_sat.api.ContentView( + organization=module_sca_manifest_org, solve_dependencies=True, - repository=[rhel7_extra, rhel7_sup, rhel7_optional], + repository=module_big_repos, ).create() try: publish_task = cv.publish(synchronous=False) - target_sat.power_control(state='reboot', ensure=True) - target_sat.wait_for_tasks( + sleep_time = random.randint(0, 60) # publish takes ~70s in 6.15 and SatLab VM + sleep(sleep_time) + if reboot: + module_target_sat.power_control(state='reboot', ensure=True) + else: + module_target_sat.cli.Service.restart() + module_target_sat.wait_for_tasks( search_query=(f'id = {publish_task["id"]}'), search_rate=30, max_tries=60, ) except TaskFailedError: - target_sat.api.ForemanTask().bulk_resume(data={"task_ids": [publish_task['id']]}) - target_sat.wait_for_tasks( + module_target_sat.api.ForemanTask().bulk_resume(data={"task_ids": [publish_task['id']]}) + module_target_sat.wait_for_tasks( search_query=(f'id = {publish_task["id"]}'), search_rate=30, max_tries=60, ) - task_status = target_sat.api.ForemanTask(id=publish_task['id']).poll() - assert task_status['result'] == 'success' + task_status = module_target_sat.api.ForemanTask(id=publish_task['id']).poll() + assert ( + task_status['result'] == 'success' + ), f'Publish after restart failed, sleep_time was {sleep_time}' From 7e7fe235bd05363e518516be6a4085868fe58da4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 00:07:55 -0400 Subject: [PATCH 121/150] Bump sphinx from 7.2.6 to 7.3.4 (#14791) --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index 9cc9c0300f1..30d1b9ca738 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -5,7 +5,7 @@ redis==5.0.3 pre-commit==3.7.0 # For generating documentation. -sphinx==7.2.6 +sphinx==7.3.4 sphinx-autoapi==3.0.0 # For 'manage' interactive shell From 785b2e53dc9abd145ffe0c1312f8ac221fa22bf5 Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Wed, 17 Apr 2024 09:37:39 +0200 Subject: [PATCH 122/150] Remove foreman-maintain snapshot backup related code (#14774) Snapshot backup option has been removed in 6.16 --- robottelo/cli/sm_advanced.py | 7 ---- robottelo/cli/sm_backup.py | 3 +- tests/foreman/maintain/test_backup_restore.py | 33 ------------------- 3 files changed, 1 insertion(+), 42 deletions(-) diff --git a/robottelo/cli/sm_advanced.py b/robottelo/cli/sm_advanced.py index 42ba037b811..4c2b4ffb33d 100644 --- a/robottelo/cli/sm_advanced.py +++ b/robottelo/cli/sm_advanced.py @@ -23,13 +23,6 @@ backup-online-safety-confirmation Data consistency warning backup-prepare-directory Prepare backup Directory backup-pulp Backup Pulp data - backup-snapshot-clean-mount Remove the snapshot mount points - backup-snapshot-logical-volume-confirmation Check if backup is on different LV then the source - backup-snapshot-mount-candlepin-db Create and mount snapshot of Candlepin DB - backup-snapshot-mount-foreman-db Create and mount snapshot of Foreman DB - backup-snapshot-mount-pulp Create and mount snapshot of Pulp data - backup-snapshot-mount-pulpcore-db Create and mount snapshot of Pulpcore DB - backup-snapshot-prepare-mount Prepare mount point for the snapshot content-migration-reset Reset the Pulp 2 to Pulp 3 migration data (pre-switchover) content-migration-stats Retrieve Pulp 2 to Pulp 3 migration statistics content-prepare Prepare content for Pulp 3 diff --git a/robottelo/cli/sm_backup.py b/robottelo/cli/sm_backup.py index 8da59080151..ef703134cfa 100644 --- a/robottelo/cli/sm_backup.py +++ b/robottelo/cli/sm_backup.py @@ -9,7 +9,6 @@ Subcommands: online Keep services online during backup offline Shut down services to preserve consistent backup - snapshot Use snapshots of the databases to create backup Options: -h, --help print help @@ -24,7 +23,7 @@ class Backup(Base): @classmethod def run_backup(cls, backup_dir='/tmp/', backup_type='online', options=None, timeout=None): - """Build satellite-maintain backup online/offline/snapshot""" + """Build satellite-maintain backup online/offline""" cls.command_sub = backup_type cls.command_end = backup_dir options = options or {} diff --git a/tests/foreman/maintain/test_backup_restore.py b/tests/foreman/maintain/test_backup_restore.py index f81b268e844..4abe8aa0391 100644 --- a/tests/foreman/maintain/test_backup_restore.py +++ b/tests/foreman/maintain/test_backup_restore.py @@ -326,39 +326,6 @@ def test_negative_backup_incremental_nodir(sat_maintain, setup_backup_tests, bac assert NOPREV_MSG in str(result.stderr) -@pytest.mark.include_capsule -def test_negative_backup_maintenance_mode(sat_maintain, setup_backup_tests): - """Try to take a backup which would fail and verify maintenance-mode isn't running/ON - - :id: dd53c19c-4ebf-11ed-a3d2-932dbdabb055 - - :parametrized: yes - - :steps: - 1. try to create a snapshot backup which would fail - - :expectedresults: - 1. Verify maintenance-mode isn't running if backup fails - - :BZ: 1908478, 1962842 - - :customerscenario: true - """ - subdir = f'{BACKUP_DIR}backup-{gen_string("alpha")}' - result = sat_maintain.cli.Backup.run_backup( - backup_dir=subdir, - backup_type='snapshot', - options={'assumeyes': True, 'plaintext': True}, - ) - assert result.status != 0 - assert "Backup didn't finish. Incomplete backup was removed." in result.stdout - - result = sat_maintain.cli.MaintenanceMode.status() - assert result.status == 0 - assert 'Status of maintenance-mode: Off' in result.stdout - assert 'Nftables table: absent' in result.stdout - - @pytest.mark.include_capsule def test_negative_restore_baddir_nodir(sat_maintain, setup_backup_tests): """Try to run restore with non-existing source dir provided From 8476e500a726387ce67394c1c3ad895df34b255f Mon Sep 17 00:00:00 2001 From: dosas Date: Wed, 17 Apr 2024 11:41:57 +0200 Subject: [PATCH 123/150] Fix upstream api permission tests (#14475) * add more checks for installed rpm packages * speedup by querying rpm -qa ony once * some tests were not update with this commit https://github.com/SatelliteQE/robottelo/commit/6651dd63b4c308b3f7f3601f0e69d76b4c602b29#diff-9a55ae74469aa91ad5efb2b9068f73174467cd0c00d45abf7d35f9f2277a7632 --- robottelo/constants/__init__.py | 49 ++++++++++++++++------------ tests/foreman/api/test_permission.py | 33 +++++++++++-------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 8857efd00a3..905203407fc 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -975,13 +975,6 @@ class Colored(Box): 'view_discovery_rules', ], 'Domain': ['view_domains', 'create_domains', 'edit_domains', 'destroy_domains'], - # 'Environment': [ - # 'view_environments', - # 'create_environments', - # 'edit_environments', - # 'destroy_environments', - # 'import_environments', - # ], 'ExternalUsergroup': [ 'view_external_usergroups', 'create_external_usergroups', @@ -1059,19 +1052,35 @@ class Colored(Box): 'destroy_hostgroups', 'play_roles_on_hostgroup', ], - # 'Puppetclass': [ - # 'view_puppetclasses', - # 'create_puppetclasses', - # 'edit_puppetclasses', - # 'destroy_puppetclasses', - # 'import_puppetclasses', - # ], - # 'PuppetclassLookupKey': [ - # 'view_external_parameters', - # 'create_external_parameters', - # 'edit_external_parameters', - # 'destroy_external_parameters', - # ], + 'ForemanPuppet::ConfigGroup': [ + 'view_config_groups', + 'create_config_groups', + 'edit_config_groups', + 'destroy_config_groups', + ], + 'ForemanPuppet::Environment': [ + 'view_environments', + 'create_environments', + 'edit_environments', + 'destroy_environments', + 'import_environments', + ], + 'ForemanPuppet::HostClass': [ + 'edit_classes', + ], + 'ForemanPuppet::Puppetclass': [ + 'view_puppetclasses', + 'create_puppetclasses', + 'edit_puppetclasses', + 'destroy_puppetclasses', + 'import_puppetclasses', + ], + 'ForemanPuppet::PuppetclassLookupKey': [ + 'view_external_parameters', + 'create_external_parameters', + 'edit_external_parameters', + 'destroy_external_parameters', + ], 'HttpProxy': [ 'view_http_proxies', 'create_http_proxies', diff --git a/tests/foreman/api/test_permission.py b/tests/foreman/api/test_permission.py index eda73028c61..f072d0d734f 100644 --- a/tests/foreman/api/test_permission.py +++ b/tests/foreman/api/test_permission.py @@ -38,28 +38,35 @@ def create_permissions(self, class_target_sat): # workaround for setting class variables cls = type(self) cls.permissions = PERMISSIONS.copy() - if class_target_sat.is_upstream: - cls.permissions[None].extend(cls.permissions.pop('DiscoveryRule')) - cls.permissions[None].remove('app_root') - cls.permissions[None].remove('attachments') - cls.permissions[None].remove('configuration') - cls.permissions[None].remove('logs') - cls.permissions[None].remove('view_cases') - cls.permissions[None].remove('view_log_viewer') - - result = class_target_sat.execute('rpm -qa | grep rubygem-foreman_openscap') - if result.status != 0: + + rpm_packages = class_target_sat.execute('rpm -qa').stdout + if 'rubygem-foreman_rh_cloud' not in rpm_packages: + cls.permissions.pop('InsightsHit') + cls.permissions[None].remove('generate_foreman_rh_cloud') + cls.permissions[None].remove('view_foreman_rh_cloud') + cls.permissions[None].remove('dispatch_cloud_requests') + cls.permissions[None].remove('control_organization_insights') + if 'rubygem-foreman_bootdisk' not in rpm_packages: + cls.permissions[None].remove('download_bootdisk') + if 'rubygem-foreman_virt_who_configure' not in rpm_packages: + cls.permissions.pop('ForemanVirtWhoConfigure::Config') + if 'rubygem-foreman_openscap' not in rpm_packages: cls.permissions.pop('ForemanOpenscap::Policy') cls.permissions.pop('ForemanOpenscap::ScapContent') cls.permissions[None].remove('destroy_arf_reports') cls.permissions[None].remove('view_arf_reports') cls.permissions[None].remove('create_arf_reports') - result = class_target_sat.execute('rpm -qa | grep rubygem-foreman_remote_execution') - if result.status != 0: + if 'rubygem-foreman_remote_execution' not in rpm_packages: cls.permissions.pop('JobInvocation') cls.permissions.pop('JobTemplate') cls.permissions.pop('RemoteExecutionFeature') cls.permissions.pop('TemplateInvocation') + if 'rubygem-foreman_puppet' not in rpm_packages: + cls.permissions.pop('ForemanPuppet::ConfigGroup') + cls.permissions.pop('ForemanPuppet::Environment') + cls.permissions.pop('ForemanPuppet::HostClass') + cls.permissions.pop('ForemanPuppet::Puppetclass') + cls.permissions.pop('ForemanPuppet::PuppetclassLookupKey') #: e.g. ['Architecture', 'Audit', 'AuthSourceLdap', …] cls.permission_resource_types = list(cls.permissions.keys()) From 5ffc26b9ff402402c281184b46b0a259bd2dc82c Mon Sep 17 00:00:00 2001 From: dosas Date: Wed, 17 Apr 2024 13:27:24 +0200 Subject: [PATCH 124/150] Fix typo for hammer cli create repo (#14801) content_type --> content-type --- tests/foreman/cli/test_repository.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/foreman/cli/test_repository.py b/tests/foreman/cli/test_repository.py index 7120bedf34c..6d612029d15 100644 --- a/tests/foreman/cli/test_repository.py +++ b/tests/foreman/cli/test_repository.py @@ -2017,7 +2017,7 @@ def test_positive_accessible_content_status( @pytest.mark.tier2 @pytest.mark.parametrize( 'repo_options', - **parametrized([{'content_type': 'yum', 'url': CUSTOM_RPM_SHA}]), + **parametrized([{'content-type': 'yum', 'url': CUSTOM_RPM_SHA}]), indirect=True, ) def test_positive_sync_sha_repo(self, repo_options, module_target_sat): @@ -2042,7 +2042,7 @@ def test_positive_sync_sha_repo(self, repo_options, module_target_sat): @pytest.mark.tier2 @pytest.mark.parametrize( 'repo_options', - **parametrized([{'content_type': 'yum', 'url': CUSTOM_3RD_PARTY_REPO}]), + **parametrized([{'content-type': 'yum', 'url': CUSTOM_3RD_PARTY_REPO}]), indirect=True, ) def test_positive_sync_third_party_repo(self, repo_options, module_target_sat): From 11858fa660cf3528617f0d69837f139732a01517 Mon Sep 17 00:00:00 2001 From: David Moore <109112035+damoore044@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:40:50 -0400 Subject: [PATCH 125/150] Test CV incremental update & publish time (#14749) Test incremental update time --- robottelo/constants/__init__.py | 2 + tests/foreman/longrun/test_inc_updates.py | 109 ++++++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 905203407fc..7c82cfdfd8d 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -416,6 +416,7 @@ class Colored(Box): 'reposet': REPOSET['rhsclient8'], 'product': PRDS['rhel8'], 'distro': 'rhel8', + 'releasever': None, 'key': PRODUCT_KEY_SAT_CLIENT, }, 'rhsclient9': { @@ -515,6 +516,7 @@ class Colored(Box): 'reposet': REPOSET['rhst8'], 'product': PRDS['rhel8'], 'distro': 'rhel8', + 'releasever': None, 'key': 'rhst', }, 'kickstart': { diff --git a/tests/foreman/longrun/test_inc_updates.py b/tests/foreman/longrun/test_inc_updates.py index bc44be316ae..693f9441e45 100644 --- a/tests/foreman/longrun/test_inc_updates.py +++ b/tests/foreman/longrun/test_inc_updates.py @@ -22,9 +22,11 @@ ENVIRONMENT, FAKE_4_CUSTOM_PACKAGE, PRDS, + REAL_RHEL8_1_ERRATA_ID, REPOS, REPOSET, ) +from robottelo.logging import logger pytestmark = [pytest.mark.run_in_one_thread] @@ -212,3 +214,110 @@ def test_positive_noapply_api( outval['action'] == 'Incremental Update of 1 Content View Version(s) with 1 Package(s), and 1 Errata' ) + + +@pytest.mark.tier3 +def test_positive_incremental_update_time(module_target_sat, module_sca_manifest_org): + """Incremental update should not take a long time. + + :id: a9cdcc58-2d10-42cf-8e24-f7bec3b79d6b + + :steps: + 1. Setup larger rh repositories; rhel8 baseOS, rhst8, rhsc8. + 2. Create content view and add repos, sync and wait. + 3. Publish a content view version with all content. + 4. Using hammer, perform incremental update with errata, on that new version. + - Log the duration of the incremental update + 5. Publish the full content-view, with added incremental version. + - Log the duration of the content-view publish + + :expectedresults: + 1. Incremental update takes a short amount of time. + 2. Incremental update takes less time than full content-view publish, + or the time taken for both was close (within 20%). + + :BZ: 2117760, 1829266 + + :customerscenario: true + + """ + # create content view + cv = module_target_sat.cli_factory.make_content_view( + {'organization-id': module_sca_manifest_org.id} + ) + repo_sync_timestamp = ( + datetime.utcnow().replace(microsecond=0) - timedelta(seconds=1) + ).strftime('%Y-%m-%d %H:%M') + # setup rh repositories, add to cv, begin sync + for _repo in ['rhel8_bos', 'rhst8', 'rhsclient8']: + rh_repo_id = module_target_sat.api_factory.enable_rhrepo_and_fetchid( + basearch=DEFAULT_ARCHITECTURE, + org_id=module_sca_manifest_org.id, + product=PRDS['rhel8'], + repo=REPOS[_repo]['name'], + reposet=REPOSET[_repo], + releasever=REPOS[_repo]['releasever'], + ) + module_target_sat.cli.ContentView.add_repository( + { + 'id': cv['id'], + 'organization-id': module_sca_manifest_org.id, + 'repository-id': rh_repo_id, + } + ) + module_target_sat.api.Repository(id=rh_repo_id).sync(synchronous=False) + + # wait for all repo sync tasks + sync_tasks = module_target_sat.wait_for_tasks( + search_query=( + 'label = Actions::Katello::Repository::Sync' + f' and started_at >= "{repo_sync_timestamp}"' + ), + search_rate=10, + max_tries=200, + ) + assert all(task.poll()['result'] == 'success' for task in sync_tasks) + # publish and fetch new CVV + module_target_sat.cli.ContentView.publish({'id': cv['id']}) + content_view = module_target_sat.cli.ContentView.info({'id': cv['id']}) + cvv = content_view['versions'][0] + + # update incremental version via hammer, using one errata. + # expect: incr. "version-1.1" is created + update_start_time = datetime.utcnow() + result = module_target_sat.cli.ContentView.version_incremental_update( + {'content-view-version-id': cvv['id'], 'errata-ids': REAL_RHEL8_1_ERRATA_ID} + ) + assert 'version-1.1' in str(result[0].keys()) + update_duration = (datetime.utcnow() - update_start_time).total_seconds() + logger.info( + f'Update of incremental version-1.1, for CV id: {content_view["id"]},' + f' took {update_duration} seconds.' + ) + # publish the full CV, containing the added version-1.1 + publish_start_time = datetime.utcnow() + result = module_target_sat.cli.ContentView.publish({'id': cv['id']}) + publish_duration = (datetime.utcnow() - publish_start_time).total_seconds() + logger.info(f'Publish for CV id: {content_view["id"]}, took {publish_duration} seconds.') + # Per BZs: expect update duration was quicker than publish duration, + # if instead, update took longer, check that they were close, + # that update did not take ~significantly more time. + if update_duration >= publish_duration: + # unexpected: perhaps both tasks were very quick, took a handful of seconds, + # assert the difference was not significant (within 20%). + assert (update_duration - publish_duration) / publish_duration <= 0.2, ( + f'Incremental update took longer than publish of entire content-view id: {content_view["id"]}:' + f' Update took significantly more time, 20% or longer, than publish.' + f' update duration: {update_duration} s.\n publish duration: {publish_duration} s.' + ) + # else: base expected condition: update duration was quicker than publish. + + # some arbritrary timeouts, given amount of content in CV from repos. + assert update_duration <= 20, ( + 'Possible performance degradation in incremental update time.', + f' Took {update_duration} seconds, but expected to not exceed 20 seconds.', + ) + assert publish_duration <= 30, ( + 'Possible performance degradation in content-view publish time, after performing incremental update.', + f' Took {publish_duration} seconds, but expected to not exceed 30 seconds.', + ) From 3f697487ca135ba5bb21c65db239954f0133d66c Mon Sep 17 00:00:00 2001 From: dosas Date: Wed, 17 Apr 2024 15:22:39 +0200 Subject: [PATCH 126/150] Remove broken cached parameter (#14807) --- tests/foreman/cli/test_contentview.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/cli/test_contentview.py b/tests/foreman/cli/test_contentview.py index 82f12ca1faa..c2de286b9f6 100644 --- a/tests/foreman/cli/test_contentview.py +++ b/tests/foreman/cli/test_contentview.py @@ -3798,7 +3798,7 @@ def test_negative_user_with_no_create_view_cv_permissions(self, module_org, modu password = gen_alphanumeric() no_rights_user = module_target_sat.cli_factory.user({'password': password}) no_rights_user['password'] = password - org_id = module_target_sat.cli_factory.make_org(cached=True)['id'] + org_id = module_target_sat.cli_factory.make_org()['id'] for name in generate_strings_list(exclude_types=['cjk']): # test that user can't create with pytest.raises(CLIReturnCodeError): From 3d285639b5ea43c58fd896c0c69472d1d793728f Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 17 Apr 2024 16:02:20 +0200 Subject: [PATCH 127/150] sca for api e2e (#14802) --- tests/foreman/endtoend/test_api_endtoend.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tests/foreman/endtoend/test_api_endtoend.py b/tests/foreman/endtoend/test_api_endtoend.py index e8bf062659c..cede80dfecb 100644 --- a/tests/foreman/endtoend/test_api_endtoend.py +++ b/tests/foreman/endtoend/test_api_endtoend.py @@ -1050,7 +1050,7 @@ def test_positive_find_admin_user(self): @pytest.mark.skipif( (not settings.robottelo.REPOS_HOSTING_URL), reason='Missing repos_hosting_url' ) - def test_positive_end_to_end(self, function_entitlement_manifest, target_sat, rhel_contenthost): + def test_positive_end_to_end(self, function_sca_manifest, target_sat, rhel_contenthost): """Perform end to end smoke tests using RH and custom repos. 1. Create a new user with admin permissions @@ -1091,10 +1091,9 @@ def test_positive_end_to_end(self, function_entitlement_manifest, target_sat, rh # step 2.1: Create a new organization user_cfg = user_nailgun_config(login, password) org = target_sat.api.Organization(server_config=user_cfg).create() - org.sca_disable() # step 2.2: Upload manifest - target_sat.upload_manifest(org.id, function_entitlement_manifest.content) + target_sat.upload_manifest(org.id, function_sca_manifest.content) # step 2.3: Create a new lifecycle environment le1 = target_sat.api.LifecycleEnvironment(server_config=user_cfg, organization=org).create() @@ -1152,12 +1151,7 @@ def test_positive_end_to_end(self, function_entitlement_manifest, target_sat, rh name=activation_key_name, environment=le1, organization=org, content_view=content_view ).create() - # step 2.13: Add the products to the activation key - for sub in target_sat.api.Subscription(organization=org).search(): - if sub.name == constants.DEFAULT_SUBSCRIPTION_NAME: - activation_key.add_subscriptions(data={'quantity': 1, 'subscription_id': sub.id}) - break - # step 2.13.1: Enable product content + # step 2.13: Enable product content activation_key.content_override( data={ 'content_overrides': [ From 95f7884b0cd3c83473cb21a28f46f68f9c3a01af Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Wed, 17 Apr 2024 16:11:59 +0200 Subject: [PATCH 128/150] Add support for Jira Issue handler (#14728) * Add support for Jira issue handler * Address jira issue handler pr comments --- .github/workflows/pull_request.yml | 1 + .github/workflows/weekly.yml | 1 + conf/jira.yaml.template | 5 + pytest_plugins/metadata_markers.py | 115 ++++++++- robottelo/config/validators.py | 4 + robottelo/constants/__init__.py | 7 +- robottelo/utils/issue_handlers/README.md | 4 +- robottelo/utils/issue_handlers/__init__.py | 22 +- robottelo/utils/issue_handlers/bugzilla.py | 8 +- robottelo/utils/issue_handlers/jira.py | 274 +++++++++++++++++++++ testimony.yaml | 2 + tests/robottelo/test_issue_handlers.py | 14 +- 12 files changed, 433 insertions(+), 24 deletions(-) create mode 100644 conf/jira.yaml.template create mode 100644 robottelo/utils/issue_handlers/jira.py diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index fa46d2f5066..382a20b0e48 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -8,6 +8,7 @@ on: env: PYCURL_SSL_LIBRARY: openssl ROBOTTELO_BUGZILLA__API_KEY: ${{ secrets.BUGZILLA_KEY }} + ROBOTTELO_JIRA__API_KEY: ${{ secrets.JIRA_KEY }} jobs: codechecks: diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml index a08485c8f49..92fa9f329a9 100644 --- a/.github/workflows/weekly.yml +++ b/.github/workflows/weekly.yml @@ -55,6 +55,7 @@ jobs: id: cscheck env: ROBOTTELO_BUGZILLA__API_KEY: ${{ secrets.BUGZILLA_KEY }} + ROBOTTELO_JIRA__API_KEY: ${{ secrets.JIRA_KEY }} - name: Customer scenario status run: | diff --git a/conf/jira.yaml.template b/conf/jira.yaml.template new file mode 100644 index 00000000000..e76ac35f157 --- /dev/null +++ b/conf/jira.yaml.template @@ -0,0 +1,5 @@ +JIRA: + # url default value is set to 'https://issues.redhat.com' even if not provided. + URL: https://issues.redhat.com + # Provide api_key to access Jira REST API + API_KEY: replace-with-jira-api-key diff --git a/pytest_plugins/metadata_markers.py b/pytest_plugins/metadata_markers.py index 57b12aa5c1f..59b1e6c9e56 100644 --- a/pytest_plugins/metadata_markers.py +++ b/pytest_plugins/metadata_markers.py @@ -7,9 +7,22 @@ from robottelo.config import settings from robottelo.hosts import get_sat_rhel_version from robottelo.logging import collection_logger as logger +from robottelo.utils.issue_handlers.jira import are_any_jira_open FMT_XUNIT_TIME = '%Y-%m-%dT%H:%M:%S' IMPORTANCE_LEVELS = [] +selected = [] +deselected = [] + + +def parse_comma_separated_list(option_value): + if isinstance(option_value, str): + if option_value.lower() == 'true': + return True + if option_value.lower() == 'false': + return False + return [item.strip() for item in option_value.split(',')] + return None def pytest_addoption(parser): @@ -26,6 +39,25 @@ def pytest_addoption(parser): '--team', help='Comma separated list of teams to include in test collection', ) + parser.addoption( + '--blocked-by', + type=parse_comma_separated_list, + nargs='?', + const=True, + default=True, + help='Comma separated list of Jiras to collect tests matching BlockedBy testimony marker. ' + 'If no issue is provided all the tests with BlockedBy testimony marker will be processed ' + 'and deselected if any issue is open.', + ) + parser.addoption( + '--verifies-issues', + type=parse_comma_separated_list, + nargs='?', + const=True, + default=False, + help='Comma separated list of Jiras to collect tests matching Verifies testimony marker. ' + 'If no issue is provided all the tests with Verifies testimony marker will be selected.', + ) def pytest_configure(config): @@ -34,6 +66,8 @@ def pytest_configure(config): 'importance: CaseImportance testimony token, use --importance to filter', 'component: Component testimony token, use --component to filter', 'team: Team testimony token, use --team to filter', + 'blocked_by: BlockedBy testimony token, use --blocked-by to filter', + 'verifies_issues: Verifies testimony token, use --verifies_issues to filter', ]: config.addinivalue_line("markers", marker) @@ -56,6 +90,57 @@ def pytest_configure(config): re.IGNORECASE, ) +blocked_by_regex = re.compile( + # To match :BlockedBy: SAT-32932 + r'\s*:BlockedBy:\s*(?P.*\S*)', + re.IGNORECASE, +) + +verifies_regex = re.compile( + # To match :Verifies: SAT-32932 + r'\s*:Verifies:\s*(?P.*\S*)', + re.IGNORECASE, +) + + +def handle_verification_issues(item, verifies_marker, verifies_issues): + """Handles the logic for deselecting tests based on Verifies testimony token + and --verifies-issues pytest option. + """ + if verifies_issues: + if not verifies_marker: + log_and_deselect(item, '--verifies-issues') + return False + if isinstance(verifies_issues, list): + verifies_args = verifies_marker.args[0] + if all(issue not in verifies_issues for issue in verifies_args): + log_and_deselect(item, '--verifies-issues') + return False + return True + + +def handle_blocked_by(item, blocked_by_marker, blocked_by): + """Handles the logic for deselecting tests based on BlockedBy testimony token + and --blocked-by pytest option. + """ + if isinstance(blocked_by, list): + if not blocked_by_marker: + log_and_deselect(item, '--blocked-by') + return False + if all(issue not in blocked_by for issue in blocked_by_marker.args[0]): + log_and_deselect(item, '--blocked-by') + return False + elif isinstance(blocked_by, bool) and blocked_by_marker: + if blocked_by and are_any_jira_open(blocked_by_marker.args[0]): + log_and_deselect(item, '--blocked-by') + return False + return True + + +def log_and_deselect(item, option): + logger.debug(f'Deselected test {item.nodeid} due to "{option}" pytest option.') + deselected.append(item) + @pytest.hookimpl(tryfirst=True) def pytest_collection_modifyitems(items, config): @@ -81,9 +166,8 @@ def pytest_collection_modifyitems(items, config): importance = [i for i in (config.getoption('importance') or '').split(',') if i != ''] component = [c for c in (config.getoption('component') or '').split(',') if c != ''] team = [a.lower() for a in (config.getoption('team') or '').split(',') if a != ''] - - selected = [] - deselected = [] + verifies_issues = config.getoption('verifies_issues') + blocked_by = config.getoption('blocked_by') logger.info('Processing test items to add testimony token markers') for item in items: item.user_properties.append( @@ -100,6 +184,8 @@ def pytest_collection_modifyitems(items, config): for d in map(inspect.getdoc, (item.function, getattr(item, 'cls', None), item.module)) if d is not None ] + blocked_by_marks_to_add = [] + verifies_marks_to_add = [] for docstring in item_docstrings: item_mark_names = [m.name for m in item.iter_markers()] # Add marker starting at smallest docstring scope @@ -113,6 +199,18 @@ def pytest_collection_modifyitems(items, config): doc_team = team_regex.findall(docstring) if doc_team and 'team' not in item_mark_names: item.add_marker(pytest.mark.team(doc_team[0].lower())) + doc_verifies = verifies_regex.findall(docstring) + if doc_verifies and 'verifies_issues' not in item_mark_names: + verifies_marks_to_add.extend(str(b.strip()) for b in doc_verifies[-1].split(',')) + doc_blocked_by = blocked_by_regex.findall(docstring) + if doc_blocked_by and 'blocked_by' not in item_mark_names: + blocked_by_marks_to_add.extend( + str(b.strip()) for b in doc_blocked_by[-1].split(',') + ) + if blocked_by_marks_to_add: + item.add_marker(pytest.mark.blocked_by(blocked_by_marks_to_add)) + if verifies_marks_to_add: + item.add_marker(pytest.mark.verifies_issues(verifies_marks_to_add)) # add markers as user_properties so they are recorded in XML properties of the report # pytest-ibutsu will include user_properties dict in testresult metadata @@ -169,7 +267,16 @@ def pytest_collection_modifyitems(items, config): deselected.append(item) continue - selected.append(item) + if verifies_issues or blocked_by: + # Filter tests based on --verifies-issues and --blocked-by pytest options + # and Verifies and BlockedBy testimony tokens. + verifies_marker = item.get_closest_marker('verifies_issues', False) + blocked_by_marker = item.get_closest_marker('blocked_by', False) + if not handle_verification_issues(item, verifies_marker, verifies_issues): + continue + if not handle_blocked_by(item, blocked_by_marker, blocked_by): + continue + selected.append(item) # selected will be empty if no filter option was passed, defaulting to full items list items[:] = selected if deselected else items diff --git a/robottelo/config/validators.py b/robottelo/config/validators.py index 013be110fe0..1a6a6d7f4aa 100644 --- a/robottelo/config/validators.py +++ b/robottelo/config/validators.py @@ -189,6 +189,10 @@ must_exist=True, ), ], + jira=[ + Validator('jira.url', default='https://issues.redhat.com'), + Validator('jira.api_key', must_exist=True), + ], ldap=[ Validator( 'ldap.basedn', diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 7c82cfdfd8d..534b750a215 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1749,10 +1749,15 @@ class Colored(Box): ), } - +# Bugzilla statuses used by Robottelo issue handler. OPEN_STATUSES = ("NEW", "ASSIGNED", "POST", "MODIFIED") CLOSED_STATUSES = ("ON_QA", "VERIFIED", "RELEASE_PENDING", "CLOSED") WONTFIX_RESOLUTIONS = ("WONTFIX", "CANTFIX", "DEFERRED") +# Jira statuses used by Robottelo issue handler. +JIRA_OPEN_STATUSES = ("New", "Backlog", "Refinement", "To Do", "In Progress") +JIRA_ONQA_STATUS = "Review" +JIRA_CLOSED_STATUSES = ("Release Pending", "Closed") +JIRA_WONTFIX_RESOLUTIONS = "Obsolete" GROUP_MEMBERSHIP_MAPPER = { "config": { diff --git a/robottelo/utils/issue_handlers/README.md b/robottelo/utils/issue_handlers/README.md index 1ef130583d0..8661a4965e5 100644 --- a/robottelo/utils/issue_handlers/README.md +++ b/robottelo/utils/issue_handlers/README.md @@ -13,7 +13,7 @@ Issue handler should expose 3 functions. ### `is_open_(issue, data=None)` -e.g: `is_open_bz, is_open_gh, is_open_jr` for Bugzilla, Github and Jira. +e.g: `is_open_bz, is_open_gh, is_open_jira` for Bugzilla, Github and Jira. This function is dispatched from `robottelo.helpers.is_open` that is also used to check for status in the `pytest.mark.skip_if_open` marker. @@ -78,10 +78,10 @@ Example of `collected_data`: ## Issue handlers implemented - `.bugzilla.py`: BZ:123456 +- `.jira.py`: SAT-22761 ## Issue handlers to be implemented - `.github.py`: GH:satelliteqe/robottelo#123 - `.gitlab.py`: GL:path/to/repo#123 -- `.jira.py`: JR:SATQE-4561 - `.redmine.py`: RM:pulp.plan.io#5580 diff --git a/robottelo/utils/issue_handlers/__init__.py b/robottelo/utils/issue_handlers/__init__.py index d59c97aec63..803b5800080 100644 --- a/robottelo/utils/issue_handlers/__init__.py +++ b/robottelo/utils/issue_handlers/__init__.py @@ -1,8 +1,10 @@ +import re + # Methods related to issue handlers in general -from robottelo.utils.issue_handlers import bugzilla +from robottelo.utils.issue_handlers import bugzilla, jira -handler_methods = {'BZ': bugzilla.is_open_bz} -SUPPORTED_HANDLERS = tuple(f"{handler}:" for handler in handler_methods) +handler_methods = {'BZ': bugzilla.is_open_bz, 'SAT': jira.is_open_jira} +SUPPORTED_HANDLERS = tuple(f"{handler}" for handler in handler_methods) def add_workaround(data, matches, usage, validation=(lambda *a, **k: True), **kwargs): @@ -16,10 +18,11 @@ def add_workaround(data, matches, usage, validation=(lambda *a, **k: True), **kw def should_deselect(issue, data=None): """Check if test should be deselected based on marked issue.""" # Handlers can be extended to support different issue trackers. - handlers = {'BZ': bugzilla.should_deselect_bz} - supported_handlers = tuple(f"{handler}:" for handler in handlers) + handlers = {'BZ': bugzilla.should_deselect_bz, 'SAT': jira.should_deselect_jira} + supported_handlers = tuple(f"{handler}" for handler in handlers) if str(issue).startswith(supported_handlers): - handler_code = str(issue).partition(":")[0] + res = re.split(':|-', issue) + handler_code = res[0] return handlers[handler_code.strip()](issue.strip(), data) return None @@ -29,7 +32,7 @@ def is_open(issue, data=None): Issue must be prefixed by its handler e.g: - Bugzilla: BZ:123456 + Bugzilla: BZ:123456, Jira: SAT-12345 Arguments: issue {str} -- A string containing handler + number e.g: BZ:123465 @@ -37,11 +40,12 @@ def is_open(issue, data=None): """ # Handlers can be extended to support different issue trackers. if str(issue).startswith(SUPPORTED_HANDLERS): - handler_code = str(issue).partition(":")[0] + res = re.split(':|-', issue) + handler_code = res[0] else: # EAFP raise AttributeError( "is_open argument must be a string starting with a handler code " - "e.g: 'BZ:123456'" + "e.g: 'BZ:123456' for Bugzilla and 'SAT-12345' for Jira." f"supported handlers are: {SUPPORTED_HANDLERS}" ) return handler_methods[handler_code.strip()](issue.strip(), data) diff --git a/robottelo/utils/issue_handlers/bugzilla.py b/robottelo/utils/issue_handlers/bugzilla.py index 20836a3660d..dd1c35da2ab 100644 --- a/robottelo/utils/issue_handlers/bugzilla.py +++ b/robottelo/utils/issue_handlers/bugzilla.py @@ -137,7 +137,7 @@ def collect_data_bz(collected_data, cached_data): # pragma: no cover def collect_dupes(bz, collected_data, cached_data=None): # pragma: no cover - """Recursivelly find for duplicates""" + """Recursively find for duplicates""" cached_data = cached_data or {} if bz.get('resolution') == 'DUPLICATE': # Collect duplicates @@ -180,15 +180,15 @@ def collect_clones(bz, collected_data, cached_data=None): # pragma: no cover @retry( - stop=stop_after_attempt(4), # Retry 3 times before raising - wait=wait_fixed(20), # Wait seconds between retries + stop=stop_after_attempt(4), + wait=wait_fixed(20), ) def get_data_bz(bz_numbers, cached_data=None): # pragma: no cover """Get a list of marked BZ data and query Bugzilla REST API. Arguments: bz_numbers {list of str} -- ['123456', ...] - cached_data + cached_data {dict} -- Cached data previous loaded from API Returns: [list of dicts] -- [{'id':..., 'status':..., 'resolution': ...}] diff --git a/robottelo/utils/issue_handlers/jira.py b/robottelo/utils/issue_handlers/jira.py new file mode 100644 index 00000000000..dfeb1c966c4 --- /dev/null +++ b/robottelo/utils/issue_handlers/jira.py @@ -0,0 +1,274 @@ +from collections import defaultdict +import re + +from packaging.version import Version +import pytest +import requests +from tenacity import retry, stop_after_attempt, wait_fixed + +from robottelo.config import settings +from robottelo.constants import ( + JIRA_CLOSED_STATUSES, + JIRA_ONQA_STATUS, + JIRA_OPEN_STATUSES, + JIRA_WONTFIX_RESOLUTIONS, +) +from robottelo.hosts import get_sat_version +from robottelo.logging import logger + +# match any version as in `sat-6.14.x` or `sat-6.13.0` or `6.13.9` +# The .version group being a `d.d` string that can be casted to Version() +VERSION_RE = re.compile(r'(?:sat-)*?(?P\d\.\d)\.\w*') + + +def is_open_jira(issue, data=None): + """Check if specific Jira is open consulting a cached `data` dict or + calling Jira REST API. + + Arguments: + issue {str} -- The Jira reference e.g: SAT-20548 + data {dict} -- Issue data indexed by : or None + """ + jira = try_from_cache(issue, data) + if jira.get("is_open") is not None: # issue has been already processed + return jira["is_open"] + + jira = follow_duplicates(jira) + status = jira.get('status', '') + resolution = jira.get('resolution', '') + + # Jira is explicitly in OPEN status + if status in JIRA_OPEN_STATUSES: + return True + + # Jira is Closed/Obsolete so considered not fixed yet, Jira is open + if status in JIRA_CLOSED_STATUSES and resolution in JIRA_WONTFIX_RESOLUTIONS: + return True + + # Jira is Closed with a resolution in (Done, Done-Errata, ...) + # server.version is higher or equal than Jira fixVersion + # Consider fixed, Jira is not open + fix_version = jira.get('fixVersions') + if fix_version: + return get_sat_version() < Version(min(fix_version)) + return status not in JIRA_CLOSED_STATUSES and status != JIRA_ONQA_STATUS + + +def are_all_jira_open(issues, data=None): + """Check if all Jira is open consulting a cached `data` dict or + calling Jira REST API. + + Arguments: + issues {list} -- The Jira reference e.g: ['SAT-20548', 'SAT-20548'] + data {dict} -- Issue data indexed by : or None + """ + return all(is_open_jira(issue, data) for issue in issues) + + +def are_any_jira_open(issues, data=None): + """Check if any of the Jira is open consulting a cached `data` dict or + calling Jira REST API. + + Arguments: + issues {list} -- The Jira reference e.g: ['SAT-20548', 'SAT-20548'] + data {dict} -- Issue data indexed by : or None + """ + return any(is_open_jira(issue, data) for issue in issues) + + +def should_deselect_jira(issue, data=None): + """Check if test should be deselected based on marked issue. + + 1. Resolution "Obsolete" should deselect + + Arguments: + issue {str} -- The Jira reference e.g: SAT-12345 + data {dict} -- Issue data indexed by : or None + """ + + jira = try_from_cache(issue, data) + if jira.get("is_deselected") is not None: # issue has been already processed + return jira["is_deselected"] + + jira = follow_duplicates(jira) + + return ( + jira.get('status') in JIRA_CLOSED_STATUSES + and jira.get('resolution') in JIRA_WONTFIX_RESOLUTIONS + ) + + +def follow_duplicates(jira): + """recursively load the duplicate data""" + if jira.get('dupe_data'): + jira = follow_duplicates(jira['dupe_data']) + return jira + + +def try_from_cache(issue, data=None): + """Try to fetch issue from given data cache or previous loaded on pytest. + + Arguments: + issue {str} -- The Jira reference e.g: SAT-12345 + data {dict} -- Issue data indexed by : or None + """ + try: + # issue must be passed in `data` argument or already fetched in pytest + if not data and not len(pytest.issue_data[issue]['data']): + raise ValueError + return data or pytest.issue_data[issue]['data'] + except (KeyError, AttributeError, ValueError): # pragma: no cover + # If not then call Jira API again + return get_single_jira(str(issue)) + + +def collect_data_jira(collected_data, cached_data): # pragma: no cover + """Collect data from Jira API and aggregate in a dictionary. + + Arguments: + collected_data {dict} -- dict with Jira issues collected by pytest + cached_data {dict} -- Cached data previous loaded from API + """ + jira_data = ( + get_data_jira( + [item for item in collected_data if item.startswith('SAT-')], + cached_data=cached_data, + ) + or [] + ) + for data in jira_data: + # If Jira is CLOSED/DUPLICATE collect the duplicate + collect_dupes(data, collected_data, cached_data=cached_data) + + jira_key = f"{data['key']}" + data["is_open"] = is_open_jira(jira_key, data) + collected_data[jira_key]['data'] = data + + +def collect_dupes(jira, collected_data, cached_data=None): # pragma: no cover + """Recursively find for duplicates""" + cached_data = cached_data or {} + if jira.get('resolution') == 'Duplicate': + # Collect duplicates + jira['dupe_data'] = get_single_jira(jira.get('dupe_of'), cached_data=cached_data) + dupe_key = f"{jira['dupe_of']}" + # Store Duplicate also in the main collection for caching + if dupe_key not in collected_data: + collected_data[dupe_key]['data'] = jira['dupe_data'] + collected_data[dupe_key]['is_dupe'] = True + collect_dupes(jira['dupe_data'], collected_data, cached_data) + + +# --- API Calls --- + +# cannot use lru_cache in functions that has unhashable args +CACHED_RESPONSES = defaultdict(dict) + + +@retry( + stop=stop_after_attempt(4), # Retry 3 times before raising + wait=wait_fixed(20), # Wait seconds between retries +) +def get_data_jira(jira_numbers, cached_data=None): # pragma: no cover + """Get a list of marked Jira data and query Jira REST API. + + Arguments: + jira_numbers {list of str} -- ['SAT-12345', ...] + cached_data {dict} -- Cached data previous loaded from API + + Returns: + [list of dicts] -- [{'id':..., 'status':..., 'resolution': ...}] + """ + if not jira_numbers: + return [] + + cached_by_call = CACHED_RESPONSES['get_data'].get(str(sorted(jira_numbers))) + if cached_by_call: + return cached_by_call + + if cached_data: + logger.debug(f"Using cached data for {set(jira_numbers)}") + if not all([f'{number}' in cached_data for number in jira_numbers]): + logger.debug("There are Jira's out of cache.") + return [item['data'] for _, item in cached_data.items() if 'data' in item] + + # Ensure API key is set + if not settings.jira.api_key: + logger.warning( + "Config file is missing jira api_key " + "so all tests with skip_if_open mark is skipped. " + "Provide api_key or a jira_cache.json." + ) + # Provide default data for collected Jira's. + return [get_default_jira(number) for number in jira_numbers] + + # No cached data so Call Jira API + logger.debug(f"Calling Jira API for {set(jira_numbers)}") + jira_fields = [ + "key", + "summary", + "status", + "resolution", + "fixVersions", + ] + # Following fields are dynamically calculated/loaded + for field in ('is_open', 'version'): + assert field not in jira_fields + + # Generate jql + jql = ' OR '.join([f"id = {id}" for id in jira_numbers]) + + response = requests.get( + f"{settings.jira.url}/rest/api/latest/search/", + params={ + "jql": jql, + "fields": ",".join(jira_fields), + }, + headers={"Authorization": f"Bearer {settings.jira.api_key}"}, + ) + response.raise_for_status() + data = response.json().get('issues') + # Clean the data, only keep the required info. + data = [ + { + 'key': issue['key'], + 'summary': issue['fields']['summary'], + 'status': issue['fields']['status']['name'], + 'resolution': issue['fields']['resolution']['name'] + if issue['fields']['resolution'] + else '', + 'fixVersions': [ver['name'] for ver in issue['fields']['fixVersions']] + if issue['fields']['fixVersions'] + else [], + } + for issue in data + if issue is not None + ] + CACHED_RESPONSES['get_data'][str(sorted(jira_numbers))] = data + return data + + +def get_single_jira(number, cached_data=None): # pragma: no cover + """Call Jira API to get a single Jira data and cache it""" + cached_data = cached_data or {} + jira_data = CACHED_RESPONSES['get_single'].get(number) + if not jira_data: + try: + jira_data = cached_data[f"{number}"]['data'] + except (KeyError, TypeError): + jira_data = get_data_jira([str(number)], cached_data) + jira_data = jira_data and jira_data[0] + CACHED_RESPONSES['get_single'][number] = jira_data + return jira_data or get_default_jira(number) + + +def get_default_jira(number): # pragma: no cover + """This is the default Jira data when it is not possible to reach Jira api""" + return { + "key": number, + "is_open": True, + "is_deselected": False, + "status": "", + "resolution": "", + "error": "missing jira api_key", + } diff --git a/testimony.yaml b/testimony.yaml index 312e59f197b..1088ac8f33a 100644 --- a/testimony.yaml +++ b/testimony.yaml @@ -1,6 +1,8 @@ Team: required: true BZ: {} +BlockedBy: {} +Verifies: {} CaseAutomation: casesensitive: true choices: diff --git a/tests/robottelo/test_issue_handlers.py b/tests/robottelo/test_issue_handlers.py index 4da0b6df011..d8fdce0c7b0 100644 --- a/tests/robottelo/test_issue_handlers.py +++ b/tests/robottelo/test_issue_handlers.py @@ -342,10 +342,16 @@ def test_bz_should_not_deselect(self): @pytest.mark.parametrize('issue', ["BZ123456", "XX:123456", "KK:89456", "123456", 999999]) def test_invalid_handler(self, issue): """Assert is_open w/ invalid handlers raise AttributeError""" - issue_deselect = should_deselect(issue) - with pytest.raises(AttributeError): - is_open(issue) - assert issue_deselect is None + if issue == 'BZ123456': + with pytest.raises(KeyError): + should_deselect(issue) + with pytest.raises(KeyError): + is_open(issue) + else: + issue_deselect = should_deselect(issue) + with pytest.raises(AttributeError): + is_open(issue) + assert issue_deselect is None def test_bz_cache(self, request): """Assert basic behavior of the --bz-cache pytest option""" From e5f32e54ca605967c26cfaaec1a678ff9ca9135a Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Wed, 17 Apr 2024 16:50:56 +0200 Subject: [PATCH 129/150] sca fix for api org test (#14811) --- tests/foreman/api/test_organization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/foreman/api/test_organization.py b/tests/foreman/api/test_organization.py index 7edc09d0dc2..295bc1142a1 100644 --- a/tests/foreman/api/test_organization.py +++ b/tests/foreman/api/test_organization.py @@ -132,7 +132,7 @@ def test_negative_create_with_same_name(self, target_sat): target_sat.api.Organization(name=name).create() @pytest.mark.tier1 - def test_negative_check_org_endpoint(self, module_entitlement_manifest_org): + def test_negative_check_org_endpoint(self, module_sca_manifest_org): """Check manifest cert is not exposed in api endpoint :id: 24130e54-cd7a-41de-ac78-6e89aebabe30 @@ -145,7 +145,7 @@ def test_negative_check_org_endpoint(self, module_entitlement_manifest_org): :CaseImportance: High """ - orgstring = json.dumps(module_entitlement_manifest_org.read_json()) + orgstring = json.dumps(module_sca_manifest_org.read_json()) assert 'BEGIN CERTIFICATE' not in orgstring assert 'BEGIN RSA PRIVATE KEY' not in orgstring From 625017b1fd6300898d8f94ad421912098aa500a7 Mon Sep 17 00:00:00 2001 From: Lukas Pramuk Date: Wed, 17 Apr 2024 21:05:41 +0200 Subject: [PATCH 130/150] Fix getting exit code on capsule tunnel error (#14821) --- robottelo/host_helpers/satellite_mixins.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/robottelo/host_helpers/satellite_mixins.py b/robottelo/host_helpers/satellite_mixins.py index 3c26862c3bf..d20a70d2d15 100644 --- a/robottelo/host_helpers/satellite_mixins.py +++ b/robottelo/host_helpers/satellite_mixins.py @@ -288,10 +288,10 @@ def default_url_on_new_port(self, oldport, newport): post_ncat_procs = self.execute('pgrep ncat').stdout.splitlines() ncat_pid = set(post_ncat_procs).difference(set(pre_ncat_procs)) if not len(ncat_pid): - stderr = channel.get_exit_status()[1] - logger.debug(f'Tunnel failed: {stderr}') + err = channel.get_exit_signal() + logger.debug(f'Tunnel failed: {err}') # Something failed, so raise an exception. - raise CapsuleTunnelError(f'Starting ncat failed: {stderr}') + raise CapsuleTunnelError(f'Starting ncat failed: {err}') forward_url = f'https://{self.hostname}:{newport}' logger.debug(f'Yielding capsule forward port url: {forward_url}') try: From 5c7abc1733580eeacde255ed75398bf26adce4aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:34:54 +0530 Subject: [PATCH 131/150] Bump sphinx from 7.3.4 to 7.3.6 (#14828) Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 7.3.4 to 7.3.6. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v7.3.4...v7.3.6) --- updated-dependencies: - dependency-name: sphinx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index 30d1b9ca738..857c0ac9816 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -5,7 +5,7 @@ redis==5.0.3 pre-commit==3.7.0 # For generating documentation. -sphinx==7.3.4 +sphinx==7.3.6 sphinx-autoapi==3.0.0 # For 'manage' interactive shell From 97eb09d343ec8d5878d01a2e811befd9e41d4027 Mon Sep 17 00:00:00 2001 From: Shweta Singh Date: Thu, 18 Apr 2024 17:01:51 +0530 Subject: [PATCH 132/150] Update the test for the assertion failure (#14833) --- tests/foreman/api/test_provisioningtemplate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/api/test_provisioningtemplate.py b/tests/foreman/api/test_provisioningtemplate.py index 354f15ed47d..52e5fc2f66d 100644 --- a/tests/foreman/api/test_provisioningtemplate.py +++ b/tests/foreman/api/test_provisioningtemplate.py @@ -629,7 +629,7 @@ def test_positive_template_check_rex_snippet( assert f'chown -R {rex_user}: ~{rex_user}' in rex_snippet assert f'chown -R {rex_user}: ~{rex_user}/.ssh' in rex_snippet assert ( - f'echo "{rex_user} ALL = (root) NOPASSWD : ALL\nDefaults:{rex_user} !requiretty" > /etc/sudoers.d/{rex_user}' + f'echo "{rex_user} ALL = (root) NOPASSWD : ALL" > /etc/sudoers.d/{rex_user}\necho "Defaults:{rex_user} !requiretty" >> /etc/sudoers.d/{rex_user}' in rex_snippet ) assert ssh_key in rex_snippet From bc7f9b08493d36a499132b5ef8f42cee65729925 Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:32:04 +0200 Subject: [PATCH 133/150] Fix test_content_guarded_distributions_option (#14817) --- tests/foreman/installer/test_installer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index 32c1a507d92..581e1a2b41d 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -1555,7 +1555,7 @@ def test_content_guarded_distributions_option( )[0] rh_repo.sync() assert ( - "403: [('PEM routines', 'get_name', 'no start line')]" + "403" in sat_non_default_install.execute( f'curl https://{sat_non_default_install.hostname}/pulp/content/{org.label}' f'/Library/content/dist/layered/rhel8/x86_64/ansible/2.9/os/' From 013448104cc82fdd68af4e8a987dae37441572a8 Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:34:11 +0200 Subject: [PATCH 134/150] Update test_negative_pre_upgrade_tuning_profile_check for RHEL9 (#14785) --- tests/foreman/maintain/test_upgrade.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tests/foreman/maintain/test_upgrade.py b/tests/foreman/maintain/test_upgrade.py index a79094f7a6b..2a0f1a28ca8 100644 --- a/tests/foreman/maintain/test_upgrade.py +++ b/tests/foreman/maintain/test_upgrade.py @@ -132,10 +132,16 @@ def test_negative_pre_upgrade_tuning_profile_check(request, custom_host): last_y_stream = last_y_stream_version( SATELLITE_VERSION if sat_version == 'stream' else sat_version ) - custom_host.download_repofile(product='satellite', release=last_y_stream) - custom_host.execute( - f'dnf -y module enable satellite:el{rhel_major} && dnf -y install satellite' + # Updated test to do a z-stream upgrade, as Satellite on RHEL9 is supported from 6.16 onwards. + # Remove this condition once 6.16 is GA + target_version = ( + '6.16.z' if (SATELLITE_VERSION == '6.16' and rhel_major == 9) else SATELLITE_VERSION ) + if target_version == '6.16.z': + custom_host.download_repofile(product='satellite', release=sat_version) + else: + custom_host.download_repofile(product='satellite', release=last_y_stream) + custom_host.install_satellite_or_capsule_package() # Install with development tuning profile to get around installer checks custom_host.execute( 'satellite-installer --scenario satellite --tuning development', @@ -155,10 +161,10 @@ def test_negative_pre_upgrade_tuning_profile_check(request, custom_host): custom_host.execute('satellite-maintain upgrade list-versions') # Check that we can upgrade to the new Y stream version result = custom_host.execute('satellite-maintain upgrade list-versions') - assert SATELLITE_VERSION in result.stdout + assert target_version in result.stdout # Check that the upgrade check fails due to system requirements result = custom_host.execute( - f'satellite-maintain upgrade check --target-version {SATELLITE_VERSION}', timeout='5m' + f'satellite-maintain upgrade check --target-version {target_version}', timeout='5m' ) assert ( f'ERROR: The installer is configured to use the {profile} tuning ' From ed0c03a2684df7500d62302b87ee7493324748b7 Mon Sep 17 00:00:00 2001 From: Jameer Pathan <21165044+jameerpathan111@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:37:49 +0200 Subject: [PATCH 135/150] Fix test_positive_clone_backup (#14803) --- robottelo/hosts.py | 10 ++++++++-- tests/foreman/destructive/test_clone.py | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/robottelo/hosts.py b/robottelo/hosts.py index 21932336231..5c9d5bc2399 100644 --- a/robottelo/hosts.py +++ b/robottelo/hosts.py @@ -1739,8 +1739,8 @@ def cli(self): self._cli._configured = True return self._cli - def install_satellite_or_capsule_package(self): - """Install Satellite/Capsule package. + def enable_satellite_or_capsule_module_for_rhel8(self): + """Enable Satellite/Capsule module for RHEL8. Note: Make sure required repos are enabled before using this. """ if self.os_version.major == 8: @@ -1750,6 +1750,12 @@ def install_satellite_or_capsule_package(self): ).status == 0 ) + + def install_satellite_or_capsule_package(self): + """Install Satellite/Capsule package. Also handles module enablement for RHEL8. + Note: Make sure required repos are enabled before using this. + """ + self.enable_satellite_or_capsule_module_for_rhel8() assert self.execute(f'dnf -y install {self.product_rpm_name}').status == 0 diff --git a/tests/foreman/destructive/test_clone.py b/tests/foreman/destructive/test_clone.py index 7100084b358..54b5f57b6e5 100644 --- a/tests/foreman/destructive/test_clone.py +++ b/tests/foreman/destructive/test_clone.py @@ -89,8 +89,8 @@ def test_positive_clone_backup( # Enabling repositories for repo in getattr(constants, f"OHSNAP_RHEL{rhel_version}_REPOS"): sat_ready_rhel.enable_repo(repo, force=True) - # Enabling satellite module - sat_ready_rhel.install_satellite_or_capsule_package() + # Enabling satellite module for RHEL8 + sat_ready_rhel.enable_satellite_or_capsule_module_for_rhel8() # Install satellite-clone assert sat_ready_rhel.execute('yum install satellite-clone -y').status == 0 # Disabling CDN repos as we install from dogfdood From 1e6873877a0f979b2015974a8c0379d2719578e2 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Thu, 18 Apr 2024 16:05:47 +0200 Subject: [PATCH 136/150] effective user with non-ascii password (#13840) --- tests/foreman/cli/test_remoteexecution.py | 38 ++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index 67231123ec1..9e9b7631052 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -24,6 +24,7 @@ from robottelo import constants from robottelo.config import settings from robottelo.constants import FAKE_4_CUSTOM_PACKAGE +from robottelo.exceptions import CLIFactoryError from robottelo.utils import ohsnap from robottelo.utils.datafactory import filtered_datapoint, parametrized @@ -137,28 +138,36 @@ def test_positive_run_default_job_template( @pytest.mark.pit_server @pytest.mark.rhel_ver_list([7, 8, 9]) def test_positive_run_job_effective_user(self, rex_contenthost, module_target_sat): - """Run default job template as effective user on a host + """Run default job template as effective user on a host, test ssh user as well :id: 0cd75cab-f699-47e6-94d3-4477d2a94bb7 - :BZ: 1451675, 1804685 + :BZ: 1451675, 1804685, 2258968 :expectedresults: Verify the job was successfully run under the - effective user identity on host + effective user identity on host, make sure the password is + used :parametrized: yes + + :customerscenario: true """ client = rex_contenthost # create a user on client via remote job + ssh_username = gen_string('alpha') + ssh_password = gen_string('alpha') username = gen_string('alpha') + password = gen_string('cjk') filename = gen_string('alpha') make_user_job = module_target_sat.cli_factory.job_invocation( { 'job-template': 'Run Command - Script Default', - 'inputs': f"command=useradd -m {username}", + 'inputs': f"command=useradd {ssh_username} -G wheel; echo {ssh_username}:{ssh_password} | chpasswd; useradd {username} -G wheel; echo {username}:{password} | chpasswd", 'search-query': f"name ~ {client.hostname}", + 'description-format': 'adding users', } ) + client.execute('echo "Defaults targetpw" >> /etc/sudoers') assert_job_invocation_result(module_target_sat, make_user_job['id'], client.hostname) # create a file as new user invocation_command = module_target_sat.cli_factory.job_invocation( @@ -166,7 +175,10 @@ def test_positive_run_job_effective_user(self, rex_contenthost, module_target_sa 'job-template': 'Run Command - Script Default', 'inputs': f"command=touch /home/{username}/{filename}", 'search-query': f"name ~ {client.hostname}", + 'ssh-user': f'{ssh_username}', + 'password': f'{ssh_password}', 'effective-user': f'{username}', + 'effective-user-password': f'{password}', } ) assert_job_invocation_result(module_target_sat, invocation_command['id'], client.hostname) @@ -176,6 +188,24 @@ def test_positive_run_job_effective_user(self, rex_contenthost, module_target_sa ) # assert the file is owned by the effective user assert username == result.stdout.strip('\n') + result = client.execute( + f'''stat -c '%G' /home/{username}/{filename}''', + ) + # assert the file is in the effective user's group + assert username == result.stdout.strip('\n') + # negative check for unspecified password + filename = gen_string('alpha') + with pytest.raises(CLIFactoryError): + invocation_command = module_target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Script Default', + 'inputs': f"command=touch /home/{username}/{filename}", + 'search-query': f"name ~ {client.hostname}", + 'ssh-user': f'{ssh_username}', + 'password': f'{ssh_password}', + 'effective-user': f'{username}', + } + ) @pytest.mark.tier3 @pytest.mark.e2e From 9ecb742ca0359dbbaec11d0bcbac948ba2b4b9fa Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Thu, 18 Apr 2024 16:18:59 +0200 Subject: [PATCH 137/150] sca fixes for ui organization (#14816) --- tests/foreman/ui/test_organization.py | 38 ++++++--------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/tests/foreman/ui/test_organization.py b/tests/foreman/ui/test_organization.py index e407f06b6cb..7b200391f77 100644 --- a/tests/foreman/ui/test_organization.py +++ b/tests/foreman/ui/test_organization.py @@ -22,7 +22,7 @@ @pytest.fixture(scope='module') -def module_repos_col(request, module_entitlement_manifest_org, module_lce, module_target_sat): +def module_repos_col(request, module_sca_manifest_org, module_lce, module_target_sat): repos_collection = module_target_sat.cli_factory.RepositoryCollection( repositories=[ # As Satellite Tools may be added as custom repo and to have a "Fully entitled" host, @@ -30,15 +30,15 @@ def module_repos_col(request, module_entitlement_manifest_org, module_lce, modul module_target_sat.cli_factory.YumRepository(url=settings.repos.yum_0.url), ], ) - repos_collection.setup_content(module_entitlement_manifest_org.id, module_lce.id) + repos_collection.setup_content(module_sca_manifest_org.id, module_lce.id) yield repos_collection @request.addfinalizer def _cleanup(): try: module_target_sat.api.Subscription( - organization=module_entitlement_manifest_org - ).delete_manifest(data={'organization_id': module_entitlement_manifest_org.id}) + organization=module_sca_manifest_org + ).delete_manifest(data={'organization_id': module_sca_manifest_org.id}) except Exception: logger.exception('Exception cleaning manifest:') @@ -245,7 +245,7 @@ def test_positive_update_compresource(session, module_target_sat): @pytest.mark.skip_if_not_set('fake_manifest') @pytest.mark.tier2 @pytest.mark.upgrade -def test_positive_delete_with_manifest_lces(session, target_sat, function_entitlement_manifest_org): +def test_positive_delete_with_manifest_lces(session, target_sat, function_sca_manifest_org): """Create Organization with valid values and upload manifest. Then try to delete that organization. @@ -255,7 +255,7 @@ def test_positive_delete_with_manifest_lces(session, target_sat, function_entitl :CaseImportance: Critical """ - org = function_entitlement_manifest_org + org = function_sca_manifest_org with session: session.organization.select(org.name) session.lifecycleenvironment.create({'name': 'DEV'}) @@ -269,9 +269,7 @@ def test_positive_delete_with_manifest_lces(session, target_sat, function_entitl @pytest.mark.tier2 @pytest.mark.upgrade -def test_positive_download_debug_cert_after_refresh( - session, target_sat, function_entitlement_manifest_org -): +def test_positive_download_debug_cert_after_refresh(session, target_sat, function_sca_manifest_org): """Create organization with valid manifest. Download debug certificate for that organization and refresh added manifest for few times in a row @@ -282,7 +280,7 @@ def test_positive_download_debug_cert_after_refresh( :CaseImportance: High """ - org = function_entitlement_manifest_org + org = function_sca_manifest_org try: with session: session.organization.select(org.name) @@ -344,23 +342,3 @@ def test_positive_product_view_organization_switch(session, module_org, module_p assert session.product.search(module_product.name) session.organization.select(org_name="Default Organization") assert session.product.search(module_product.name) != module_product.name - - -def test_positive_prepare_for_sca_only_organization(target_sat, function_entitlement_manifest_org): - """Verify that the organization details page notifies users that Simple Content Access - will be required for all organizations in Satellite 6.16 - - :id: 3a6a848b-3c16-4dbb-8f52-5ea57a9a97ef - - :expectedresults: The Organization details page notifies users that Simple Content Access will - be required for all organizations in Satellite 6.16 - """ - with target_sat.ui_session() as session: - session.organization.select(function_entitlement_manifest_org.name) - sca_alert = session.organization.read( - function_entitlement_manifest_org.name, widget_names='primary' - ) - assert ( - 'Simple Content Access will be required for all organizations in Satellite 6.16.' - in sca_alert['primary']['sca_alert'] - ) From 2d915bcd6043486dc1ffd2da466dad2089ef6d9e Mon Sep 17 00:00:00 2001 From: amolpati30 <151733635+amolpati30@users.noreply.github.com> Date: Thu, 18 Apr 2024 19:55:35 +0530 Subject: [PATCH 138/150] add & remove ansible role (#14556) * add remove ansible role from host * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- tests/foreman/ui/test_ansible.py | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/foreman/ui/test_ansible.py b/tests/foreman/ui/test_ansible.py index 3fa3a4d6838..c538ef099e1 100644 --- a/tests/foreman/ui/test_ansible.py +++ b/tests/foreman/ui/test_ansible.py @@ -10,6 +10,7 @@ """ from fauxfactory import gen_string import pytest +from wait_for import wait_for import yaml from robottelo import constants @@ -400,6 +401,53 @@ def test_positive_set_ansible_role_order_per_hostgroup(self): :CaseAutomation: NotAutomated """ + @pytest.mark.tier2 + def test_positive_assign_and_remove_ansible_role_to_host(self, target_sat, function_host): + """Add and remove the role(s) of a Host + + :id: a61b4c05-1395-47c2-b6d9-fcff8b094e0e + + :setup: Used pre-defined function_host (component/host) registerd with satellite. + + :steps: + 1. Import all roles available by default. + 2. Assign a role to the host. + 3. Navigate to the new UI for the given Host. + 4. Select the 'Ansible' tab + 5. Click the 'Edit Ansible roles' button. + 6. Using the popup, remove the assigned role from the Host. + + :expectedresults: The Role is successfully aaded and removed from the Host, and no longer shows + up on the UI + """ + SELECTED_ROLE = 'RedHatInsights.insights-client' + + location = function_host.location.read() + organization = function_host.organization.read() + proxy_id = target_sat.nailgun_smart_proxy.id + target_sat.api.AnsibleRoles().sync( + data={'proxy_id': proxy_id, 'role_names': [SELECTED_ROLE]} + ) + with target_sat.ui_session() as session: + session.location.select(location.name) + session.organization.select(organization.name) + # add ansible role + session.host_new.add_single_ansible_role(function_host.name) + wait_for(lambda: session.browser.refresh(), timeout=5) + # verify ansible role assigned to new UI for the given Host + ansible_roles_table = session.host_new.get_ansible_roles(function_host.name) + assert ansible_roles_table[0]['Name'] == SELECTED_ROLE + # remove ansible role + session.host_new.remove_single_ansible_role(function_host.name) + # verify ansible role removed + result = session.host_new.get_details( + function_host.name, widget_names='ansible.roles.noRoleAssign' + ) + assert ( + result['ansible']['roles']['noRoleAssign'] + == 'No roles assigned directly to the host' + ) + class TestAnsibleREX: """Test class for remote execution via Ansible From c37a15c5d4db8aa7af459714c01599fda8b4ef72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Gajdu=C5=A1ek?= Date: Fri, 19 Apr 2024 14:39:35 +0200 Subject: [PATCH 139/150] Add logging to Satellite-xdist worker assignment process (#14539) --- pytest_fixtures/core/xdist.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/pytest_fixtures/core/xdist.py b/pytest_fixtures/core/xdist.py index 4d02fe026d0..2495e4fa1c2 100644 --- a/pytest_fixtures/core/xdist.py +++ b/pytest_fixtures/core/xdist.py @@ -1,4 +1,5 @@ """Fixtures specific to or relating to pytest's xdist plugin""" + import random from broker import Broker @@ -31,9 +32,17 @@ def align_to_satellite(request, worker_id, satellite_factory): # attempt to add potential satellites from the broker inventory file if settings.server.inventory_filter: + logger.info( + f'{worker_id=}: Attempting to add Satellite hosts using inventory filter: ' + f'{settings.server.inventory_filter}' + ) hosts = Satellite.get_hosts_from_inventory(filter=settings.server.inventory_filter) settings.server.hostnames += [host.hostname for host in hosts] + logger.debug( + f'{worker_id=}: {settings.server.xdist_behavior=}, ' + f'{settings.server.hostnames=}, {settings.server.auto_checkin=}' + ) # attempt to align a worker to a satellite if settings.server.xdist_behavior == 'run-on-one' and settings.server.hostnames: settings.set("server.hostname", settings.server.hostnames[0]) @@ -48,14 +57,19 @@ def align_to_satellite(request, worker_id, satellite_factory): settings.set("server.hostname", on_demand_sat.hostname) # if no satellite was received, fallback to balance if not settings.server.hostname: + logger.info( + f'{worker_id=}: No Satellite hostnames were available, ' + 'falling back to balance behavior' + ) settings.set("server.hostname", random.choice(settings.server.hostnames)) if settings.server.hostname: - logger.info( - f'xdist worker {worker_id} was assigned hostname {settings.server.hostname}' - ) + logger.info(f'{worker_id=}: Worker was assigned hostname {settings.server.hostname}') configure_airgun() configure_nailgun() yield if on_demand_sat and settings.server.auto_checkin: + logger.info( + f'{worker_id=}: Checking in on-demand Satellite ' f'{on_demand_sat.hostname}' + ) on_demand_sat.teardown() Broker(hosts=[on_demand_sat]).checkin() From 0bd1ae8e435f8897cde1bf73a6635aa4ff7d6c5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 23:58:47 -0400 Subject: [PATCH 140/150] Bump sphinx from 7.3.6 to 7.3.7 (#14845) --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index 857c0ac9816..5bba9c3a8ce 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -5,7 +5,7 @@ redis==5.0.3 pre-commit==3.7.0 # For generating documentation. -sphinx==7.3.6 +sphinx==7.3.7 sphinx-autoapi==3.0.0 # For 'manage' interactive shell From d13439eb8b477d1b54139c78fe79c22900190a87 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Mon, 22 Apr 2024 11:11:41 +0200 Subject: [PATCH 141/150] rex longrun job (#14437) --- robottelo/cli/job_invocation.py | 4 +- robottelo/host_helpers/cli_factory.py | 4 +- tests/foreman/longrun/test_remoteexecution.py | 50 +++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/foreman/longrun/test_remoteexecution.py diff --git a/robottelo/cli/job_invocation.py b/robottelo/cli/job_invocation.py index e1aeacdc84e..fe02dae4d74 100644 --- a/robottelo/cli/job_invocation.py +++ b/robottelo/cli/job_invocation.py @@ -32,7 +32,7 @@ def get_output(cls, options): return cls.execute(cls._construct_command(options)) @classmethod - def create(cls, options): + def create(cls, options, timeout=None): """Create a job""" cls.command_sub = 'create' - return cls.execute(cls._construct_command(options), output_format='csv') + return cls.execute(cls._construct_command(options), output_format='csv', timeout=timeout) diff --git a/robottelo/host_helpers/cli_factory.py b/robottelo/host_helpers/cli_factory.py index 30a28d57479..13eaf2242ec 100644 --- a/robottelo/host_helpers/cli_factory.py +++ b/robottelo/host_helpers/cli_factory.py @@ -33,7 +33,7 @@ from robottelo.utils.manifest import clone -def create_object(cli_object, options, values=None, credentials=None): +def create_object(cli_object, options, values=None, credentials=None, timeout=None): """ Creates with dictionary of arguments. @@ -52,7 +52,7 @@ def create_object(cli_object, options, values=None, credentials=None): if credentials: cli_object = cli_object.with_user(*credentials) try: - result = cli_object.create(options) + result = cli_object.create(options, timeout) except CLIReturnCodeError as err: # If the object is not created, raise exception, stop the show. raise CLIFactoryError( diff --git a/tests/foreman/longrun/test_remoteexecution.py b/tests/foreman/longrun/test_remoteexecution.py new file mode 100644 index 00000000000..abff4966d7a --- /dev/null +++ b/tests/foreman/longrun/test_remoteexecution.py @@ -0,0 +1,50 @@ +"""Test module for Remote Execution + +:Requirement: Remoteexecution + +:CaseAutomation: Automated + +:CaseComponent: RemoteExecution + +:Team: Endeavour + +:CaseImportance: High + +""" +import pytest + + +@pytest.mark.rhel_ver_list([9]) +def test_positive_run_long_job(module_org, rex_contenthost, module_target_sat): + """Run a long running job + + :id: 76934868-89e6-4eb6-905e-d0d5ededc077 + + :expectedresults: Verify the long job was successfully ran and not terminated too soon + + :bz: 2270295 + + :parametrized: yes + """ + client = rex_contenthost + invocation_command = module_target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Script Default', + 'inputs': 'command=sleep 700', + 'search-query': f"name ~ {client.hostname}", + }, + timeout='800s', + ) + result = module_target_sat.cli.JobInvocation.info({'id': invocation_command['id']}) + try: + assert result['success'] == '1' + except AssertionError as err: + raise AssertionError( + 'host output: {}'.format( + ' '.join( + module_target_sat.cli.JobInvocation.get_output( + {'id': invocation_command['id'], 'host': client.hostname} + ) + ) + ) + ) from err From 546bc759297d9fa061adacbd24583844995c7465 Mon Sep 17 00:00:00 2001 From: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> Date: Mon, 22 Apr 2024 16:50:44 +0530 Subject: [PATCH 142/150] Update Provisioning test workflow names (#14837) Provisioning test workflow name changes Signed-off-by: Shubham Ganar --- conf/provisioning.yaml.template | 2 ++ pytest_fixtures/component/provision_capsule_pxe.py | 2 +- pytest_fixtures/component/provision_pxe.py | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/conf/provisioning.yaml.template b/conf/provisioning.yaml.template index 308686cf84e..d2e547d91be 100644 --- a/conf/provisioning.yaml.template +++ b/conf/provisioning.yaml.template @@ -3,3 +3,5 @@ PROVISIONING: HOST_ROOT_PASSWORD: HOST_SSH_KEY_PRIV: HOST_SSH_KEY_PUB: + PROVISIONING_SAT_WORKFLOW: + PROVISIONING_HOST_WORKFLOW: diff --git a/pytest_fixtures/component/provision_capsule_pxe.py b/pytest_fixtures/component/provision_capsule_pxe.py index 4360ba6e4bd..dc8dd48471f 100644 --- a/pytest_fixtures/component/provision_capsule_pxe.py +++ b/pytest_fixtures/component/provision_capsule_pxe.py @@ -35,7 +35,7 @@ def capsule_provisioning_sat( sat = module_target_sat provisioning_domain_name = f"{gen_string('alpha').lower()}.foo" broker_data_out = Broker().execute( - workflow='configure-install-sat-provisioning-rhv', + workflow=settings.provisioning.provisioning_sat_workflow, artifacts='last', target_vlan_id=settings.provisioning.vlan_id, target_host=module_capsule_configured.name, diff --git a/pytest_fixtures/component/provision_pxe.py b/pytest_fixtures/component/provision_pxe.py index beef717d94d..18c98242fc7 100644 --- a/pytest_fixtures/component/provision_pxe.py +++ b/pytest_fixtures/component/provision_pxe.py @@ -152,7 +152,7 @@ def module_provisioning_sat( provisioning_domain_name = f"{gen_string('alpha').lower()}.foo" broker_data_out = Broker().execute( - workflow='configure-install-sat-provisioning-rhv', + workflow=settings.provisioning.provisioning_sat_workflow, artifacts='last', target_vlan_id=settings.provisioning.vlan_id, target_host=sat.name, @@ -223,7 +223,7 @@ def provisioning_host(module_ssh_key_file, pxe_loader): "" # TODO: Make this an optional fixture parameter (update vm_firmware when adding this) ) with Broker( - workflow="deploy-configure-pxe-provisioning-host-rhv", + workflow=settings.provisioning.provisioning_host_workflow, host_class=ContentHost, target_vlan_id=vlan_id, target_vm_firmware=pxe_loader.vm_firmware, @@ -245,7 +245,7 @@ def provision_multiple_hosts(module_ssh_key_file, pxe_loader, request): "" # TODO: Make this an optional fixture parameter (update vm_firmware when adding this) ) with Broker( - workflow="deploy-configure-pxe-provisioning-host-rhv", + workflow=settings.provisioning.provisioning_host_workflow, host_class=ContentHost, _count=getattr(request, 'param', 2), target_vlan_id=vlan_id, From 6817de467f25f6490ade1b77ff6a371812eb3914 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Mon, 22 Apr 2024 17:38:28 +0200 Subject: [PATCH 143/150] partition table fix (#14808) --- tests/foreman/cli/test_partitiontable.py | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/tests/foreman/cli/test_partitiontable.py b/tests/foreman/cli/test_partitiontable.py index 35e52cbbe65..51764ac8f0a 100644 --- a/tests/foreman/cli/test_partitiontable.py +++ b/tests/foreman/cli/test_partitiontable.py @@ -53,7 +53,7 @@ def test_positive_create_with_one_character_name(self, name, target_sat): strict=True, ) ) - ) + ), ) def test_positive_crud_with_name(self, name, new_name, module_target_sat): """Create, read, update and delete Partition Tables with different names @@ -86,23 +86,9 @@ def test_positive_create_with_content(self, module_target_sat): :CaseImportance: Critical """ content = 'Fake ptable' - ptable = module_target_sat.cli_factory.make_partition_table({'content': content}) - ptable_content = module_target_sat.cli.PartitionTable().dump({'id': ptable['id']}) - assert content in ptable_content - - @pytest.mark.tier1 - @pytest.mark.upgrade - def test_positive_create_with_content_length(self, module_target_sat): - """Create a Partition Table with content length more than 4096 chars - - :id: 59e6f9ef-85c2-4229-8831-00edb41b19f4 - - :expectedresults: Partition Table is created and has correct content - - :BZ: 1270181 - """ - content = gen_string('alpha', 5000) - ptable = module_target_sat.cli_factory.make_partition_table({'content': content}) + filename = gen_string('alpha', 10) + module_target_sat.execute(f'echo {content} > {filename}') + ptable = module_target_sat.cli_factory.make_partition_table({'file': filename}) ptable_content = module_target_sat.cli.PartitionTable().dump({'id': ptable['id']}) assert content in ptable_content From bcb33fc4d0002fa91456d1ff7fb5bdda251baf38 Mon Sep 17 00:00:00 2001 From: Griffin Sullivan <48397354+Griffin-Sullivan@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:56:38 -0400 Subject: [PATCH 144/150] Replace installer params test with module check test (#14524) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ondřej Gajdušek --- tests/foreman/installer/test_installer.py | 1329 +-------------------- 1 file changed, 50 insertions(+), 1279 deletions(-) diff --git a/tests/foreman/installer/test_installer.py b/tests/foreman/installer/test_installer.py index 581e1a2b41d..696e05f52e2 100644 --- a/tests/foreman/installer/test_installer.py +++ b/tests/foreman/installer/test_installer.py @@ -13,6 +13,7 @@ """ import pytest import requests +import yaml from robottelo import ssh from robottelo.config import settings @@ -21,1263 +22,6 @@ from robottelo.utils.installer import InstallerCommand from robottelo.utils.issue_handlers import is_open -PREVIOUS_INSTALLER_OPTIONS = { - '-', - '--[no-]colors', - '--[no-]enable-certs', - '--[no-]enable-apache-mod-status', - '--[no-]enable-foreman', - '--[no-]enable-foreman-cli', - '--[no-]enable-foreman-cli-ansible', - '--[no-]enable-foreman-cli-azure', - '--[no-]enable-foreman-cli-google', - '--[no-]enable-foreman-cli-katello', - '--[no-]enable-foreman-cli-kubevirt', - '--[no-]enable-foreman-cli-puppet', - '--[no-]enable-foreman-cli-remote-execution', - '--[no-]enable-foreman-cli-virt-who-configure', - '--[no-]enable-foreman-cli-webhooks', - '--[no-]enable-foreman-compute-ec2', - '--[no-]enable-foreman-compute-libvirt', - '--[no-]enable-foreman-compute-openstack', - '--[no-]enable-foreman-compute-ovirt', - '--[no-]enable-foreman-compute-vmware', - '--[no-]enable-foreman-plugin-ansible', - '--[no-]enable-foreman-plugin-azure', - '--[no-]enable-foreman-plugin-bootdisk', - '--[no-]enable-foreman-plugin-discovery', - '--[no-]enable-foreman-plugin-google', - '--[no-]enable-foreman-plugin-kubevirt', - '--[no-]enable-foreman-plugin-leapp', - '--[no-]enable-foreman-plugin-openscap', - '--[no-]enable-foreman-plugin-puppet', - '--[no-]enable-foreman-plugin-remote-execution', - '--[no-]enable-foreman-plugin-remote-execution-cockpit', - '--[no-]enable-foreman-plugin-rh-cloud', - '--[no-]enable-foreman-plugin-tasks', - '--[no-]enable-foreman-plugin-templates', - '--[no-]enable-foreman-plugin-virt-who-configure', - '--[no-]enable-foreman-plugin-webhooks', - '--[no-]enable-foreman-proxy', - '--[no-]enable-foreman-proxy-content', - '--[no-]enable-foreman-proxy-plugin-ansible', - '--[no-]enable-foreman-proxy-plugin-dhcp-infoblox', - '--[no-]enable-foreman-proxy-plugin-dhcp-remote-isc', - '--[no-]enable-foreman-proxy-plugin-discovery', - '--[no-]enable-foreman-proxy-plugin-dns-infoblox', - '--[no-]enable-foreman-proxy-plugin-openscap', - '--[no-]enable-foreman-proxy-plugin-remote-execution-script', - '--[no-]enable-foreman-proxy-plugin-shellhooks', - '--[no-]enable-katello', - '--[no-]enable-puppet', - '--[no-]lock-package-versions', - '--[no-]parser-cache', - '--[no-]verbose', - '--apache-mod-status-extended-status', - '--apache-mod-status-requires', - '--apache-mod-status-status-path', - '--certs-ca-common-name', - '--certs-ca-expiration', - '--certs-city', - '--certs-cname', - '--certs-country', - '--certs-default-ca-name', - '--certs-deploy', - '--certs-expiration', - '--certs-generate', - '--certs-group', - '--certs-node-fqdn', - '--certs-org', - '--certs-org-unit', - '--certs-pki-dir', - '--certs-regenerate', - '--certs-reset', - '--certs-server-ca-cert', - '--certs-server-ca-name', - '--certs-server-cert', - '--certs-server-cert-req', - '--certs-server-key', - '--certs-skip-check', - '--certs-ssl-build-dir', - '--certs-state', - '--certs-tar-file', - '--certs-update-all', - '--certs-update-server', - '--certs-update-server-ca', - '--certs-user', - '--color-of-background', - '--compare-scenarios', - '--detailed-exitcodes', - '--disable-scenario', - '--dont-save-answers', - '--enable-scenario', - '--force', - '--foreman-apache', - '--foreman-cli-foreman-url', - '--foreman-cli-manage-root-config', - '--foreman-cli-password', - '--foreman-cli-refresh-cache', - '--foreman-cli-request-timeout', - '--foreman-cli-ssl-ca-file', - '--foreman-cli-use-sessions', - '--foreman-cli-username', - '--foreman-cli-version', - '--foreman-client-ssl-ca', - '--foreman-client-ssl-cert', - '--foreman-client-ssl-key', - '--foreman-compute-ec2-version', - '--foreman-compute-libvirt-version', - '--foreman-compute-openstack-version', - '--foreman-compute-ovirt-version', - '--foreman-compute-vmware-version', - '--foreman-cors-domains', - '--foreman-db-database', - '--foreman-db-host', - '--foreman-db-manage', - '--foreman-db-manage-rake', - '--foreman-db-password', - '--foreman-db-pool', - '--foreman-db-port', - '--foreman-db-root-cert', - '--foreman-db-sslmode', - '--foreman-db-username', - '--foreman-dynflow-manage-services', - '--foreman-dynflow-orchestrator-ensure', - '--foreman-dynflow-redis-url', - '--foreman-dynflow-worker-concurrency', - '--foreman-dynflow-worker-instances', - '--foreman-email-delivery-method', - '--foreman-email-reply-address', - '--foreman-email-sendmail-arguments', - '--foreman-email-sendmail-location', - '--foreman-email-smtp-address', - '--foreman-email-smtp-authentication', - '--foreman-email-smtp-domain', - '--foreman-email-smtp-password', - '--foreman-email-smtp-port', - '--foreman-email-smtp-user-name', - '--foreman-email-subject-prefix', - '--foreman-foreman-service-puma-threads-max', - '--foreman-foreman-service-puma-threads-min', - '--foreman-foreman-service-puma-workers', - '--foreman-foreman-url', - '--foreman-gssapi-local-name', - '--foreman-hsts-enabled', - '--foreman-http-keytab', - '--foreman-initial-admin-email', - '--foreman-initial-admin-first-name', - '--foreman-initial-admin-last-name', - '--foreman-initial-admin-locale', - '--foreman-initial-admin-password', - '--foreman-initial-admin-timezone', - '--foreman-initial-admin-username', - '--foreman-initial-location', - '--foreman-initial-organization', - '--foreman-ipa-authentication', - '--foreman-ipa-authentication-api', - '--foreman-ipa-manage-sssd', - '--foreman-keycloak', - '--foreman-keycloak-app-name', - '--foreman-keycloak-realm', - '--foreman-loggers', - '--foreman-logging-layout', - '--foreman-logging-level', - '--foreman-logging-type', - '--foreman-oauth-active', - '--foreman-oauth-consumer-key', - '--foreman-oauth-consumer-secret', - '--foreman-oauth-effective-user', - '--foreman-oauth-map-users', - '--foreman-pam-service', - '--foreman-plugin-remote-execution-cockpit-ensure', - '--foreman-plugin-remote-execution-cockpit-origins', - '--foreman-plugin-tasks-automatic-cleanup', - '--foreman-plugin-tasks-backup', - '--foreman-plugin-tasks-cron-line', - '--foreman-plugin-version', - '--foreman-provisioning-ct-location', - '--foreman-provisioning-fcct-location', - '--foreman-proxy-autosignfile', - '--foreman-proxy-bind-host', - '--foreman-proxy-bmc', - '--foreman-proxy-bmc-default-provider', - '--foreman-proxy-bmc-listen-on', - '--foreman-proxy-bmc-redfish-verify-ssl', - '--foreman-proxy-bmc-ssh-key', - '--foreman-proxy-bmc-ssh-powercycle', - '--foreman-proxy-bmc-ssh-poweroff', - '--foreman-proxy-bmc-ssh-poweron', - '--foreman-proxy-bmc-ssh-powerstatus', - '--foreman-proxy-bmc-ssh-user', - '--foreman-proxy-content-enable-ansible', - '--foreman-proxy-content-enable-deb', - '--foreman-proxy-content-enable-docker', - '--foreman-proxy-content-enable-file', - '--foreman-proxy-content-enable-ostree', - '--foreman-proxy-content-enable-python', - '--foreman-proxy-content-enable-yum', - '--foreman-proxy-content-pulpcore-additional-export-paths', - '--foreman-proxy-content-pulpcore-additional-import-paths', - '--foreman-proxy-content-pulpcore-allowed-content-checksums', - '--foreman-proxy-content-pulpcore-api-service-worker-timeout', - '--foreman-proxy-content-pulpcore-cache-enabled', - '--foreman-proxy-content-pulpcore-cache-expires-ttl', - '--foreman-proxy-content-pulpcore-content-service-worker-timeout', - '--foreman-proxy-content-pulpcore-django-secret-key', - '--foreman-proxy-content-pulpcore-hide-guarded-distributions', - '--foreman-proxy-content-pulpcore-import-workers-percent', - '--foreman-proxy-content-pulpcore-manage-postgresql', - '--foreman-proxy-content-pulpcore-mirror', - '--foreman-proxy-content-pulpcore-postgresql-db-name', - '--foreman-proxy-content-pulpcore-postgresql-host', - '--foreman-proxy-content-pulpcore-postgresql-password', - '--foreman-proxy-content-pulpcore-postgresql-port', - '--foreman-proxy-content-pulpcore-postgresql-ssl', - '--foreman-proxy-content-pulpcore-postgresql-ssl-cert', - '--foreman-proxy-content-pulpcore-postgresql-ssl-key', - '--foreman-proxy-content-pulpcore-postgresql-ssl-require', - '--foreman-proxy-content-pulpcore-postgresql-ssl-root-ca', - '--foreman-proxy-content-pulpcore-postgresql-user', - '--foreman-proxy-content-pulpcore-telemetry', - '--foreman-proxy-content-pulpcore-worker-count', - '--foreman-proxy-content-reverse-proxy', - '--foreman-proxy-content-reverse-proxy-backend-protocol', - '--foreman-proxy-content-reverse-proxy-port', - '--foreman-proxy-dhcp', - '--foreman-proxy-dhcp-additional-interfaces', - '--foreman-proxy-dhcp-config', - '--foreman-proxy-dhcp-failover-address', - '--foreman-proxy-dhcp-failover-port', - '--foreman-proxy-dhcp-gateway', - '--foreman-proxy-dhcp-interface', - '--foreman-proxy-dhcp-ipxe-bootstrap', - '--foreman-proxy-dhcp-ipxefilename', - '--foreman-proxy-dhcp-key-name', - '--foreman-proxy-dhcp-key-secret', - '--foreman-proxy-dhcp-leases', - '--foreman-proxy-dhcp-listen-on', - '--foreman-proxy-dhcp-load-balance', - '--foreman-proxy-dhcp-load-split', - '--foreman-proxy-dhcp-manage-acls', - '--foreman-proxy-dhcp-managed', - '--foreman-proxy-dhcp-max-response-delay', - '--foreman-proxy-dhcp-max-unacked-updates', - '--foreman-proxy-dhcp-mclt', - '--foreman-proxy-dhcp-nameservers', - '--foreman-proxy-dhcp-netmask', - '--foreman-proxy-dhcp-network', - '--foreman-proxy-dhcp-node-type', - '--foreman-proxy-dhcp-omapi-port', - '--foreman-proxy-dhcp-option-domain', - '--foreman-proxy-dhcp-peer-address', - '--foreman-proxy-dhcp-ping-free-ip', - '--foreman-proxy-dhcp-provider', - '--foreman-proxy-dhcp-pxefilename', - '--foreman-proxy-dhcp-pxeserver', - '--foreman-proxy-dhcp-range', - '--foreman-proxy-dhcp-search-domains', - '--foreman-proxy-dhcp-server', - '--foreman-proxy-dhcp-subnets', - '--foreman-proxy-dns', - '--foreman-proxy-dns-forwarders', - '--foreman-proxy-dns-interface', - '--foreman-proxy-dns-listen-on', - '--foreman-proxy-dns-managed', - '--foreman-proxy-dns-provider', - '--foreman-proxy-dns-reverse', - '--foreman-proxy-dns-server', - '--foreman-proxy-dns-tsig-keytab', - '--foreman-proxy-dns-tsig-principal', - '--foreman-proxy-dns-ttl', - '--foreman-proxy-dns-zone', - '--foreman-proxy-ensure-packages-version', - '--foreman-proxy-foreman-base-url', - '--foreman-proxy-foreman-ssl-ca', - '--foreman-proxy-foreman-ssl-cert', - '--foreman-proxy-foreman-ssl-key', - '--foreman-proxy-freeipa-config', - '--foreman-proxy-freeipa-remove-dns', - '--foreman-proxy-groups', - '--foreman-proxy-http', - '--foreman-proxy-http-port', - '--foreman-proxy-httpboot', - '--foreman-proxy-httpboot-listen-on', - '--foreman-proxy-keyfile', - '--foreman-proxy-libvirt-connection', - '--foreman-proxy-libvirt-network', - '--foreman-proxy-log', - '--foreman-proxy-log-buffer', - '--foreman-proxy-log-buffer-errors', - '--foreman-proxy-log-level', - '--foreman-proxy-logs', - '--foreman-proxy-logs-listen-on', - '--foreman-proxy-manage-puppet-group', - '--foreman-proxy-manage-service', - '--foreman-proxy-oauth-consumer-key', - '--foreman-proxy-oauth-consumer-secret', - '--foreman-proxy-oauth-effective-user', - '--foreman-proxy-plugin-ansible-ansible-dir', - '--foreman-proxy-plugin-ansible-callback', - '--foreman-proxy-plugin-ansible-collections-paths', - '--foreman-proxy-plugin-ansible-enabled', - '--foreman-proxy-plugin-ansible-host-key-checking', - '--foreman-proxy-plugin-ansible-install-runner', - '--foreman-proxy-plugin-ansible-listen-on', - '--foreman-proxy-plugin-ansible-roles-path', - '--foreman-proxy-plugin-ansible-runner-package-name', - '--foreman-proxy-plugin-ansible-ssh-args', - '--foreman-proxy-plugin-ansible-working-dir', - '--foreman-proxy-plugin-dhcp-infoblox-dns-view', - '--foreman-proxy-plugin-dhcp-infoblox-network-view', - '--foreman-proxy-plugin-dhcp-infoblox-password', - '--foreman-proxy-plugin-dhcp-infoblox-record-type', - '--foreman-proxy-plugin-dhcp-infoblox-used-ips-search-type', - '--foreman-proxy-plugin-dhcp-infoblox-username', - '--foreman-proxy-plugin-dhcp-remote-isc-dhcp-config', - '--foreman-proxy-plugin-dhcp-remote-isc-dhcp-leases', - '--foreman-proxy-plugin-dhcp-remote-isc-key-name', - '--foreman-proxy-plugin-dhcp-remote-isc-key-secret', - '--foreman-proxy-plugin-dhcp-remote-isc-omapi-port', - '--foreman-proxy-plugin-discovery-enabled', - '--foreman-proxy-plugin-discovery-image-name', - '--foreman-proxy-plugin-discovery-install-images', - '--foreman-proxy-plugin-discovery-listen-on', - '--foreman-proxy-plugin-discovery-source-url', - '--foreman-proxy-plugin-discovery-tftp-root', - '--foreman-proxy-plugin-discovery-version', - '--foreman-proxy-plugin-dns-infoblox-dns-server', - '--foreman-proxy-plugin-dns-infoblox-dns-view', - '--foreman-proxy-plugin-dns-infoblox-password', - '--foreman-proxy-plugin-dns-infoblox-username', - '--foreman-proxy-plugin-openscap-ansible-module', - '--foreman-proxy-plugin-openscap-ansible-module-ensure', - '--foreman-proxy-plugin-openscap-contentdir', - '--foreman-proxy-plugin-openscap-corrupted-dir', - '--foreman-proxy-plugin-openscap-enabled', - '--foreman-proxy-plugin-openscap-failed-dir', - '--foreman-proxy-plugin-openscap-listen-on', - '--foreman-proxy-plugin-openscap-openscap-send-log-file', - '--foreman-proxy-plugin-openscap-proxy-name', - '--foreman-proxy-plugin-openscap-puppet-module', - '--foreman-proxy-plugin-openscap-puppet-module-ensure', - '--foreman-proxy-plugin-openscap-reportsdir', - '--foreman-proxy-plugin-openscap-spooldir', - '--foreman-proxy-plugin-openscap-timeout', - '--foreman-proxy-plugin-openscap-version', - '--foreman-proxy-plugin-remote-execution-script-cockpit-integration', - '--foreman-proxy-plugin-remote-execution-script-enabled', - '--foreman-proxy-plugin-remote-execution-script-generate-keys', - '--foreman-proxy-plugin-remote-execution-script-install-key', - '--foreman-proxy-plugin-remote-execution-script-listen-on', - '--foreman-proxy-plugin-remote-execution-script-local-working-dir', - '--foreman-proxy-plugin-remote-execution-script-mode', - '--foreman-proxy-plugin-remote-execution-script-mqtt-rate-limit', - '--foreman-proxy-plugin-remote-execution-script-mqtt-resend-interval', - '--foreman-proxy-plugin-remote-execution-script-mqtt-ttl', - '--foreman-proxy-plugin-remote-execution-script-remote-working-dir', - '--foreman-proxy-plugin-remote-execution-script-ssh-identity-dir', - '--foreman-proxy-plugin-remote-execution-script-ssh-identity-file', - '--foreman-proxy-plugin-remote-execution-script-ssh-kerberos-auth', - '--foreman-proxy-plugin-remote-execution-script-ssh-keygen', - '--foreman-proxy-plugin-remote-execution-script-ssh-log-level', - '--foreman-proxy-plugin-shellhooks-directory', - '--foreman-proxy-plugin-shellhooks-enabled', - '--foreman-proxy-plugin-shellhooks-listen-on', - '--foreman-proxy-plugin-shellhooks-version', - '--foreman-proxy-puppet', - '--foreman-proxy-puppet-api-timeout', - '--foreman-proxy-puppet-group', - '--foreman-proxy-puppet-listen-on', - '--foreman-proxy-puppet-ssl-ca', - '--foreman-proxy-puppet-ssl-cert', - '--foreman-proxy-puppet-ssl-key', - '--foreman-proxy-puppet-url', - '--foreman-proxy-puppetca', - '--foreman-proxy-puppetca-certificate', - '--foreman-proxy-puppetca-listen-on', - '--foreman-proxy-puppetca-provider', - '--foreman-proxy-puppetca-sign-all', - '--foreman-proxy-puppetca-token-ttl', - '--foreman-proxy-puppetca-tokens-file', - '--foreman-proxy-puppetdir', - '--foreman-proxy-realm', - '--foreman-proxy-realm-keytab', - '--foreman-proxy-realm-listen-on', - '--foreman-proxy-realm-principal', - '--foreman-proxy-realm-provider', - '--foreman-proxy-register-in-foreman', - '--foreman-proxy-registered-name', - '--foreman-proxy-registered-proxy-url', - '--foreman-proxy-registration', - '--foreman-proxy-registration-listen-on', - '--foreman-proxy-registration-url', - '--foreman-proxy-ssl', - '--foreman-proxy-ssl-ca', - '--foreman-proxy-ssl-cert', - '--foreman-proxy-ssl-disabled-ciphers', - '--foreman-proxy-ssl-key', - '--foreman-proxy-ssl-port', - '--foreman-proxy-ssldir', - '--foreman-proxy-template-url', - '--foreman-proxy-templates', - '--foreman-proxy-templates-listen-on', - '--foreman-proxy-tftp', - '--foreman-proxy-tftp-dirs', - '--foreman-proxy-tftp-listen-on', - '--foreman-proxy-tftp-manage-wget', - '--foreman-proxy-tftp-managed', - '--foreman-proxy-tftp-replace-grub2-cfg', - '--foreman-proxy-tftp-root', - '--foreman-proxy-tftp-servername', - '--foreman-proxy-tls-disabled-versions', - '--foreman-proxy-trusted-hosts', - '--foreman-proxy-version', - '--foreman-rails-cache-store', - '--foreman-register-in-foreman', - '--foreman-server-port', - '--foreman-server-ssl-ca', - '--foreman-server-ssl-cert', - '--foreman-server-ssl-chain', - '--foreman-server-ssl-crl', - '--foreman-server-ssl-key', - '--foreman-server-ssl-port', - '--foreman-server-ssl-protocol', - '--foreman-server-ssl-verify-client', - '--foreman-serveraliases', - '--foreman-servername', - '--foreman-ssl', - '--foreman-telemetry-logger-enabled', - '--foreman-telemetry-logger-level', - '--foreman-telemetry-prefix', - '--foreman-telemetry-prometheus-enabled', - '--foreman-telemetry-statsd-enabled', - '--foreman-telemetry-statsd-host', - '--foreman-telemetry-statsd-protocol', - '--foreman-trusted-proxies', - '--foreman-unattended', - '--foreman-unattended-url', - '--foreman-version', - '--foreman-websockets-encrypt', - '--foreman-websockets-ssl-cert', - '--foreman-websockets-ssl-key', - '--full-help', - '--help', - '--ignore-undocumented', - '--interactive', - '--katello-candlepin-db-host', - '--katello-candlepin-db-name', - '--katello-candlepin-db-password', - '--katello-candlepin-db-port', - '--katello-candlepin-db-ssl', - '--katello-candlepin-db-ssl-ca', - '--katello-candlepin-db-ssl-verify', - '--katello-candlepin-db-user', - '--katello-candlepin-loggers', - '--katello-candlepin-manage-db', - '--katello-candlepin-oauth-key', - '--katello-candlepin-oauth-secret', - '--katello-hosts-queue-workers', - '--katello-rest-client-timeout', - '--list-scenarios', - '--log-level', - '--migrations-only', - '--noop', - '--profile', - '--puppet-additional-settings', - '--puppet-agent', - '--puppet-agent-additional-settings', - '--puppet-agent-default-schedules', - '--puppet-agent-noop', - '--puppet-agent-restart-command', - '--puppet-agent-server-hostname', - '--puppet-agent-server-port', - '--puppet-allow-any-crl-auth', - '--puppet-auth-allowed', - '--puppet-autosign', - '--puppet-autosign-content', - '--puppet-autosign-entries', - '--puppet-autosign-mode', - '--puppet-autosign-source', - '--puppet-ca-crl-filepath', - '--puppet-ca-port', - '--puppet-ca-server', - '--puppet-certificate-revocation', - '--puppet-classfile', - '--puppet-client-certname', - '--puppet-client-package', - '--puppet-codedir', - '--puppet-cron-cmd', - '--puppet-dir', - '--puppet-dir-group', - '--puppet-dir-owner', - '--puppet-dns-alt-names', - '--puppet-environment', - '--puppet-group', - '--puppet-hiera-config', - '--puppet-http-connect-timeout', - '--puppet-http-read-timeout', - '--puppet-localconfig', - '--puppet-logdir', - '--puppet-manage-packages', - '--puppet-module-repository', - '--puppet-package-install-options', - '--puppet-package-provider', - '--puppet-package-source', - '--puppet-pluginfactsource', - '--puppet-pluginsource', - '--puppet-postrun-command', - '--puppet-prerun-command', - '--puppet-puppetconf-mode', - '--puppet-report', - '--puppet-run-hour', - '--puppet-run-minute', - '--puppet-rundir', - '--puppet-runinterval', - '--puppet-runmode', - '--puppet-server', - '--puppet-server-acceptor-threads', - '--puppet-server-additional-settings', - '--puppet-server-admin-api-allowlist', - '--puppet-server-allow-header-cert-info', - '--puppet-server-ca', - '--puppet-server-ca-allow-auth-extensions', - '--puppet-server-ca-allow-sans', - '--puppet-server-ca-auth-required', - '--puppet-server-ca-client-self-delete', - '--puppet-server-ca-client-allowlist', - '--puppet-server-ca-crl-sync', - '--puppet-server-ca-enable-infra-crl', - '--puppet-server-certname', - '--puppet-server-check-for-updates', - '--puppet-server-cipher-suites', - '--puppet-server-common-modules-path', - '--puppet-server-compile-mode', - '--puppet-server-connect-timeout', - '--puppet-server-crl-enable', - '--puppet-server-custom-trusted-oid-mapping', - '--puppet-server-default-manifest', - '--puppet-server-default-manifest-content', - '--puppet-server-default-manifest-path', - '--puppet-server-dir', - '--puppet-server-environment-class-cache-enabled', - '--puppet-server-environment-timeout', - '--puppet-server-environment-vars', - '--puppet-server-environments-group', - '--puppet-server-environments-mode', - '--puppet-server-environments-owner', - '--puppet-server-environments-recurse', - '--puppet-server-envs-dir', - '--puppet-server-envs-target', - '--puppet-server-external-nodes', - '--puppet-server-foreman', - '--puppet-server-foreman-facts', - '--puppet-server-foreman-ssl-ca', - '--puppet-server-foreman-ssl-cert', - '--puppet-server-foreman-ssl-key', - '--puppet-server-foreman-url', - '--puppet-server-git-branch-map', - '--puppet-server-git-repo', - '--puppet-server-git-repo-group', - '--puppet-server-git-repo-hook-mode', - '--puppet-server-git-repo-path', - '--puppet-server-git-repo-umask', - '--puppet-server-git-repo-user', - '--puppet-server-group', - '--puppet-server-http', - '--puppet-server-http-port', - '--puppet-server-idle-timeout', - '--puppet-server-ip', - '--puppet-server-jolokia-metrics-allowlist', - '--puppet-server-jruby-gem-home', - '--puppet-server-jvm-cli-args', - '--puppet-server-jvm-config', - '--puppet-server-jvm-extra-args', - '--puppet-server-jvm-java-bin', - '--puppet-server-jvm-max-heap-size', - '--puppet-server-jvm-min-heap-size', - '--puppet-server-manage-user', - '--puppet-server-max-active-instances', - '--puppet-server-max-open-files', - '--puppet-server-max-queued-requests', - '--puppet-server-max-requests-per-instance', - '--puppet-server-max-retry-delay', - '--puppet-server-max-threads', - '--puppet-server-metrics-allowed', - '--puppet-server-metrics-graphite-enable', - '--puppet-server-metrics-graphite-host', - '--puppet-server-metrics-graphite-interval', - '--puppet-server-metrics-graphite-port', - '--puppet-server-metrics-jmx-enable', - '--puppet-server-metrics-server-id', - '--puppet-server-multithreaded', - '--puppet-server-package', - '--puppet-server-parser', - '--puppet-server-port', - '--puppet-server-post-hook-content', - '--puppet-server-post-hook-name', - '--puppet-server-puppet-basedir', - '--puppet-server-puppetserver-auth-template', - '--puppet-server-puppetserver-dir', - '--puppet-server-puppetserver-experimental', - '--puppet-server-puppetserver-logdir', - '--puppet-server-puppetserver-metrics', - '--puppet-server-puppetserver-profiler', - '--puppet-server-puppetserver-rundir', - '--puppet-server-puppetserver-telemetry', - '--puppet-server-puppetserver-trusted-agents', - '--puppet-server-puppetserver-trusted-certificate-extensions', - '--puppet-server-puppetserver-vardir', - '--puppet-server-puppetserver-version', - '--puppet-server-reports', - '--puppet-server-request-timeout', - '--puppet-server-ruby-load-paths', - '--puppet-server-selector-threads', - '--puppet-server-ssl-acceptor-threads', - '--puppet-server-ssl-chain-filepath', - '--puppet-server-ssl-dir', - '--puppet-server-ssl-dir-manage', - '--puppet-server-ssl-key-manage', - '--puppet-server-ssl-protocols', - '--puppet-server-ssl-selector-threads', - '--puppet-server-storeconfigs', - '--puppet-server-strict-variables', - '--puppet-server-trusted-external-command', - '--puppet-server-user', - '--puppet-server-version', - '--puppet-server-versioned-code-content', - '--puppet-server-versioned-code-id', - '--puppet-server-web-idle-timeout', - '--puppet-service-name', - '--puppet-sharedir', - '--puppet-show-diff', - '--puppet-splay', - '--puppet-splaylimit', - '--puppet-srv-domain', - '--puppet-ssldir', - '--puppet-syslogfacility', - '--puppet-systemd-cmd', - '--puppet-systemd-randomizeddelaysec', - '--puppet-systemd-unit-name', - '--puppet-unavailable-runmodes', - '--puppet-use-srv-records', - '--puppet-usecacheonfailure', - '--puppet-user', - '--puppet-vardir', - '--puppet-version', - '--register-with-insights', - '--reset-apache-mod-status-extended-status', - '--reset-apache-mod-status-requires', - '--reset-apache-mod-status-status-path', - '--reset-certs-ca-common-name', - '--reset-certs-ca-expiration', - '--reset-certs-city', - '--reset-certs-cname', - '--reset-certs-country', - '--reset-certs-default-ca-name', - '--reset-certs-deploy', - '--reset-certs-expiration', - '--reset-certs-generate', - '--reset-certs-group', - '--reset-certs-node-fqdn', - '--reset-certs-org', - '--reset-certs-org-unit', - '--reset-certs-pki-dir', - '--reset-certs-regenerate', - '--reset-certs-server-ca-cert', - '--reset-certs-server-ca-name', - '--reset-certs-server-cert', - '--reset-certs-server-cert-req', - '--reset-certs-server-key', - '--reset-certs-ssl-build-dir', - '--reset-certs-state', - '--reset-certs-tar-file', - '--reset-certs-user', - '--reset-data', - '--reset-foreman-apache', - '--reset-foreman-cli-foreman-url', - '--reset-foreman-cli-manage-root-config', - '--reset-foreman-cli-password', - '--reset-foreman-cli-refresh-cache', - '--reset-foreman-cli-request-timeout', - '--reset-foreman-cli-ssl-ca-file', - '--reset-foreman-cli-use-sessions', - '--reset-foreman-cli-username', - '--reset-foreman-cli-version', - '--reset-foreman-client-ssl-ca', - '--reset-foreman-client-ssl-cert', - '--reset-foreman-client-ssl-key', - '--reset-foreman-compute-ec2-version', - '--reset-foreman-compute-libvirt-version', - '--reset-foreman-compute-openstack-version', - '--reset-foreman-compute-ovirt-version', - '--reset-foreman-compute-vmware-version', - '--reset-foreman-cors-domains', - '--reset-foreman-db-database', - '--reset-foreman-db-host', - '--reset-foreman-db-manage', - '--reset-foreman-db-manage-rake', - '--reset-foreman-db-password', - '--reset-foreman-db-pool', - '--reset-foreman-db-port', - '--reset-foreman-db-root-cert', - '--reset-foreman-db-sslmode', - '--reset-foreman-db-username', - '--reset-foreman-dynflow-manage-services', - '--reset-foreman-dynflow-orchestrator-ensure', - '--reset-foreman-dynflow-redis-url', - '--reset-foreman-dynflow-worker-concurrency', - '--reset-foreman-dynflow-worker-instances', - '--reset-foreman-email-delivery-method', - '--reset-foreman-email-reply-address', - '--reset-foreman-email-sendmail-arguments', - '--reset-foreman-email-sendmail-location', - '--reset-foreman-email-smtp-address', - '--reset-foreman-email-smtp-authentication', - '--reset-foreman-email-smtp-domain', - '--reset-foreman-email-smtp-password', - '--reset-foreman-email-smtp-port', - '--reset-foreman-email-smtp-user-name', - '--reset-foreman-email-subject-prefix', - '--reset-foreman-foreman-service-puma-threads-max', - '--reset-foreman-foreman-service-puma-threads-min', - '--reset-foreman-foreman-service-puma-workers', - '--reset-foreman-foreman-url', - '--reset-foreman-gssapi-local-name', - '--reset-foreman-hsts-enabled', - '--reset-foreman-http-keytab', - '--reset-foreman-initial-admin-email', - '--reset-foreman-initial-admin-first-name', - '--reset-foreman-initial-admin-last-name', - '--reset-foreman-initial-admin-locale', - '--reset-foreman-initial-admin-password', - '--reset-foreman-initial-admin-timezone', - '--reset-foreman-initial-admin-username', - '--reset-foreman-initial-location', - '--reset-foreman-initial-organization', - '--reset-foreman-ipa-authentication', - '--reset-foreman-ipa-authentication-api', - '--reset-foreman-ipa-manage-sssd', - '--reset-foreman-keycloak', - '--reset-foreman-keycloak-app-name', - '--reset-foreman-keycloak-realm', - '--reset-foreman-loggers', - '--reset-foreman-logging-layout', - '--reset-foreman-logging-level', - '--reset-foreman-logging-type', - '--reset-foreman-oauth-active', - '--reset-foreman-oauth-consumer-key', - '--reset-foreman-oauth-consumer-secret', - '--reset-foreman-oauth-effective-user', - '--reset-foreman-oauth-map-users', - '--reset-foreman-pam-service', - '--reset-foreman-plugin-remote-execution-cockpit-ensure', - '--reset-foreman-plugin-remote-execution-cockpit-origins', - '--reset-foreman-plugin-tasks-automatic-cleanup', - '--reset-foreman-plugin-tasks-backup', - '--reset-foreman-plugin-tasks-cron-line', - '--reset-foreman-plugin-version', - '--reset-foreman-provisioning-ct-location', - '--reset-foreman-provisioning-fcct-location', - '--reset-foreman-proxy-autosignfile', - '--reset-foreman-proxy-bind-host', - '--reset-foreman-proxy-bmc', - '--reset-foreman-proxy-bmc-default-provider', - '--reset-foreman-proxy-bmc-listen-on', - '--reset-foreman-proxy-bmc-redfish-verify-ssl', - '--reset-foreman-proxy-bmc-ssh-key', - '--reset-foreman-proxy-bmc-ssh-powercycle', - '--reset-foreman-proxy-bmc-ssh-poweroff', - '--reset-foreman-proxy-bmc-ssh-poweron', - '--reset-foreman-proxy-bmc-ssh-powerstatus', - '--reset-foreman-proxy-bmc-ssh-user', - '--reset-foreman-proxy-content-enable-ansible', - '--reset-foreman-proxy-content-enable-deb', - '--reset-foreman-proxy-content-enable-docker', - '--reset-foreman-proxy-content-enable-file', - '--reset-foreman-proxy-content-enable-ostree', - '--reset-foreman-proxy-content-enable-python', - '--reset-foreman-proxy-content-enable-yum', - '--reset-foreman-proxy-content-pulpcore-additional-export-paths', - '--reset-foreman-proxy-content-pulpcore-additional-import-paths', - '--reset-foreman-proxy-content-pulpcore-allowed-content-checksums', - '--reset-foreman-proxy-content-pulpcore-api-service-worker-timeout', - '--reset-foreman-proxy-content-pulpcore-cache-enabled', - '--reset-foreman-proxy-content-pulpcore-cache-expires-ttl', - '--reset-foreman-proxy-content-pulpcore-content-service-worker-timeout', - '--reset-foreman-proxy-content-pulpcore-django-secret-key', - '--reset-foreman-proxy-content-pulpcore-hide-guarded-distributions', - '--reset-foreman-proxy-content-pulpcore-import-workers-percent', - '--reset-foreman-proxy-content-pulpcore-manage-postgresql', - '--reset-foreman-proxy-content-pulpcore-mirror', - '--reset-foreman-proxy-content-pulpcore-postgresql-db-name', - '--reset-foreman-proxy-content-pulpcore-postgresql-host', - '--reset-foreman-proxy-content-pulpcore-postgresql-password', - '--reset-foreman-proxy-content-pulpcore-postgresql-port', - '--reset-foreman-proxy-content-pulpcore-postgresql-ssl', - '--reset-foreman-proxy-content-pulpcore-postgresql-ssl-cert', - '--reset-foreman-proxy-content-pulpcore-postgresql-ssl-key', - '--reset-foreman-proxy-content-pulpcore-postgresql-ssl-require', - '--reset-foreman-proxy-content-pulpcore-postgresql-ssl-root-ca', - '--reset-foreman-proxy-content-pulpcore-postgresql-user', - '--reset-foreman-proxy-content-pulpcore-telemetry', - '--reset-foreman-proxy-content-pulpcore-worker-count', - '--reset-foreman-proxy-content-reverse-proxy', - '--reset-foreman-proxy-content-reverse-proxy-backend-protocol', - '--reset-foreman-proxy-content-reverse-proxy-port', - '--reset-foreman-proxy-dhcp', - '--reset-foreman-proxy-dhcp-additional-interfaces', - '--reset-foreman-proxy-dhcp-config', - '--reset-foreman-proxy-dhcp-failover-address', - '--reset-foreman-proxy-dhcp-failover-port', - '--reset-foreman-proxy-dhcp-gateway', - '--reset-foreman-proxy-dhcp-interface', - '--reset-foreman-proxy-dhcp-ipxe-bootstrap', - '--reset-foreman-proxy-dhcp-ipxefilename', - '--reset-foreman-proxy-dhcp-key-name', - '--reset-foreman-proxy-dhcp-key-secret', - '--reset-foreman-proxy-dhcp-leases', - '--reset-foreman-proxy-dhcp-listen-on', - '--reset-foreman-proxy-dhcp-load-balance', - '--reset-foreman-proxy-dhcp-load-split', - '--reset-foreman-proxy-dhcp-manage-acls', - '--reset-foreman-proxy-dhcp-managed', - '--reset-foreman-proxy-dhcp-max-response-delay', - '--reset-foreman-proxy-dhcp-max-unacked-updates', - '--reset-foreman-proxy-dhcp-mclt', - '--reset-foreman-proxy-dhcp-nameservers', - '--reset-foreman-proxy-dhcp-netmask', - '--reset-foreman-proxy-dhcp-network', - '--reset-foreman-proxy-dhcp-node-type', - '--reset-foreman-proxy-dhcp-omapi-port', - '--reset-foreman-proxy-dhcp-option-domain', - '--reset-foreman-proxy-dhcp-peer-address', - '--reset-foreman-proxy-dhcp-ping-free-ip', - '--reset-foreman-proxy-dhcp-provider', - '--reset-foreman-proxy-dhcp-pxefilename', - '--reset-foreman-proxy-dhcp-pxeserver', - '--reset-foreman-proxy-dhcp-range', - '--reset-foreman-proxy-dhcp-search-domains', - '--reset-foreman-proxy-dhcp-server', - '--reset-foreman-proxy-dhcp-subnets', - '--reset-foreman-proxy-dns', - '--reset-foreman-proxy-dns-forwarders', - '--reset-foreman-proxy-dns-interface', - '--reset-foreman-proxy-dns-listen-on', - '--reset-foreman-proxy-dns-managed', - '--reset-foreman-proxy-dns-provider', - '--reset-foreman-proxy-dns-reverse', - '--reset-foreman-proxy-dns-server', - '--reset-foreman-proxy-dns-tsig-keytab', - '--reset-foreman-proxy-dns-tsig-principal', - '--reset-foreman-proxy-dns-ttl', - '--reset-foreman-proxy-dns-zone', - '--reset-foreman-proxy-ensure-packages-version', - '--reset-foreman-proxy-foreman-base-url', - '--reset-foreman-proxy-foreman-ssl-ca', - '--reset-foreman-proxy-foreman-ssl-cert', - '--reset-foreman-proxy-foreman-ssl-key', - '--reset-foreman-proxy-freeipa-config', - '--reset-foreman-proxy-freeipa-remove-dns', - '--reset-foreman-proxy-groups', - '--reset-foreman-proxy-http', - '--reset-foreman-proxy-http-port', - '--reset-foreman-proxy-httpboot', - '--reset-foreman-proxy-httpboot-listen-on', - '--reset-foreman-proxy-keyfile', - '--reset-foreman-proxy-libvirt-connection', - '--reset-foreman-proxy-libvirt-network', - '--reset-foreman-proxy-log', - '--reset-foreman-proxy-log-buffer', - '--reset-foreman-proxy-log-buffer-errors', - '--reset-foreman-proxy-log-level', - '--reset-foreman-proxy-logs', - '--reset-foreman-proxy-logs-listen-on', - '--reset-foreman-proxy-manage-puppet-group', - '--reset-foreman-proxy-manage-service', - '--reset-foreman-proxy-oauth-consumer-key', - '--reset-foreman-proxy-oauth-consumer-secret', - '--reset-foreman-proxy-oauth-effective-user', - '--reset-foreman-proxy-plugin-ansible-ansible-dir', - '--reset-foreman-proxy-plugin-ansible-callback', - '--reset-foreman-proxy-plugin-ansible-collections-paths', - '--reset-foreman-proxy-plugin-ansible-enabled', - '--reset-foreman-proxy-plugin-ansible-host-key-checking', - '--reset-foreman-proxy-plugin-ansible-install-runner', - '--reset-foreman-proxy-plugin-ansible-listen-on', - '--reset-foreman-proxy-plugin-ansible-roles-path', - '--reset-foreman-proxy-plugin-ansible-runner-package-name', - '--reset-foreman-proxy-plugin-ansible-ssh-args', - '--reset-foreman-proxy-plugin-ansible-working-dir', - '--reset-foreman-proxy-plugin-dhcp-infoblox-dns-view', - '--reset-foreman-proxy-plugin-dhcp-infoblox-network-view', - '--reset-foreman-proxy-plugin-dhcp-infoblox-password', - '--reset-foreman-proxy-plugin-dhcp-infoblox-record-type', - '--reset-foreman-proxy-plugin-dhcp-infoblox-used-ips-search-type', - '--reset-foreman-proxy-plugin-dhcp-infoblox-username', - '--reset-foreman-proxy-plugin-dhcp-remote-isc-dhcp-config', - '--reset-foreman-proxy-plugin-dhcp-remote-isc-dhcp-leases', - '--reset-foreman-proxy-plugin-dhcp-remote-isc-key-name', - '--reset-foreman-proxy-plugin-dhcp-remote-isc-key-secret', - '--reset-foreman-proxy-plugin-dhcp-remote-isc-omapi-port', - '--reset-foreman-proxy-plugin-discovery-enabled', - '--reset-foreman-proxy-plugin-discovery-image-name', - '--reset-foreman-proxy-plugin-discovery-install-images', - '--reset-foreman-proxy-plugin-discovery-listen-on', - '--reset-foreman-proxy-plugin-discovery-source-url', - '--reset-foreman-proxy-plugin-discovery-tftp-root', - '--reset-foreman-proxy-plugin-discovery-version', - '--reset-foreman-proxy-plugin-dns-infoblox-dns-server', - '--reset-foreman-proxy-plugin-dns-infoblox-dns-view', - '--reset-foreman-proxy-plugin-dns-infoblox-password', - '--reset-foreman-proxy-plugin-dns-infoblox-username', - '--reset-foreman-proxy-plugin-openscap-ansible-module', - '--reset-foreman-proxy-plugin-openscap-ansible-module-ensure', - '--reset-foreman-proxy-plugin-openscap-contentdir', - '--reset-foreman-proxy-plugin-openscap-corrupted-dir', - '--reset-foreman-proxy-plugin-openscap-enabled', - '--reset-foreman-proxy-plugin-openscap-failed-dir', - '--reset-foreman-proxy-plugin-openscap-listen-on', - '--reset-foreman-proxy-plugin-openscap-openscap-send-log-file', - '--reset-foreman-proxy-plugin-openscap-proxy-name', - '--reset-foreman-proxy-plugin-openscap-puppet-module', - '--reset-foreman-proxy-plugin-openscap-puppet-module-ensure', - '--reset-foreman-proxy-plugin-openscap-reportsdir', - '--reset-foreman-proxy-plugin-openscap-spooldir', - '--reset-foreman-proxy-plugin-openscap-timeout', - '--reset-foreman-proxy-plugin-openscap-version', - '--reset-foreman-proxy-plugin-remote-execution-script-cockpit-integration', - '--reset-foreman-proxy-plugin-remote-execution-script-enabled', - '--reset-foreman-proxy-plugin-remote-execution-script-generate-keys', - '--reset-foreman-proxy-plugin-remote-execution-script-install-key', - '--reset-foreman-proxy-plugin-remote-execution-script-listen-on', - '--reset-foreman-proxy-plugin-remote-execution-script-local-working-dir', - '--reset-foreman-proxy-plugin-remote-execution-script-mode', - '--reset-foreman-proxy-plugin-remote-execution-script-mqtt-rate-limit', - '--reset-foreman-proxy-plugin-remote-execution-script-mqtt-resend-interval', - '--reset-foreman-proxy-plugin-remote-execution-script-mqtt-ttl', - '--reset-foreman-proxy-plugin-remote-execution-script-remote-working-dir', - '--reset-foreman-proxy-plugin-remote-execution-script-ssh-identity-dir', - '--reset-foreman-proxy-plugin-remote-execution-script-ssh-identity-file', - '--reset-foreman-proxy-plugin-remote-execution-script-ssh-kerberos-auth', - '--reset-foreman-proxy-plugin-remote-execution-script-ssh-keygen', - '--reset-foreman-proxy-plugin-remote-execution-script-ssh-log-level', - '--reset-foreman-proxy-plugin-shellhooks-directory', - '--reset-foreman-proxy-plugin-shellhooks-enabled', - '--reset-foreman-proxy-plugin-shellhooks-listen-on', - '--reset-foreman-proxy-plugin-shellhooks-version', - '--reset-foreman-proxy-puppet', - '--reset-foreman-proxy-puppet-api-timeout', - '--reset-foreman-proxy-puppet-group', - '--reset-foreman-proxy-puppet-listen-on', - '--reset-foreman-proxy-puppet-ssl-ca', - '--reset-foreman-proxy-puppet-ssl-cert', - '--reset-foreman-proxy-puppet-ssl-key', - '--reset-foreman-proxy-puppet-url', - '--reset-foreman-proxy-puppetca', - '--reset-foreman-proxy-puppetca-certificate', - '--reset-foreman-proxy-puppetca-listen-on', - '--reset-foreman-proxy-puppetca-provider', - '--reset-foreman-proxy-puppetca-sign-all', - '--reset-foreman-proxy-puppetca-token-ttl', - '--reset-foreman-proxy-puppetca-tokens-file', - '--reset-foreman-proxy-puppetdir', - '--reset-foreman-proxy-realm', - '--reset-foreman-proxy-realm-keytab', - '--reset-foreman-proxy-realm-listen-on', - '--reset-foreman-proxy-realm-principal', - '--reset-foreman-proxy-realm-provider', - '--reset-foreman-proxy-register-in-foreman', - '--reset-foreman-proxy-registered-name', - '--reset-foreman-proxy-registered-proxy-url', - '--reset-foreman-proxy-registration', - '--reset-foreman-proxy-registration-listen-on', - '--reset-foreman-proxy-registration-url', - '--reset-foreman-proxy-ssl', - '--reset-foreman-proxy-ssl-ca', - '--reset-foreman-proxy-ssl-cert', - '--reset-foreman-proxy-ssl-disabled-ciphers', - '--reset-foreman-proxy-ssl-key', - '--reset-foreman-proxy-ssl-port', - '--reset-foreman-proxy-ssldir', - '--reset-foreman-proxy-template-url', - '--reset-foreman-proxy-templates', - '--reset-foreman-proxy-templates-listen-on', - '--reset-foreman-proxy-tftp', - '--reset-foreman-proxy-tftp-dirs', - '--reset-foreman-proxy-tftp-listen-on', - '--reset-foreman-proxy-tftp-manage-wget', - '--reset-foreman-proxy-tftp-managed', - '--reset-foreman-proxy-tftp-replace-grub2-cfg', - '--reset-foreman-proxy-tftp-root', - '--reset-foreman-proxy-tftp-servername', - '--reset-foreman-proxy-tls-disabled-versions', - '--reset-foreman-proxy-trusted-hosts', - '--reset-foreman-proxy-version', - '--reset-foreman-rails-cache-store', - '--reset-foreman-register-in-foreman', - '--reset-foreman-server-port', - '--reset-foreman-server-ssl-ca', - '--reset-foreman-server-ssl-cert', - '--reset-foreman-server-ssl-chain', - '--reset-foreman-server-ssl-crl', - '--reset-foreman-server-ssl-key', - '--reset-foreman-server-ssl-port', - '--reset-foreman-server-ssl-protocol', - '--reset-foreman-server-ssl-verify-client', - '--reset-foreman-serveraliases', - '--reset-foreman-servername', - '--reset-foreman-ssl', - '--reset-foreman-telemetry-logger-enabled', - '--reset-foreman-telemetry-logger-level', - '--reset-foreman-telemetry-prefix', - '--reset-foreman-telemetry-prometheus-enabled', - '--reset-foreman-telemetry-statsd-enabled', - '--reset-foreman-telemetry-statsd-host', - '--reset-foreman-telemetry-statsd-protocol', - '--reset-foreman-trusted-proxies', - '--reset-foreman-unattended', - '--reset-foreman-unattended-url', - '--reset-foreman-version', - '--reset-foreman-websockets-encrypt', - '--reset-foreman-websockets-ssl-cert', - '--reset-foreman-websockets-ssl-key', - '--reset-katello-candlepin-db-host', - '--reset-katello-candlepin-db-name', - '--reset-katello-candlepin-db-password', - '--reset-katello-candlepin-db-port', - '--reset-katello-candlepin-db-ssl', - '--reset-katello-candlepin-db-ssl-ca', - '--reset-katello-candlepin-db-ssl-verify', - '--reset-katello-candlepin-db-user', - '--reset-katello-candlepin-loggers', - '--reset-katello-candlepin-manage-db', - '--reset-katello-candlepin-oauth-key', - '--reset-katello-candlepin-oauth-secret', - '--reset-katello-hosts-queue-workers', - '--reset-katello-rest-client-timeout', - '--reset-puppet-additional-settings', - '--reset-puppet-agent', - '--reset-puppet-agent-additional-settings', - '--reset-puppet-agent-default-schedules', - '--reset-puppet-agent-noop', - '--reset-puppet-agent-restart-command', - '--reset-puppet-agent-server-hostname', - '--reset-puppet-agent-server-port', - '--reset-puppet-allow-any-crl-auth', - '--reset-puppet-auth-allowed', - '--reset-puppet-autosign', - '--reset-puppet-autosign-content', - '--reset-puppet-autosign-entries', - '--reset-puppet-autosign-mode', - '--reset-puppet-autosign-source', - '--reset-puppet-ca-crl-filepath', - '--reset-puppet-ca-port', - '--reset-puppet-ca-server', - '--reset-puppet-certificate-revocation', - '--reset-puppet-classfile', - '--reset-puppet-client-certname', - '--reset-puppet-client-package', - '--reset-puppet-codedir', - '--reset-puppet-cron-cmd', - '--reset-puppet-dir', - '--reset-puppet-dir-group', - '--reset-puppet-dir-owner', - '--reset-puppet-dns-alt-names', - '--reset-puppet-environment', - '--reset-puppet-group', - '--reset-puppet-hiera-config', - '--reset-puppet-http-connect-timeout', - '--reset-puppet-http-read-timeout', - '--reset-puppet-localconfig', - '--reset-puppet-logdir', - '--reset-puppet-manage-packages', - '--reset-puppet-module-repository', - '--reset-puppet-package-install-options', - '--reset-puppet-package-provider', - '--reset-puppet-package-source', - '--reset-puppet-pluginfactsource', - '--reset-puppet-pluginsource', - '--reset-puppet-postrun-command', - '--reset-puppet-prerun-command', - '--reset-puppet-puppetconf-mode', - '--reset-puppet-report', - '--reset-puppet-run-hour', - '--reset-puppet-run-minute', - '--reset-puppet-rundir', - '--reset-puppet-runinterval', - '--reset-puppet-runmode', - '--reset-puppet-server', - '--reset-puppet-server-acceptor-threads', - '--reset-puppet-server-additional-settings', - '--reset-puppet-server-admin-api-allowlist', - '--reset-puppet-server-allow-header-cert-info', - '--reset-puppet-server-ca', - '--reset-puppet-server-ca-allow-auth-extensions', - '--reset-puppet-server-ca-allow-sans', - '--reset-puppet-server-ca-auth-required', - '--reset-puppet-server-ca-client-self-delete', - '--reset-puppet-server-ca-client-allowlist', - '--reset-puppet-server-ca-crl-sync', - '--reset-puppet-server-ca-enable-infra-crl', - '--reset-puppet-server-certname', - '--reset-puppet-server-check-for-updates', - '--reset-puppet-server-cipher-suites', - '--reset-puppet-server-common-modules-path', - '--reset-puppet-server-compile-mode', - '--reset-puppet-server-connect-timeout', - '--reset-puppet-server-crl-enable', - '--reset-puppet-server-custom-trusted-oid-mapping', - '--reset-puppet-server-default-manifest', - '--reset-puppet-server-default-manifest-content', - '--reset-puppet-server-default-manifest-path', - '--reset-puppet-server-dir', - '--reset-puppet-server-environment-class-cache-enabled', - '--reset-puppet-server-environment-timeout', - '--reset-puppet-server-environment-vars', - '--reset-puppet-server-environments-group', - '--reset-puppet-server-environments-mode', - '--reset-puppet-server-environments-owner', - '--reset-puppet-server-environments-recurse', - '--reset-puppet-server-envs-dir', - '--reset-puppet-server-envs-target', - '--reset-puppet-server-external-nodes', - '--reset-puppet-server-foreman', - '--reset-puppet-server-foreman-facts', - '--reset-puppet-server-foreman-ssl-ca', - '--reset-puppet-server-foreman-ssl-cert', - '--reset-puppet-server-foreman-ssl-key', - '--reset-puppet-server-foreman-url', - '--reset-puppet-server-git-branch-map', - '--reset-puppet-server-git-repo', - '--reset-puppet-server-git-repo-group', - '--reset-puppet-server-git-repo-hook-mode', - '--reset-puppet-server-git-repo-path', - '--reset-puppet-server-git-repo-umask', - '--reset-puppet-server-git-repo-user', - '--reset-puppet-server-group', - '--reset-puppet-server-http', - '--reset-puppet-server-http-port', - '--reset-puppet-server-idle-timeout', - '--reset-puppet-server-ip', - '--reset-puppet-server-jolokia-metrics-allowlist', - '--reset-puppet-server-jruby-gem-home', - '--reset-puppet-server-jvm-cli-args', - '--reset-puppet-server-jvm-config', - '--reset-puppet-server-jvm-extra-args', - '--reset-puppet-server-jvm-java-bin', - '--reset-puppet-server-jvm-max-heap-size', - '--reset-puppet-server-jvm-min-heap-size', - '--reset-puppet-server-manage-user', - '--reset-puppet-server-max-active-instances', - '--reset-puppet-server-max-open-files', - '--reset-puppet-server-max-queued-requests', - '--reset-puppet-server-max-requests-per-instance', - '--reset-puppet-server-max-retry-delay', - '--reset-puppet-server-max-threads', - '--reset-puppet-server-metrics-allowed', - '--reset-puppet-server-metrics-graphite-enable', - '--reset-puppet-server-metrics-graphite-host', - '--reset-puppet-server-metrics-graphite-interval', - '--reset-puppet-server-metrics-graphite-port', - '--reset-puppet-server-metrics-jmx-enable', - '--reset-puppet-server-metrics-server-id', - '--reset-puppet-server-multithreaded', - '--reset-puppet-server-package', - '--reset-puppet-server-parser', - '--reset-puppet-server-port', - '--reset-puppet-server-post-hook-content', - '--reset-puppet-server-post-hook-name', - '--reset-puppet-server-puppet-basedir', - '--reset-puppet-server-puppetserver-auth-template', - '--reset-puppet-server-puppetserver-dir', - '--reset-puppet-server-puppetserver-experimental', - '--reset-puppet-server-puppetserver-logdir', - '--reset-puppet-server-puppetserver-metrics', - '--reset-puppet-server-puppetserver-profiler', - '--reset-puppet-server-puppetserver-rundir', - '--reset-puppet-server-puppetserver-telemetry', - '--reset-puppet-server-puppetserver-trusted-agents', - '--reset-puppet-server-puppetserver-trusted-certificate-extensions', - '--reset-puppet-server-puppetserver-vardir', - '--reset-puppet-server-puppetserver-version', - '--reset-puppet-server-reports', - '--reset-puppet-server-request-timeout', - '--reset-puppet-server-ruby-load-paths', - '--reset-puppet-server-selector-threads', - '--reset-puppet-server-ssl-acceptor-threads', - '--reset-puppet-server-ssl-chain-filepath', - '--reset-puppet-server-ssl-dir', - '--reset-puppet-server-ssl-dir-manage', - '--reset-puppet-server-ssl-key-manage', - '--reset-puppet-server-ssl-protocols', - '--reset-puppet-server-ssl-selector-threads', - '--reset-puppet-server-storeconfigs', - '--reset-puppet-server-strict-variables', - '--reset-puppet-server-trusted-external-command', - '--reset-puppet-server-user', - '--reset-puppet-server-version', - '--reset-puppet-server-versioned-code-content', - '--reset-puppet-server-versioned-code-id', - '--reset-puppet-server-web-idle-timeout', - '--reset-puppet-service-name', - '--reset-puppet-sharedir', - '--reset-puppet-show-diff', - '--reset-puppet-splay', - '--reset-puppet-splaylimit', - '--reset-puppet-srv-domain', - '--reset-puppet-ssldir', - '--reset-puppet-syslogfacility', - '--reset-puppet-systemd-cmd', - '--reset-puppet-systemd-randomizeddelaysec', - '--reset-puppet-systemd-unit-name', - '--reset-puppet-unavailable-runmodes', - '--reset-puppet-use-srv-records', - '--reset-puppet-usecacheonfailure', - '--reset-puppet-user', - '--reset-puppet-vardir', - '--reset-puppet-version', - '--scenario', - '--skip-checks-i-know-better', - '--skip-puppet-version-check', - '--tuning', - '--verbose-log-level', - '-S', - '-h', - '-i', - '-l', - '-n', - '-p', - '-s', - '-v', -} - -LAST_SAVED_SECTIONS = { - '= Generic:', - '= Module apache_mod_status:', - '= Module certs:', - '= Module foreman:', - '= Module foreman_cli:', - '= Module foreman_compute_ec2:', - '= Module foreman_compute_libvirt:', - '= Module foreman_compute_openstack:', - '= Module foreman_compute_ovirt:', - '= Module foreman_compute_vmware:', - '= Module foreman_plugin_remote_execution_cockpit:', - '= Module foreman_plugin_tasks:', - '= Module foreman_proxy:', - '= Module foreman_proxy_content:', - '= Module foreman_proxy_plugin_ansible:', - '= Module foreman_proxy_plugin_dhcp_infoblox:', - '= Module foreman_proxy_plugin_dhcp_remote_isc:', - '= Module foreman_proxy_plugin_discovery:', - '= Module foreman_proxy_plugin_dns_infoblox:', - '= Module foreman_proxy_plugin_openscap:', - '= Module foreman_proxy_plugin_shellhooks:', - '= Module foreman_proxy_plugin_remote_execution_script:', - '= Module katello:', - '= Module puppet:', -} - SATELLITE_SERVICES = [ 'dynflow-sidekiq@orchestrator', 'dynflow-sidekiq@worker-1', @@ -1292,6 +36,40 @@ 'tomcat', ] +UPSTREAM_SPECIFIC_MODULES = { + 'foreman::cli::discovery', + 'foreman::cli::openscap', + 'foreman::cli::rh_cloud', + 'foreman::cli::ssh', + 'foreman::cli::tasks', + 'foreman::cli::templates', + 'foreman::plugin::acd', + 'foreman::plugin::default_hostgroup', + 'foreman::plugin::dhcp_browser', + 'foreman::plugin::dlm', + 'foreman::plugin::expire_hosts', + 'foreman::plugin::git_templates', + 'foreman::plugin::hooks', + 'foreman::plugin::kernel_care', + 'foreman::plugin::monitoring', + 'foreman::plugin::netbox', + 'foreman::plugin::proxmox', + 'foreman::plugin::puppetdb', + 'foreman::plugin::rescue', + 'foreman::plugin::salt', + 'foreman::plugin::scc_manager', + 'foreman::plugin::setup', + 'foreman::plugin::snapshot_management', + 'foreman::plugin::statistics', + 'foreman::plugin::vault', + 'foreman::plugin::wreckingball', + 'foreman_proxy::plugin::acd', + 'foreman_proxy::plugin::dns::powerdns', + 'foreman_proxy::plugin::dns::route53', + 'foreman_proxy::plugin::monitoring', + 'foreman_proxy::plugin::salt', +} + def extract_help(filter='params'): """Generator function to extract satellite installer params and sections from lines @@ -1627,36 +405,29 @@ def test_positive_check_installer_hammer_ping(target_sat): assert 'ok' in line -@pytest.mark.e2e +@pytest.mark.stream @pytest.mark.upgrade @pytest.mark.tier3 -@pytest.mark.parametrize('filter', ['params', 'sections']) -def test_installer_options_and_sections(filter): - """Look for changes on installer sections and options/flags +@pytest.mark.build_sanity +def test_installer_modules_check(target_sat): + """Look for changes in installer modules :id: a51d3b9f-f347-4a96-a31a-770349db08c7 - :parametrized: yes - :steps: - 1. parse installer sections and options/flags - 2. compare with last saved data + 1. Parse installer modules for upstream and downstream - :expectedresults: Ideally sections and options should not change on zstreams. - Documentation must be updated accordingly when such changes occur. - So when this test fail we QE can act on it, asking dev if - changes occurs on zstream and checking docs are up to date. - - :CaseImportance: Medium + :expectedresults: Ensure the keys for all modules are in both files """ - current = set(extract_help(filter=filter)) - previous = PREVIOUS_INSTALLER_OPTIONS if filter == 'params' else LAST_SAVED_SECTIONS - removed = list(previous - current) - removed.sort() - added = list(current - previous) - added.sort() - msg = f"###Removed {filter}:\n{removed}\n###Added {filter}:\n{added}" - assert previous == current, msg + sat_output = target_sat.execute('cat /etc/foreman-installer/scenarios.d/satellite-answers.yaml') + upstream_output = target_sat.execute( + 'cat /etc/foreman-installer/scenarios.d/katello-answers.yaml' + ) + + sat_yaml = yaml.safe_load(sat_output.stdout) + upstream_yaml = yaml.safe_load(upstream_output.stdout) + + assert sat_yaml.keys() == (upstream_yaml.keys() - UPSTREAM_SPECIFIC_MODULES) @pytest.mark.stubbed From 2c5e9a55654e8a667a18972bd5fc2f0a4e5a5a72 Mon Sep 17 00:00:00 2001 From: Lukas Pramuk Date: Tue, 23 Apr 2024 10:00:28 +0200 Subject: [PATCH 145/150] Add coverage for clone from el8 to el9 (#14856) Add clone el8 to el9 --- tests/foreman/destructive/test_clone.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/foreman/destructive/test_clone.py b/tests/foreman/destructive/test_clone.py index 54b5f57b6e5..1ad4cd25f20 100644 --- a/tests/foreman/destructive/test_clone.py +++ b/tests/foreman/destructive/test_clone.py @@ -15,13 +15,18 @@ from robottelo import constants from robottelo.config import settings -from robottelo.hosts import Satellite +from robottelo.hosts import Satellite, get_sat_rhel_version SSH_PASS = settings.server.ssh_password pytestmark = pytest.mark.destructive @pytest.mark.e2e +@pytest.mark.parametrize( + "sat_ready_rhel", + [8, 9] if get_sat_rhel_version().major < 9 else [9], + indirect=True, +) @pytest.mark.parametrize('backup_type', ['online', 'offline']) @pytest.mark.parametrize('skip_pulp', [False, True], ids=['include_pulp', 'skip_pulp']) def test_positive_clone_backup( From e8c1ed91a000fc8bff4c55e30b4f83be52f422d1 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Tue, 23 Apr 2024 13:54:30 +0200 Subject: [PATCH 146/150] timeout parameters added to cli create methods (#14861) --- robottelo/cli/contentview.py | 4 ++-- robottelo/cli/host.py | 4 ++-- robottelo/cli/report_template.py | 4 ++-- robottelo/cli/repository.py | 4 ++-- robottelo/cli/syncplan.py | 4 ++-- robottelo/cli/template_input.py | 4 ++-- robottelo/cli/usergroup.py | 4 ++-- robottelo/cli/webhook.py | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/robottelo/cli/contentview.py b/robottelo/cli/contentview.py index fb8001f89d7..17732f37617 100644 --- a/robottelo/cli/contentview.py +++ b/robottelo/cli/contentview.py @@ -43,7 +43,7 @@ class ContentViewFilterRule(Base): command_base = 'content-view filter rule' @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """Create a content-view filter rule""" if ( not options @@ -55,7 +55,7 @@ def create(cls, options=None): ' "content-view-filter" or "content-view-filter-id".' ) cls.command_sub = 'create' - result = cls.execute(cls._construct_command(options), output_format='csv') + result = cls.execute(cls._construct_command(options), output_format='csv', timeout=timeout) # Extract new CV filter rule ID if it was successfully created if len(result) > 0 and 'id' in result[0]: diff --git a/robottelo/cli/host.py b/robottelo/cli/host.py index 05f042f9dde..dc45c9db887 100644 --- a/robottelo/cli/host.py +++ b/robottelo/cli/host.py @@ -478,10 +478,10 @@ class HostInterface(Base): command_base = 'host interface' @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """Create new network interface for host""" cls.command_sub = 'create' - cls.execute(cls._construct_command(options), output_format='csv') + cls.execute(cls._construct_command(options), output_format='csv', timeout=timeout) class HostTraces(Base): diff --git a/robottelo/cli/report_template.py b/robottelo/cli/report_template.py index 962c5929bc7..50646e3cd4b 100644 --- a/robottelo/cli/report_template.py +++ b/robottelo/cli/report_template.py @@ -36,7 +36,7 @@ class ReportTemplate(Base): command_base = 'report-template' @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """ Creates a new record using the arguments passed via dictionary. """ @@ -73,7 +73,7 @@ def create(cls, options=None): options['file'] = layout - result = cls.execute(cls._construct_command(options), output_format='csv') + result = cls.execute(cls._construct_command(options), output_format='csv', timeout=timeout) # Extract new object ID if it was successfully created if len(result) > 0 and 'id' in result[0]: diff --git a/robottelo/cli/repository.py b/robottelo/cli/repository.py index 94fa8baa180..d5ac3caf7a1 100644 --- a/robottelo/cli/repository.py +++ b/robottelo/cli/repository.py @@ -31,12 +31,12 @@ class Repository(Base): command_requires_org = True @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """Create a custom repository""" cls.command_requires_org = False try: - result = super().create(options) + result = super().create(options, timeout) finally: cls.command_requires_org = True diff --git a/robottelo/cli/syncplan.py b/robottelo/cli/syncplan.py index 151a72acb84..9894335ab05 100644 --- a/robottelo/cli/syncplan.py +++ b/robottelo/cli/syncplan.py @@ -26,11 +26,11 @@ class SyncPlan(Base): command_base = 'sync-plan' @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """Create a SyncPlan""" cls.command_sub = 'create' if options.get('interval') == 'custom cron' and options.get('cron-expression') is None: raise CLIError('Missing "cron-expression" option for "custom cron" interval.') - return super().create(options) + return super().create(options, timeout) diff --git a/robottelo/cli/template_input.py b/robottelo/cli/template_input.py index cfe548384c3..9b861dbf9a9 100644 --- a/robottelo/cli/template_input.py +++ b/robottelo/cli/template_input.py @@ -26,7 +26,7 @@ class TemplateInput(Base): command_base = 'template-input' @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """ Creates a new record using the arguments passed via dictionary. """ @@ -36,7 +36,7 @@ def create(cls, options=None): if options is None: options = {} - result = cls.execute(cls._construct_command(options), output_format='csv') + result = cls.execute(cls._construct_command(options), output_format='csv', timeout=timeout) # Extract new object ID if it was successfully created if len(result) > 0 and 'id' in result[0]: diff --git a/robottelo/cli/usergroup.py b/robottelo/cli/usergroup.py index cd40ac96bc5..f29ad3f5573 100644 --- a/robottelo/cli/usergroup.py +++ b/robottelo/cli/usergroup.py @@ -148,10 +148,10 @@ def refresh(cls, options=None): return cls.execute(cls._construct_command(options), output_format='csv') @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """Create external user group""" cls.command_sub = 'create' - result = cls.execute(cls._construct_command(options), output_format='csv') + result = cls.execute(cls._construct_command(options), output_format='csv', timeout=timeout) # External user group can only be fetched by specifying both id and # user group id it is linked to if len(result) > 0 and 'id' in result[0]: diff --git a/robottelo/cli/webhook.py b/robottelo/cli/webhook.py index c7b93f76d99..ea37b6c7779 100644 --- a/robottelo/cli/webhook.py +++ b/robottelo/cli/webhook.py @@ -22,7 +22,7 @@ class Webhook(Base): command_base = 'webhook' @classmethod - def create(cls, options=None): + def create(cls, options=None, timeout=None): """Create a webhook""" cls.command_sub = 'create' @@ -41,4 +41,4 @@ def create(cls, options=None): 'See See "hammer webhook create --help" for the list of supported methods' ) - return super().create(options) + return super().create(options, timeout) From 9de39799d311e7ae783a4a35f3ae873b626cc6ba Mon Sep 17 00:00:00 2001 From: Shubham Ganar <67952129+shubhamsg199@users.noreply.github.com> Date: Tue, 23 Apr 2024 18:02:25 +0530 Subject: [PATCH 147/150] Add proper teardown of VMware client (#14799) Proper teardown of VMwar client Signed-off-by: Shubham Ganar --- pytest_fixtures/component/provision_vmware.py | 12 ++++++++++ .../cli/test_computeresource_vmware.py | 9 ++------ .../foreman/ui/test_computeresource_vmware.py | 23 +++++++++---------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/pytest_fixtures/component/provision_vmware.py b/pytest_fixtures/component/provision_vmware.py index 385f49bae38..0fb9f84ff38 100644 --- a/pytest_fixtures/component/provision_vmware.py +++ b/pytest_fixtures/component/provision_vmware.py @@ -1,5 +1,6 @@ from fauxfactory import gen_string import pytest +from wrapanapi import VMWareSystem from robottelo.config import settings @@ -13,6 +14,17 @@ def vmware(request): return versions[getattr(request, 'param', 'vmware8')] +@pytest.fixture +def vmwareclient(vmware): + vmwareclient = VMWareSystem( + hostname=vmware.hostname, + username=settings.vmware.username, + password=settings.vmware.password, + ) + yield vmwareclient + vmwareclient.disconnect() + + @pytest.fixture(scope='module') def module_vmware_cr(module_provisioning_sat, module_sca_manifest_org, module_location, vmware): return module_provisioning_sat.sat.api.VMWareComputeResource( diff --git a/tests/foreman/cli/test_computeresource_vmware.py b/tests/foreman/cli/test_computeresource_vmware.py index b72a5fca5c5..62ee4a71505 100644 --- a/tests/foreman/cli/test_computeresource_vmware.py +++ b/tests/foreman/cli/test_computeresource_vmware.py @@ -13,7 +13,6 @@ from fauxfactory import gen_string import pytest from wait_for import wait_for -from wrapanapi import VMWareSystem from robottelo.config import settings from robottelo.constants import FOREMAN_PROVIDERS @@ -93,6 +92,7 @@ def test_positive_provision_end_to_end( module_vmware_hostgroup, provision_method, vmware, + vmwareclient, ): """Provision a host on vmware compute resource with the help of hostgroup. @@ -139,12 +139,7 @@ def test_positive_provision_end_to_end( hostname = f'{hostname}.{module_provisioning_sat.domain.name}' assert hostname == host['name'] # check if vm is created on vmware - vmware = VMWareSystem( - hostname=vmware.hostname, - username=settings.vmware.username, - password=settings.vmware.password, - ) - assert vmware.does_vm_exist(hostname) is True + assert vmwareclient.does_vm_exist(hostname) is True wait_for( lambda: sat.cli.Host.info({'name': hostname})['status']['build-status'] != 'Pending installation', diff --git a/tests/foreman/ui/test_computeresource_vmware.py b/tests/foreman/ui/test_computeresource_vmware.py index 82e9d0abaa6..4c9516e9cd6 100644 --- a/tests/foreman/ui/test_computeresource_vmware.py +++ b/tests/foreman/ui/test_computeresource_vmware.py @@ -16,7 +16,7 @@ import pytest from wait_for import TimedOutError, wait_for -from wrapanapi.systems.virtualcenter import VMWareSystem, vim +from wrapanapi.systems.virtualcenter import vim from robottelo.config import settings from robottelo.constants import ( @@ -56,20 +56,18 @@ def _get_normalized_size(size): return f'{size} {suffixes[suffix_index]}' -def _get_vmware_datastore_summary_string(data_store_name=settings.vmware.datastore, vmware=None): +@pytest.fixture +def get_vmware_datastore_summary_string(vmware, vmwareclient): """Return the datastore string summary for data_store_name For "Local-Ironforge" datastore the string looks Like: "Local-Ironforge (free: 1.66 TB, prov: 2.29 TB, total: 2.72 TB)" """ - system = VMWareSystem( - hostname=vmware.hostname, - username=settings.vmware.username, - password=settings.vmware.password, - ) data_store_summary = [ - h for h in system.get_obj_list(vim.Datastore) if h.host and h.name == data_store_name + h + for h in vmwareclient.get_obj_list(vim.Datastore) + if h.host and h.name == settings.vmware.datastore ][0].summary uncommitted = data_store_summary.uncommitted or 0 capacity = _get_normalized_size(data_store_summary.capacity) @@ -77,7 +75,7 @@ def _get_vmware_datastore_summary_string(data_store_name=settings.vmware.datasto prov = _get_normalized_size( data_store_summary.capacity + uncommitted - data_store_summary.freeSpace ) - return f'{data_store_name} (free: {free_space}, prov: {prov}, total: {capacity})' + return f'{settings.vmware.datastore} (free: {free_space}, prov: {prov}, total: {capacity})' @pytest.mark.e2e @@ -295,7 +293,9 @@ def test_positive_resource_vm_power_management(session, vmware): @pytest.mark.upgrade @pytest.mark.tier2 @pytest.mark.parametrize('vmware', ['vmware7', 'vmware8'], indirect=True) -def test_positive_vmware_custom_profile_end_to_end(session, vmware, request, target_sat): +def test_positive_vmware_custom_profile_end_to_end( + session, vmware, request, target_sat, get_vmware_datastore_summary_string +): """Perform end to end testing for VMware compute profile. :id: 24f7bb5f-2aaf-48cb-9a56-d2d0713dfe3d @@ -330,13 +330,12 @@ def test_positive_vmware_custom_profile_end_to_end(session, vmware, request, tar cdrom_drive = True disk_size = '10 GB' network = 'VLAN 1001' # hardcoding network here as this test won't be doing actual provisioning - data_store_summary_string = _get_vmware_datastore_summary_string(vmware=vmware) storage_data = { 'storage': { 'controller': VMWARE_CONSTANTS['scsicontroller'], 'disks': [ { - 'data_store': data_store_summary_string, + 'data_store': get_vmware_datastore_summary_string, 'size': disk_size, 'thin_provision': True, } From f9ba93dbad0c92e5fd58095a303915cb74ce4f99 Mon Sep 17 00:00:00 2001 From: Peter Ondrejka Date: Tue, 23 Apr 2024 16:00:49 +0200 Subject: [PATCH 148/150] make oscap tests run on rhel9 backend (#14716) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ondřej Gajdušek Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- conf/oscap.yaml.template | 6 ++++-- pytest_fixtures/component/oscap.py | 5 ++--- robottelo/constants/__init__.py | 4 +++- tests/foreman/cli/test_oscap.py | 15 ++++++++++----- tests/foreman/ui/test_oscapcontent.py | 11 ----------- 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/conf/oscap.yaml.template b/conf/oscap.yaml.template index f23ec46ffb9..add2477848e 100644 --- a/conf/oscap.yaml.template +++ b/conf/oscap.yaml.template @@ -1,4 +1,6 @@ OSCAP: - CONTENT_PATH: /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml + RHEL_MAJOR_VERSION: "@jinja {{this.server.version.rhel_version | int }}" + CONTENT_PATH: '@format /usr/share/xml/scap/ssg/content/ssg-rhel{this.oscap.rhel_major_version}-ds.xml' # see: robottelo/constants/__init__.py OSCAP_PROFILE - PROFILE: security7 + PROFILE: '@format security{this.oscap.rhel_major_version}' + CONTENT_DIR: /usr/share/xml/scap/ssg/content diff --git a/pytest_fixtures/component/oscap.py b/pytest_fixtures/component/oscap.py index 786788914f2..07dfd7a51e6 100644 --- a/pytest_fixtures/component/oscap.py +++ b/pytest_fixtures/component/oscap.py @@ -5,7 +5,7 @@ import pytest from robottelo.config import robottelo_tmp_dir, settings -from robottelo.constants import OSCAP_PROFILE, OSCAP_TAILORING_FILE, DataFile +from robottelo.constants import OSCAP_TAILORING_FILE, DataFile @pytest.fixture(scope="session") @@ -35,11 +35,10 @@ def scap_content(import_ansible_roles, module_target_sat): ) scap_id = scap_info['id'] scap_info = entities.ScapContents(id=scap_id).read() - scap_profile_id = [ profile['id'] for profile in scap_info.scap_content_profiles - if OSCAP_PROFILE[settings.oscap.profile] in profile['title'] + if module_target_sat.OSCAP['dsrhel'] in profile['title'] ][0] return { "title": title, diff --git a/robottelo/constants/__init__.py b/robottelo/constants/__init__.py index 534b750a215..b3cfbf8962f 100644 --- a/robottelo/constants/__init__.py +++ b/robottelo/constants/__init__.py @@ -1585,6 +1585,7 @@ class Colored(Box): 'rhel6_content': 'Red Hat rhel6 default content', 'rhel7_content': 'Red Hat rhel7 default content', 'rhel8_content': 'Red Hat rhel8 default content', + 'rhel9_content': 'Red Hat rhel9 default content', 'rhel_firefox': 'Red Hat firefox default content', } @@ -1592,7 +1593,8 @@ class Colored(Box): 'c2s_rhel6': 'C2S for Red Hat Enterprise Linux 6', 'dsrhel6': 'DISA STIG for Red Hat Enterprise Linux 6', 'dsrhel7': 'DISA STIG for Red Hat Enterprise Linux 7', - 'dsrhel8': '[DRAFT] DISA STIG for Red Hat Enterprise Linux 8', + 'dsrhel8': 'DISA STIG for Red Hat Enterprise Linux 8', + 'dsrhel9': 'DISA STIG for Red Hat Enterprise Linux 9', 'esp': 'Example Server Profile', 'rhccp': 'Red Hat Corporate Profile for Certified Cloud Providers (RH CCP)', 'firefox': 'Mozilla Firefox STIG', diff --git a/tests/foreman/cli/test_oscap.py b/tests/foreman/cli/test_oscap.py index c198e5fa636..588fd2371ff 100644 --- a/tests/foreman/cli/test_oscap.py +++ b/tests/foreman/cli/test_oscap.py @@ -67,8 +67,7 @@ def test_positive_list_default_content_with_admin(self, module_target_sat): :CaseImportance: Medium """ scap_contents = [content['title'] for content in module_target_sat.cli.Scapcontent.list()] - for title in OSCAP_DEFAULT_CONTENT.values(): - assert title in scap_contents + assert f'Red Hat rhel{module_target_sat.os_version.major} default content' in scap_contents @pytest.mark.tier1 def test_negative_list_default_content_with_viewer_role( @@ -295,7 +294,9 @@ def test_positive_create_scap_content_with_valid_originalfile_name( @pytest.mark.parametrize('name', **parametrized(invalid_names_list())) @pytest.mark.tier1 def test_negative_create_scap_content_with_invalid_originalfile_name( - self, name, module_target_sat + self, + name, + module_target_sat, ): """Create scap-content with invalid original file name @@ -354,7 +355,10 @@ def test_negative_create_scap_content_without_dsfile(self, title, module_target_ module_target_sat.cli_factory.scapcontent({'title': title}) @pytest.mark.tier1 - def test_positive_update_scap_content_with_newtitle(self, module_target_sat): + def test_positive_update_scap_content_with_newtitle( + self, + module_target_sat, + ): """Update scap content title :id: 2c32e94a-237d-40b9-8a3b-fca2ef26fe79 @@ -920,7 +924,8 @@ def test_positive_update_scap_policy_with_content(self, scap_content, module_tar ) assert scap_policy['scap-content-id'] == scap_content["scap_id"] scap_id, scap_profile_id = self.fetch_scap_and_profile_id( - OSCAP_DEFAULT_CONTENT['rhel_firefox'], module_target_sat + OSCAP_DEFAULT_CONTENT[f'rhel{module_target_sat.os_version.major}_content'], + module_target_sat, ) module_target_sat.cli.Scappolicy.update( {'name': name, 'scap-content-id': scap_id, 'scap-content-profile-id': scap_profile_id} diff --git a/tests/foreman/ui/test_oscapcontent.py b/tests/foreman/ui/test_oscapcontent.py index 5669fb9e854..cb580c4c857 100644 --- a/tests/foreman/ui/test_oscapcontent.py +++ b/tests/foreman/ui/test_oscapcontent.py @@ -11,24 +11,13 @@ :CaseImportance: High """ -import os import pytest -from robottelo.config import robottelo_tmp_dir, settings from robottelo.constants import DataFile from robottelo.utils.datafactory import gen_string -@pytest.fixture(scope='module') -def oscap_content_path(module_target_sat): - _, file_name = os.path.split(settings.oscap.content_path) - - local_file = robottelo_tmp_dir.joinpath(file_name) - module_target_sat.get(remote_path=settings.oscap.content_path, local_path=str(local_file)) - return local_file - - @pytest.mark.skip_if_open("BZ:2167937") @pytest.mark.skip_if_open("BZ:2133151") @pytest.mark.tier1 From b2d303cb46ee16434c02af5be6c89627eaaec95f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 23:51:42 -0400 Subject: [PATCH 149/150] Bump redis from 5.0.3 to 5.0.4 (#14867) --- requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index 5bba9c3a8ce..3b38e173691 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -1,7 +1,7 @@ # For running tests and checking code quality using these modules. flake8==7.0.0 pytest-cov==5.0.0 -redis==5.0.3 +redis==5.0.4 pre-commit==3.7.0 # For generating documentation. From a5c839a4ae611e02b21c8ab633be19cdadf39a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hellebrandt?= Date: Wed, 24 Apr 2024 17:52:00 +0200 Subject: [PATCH 150/150] Close-loop BZ2217079 (#14276) * Close-loop BZ2217079 * pre-commit fix * Revert ID change --- tests/foreman/cli/test_remoteexecution.py | 104 ++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/tests/foreman/cli/test_remoteexecution.py b/tests/foreman/cli/test_remoteexecution.py index 9e9b7631052..c5a353395b7 100644 --- a/tests/foreman/cli/test_remoteexecution.py +++ b/tests/foreman/cli/test_remoteexecution.py @@ -954,6 +954,110 @@ def test_positive_run_job_on_host_converted_to_pull_provider( ) result = module_target_sat.cli.JobInvocation.info({'id': invocation_command['id']}) + @pytest.mark.tier3 + @pytest.mark.no_containers + @pytest.mark.rhel_ver_match('[^6].*') + @pytest.mark.parametrize( + 'setting_update', + ['remote_execution_global_proxy=False'], + ids=["no_global_proxy"], + indirect=True, + ) + def test_positive_run_job_in_chosen_directory( + self, + module_org, + module_target_sat, + smart_proxy_location, + module_ak_with_cv, + module_capsule_configured_mqtt, + rhel_contenthost, + setting_update, + ): + """Run job on host registered to mqtt, check it honors run directory + + :id: d4ae37db-d3b6-41b3-bd98-48c29389e4c5 + + :expectedresults: Verify the job was successfully ran against the host registered to mqtt, in the correct directory + + :BZ: 2217079 + + :parametrized: yes + """ + client_repo = ohsnap.dogfood_repository( + settings.ohsnap, + product='client', + repo='client', + release='client', + os_release=rhel_contenthost.os_version.major, + ) + # Update module_capsule_configured_mqtt to include module_org/smart_proxy_location + module_target_sat.cli.Capsule.update( + { + 'name': module_capsule_configured_mqtt.hostname, + 'organization-ids': module_org.id, + 'location-ids': smart_proxy_location.id, + } + ) + # register host with pull provider rex + result = rhel_contenthost.register( + module_org, + smart_proxy_location, + module_ak_with_cv.name, + module_capsule_configured_mqtt, + setup_remote_execution_pull=True, + repo=client_repo.baseurl, + ignore_subman_errors=True, + force=True, + ) + + assert result.status == 0, f'Failed to register host: {result.stderr}' + # check mqtt client is running + result = rhel_contenthost.execute('systemctl status yggdrasild') + assert result.status == 0, f'Failed to start yggdrasil on client: {result.stderr}' + + # create a new directory and set in in yggdrasil + path = f'/{gen_string("alpha")}' + config_path_dir = '/etc/systemd/system/yggdrasild.service.d/' + config_path = f'{config_path_dir}/override.conf' + assert ( + rhel_contenthost.execute( + f'mkdir {path} && mount -t tmpfs tmpfs {path} && mkdir {config_path_dir} && echo -e "[Service]\nEnvironment=FOREMAN_YGG_WORKER_WORKDIR={path}" > {config_path} && systemctl daemon-reload && systemctl restart yggdrasild' + ).status + == 0 + ) + + # run rex command in the created directory + invocation_command = module_target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Script Default', + 'inputs': 'command=printenv', + 'search-query': f"name ~ {rhel_contenthost.hostname}", + } + ) + assert_job_invocation_result( + module_target_sat, invocation_command['id'], rhel_contenthost.hostname + ) + assert ( + f'FOREMAN_YGG_WORKER_WORKDIR={path}' + in module_target_sat.cli.JobInvocation.get_output( + {'id': invocation_command['id'], 'host': rhel_contenthost.hostname} + ) + ) + + # remount the directory as noexec + rhel_contenthost.execute(f'mount -o remount,noexec {path}') + + # run rex command in the created directory again; + # it should fail; if it does not, it is probably not being run in that directory + with pytest.raises(CLIFactoryError): + invocation_command = module_target_sat.cli_factory.job_invocation( + { + 'job-template': 'Run Command - Script Default', + 'inputs': 'command=printenv', + 'search-query': f"name ~ {rhel_contenthost.hostname}", + } + ) + @pytest.mark.tier3 @pytest.mark.upgrade @pytest.mark.e2e

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