katello 4.6.2.1 → 4.7.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/vendor.js +0 -1
- data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -0
- data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +4 -4
- data/app/controllers/katello/api/v2/capsule_content_controller.rb +5 -0
- data/app/controllers/katello/api/v2/content_imports_controller.rb +1 -0
- data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
- data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -1
- data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +1 -1
- data/app/controllers/katello/api/v2/organizations_controller.rb +1 -0
- data/app/controllers/katello/api/v2/repositories_controller.rb +78 -12
- data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +1 -1
- data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +7 -1
- data/app/controllers/katello/concerns/api/v2/smart_proxies_controller_extensions.rb +1 -0
- data/app/controllers/katello/concerns/hosts_controller_extensions.rb +11 -9
- data/app/helpers/katello/content_source_helper.rb +9 -0
- data/app/helpers/katello/hosts_and_hostgroups_helper.rb +31 -0
- data/app/lib/actions/katello/activation_key/destroy.rb +1 -0
- data/app/lib/actions/katello/agent_action.rb +1 -0
- data/app/lib/actions/katello/alternate_content_source/create.rb +1 -1
- data/app/lib/actions/katello/alternate_content_source/update.rb +2 -2
- data/app/lib/actions/katello/capsule_content/sync.rb +10 -2
- data/app/lib/actions/katello/cdn_configuration/update.rb +1 -1
- data/app/lib/actions/katello/content_view/promote.rb +1 -0
- data/app/lib/actions/katello/content_view/publish.rb +5 -2
- data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +7 -3
- data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +4 -2
- data/app/lib/actions/katello/content_view_version/import.rb +22 -10
- data/app/lib/actions/katello/product/destroy.rb +1 -1
- data/app/lib/actions/katello/repository/destroy.rb +3 -3
- data/app/lib/actions/katello/repository/errata_mail.rb +9 -6
- data/app/lib/actions/katello/repository/refresh_repository.rb +1 -1
- data/app/lib/actions/katello/repository/sync.rb +13 -6
- data/app/lib/actions/katello/repository_set/enable_repository.rb +6 -2
- data/app/lib/actions/pulp3/alternate_content_source/refresh_remote.rb +16 -0
- data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +1 -0
- data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +1 -1
- data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +10 -2
- data/app/lib/katello/concerns/renderer_extensions.rb +2 -1
- data/app/lib/katello/errors.rb +2 -2
- data/app/lib/katello/resources/candlepin.rb +7 -1
- data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -13
- data/app/lib/katello/resources/cdn.rb +14 -9
- data/app/lib/katello/util/candlepin_repository_checker.rb +73 -0
- data/app/models/katello/activation_key.rb +12 -1
- data/app/models/katello/alternate_content_source.rb +15 -4
- data/app/models/katello/alternate_content_source_product.rb +1 -1
- data/app/models/katello/authorization/repository.rb +2 -2
- data/app/models/katello/cdn_configuration.rb +12 -3
- data/app/models/katello/concerns/host_managed_extensions.rb +15 -2
- data/app/models/katello/concerns/http_proxy_extensions.rb +5 -10
- data/app/models/katello/concerns/smart_proxy_extensions.rb +30 -15
- data/app/models/katello/content.rb +15 -0
- data/app/models/katello/content_credential.rb +8 -9
- data/app/models/katello/content_view.rb +7 -3
- data/app/models/katello/content_view_component.rb +4 -0
- data/app/models/katello/content_view_version.rb +1 -1
- data/app/models/katello/erratum.rb +6 -2
- data/app/models/katello/host/content_facet.rb +13 -3
- data/app/models/katello/repository.rb +15 -1
- data/app/models/katello/root_repository.rb +0 -2
- data/app/overrides/add_smart_proxy_form.rb +5 -0
- data/app/presenters/katello/content_view_version_compare_presenter.rb +5 -0
- data/app/presenters/katello/host_package_presenter.rb +4 -4
- data/app/services/katello/pulp3/alternate_content_source.rb +23 -15
- data/app/services/katello/pulp3/ansible_collection.rb +7 -10
- data/app/services/katello/pulp3/content_view_version/export.rb +19 -6
- data/app/services/katello/pulp3/content_view_version/import.rb +2 -0
- data/app/services/katello/pulp3/content_view_version/import_validator.rb +21 -5
- data/app/services/katello/pulp3/content_view_version/importable_products.rb +11 -1
- data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +38 -9
- data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +12 -5
- data/app/services/katello/pulp3/content_view_version/metadata_map.rb +13 -2
- data/app/services/katello/pulp3/content_view_version/syncable_format_export.rb +5 -1
- data/app/services/katello/pulp3/pulp_content_unit.rb +3 -0
- data/app/services/katello/pulp3/repository.rb +18 -6
- data/app/services/katello/pulp3/repository_mirror.rb +0 -1
- data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +2 -2
- data/app/services/katello/pulp3/task_group.rb +18 -1
- data/app/services/katello/repository_type.rb +5 -2
- data/app/services/katello/repository_type_manager.rb +4 -3
- data/app/views/dashboard/_content_views_widget.html.erb +1 -1
- data/app/views/foreman/job_templates/change_content_source.erb +6 -0
- data/app/views/foreman/job_templates/update_packages_by_search_query.erb +7 -1
- data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +4 -4
- data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +1 -0
- data/app/views/katello/api/v2/alternate_content_sources/permissions.rabl +11 -0
- data/app/views/katello/api/v2/content_credentials/show.json.rabl +12 -0
- data/app/views/katello/api/v2/content_views/permissions.rabl +1 -0
- data/app/views/katello/api/v2/host_packages/base.json.rabl +1 -1
- data/app/views/katello/api/v2/module_streams/show.json.rabl +7 -0
- data/app/views/katello/api/v2/repositories/compare.json.rabl +10 -0
- data/app/views/katello/api/v2/smart_proxies/pulp_info.json.rabl +1 -0
- data/app/views/katello/hosts/_errata_counts.html.erb +46 -0
- data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +1 -0
- data/app/views/overrides/smart_proxies/_acs_http_proxy.html.erb +6 -0
- data/config/initializers/monkeys.rb +1 -0
- data/config/routes/api/v2.rb +2 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20220730033504_update_custom_cdn.rb +13 -0
- data/db/migrate/20220920173656_add_http_proxy_to_smart_proxy.rb +7 -0
- data/db/migrate/20220920180858_remove_http_proxy_from_katello_alternate_content_sources.rb +6 -0
- data/engines/bastion/app/assets/javascripts/bastion/components/notification.service.js +1 -1
- data/engines/bastion/app/views/bastion/layouts/assets.html.erb +5 -5
- data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credential.factory.js +17 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.routes.js +10 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-acs.controller.js +36 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-details.controller.js +7 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-acs.html +38 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-details.html +3 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/views/content-credentials.html +7 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +4 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +4 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +14 -1392
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/katello-features.run.js +1 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +7 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +1 -1
- data/lib/katello/permission_creator.rb +1 -0
- data/lib/katello/plugin.rb +34 -11
- data/lib/katello/repository_types/deb.rb +1 -1
- data/lib/katello/repository_types/docker.rb +1 -1
- data/lib/katello/repository_types/python.rb +3 -3
- data/lib/katello/tasks/check_candlepin_content.rake +16 -0
- data/lib/katello/tasks/reset.rake +1 -1
- data/lib/katello/version.rb +1 -1
- data/lib/monkeys/try_pulp_container_path.rb +35 -0
- data/locale/action_names.rb +7 -7
- data/locale/bn/katello.po +395 -63
- data/locale/cs/katello.po +396 -64
- data/locale/de/katello.po +399 -67
- data/locale/en/katello.po +395 -63
- data/locale/es/katello.po +399 -67
- data/locale/fr/katello.po +400 -68
- data/locale/gu/katello.po +395 -63
- data/locale/hi/katello.po +395 -63
- data/locale/it/katello.po +396 -64
- data/locale/ja/katello.po +400 -68
- data/locale/katello.pot +1916 -1213
- data/locale/kn/katello.po +395 -63
- data/locale/ko/katello.po +396 -64
- data/locale/mr/katello.po +395 -63
- data/locale/or/katello.po +395 -63
- data/locale/pa/katello.po +395 -63
- data/locale/pt/katello.po +395 -63
- data/locale/pt_BR/katello.po +399 -67
- data/locale/ru/katello.po +396 -64
- data/locale/ta/katello.po +395 -63
- data/locale/te/katello.po +395 -63
- data/locale/zh_CN/katello.po +400 -68
- data/locale/zh_TW/katello.po +396 -64
- data/webpack/components/Bookmark/index.js +5 -1
- data/webpack/components/Content/Details/ContentDetails.js +1 -1
- data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +6 -0
- data/webpack/components/EditableSwitch.js +1 -0
- data/webpack/components/EditableTextInput/EditableTextInput.js +3 -3
- data/webpack/components/Errata/errataHelpers.js +33 -0
- data/webpack/components/Errata/index.js +45 -12
- data/webpack/components/Loading.js +18 -8
- data/webpack/components/Packages/index.js +8 -24
- data/webpack/components/RoutedTabs/index.js +1 -0
- data/webpack/components/Search/Search.js +20 -2
- data/webpack/components/Search/__tests__/search.test.js +3 -3
- data/webpack/components/Table/EmptyStateMessage.js +1 -1
- data/webpack/components/Table/PageControls.js +1 -0
- data/webpack/components/Table/TableHooks.js +4 -0
- data/webpack/components/Table/TableWrapper.js +7 -7
- data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +1 -0
- data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -0
- data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +1 -1
- data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +3 -1
- data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +2 -1
- data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +124 -68
- data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +5 -0
- data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +30 -4
- data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.scss +23 -0
- data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +5 -4
- data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +25 -10
- data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +3 -3
- data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +6 -0
- data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +145 -32
- data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +3 -1
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -1
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
- data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +78 -26
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +23 -10
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesConstants.js +1 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +9 -4
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +141 -23
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.scss +6 -1
- data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +9 -8
- data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +24 -3
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +7 -2
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +2 -1
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +20 -4
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +56 -38
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +3 -3
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +5 -4
- data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +3 -3
- data/webpack/containers/Application/config.js +2 -2
- data/webpack/containers/Application/overrides.scss +12 -0
- data/webpack/global_test_setup.js +19 -1
- data/webpack/ouia_id_check.js +0 -2
- data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -8
- data/webpack/scenes/AlternateContentSources/ACSActions.js +37 -6
- data/webpack/scenes/AlternateContentSources/ACSConstants.js +2 -0
- data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +1 -1
- data/webpack/scenes/AlternateContentSources/ACSSelectors.js +6 -6
- data/webpack/scenes/AlternateContentSources/Acs.scss +3 -0
- data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +24 -3
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +10 -8
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +25 -4
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +22 -11
- data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +27 -2
- data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +49 -17
- data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +76 -23
- data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +159 -11
- data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +83 -29
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditCredentials.js +9 -8
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +2 -2
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditProducts.js +2 -2
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditSmartProxies.js +39 -7
- data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +27 -11
- data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSEdits.test.js +58 -55
- data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSExpandableDetails.test.js +35 -32
- data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +323 -150
- data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +5 -1
- data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +10 -11
- data/webpack/scenes/AlternateContentSources/helpers.js +26 -0
- data/webpack/scenes/ContentViews/ContentViewsConstants.js +1 -0
- data/webpack/scenes/ContentViews/ContentViewsPage.js +1 -1
- data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -0
- data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +1 -0
- data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -5
- data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +30 -7
- data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +1 -0
- data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +21 -6
- data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +3 -3
- data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +1 -0
- data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +1 -0
- data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +2 -0
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -0
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -1
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +1 -1
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
- data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +14 -0
- data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +11 -1
- data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +1 -1
- data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +2 -0
- data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +5 -0
- data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +1 -0
- data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +1 -0
- data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +8 -2
- data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +5 -1
- data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +22 -6
- data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +19 -9
- data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +9 -2
- data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +9 -2
- data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +8 -2
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +3 -2
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +1 -1
- data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +2 -2
- data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +2 -0
- data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -1
- data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +3 -3
- data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.js +9 -1
- data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +83 -0
- data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +32 -8
- data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionCompare.test.js +56 -3
- data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/cvCompareRepositories.fixtures.json +175 -0
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +6 -2
- data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +3 -3
- data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +1 -0
- data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +1 -0
- data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +2 -2
- data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +2 -2
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +2 -2
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +1 -0
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +4 -1
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +5 -4
- data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +5 -1
- data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -3
- data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +10 -5
- data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +2 -0
- data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +1 -0
- data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +81 -19
- data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
- data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +1 -0
- data/webpack/scenes/ContentViews/components/InactiveText.js +9 -1
- data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +4 -2
- data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +3 -2
- data/webpack/scenes/Hosts/ChangeContentSource/actions.js +18 -11
- data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +15 -8
- data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +3 -4
- data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +55 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/HostsModal.js +59 -0
- data/webpack/scenes/Hosts/ChangeContentSource/constants.js +1 -0
- data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +2 -5
- data/webpack/scenes/Hosts/ChangeContentSource/index.js +46 -41
- data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +5 -5
- data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +10 -1
- data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +1 -1
- data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +97 -2
- data/webpack/scenes/Organizations/OrganizationSelectors.js +1 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +2 -1
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +10 -25
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CustomCdnTypeForm.js +154 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/ExportSyncForm.js +4 -4
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/NetworkSyncForm.js +59 -44
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +3 -28
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CustomCdnTypeForm.test.js +97 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/ExportSyncForm.test.js +1 -1
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/NetworkSyncForm.test.js +4 -4
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +23 -10
- data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +1 -1
- data/webpack/scenes/Subscriptions/SubscriptionConstants.js +2 -1
- data/webpack/scenes/Subscriptions/SubscriptionsPage.js +5 -5
- data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +3 -3
- data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/__snapshots__/UpstreamSubscriptionsPage.test.js.snap +2 -2
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +3 -3
- data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +3 -3
- data/webpack/scenes/Tasks/helpers.js +14 -7
- metadata +54 -35
- data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh_remote.rb +0 -18
- data/db/migrate/20221206170122_update_ignore_srpm_to_false_for_mirror_complete.rb +0 -5
- data/vendor/assets/javascripts/katello/jquery.trunk8.js +0 -203
@@ -1,10 +1,7 @@
|
|
1
1
|
import { STATUS } from 'foremanReact/constants';
|
2
2
|
|
3
|
-
export const getHostIds = () => {
|
4
|
-
|
5
|
-
const hostId = url.searchParams.get('host_id');
|
6
|
-
|
7
|
-
if (hostId) return [hostId];
|
3
|
+
export const getHostIds = (hostIdFromUrl) => {
|
4
|
+
if (hostIdFromUrl) return [hostIdFromUrl];
|
8
5
|
|
9
6
|
const cookie = document.cookie.split('; ')
|
10
7
|
.find(row => row.startsWith('_ForemanSelectedhosts'));
|
@@ -1,39 +1,47 @@
|
|
1
1
|
import React, { useState, useEffect } from 'react';
|
2
2
|
import { useSelector, useDispatch } from 'react-redux';
|
3
3
|
|
4
|
-
import { Alert, Grid, GridItem
|
4
|
+
import { Alert, Grid, GridItem } from '@patternfly/react-core';
|
5
5
|
|
6
6
|
import { translate as __ } from 'foremanReact/common/I18n';
|
7
7
|
import { STATUS } from 'foremanReact/constants';
|
8
|
-
import { foremanUrl } from 'foremanReact/common/helpers';
|
9
8
|
|
10
9
|
import { selectApiDataStatus,
|
11
10
|
selectApiContentViewStatus,
|
12
11
|
selectApiChangeContentStatus,
|
13
|
-
|
14
|
-
|
12
|
+
selectContentHosts,
|
13
|
+
selectContentHostsWithoutContent,
|
15
14
|
selectEnvironments,
|
16
15
|
selectContentSources,
|
17
16
|
selectJobInvocationPath,
|
18
17
|
selectContentViews,
|
19
18
|
selectTemplate } from './selectors';
|
19
|
+
|
20
20
|
import { getHostIds, formIsLoading } from './helpers';
|
21
|
-
import {
|
21
|
+
import { useUrlParams } from '../../../components/Table/TableHooks';
|
22
|
+
import {
|
23
|
+
getFormData,
|
24
|
+
getProxy,
|
25
|
+
changeContentSource,
|
26
|
+
getContentViews,
|
27
|
+
} from './actions';
|
22
28
|
import ContentSourceForm from './components/ContentSourceForm';
|
23
29
|
import ContentSourceTemplate from './components/ContentSourceTemplate';
|
30
|
+
import Hosts from './components/Hosts';
|
24
31
|
import './styles.scss';
|
25
32
|
|
26
33
|
const ChangeContentSourcePage = () => {
|
27
34
|
const dispatch = useDispatch();
|
28
35
|
|
36
|
+
const urlParams = useUrlParams();
|
29
37
|
const apiDataStatus = useSelector(selectApiDataStatus);
|
30
38
|
const apiContentViewStatus = useSelector(selectApiContentViewStatus);
|
31
39
|
const apiChangeStatus = useSelector(selectApiChangeContentStatus);
|
32
40
|
|
33
41
|
const isLoading = formIsLoading(apiDataStatus, apiContentViewStatus, apiChangeStatus);
|
34
42
|
|
35
|
-
const
|
36
|
-
const hostsWithoutContent = useSelector(
|
43
|
+
const contentHosts = useSelector(selectContentHosts);
|
44
|
+
const hostsWithoutContent = useSelector(selectContentHostsWithoutContent);
|
37
45
|
const environments = useSelector(selectEnvironments);
|
38
46
|
const contentSources = useSelector(selectContentSources);
|
39
47
|
const jobInvocationPath = useSelector(selectJobInvocationPath);
|
@@ -41,48 +49,44 @@ const ChangeContentSourcePage = () => {
|
|
41
49
|
const template = useSelector(selectTemplate);
|
42
50
|
const contentViews = useSelector(selectContentViews);
|
43
51
|
|
44
|
-
const [
|
45
|
-
const [
|
46
|
-
const [
|
52
|
+
const [contentSourceId, setCapsuleId] = useState('');
|
53
|
+
const [environmentId, setEnvironmentId] = useState('');
|
54
|
+
const [contentViewId, setContentViewId] = useState('');
|
47
55
|
|
48
56
|
const handleSubmit = (e) => {
|
49
57
|
e.preventDefault();
|
50
58
|
|
51
|
-
dispatch(changeContentSource(
|
59
|
+
dispatch(changeContentSource(
|
60
|
+
environmentId,
|
61
|
+
contentViewId,
|
62
|
+
contentSourceId,
|
63
|
+
contentHosts.map(h => h.id),
|
64
|
+
));
|
52
65
|
};
|
53
66
|
|
54
|
-
const
|
55
|
-
|
56
|
-
|
67
|
+
const handleContentSource = (id) => {
|
68
|
+
setCapsuleId(id);
|
69
|
+
setEnvironmentId('');
|
70
|
+
setContentViewId('');
|
71
|
+
|
72
|
+
if (id) {
|
73
|
+
dispatch(getProxy(id));
|
57
74
|
}
|
75
|
+
};
|
58
76
|
|
77
|
+
const handleEnvironment = (envId) => {
|
59
78
|
setEnvironmentId(envId);
|
60
79
|
setContentViewId('');
|
61
|
-
};
|
62
|
-
|
63
|
-
const IgnoredHostsAlert = () => (
|
64
|
-
<Alert
|
65
|
-
variant="warning"
|
66
|
-
title={__('Some hosts are ignored!')}
|
67
|
-
className="cs_alert"
|
68
|
-
isExpandable
|
69
|
-
>
|
70
|
-
<p>
|
71
|
-
{ __('The following hosts are not registered as Content Hosts, so they will be ignored:') }
|
72
|
-
</p>
|
73
|
-
{ hostsWithoutContent.map(name => (
|
74
|
-
<List>
|
75
|
-
<ListItem>
|
76
|
-
<a href={foremanUrl(`/hosts/${name}`)}>{name}</a>
|
77
|
-
</ListItem>
|
78
|
-
</List>))}
|
79
|
-
</Alert>);
|
80
80
|
|
81
|
+
if (envId) {
|
82
|
+
dispatch(getContentViews(envId));
|
83
|
+
}
|
84
|
+
};
|
81
85
|
useEffect(() => {
|
82
|
-
dispatch(getFormData());
|
83
|
-
}, [dispatch]);
|
86
|
+
dispatch(getFormData(getHostIds(urlParams.host_id), urlParams.searchParam));
|
87
|
+
}, [dispatch, urlParams.host_id, urlParams.searchParam]);
|
84
88
|
|
85
|
-
if (getHostIds().length === 0) {
|
89
|
+
if (getHostIds(urlParams.host_id).length === 0 && urlParams.searchParam === '') {
|
86
90
|
return (
|
87
91
|
<Grid className="margin-40">
|
88
92
|
<GridItem span={7}>
|
@@ -90,7 +94,6 @@ const ChangeContentSourcePage = () => {
|
|
90
94
|
variant="danger"
|
91
95
|
title={__('No hosts with content source found!')}
|
92
96
|
/>
|
93
|
-
{ hostsWithoutContent.length > 0 && <IgnoredHostsAlert /> }
|
94
97
|
</GridItem>
|
95
98
|
</Grid>);
|
96
99
|
}
|
@@ -99,9 +102,11 @@ const ChangeContentSourcePage = () => {
|
|
99
102
|
<Grid className="margin-40">
|
100
103
|
<GridItem span={7}>
|
101
104
|
<h1>{__('Change host content source')}</h1>
|
102
|
-
|
103
|
-
{ hostsWithoutContent.length > 0 && <IgnoredHostsAlert /> }
|
104
105
|
</GridItem>
|
106
|
+
<Hosts
|
107
|
+
contentHosts={contentHosts}
|
108
|
+
hostsWithoutContent={hostsWithoutContent}
|
109
|
+
/>
|
105
110
|
|
106
111
|
<ContentSourceForm
|
107
112
|
handleSubmit={handleSubmit}
|
@@ -113,8 +118,8 @@ const ChangeContentSourcePage = () => {
|
|
113
118
|
contentViewId={contentViewId}
|
114
119
|
contentSources={contentSources}
|
115
120
|
contentSourceId={contentSourceId}
|
116
|
-
handleContentSource={
|
117
|
-
|
121
|
+
handleContentSource={handleContentSource}
|
122
|
+
contentHosts={contentHosts}
|
118
123
|
isLoading={isLoading}
|
119
124
|
/>
|
120
125
|
{ apiChangeStatus === STATUS.RESOLVED &&
|
@@ -4,7 +4,7 @@ import {
|
|
4
4
|
selectAPIError,
|
5
5
|
} from 'foremanReact/redux/API/APISelectors';
|
6
6
|
|
7
|
-
import { CHANGE_CONTENT_SOURCE_DATA, CHANGE_CONTENT_SOURCE, CHANGE_CONTENT_SOURCE_VIEWS } from './constants';
|
7
|
+
import { CHANGE_CONTENT_SOURCE_DATA, CHANGE_CONTENT_SOURCE_PROXY, CHANGE_CONTENT_SOURCE, CHANGE_CONTENT_SOURCE_VIEWS } from './constants';
|
8
8
|
|
9
9
|
// API statuses
|
10
10
|
export const selectApiDataStatus = state =>
|
@@ -19,14 +19,14 @@ export const selectApiChangeContentStatus = state =>
|
|
19
19
|
export const selectError = state => selectAPIError(state, CHANGE_CONTENT_SOURCE);
|
20
20
|
|
21
21
|
// Selectors
|
22
|
-
export const
|
23
|
-
selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).
|
22
|
+
export const selectContentHosts = state =>
|
23
|
+
selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).content_hosts || [];
|
24
24
|
|
25
|
-
export const
|
25
|
+
export const selectContentHostsWithoutContent = state =>
|
26
26
|
selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).hosts_without_content || [];
|
27
27
|
|
28
28
|
export const selectEnvironments = state =>
|
29
|
-
selectAPIResponse(state,
|
29
|
+
selectAPIResponse(state, CHANGE_CONTENT_SOURCE_PROXY).lifecycle_environments || [];
|
30
30
|
|
31
31
|
export const selectContentSources = state =>
|
32
32
|
selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).content_sources || [];
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { translate as __ } from 'foremanReact/common/I18n';
|
3
3
|
import ModuleStreamDetailArtifacts from './ModuleStreamDetailArtifacts';
|
4
|
+
import ModuleStreamDetailProfiles from './Profiles/ModuleStreamDetailProfiles';
|
4
5
|
import ContentDetailInfo from '../../../components/Content/Details/ContentDetailInfo';
|
5
6
|
import ContentDetailRepositories from '../../../components/Content/Details/ContentDetailRepositories';
|
6
7
|
|
@@ -16,7 +17,7 @@ export const displayMap = new Map([
|
|
16
17
|
]);
|
17
18
|
|
18
19
|
export default (detailInfo) => {
|
19
|
-
const { repositories, artifacts } = detailInfo;
|
20
|
+
const { repositories, profiles, artifacts } = detailInfo;
|
20
21
|
|
21
22
|
return [
|
22
23
|
{
|
@@ -36,6 +37,14 @@ export default (detailInfo) => {
|
|
36
37
|
},
|
37
38
|
{
|
38
39
|
key: 3,
|
40
|
+
tabHeader: __('Profiles'),
|
41
|
+
tabContent: (profiles && profiles.length ?
|
42
|
+
<ModuleStreamDetailProfiles profiles={profiles} /> :
|
43
|
+
__('No profiles to show')
|
44
|
+
),
|
45
|
+
},
|
46
|
+
{
|
47
|
+
key: 4,
|
39
48
|
tabHeader: __('Artifacts'),
|
40
49
|
tabContent: (artifacts && artifacts.length ?
|
41
50
|
<ModuleStreamDetailArtifacts artifacts={artifacts} /> :
|
data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
2
|
|
3
3
|
exports[`Module stream details page rendering renders with loading state 1`] = `
|
4
|
-
<div
|
4
|
+
<div
|
5
|
+
style={
|
6
|
+
Object {
|
7
|
+
"margin": "24px",
|
8
|
+
}
|
9
|
+
}
|
10
|
+
>
|
5
11
|
<ContentDetails
|
6
12
|
contentDetails={
|
7
13
|
Object {
|
@@ -76,6 +82,11 @@ exports[`Module stream details page rendering renders with loading state 1`] = `
|
|
76
82
|
},
|
77
83
|
Object {
|
78
84
|
"key": 3,
|
85
|
+
"tabContent": "No profiles to show",
|
86
|
+
"tabHeader": "Profiles",
|
87
|
+
},
|
88
|
+
Object {
|
89
|
+
"key": 4,
|
79
90
|
"tabContent": "No artifacts to show",
|
80
91
|
"tabHeader": "Artifacts",
|
81
92
|
},
|
@@ -86,7 +97,13 @@ exports[`Module stream details page rendering renders with loading state 1`] = `
|
|
86
97
|
`;
|
87
98
|
|
88
99
|
exports[`Module stream details page rendering renders with module stream provided 1`] = `
|
89
|
-
<div
|
100
|
+
<div
|
101
|
+
style={
|
102
|
+
Object {
|
103
|
+
"margin": "24px",
|
104
|
+
}
|
105
|
+
}
|
106
|
+
>
|
90
107
|
<BreadcrumbsBar
|
91
108
|
breadcrumbItems={
|
92
109
|
Array [
|
@@ -392,6 +409,84 @@ exports[`Module stream details page rendering renders with module stream provide
|
|
392
409
|
},
|
393
410
|
Object {
|
394
411
|
"key": 3,
|
412
|
+
"tabContent": <ModuleStreamDetailProfiles
|
413
|
+
profiles={
|
414
|
+
Array [
|
415
|
+
Object {
|
416
|
+
"id": 37,
|
417
|
+
"name": "default",
|
418
|
+
"rpms": Array [
|
419
|
+
Object {
|
420
|
+
"id": 108,
|
421
|
+
"name": "perl",
|
422
|
+
},
|
423
|
+
Object {
|
424
|
+
"id": 110,
|
425
|
+
"name": "foo",
|
426
|
+
},
|
427
|
+
Object {
|
428
|
+
"id": 111,
|
429
|
+
"name": "rpm_0",
|
430
|
+
},
|
431
|
+
Object {
|
432
|
+
"id": 112,
|
433
|
+
"name": "rpm_1",
|
434
|
+
},
|
435
|
+
Object {
|
436
|
+
"id": 113,
|
437
|
+
"name": "rpm_2",
|
438
|
+
},
|
439
|
+
Object {
|
440
|
+
"id": 114,
|
441
|
+
"name": "rpm_3",
|
442
|
+
},
|
443
|
+
Object {
|
444
|
+
"id": 115,
|
445
|
+
"name": "rpm_4",
|
446
|
+
},
|
447
|
+
Object {
|
448
|
+
"id": 116,
|
449
|
+
"name": "rpm_5",
|
450
|
+
},
|
451
|
+
Object {
|
452
|
+
"id": 117,
|
453
|
+
"name": "rpm_6",
|
454
|
+
},
|
455
|
+
Object {
|
456
|
+
"id": 118,
|
457
|
+
"name": "rpm_7",
|
458
|
+
},
|
459
|
+
Object {
|
460
|
+
"id": 119,
|
461
|
+
"name": "rpm_8",
|
462
|
+
},
|
463
|
+
Object {
|
464
|
+
"id": 120,
|
465
|
+
"name": "rpm_9",
|
466
|
+
},
|
467
|
+
Object {
|
468
|
+
"id": 121,
|
469
|
+
"name": "rpm_10",
|
470
|
+
},
|
471
|
+
],
|
472
|
+
},
|
473
|
+
Object {
|
474
|
+
"id": 38,
|
475
|
+
"name": "minimal",
|
476
|
+
"rpms": Array [
|
477
|
+
Object {
|
478
|
+
"id": 84,
|
479
|
+
"name": "python2-avocado",
|
480
|
+
},
|
481
|
+
],
|
482
|
+
},
|
483
|
+
]
|
484
|
+
}
|
485
|
+
/>,
|
486
|
+
"tabHeader": "Profiles",
|
487
|
+
},
|
488
|
+
Object {
|
489
|
+
"key": 4,
|
395
490
|
"tabContent": <ModuleStreamDetailArtifacts
|
396
491
|
artifacts={
|
397
492
|
Array [
|
@@ -9,6 +9,7 @@ import {
|
|
9
9
|
} from './OrganizationConstants';
|
10
10
|
|
11
11
|
export const selectOrganizationState = state => state.katello.organization;
|
12
|
+
export const selectOrgLoading = state => state.katello.organization.loading;
|
12
13
|
|
13
14
|
export const selectManifestName = state =>
|
14
15
|
selectOrganizationState(state).owner_details?.upstreamConsumer?.name;
|
@@ -2,9 +2,10 @@ import { translate as __ } from 'foremanReact/common/I18n';
|
|
2
2
|
|
3
3
|
export const CDN_URL = 'https://cdn.redhat.com';
|
4
4
|
|
5
|
-
export const [CDN, NETWORK_SYNC, EXPORT_SYNC] = ['redhat_cdn', 'network_sync', 'export_sync'];
|
5
|
+
export const [CDN, NETWORK_SYNC, EXPORT_SYNC, CUSTOM_CDN] = ['redhat_cdn', 'network_sync', 'export_sync', 'custom_cdn'];
|
6
6
|
export const CDN_CONFIGURATION_TYPES = {
|
7
7
|
redhat_cdn: __('Red Hat CDN'),
|
8
|
+
custom_cdn: __('Custom CDN'),
|
8
9
|
network_sync: __('Network Sync'),
|
9
10
|
export_sync: __('Export Sync'),
|
10
11
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React
|
1
|
+
import React from 'react';
|
2
2
|
import PropTypes from 'prop-types';
|
3
3
|
import { useDispatch, useSelector } from 'react-redux';
|
4
4
|
import { FormattedMessage } from 'react-intl';
|
@@ -16,30 +16,18 @@ import { noop } from 'foremanReact/common/helpers';
|
|
16
16
|
import { CDN_URL, CDN } from './CdnConfigurationConstants';
|
17
17
|
import { updateCdnConfiguration } from '../../../Organizations/OrganizationActions';
|
18
18
|
import {
|
19
|
+
selectOrgLoading,
|
19
20
|
selectUpdatingCdnConfiguration,
|
20
21
|
} from '../../../Organizations/OrganizationSelectors';
|
21
22
|
import './CdnConfigurationForm.scss';
|
22
23
|
|
23
|
-
const CdnTypeForm = ({
|
24
|
+
const CdnTypeForm = ({ typeChangeInProgress, onUpdate }) => {
|
24
25
|
const dispatch = useDispatch();
|
25
|
-
const [cdnUrl, setCdnUrl] = useState(url);
|
26
|
-
const [updateEnabled, setUpdateEnabled] = useState(showUpdate);
|
27
26
|
const updatingCdnConfiguration = useSelector(state => selectUpdatingCdnConfiguration(state));
|
28
|
-
const
|
29
|
-
|
30
|
-
useEffect(() => {
|
31
|
-
if (firstUpdate.current) {
|
32
|
-
firstUpdate.current = false;
|
33
|
-
return;
|
34
|
-
}
|
35
|
-
setUpdateEnabled(true);
|
36
|
-
}, [cdnUrl]);
|
37
|
-
|
27
|
+
const orgIsLoading = useSelector(state => selectOrgLoading(state));
|
38
28
|
const performUpdate = () => {
|
39
|
-
setUpdateEnabled(false);
|
40
29
|
dispatch(updateCdnConfiguration({
|
41
30
|
type: CDN,
|
42
|
-
url: cdnUrl,
|
43
31
|
}, onUpdate));
|
44
32
|
};
|
45
33
|
|
@@ -55,7 +43,7 @@ const CdnTypeForm = ({ showUpdate, onUpdate, url }) => {
|
|
55
43
|
}}
|
56
44
|
/>
|
57
45
|
<br />
|
58
|
-
{
|
46
|
+
{typeChangeInProgress &&
|
59
47
|
<FormattedMessage
|
60
48
|
id="cdn-configuration-type-cdn"
|
61
49
|
defaultMessage={__('Click {update} below to save changes.')}
|
@@ -69,11 +57,10 @@ const CdnTypeForm = ({ showUpdate, onUpdate, url }) => {
|
|
69
57
|
<FormGroup label={__('URL')} isRequired>
|
70
58
|
<TextInput
|
71
59
|
ouiaId="cdn-configuration-url-input"
|
72
|
-
aria-label="cdn-url"
|
60
|
+
aria-label="redhat-cdn-url"
|
73
61
|
type="text"
|
74
|
-
value={
|
75
|
-
|
76
|
-
isDisabled={updatingCdnConfiguration}
|
62
|
+
value={CDN_URL}
|
63
|
+
isDisabled
|
77
64
|
/>
|
78
65
|
</FormGroup>
|
79
66
|
|
@@ -83,7 +70,7 @@ const CdnTypeForm = ({ showUpdate, onUpdate, url }) => {
|
|
83
70
|
aria-label="update-cdn-configuration"
|
84
71
|
variant="secondary"
|
85
72
|
onClick={performUpdate}
|
86
|
-
isDisabled={updatingCdnConfiguration ||
|
73
|
+
isDisabled={updatingCdnConfiguration || orgIsLoading || !typeChangeInProgress}
|
87
74
|
isLoading={updatingCdnConfiguration}
|
88
75
|
>
|
89
76
|
{__('Update')}
|
@@ -95,13 +82,11 @@ const CdnTypeForm = ({ showUpdate, onUpdate, url }) => {
|
|
95
82
|
};
|
96
83
|
|
97
84
|
CdnTypeForm.propTypes = {
|
98
|
-
|
85
|
+
typeChangeInProgress: PropTypes.bool.isRequired,
|
99
86
|
onUpdate: PropTypes.func,
|
100
|
-
url: PropTypes.string,
|
101
87
|
};
|
102
88
|
|
103
89
|
CdnTypeForm.defaultProps = {
|
104
|
-
url: CDN_URL,
|
105
90
|
onUpdate: noop,
|
106
91
|
};
|
107
92
|
|
@@ -0,0 +1,154 @@
|
|
1
|
+
import React, { useState } from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
import { useDispatch, useSelector } from 'react-redux';
|
4
|
+
import { FormattedMessage } from 'react-intl';
|
5
|
+
import {
|
6
|
+
ActionGroup,
|
7
|
+
Button,
|
8
|
+
Form,
|
9
|
+
FormGroup,
|
10
|
+
FormSelect,
|
11
|
+
FormSelectOption,
|
12
|
+
TextInput,
|
13
|
+
Text,
|
14
|
+
} from '@patternfly/react-core';
|
15
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
16
|
+
import { noop } from 'foremanReact/common/helpers';
|
17
|
+
|
18
|
+
import { CUSTOM_CDN } from './CdnConfigurationConstants';
|
19
|
+
import { updateCdnConfiguration } from '../../../Organizations/OrganizationActions';
|
20
|
+
import {
|
21
|
+
selectOrgLoading,
|
22
|
+
selectUpdatingCdnConfiguration,
|
23
|
+
} from '../../../Organizations/OrganizationSelectors';
|
24
|
+
import './CdnConfigurationForm.scss';
|
25
|
+
|
26
|
+
const CustomCdnTypeForm = ({
|
27
|
+
typeChangeInProgress, onUpdate, contentCredentials, cdnConfiguration,
|
28
|
+
}) => {
|
29
|
+
const dispatch = useDispatch();
|
30
|
+
const urlValue = cdnConfiguration.type === CUSTOM_CDN ? cdnConfiguration.url : '';
|
31
|
+
const [url, setUrl] = useState(urlValue);
|
32
|
+
const updatingCdnConfiguration = useSelector(state => selectUpdatingCdnConfiguration(state));
|
33
|
+
const orgIsLoading = useSelector(state => selectOrgLoading(state));
|
34
|
+
const [sslCaCredentialId, setSslCaCredentialId] = useState(cdnConfiguration.ssl_ca_credential_id);
|
35
|
+
|
36
|
+
const disableUpdate = () => {
|
37
|
+
if (updatingCdnConfiguration || orgIsLoading) {
|
38
|
+
return true;
|
39
|
+
}
|
40
|
+
|
41
|
+
const sslCaCredentialIdOrNull = sslCaCredentialId === '' ? null : sslCaCredentialId;
|
42
|
+
if (!url || (url === cdnConfiguration.url
|
43
|
+
&& sslCaCredentialIdOrNull?.toString() ===
|
44
|
+
cdnConfiguration.ssl_ca_credential_id?.toString())) {
|
45
|
+
return true;
|
46
|
+
}
|
47
|
+
|
48
|
+
return false;
|
49
|
+
};
|
50
|
+
|
51
|
+
const performUpdate = () => {
|
52
|
+
dispatch(updateCdnConfiguration({
|
53
|
+
url,
|
54
|
+
ssl_ca_credential_id: sslCaCredentialId,
|
55
|
+
type: CUSTOM_CDN,
|
56
|
+
}, onUpdate));
|
57
|
+
};
|
58
|
+
|
59
|
+
const sslCaCredentialValue =
|
60
|
+
cdnConfiguration.type === CUSTOM_CDN || typeChangeInProgress ? sslCaCredentialId : null;
|
61
|
+
|
62
|
+
return (
|
63
|
+
<Form isHorizontal>
|
64
|
+
<div id="update-hint-cdn" className="margin-top-16">
|
65
|
+
<Text>
|
66
|
+
<FormattedMessage
|
67
|
+
id="cdn-configuration-type"
|
68
|
+
defaultMessage={__('Red Hat content will be consumed from {type}.')}
|
69
|
+
values={{
|
70
|
+
type: <strong>{__('a custom CDN URL')}</strong>,
|
71
|
+
}}
|
72
|
+
/>
|
73
|
+
<br />
|
74
|
+
{typeChangeInProgress &&
|
75
|
+
<FormattedMessage
|
76
|
+
id="cdn-configuration-type-cdn"
|
77
|
+
defaultMessage={__('Click {update} below to save changes.')}
|
78
|
+
values={{
|
79
|
+
update: <strong>{__('Update')}</strong>,
|
80
|
+
}}
|
81
|
+
/>
|
82
|
+
}
|
83
|
+
</Text>
|
84
|
+
</div>
|
85
|
+
|
86
|
+
<FormGroup
|
87
|
+
label={__('URL')}
|
88
|
+
isRequired
|
89
|
+
>
|
90
|
+
<TextInput
|
91
|
+
ouiaId="custom-cdn-url-input"
|
92
|
+
aria-label="cdn-url"
|
93
|
+
type="text"
|
94
|
+
value={url || ''}
|
95
|
+
onChange={value => setUrl(value)}
|
96
|
+
isDisabled={updatingCdnConfiguration}
|
97
|
+
/>
|
98
|
+
</FormGroup>
|
99
|
+
|
100
|
+
<FormGroup
|
101
|
+
label={__('SSL CA Content Credential')}
|
102
|
+
>
|
103
|
+
<FormSelect
|
104
|
+
ouiaId="custom-cdn-ca-content-credential-input"
|
105
|
+
aria-label="cdn-ssl-ca-content-credential"
|
106
|
+
value={sslCaCredentialValue || ''}
|
107
|
+
isDisabled={updatingCdnConfiguration}
|
108
|
+
onChange={value => setSslCaCredentialId(value)}
|
109
|
+
>
|
110
|
+
<FormSelectOption label={__('N/A')} />
|
111
|
+
{contentCredentials.map(cred =>
|
112
|
+
<FormSelectOption data-testid="ssl-ca-content-credential-option" key={cred.id} value={cred.id} label={cred.name} />)}
|
113
|
+
</FormSelect>
|
114
|
+
</FormGroup>
|
115
|
+
|
116
|
+
<ActionGroup>
|
117
|
+
<Button
|
118
|
+
ouiaId="custom-cdn-type-configuration-update-button"
|
119
|
+
aria-label="update-custom-cdn-configuration"
|
120
|
+
variant="secondary"
|
121
|
+
onClick={performUpdate}
|
122
|
+
isDisabled={disableUpdate()}
|
123
|
+
isLoading={updatingCdnConfiguration}
|
124
|
+
>
|
125
|
+
{__('Update')}
|
126
|
+
</Button>
|
127
|
+
</ActionGroup>
|
128
|
+
</Form>
|
129
|
+
|
130
|
+
);
|
131
|
+
};
|
132
|
+
|
133
|
+
CustomCdnTypeForm.propTypes = {
|
134
|
+
typeChangeInProgress: PropTypes.bool.isRequired,
|
135
|
+
onUpdate: PropTypes.func,
|
136
|
+
contentCredentials: PropTypes.arrayOf(PropTypes.shape({
|
137
|
+
id: PropTypes.number,
|
138
|
+
name: PropTypes.string,
|
139
|
+
})),
|
140
|
+
cdnConfiguration: PropTypes.shape({
|
141
|
+
type: PropTypes.string.isRequired,
|
142
|
+
url: PropTypes.string,
|
143
|
+
ssl_ca_credential_id: PropTypes.number,
|
144
|
+
}),
|
145
|
+
|
146
|
+
};
|
147
|
+
|
148
|
+
CustomCdnTypeForm.defaultProps = {
|
149
|
+
onUpdate: noop,
|
150
|
+
contentCredentials: [],
|
151
|
+
cdnConfiguration: {},
|
152
|
+
};
|
153
|
+
|
154
|
+
export default CustomCdnTypeForm;
|
@@ -18,8 +18,8 @@ import {
|
|
18
18
|
|
19
19
|
import './CdnConfigurationForm.scss';
|
20
20
|
|
21
|
-
const ExportSyncForm = ({
|
22
|
-
const [updateEnabled, setUpdateEnabled] = useState(
|
21
|
+
const ExportSyncForm = ({ typeChangeInProgress, onUpdate }) => {
|
22
|
+
const [updateEnabled, setUpdateEnabled] = useState(typeChangeInProgress);
|
23
23
|
const updatingCdnConfiguration = useSelector(state => selectUpdatingCdnConfiguration(state));
|
24
24
|
const dispatch = useDispatch();
|
25
25
|
const performUpdate = () => {
|
@@ -41,7 +41,7 @@ const ExportSyncForm = ({ showUpdate, onUpdate }) => {
|
|
41
41
|
}}
|
42
42
|
/>
|
43
43
|
<br />
|
44
|
-
{
|
44
|
+
{typeChangeInProgress &&
|
45
45
|
<FormattedMessage
|
46
46
|
id="cdn-configuration-type-cdn"
|
47
47
|
defaultMessage={__('Click {update} below to save changes.')}
|
@@ -71,7 +71,7 @@ const ExportSyncForm = ({ showUpdate, onUpdate }) => {
|
|
71
71
|
|
72
72
|
|
73
73
|
ExportSyncForm.propTypes = {
|
74
|
-
|
74
|
+
typeChangeInProgress: PropTypes.bool.isRequired,
|
75
75
|
onUpdate: PropTypes.func,
|
76
76
|
};
|
77
77
|
|