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,585 @@
|
|
1
|
+
import React, { useCallback, useState, useRef } from 'react';
|
2
|
+
import { useSelector } from 'react-redux';
|
3
|
+
import {
|
4
|
+
ActionList,
|
5
|
+
ActionListItem,
|
6
|
+
Dropdown,
|
7
|
+
DropdownItem,
|
8
|
+
DropdownSeparator,
|
9
|
+
DropdownToggle,
|
10
|
+
DropdownToggleAction,
|
11
|
+
KebabToggle,
|
12
|
+
Select,
|
13
|
+
SelectOption,
|
14
|
+
SelectVariant,
|
15
|
+
Skeleton,
|
16
|
+
Split,
|
17
|
+
SplitItem,
|
18
|
+
} from '@patternfly/react-core';
|
19
|
+
import { TableVariant, Thead, Tbody, Tr, Th, Td, TableText } from '@patternfly/react-table';
|
20
|
+
import PropTypes from 'prop-types';
|
21
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
22
|
+
import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
|
23
|
+
|
24
|
+
import { urlBuilder } from 'foremanReact/common/urlHelpers';
|
25
|
+
import { useSet, useBulkSelect, useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks';
|
26
|
+
import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort';
|
27
|
+
import SelectableDropdown from '../../../../SelectableDropdown';
|
28
|
+
import TableWrapper from '../../../../../components/Table/TableWrapper';
|
29
|
+
import PackagesStatus from '../../../../../components/Packages';
|
30
|
+
import {
|
31
|
+
getInstalledDebs,
|
32
|
+
} from './HostDebsActions';
|
33
|
+
import { selectHostDebsStatus } from './HostDebsSelectors';
|
34
|
+
import {
|
35
|
+
HOST_DEBS_KEY, PACKAGES_VERSION_STATUSES, VERSION_STATUSES_TO_PARAM,
|
36
|
+
} from './HostDebsConstants';
|
37
|
+
import { removePackage, updatePackage, removePackages, updatePackages, installPackageBySearch } from '../RemoteExecutionActions';
|
38
|
+
import { katelloPackageUpdateUrl, packagesUpdateUrl } from '../customizedRexUrlHelpers';
|
39
|
+
import './DebsTab.scss';
|
40
|
+
import hostIdNotReady, { getHostDetails } from '../../HostDetailsActions';
|
41
|
+
import DebInstallModal from './DebInstallModal';
|
42
|
+
import { hasRequiredPermissions as can,
|
43
|
+
missingRequiredPermissions as cannot,
|
44
|
+
userPermissionsFromHostDetails } from '../../hostDetailsHelpers';
|
45
|
+
import SortableColumnHeaders from '../../../../Table/components/SortableColumnHeaders';
|
46
|
+
import { useRexJobPolling } from '../RemoteExecutionHooks';
|
47
|
+
|
48
|
+
export const hideDebsTab = ({ hostDetails }) => !(hostDetails?.operatingsystem_family === 'Debian');
|
49
|
+
|
50
|
+
const invokeRexJobs = ['create_job_invocations'];
|
51
|
+
const createBookmarks = ['create_bookmarks'];
|
52
|
+
|
53
|
+
const UpdateVersionsSelect = ({
|
54
|
+
packageName,
|
55
|
+
rowIndex,
|
56
|
+
selections,
|
57
|
+
upgradableVersions,
|
58
|
+
toggleUpgradableVersionSelect,
|
59
|
+
onUpgradableVersionSelect,
|
60
|
+
upgradableVersionSelectOpen,
|
61
|
+
}) => {
|
62
|
+
if (upgradableVersions === null) {
|
63
|
+
return <TableText wrapModifier="nowrap">—</TableText>;
|
64
|
+
} else if (upgradableVersions.length === 1) {
|
65
|
+
return <TableText wrapModifier="nowrap">{upgradableVersions[0]}</TableText>;
|
66
|
+
}
|
67
|
+
|
68
|
+
return (
|
69
|
+
<div>
|
70
|
+
<span id="style-select-id">
|
71
|
+
<Select
|
72
|
+
variant={SelectVariant.single}
|
73
|
+
aria-label="upgradable-version-select"
|
74
|
+
ouiaId="upgradable-version-select"
|
75
|
+
onToggle={isOpen => toggleUpgradableVersionSelect(isOpen, rowIndex)}
|
76
|
+
onSelect={(event, selected) => {
|
77
|
+
onUpgradableVersionSelect(event, selected, rowIndex, packageName);
|
78
|
+
}}
|
79
|
+
selections={selections}
|
80
|
+
isOpen={upgradableVersionSelectOpen.has(rowIndex)}
|
81
|
+
isPlain
|
82
|
+
>
|
83
|
+
{upgradableVersions.map(version => (
|
84
|
+
<SelectOption
|
85
|
+
key={version}
|
86
|
+
value={version}
|
87
|
+
label={`${version}-version-select-option`}
|
88
|
+
/>
|
89
|
+
))}
|
90
|
+
</Select>
|
91
|
+
</span>
|
92
|
+
</div>
|
93
|
+
);
|
94
|
+
};
|
95
|
+
|
96
|
+
UpdateVersionsSelect.propTypes = {
|
97
|
+
packageName: PropTypes.string.isRequired,
|
98
|
+
rowIndex: PropTypes.number.isRequired,
|
99
|
+
selections: PropTypes.string,
|
100
|
+
upgradableVersions: PropTypes.arrayOf(PropTypes.string),
|
101
|
+
toggleUpgradableVersionSelect: PropTypes.func,
|
102
|
+
onUpgradableVersionSelect: PropTypes.func,
|
103
|
+
upgradableVersionSelectOpen: PropTypes.shape({
|
104
|
+
has: PropTypes.func,
|
105
|
+
rowIndex: PropTypes.number,
|
106
|
+
}),
|
107
|
+
};
|
108
|
+
|
109
|
+
UpdateVersionsSelect.defaultProps = {
|
110
|
+
selections: null,
|
111
|
+
upgradableVersions: null,
|
112
|
+
toggleUpgradableVersionSelect: undefined,
|
113
|
+
onUpgradableVersionSelect: undefined,
|
114
|
+
upgradableVersionSelectOpen: null,
|
115
|
+
};
|
116
|
+
|
117
|
+
export const DebsTab = () => {
|
118
|
+
const hostDetails = useSelector(state => selectAPIResponse(state, 'HOST_DETAILS'));
|
119
|
+
const {
|
120
|
+
id: hostId,
|
121
|
+
name: hostname,
|
122
|
+
} = hostDetails;
|
123
|
+
|
124
|
+
const { searchParam, status: statusParam } = useUrlParams();
|
125
|
+
const PACKAGE_STATUS = __('Status');
|
126
|
+
const [packageStatusSelected, setPackageStatusSelected] = useState(statusParam ?? PACKAGE_STATUS);
|
127
|
+
const activeFilters = [packageStatusSelected];
|
128
|
+
const defaultFilters = [PACKAGE_STATUS];
|
129
|
+
const [isBulkActionOpen, setIsBulkActionOpen] = useState(false);
|
130
|
+
const toggleBulkAction = () => setIsBulkActionOpen(prev => !prev);
|
131
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
132
|
+
const closeModal = () => setIsModalOpen(false);
|
133
|
+
const showActions = can(invokeRexJobs, userPermissionsFromHostDetails({ hostDetails }));
|
134
|
+
|
135
|
+
const [isActionOpen, setIsActionOpen] = useState(false);
|
136
|
+
const onActionSelect = () => {
|
137
|
+
setIsActionOpen(false);
|
138
|
+
};
|
139
|
+
const onActionToggle = () => {
|
140
|
+
setIsActionOpen(prev => !prev);
|
141
|
+
};
|
142
|
+
|
143
|
+
const upgradableVersionSelectOpen = useSet([]);
|
144
|
+
const toggleUpgradableVersionSelect = (isOpenState, rowIndex) => {
|
145
|
+
if (isOpenState) {
|
146
|
+
upgradableVersionSelectOpen.add(rowIndex);
|
147
|
+
} else {
|
148
|
+
upgradableVersionSelectOpen.delete(rowIndex);
|
149
|
+
}
|
150
|
+
};
|
151
|
+
|
152
|
+
const selectedNewVersions = useRef({});
|
153
|
+
const onUpgradableVersionSelect = (_event, selected, rowIndex, packageName) => {
|
154
|
+
toggleUpgradableVersionSelect(false, rowIndex);
|
155
|
+
selectedNewVersions.current[packageName] = selected;
|
156
|
+
};
|
157
|
+
|
158
|
+
const emptyContentTitle = __('This host does not have any packages.');
|
159
|
+
const emptyContentBody = __('Packages will appear here when available.');
|
160
|
+
const emptySearchTitle = __('No matching packages found');
|
161
|
+
const emptySearchBody = __('Try changing your search settings.');
|
162
|
+
const errorSearchTitle = __('Problem searching packages');
|
163
|
+
const columnHeaders = [
|
164
|
+
__('Package'),
|
165
|
+
__('Status'),
|
166
|
+
__('Installed version'),
|
167
|
+
__('Upgradable to'),
|
168
|
+
];
|
169
|
+
|
170
|
+
const COLUMNS_TO_SORT_PARAMS = {
|
171
|
+
[columnHeaders[0]]: 'name',
|
172
|
+
[columnHeaders[2]]: 'version',
|
173
|
+
};
|
174
|
+
|
175
|
+
const {
|
176
|
+
pfSortParams, apiSortParams,
|
177
|
+
activeSortColumn, activeSortDirection,
|
178
|
+
} = useTableSort({
|
179
|
+
allColumns: columnHeaders,
|
180
|
+
columnsToSortParams: COLUMNS_TO_SORT_PARAMS,
|
181
|
+
initialSortColumnName: 'Package',
|
182
|
+
});
|
183
|
+
|
184
|
+
const fetchItems = useCallback(
|
185
|
+
(params) => {
|
186
|
+
if (!hostId) return hostIdNotReady;
|
187
|
+
const modifiedParams = { ...params };
|
188
|
+
if (packageStatusSelected !== PACKAGE_STATUS) {
|
189
|
+
modifiedParams.status = VERSION_STATUSES_TO_PARAM[packageStatusSelected];
|
190
|
+
}
|
191
|
+
return getInstalledDebs(hostId, { ...apiSortParams, ...modifiedParams });
|
192
|
+
},
|
193
|
+
[hostId, PACKAGE_STATUS, packageStatusSelected, apiSortParams],
|
194
|
+
);
|
195
|
+
|
196
|
+
const response = useSelector(state => selectAPIResponse(state, HOST_DEBS_KEY));
|
197
|
+
const { results, ...metadata } = response;
|
198
|
+
const { error: errorSearchBody } = metadata;
|
199
|
+
const status = useSelector(state => selectHostDebsStatus(state));
|
200
|
+
const {
|
201
|
+
selectOne,
|
202
|
+
isSelected,
|
203
|
+
searchQuery,
|
204
|
+
updateSearchQuery,
|
205
|
+
selectedCount,
|
206
|
+
isSelectable,
|
207
|
+
selectedResults,
|
208
|
+
selectNone,
|
209
|
+
selectAllMode,
|
210
|
+
areAllRowsSelected,
|
211
|
+
fetchBulkParams,
|
212
|
+
...selectAll
|
213
|
+
} = useBulkSelect({
|
214
|
+
results,
|
215
|
+
metadata,
|
216
|
+
initialSearchQuery: searchParam || '',
|
217
|
+
});
|
218
|
+
|
219
|
+
const packageRemoveAction = packageName => removePackage({
|
220
|
+
hostname,
|
221
|
+
packageName,
|
222
|
+
});
|
223
|
+
|
224
|
+
const {
|
225
|
+
triggerJobStart: triggerPackageRemove, lastCompletedJob: lastCompletedPackageRemove,
|
226
|
+
isPolling: isRemoveInProgress,
|
227
|
+
} = useRexJobPolling(packageRemoveAction);
|
228
|
+
|
229
|
+
const packageBulkRemoveAction = bulkParams => removePackages({
|
230
|
+
hostname,
|
231
|
+
search: bulkParams,
|
232
|
+
});
|
233
|
+
|
234
|
+
const {
|
235
|
+
triggerJobStart: triggerBulkPackageRemove,
|
236
|
+
lastCompletedJob: lastCompletedBulkPackageRemove,
|
237
|
+
isPolling: isBulkRemoveInProgress,
|
238
|
+
} = useRexJobPolling(packageBulkRemoveAction);
|
239
|
+
|
240
|
+
const packageUpgradeAction = ({ packageName }) => updatePackage({
|
241
|
+
hostname,
|
242
|
+
packageName,
|
243
|
+
});
|
244
|
+
|
245
|
+
const {
|
246
|
+
triggerJobStart: triggerPackageUpgrade,
|
247
|
+
lastCompletedJob: lastCompletedPackageUpgrade,
|
248
|
+
isPolling: isUpgradeInProgress,
|
249
|
+
} = useRexJobPolling(packageUpgradeAction, getHostDetails({ hostname }));
|
250
|
+
|
251
|
+
const packageBulkUpgradeAction = bulkParams => updatePackages({
|
252
|
+
hostname,
|
253
|
+
search: bulkParams,
|
254
|
+
versions: JSON.stringify([]),
|
255
|
+
});
|
256
|
+
|
257
|
+
const {
|
258
|
+
triggerJobStart: triggerBulkPackageUpgrade,
|
259
|
+
lastCompletedJob: lastCompletedBulkPackageUpgrade,
|
260
|
+
isPolling: isBulkUpgradeInProgress,
|
261
|
+
} = useRexJobPolling(packageBulkUpgradeAction, getHostDetails({ hostname }));
|
262
|
+
|
263
|
+
const packageInstallAction
|
264
|
+
= bulkParams => installPackageBySearch({ hostname, search: bulkParams });
|
265
|
+
|
266
|
+
const {
|
267
|
+
triggerJobStart: triggerPackageInstall,
|
268
|
+
lastCompletedJob: lastCompletedPackageInstall,
|
269
|
+
isPolling: isInstallInProgress,
|
270
|
+
} = useRexJobPolling(packageInstallAction, getHostDetails({ hostname }));
|
271
|
+
|
272
|
+
const actionInProgress = (isRemoveInProgress || isUpgradeInProgress
|
273
|
+
|| isBulkRemoveInProgress || isBulkUpgradeInProgress || isInstallInProgress);
|
274
|
+
const disabledReason = __('A remote execution job is in progress.');
|
275
|
+
|
276
|
+
if (!hostId) return <Skeleton />;
|
277
|
+
|
278
|
+
const handleInstallPackagesClick = () => {
|
279
|
+
setIsBulkActionOpen(false);
|
280
|
+
setIsModalOpen(true);
|
281
|
+
};
|
282
|
+
|
283
|
+
const removePackageViaRemoteExecution = packageName => triggerPackageRemove(packageName);
|
284
|
+
|
285
|
+
const removePackagesViaRemoteExecution = () => {
|
286
|
+
const selected = fetchBulkParams();
|
287
|
+
setIsBulkActionOpen(false);
|
288
|
+
selectNone();
|
289
|
+
triggerBulkPackageRemove(selected);
|
290
|
+
};
|
291
|
+
|
292
|
+
const removeBulk = () => removePackagesViaRemoteExecution();
|
293
|
+
|
294
|
+
const handlePackageRemove = packageName => removePackageViaRemoteExecution(packageName);
|
295
|
+
|
296
|
+
const upgradeViaRemoteExecution = ({ packageName, upgradableVersions }) => (
|
297
|
+
triggerPackageUpgrade({ packageName, upgradableVersions })
|
298
|
+
);
|
299
|
+
|
300
|
+
const upgradeBulkViaRemoteExecution = () => {
|
301
|
+
const selected = fetchBulkParams();
|
302
|
+
setIsBulkActionOpen(false);
|
303
|
+
selectNone();
|
304
|
+
triggerBulkPackageUpgrade(selected);
|
305
|
+
};
|
306
|
+
|
307
|
+
const upgradeBulk = () => upgradeBulkViaRemoteExecution();
|
308
|
+
|
309
|
+
const upgradeViaCustomizedRemoteExecution = selectedCount ?
|
310
|
+
packagesUpdateUrl({
|
311
|
+
hostname,
|
312
|
+
search: fetchBulkParams(),
|
313
|
+
versions: JSON.stringify([]),
|
314
|
+
}) : '#';
|
315
|
+
|
316
|
+
const disableRemove = () => selectedCount === 0 || selectAllMode;
|
317
|
+
|
318
|
+
const allUpgradable = () => selectedResults.length > 0 &&
|
319
|
+
selectedResults.every(item => item.upgradable_versions?.length > 0);
|
320
|
+
const disableUpgrade = () => selectedCount === 0 ||
|
321
|
+
(selectAllMode && packageStatusSelected !== 'Upgradable') ||
|
322
|
+
(!selectAllMode && !allUpgradable());
|
323
|
+
|
324
|
+
const readOnlyBookmarks =
|
325
|
+
cannot(createBookmarks, userPermissionsFromHostDetails({ hostDetails }));
|
326
|
+
|
327
|
+
const dropdownUpgradeItems = [
|
328
|
+
<DropdownItem
|
329
|
+
aria-label="bulk_upgrade_rex"
|
330
|
+
ouiaId="bulk_upgrade_rex"
|
331
|
+
key="bulk_upgrade_rex"
|
332
|
+
component="button"
|
333
|
+
onClick={upgradeBulkViaRemoteExecution}
|
334
|
+
>
|
335
|
+
{__('Upgrade via remote execution')}
|
336
|
+
</DropdownItem>,
|
337
|
+
<DropdownItem
|
338
|
+
aria-label="bulk_upgrade_customized_rex"
|
339
|
+
ouiaId="bulk_upgrade_customized_rex"
|
340
|
+
key="bulk_upgrade_customized_rex"
|
341
|
+
component="a"
|
342
|
+
href={upgradeViaCustomizedRemoteExecution}
|
343
|
+
>
|
344
|
+
{__('Upgrade via customized remote execution')}
|
345
|
+
</DropdownItem>,
|
346
|
+
];
|
347
|
+
|
348
|
+
const dropdownRemoveItems = [
|
349
|
+
<DropdownItem
|
350
|
+
aria-label="bulk_remove"
|
351
|
+
ouiaId="bulk_remove"
|
352
|
+
key="bulk_remove"
|
353
|
+
component="button"
|
354
|
+
onClick={removeBulk}
|
355
|
+
isDisabled={disableRemove()}
|
356
|
+
>
|
357
|
+
{__('Remove')}
|
358
|
+
</DropdownItem>,
|
359
|
+
<DropdownSeparator key="separator" ouiaId="separator" />,
|
360
|
+
<DropdownItem
|
361
|
+
aria-label="install_pkg_on_host"
|
362
|
+
ouiaId="install_pkg_on_host"
|
363
|
+
key="install_pkg_on_host"
|
364
|
+
component="button"
|
365
|
+
onClick={handleInstallPackagesClick}
|
366
|
+
>
|
367
|
+
{__('Install packages')}
|
368
|
+
</DropdownItem>,
|
369
|
+
];
|
370
|
+
|
371
|
+
const handlePackageStatusSelected = newStatus => setPackageStatusSelected((prevStatus) => {
|
372
|
+
if (prevStatus === newStatus) {
|
373
|
+
return PACKAGE_STATUS;
|
374
|
+
}
|
375
|
+
return newStatus;
|
376
|
+
});
|
377
|
+
|
378
|
+
const actionButtons = showActions ? (
|
379
|
+
<Split hasGutter>
|
380
|
+
<SplitItem>
|
381
|
+
<ActionList isIconList>
|
382
|
+
<ActionListItem>
|
383
|
+
<Dropdown
|
384
|
+
ouiaId="upgrade_actions_dropdown"
|
385
|
+
onSelect={onActionSelect}
|
386
|
+
toggle={
|
387
|
+
<DropdownToggle
|
388
|
+
ouiaId="upgrade_actions_dropdown_toggle"
|
389
|
+
splitButtonItems={[
|
390
|
+
<DropdownToggleAction key="action" aria-label="upgrade_actions" onClick={upgradeBulk}>
|
391
|
+
{__('Upgrade')}
|
392
|
+
</DropdownToggleAction>,
|
393
|
+
]}
|
394
|
+
isDisabled={actionInProgress || disableUpgrade()}
|
395
|
+
splitButtonVariant="action"
|
396
|
+
toggleVariant="primary"
|
397
|
+
onToggle={onActionToggle}
|
398
|
+
/>
|
399
|
+
}
|
400
|
+
isOpen={isActionOpen}
|
401
|
+
dropdownItems={dropdownUpgradeItems}
|
402
|
+
/>
|
403
|
+
</ActionListItem>
|
404
|
+
<ActionListItem>
|
405
|
+
<Dropdown
|
406
|
+
toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
|
407
|
+
isOpen={isBulkActionOpen}
|
408
|
+
isPlain
|
409
|
+
dropdownItems={dropdownRemoveItems}
|
410
|
+
ouiaId="bulk_actions_dropdown"
|
411
|
+
/>
|
412
|
+
</ActionListItem>
|
413
|
+
</ActionList>
|
414
|
+
</SplitItem>
|
415
|
+
</Split>
|
416
|
+
) : null;
|
417
|
+
|
418
|
+
const statusFilters = (
|
419
|
+
<Split hasGutter>
|
420
|
+
<SplitItem>
|
421
|
+
<SelectableDropdown
|
422
|
+
id="package-status-dropdown"
|
423
|
+
title={PACKAGE_STATUS}
|
424
|
+
showTitle={false}
|
425
|
+
items={Object.values(PACKAGES_VERSION_STATUSES)}
|
426
|
+
selected={packageStatusSelected}
|
427
|
+
setSelected={handlePackageStatusSelected}
|
428
|
+
/>
|
429
|
+
</SplitItem>
|
430
|
+
</Split>
|
431
|
+
);
|
432
|
+
|
433
|
+
const resetFilters = () => setPackageStatusSelected(PACKAGE_STATUS);
|
434
|
+
|
435
|
+
return (
|
436
|
+
<div>
|
437
|
+
<div id="debs-tab">
|
438
|
+
<TableWrapper
|
439
|
+
{...{
|
440
|
+
metadata,
|
441
|
+
emptyContentTitle,
|
442
|
+
emptyContentBody,
|
443
|
+
emptySearchTitle,
|
444
|
+
emptySearchBody,
|
445
|
+
errorSearchTitle,
|
446
|
+
errorSearchBody,
|
447
|
+
status,
|
448
|
+
activeFilters,
|
449
|
+
defaultFilters,
|
450
|
+
actionButtons,
|
451
|
+
searchQuery,
|
452
|
+
updateSearchQuery,
|
453
|
+
toggleGroup: statusFilters,
|
454
|
+
selectedCount,
|
455
|
+
selectNone,
|
456
|
+
areAllRowsSelected,
|
457
|
+
resetFilters,
|
458
|
+
}
|
459
|
+
}
|
460
|
+
ouiaId="host-debs-table"
|
461
|
+
additionalListeners={[hostId, packageStatusSelected,
|
462
|
+
activeSortDirection, activeSortColumn, lastCompletedPackageUpgrade,
|
463
|
+
lastCompletedPackageRemove, lastCompletedBulkPackageRemove,
|
464
|
+
lastCompletedBulkPackageUpgrade, lastCompletedPackageInstall]}
|
465
|
+
fetchItems={fetchItems}
|
466
|
+
bookmarkController="katello_host_installed_debs"
|
467
|
+
readOnlyBookmarks={readOnlyBookmarks}
|
468
|
+
autocompleteEndpoint={`/api/v2/hosts/${hostId}/debs`}
|
469
|
+
rowsCount={results?.length}
|
470
|
+
variant={TableVariant.compact}
|
471
|
+
{...selectAll}
|
472
|
+
displaySelectAllCheckbox={showActions}
|
473
|
+
requestKey={HOST_DEBS_KEY}
|
474
|
+
alwaysShowActionButtons={false}
|
475
|
+
>
|
476
|
+
<Thead>
|
477
|
+
<Tr ouiaId="row-header">
|
478
|
+
<Th key="select-all" />
|
479
|
+
<SortableColumnHeaders
|
480
|
+
columnHeaders={columnHeaders}
|
481
|
+
pfSortParams={pfSortParams}
|
482
|
+
columnsToSortParams={COLUMNS_TO_SORT_PARAMS}
|
483
|
+
/>
|
484
|
+
<Th />
|
485
|
+
</Tr>
|
486
|
+
</Thead>
|
487
|
+
<Tbody>
|
488
|
+
{results?.map((pkg, rowIndex) => {
|
489
|
+
const {
|
490
|
+
id,
|
491
|
+
name: packageName,
|
492
|
+
version: installedVersion,
|
493
|
+
deb_id: debId,
|
494
|
+
upgradable_versions: upgradableVersions,
|
495
|
+
} = pkg;
|
496
|
+
|
497
|
+
const rowActions = [
|
498
|
+
{
|
499
|
+
title: __('Remove'),
|
500
|
+
isDisabled: actionInProgress,
|
501
|
+
onClick: () => handlePackageRemove(packageName),
|
502
|
+
},
|
503
|
+
];
|
504
|
+
|
505
|
+
if (upgradableVersions) {
|
506
|
+
rowActions.unshift(
|
507
|
+
{
|
508
|
+
title: __('Upgrade via remote execution'),
|
509
|
+
onClick: () => upgradeViaRemoteExecution({ packageName, upgradableVersions }),
|
510
|
+
isDisabled: actionInProgress,
|
511
|
+
},
|
512
|
+
{
|
513
|
+
title: __('Upgrade via customized remote execution'),
|
514
|
+
component: 'a',
|
515
|
+
href: katelloPackageUpdateUrl({
|
516
|
+
hostname,
|
517
|
+
packageName,
|
518
|
+
}),
|
519
|
+
},
|
520
|
+
);
|
521
|
+
}
|
522
|
+
|
523
|
+
return (
|
524
|
+
<Tr key={id} ouiaId={`action-row-${id}`}>
|
525
|
+
{showActions ? (
|
526
|
+
<Td
|
527
|
+
select={{
|
528
|
+
disable: actionInProgress,
|
529
|
+
isSelected: isSelected(id),
|
530
|
+
onSelect: (event, selected) => selectOne(selected, id, pkg),
|
531
|
+
rowIndex,
|
532
|
+
variant: 'checkbox',
|
533
|
+
}}
|
534
|
+
title={actionInProgress ? disabledReason : undefined}
|
535
|
+
/>
|
536
|
+
) : <Td> </Td>}
|
537
|
+
<Td>
|
538
|
+
{debId
|
539
|
+
? <a href={urlBuilder(`debs/${debId}`, '')}>{packageName}</a>
|
540
|
+
: packageName
|
541
|
+
}
|
542
|
+
</Td>
|
543
|
+
<Td><PackagesStatus {...pkg} /></Td>
|
544
|
+
<Td>{installedVersion.replace(`${packageName}-`, '')}</Td>
|
545
|
+
<Td>
|
546
|
+
<UpdateVersionsSelect
|
547
|
+
packageName={packageName}
|
548
|
+
rowIndex={rowIndex}
|
549
|
+
selections={selectedNewVersions.current[packageName]}
|
550
|
+
upgradableVersions={upgradableVersions}
|
551
|
+
toggleUpgradableVersionSelect={toggleUpgradableVersionSelect}
|
552
|
+
onUpgradableVersionSelect={onUpgradableVersionSelect}
|
553
|
+
upgradableVersionSelectOpen={upgradableVersionSelectOpen}
|
554
|
+
/>
|
555
|
+
</Td>
|
556
|
+
{showActions ? (
|
557
|
+
<Td
|
558
|
+
key={`rowActions-${id}`}
|
559
|
+
actions={{
|
560
|
+
items: rowActions,
|
561
|
+
}}
|
562
|
+
/>
|
563
|
+
) : null}
|
564
|
+
</Tr>
|
565
|
+
);
|
566
|
+
})
|
567
|
+
}
|
568
|
+
</Tbody>
|
569
|
+
</TableWrapper>
|
570
|
+
</div>
|
571
|
+
{hostId &&
|
572
|
+
<DebInstallModal
|
573
|
+
isOpen={isModalOpen}
|
574
|
+
closeModal={closeModal}
|
575
|
+
hostId={hostId}
|
576
|
+
key={hostId}
|
577
|
+
hostName={hostname}
|
578
|
+
triggerPackageInstall={triggerPackageInstall}
|
579
|
+
/>
|
580
|
+
}
|
581
|
+
</div>
|
582
|
+
);
|
583
|
+
};
|
584
|
+
|
585
|
+
export default DebsTab;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { API_OPERATIONS, get } from 'foremanReact/redux/API';
|
2
|
+
import { foremanApi } from '../../../../../services/api';
|
3
|
+
import {
|
4
|
+
HOST_DEBS_KEY,
|
5
|
+
} from './HostDebsConstants';
|
6
|
+
|
7
|
+
export const getInstalledDebs = (hostId, params) => get({
|
8
|
+
type: API_OPERATIONS.GET,
|
9
|
+
key: HOST_DEBS_KEY,
|
10
|
+
url: foremanApi.getApiUrl(`/hosts/${hostId}/debs?include_latest_upgradable=true`),
|
11
|
+
params,
|
12
|
+
});
|
13
|
+
export default getInstalledDebs;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
export const HOST_DEBS_KEY = 'HOST_DEBS';
|
2
|
+
export const PACKAGES_SEARCH_QUERY = 'Packages search query';
|
3
|
+
export const SELECTED_UPDATE_VERSIONS = 'Selected update versions';
|
4
|
+
|
5
|
+
export const PACKAGES_VERSION_STATUSES = {
|
6
|
+
UPGRADABLE: 'Upgradable',
|
7
|
+
UP_TO_DATE: 'Up-to date',
|
8
|
+
};
|
9
|
+
|
10
|
+
export const VERSION_STATUSES_TO_PARAM = {
|
11
|
+
[PACKAGES_VERSION_STATUSES.UPGRADABLE]: 'upgradable',
|
12
|
+
[PACKAGES_VERSION_STATUSES.UP_TO_DATE]: 'up-to-date',
|
13
|
+
};
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import {
|
2
|
+
selectAPIStatus,
|
3
|
+
selectAPIError,
|
4
|
+
selectAPIResponse,
|
5
|
+
} from 'foremanReact/redux/API/APISelectors';
|
6
|
+
import { STATUS } from 'foremanReact/constants';
|
7
|
+
import { HOST_DEBS_KEY } from './HostDebsConstants';
|
8
|
+
|
9
|
+
export const selectHostDebs = state =>
|
10
|
+
selectAPIResponse(state, HOST_DEBS_KEY) || {};
|
11
|
+
|
12
|
+
export const selectHostDebsStatus = state =>
|
13
|
+
selectAPIStatus(state, HOST_DEBS_KEY) || STATUS.PENDING;
|
14
|
+
|
15
|
+
export const selectHostDebsError = state =>
|
16
|
+
selectAPIError(state, HOST_DEBS_KEY);
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { API_OPERATIONS, get } from 'foremanReact/redux/API';
|
2
|
+
import katelloApi from '../../../../../services/api';
|
3
|
+
import { HOST_INSTALLABLE_DEBS_KEY } from './InstallableDebsConstants';
|
4
|
+
|
5
|
+
export const getHostInstallableDebs = (hostId, params) => get({
|
6
|
+
type: API_OPERATIONS.GET,
|
7
|
+
key: HOST_INSTALLABLE_DEBS_KEY,
|
8
|
+
url: katelloApi.getApiUrl('/debs'),
|
9
|
+
params: {
|
10
|
+
...params,
|
11
|
+
host_id: hostId,
|
12
|
+
packages_restrict_not_installed: true,
|
13
|
+
packages_restrict_applicable: false,
|
14
|
+
},
|
15
|
+
});
|
16
|
+
export default getHostInstallableDebs;
|
17
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import {
|
2
|
+
selectAPIStatus,
|
3
|
+
selectAPIError,
|
4
|
+
selectAPIResponse,
|
5
|
+
} from 'foremanReact/redux/API/APISelectors';
|
6
|
+
import { STATUS } from 'foremanReact/constants';
|
7
|
+
import { HOST_INSTALLABLE_DEBS_KEY } from './InstallableDebsConstants';
|
8
|
+
|
9
|
+
export const selectHostInstallableDebs = state =>
|
10
|
+
selectAPIResponse(state, HOST_INSTALLABLE_DEBS_KEY) || {};
|
11
|
+
|
12
|
+
export const selectHostInstallableDebsStatus = state =>
|
13
|
+
selectAPIStatus(state, HOST_INSTALLABLE_DEBS_KEY) || STATUS.PENDING;
|
14
|
+
|
15
|
+
export const selectHostInstallableDebsError = state =>
|
16
|
+
selectAPIError(state, HOST_INSTALLABLE_DEBS_KEY);
|
@@ -47,14 +47,7 @@ import {
|
|
47
47
|
userPermissionsFromHostDetails,
|
48
48
|
} from '../../hostDetailsHelpers';
|
49
49
|
|
50
|
-
const
|
51
|
-
os.match(/RedHat|RHEL|CentOS|Rocky|AlmaLinux|Oracle Linux/i) && Number(version) > 7;
|
52
|
-
export const hideModuleStreamsTab = ({ hostDetails }) => {
|
53
|
-
const osMatch = hostDetails?.operatingsystem_name?.match(/(\D+) (\d+)/);
|
54
|
-
if (!osMatch) return false;
|
55
|
-
const [, os, version] = osMatch;
|
56
|
-
return !(osMatch && moduleStreamSupported({ os, version }));
|
57
|
-
};
|
50
|
+
export const hideModuleStreamsTab = ({ hostDetails }) => !(hostDetails?.operatingsystem_family === 'Redhat' && Number(hostDetails?.operatingsystem_major > 7));
|
58
51
|
|
59
52
|
const EnabledIcon = ({ streamText, streamInstallStatus, upgradable }) => {
|
60
53
|
switch (true) {
|