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.

Files changed (333) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  3. data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -0
  4. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +4 -4
  5. data/app/controllers/katello/api/v2/capsule_content_controller.rb +5 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +1 -0
  7. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  8. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -1
  9. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -0
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +78 -12
  12. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +1 -1
  13. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +7 -1
  14. data/app/controllers/katello/concerns/api/v2/smart_proxies_controller_extensions.rb +1 -0
  15. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +11 -9
  16. data/app/helpers/katello/content_source_helper.rb +9 -0
  17. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +31 -0
  18. data/app/lib/actions/katello/activation_key/destroy.rb +1 -0
  19. data/app/lib/actions/katello/agent_action.rb +1 -0
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +1 -1
  21. data/app/lib/actions/katello/alternate_content_source/update.rb +2 -2
  22. data/app/lib/actions/katello/capsule_content/sync.rb +10 -2
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +1 -1
  24. data/app/lib/actions/katello/content_view/promote.rb +1 -0
  25. data/app/lib/actions/katello/content_view/publish.rb +5 -2
  26. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +7 -3
  27. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +4 -2
  28. data/app/lib/actions/katello/content_view_version/import.rb +22 -10
  29. data/app/lib/actions/katello/product/destroy.rb +1 -1
  30. data/app/lib/actions/katello/repository/destroy.rb +3 -3
  31. data/app/lib/actions/katello/repository/errata_mail.rb +9 -6
  32. data/app/lib/actions/katello/repository/refresh_repository.rb +1 -1
  33. data/app/lib/actions/katello/repository/sync.rb +13 -6
  34. data/app/lib/actions/katello/repository_set/enable_repository.rb +6 -2
  35. data/app/lib/actions/pulp3/alternate_content_source/refresh_remote.rb +16 -0
  36. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +1 -0
  37. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +1 -1
  38. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +10 -2
  39. data/app/lib/katello/concerns/renderer_extensions.rb +2 -1
  40. data/app/lib/katello/errors.rb +2 -2
  41. data/app/lib/katello/resources/candlepin.rb +7 -1
  42. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -13
  43. data/app/lib/katello/resources/cdn.rb +14 -9
  44. data/app/lib/katello/util/candlepin_repository_checker.rb +73 -0
  45. data/app/models/katello/activation_key.rb +12 -1
  46. data/app/models/katello/alternate_content_source.rb +15 -4
  47. data/app/models/katello/alternate_content_source_product.rb +1 -1
  48. data/app/models/katello/authorization/repository.rb +2 -2
  49. data/app/models/katello/cdn_configuration.rb +12 -3
  50. data/app/models/katello/concerns/host_managed_extensions.rb +15 -2
  51. data/app/models/katello/concerns/http_proxy_extensions.rb +5 -10
  52. data/app/models/katello/concerns/smart_proxy_extensions.rb +30 -15
  53. data/app/models/katello/content.rb +15 -0
  54. data/app/models/katello/content_credential.rb +8 -9
  55. data/app/models/katello/content_view.rb +7 -3
  56. data/app/models/katello/content_view_component.rb +4 -0
  57. data/app/models/katello/content_view_version.rb +1 -1
  58. data/app/models/katello/erratum.rb +6 -2
  59. data/app/models/katello/host/content_facet.rb +13 -3
  60. data/app/models/katello/repository.rb +15 -1
  61. data/app/models/katello/root_repository.rb +0 -2
  62. data/app/overrides/add_smart_proxy_form.rb +5 -0
  63. data/app/presenters/katello/content_view_version_compare_presenter.rb +5 -0
  64. data/app/presenters/katello/host_package_presenter.rb +4 -4
  65. data/app/services/katello/pulp3/alternate_content_source.rb +23 -15
  66. data/app/services/katello/pulp3/ansible_collection.rb +7 -10
  67. data/app/services/katello/pulp3/content_view_version/export.rb +19 -6
  68. data/app/services/katello/pulp3/content_view_version/import.rb +2 -0
  69. data/app/services/katello/pulp3/content_view_version/import_validator.rb +21 -5
  70. data/app/services/katello/pulp3/content_view_version/importable_products.rb +11 -1
  71. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +38 -9
  72. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +12 -5
  73. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +13 -2
  74. data/app/services/katello/pulp3/content_view_version/syncable_format_export.rb +5 -1
  75. data/app/services/katello/pulp3/pulp_content_unit.rb +3 -0
  76. data/app/services/katello/pulp3/repository.rb +18 -6
  77. data/app/services/katello/pulp3/repository_mirror.rb +0 -1
  78. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +2 -2
  79. data/app/services/katello/pulp3/task_group.rb +18 -1
  80. data/app/services/katello/repository_type.rb +5 -2
  81. data/app/services/katello/repository_type_manager.rb +4 -3
  82. data/app/views/dashboard/_content_views_widget.html.erb +1 -1
  83. data/app/views/foreman/job_templates/change_content_source.erb +6 -0
  84. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +7 -1
  85. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +4 -4
  86. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +1 -0
  87. data/app/views/katello/api/v2/alternate_content_sources/permissions.rabl +11 -0
  88. data/app/views/katello/api/v2/content_credentials/show.json.rabl +12 -0
  89. data/app/views/katello/api/v2/content_views/permissions.rabl +1 -0
  90. data/app/views/katello/api/v2/host_packages/base.json.rabl +1 -1
  91. data/app/views/katello/api/v2/module_streams/show.json.rabl +7 -0
  92. data/app/views/katello/api/v2/repositories/compare.json.rabl +10 -0
  93. data/app/views/katello/api/v2/smart_proxies/pulp_info.json.rabl +1 -0
  94. data/app/views/katello/hosts/_errata_counts.html.erb +46 -0
  95. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +1 -0
  96. data/app/views/overrides/smart_proxies/_acs_http_proxy.html.erb +6 -0
  97. data/config/initializers/monkeys.rb +1 -0
  98. data/config/routes/api/v2.rb +2 -0
  99. data/config/routes.rb +3 -0
  100. data/db/migrate/20220730033504_update_custom_cdn.rb +13 -0
  101. data/db/migrate/20220920173656_add_http_proxy_to_smart_proxy.rb +7 -0
  102. data/db/migrate/20220920180858_remove_http_proxy_from_katello_alternate_content_sources.rb +6 -0
  103. data/engines/bastion/app/assets/javascripts/bastion/components/notification.service.js +1 -1
  104. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +5 -5
  105. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +1 -1
  106. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credential.factory.js +17 -0
  107. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.routes.js +10 -0
  108. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-acs.controller.js +36 -0
  109. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-details.controller.js +7 -1
  110. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-acs.html +38 -0
  111. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-details.html +3 -0
  112. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/views/content-credentials.html +7 -2
  113. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +4 -2
  114. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +1 -1
  115. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +4 -3
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +14 -1392
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/katello-features.run.js +1 -0
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +7 -0
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +1 -1
  120. data/lib/katello/permission_creator.rb +1 -0
  121. data/lib/katello/plugin.rb +34 -11
  122. data/lib/katello/repository_types/deb.rb +1 -1
  123. data/lib/katello/repository_types/docker.rb +1 -1
  124. data/lib/katello/repository_types/python.rb +3 -3
  125. data/lib/katello/tasks/check_candlepin_content.rake +16 -0
  126. data/lib/katello/tasks/reset.rake +1 -1
  127. data/lib/katello/version.rb +1 -1
  128. data/lib/monkeys/try_pulp_container_path.rb +35 -0
  129. data/locale/action_names.rb +7 -7
  130. data/locale/bn/katello.po +395 -63
  131. data/locale/cs/katello.po +396 -64
  132. data/locale/de/katello.po +399 -67
  133. data/locale/en/katello.po +395 -63
  134. data/locale/es/katello.po +399 -67
  135. data/locale/fr/katello.po +400 -68
  136. data/locale/gu/katello.po +395 -63
  137. data/locale/hi/katello.po +395 -63
  138. data/locale/it/katello.po +396 -64
  139. data/locale/ja/katello.po +400 -68
  140. data/locale/katello.pot +1916 -1213
  141. data/locale/kn/katello.po +395 -63
  142. data/locale/ko/katello.po +396 -64
  143. data/locale/mr/katello.po +395 -63
  144. data/locale/or/katello.po +395 -63
  145. data/locale/pa/katello.po +395 -63
  146. data/locale/pt/katello.po +395 -63
  147. data/locale/pt_BR/katello.po +399 -67
  148. data/locale/ru/katello.po +396 -64
  149. data/locale/ta/katello.po +395 -63
  150. data/locale/te/katello.po +395 -63
  151. data/locale/zh_CN/katello.po +400 -68
  152. data/locale/zh_TW/katello.po +396 -64
  153. data/webpack/components/Bookmark/index.js +5 -1
  154. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  155. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +6 -0
  156. data/webpack/components/EditableSwitch.js +1 -0
  157. data/webpack/components/EditableTextInput/EditableTextInput.js +3 -3
  158. data/webpack/components/Errata/errataHelpers.js +33 -0
  159. data/webpack/components/Errata/index.js +45 -12
  160. data/webpack/components/Loading.js +18 -8
  161. data/webpack/components/Packages/index.js +8 -24
  162. data/webpack/components/RoutedTabs/index.js +1 -0
  163. data/webpack/components/Search/Search.js +20 -2
  164. data/webpack/components/Search/__tests__/search.test.js +3 -3
  165. data/webpack/components/Table/EmptyStateMessage.js +1 -1
  166. data/webpack/components/Table/PageControls.js +1 -0
  167. data/webpack/components/Table/TableHooks.js +4 -0
  168. data/webpack/components/Table/TableWrapper.js +7 -7
  169. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +1 -0
  170. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -0
  171. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +1 -1
  172. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +3 -1
  173. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +2 -1
  174. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +124 -68
  175. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +5 -0
  176. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +30 -4
  177. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.scss +23 -0
  178. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +5 -4
  179. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +25 -10
  180. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +3 -3
  181. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +6 -0
  182. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +145 -32
  183. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +3 -1
  184. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -1
  185. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  186. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +78 -26
  187. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +23 -10
  188. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesConstants.js +1 -0
  189. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +9 -4
  190. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +141 -23
  191. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.scss +6 -1
  192. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +9 -8
  193. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +24 -3
  194. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +7 -2
  195. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +2 -1
  196. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +20 -4
  197. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +56 -38
  198. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +3 -3
  199. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +5 -4
  200. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +3 -3
  201. data/webpack/containers/Application/config.js +2 -2
  202. data/webpack/containers/Application/overrides.scss +12 -0
  203. data/webpack/global_test_setup.js +19 -1
  204. data/webpack/ouia_id_check.js +0 -2
  205. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -8
  206. data/webpack/scenes/AlternateContentSources/ACSActions.js +37 -6
  207. data/webpack/scenes/AlternateContentSources/ACSConstants.js +2 -0
  208. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +1 -1
  209. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +6 -6
  210. data/webpack/scenes/AlternateContentSources/Acs.scss +3 -0
  211. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +24 -3
  212. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +10 -8
  213. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +25 -4
  214. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +22 -11
  215. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +27 -2
  216. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +49 -17
  217. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +76 -23
  218. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +159 -11
  219. data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +83 -29
  220. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditCredentials.js +9 -8
  221. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +2 -2
  222. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditProducts.js +2 -2
  223. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditSmartProxies.js +39 -7
  224. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +27 -11
  225. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSEdits.test.js +58 -55
  226. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSExpandableDetails.test.js +35 -32
  227. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +323 -150
  228. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +5 -1
  229. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +10 -11
  230. data/webpack/scenes/AlternateContentSources/helpers.js +26 -0
  231. data/webpack/scenes/ContentViews/ContentViewsConstants.js +1 -0
  232. data/webpack/scenes/ContentViews/ContentViewsPage.js +1 -1
  233. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -0
  234. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +1 -0
  235. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -5
  236. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +30 -7
  237. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +1 -0
  238. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +21 -6
  239. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +3 -3
  240. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +1 -0
  241. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +1 -0
  242. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +2 -0
  243. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -0
  244. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -1
  245. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +1 -1
  246. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
  247. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +14 -0
  248. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +11 -1
  249. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +1 -1
  250. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +2 -0
  251. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +5 -0
  252. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +1 -0
  253. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +1 -0
  254. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +8 -2
  255. data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +5 -1
  256. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +22 -6
  257. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +19 -9
  258. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +9 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +9 -2
  260. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +8 -2
  261. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +1 -1
  262. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  263. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +3 -2
  264. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +1 -1
  265. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +1 -1
  268. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +1 -1
  269. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +2 -2
  270. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +2 -0
  271. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -1
  272. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +3 -3
  273. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.js +9 -1
  274. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +83 -0
  275. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +32 -8
  276. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionCompare.test.js +56 -3
  277. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/cvCompareRepositories.fixtures.json +175 -0
  278. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +6 -2
  279. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +3 -3
  280. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +1 -0
  281. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +1 -0
  282. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +2 -2
  283. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +2 -2
  284. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +2 -2
  285. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +1 -0
  286. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +4 -1
  287. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +5 -4
  288. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +5 -1
  289. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -3
  290. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +10 -5
  291. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +2 -0
  292. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +1 -0
  293. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +81 -19
  294. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  295. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +1 -0
  296. data/webpack/scenes/ContentViews/components/InactiveText.js +9 -1
  297. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +4 -2
  298. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +3 -2
  299. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +18 -11
  300. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +15 -8
  301. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +3 -4
  302. data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +55 -0
  303. data/webpack/scenes/Hosts/ChangeContentSource/components/HostsModal.js +59 -0
  304. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +1 -0
  305. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +2 -5
  306. data/webpack/scenes/Hosts/ChangeContentSource/index.js +46 -41
  307. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +5 -5
  308. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +10 -1
  309. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +1 -1
  310. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +97 -2
  311. data/webpack/scenes/Organizations/OrganizationSelectors.js +1 -0
  312. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +2 -1
  313. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +10 -25
  314. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CustomCdnTypeForm.js +154 -0
  315. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/ExportSyncForm.js +4 -4
  316. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/NetworkSyncForm.js +59 -44
  317. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +3 -28
  318. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CustomCdnTypeForm.test.js +97 -0
  319. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/ExportSyncForm.test.js +1 -1
  320. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/NetworkSyncForm.test.js +4 -4
  321. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +23 -10
  322. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +1 -1
  323. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +2 -1
  324. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +5 -5
  325. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +3 -3
  326. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/__snapshots__/UpstreamSubscriptionsPage.test.js.snap +2 -2
  327. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +3 -3
  328. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +3 -3
  329. data/webpack/scenes/Tasks/helpers.js +14 -7
  330. metadata +54 -35
  331. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh_remote.rb +0 -18
  332. data/db/migrate/20221206170122_update_ignore_srpm_to_false_for_mirror_complete.rb +0 -5
  333. 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
