katello 4.7.2 → 4.8.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/controllers/katello/api/registry/registry_proxies_controller.rb +6 -4
- data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +15 -12
- data/app/controllers/katello/api/v2/capsule_content_controller.rb +0 -4
- data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +22 -81
- data/app/controllers/katello/api/v2/content_exports_controller.rb +11 -80
- data/app/controllers/katello/api/v2/content_imports_controller.rb +1 -0
- data/app/controllers/katello/api/v2/exports_controller.rb +130 -0
- data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +7 -8
- data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +8 -4
- data/app/controllers/katello/api/v2/organizations_controller.rb +3 -0
- data/app/controllers/katello/api/v2/package_groups_controller.rb +0 -52
- data/app/controllers/katello/concerns/api/v2/bulk_hosts_extensions.rb +4 -6
- data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +1 -2
- data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +4 -1
- data/app/controllers/katello/concerns/content_facet_hosts_controller_extensions.rb +24 -0
- data/app/controllers/katello/concerns/hosts_controller_extensions.rb +3 -3
- data/app/helpers/katello/hosts_and_hostgroups_helper.rb +55 -24
- data/app/helpers/katello/katello_urls_helper.rb +0 -15
- data/app/helpers/katello/sync_management_helper.rb +0 -4
- data/app/lib/actions/candlepin/environment/set_content.rb +7 -1
- data/app/lib/actions/candlepin/owner/destroy_imports.rb +1 -1
- data/app/lib/actions/katello/capsule_content/sync.rb +0 -4
- data/app/lib/actions/katello/capsule_content/sync_capsule.rb +1 -2
- data/app/lib/actions/katello/content_view/publish.rb +6 -2
- data/app/lib/actions/katello/content_view/remove.rb +8 -2
- data/app/lib/actions/katello/content_view_version/destroy.rb +1 -1
- data/app/lib/actions/katello/environment/destroy.rb +8 -2
- data/app/lib/actions/katello/host/reassign.rb +4 -2
- data/app/lib/actions/katello/orphan_cleanup/remove_orphans.rb +0 -1
- data/app/lib/actions/katello/product/destroy.rb +2 -1
- data/app/lib/actions/katello/repository/filtered_index_content.rb +2 -10
- data/app/lib/actions/katello/repository/import_upload.rb +0 -1
- data/app/lib/actions/katello/repository/sync.rb +0 -1
- data/app/lib/actions/katello/repository/update.rb +5 -3
- data/app/lib/actions/katello/repository/upload_files.rb +0 -1
- data/app/lib/actions/pulp3/abstract.rb +0 -6
- data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +1 -2
- data/app/lib/actions/pulp3/content_view_version/create_syncable_export_history.rb +4 -0
- data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +1 -0
- data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +7 -2
- data/app/lib/actions/pulp3/orchestration/content_view_version/syncable_export.rb +7 -2
- data/app/lib/actions/pulp3/repository/refresh_distribution.rb +1 -2
- data/app/lib/actions/pulp3/repository/save_distribution_references.rb +2 -2
- data/app/lib/katello/concerns/renderer_extensions.rb +1 -1
- data/app/lib/katello/event_daemon/runner.rb +12 -9
- data/app/lib/katello/resources/candlepin/consumer.rb +6 -6
- data/app/lib/katello/resources/candlepin/owner.rb +1 -1
- data/app/lib/katello/resources/candlepin/upstream_consumer.rb +3 -4
- data/app/lib/katello/resources/candlepin.rb +4 -4
- data/app/lib/katello/util/errata.rb +12 -10
- data/app/lib/katello/util/search.rb +0 -1
- data/app/lib/katello/validators/content_view_environment_org_validator.rb +5 -2
- data/app/lib/katello/validators/content_view_environment_validator.rb +1 -2
- data/app/lib/katello/validators/generated_content_view_validator.rb +16 -0
- data/app/mailers/katello/errata_mailer.rb +4 -2
- data/app/models/katello/alternate_content_source.rb +5 -1
- data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -14
- data/app/models/katello/concerns/host_managed_extensions.rb +17 -8
- data/app/models/katello/concerns/redhat_extensions.rb +16 -6
- data/app/models/katello/concerns/smart_proxy_extensions.rb +0 -12
- data/app/models/katello/concerns/subscription_facet_host_extensions.rb +1 -0
- data/app/models/katello/content_view.rb +22 -5
- data/app/models/katello/content_view_environment.rb +11 -2
- data/app/models/katello/content_view_environment_content_facet.rb +9 -0
- data/app/models/katello/content_view_version.rb +10 -5
- data/app/models/katello/erratum.rb +6 -1
- data/app/models/katello/glue/candlepin/pool.rb +6 -0
- data/app/models/katello/glue/candlepin/product.rb +7 -1
- data/app/models/katello/glue/candlepin/subscription.rb +5 -0
- data/app/models/katello/glue/provider.rb +26 -26
- data/app/models/katello/host/content_facet.rb +106 -18
- data/app/models/katello/host/info_provider.rb +25 -21
- data/app/models/katello/host/subscription_facet.rb +18 -14
- data/app/models/katello/kt_environment.rb +12 -7
- data/app/models/katello/package_group.rb +0 -12
- data/app/models/katello/pool.rb +4 -1
- data/app/models/katello/product.rb +11 -1
- data/app/models/katello/repository.rb +11 -11
- data/app/models/katello/root_repository.rb +5 -4
- data/app/models/katello/task_status.rb +0 -18
- data/app/services/katello/candlepin/consumer.rb +2 -2
- data/app/services/katello/host/package_profile_uploader.rb +1 -1
- data/app/services/katello/product_content_finder.rb +11 -8
- data/app/services/katello/pulp3/content_view_version/export.rb +8 -65
- data/app/services/katello/pulp3/content_view_version/export_validation_error.rb +7 -0
- data/app/services/katello/pulp3/content_view_version/export_validator.rb +105 -0
- data/app/services/katello/pulp3/content_view_version/importable_products.rb +1 -1
- data/app/services/katello/pulp3/content_view_version/syncable_format_export.rb +7 -1
- data/app/services/katello/pulp3/erratum.rb +1 -0
- data/app/services/katello/pulp3/module_stream.rb +26 -11
- data/app/services/katello/pulp3/repository/yum.rb +2 -1
- data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +2 -1
- data/app/services/katello/registration_manager.rb +46 -26
- data/app/services/katello/repository_type.rb +3 -9
- data/app/services/katello/simple_package.rb +22 -0
- data/app/views/foreman/smart_proxies/_content_sync.html.erb +1 -0
- data/app/views/foreman/smart_proxies/_reclaim_space.html.erb +1 -0
- data/app/views/katello/api/v2/content_facet/base.json.rabl +23 -2
- data/app/views/katello/api/v2/content_facet/show.json.rabl +11 -8
- data/app/views/katello/api/v2/content_views/base.json.rabl +1 -1
- data/app/views/katello/api/v2/hosts/base.json.rabl +22 -2
- data/app/views/overrides/activation_keys/_host_environment_select.html.erb +2 -2
- data/config/initializers/monkeys.rb +0 -2
- data/config/routes/api/registry.rb +8 -7
- data/config/routes/api/v2.rb +0 -2
- data/config/routes.rb +3 -0
- data/db/migrate/20200429153103_installed_package_bad_nvrea.rb +1 -1
- data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +7 -3
- data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +1 -1
- data/db/migrate/20220929204746_add_content_view_environment_content_facet.rb +52 -0
- data/db/migrate/20221123212341_remove_pulp_docker_registry_port_setting.rb +5 -0
- data/db/seeds.d/111-upgrade_tasks.rb +2 -1
- data/engines/bastion/app/assets/stylesheets/bastion/bastion.scss +4 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +2 -4
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-errata-modal.controller.js +0 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +2 -4
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +11 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/views/host-collection-hosts-list.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +8 -4
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +5485 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +5397 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +5658 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +5284 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ka.po +5231 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +5275 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +5389 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +5212 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +5145 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +9 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +2 -2
- data/lib/katello/engine.rb +2 -1
- data/lib/katello/permission_creator.rb +2 -4
- data/lib/katello/permissions/registry_permissions.rb +5 -5
- data/lib/katello/plugin.rb +22 -14
- data/lib/katello/repository_types/README.md +136 -19
- data/lib/katello/repository_types/deb.rb +0 -1
- data/lib/katello/repository_types/docker.rb +0 -1
- data/lib/katello/repository_types/file.rb +0 -1
- data/lib/katello/repository_types/yum.rb +0 -4
- data/lib/katello/tasks/clean_candlepin_orphaned_products.rake +38 -0
- data/lib/katello/tasks/clean_orphaned_facets.rb +20 -0
- data/lib/katello/tasks/reimport.rake +1 -2
- data/lib/katello/tasks/repository.rake +1 -22
- data/lib/katello/tasks/reset.rake +1 -0
- data/lib/katello/tasks/upgrades/4.8/fix_incorrect_providers.rake +29 -0
- data/lib/katello/version.rb +1 -1
- data/lib/katello.rb +0 -5
- data/locale/bn/katello.po +69 -27
- data/locale/cs/katello.po +69 -27
- data/locale/de/katello.po +78 -36
- data/locale/en/katello.po +69 -27
- data/locale/es/katello.po +70 -28
- data/locale/fr/katello.po +73 -31
- data/locale/gu/katello.po +69 -27
- data/locale/hi/katello.po +69 -27
- data/locale/it/katello.po +69 -27
- data/locale/ja/katello.po +73 -31
- data/locale/ka/katello.po +73 -31
- data/locale/katello.pot +335 -262
- data/locale/kn/katello.po +69 -27
- data/locale/ko/katello.po +69 -27
- data/locale/mr/katello.po +69 -27
- data/locale/or/katello.po +69 -27
- data/locale/pa/katello.po +69 -27
- data/locale/pt/katello.po +69 -27
- data/locale/pt_BR/katello.po +70 -28
- data/locale/ru/katello.po +70 -28
- data/locale/ta/katello.po +69 -27
- data/locale/te/katello.po +69 -27
- data/locale/zh_CN/katello.po +73 -31
- data/locale/zh_TW/katello.po +70 -28
- data/webpack/components/Content/ContentPage.js +51 -35
- data/webpack/components/Content/__tests__/ContentPage.test.js +2 -4
- data/webpack/components/Content/__tests__/__snapshots__/ContentPage.test.js.snap +22 -3
- data/webpack/components/RoutedTabs/index.js +6 -11
- data/webpack/components/Table/EmptyStateMessage.js +14 -11
- data/webpack/components/Table/MainTable.js +36 -15
- data/webpack/components/Table/TableWrapper.js +25 -25
- data/webpack/components/Table/__test__/emptyStateMessage.test.js +51 -0
- data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +5 -4
- data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +1 -1
- data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +1 -17
- data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +18 -9
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +1 -2
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +1 -2
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +1 -2
- data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +47 -27
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +1 -2
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +2 -21
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +1 -28
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +1 -10
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +2 -19
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +1 -17
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +1 -15
- data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +7 -0
- data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/Force.test.js.snap +2 -0
- data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/IgnoreSubmanErrors.test.js.snap +2 -0
- data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/LifeCycleEnvironment.test.js.snap +1 -0
- data/webpack/global_test_setup.js +1 -1
- data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +12 -17
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +17 -3
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +6 -0
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +1 -0
- data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +3 -10
- data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +1 -0
- data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +3 -3
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +1 -0
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +12 -4
- data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +7 -4
- data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +4 -8
- data/webpack/scenes/AlternateContentSources/helpers.js +1 -1
- data/webpack/scenes/Content/Details/ContentRepositories.js +5 -4
- data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +1 -12
- data/webpack/scenes/Content/Table/ContentTable.js +2 -1
- data/webpack/scenes/Content/__tests__/contentTable.test.js +1 -14
- data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +1 -25
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +44 -31
- data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +2 -0
- data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +6 -1
- data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +2 -1
- data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +2 -1
- data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +2 -2
- data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +5 -3
- data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +3 -1
- data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +3 -1
- data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +2 -1
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +2 -0
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVDebMatchContentModal.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +35 -33
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +48 -45
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +58 -24
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +64 -0
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +36 -20
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +40 -23
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +0 -13
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +0 -13
- data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +2 -1
- data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +1 -10
- data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -1
- data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +1 -10
- data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +21 -9
- data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +4 -0
- data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionCompare.test.js +1 -32
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +3 -1
- data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +1 -15
- data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -1
- data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -2
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -9
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +4 -0
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +30 -14
- data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +1 -1
- data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +55 -120
- data/webpack/scenes/ContentViews/components/WizardHeader.js +1 -1
- data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +1 -1
- data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +8 -1
- data/webpack/scenes/ModuleStreams/ModuleStreamsPage.js +3 -9
- data/webpack/scenes/ModuleStreams/__tests__/__snapshots__/ModuleStreamPage.test.js.snap +7 -1
- data/webpack/scenes/RedHatRepositories/components/Search.js +22 -16
- data/webpack/scenes/RedHatRepositories/index.scss +20 -1
- data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +12 -1
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +1 -1
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CustomCdnTypeForm.js +1 -1
- data/webpack/scenes/Subscriptions/SubscriptionsPage.js +21 -19
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +34 -1
- data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +20 -7
- data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.test.js +0 -1
- data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/__snapshots__/SubscriptionsToolbar.test.js.snap +65 -15
- metadata +47 -113
- data/app/lib/actions/katello/pulp_selector.rb +0 -24
- data/app/lib/actions/katello/repository/correct_checksum.rb +0 -24
- data/app/lib/actions/katello/repository/destroy_package_group.rb +0 -26
- data/app/lib/actions/katello/repository/upload_package_group.rb +0 -24
- data/app/lib/actions/pulp/abstract.rb +0 -37
- data/app/lib/actions/pulp/abstract_async_task.rb +0 -154
- data/app/lib/actions/pulp/abstract_async_task_group.rb +0 -94
- data/app/lib/actions/pulp/consumer/sync_capsule.rb +0 -45
- data/app/lib/actions/pulp/consumer/unassociate_units.rb +0 -20
- data/app/lib/actions/pulp/expect_one_task.rb +0 -11
- data/app/lib/actions/pulp/orchestration/orphan_cleanup/remove_orphans.rb +0 -16
- data/app/lib/actions/pulp/orchestration/repository/copy_all_units.rb +0 -19
- data/app/lib/actions/pulp/orchestration/repository/delete.rb +0 -15
- data/app/lib/actions/pulp/orchestration/repository/refresh.rb +0 -14
- data/app/lib/actions/pulp/orchestration/repository/refresh_if_needed.rb +0 -13
- data/app/lib/actions/pulp/orchestration/repository/refresh_repos.rb +0 -19
- data/app/lib/actions/pulp/orchestration/repository/remove_units.rb +0 -14
- data/app/lib/actions/pulp/orchestration/repository/smart_proxy_sync.rb +0 -34
- data/app/lib/actions/pulp/orchestration/repository/sync.rb +0 -18
- data/app/lib/actions/pulp/orchestration/repository/upload_content.rb +0 -37
- data/app/lib/actions/pulp/orphan_cleanup/remove_orphans.rb +0 -15
- data/app/lib/actions/pulp/orphan_cleanup/remove_unneeded_repos.rb +0 -16
- data/app/lib/actions/pulp/repository/abstract_copy_content.rb +0 -45
- data/app/lib/actions/pulp/repository/abstract_remove_content.rb +0 -32
- data/app/lib/actions/pulp/repository/clear.rb +0 -18
- data/app/lib/actions/pulp/repository/copy_all_units.rb +0 -30
- data/app/lib/actions/pulp/repository/copy_units.rb +0 -25
- data/app/lib/actions/pulp/repository/create.rb +0 -28
- data/app/lib/actions/pulp/repository/create_in_plan.rb +0 -15
- data/app/lib/actions/pulp/repository/create_upload_request.rb +0 -20
- data/app/lib/actions/pulp/repository/delete_upload_request.rb +0 -19
- data/app/lib/actions/pulp/repository/destroy.rb +0 -28
- data/app/lib/actions/pulp/repository/distributor_publish.rb +0 -25
- data/app/lib/actions/pulp/repository/download.rb +0 -16
- data/app/lib/actions/pulp/repository/import_upload.rb +0 -19
- data/app/lib/actions/pulp/repository/presenters/abstract_sync_presenter.rb +0 -47
- data/app/lib/actions/pulp/repository/presenters/deb_presenter.rb +0 -95
- data/app/lib/actions/pulp/repository/presenters/docker_presenter.rb +0 -103
- data/app/lib/actions/pulp/repository/presenters/file_unit_presenter.rb +0 -42
- data/app/lib/actions/pulp/repository/presenters/yum_presenter.rb +0 -131
- data/app/lib/actions/pulp/repository/refresh.rb +0 -21
- data/app/lib/actions/pulp/repository/regenerate_applicability.rb +0 -21
- data/app/lib/actions/pulp/repository/remove_distribution.rb +0 -11
- data/app/lib/actions/pulp/repository/remove_units.rb +0 -44
- data/app/lib/actions/pulp/repository/sync.rb +0 -99
- data/app/lib/actions/pulp/repository/upload_file.rb +0 -28
- data/app/lib/actions/pulp/repository_group/create.rb +0 -31
- data/app/lib/actions/pulp/repository_group/delete.rb +0 -17
- data/app/lib/actions/pulp/repository_group/export.rb +0 -51
- data/app/lib/katello/util/package_clause_generator.rb +0 -77
- data/app/models/katello/glue/pulp/pulp_errors.rb +0 -9
- data/app/models/katello/glue/pulp/repo.rb +0 -353
- data/app/models/katello/pulp_sync_status.rb +0 -165
- data/app/models/katello/pulp_task_status.rb +0 -63
- data/app/services/katello/pulp/content.rb +0 -24
- data/app/services/katello/pulp/importer_comparison.rb +0 -28
- data/app/services/katello/pulp/repository/deb.rb +0 -61
- data/app/services/katello/pulp/repository/docker.rb +0 -82
- data/app/services/katello/pulp/repository/file.rb +0 -52
- data/app/services/katello/pulp/repository/yum.rb +0 -205
- data/app/services/katello/pulp/repository.rb +0 -327
- data/app/services/katello/pulp/server.rb +0 -35
- data/app/services/katello/pulp/simple_package.rb +0 -24
- data/app/services/katello/pulp/smart_proxy_repository.rb +0 -52
- data/lib/monkeys/fix_deb_optimized_sync.rb +0 -35
- data/lib/monkeys/fix_pulp_container_path.rb +0 -35
- data/locale/zanata.xml +0 -30
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentSearch.fixtures.json +0 -33
@@ -40,7 +40,6 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
40
40
|
const [caCertName, setCACertName] = useState('');
|
41
41
|
const [productIds, setProductIds] = useState([]);
|
42
42
|
const [productNames, setProductNames] = useState([]);
|
43
|
-
const [currentStep, setCurrentStep] = useState(1);
|
44
43
|
const dispatch = useDispatch();
|
45
44
|
|
46
45
|
useEffect(
|
@@ -52,6 +51,11 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
52
51
|
[dispatch],
|
53
52
|
);
|
54
53
|
|
54
|
+
const subPathValidated = areSubPathsValid(subpaths) ? 'default' : 'error';
|
55
|
+
const urlValidated = (url === '' || isValidUrl(url, acsType)) ? 'default' : 'error';
|
56
|
+
|
57
|
+
const urlAndPathsValid = () => url !== '' && urlValidated !== 'error' && subPathValidated !== 'error';
|
58
|
+
|
55
59
|
const credentialsFilled = () => {
|
56
60
|
if (authentication === 'manual') {
|
57
61
|
return username !== '';
|
@@ -59,9 +63,6 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
59
63
|
return true;
|
60
64
|
};
|
61
65
|
|
62
|
-
const subPathValidated = areSubPathsValid(subpaths) ? 'default' : 'error';
|
63
|
-
const urlValidated = (url === '' || isValidUrl(url)) ? 'default' : 'error';
|
64
|
-
|
65
66
|
const sourceTypeStep = {
|
66
67
|
id: 1,
|
67
68
|
name: __('Select source type'),
|
@@ -89,7 +90,7 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
89
90
|
id: 4,
|
90
91
|
name: __('Select products'),
|
91
92
|
component: <ACSProducts />,
|
92
|
-
canJumpTo: smartProxies.length,
|
93
|
+
canJumpTo: smartProxies.length && name !== '',
|
93
94
|
enableNext: productIds.length,
|
94
95
|
};
|
95
96
|
|
@@ -97,16 +98,16 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
97
98
|
id: 5,
|
98
99
|
name: __('URL and paths'),
|
99
100
|
component: <AcsUrlPaths />,
|
100
|
-
canJumpTo: (acsType === 'custom' || acsType === 'rhui') && (smartProxies.length),
|
101
|
-
enableNext:
|
101
|
+
canJumpTo: (acsType === 'custom' || acsType === 'rhui') && (smartProxies.length) && name !== '',
|
102
|
+
enableNext: urlAndPathsValid(),
|
102
103
|
};
|
103
104
|
|
104
105
|
const credentialsStep = {
|
105
106
|
id: 6,
|
106
107
|
name: __('Credentials'),
|
107
108
|
component: <ACSCredentials />,
|
108
|
-
canJumpTo:
|
109
|
-
enableNext: (
|
109
|
+
canJumpTo: urlAndPathsValid() && (smartProxies.length) && name !== '',
|
110
|
+
enableNext: (urlAndPathsValid() || productIds.length) && smartProxies.length && name !== '' && acsType && contentType && credentialsFilled(),
|
110
111
|
};
|
111
112
|
|
112
113
|
const reviewStep = {
|
@@ -114,8 +115,8 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
114
115
|
name: __('Review details'),
|
115
116
|
component: <ACSReview />,
|
116
117
|
nextButtonText: __('Add'),
|
117
|
-
canJumpTo: (
|
118
|
-
enableNext: (
|
118
|
+
canJumpTo: (urlAndPathsValid() || productIds.length) && smartProxies.length && name !== '' && acsType && contentType && credentialsFilled(),
|
119
|
+
enableNext: (urlAndPathsValid() || productIds.length) && smartProxies.length && name !== '' && acsType && contentType,
|
119
120
|
};
|
120
121
|
|
121
122
|
const finishStep = {
|
@@ -139,8 +140,6 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
139
140
|
<ACSCreateContext.Provider value={{
|
140
141
|
show,
|
141
142
|
setIsOpen,
|
142
|
-
currentStep,
|
143
|
-
setCurrentStep,
|
144
143
|
acsType,
|
145
144
|
setAcsType,
|
146
145
|
contentType,
|
@@ -186,10 +185,6 @@ const ACSCreateWizard = ({ show, setIsOpen }) => {
|
|
186
185
|
<Wizard
|
187
186
|
title={__('Add an alternate content source')}
|
188
187
|
steps={steps}
|
189
|
-
startAtStep={currentStep}
|
190
|
-
onGoToStep={({ id }) => setCurrentStep(id)}
|
191
|
-
onNext={({ id }) => setCurrentStep(id)}
|
192
|
-
onBack={({ id }) => setCurrentStep(id)}
|
193
188
|
onClose={() => {
|
194
189
|
setIsOpen(false);
|
195
190
|
}}
|
@@ -1,7 +1,9 @@
|
|
1
1
|
import React, { useCallback, useContext, useState } from 'react';
|
2
2
|
import { useDispatch, useSelector } from 'react-redux';
|
3
3
|
import { useHistory } from 'react-router-dom';
|
4
|
+
import PropTypes from 'prop-types';
|
4
5
|
import useDeepCompareEffect from 'use-deep-compare-effect';
|
6
|
+
import { WizardContextConsumer } from '@patternfly/react-core';
|
5
7
|
import { translate as __ } from 'foremanReact/common/I18n';
|
6
8
|
import { STATUS } from 'foremanReact/constants';
|
7
9
|
import ACSCreateContext from '../ACSCreateContext';
|
@@ -9,10 +11,16 @@ import { selectCreateACS, selectCreateACSError, selectCreateACSStatus } from '..
|
|
9
11
|
import getAlternateContentSources, { createACS } from '../../ACSActions';
|
10
12
|
import Loading from '../../../../components/Loading';
|
11
13
|
|
12
|
-
const
|
14
|
+
const ACSCreateFinishWrapper = () => (
|
15
|
+
<WizardContextConsumer>
|
16
|
+
{({ activeStep }) => <ACSCreateFinish activeStep={activeStep} />}
|
17
|
+
</WizardContextConsumer>
|
18
|
+
);
|
19
|
+
|
20
|
+
const ACSCreateFinish = ({ activeStep }) => {
|
13
21
|
const { push } = useHistory();
|
22
|
+
const currentStep = activeStep.id;
|
14
23
|
const {
|
15
|
-
currentStep,
|
16
24
|
setIsOpen,
|
17
25
|
acsType,
|
18
26
|
contentType,
|
@@ -94,4 +102,10 @@ const ACSCreateFinish = () => {
|
|
94
102
|
return <Loading loadingText={__('Saving alternate content source...')} />;
|
95
103
|
};
|
96
104
|
|
97
|
-
|
105
|
+
ACSCreateFinish.propTypes = {
|
106
|
+
activeStep: PropTypes.shape({
|
107
|
+
id: PropTypes.number.isRequired,
|
108
|
+
}).isRequired,
|
109
|
+
};
|
110
|
+
|
111
|
+
export default ACSCreateFinishWrapper;
|
@@ -47,6 +47,7 @@ const ACSCredentials = () => {
|
|
47
47
|
<Radio
|
48
48
|
label={__('Manual authentication')}
|
49
49
|
id="manual_auth"
|
50
|
+
ouiaId="manual_auth"
|
50
51
|
name="manual_auth"
|
51
52
|
aria-label="manual_auth"
|
52
53
|
isChecked={authentication === 'manual'}
|
@@ -71,6 +72,7 @@ const ACSCredentials = () => {
|
|
71
72
|
isRequired
|
72
73
|
type="text"
|
73
74
|
id="acs_username_field"
|
75
|
+
ouiaId="acs_username_field"
|
74
76
|
name="acs_username_field"
|
75
77
|
aria-label="acs_username_field"
|
76
78
|
value={username}
|
@@ -87,6 +89,7 @@ const ACSCredentials = () => {
|
|
87
89
|
isRequired
|
88
90
|
type="password"
|
89
91
|
id="acs_password_field"
|
92
|
+
ouiaId="acs_password_field"
|
90
93
|
name="acs_password_field"
|
91
94
|
aria-label="acs_password_field"
|
92
95
|
value={password}
|
@@ -98,6 +101,7 @@ const ACSCredentials = () => {
|
|
98
101
|
<Radio
|
99
102
|
label={__('Content credentials')}
|
100
103
|
id="content_credentials"
|
104
|
+
ouiaId="content_credentials"
|
101
105
|
aria-label="content_credentials"
|
102
106
|
name="content_cred_auth"
|
103
107
|
isChecked={authentication === 'content_credentials'}
|
@@ -163,6 +167,7 @@ const ACSCredentials = () => {
|
|
163
167
|
label={__('None')}
|
164
168
|
id="none"
|
165
169
|
name="none"
|
170
|
+
ouiaId="none"
|
166
171
|
aria-label="none"
|
167
172
|
isChecked={authentication === ''}
|
168
173
|
onChange={() => {
|
@@ -178,6 +183,7 @@ const ACSCredentials = () => {
|
|
178
183
|
<FormGroup label={__('Verify SSL')} fieldId="verify_ssl">
|
179
184
|
<Switch
|
180
185
|
id="verify-ssl-switch"
|
186
|
+
ouiaId="verify-ssl-switch"
|
181
187
|
aria-label="verify-ssl-switch"
|
182
188
|
isChecked={verifySSL}
|
183
189
|
onChange={checked => setVerifySSL(checked)}
|
@@ -16,16 +16,8 @@ const AcsUrlPaths = () => {
|
|
16
16
|
acsType, url, setUrl, subpaths, setSubpaths,
|
17
17
|
} = useContext(ACSCreateContext);
|
18
18
|
|
19
|
+
const urlValidated = (url === '' || isValidUrl(url, acsType)) ? 'default' : 'error';
|
19
20
|
const subPathValidated = areSubPathsValid(subpaths) ? 'default' : 'error';
|
20
|
-
const [urlValidated, setUrlValidated] = React.useState('default');
|
21
|
-
const handleUrlChange = (newUrl, _event) => {
|
22
|
-
setUrl(newUrl);
|
23
|
-
if (isValidUrl(newUrl, acsType)) {
|
24
|
-
setUrlValidated('success');
|
25
|
-
} else {
|
26
|
-
setUrlValidated('error');
|
27
|
-
}
|
28
|
-
};
|
29
21
|
|
30
22
|
const baseURLplaceholder = acsType === 'rhui' ?
|
31
23
|
'https://rhui-server.example.com/pulp/content' :
|
@@ -57,12 +49,13 @@ const AcsUrlPaths = () => {
|
|
57
49
|
isRequired
|
58
50
|
type="url"
|
59
51
|
id="acs_base_url_field"
|
52
|
+
ouiaId="acs_base_url_field"
|
60
53
|
name="acs_base_url_field"
|
61
54
|
aria-label="acs_base_url_field"
|
62
55
|
placeholder={baseURLplaceholder}
|
63
56
|
value={url}
|
64
57
|
validated={urlValidated}
|
65
|
-
onChange={
|
58
|
+
onChange={value => setUrl(value)}
|
66
59
|
/>
|
67
60
|
</FormGroup>
|
68
61
|
{acsType === 'rhui' &&
|
@@ -45,7 +45,7 @@ const createSimplifiedACSDetails = {
|
|
45
45
|
const createRHUIACSDetails = {
|
46
46
|
name: 'acs_rhui_test',
|
47
47
|
description: '',
|
48
|
-
base_url: 'https://test_url.com/',
|
48
|
+
base_url: 'https://test_url.com/pulp/content',
|
49
49
|
subpaths: ['test/repo1/', 'test/repo2/'],
|
50
50
|
smart_proxy_names: ['centos7-katello-devel-stable.example.com'],
|
51
51
|
content_type: 'yum',
|
@@ -297,8 +297,8 @@ test('Can display create wizard and create RHUI ACS', async (done) => {
|
|
297
297
|
// Go to URL and subpath step
|
298
298
|
fireEvent.click(getByText('Next'));
|
299
299
|
|
300
|
-
fireEvent.change(getByLabelText('acs_base_url_field'), { target: { value: 'https://test_url.com/' } });
|
301
|
-
expect(getByLabelText('acs_base_url_field')).toHaveAttribute('value', 'https://test_url.com/');
|
300
|
+
fireEvent.change(getByLabelText('acs_base_url_field'), { target: { value: 'https://test_url.com/pulp/content' } });
|
301
|
+
expect(getByLabelText('acs_base_url_field')).toHaveAttribute('value', 'https://test_url.com/pulp/content');
|
302
302
|
fireEvent.change(getByLabelText('acs_subpath_field'), { target: { value: 'test/repo1/,test/repo2/' } });
|
303
303
|
|
304
304
|
// Mock content credential data
|
@@ -7,13 +7,19 @@ import { editACS, getACSDetails } from '../../ACSActions';
|
|
7
7
|
import { areSubPathsValid, isValidUrl } from '../../helpers';
|
8
8
|
|
9
9
|
const ACSEditURLPaths = ({ onClose, acsId, acsDetails }) => {
|
10
|
-
const { subpaths, base_url: url } = acsDetails;
|
10
|
+
const { subpaths, base_url: url, alternate_content_source_type: acsType } = acsDetails;
|
11
11
|
const dispatch = useDispatch();
|
12
12
|
const [acsUrl, setAcsUrl] = useState(url);
|
13
13
|
const [acsSubpath, setAcsSubpath] = useState(subpaths.join() || '');
|
14
14
|
const [saving, setSaving] = useState(false);
|
15
15
|
const subPathValidated = areSubPathsValid(acsSubpath) ? 'default' : 'error';
|
16
|
-
const urlValidated = (acsUrl === '' || isValidUrl(acsUrl)) ? 'default' : 'error';
|
16
|
+
const urlValidated = (acsUrl === '' || isValidUrl(acsUrl, acsType)) ? 'default' : 'error';
|
17
|
+
const baseURLplaceholder = acsType === 'rhui' ?
|
18
|
+
'https://rhui-server.example.com/pulp/content' :
|
19
|
+
'http:// or https://';
|
20
|
+
const helperTextInvalid = acsType === 'rhui' ?
|
21
|
+
'http://rhui-server.example.com/pulp/content or https://rhui-server.example.com/pulp/content' :
|
22
|
+
'http://, https:// or file://';
|
17
23
|
|
18
24
|
const onSubmit = () => {
|
19
25
|
setSaving(true);
|
@@ -56,7 +62,7 @@ const ACSEditURLPaths = ({ onClose, acsId, acsDetails }) => {
|
|
56
62
|
label={__('Base URL')}
|
57
63
|
type="string"
|
58
64
|
fieldId="acs_base_url"
|
59
|
-
helperTextInvalid=
|
65
|
+
helperTextInvalid={helperTextInvalid}
|
60
66
|
validated={urlValidated}
|
61
67
|
isRequired
|
62
68
|
>
|
@@ -66,7 +72,7 @@ const ACSEditURLPaths = ({ onClose, acsId, acsDetails }) => {
|
|
66
72
|
id="acs_base_url_field"
|
67
73
|
name="acs_base_url_field"
|
68
74
|
aria-label="acs_base_url_field"
|
69
|
-
placeholder=
|
75
|
+
placeholder={baseURLplaceholder}
|
70
76
|
value={acsUrl}
|
71
77
|
validated={urlValidated}
|
72
78
|
onChange={value => setAcsUrl(value)}
|
@@ -119,12 +125,14 @@ ACSEditURLPaths.propTypes = {
|
|
119
125
|
acsDetails: PropTypes.shape({
|
120
126
|
base_url: PropTypes.string,
|
121
127
|
subpaths: PropTypes.arrayOf(PropTypes.string),
|
128
|
+
alternate_content_source_type: PropTypes.string,
|
122
129
|
id: PropTypes.number,
|
123
130
|
}),
|
124
131
|
};
|
125
132
|
|
126
133
|
ACSEditURLPaths.defaultProps = {
|
127
134
|
acsDetails: {
|
135
|
+
alternate_content_source_type: '',
|
128
136
|
base_url: '',
|
129
137
|
subpaths: '',
|
130
138
|
id: undefined,
|
@@ -162,7 +162,7 @@ const ACSTable = () => {
|
|
162
162
|
<DrawerHead>
|
163
163
|
{results && isExpanded &&
|
164
164
|
<div ref={drawerRef}>
|
165
|
-
<Text component={TextVariants.h1} style={{ marginTop: '0px', fontWeight: 'bold' }}>
|
165
|
+
<Text ouiaId="acs-name-text" component={TextVariants.h1} style={{ marginTop: '0px', fontWeight: 'bold' }}>
|
166
166
|
{acs?.name}
|
167
167
|
</Text>
|
168
168
|
<TextContent>
|
@@ -320,11 +320,13 @@ const ACSTable = () => {
|
|
320
320
|
fetchItems,
|
321
321
|
showPrimaryAction,
|
322
322
|
primaryActionButton,
|
323
|
+
selectedCount,
|
323
324
|
}}
|
324
325
|
ouiaId="alternate-content-sources-table"
|
325
326
|
variant={TableVariant.compact}
|
326
327
|
additionalListeners={[activeSortColumn, activeSortDirection]}
|
327
|
-
autocompleteEndpoint="/alternate_content_sources
|
328
|
+
autocompleteEndpoint="/katello/api/v2/alternate_content_sources"
|
329
|
+
bookmarkController="katello_alternate_content_sources"
|
328
330
|
{...selectionSetVars}
|
329
331
|
actionButtons={
|
330
332
|
<>
|
@@ -384,7 +386,7 @@ const ACSTable = () => {
|
|
384
386
|
hideSearch={!canView}
|
385
387
|
>
|
386
388
|
<Thead>
|
387
|
-
<Tr>
|
389
|
+
<Tr ouiaId="acs-table-column-headers-row">
|
388
390
|
<Th
|
389
391
|
key="acs-checkbox"
|
390
392
|
style={{ width: 0 }}
|
@@ -415,6 +417,7 @@ const ACSTable = () => {
|
|
415
417
|
return (
|
416
418
|
<Tr
|
417
419
|
key={index}
|
420
|
+
ouiaId={`acs-row-${id}`}
|
418
421
|
style={isSingleSelected(id) && isExpanded ? customStyle : {}}
|
419
422
|
isStriped={isSingleSelected(id) && isExpanded}
|
420
423
|
>
|
@@ -428,7 +431,7 @@ const ACSTable = () => {
|
|
428
431
|
/>
|
429
432
|
</Td>
|
430
433
|
<Td>
|
431
|
-
<Text onClick={() => onClick(id)} component="a">{name}</Text>
|
434
|
+
<Text onClick={() => onClick(id)} component="a" ouiaId={`acs-link-text-${index}`}>{name}</Text>
|
432
435
|
</Td>
|
433
436
|
<Td>{acsType === 'rhui' ? upperCase(acsType) : capitalize(acsType)}</Td>
|
434
437
|
<Td><LastSync
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
|
2
|
+
import { renderWithRedux, patientlyWaitFor, act } from 'react-testing-lib-wrapper';
|
3
3
|
|
4
|
-
import { nockInstance, assertNockRequest, mockAutocomplete
|
4
|
+
import { nockInstance, assertNockRequest, mockAutocomplete } from '../../../../test-utils/nockWrapper';
|
5
5
|
import api from '../../../../services/api';
|
6
6
|
import ACSTable from '../ACSTable';
|
7
7
|
import acsData from './acsIndex.fixtures.json';
|
@@ -10,8 +10,6 @@ const acsURL = api.getApiUrl('/alternate_content_sources');
|
|
10
10
|
const autocompleteUrl = '/alternate_content_sources/auto_complete_search';
|
11
11
|
|
12
12
|
let firstAcs;
|
13
|
-
let searchDelayScope;
|
14
|
-
let autoSearchScope;
|
15
13
|
|
16
14
|
beforeEach(() => {
|
17
15
|
const { results } = acsData;
|
@@ -24,8 +22,6 @@ test('Can call API and show ACS on page load', async (done) => {
|
|
24
22
|
.get(acsURL)
|
25
23
|
.query(true)
|
26
24
|
.reply(200, acsData);
|
27
|
-
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
28
|
-
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
29
25
|
|
30
26
|
const { getByText, queryByText } = renderWithRedux(<ACSTable />);
|
31
27
|
|
@@ -34,9 +30,8 @@ test('Can call API and show ACS on page load', async (done) => {
|
|
34
30
|
// Assert that the ACS name is now showing on the screen, but wait for it to appear.
|
35
31
|
await patientlyWaitFor(() => expect(getByText(firstAcs.name)).toBeInTheDocument());
|
36
32
|
assertNockRequest(autocompleteScope);
|
37
|
-
assertNockRequest(searchDelayScope);
|
38
|
-
assertNockRequest(autoSearchScope);
|
39
33
|
assertNockRequest(scope, done);
|
34
|
+
act(done);
|
40
35
|
});
|
41
36
|
|
42
37
|
test('Can handle no ACS being present', async (done) => {
|
@@ -62,4 +57,5 @@ test('Can handle no ACS being present', async (done) => {
|
|
62
57
|
expect(queryByLabelText('Select all')).not.toBeInTheDocument();
|
63
58
|
await patientlyWaitFor(() => expect(queryByText("You currently don't have any alternate content sources.")).toBeInTheDocument());
|
64
59
|
assertNockRequest(scope, done);
|
60
|
+
act(done);
|
65
61
|
});
|
@@ -3,7 +3,7 @@ export const isValidUrl = (urlString, acsType = '') => {
|
|
3
3
|
const urlFromString = new URL(urlString);
|
4
4
|
let valid = urlFromString.protocol === 'https:' || urlFromString.protocol === 'http:' || urlFromString.protocol === 'file:';
|
5
5
|
if (acsType === 'rhui') {
|
6
|
-
valid =
|
6
|
+
valid = urlFromString.pathname.endsWith('/pulp/content');
|
7
7
|
}
|
8
8
|
return valid;
|
9
9
|
} catch (e) {
|
@@ -44,21 +44,22 @@ const ContentRepositories = ({ contentType, id, tabKey }) => {
|
|
44
44
|
}}
|
45
45
|
ouiaId="content-repositories-table"
|
46
46
|
variant={TableVariant.compact}
|
47
|
-
autocompleteEndpoint="/repositories
|
47
|
+
autocompleteEndpoint="/katello/api/v2/repositories"
|
48
|
+
bookmarkController="katello_repositories"
|
48
49
|
fetchItems={useCallback(
|
49
50
|
params => getRepositoryContentDetails(typeSingularLabel, id, params),
|
50
51
|
[typeSingularLabel, id],
|
51
52
|
)}
|
52
53
|
>
|
53
54
|
<Thead>
|
54
|
-
<Tr>
|
55
|
+
<Tr ouiaId="content-repositories-column-headers-row">
|
55
56
|
{columnHeaders.map(col =>
|
56
57
|
<Th key={col.title}>{col.title}</Th>)}
|
57
58
|
</Tr>
|
58
59
|
</Thead>
|
59
60
|
<Tbody>
|
60
|
-
{results?.map(details => (
|
61
|
-
<Tr key={`${details.id}`}>
|
61
|
+
{results?.map((details, idx) => (
|
62
|
+
<Tr key={`${details.id}`} ouiaId={`content-repositories-row-${idx}`}>
|
62
63
|
{columnHeaders.map((col, index) =>
|
63
64
|
<Td key={index}>{col.getProperty(details, typeSingularLabel)}</Td>)
|
64
65
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { Route } from 'react-router-dom';
|
3
3
|
import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
|
4
|
-
import { nockInstance, assertNockRequest, mockAutocomplete
|
4
|
+
import { nockInstance, assertNockRequest, mockAutocomplete } from '../../../../test-utils/nockWrapper';
|
5
5
|
import api from '../../../../services/api';
|
6
6
|
import { CONTENT_ID_KEY } from '../../ContentConstants';
|
7
7
|
import ContentDetails from '../ContentDetails';
|
@@ -17,9 +17,6 @@ const contentRepositoryDetailsPath = api.getApiUrl('/repositories');
|
|
17
17
|
|
18
18
|
const withContentRoute = component => <Route path="/content/:content_type([a-z_]+)/:id([0-9]+)">{component}</Route>;
|
19
19
|
|
20
|
-
let searchDelayScope;
|
21
|
-
let autoSearchScope;
|
22
|
-
|
23
20
|
jest.mock('react-intl', () => ({ addLocaleData: () => { }, FormattedDate: () => 'mocked' }));
|
24
21
|
|
25
22
|
test('Can call API for Python package details and show details tab on page load', async (done) => {
|
@@ -59,8 +56,6 @@ test('Can call API for Python package details and show details tab on page load'
|
|
59
56
|
test('Can call API for Python package repository details and show repositories tab', async (done) => {
|
60
57
|
const autocompleteUrl = '/repositories/auto_complete_search';
|
61
58
|
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
|
62
|
-
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
63
|
-
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
64
59
|
|
65
60
|
const results = pythonPackageRepositoryDetailsResponse.results[0];
|
66
61
|
const repoName = results.name;
|
@@ -84,8 +79,6 @@ test('Can call API for Python package repository details and show repositories t
|
|
84
79
|
expect(getAllByText(contentCountWords)[0]).toBeInTheDocument();
|
85
80
|
});
|
86
81
|
|
87
|
-
assertNockRequest(autoSearchScope);
|
88
|
-
assertNockRequest(searchDelayScope);
|
89
82
|
assertNockRequest(autocompleteScope);
|
90
83
|
assertNockRequest(pythonPackageRepositoryDetailsScope, done);
|
91
84
|
});
|
@@ -122,8 +115,6 @@ test('Can call API for Ansible collection details and show details tab on page l
|
|
122
115
|
test('Can call API for Ansible collection repository details and show repositories tab', async (done) => {
|
123
116
|
const autocompleteUrl = '/repositories/auto_complete_search';
|
124
117
|
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
|
125
|
-
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
126
|
-
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
127
118
|
|
128
119
|
const results = ansibleCollectionRepositoryDetailsResponse.results[0];
|
129
120
|
const repoName = results.name;
|
@@ -147,8 +138,6 @@ test('Can call API for Ansible collection repository details and show repositori
|
|
147
138
|
expect(getAllByText(contentCountWords)[0]).toBeInTheDocument();
|
148
139
|
});
|
149
140
|
|
150
|
-
assertNockRequest(autoSearchScope);
|
151
|
-
assertNockRequest(searchDelayScope);
|
152
141
|
assertNockRequest(autocompleteScope);
|
153
142
|
assertNockRequest(ansibleCollectionRepositoryDetailsScope, done);
|
154
143
|
});
|
@@ -33,7 +33,8 @@ const ContentTable = ({
|
|
33
33
|
ouiaId="content-table"
|
34
34
|
key={selectedContentType}
|
35
35
|
variant={TableVariant.compact}
|
36
|
-
autocompleteEndpoint={
|
36
|
+
autocompleteEndpoint={`/katello/api/v2/${contentTypes[selectedContentType][1]}`}
|
37
|
+
bookmarkController="katello_generic_content_units"
|
37
38
|
emptyContentTitle={__(`You currently don't have any ${selectedContentType}.`)}
|
38
39
|
emptySearchTitle={__(`No matching ${selectedContentType} found`)}
|
39
40
|
emptyContentBody={__(`${selectedContentType} will appear here when created.`)}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
|
3
|
-
import { nockInstance, assertNockRequest, mockAutocomplete
|
3
|
+
import { nockInstance, assertNockRequest, mockAutocomplete } from '../../../test-utils/nockWrapper';
|
4
4
|
import api from '../../../services/api';
|
5
5
|
import ContentPage from '../ContentPage';
|
6
6
|
import ansibleCollectionsResponse from './ansibleCollections.fixtures';
|
@@ -12,19 +12,6 @@ const contentTypesPath = api.getApiUrl('/repositories/content_types');
|
|
12
12
|
const pythonPackagesPath = api.getApiUrl('/python_packages');
|
13
13
|
const ansibleCollectionsPath = api.getApiUrl('/ansible_collections');
|
14
14
|
|
15
|
-
let searchDelayScope;
|
16
|
-
let autoSearchScope;
|
17
|
-
|
18
|
-
beforeEach(() => {
|
19
|
-
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
20
|
-
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
21
|
-
});
|
22
|
-
|
23
|
-
afterEach(() => {
|
24
|
-
assertNockRequest(autoSearchScope);
|
25
|
-
assertNockRequest(searchDelayScope);
|
26
|
-
});
|
27
|
-
|
28
15
|
test('Can call API for Python Packages and show table on page load', async (done) => {
|
29
16
|
const autocompleteUrl = '/python_packages/auto_complete_search';
|
30
17
|
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
|
@@ -3,7 +3,7 @@ import React from 'react';
|
|
3
3
|
import { renderWithRedux, patientlyWaitFor, fireEvent, act } from 'react-testing-lib-wrapper';
|
4
4
|
import api, { foremanApi } from '../../../../services/api';
|
5
5
|
import {
|
6
|
-
nockInstance, assertNockRequest, mockAutocomplete,
|
6
|
+
nockInstance, assertNockRequest, mockAutocomplete, mockForemanAutocomplete,
|
7
7
|
} from '../../../../test-utils/nockWrapper';
|
8
8
|
import CONTENT_VIEWS_KEY from '../../ContentViewsConstants';
|
9
9
|
import ContentViewsPage from '../../ContentViewsPage.js';
|
@@ -37,24 +37,10 @@ const baseQuery = {
|
|
37
37
|
sort_order: 'asc',
|
38
38
|
};
|
39
39
|
|
40
|
-
let scopeBookmark;
|
41
40
|
let firstCV;
|
42
|
-
let searchDelayScope;
|
43
|
-
let autoSearchScope;
|
44
41
|
beforeEach(() => {
|
45
42
|
const { results } = cvIndexData;
|
46
43
|
[firstCV] = results;
|
47
|
-
scopeBookmark = nockInstance
|
48
|
-
.get('/api/v2/bookmarks')
|
49
|
-
.query(true)
|
50
|
-
.reply(200, {});
|
51
|
-
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
52
|
-
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
53
|
-
});
|
54
|
-
|
55
|
-
afterEach(() => {
|
56
|
-
assertNockRequest(searchDelayScope);
|
57
|
-
assertNockRequest(autoSearchScope);
|
58
44
|
});
|
59
45
|
|
60
46
|
test('Can call API for CVs and show Delete Wizard for the row', async (done) => {
|
@@ -93,7 +79,6 @@ test('Can call API for CVs and show Delete Wizard for the row', async (done) =>
|
|
93
79
|
await patientlyWaitFor(() => expect(getAllByText('Remove versions from environments')[1]).toBeInTheDocument());
|
94
80
|
|
95
81
|
assertNockRequest(scope);
|
96
|
-
assertNockRequest(scopeBookmark);
|
97
82
|
assertNockRequest(autocompleteScope);
|
98
83
|
assertNockRequest(envPathDeleteScope);
|
99
84
|
assertNockRequest(cvDetailsScope);
|
@@ -103,12 +88,8 @@ test('Can call API for CVs and show Delete Wizard for the row', async (done) =>
|
|
103
88
|
test('Can open Delete wizard and delete CV with all steps', async (done) => {
|
104
89
|
const hostAutocompleteUrl = '/hosts/auto_complete_search';
|
105
90
|
const hostAutocompleteScope = mockForemanAutocomplete(nockInstance, hostAutocompleteUrl);
|
106
|
-
const hostSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
107
|
-
const hostAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
108
91
|
const akAutocompleteUrl = '/activation_keys/auto_complete_search';
|
109
92
|
const akAutocompleteScope = mockAutocomplete(nockInstance, akAutocompleteUrl);
|
110
|
-
const akSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
|
111
|
-
const akAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
|
112
93
|
|
113
94
|
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
|
114
95
|
|
@@ -231,19 +212,14 @@ test('Can open Delete wizard and delete CV with all steps', async (done) => {
|
|
231
212
|
fireEvent.click(getAllByText('Delete')[0]);
|
232
213
|
|
233
214
|
assertNockRequest(scope);
|
234
|
-
assertNockRequest(scopeBookmark);
|
235
215
|
assertNockRequest(autocompleteScope);
|
236
216
|
assertNockRequest(envPathDeleteScope);
|
237
217
|
assertNockRequest(cvDetailsScope);
|
238
218
|
assertNockRequest(cvVersionsScope);
|
239
219
|
assertNockRequest(hostAutocompleteScope);
|
240
|
-
assertNockRequest(hostSearchDelayScope);
|
241
|
-
assertNockRequest(hostAutoSearchScope);
|
242
220
|
assertNockRequest(hostScope);
|
243
221
|
assertNockRequest(cVDropDownOptionsScope);
|
244
222
|
assertNockRequest(akAutocompleteScope);
|
245
|
-
assertNockRequest(akSearchDelayScope);
|
246
|
-
assertNockRequest(akAutoSearchScope);
|
247
223
|
assertNockRequest(activationKeysScope);
|
248
224
|
assertNockRequest(cVDropDownOptionsScope);
|
249
225
|
assertNockRequest(cvDeleteScope);
|
@@ -252,7 +252,8 @@ const ContentViewComponents = ({ cvId, details }) => {
|
|
252
252
|
onSelect={onSelect(rows, setRows)}
|
253
253
|
cells={columnHeaders}
|
254
254
|
variant={TableVariant.compact}
|
255
|
-
autocompleteEndpoint="/content_views
|
255
|
+
autocompleteEndpoint="/katello/api/v2/content_views"
|
256
|
+
bookmarkController="katello_content_views"
|
256
257
|
fetchItems={useCallback(params =>
|
257
258
|
getContentViewComponents(cvId, params, statusSelected), [cvId, statusSelected])}
|
258
259
|
additionalListeners={[statusSelected, addComponentsResolved, removeComponentsResolved]}
|