katello 4.11.1 → 4.12.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of katello might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/assets/javascripts/katello/common/katello.global.js +1 -1
- data/app/assets/javascripts/katello/locale/bn/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/bn_IN/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/ca/katello.js +80 -86
- data/app/assets/javascripts/katello/locale/cs/katello.js +79 -85
- data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +91 -88
- data/app/assets/javascripts/katello/locale/de/katello.js +97 -94
- data/app/assets/javascripts/katello/locale/de_AT/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/de_DE/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/el/katello.js +86 -86
- data/app/assets/javascripts/katello/locale/en/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/en_GB/katello.js +88 -85
- data/app/assets/javascripts/katello/locale/en_US/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/es/katello.js +94 -94
- data/app/assets/javascripts/katello/locale/et_EE/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/fr/katello.js +97 -94
- data/app/assets/javascripts/katello/locale/gl/katello.js +80 -86
- data/app/assets/javascripts/katello/locale/gu/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/he_IL/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/hi/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/id/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/it/katello.js +89 -86
- data/app/assets/javascripts/katello/locale/ja/katello.js +97 -94
- data/app/assets/javascripts/katello/locale/ka/katello.js +92 -92
- data/app/assets/javascripts/katello/locale/kn/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/ko/katello.js +91 -94
- data/app/assets/javascripts/katello/locale/locale/katello.js +1051 -1048
- data/app/assets/javascripts/katello/locale/ml_IN/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/mr/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/nl_NL/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/or/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/pa/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/pl/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/pl_PL/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/pt/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/pt_BR/katello.js +94 -94
- data/app/assets/javascripts/katello/locale/ro/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/ro_RO/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/ru/katello.js +91 -94
- data/app/assets/javascripts/katello/locale/sl/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/sv_SE/katello.js +80 -86
- data/app/assets/javascripts/katello/locale/ta/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/ta_IN/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/te/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/tr/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/vi/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/vi_VN/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/zh/katello.js +76 -85
- data/app/assets/javascripts/katello/locale/zh_CN/katello.js +97 -94
- data/app/assets/javascripts/katello/locale/zh_TW/katello.js +91 -94
- data/app/assets/javascripts/katello/sync_management/index.js +0 -1
- data/app/assets/javascripts/katello/sync_management/sync_management.js +365 -308
- data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -0
- data/app/controllers/katello/api/v2/debs_controller.rb +4 -0
- data/app/controllers/katello/api/v2/host_debs_controller.rb +13 -1
- data/app/controllers/katello/api/v2/organizations_controller.rb +1 -3
- data/app/controllers/katello/api/v2/repositories_controller.rb +2 -8
- data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +0 -1
- data/app/controllers/katello/concerns/hosts_controller_extensions.rb +7 -3
- data/app/controllers/katello/concerns/organizations_controller_extensions.rb +1 -17
- data/app/helpers/katello/concerns/dashboard_helper_extensions.rb +0 -20
- data/app/lib/actions/katello/content_view/publish.rb +3 -3
- data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
- data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +5 -5
- data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +5 -5
- data/app/lib/actions/katello/content_view_version/import.rb +14 -13
- data/app/lib/actions/katello/content_view_version/import_library.rb +4 -4
- data/app/lib/actions/katello/content_view_version/import_repository.rb +3 -3
- data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
- data/app/lib/actions/katello/host/hypervisors_update.rb +0 -1
- data/app/lib/actions/katello/organization/manifest_delete.rb +1 -1
- data/app/lib/actions/katello/organization/manifest_refresh.rb +16 -16
- data/app/lib/actions/katello/repository/sync.rb +2 -4
- data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +20 -15
- data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +17 -14
- data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +11 -11
- data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +18 -13
- data/app/lib/actions/pulp3/repository/import_upload.rb +13 -5
- data/app/lib/actions/pulp3/repository/save_artifact.rb +23 -12
- data/app/lib/katello/api/v2/error_handling.rb +1 -1
- data/app/lib/katello/lazy_accessor.rb +6 -6
- data/app/lib/katello/resources/candlepin/owner.rb +2 -2
- data/app/mailers/katello/errata_mailer.rb +3 -3
- data/app/models/katello/concerns/host_managed_extensions.rb +29 -76
- data/app/models/katello/concerns/hostgroup_extensions.rb +4 -2
- data/app/models/katello/concerns/organization_extensions.rb +1 -1
- data/app/models/katello/concerns/pulp_database_unit.rb +1 -1
- data/app/models/katello/concerns/subscription_facet_host_extensions.rb +0 -27
- data/app/models/katello/content_view.rb +11 -6
- data/app/models/katello/content_view_version.rb +2 -0
- data/app/models/katello/deb.rb +8 -0
- data/app/models/katello/host/content_facet.rb +19 -14
- data/app/models/katello/host/subscription_facet.rb +0 -19
- data/app/models/katello/host_tracer.rb +9 -5
- data/app/models/katello/installed_deb.rb +1 -0
- data/app/models/katello/repository.rb +3 -2
- data/app/models/katello/trace_status.rb +6 -2
- data/app/overrides/add_organization_attributes.rb +0 -18
- data/app/presenters/katello/host_deb_presenter.rb +23 -0
- data/app/services/katello/candlepin/consumer.rb +0 -4
- data/app/services/katello/candlepin/event_handler.rb +6 -25
- data/app/services/katello/candlepin/message_handler.rb +1 -21
- data/app/services/katello/host/profiles_uploader.rb +17 -6
- data/app/services/katello/host_status_manager.rb +0 -22
- data/app/services/katello/organization_creator.rb +2 -2
- data/app/services/katello/pulp3/api/apt.rb +1 -1
- data/app/services/katello/pulp3/content_view_version/export.rb +2 -2
- data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -0
- data/app/services/katello/pulp3/content_view_version/metadata_map.rb +3 -0
- data/app/services/katello/pulp3/repository/apt.rb +16 -6
- data/app/services/katello/registration_manager.rb +1 -13
- data/app/views/katello/api/v2/host_debs/base.json.rabl +2 -0
- data/app/views/katello/api/v2/hosts/base.json.rabl +9 -0
- data/app/views/katello/api/v2/subscription_facet/base_with_root.json.rabl +0 -3
- data/app/views/katello/api/v2/subscription_facet/show.json.rabl +3 -0
- data/app/views/katello/sync_management/index.html.erb +14 -13
- data/app/views/overrides/activation_keys/_host_environment_select.html.erb +20 -16
- data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +6 -4
- data/app/views/overrides/organizations/_edit_override.html.erb +0 -12
- data/db/migrate/20131014225132_add_users_fields.rb +0 -1
- data/db/migrate/20150603045418_remove_user_fields.rb +0 -2
- data/db/migrate/20160404132250_remove_katello_from_notification_name.rb +4 -22
- data/db/migrate/20160505181337_rename_katello_settings.rb +2 -2
- data/db/migrate/20200818192230_update_system_purpose_status.rb +9 -3
- data/db/migrate/20240111032511_add_index_to_host_installed_packages.rb +16 -0
- data/db/migrate/20240123120109_remove_pulp_export_destination_setting.rb +9 -0
- data/db/migrate/20240207191223_remove_entitlement_mode_host_statuses.rb +30 -0
- data/db/seeds.d/111-upgrade_tasks.rb +2 -1
- data/engines/bastion/app/assets/javascripts/bastion/bastion.js +0 -2
- data/engines/bastion/app/views/bastion/layouts/assets.html.erb +6 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-associations-content-hosts.html +0 -4
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +0 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion-katello-bootstrap.js +45 -29
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts-helper.service.js +0 -10
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +0 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -21
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-subscriptions.html +0 -5
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +0 -7
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +5 -5
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +9 -1
- data/engines/bastion_katello/lib/bastion_katello/engine.rb +0 -6
- data/lib/katello/engine.rb +0 -3
- data/lib/katello/plugin.rb +2 -11
- data/lib/katello/tasks/rubocop.rake +0 -9
- data/lib/katello/tasks/unify_hosts.rake +0 -1
- data/lib/katello/tasks/upgrades/4.12/update_content_access_modes.rake +35 -0
- data/lib/katello/version.rb +1 -1
- data/locale/action_names.rb +12 -6
- data/locale/bn/katello.po +19 -28
- data/locale/bn/katello.po.time_stamp +0 -0
- data/locale/bn/katello.pox +0 -0
- data/locale/bn_IN/katello.po +19 -28
- data/locale/bn_IN/katello.po.time_stamp +0 -0
- data/locale/ca/LC_MESSAGES/katello.mo +0 -0
- data/locale/ca/katello.po +20 -29
- data/locale/ca/katello.po.time_stamp +0 -0
- data/locale/cs/katello.po +19 -29
- data/locale/cs/katello.po.time_stamp +0 -0
- data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
- data/locale/cs_CZ/katello.po +20 -29
- data/locale/cs_CZ/katello.po.time_stamp +0 -0
- data/locale/de/LC_MESSAGES/katello.mo +0 -0
- data/locale/de/katello.po +20 -29
- data/locale/de/katello.po.time_stamp +0 -0
- data/locale/de_AT/katello.po +19 -28
- data/locale/de_AT/katello.po.time_stamp +0 -0
- data/locale/de_DE/katello.po +19 -28
- data/locale/de_DE/katello.po.time_stamp +0 -0
- data/locale/el/LC_MESSAGES/katello.mo +0 -0
- data/locale/el/katello.po +20 -29
- data/locale/el/katello.po.time_stamp +0 -0
- data/locale/en/katello.po +19 -28
- data/locale/en/katello.po.time_stamp +0 -0
- data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
- data/locale/en_GB/katello.po +19 -28
- data/locale/en_GB/katello.po.time_stamp +0 -0
- data/locale/en_US/katello.po +19 -28
- data/locale/en_US/katello.po.time_stamp +0 -0
- data/locale/es/LC_MESSAGES/katello.mo +0 -0
- data/locale/es/katello.po +20 -29
- data/locale/es/katello.po.time_stamp +0 -0
- data/locale/et_EE/katello.po +19 -28
- data/locale/et_EE/katello.po.time_stamp +0 -0
- data/locale/fr/LC_MESSAGES/katello.mo +0 -0
- data/locale/fr/katello.po +20 -29
- data/locale/fr/katello.po.time_stamp +0 -0
- data/locale/gl/LC_MESSAGES/katello.mo +0 -0
- data/locale/gl/katello.po +20 -29
- data/locale/gl/katello.po.time_stamp +0 -0
- data/locale/gu/katello.po +19 -28
- data/locale/gu/katello.po.time_stamp +0 -0
- data/locale/he_IL/katello.po +19 -28
- data/locale/he_IL/katello.po.time_stamp +0 -0
- data/locale/hi/katello.po +19 -28
- data/locale/hi/katello.po.time_stamp +0 -0
- data/locale/id/katello.po +19 -28
- data/locale/id/katello.po.time_stamp +0 -0
- data/locale/it/LC_MESSAGES/katello.mo +0 -0
- data/locale/it/katello.po +20 -29
- data/locale/it/katello.po.time_stamp +0 -0
- data/locale/ja/LC_MESSAGES/katello.mo +0 -0
- data/locale/ja/katello.po +20 -29
- data/locale/ja/katello.po.time_stamp +0 -0
- data/locale/ka/LC_MESSAGES/katello.mo +0 -0
- data/locale/ka/katello.po +20 -29
- data/locale/ka/katello.po.time_stamp +0 -0
- data/locale/katello.pot +363 -348
- data/locale/kn/katello.po +19 -28
- data/locale/kn/katello.po.time_stamp +0 -0
- data/locale/ko/LC_MESSAGES/katello.mo +0 -0
- data/locale/ko/katello.po +20 -29
- data/locale/ko/katello.po.time_stamp +0 -0
- data/locale/messages.mo +0 -0
- data/locale/ml_IN/katello.po +19 -28
- data/locale/ml_IN/katello.po.time_stamp +0 -0
- data/locale/mr/katello.po +19 -28
- data/locale/mr/katello.po.time_stamp +0 -0
- data/locale/nl_NL/katello.po +19 -28
- data/locale/nl_NL/katello.po.time_stamp +0 -0
- data/locale/or/katello.po +19 -28
- data/locale/or/katello.po.time_stamp +0 -0
- data/locale/pa/katello.po +19 -28
- data/locale/pa/katello.po.time_stamp +0 -0
- data/locale/pl/katello.po +19 -28
- data/locale/pl/katello.po.time_stamp +0 -0
- data/locale/pl_PL/katello.po +19 -28
- data/locale/pl_PL/katello.po.time_stamp +0 -0
- data/locale/pt/katello.po +19 -28
- data/locale/pt/katello.po.time_stamp +0 -0
- data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
- data/locale/pt_BR/katello.po +20 -29
- data/locale/pt_BR/katello.po.time_stamp +0 -0
- data/locale/ro/katello.po +19 -28
- data/locale/ro/katello.po.time_stamp +0 -0
- data/locale/ro_RO/katello.po +19 -28
- data/locale/ro_RO/katello.po.time_stamp +0 -0
- data/locale/ru/LC_MESSAGES/katello.mo +0 -0
- data/locale/ru/katello.po +20 -29
- data/locale/ru/katello.po.time_stamp +0 -0
- data/locale/sl/katello.po +19 -28
- data/locale/sl/katello.po.time_stamp +0 -0
- data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
- data/locale/sv_SE/katello.po +20 -29
- data/locale/sv_SE/katello.po.time_stamp +0 -0
- data/locale/ta/katello.po +19 -28
- data/locale/ta/katello.po.time_stamp +0 -0
- data/locale/ta_IN/katello.po +19 -28
- data/locale/ta_IN/katello.po.time_stamp +0 -0
- data/locale/te/katello.po +19 -28
- data/locale/te/katello.po.time_stamp +0 -0
- data/locale/tr/katello.po +19 -28
- data/locale/tr/katello.po.time_stamp +0 -0
- data/locale/vi/katello.po +19 -28
- data/locale/vi/katello.po.time_stamp +0 -0
- data/locale/vi_VN/katello.po +19 -28
- data/locale/vi_VN/katello.po.time_stamp +0 -0
- data/locale/zh/katello.po +19 -28
- data/locale/zh/katello.po.time_stamp +0 -0
- data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
- data/locale/zh_CN/katello.po +20 -29
- data/locale/zh_CN/katello.po.time_stamp +0 -0
- data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
- data/locale/zh_TW/katello.po +20 -29
- data/locale/zh_TW/katello.po.time_stamp +0 -0
- data/package.json +0 -1
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +4 -1
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.js +250 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.scss +3 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebsTab.js +585 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebsTab.scss +12 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/HostDebsActions.js +13 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/HostDebsConstants.js +13 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/HostDebsSelectors.js +16 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/InstallableDebsActions.js +17 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/InstallableDebsConstants.js +3 -0
- data/webpack/components/extensions/HostDetails/Tabs/DebsTab/InstallableDebsSelectors.js +16 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +1 -8
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +2 -0
- data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +4 -18
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +13 -5
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/debs.fixtures.json +31 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/debsInstallModal.test.js +226 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/debsTab.test.js +420 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/installableDebs.fixtures.json +63 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/traces.fixtures.json +11 -1
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +63 -3
- data/webpack/scenes/ContentViews/ContentViewsConstants.js +3 -0
- data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +0 -13
- data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +23 -1
- data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +19 -1
- data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +0 -13
- data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +37 -3
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +10 -2
- data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +0 -13
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -5
- data/webpack/scenes/Organizations/OrganizationSelectors.js +0 -3
- data/webpack/scenes/Subscriptions/Manifest/index.js +1 -4
- data/webpack/scenes/Subscriptions/SubscriptionsPage.js +3 -25
- data/webpack/scenes/Subscriptions/SubscriptionsSelectors.js +0 -3
- data/webpack/scenes/Subscriptions/__tests__/SubscriptionsSelectors.test.js +0 -3
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +0 -22
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsSelectors.test.js.snap +0 -3
- data/webpack/scenes/Subscriptions/index.js +1 -2
- metadata +93 -190
- data/app/controllers/katello/concerns/content_facet_hosts_controller_extensions.rb +0 -22
- data/app/models/katello/concerns/widget_extensions.rb +0 -23
- data/app/models/katello/purpose_addons_status.rb +0 -28
- data/app/models/katello/purpose_role_status.rb +0 -28
- data/app/models/katello/purpose_sla_status.rb +0 -28
- data/app/models/katello/purpose_status.rb +0 -71
- data/app/models/katello/purpose_usage_status.rb +0 -28
- data/app/models/katello/subscription_status.rb +0 -71
- data/app/services/katello/candlepin/system_purpose.rb +0 -49
- data/app/views/dashboard/_subscription_status_widget.html.erb +0 -37
- data/app/views/dashboard/_subscription_widget.html.erb +0 -85
- data/app/views/overrides/organizations/_index_header_override.html.erb +0 -3
- data/app/views/overrides/organizations/_index_row_override.html.erb +0 -3
- data/app/views/overrides/organizations/_step_1_override.html.erb +0 -10
- data/config/locales/README +0 -10
- data/config/locales/bn.yml +0 -182
- data/config/locales/compare_upstream.sh +0 -21
- data/config/locales/cs.yml +0 -211
- data/config/locales/de.yml +0 -203
- data/config/locales/en.yml +0 -205
- data/config/locales/es.yml +0 -199
- data/config/locales/fr.yml +0 -222
- data/config/locales/gu.yml +0 -181
- data/config/locales/hi.yml +0 -199
- data/config/locales/it.yml +0 -205
- data/config/locales/ja.yml +0 -197
- data/config/locales/kn.yml +0 -199
- data/config/locales/ko.yml +0 -197
- data/config/locales/mr.yml +0 -178
- data/config/locales/or.yml +0 -181
- data/config/locales/pa.yml +0 -181
- data/config/locales/pt-BR.yml +0 -207
- data/config/locales/pt.yml +0 -207
- data/config/locales/ru.yml +0 -257
- data/config/locales/ta.yml +0 -181
- data/config/locales/te.yml +0 -181
- data/config/locales/update.sh +0 -14
- data/config/locales/zh-CN.yml +0 -199
- data/config/locales/zh-TW.yml +0 -199
- data/engines/bastion/app/assets/javascripts/bastion/bastion-bootstrap.js +0 -17
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/content-access-mode-banner.directive.js +0 -22
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +0 -10
- data/webpack/scenes/Subscriptions/Manifest/SimpleContentAccess.js +0 -96
@@ -0,0 +1,420 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
|
3
|
+
import * as hooks from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks';
|
4
|
+
import { nockInstance, assertNockRequest, mockForemanAutocomplete } from '../../../../../test-utils/nockWrapper';
|
5
|
+
import { foremanApi } from '../../../../../services/api';
|
6
|
+
import { HOST_DEBS_KEY, PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from '../DebsTab/HostDebsConstants';
|
7
|
+
import { DebsTab } from '../DebsTab/DebsTab.js';
|
8
|
+
import mockDebsData from './debs.fixtures.json';
|
9
|
+
import { REX_FEATURES } from '../RemoteExecutionConstants';
|
10
|
+
|
11
|
+
jest.mock('../../hostDetailsHelpers', () => ({
|
12
|
+
...jest.requireActual('../../hostDetailsHelpers'),
|
13
|
+
userPermissionsFromHostDetails: () => ({
|
14
|
+
create_job_invocations: true,
|
15
|
+
edit_hosts: true,
|
16
|
+
}),
|
17
|
+
}));
|
18
|
+
|
19
|
+
const contentFacetAttributes = {
|
20
|
+
id: 11,
|
21
|
+
uuid: 'e5761ea3-4117-4ecf-83d0-b694f99b389e',
|
22
|
+
content_view_default: false,
|
23
|
+
lifecycle_environment_library: false,
|
24
|
+
};
|
25
|
+
|
26
|
+
const hostname = 'test-host.example.com';
|
27
|
+
const renderOptions = (facetAttributes = contentFacetAttributes) => ({
|
28
|
+
apiNamespace: HOST_DEBS_KEY,
|
29
|
+
initialState: {
|
30
|
+
API: {
|
31
|
+
HOST_DETAILS: {
|
32
|
+
response: {
|
33
|
+
id: 1,
|
34
|
+
name: hostname,
|
35
|
+
content_facet_attributes: { ...facetAttributes },
|
36
|
+
},
|
37
|
+
status: 'RESOLVED',
|
38
|
+
},
|
39
|
+
},
|
40
|
+
},
|
41
|
+
});
|
42
|
+
|
43
|
+
const hostDebs = foremanApi.getApiUrl('/hosts/1/debs');
|
44
|
+
const jobInvocations = foremanApi.getApiUrl('/job_invocations');
|
45
|
+
const autocompleteUrl = '/hosts/1/debs/auto_complete_search';
|
46
|
+
|
47
|
+
const defaultQueryWithoutSearch = {
|
48
|
+
include_latest_upgradable: true,
|
49
|
+
sort_by: 'name',
|
50
|
+
sort_order: 'asc',
|
51
|
+
per_page: 20,
|
52
|
+
page: 1,
|
53
|
+
};
|
54
|
+
const defaultQuery = { ...defaultQueryWithoutSearch, search: '' };
|
55
|
+
|
56
|
+
let firstDeb;
|
57
|
+
let secondDeb;
|
58
|
+
|
59
|
+
beforeEach(() => {
|
60
|
+
const { results } = mockDebsData;
|
61
|
+
[firstDeb, secondDeb] = results;
|
62
|
+
});
|
63
|
+
|
64
|
+
test('Can call API for packages and show on screen on page load', async (done) => {
|
65
|
+
// Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
|
66
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
67
|
+
const scope = nockInstance
|
68
|
+
.get(hostDebs)
|
69
|
+
.query(defaultQuery)
|
70
|
+
.reply(200, mockDebsData);
|
71
|
+
|
72
|
+
const { getAllByText } = renderWithRedux(<DebsTab />, renderOptions());
|
73
|
+
|
74
|
+
// Assert that the packages are now showing on the screen, but wait for them to appear.
|
75
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
76
|
+
// Assert request was made and completed, see helper function
|
77
|
+
assertNockRequest(autocompleteScope);
|
78
|
+
assertNockRequest(scope, done); // Pass jest callback to confirm test is done
|
79
|
+
});
|
80
|
+
|
81
|
+
test('Can handle no packages being present', async (done) => {
|
82
|
+
// Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
|
83
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
84
|
+
|
85
|
+
const noResults = {
|
86
|
+
total: 0,
|
87
|
+
subtotal: 0,
|
88
|
+
page: 1,
|
89
|
+
per_page: 20,
|
90
|
+
results: [],
|
91
|
+
};
|
92
|
+
|
93
|
+
const scope = nockInstance
|
94
|
+
.get(hostDebs)
|
95
|
+
.query(defaultQuery)
|
96
|
+
.reply(200, noResults);
|
97
|
+
|
98
|
+
const { queryByText } = renderWithRedux(<DebsTab />, renderOptions());
|
99
|
+
|
100
|
+
// Assert that there are not any packages showing on the screen.
|
101
|
+
await patientlyWaitFor(() => expect(queryByText('This host does not have any packages.')).toBeInTheDocument());
|
102
|
+
// Assert request was made and completed, see helper function
|
103
|
+
assertNockRequest(autocompleteScope);
|
104
|
+
assertNockRequest(scope, done); // Pass jest callback to confirm test is done
|
105
|
+
});
|
106
|
+
|
107
|
+
test('Can filter by package status', async (done) => {
|
108
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
109
|
+
const scope = nockInstance
|
110
|
+
.get(hostDebs)
|
111
|
+
.query(defaultQuery)
|
112
|
+
.reply(200, mockDebsData);
|
113
|
+
|
114
|
+
const scope2 = nockInstance
|
115
|
+
.get(hostDebs)
|
116
|
+
.query({ ...defaultQuery, status: 'upgradable' })
|
117
|
+
.reply(200, { ...mockDebsData, results: [firstDeb, secondDeb] });
|
118
|
+
|
119
|
+
const {
|
120
|
+
queryByText,
|
121
|
+
getByRole,
|
122
|
+
getAllByText,
|
123
|
+
getByText,
|
124
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
125
|
+
|
126
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
127
|
+
// the Upgradable text in the table is just a text node, while the dropdown is a button
|
128
|
+
expect(getByText('Up-to date', { ignore: ['button', 'title'] })).toBeInTheDocument();
|
129
|
+
expect(getByText('libapt-pkg6.0', { ignore: ['button', 'title'] })).toBeInTheDocument();
|
130
|
+
expect(getByText('libmagic1', { ignore: ['button', 'title'] })).toBeInTheDocument();
|
131
|
+
expect(getByText('libacl1', { ignore: ['button', 'title'] })).toBeInTheDocument();
|
132
|
+
|
133
|
+
const statusDropdown = queryByText('Status', { ignore: 'th' });
|
134
|
+
expect(statusDropdown).toBeInTheDocument();
|
135
|
+
fireEvent.click(statusDropdown);
|
136
|
+
const upgradable = getByRole('option', { name: 'select Upgradable' });
|
137
|
+
fireEvent.click(upgradable);
|
138
|
+
await patientlyWaitFor(() => {
|
139
|
+
expect(queryByText('libmagic1')).toBeInTheDocument();
|
140
|
+
expect(queryByText('libapt-pkg6.0')).toBeInTheDocument();
|
141
|
+
expect(queryByText('libacl1')).not.toBeInTheDocument();
|
142
|
+
});
|
143
|
+
|
144
|
+
assertNockRequest(autocompleteScope);
|
145
|
+
assertNockRequest(scope);
|
146
|
+
assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
|
147
|
+
});
|
148
|
+
|
149
|
+
test('Can upgrade a package via remote execution', async (done) => {
|
150
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
151
|
+
|
152
|
+
const scope = nockInstance
|
153
|
+
.get(hostDebs)
|
154
|
+
.query(defaultQuery)
|
155
|
+
.reply(200, mockDebsData);
|
156
|
+
|
157
|
+
const statusScope = nockInstance
|
158
|
+
.get(hostDebs)
|
159
|
+
.query({ ...defaultQuery, status: 'upgradable' })
|
160
|
+
.reply(200, { ...mockDebsData, results: [firstDeb, secondDeb] });
|
161
|
+
|
162
|
+
const upgradeScope = nockInstance
|
163
|
+
.post(jobInvocations, {
|
164
|
+
job_invocation: {
|
165
|
+
inputs: {
|
166
|
+
package: firstDeb.name,
|
167
|
+
},
|
168
|
+
search_query: `name ^ (${hostname})`,
|
169
|
+
feature: REX_FEATURES.KATELLO_PACKAGE_UPDATE,
|
170
|
+
},
|
171
|
+
})
|
172
|
+
.reply(201);
|
173
|
+
|
174
|
+
const {
|
175
|
+
getByRole,
|
176
|
+
getAllByText,
|
177
|
+
getAllByLabelText,
|
178
|
+
getByText,
|
179
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
180
|
+
|
181
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
182
|
+
|
183
|
+
const statusDropdown = getByText('Status', { ignore: 'th' });
|
184
|
+
expect(statusDropdown).toBeInTheDocument();
|
185
|
+
fireEvent.click(statusDropdown);
|
186
|
+
const upgradable = getByRole('option', { name: 'select Upgradable' });
|
187
|
+
fireEvent.click(upgradable);
|
188
|
+
await patientlyWaitFor(() => {
|
189
|
+
expect(getByText('libmagic1')).toBeInTheDocument();
|
190
|
+
expect(getByText('libapt-pkg6.0')).toBeInTheDocument();
|
191
|
+
});
|
192
|
+
|
193
|
+
const kebabDropdown = getAllByLabelText('Actions');
|
194
|
+
kebabDropdown[0].click();
|
195
|
+
|
196
|
+
const rexAction = getByText('Upgrade via remote execution');
|
197
|
+
await patientlyWaitFor(() => expect(rexAction).toBeInTheDocument());
|
198
|
+
fireEvent.click(rexAction);
|
199
|
+
|
200
|
+
assertNockRequest(autocompleteScope);
|
201
|
+
assertNockRequest(scope);
|
202
|
+
assertNockRequest(statusScope);
|
203
|
+
assertNockRequest(upgradeScope, done);
|
204
|
+
});
|
205
|
+
|
206
|
+
test('Can upgrade a package via customized remote execution', async (done) => {
|
207
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
208
|
+
|
209
|
+
const scope = nockInstance
|
210
|
+
.get(hostDebs)
|
211
|
+
.query(defaultQuery)
|
212
|
+
.reply(200, mockDebsData);
|
213
|
+
|
214
|
+
const statusScope = nockInstance
|
215
|
+
.get(hostDebs)
|
216
|
+
.query({ ...defaultQuery, status: 'upgradable' })
|
217
|
+
.reply(200, { ...mockDebsData, results: [firstDeb, secondDeb] });
|
218
|
+
|
219
|
+
const {
|
220
|
+
getByRole,
|
221
|
+
getAllByText,
|
222
|
+
getAllByLabelText,
|
223
|
+
getByText,
|
224
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
225
|
+
|
226
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
227
|
+
|
228
|
+
const statusDropdown = getByText('Status', { ignore: 'th' });
|
229
|
+
expect(statusDropdown).toBeInTheDocument();
|
230
|
+
fireEvent.click(statusDropdown);
|
231
|
+
const upgradable = getByRole('option', { name: 'select Upgradable' });
|
232
|
+
fireEvent.click(upgradable);
|
233
|
+
await patientlyWaitFor(() => {
|
234
|
+
expect(getByText('libapt-pkg6.0')).toBeInTheDocument();
|
235
|
+
expect(getByText('libmagic1')).toBeInTheDocument();
|
236
|
+
});
|
237
|
+
|
238
|
+
const kebabDropdown = getAllByLabelText('Actions');
|
239
|
+
kebabDropdown[0].click();
|
240
|
+
|
241
|
+
const rexAction = getByText('Upgrade via customized remote execution');
|
242
|
+
const feature = REX_FEATURES.KATELLO_PACKAGE_UPDATE;
|
243
|
+
const packageName = firstDeb.name;
|
244
|
+
|
245
|
+
expect(rexAction).toBeInTheDocument();
|
246
|
+
expect(rexAction).toHaveAttribute(
|
247
|
+
'href',
|
248
|
+
`/job_invocations/new?feature=${feature}&search=name%20%5E%20(${hostname})&inputs%5Bpackage%5D=${packageName}`,
|
249
|
+
);
|
250
|
+
|
251
|
+
fireEvent.click(rexAction);
|
252
|
+
|
253
|
+
assertNockRequest(autocompleteScope);
|
254
|
+
assertNockRequest(scope);
|
255
|
+
assertNockRequest(statusScope, done);
|
256
|
+
});
|
257
|
+
|
258
|
+
test('Can bulk upgrade via remote execution', async (done) => {
|
259
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
260
|
+
|
261
|
+
const scope = nockInstance
|
262
|
+
.get(hostDebs)
|
263
|
+
.query(defaultQuery)
|
264
|
+
.reply(200, mockDebsData);
|
265
|
+
|
266
|
+
const upgradeScope = nockInstance
|
267
|
+
.post(jobInvocations, {
|
268
|
+
job_invocation: {
|
269
|
+
inputs: {
|
270
|
+
[PACKAGES_SEARCH_QUERY]: `id ^ (${firstDeb.id},${secondDeb.id})`,
|
271
|
+
[SELECTED_UPDATE_VERSIONS]: JSON.stringify([]),
|
272
|
+
},
|
273
|
+
search_query: `name ^ (${hostname})`,
|
274
|
+
feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
|
275
|
+
},
|
276
|
+
})
|
277
|
+
.reply(201);
|
278
|
+
|
279
|
+
const {
|
280
|
+
getAllByRole,
|
281
|
+
getAllByText,
|
282
|
+
getByRole,
|
283
|
+
getByLabelText,
|
284
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
285
|
+
|
286
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
287
|
+
|
288
|
+
getByRole('checkbox', { name: 'Select row 0' }).click();
|
289
|
+
expect(getByLabelText('Select row 0').checked).toEqual(true);
|
290
|
+
getByRole('checkbox', { name: 'Select row 1' }).click();
|
291
|
+
expect(getByLabelText('Select row 1').checked).toEqual(true);
|
292
|
+
|
293
|
+
const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
|
294
|
+
fireEvent.click(upgradeDropdown);
|
295
|
+
|
296
|
+
const rexAction = getByLabelText('bulk_upgrade_rex');
|
297
|
+
expect(rexAction).toBeInTheDocument();
|
298
|
+
fireEvent.click(rexAction);
|
299
|
+
|
300
|
+
assertNockRequest(autocompleteScope);
|
301
|
+
assertNockRequest(scope);
|
302
|
+
assertNockRequest(upgradeScope, done);
|
303
|
+
});
|
304
|
+
|
305
|
+
test('Can bulk upgrade via customized remote execution', async (done) => {
|
306
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
307
|
+
|
308
|
+
const scope = nockInstance
|
309
|
+
.get(hostDebs)
|
310
|
+
.query(defaultQuery)
|
311
|
+
.reply(200, mockDebsData);
|
312
|
+
|
313
|
+
const {
|
314
|
+
getAllByRole,
|
315
|
+
getAllByText,
|
316
|
+
getByRole,
|
317
|
+
getByLabelText,
|
318
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
319
|
+
|
320
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
321
|
+
|
322
|
+
const feature = REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH;
|
323
|
+
const packages = `${firstDeb.id},${secondDeb.id}`;
|
324
|
+
const job =
|
325
|
+
`/job_invocations/new?feature=${feature}&search=name%20%5E%20(${hostname})&inputs%5BPackages%20search%20query%5D=id%20%5E%20(${packages})&inputs%5BSelected%20update%20versions%5D=%5B%5D`;
|
326
|
+
|
327
|
+
getByRole('checkbox', { name: 'Select row 0' }).click();
|
328
|
+
expect(getByLabelText('Select row 0').checked).toEqual(true);
|
329
|
+
getByRole('checkbox', { name: 'Select row 1' }).click();
|
330
|
+
expect(getByLabelText('Select row 1').checked).toEqual(true);
|
331
|
+
|
332
|
+
const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
|
333
|
+
fireEvent.click(upgradeDropdown);
|
334
|
+
expect(upgradeDropdown).not.toHaveAttribute('disabled');
|
335
|
+
|
336
|
+
const rexAction = getByLabelText('bulk_upgrade_customized_rex');
|
337
|
+
expect(rexAction).toBeInTheDocument();
|
338
|
+
expect(rexAction).toHaveAttribute('href', job);
|
339
|
+
|
340
|
+
assertNockRequest(autocompleteScope);
|
341
|
+
assertNockRequest(scope, done);
|
342
|
+
});
|
343
|
+
|
344
|
+
test('Upgrade is disabled when there are non-upgradable packages selected', async (done) => {
|
345
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
346
|
+
|
347
|
+
const scope = nockInstance
|
348
|
+
.get(hostDebs)
|
349
|
+
.query(defaultQuery)
|
350
|
+
.reply(200, mockDebsData);
|
351
|
+
|
352
|
+
const {
|
353
|
+
getAllByRole,
|
354
|
+
getAllByText,
|
355
|
+
getByLabelText,
|
356
|
+
getByRole,
|
357
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
358
|
+
|
359
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
360
|
+
|
361
|
+
// select an upgradable package
|
362
|
+
getByRole('checkbox', { name: 'Select row 0' }).click();
|
363
|
+
// select an up-to-date package
|
364
|
+
getByRole('checkbox', { name: 'Select row 2' }).click();
|
365
|
+
expect(getByLabelText('Select row 2').checked).toEqual(true);
|
366
|
+
|
367
|
+
const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
|
368
|
+
expect(upgradeDropdown).toHaveAttribute('disabled');
|
369
|
+
|
370
|
+
assertNockRequest(autocompleteScope);
|
371
|
+
assertNockRequest(scope, done);
|
372
|
+
});
|
373
|
+
|
374
|
+
test('Remove is disabled when in select all mode', async (done) => {
|
375
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
376
|
+
const scope = nockInstance
|
377
|
+
.get(hostDebs)
|
378
|
+
.query(defaultQuery)
|
379
|
+
.reply(200, mockDebsData);
|
380
|
+
|
381
|
+
const {
|
382
|
+
getAllByText, getByRole,
|
383
|
+
} = renderWithRedux(<DebsTab />, renderOptions());
|
384
|
+
|
385
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
386
|
+
|
387
|
+
// find and click the select all checkbox
|
388
|
+
const selectAllCheckbox = getByRole('checkbox', { name: 'Select all' });
|
389
|
+
fireEvent.click(selectAllCheckbox);
|
390
|
+
getByRole('button', { name: 'bulk_actions' }).click();
|
391
|
+
|
392
|
+
const removeButton = getByRole('menuitem', { name: 'bulk_remove' });
|
393
|
+
await patientlyWaitFor(() => expect(removeButton).toBeInTheDocument());
|
394
|
+
expect(removeButton).toHaveAttribute('aria-disabled', 'true');
|
395
|
+
|
396
|
+
assertNockRequest(autocompleteScope);
|
397
|
+
assertNockRequest(scope, done);
|
398
|
+
});
|
399
|
+
|
400
|
+
test('Sets initial search query from url params', async (done) => {
|
401
|
+
// Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
|
402
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
403
|
+
const scope = nockInstance
|
404
|
+
.get(hostDebs)
|
405
|
+
.query({ ...defaultQuery, search: `name=${firstDeb.name}` })
|
406
|
+
.reply(200, { ...mockDebsData, results: [firstDeb] });
|
407
|
+
|
408
|
+
jest.spyOn(hooks, 'useUrlParams').mockImplementation(() => ({
|
409
|
+
searchParam: `name=${firstDeb.name}`,
|
410
|
+
}));
|
411
|
+
|
412
|
+
const { getAllByText, queryByText } = renderWithRedux(<DebsTab />, renderOptions());
|
413
|
+
|
414
|
+
await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
|
415
|
+
expect(queryByText(secondDeb.name)).not.toBeInTheDocument();
|
416
|
+
|
417
|
+
assertNockRequest(autocompleteScope);
|
418
|
+
assertNockRequest(scope, done); // Pass jest callback to confirm test is done
|
419
|
+
});
|
420
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
{
|
2
|
+
"total": 18,
|
3
|
+
"subtotal": 3,
|
4
|
+
"selectable": 3,
|
5
|
+
"page": "1",
|
6
|
+
"per_page": "20",
|
7
|
+
"error": null,
|
8
|
+
"search": null,
|
9
|
+
"sort": {
|
10
|
+
"by": null,
|
11
|
+
"order": null
|
12
|
+
},
|
13
|
+
"results": [
|
14
|
+
{
|
15
|
+
"id": 32376,
|
16
|
+
"pulp_id": "/pulp/api/v3/content/deb/packages/4b817f2d-d428-4eb4-aa4c-6cd9dc2a0300/",
|
17
|
+
"name": "cheetah",
|
18
|
+
"version": "0.3",
|
19
|
+
"architecture": "noarch",
|
20
|
+
"epoch": "0",
|
21
|
+
"summary": "A dummy package of cheetah",
|
22
|
+
"modular": false,
|
23
|
+
"filename": "cheetah-0.3-0.8.noarch.deb",
|
24
|
+
"sourcedeb": "cheetah-0.3-0.8.src.deb",
|
25
|
+
"checksum": "422d0baa0cd9d7713ae796e886a23e17f578f924f74880debdbb7d65fb368dae",
|
26
|
+
"uuid": "/pulp/api/v3/content/deb/packages/4b817f2d-d428-4eb4-aa4c-6cd9dc2a0300/",
|
27
|
+
"hosts_available_count": 0,
|
28
|
+
"hosts_applicable_count": 0
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"id": 32372,
|
32
|
+
"pulp_id": "/pulp/api/v3/content/deb/packages/c7aee0d3-32d9-49dd-99f9-9269fae7cb6f/",
|
33
|
+
"name": "duck",
|
34
|
+
"version": "0.7",
|
35
|
+
"architecture": "noarch",
|
36
|
+
"epoch": "0",
|
37
|
+
"summary": "Quack like a duck at the park.",
|
38
|
+
"modular": true,
|
39
|
+
"filename": "duck-0.7-1.noarch.deb",
|
40
|
+
"sourcedeb": "duck-0.7-1.src.deb",
|
41
|
+
"checksum": "5bd363b860ad6783217cbca3bbc3ef260f98d140ffb121bf4c208e3f66c24712",
|
42
|
+
"uuid": "/pulp/api/v3/content/deb/packages/c7aee0d3-32d9-49dd-99f9-9269fae7cb6f/",
|
43
|
+
"hosts_available_count": 0,
|
44
|
+
"hosts_applicable_count": 0
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"id": 32370,
|
48
|
+
"pulp_id": "/pulp/api/v3/content/deb/packages/0e9309fd-1a4a-4799-bb49-f3919531b575/",
|
49
|
+
"name": "elephant",
|
50
|
+
"version": "0.3",
|
51
|
+
"architecture": "noarch",
|
52
|
+
"epoch": "0",
|
53
|
+
"summary": "A dummy package of elephant",
|
54
|
+
"modular": false,
|
55
|
+
"filename": "elephant-0.3-0.8.noarch.deb",
|
56
|
+
"sourcedeb": "elephant-0.3-0.8.src.deb",
|
57
|
+
"checksum": "3e1c70cd1b421328acaf6397cb3d16145306bb95f65d1b095fc31372a0a701f3",
|
58
|
+
"uuid": "/pulp/api/v3/content/deb/packages/0e9309fd-1a4a-4799-bb49-f3919531b575/",
|
59
|
+
"hosts_available_count": 0,
|
60
|
+
"hosts_applicable_count": 0
|
61
|
+
}
|
62
|
+
]
|
63
|
+
}
|
@@ -39,6 +39,16 @@
|
|
39
39
|
"host_id": 1,
|
40
40
|
"host": "centos7.katello.lan",
|
41
41
|
"reboot_required": false
|
42
|
-
}
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"id": 4,
|
45
|
+
"application": "dbus",
|
46
|
+
"helper": "You will have to reboot your computer",
|
47
|
+
"restart_command": "reboot",
|
48
|
+
"app_type": "static",
|
49
|
+
"host_id": 1,
|
50
|
+
"host": "centos7.katello.lan",
|
51
|
+
"reboot_required": true
|
52
|
+
}
|
43
53
|
]
|
44
54
|
}
|
@@ -140,9 +140,69 @@ describe('With tracer installed', () => {
|
|
140
140
|
assertNockRequest(scope, done);
|
141
141
|
});
|
142
142
|
|
143
|
+
test('Warns you when one of the selected traces requires reboot', async (done) => {
|
144
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
145
|
+
|
146
|
+
const scope = nockInstance
|
147
|
+
.get(hostTraces)
|
148
|
+
.query(true)
|
149
|
+
.reply(200, mockTraceData);
|
150
|
+
|
151
|
+
const { getByLabelText, queryByText } = renderWithRedux(
|
152
|
+
<TracesTab />,
|
153
|
+
renderOptions(true),
|
154
|
+
);
|
155
|
+
|
156
|
+
let traceCheckbox;
|
157
|
+
// Find the trace checkbox.
|
158
|
+
await patientlyWaitFor(() => {
|
159
|
+
traceCheckbox = getByLabelText('Select row 3'); // this should be dbus, our static trace
|
160
|
+
});
|
161
|
+
fireEvent.click(traceCheckbox);
|
162
|
+
expect(traceCheckbox.checked).toEqual(true);
|
163
|
+
|
164
|
+
await patientlyWaitFor(() => {
|
165
|
+
expect(queryByText('1 selected')).toBeInTheDocument();
|
166
|
+
expect(queryByText('Reboot host')).toBeInTheDocument();
|
167
|
+
expect(queryByText('At least one of the selected items requires the host to reboot')).toBeInTheDocument();
|
168
|
+
});
|
169
|
+
assertNockRequest(autocompleteScope);
|
170
|
+
assertNockRequest(scope, done);
|
171
|
+
});
|
172
|
+
|
173
|
+
test('Warns about reboot when using select all', async (done) => {
|
174
|
+
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
175
|
+
|
176
|
+
const scope = nockInstance
|
177
|
+
.get(hostTraces)
|
178
|
+
.query(true)
|
179
|
+
.reply(200, mockTraceData);
|
180
|
+
|
181
|
+
const { getByLabelText, queryByText } = renderWithRedux(
|
182
|
+
<TracesTab />,
|
183
|
+
renderOptions(true),
|
184
|
+
);
|
185
|
+
|
186
|
+
let traceCheckbox;
|
187
|
+
// Find the trace checkbox.
|
188
|
+
await patientlyWaitFor(() => {
|
189
|
+
traceCheckbox = getByLabelText('Select all');
|
190
|
+
});
|
191
|
+
fireEvent.click(traceCheckbox);
|
192
|
+
expect(traceCheckbox.checked).toEqual(true);
|
193
|
+
|
194
|
+
await patientlyWaitFor(() => {
|
195
|
+
expect(queryByText('20 selected')).toBeInTheDocument();
|
196
|
+
expect(queryByText('Reboot host')).toBeInTheDocument();
|
197
|
+
expect(queryByText('At least one of the selected items requires the host to reboot')).toBeInTheDocument();
|
198
|
+
});
|
199
|
+
assertNockRequest(autocompleteScope);
|
200
|
+
assertNockRequest(scope, done);
|
201
|
+
});
|
202
|
+
|
143
203
|
test('Can bulk restart traces via remote execution', async (done) => {
|
144
|
-
// This is the same test as
|
145
|
-
// but using the table action bar instead
|
204
|
+
// This is the same test as 'Can bulk restart traces via Restart App button',
|
205
|
+
// but using the table action bar instead
|
146
206
|
const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
|
147
207
|
|
148
208
|
const scope = nockInstance
|
@@ -214,7 +274,7 @@ describe('With tracer installed', () => {
|
|
214
274
|
fireEvent.click(getByLabelText('Select row 0')); // de select
|
215
275
|
fireEvent.click(getByLabelText('Select row 2')); // de select
|
216
276
|
|
217
|
-
fireEvent.click(getByText('
|
277
|
+
fireEvent.click(getByText('Reboot host'));
|
218
278
|
|
219
279
|
assertNockRequest(autocompleteScope);
|
220
280
|
assertNockRequest(resolveTracesScope);
|
@@ -9,6 +9,7 @@ const MODULE_STREAMS_KEY = 'MODULE_STREAMS';
|
|
9
9
|
const DEB_PACKAGES_KEY = 'DEB_PACKAGES';
|
10
10
|
const DOCKER_TAGS_KEY = 'DOCKER_TAGS';
|
11
11
|
const FILES_KEY = 'FILES';
|
12
|
+
const CONTAINER_MANIFEST_LISTS_KEY = 'CONTAINER_MANIFEST_LISTS';
|
12
13
|
export const CREATE_CONTENT_VIEW_KEY = 'CONTENT_VIEW_CREATE';
|
13
14
|
export const COPY_CONTENT_VIEW_KEY = 'CONTENT_VIEW_COPY';
|
14
15
|
export const CREATE_CONTENT_VIEW_FILTER_KEY = 'CONTENT_VIEW_FILTER_CREATE';
|
@@ -31,6 +32,7 @@ export const RPM_PACKAGE_GROUPS_CONTENT = 'RPM_PACKAGE_GROUPS_CONTENT';
|
|
31
32
|
export const REPOSITORY_CONTENT = 'REPOSITORY_CONTENT';
|
32
33
|
export const ERRATA_CONTENT = 'ERRATA_CONTENT';
|
33
34
|
export const DOCKER_TAGS_CONTENT = 'DOCKER_TAGS_CONTENT';
|
35
|
+
export const CONTAINER_MANIFEST_LIST_CONTENT = 'CONTAINER_MANIFEST_LIST_CONTENT';
|
34
36
|
export const MODULE_STREAMS_CONTENT = 'MODULE_STREAMS_CONTENT';
|
35
37
|
export const DEB_PACKAGES_CONTENT = 'DEB_PACKAGES_CONTENT';
|
36
38
|
export const RPM_PACKAGES_CONTENT = 'RPM_PACKAGES_CONTENT';
|
@@ -72,6 +74,7 @@ export const cvErrataCompareKey = (versionOne, versionTwo, viewBy) => `${ERRATA_
|
|
72
74
|
export const cvModuleStreamsCompareKey = (versionOne, versionTwo, viewBy) => `${MODULE_STREAMS_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
|
73
75
|
export const cvDebPackagesCompareKey = (versionOne, versionTwo, viewBy) => `${DEB_PACKAGES_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
|
74
76
|
export const cvDockerTagsCompareKey = (versionOne, versionTwo, viewBy) => `${DOCKER_TAGS_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
|
77
|
+
export const cvContainerManifestListsCompareKey = (versionOne, versionTwo, viewBy) => `${CONTAINER_MANIFEST_LISTS_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
|
75
78
|
export const filesCompareKey = (versionOne, versionTwo, viewBy) => `${FILES_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
|
76
79
|
// Repo added to content view status display and key
|
77
80
|
export const ADDED = __('Added');
|
@@ -77,18 +77,6 @@
|
|
77
77
|
"build_status_label": "Installed",
|
78
78
|
"errata_status": 0,
|
79
79
|
"errata_status_label": "All errata applied",
|
80
|
-
"subscription_status": 5,
|
81
|
-
"subscription_status_label": "Simple Content Access",
|
82
|
-
"purpose_sla_status": 0,
|
83
|
-
"purpose_sla_status_label": "Unknown",
|
84
|
-
"purpose_role_status": 0,
|
85
|
-
"purpose_role_status_label": "Unknown",
|
86
|
-
"purpose_usage_status": 0,
|
87
|
-
"purpose_usage_status_label": "Unknown",
|
88
|
-
"purpose_addons_status": 0,
|
89
|
-
"purpose_addons_status_label": "Unknown",
|
90
|
-
"purpose_status": 0,
|
91
|
-
"purpose_status_label": "Unknown",
|
92
80
|
"name": "affectedHost.example.com",
|
93
81
|
"id": 1,
|
94
82
|
"puppet_proxy_id": null,
|
@@ -134,7 +122,6 @@
|
|
134
122
|
"content_source": null,
|
135
123
|
"kickstart_repository": null
|
136
124
|
},
|
137
|
-
"subscription_global_status": 0,
|
138
125
|
"subscription_facet_attributes": {
|
139
126
|
"id": 2,
|
140
127
|
"uuid": "457997e1-ac07-40e4-85b7-e382a3563e4a",
|
@@ -47,6 +47,7 @@ import {
|
|
47
47
|
MODULE_STREAMS_CONTENT,
|
48
48
|
DEB_PACKAGES_CONTENT,
|
49
49
|
DOCKER_TAGS_CONTENT,
|
50
|
+
CONTAINER_MANIFEST_LIST_CONTENT,
|
50
51
|
generatedContentKey,
|
51
52
|
STATUS_TRANSLATIONS_ENUM,
|
52
53
|
bulkRemoveVersionKey,
|
@@ -58,7 +59,7 @@ import {
|
|
58
59
|
cvDebPackagesCompareKey,
|
59
60
|
filesCompareKey,
|
60
61
|
genericContentCompareKey,
|
61
|
-
cvRepositoriesCompareKey,
|
62
|
+
cvRepositoriesCompareKey, cvContainerManifestListsCompareKey,
|
62
63
|
} from '../ContentViewsConstants';
|
63
64
|
import api, { foremanApi, orgId } from '../../../services/api';
|
64
65
|
import { getResponseErrorMsgs } from '../../../utils/helpers';
|
@@ -179,6 +180,19 @@ export const getDockerTagsComparison = (versionOne, versionTwo, viewBy, params)
|
|
179
180
|
});
|
180
181
|
};
|
181
182
|
|
183
|
+
export const getContainerManifestListsComparison = (versionOne, versionTwo, viewBy, params) => {
|
184
|
+
const versions = { content_view_version_ids: [versionOne, versionTwo] };
|
185
|
+
const restrictComparison = { restrict_comparison: viewBy };
|
186
|
+
const apiParams = { ...versions, ...restrictComparison, ...params };
|
187
|
+
const apiUrl = '/docker_manifest_lists/compare';
|
188
|
+
return get({
|
189
|
+
key: cvContainerManifestListsCompareKey(versionOne, versionTwo, viewBy),
|
190
|
+
params: apiParams,
|
191
|
+
errorToast: error => __(`Something went wrong while retrieving the container tags! ${getResponseErrorMsgs(error.response)}`),
|
192
|
+
url: api.getApiUrl(apiUrl),
|
193
|
+
});
|
194
|
+
};
|
195
|
+
|
182
196
|
export const getFilesComparison = (versionOne, versionTwo, viewBy, params) => {
|
183
197
|
const versions = { content_view_version_ids: [versionOne, versionTwo] };
|
184
198
|
const restrictComparison = { restrict_comparison: viewBy };
|
@@ -268,6 +282,14 @@ export const getDockerTags = params => get({
|
|
268
282
|
errorToast: error => __(`Something went wrong while getting container tags! ${getResponseErrorMsgs(error.response)}`),
|
269
283
|
});
|
270
284
|
|
285
|
+
export const getContainerManifestLists = params => get({
|
286
|
+
type: API_OPERATIONS.GET,
|
287
|
+
key: CONTAINER_MANIFEST_LIST_CONTENT,
|
288
|
+
url: api.getApiUrl('/docker_manifest_lists'),
|
289
|
+
params,
|
290
|
+
errorToast: error => __(`Something went wrong while getting container manifest lists! ${getResponseErrorMsgs(error.response)}`),
|
291
|
+
});
|
292
|
+
|
271
293
|
export const getErrata = params => get({
|
272
294
|
type: API_OPERATIONS.GET,
|
273
295
|
key: ERRATA_CONTENT,
|