- const url = new URL(window.location);
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, List, ListItem } from '@patternfly/react-core';
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
- selectContentHostsIds,
14
- selectHostsWithoutContent,
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 { getFormData, changeContentSource, getContentViews } from './actions';
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 contentHostsIds = useSelector(selectContentHostsIds);
36
- const hostsWithoutContent = useSelector(selectHostsWithoutContent);
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 [environmentId, setEnvironmentId] = useState();
45
- const [contentViewId, setContentViewId] = useState();
46
- const [contentSourceId, setContentSourceId] = useState();
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(environmentId, contentViewId, contentSourceId, contentHostsIds));
59
+ dispatch(changeContentSource(
60
+ environmentId,
61
+ contentViewId,
62
+ contentSourceId,
63
+ contentHosts.map(h => h.id),
64
+ ));
52
65
  };
53
66
 
54
- const handleEnvironment = (envId) => {
55
- if (envId) {
56
- dispatch(getContentViews(envId));
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={setContentSourceId}
117
- contentHostsIds={contentHostsIds}
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 selectContentHostsIds = state =>
23
- selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).content_hosts_ids || [];
22
+ export const selectContentHosts = state =>
23
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).content_hosts || [];
24
24
 
25
- export const selectHostsWithoutContent = state =>
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, CHANGE_CONTENT_SOURCE_DATA).environments || [];
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} /> :
@@ -42,7 +42,7 @@ class ModuleStreamDetails extends Component {
42
42
  };
43
43
 
44
44
  return (
45
- <div>
45
+ <div style={{ margin: '24px' }}>
46
46
  {!loading && <BreadcrumbsBar
47
47
  isLoadingResources={loading}
48
48
  onSwitcherItemClick={(e, url) => this.handleBreadcrumbSwitcherItem(e, url)}
@@ -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, { useState, useEffect, useRef } from '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 = ({ showUpdate, onUpdate, url }) => {
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 firstUpdate = useRef(true);
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
- {showUpdate &&
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={cdnUrl}
75
- onChange={setCdnUrl}
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 || !updateEnabled || !cdnUrl}
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
- showUpdate: PropTypes.bool.isRequired,
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 = ({ showUpdate, onUpdate }) => {
22
- const [updateEnabled, setUpdateEnabled] = useState(showUpdate);
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
- {showUpdate &&
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
- showUpdate: PropTypes.bool.isRequired,
74
+ typeChangeInProgress: PropTypes.bool.isRequired,
75
75
  onUpdate: PropTypes.func,
76
76
  };
77
77