katello 4.3.0 → 4.4.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 (337) 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/api_controller.rb +13 -4
  4. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +3 -0
  5. data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
  6. data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
  7. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
  8. data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
  9. data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
  10. data/app/controllers/katello/api/v2/repositories_controller.rb +17 -7
  11. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  12. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  13. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  14. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  15. data/app/helpers/katello/content_source_helper.rb +43 -0
  16. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  17. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  18. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  19. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  20. data/app/lib/actions/katello/repository/discover.rb +1 -14
  21. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  22. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  23. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  24. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  25. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  26. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  27. data/app/lib/katello/errors.rb +3 -3
  28. data/app/lib/katello/logging.rb +6 -1
  29. data/app/lib/katello/repo_discovery.rb +27 -19
  30. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  31. data/app/lib/katello/resources/cdn.rb +4 -2
  32. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  33. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  34. data/app/models/katello/cdn_configuration.rb +38 -6
  35. data/app/models/katello/concerns/host_managed_extensions.rb +23 -1
  36. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  37. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  38. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  39. data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
  40. data/app/models/katello/content_view.rb +4 -4
  41. data/app/models/katello/content_view_filter.rb +1 -1
  42. data/app/models/katello/content_view_history.rb +1 -1
  43. data/app/models/katello/content_view_version.rb +6 -2
  44. data/app/models/katello/content_view_version_export_history.rb +1 -1
  45. data/app/models/katello/deb.rb +1 -3
  46. data/app/models/katello/docker_meta_tag.rb +1 -1
  47. data/app/models/katello/erratum.rb +0 -15
  48. data/app/models/katello/glue/pulp/repos.rb +1 -1
  49. data/app/models/katello/host/content_facet.rb +2 -27
  50. data/app/models/katello/host/info_provider.rb +9 -0
  51. data/app/models/katello/host/subscription_facet.rb +2 -2
  52. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  53. data/app/models/katello/product.rb +1 -1
  54. data/app/models/katello/product_content.rb +2 -2
  55. data/app/models/katello/repository.rb +10 -9
  56. data/app/models/katello/root_repository.rb +24 -13
  57. data/app/models/katello/rpm.rb +8 -2
  58. data/app/models/setting/content.rb +6 -3
  59. data/app/services/cert/rhsm_client.rb +1 -5
  60. data/app/services/katello/content_unit_indexer.rb +166 -0
  61. data/app/services/katello/organization_creator.rb +12 -4
  62. data/app/services/katello/pulp/repository/docker.rb +1 -1
  63. data/app/services/katello/pulp/repository/yum.rb +0 -54
  64. data/app/services/katello/pulp/repository.rb +0 -6
  65. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  66. data/app/services/katello/pulp3/api/apt.rb +7 -0
  67. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  68. data/app/services/katello/pulp3/deb.rb +10 -9
  69. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  70. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  71. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  72. data/app/services/katello/pulp3/erratum.rb +51 -56
  73. data/app/services/katello/pulp3/file_unit.rb +9 -6
  74. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  75. data/app/services/katello/pulp3/module_stream.rb +76 -30
  76. data/app/services/katello/pulp3/package_group.rb +5 -5
  77. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  78. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  79. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  80. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  81. data/app/services/katello/pulp3/repository/yum.rb +10 -12
  82. data/app/services/katello/pulp3/repository.rb +26 -7
  83. data/app/services/katello/pulp3/repository_mirror.rb +18 -5
  84. data/app/services/katello/pulp3/rpm.rb +13 -13
  85. data/app/services/katello/pulp3/srpm.rb +10 -9
  86. data/app/services/katello/repository_type.rb +15 -4
  87. data/app/services/katello/repository_type_manager.rb +1 -1
  88. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  89. data/app/services/katello/upstream_connection_checker.rb +2 -2
  90. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  91. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  92. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  93. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  94. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  95. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  96. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -0
  97. data/app/views/katello/layouts/react.html.erb +0 -1
  98. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  99. data/config/initializers/monkeys.rb +0 -1
  100. data/config/routes/api/v2.rb +1 -0
  101. data/config/routes/overrides.rb +3 -0
  102. data/config/routes.rb +2 -0
  103. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  104. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  105. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  106. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  107. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  108. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  109. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  110. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  111. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  112. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  113. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  114. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  115. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  116. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +20 -8
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +34 -30
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +16 -2
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +35 -15
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  132. data/lib/katello/engine.rb +4 -0
  133. data/lib/katello/permission_creator.rb +1 -1
  134. data/lib/katello/permissions/host_permissions.rb +3 -1
  135. data/lib/katello/plugin.rb +4 -1
  136. data/lib/katello/repository_types/deb.rb +0 -1
  137. data/lib/katello/repository_types/docker.rb +4 -4
  138. data/lib/katello/repository_types/file.rb +0 -1
  139. data/lib/katello/repository_types/ostree.rb +4 -0
  140. data/lib/katello/repository_types/python.rb +5 -1
  141. data/lib/katello/repository_types/yum.rb +2 -9
  142. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  143. data/lib/katello/tasks/import_applicability.rake +1 -1
  144. data/lib/katello/tasks/jenkins.rake +0 -2
  145. data/lib/katello/tasks/repository.rake +4 -1
  146. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  147. data/lib/katello/version.rb +1 -1
  148. data/locale/action_names.rb +8 -7
  149. data/locale/bn/katello.po +1402 -650
  150. data/locale/cs/katello.po +1217 -96
  151. data/locale/de/katello.po +2359 -1347
  152. data/locale/en/katello.po +1216 -94
  153. data/locale/es/katello.po +2201 -1172
  154. data/locale/fr/katello.po +2601 -1615
  155. data/locale/gu/katello.po +1564 -814
  156. data/locale/hi/katello.po +1563 -810
  157. data/locale/it/katello.po +1311 -282
  158. data/locale/ja/katello.po +2534 -1518
  159. data/locale/katello.pot +3430 -1326
  160. data/locale/kn/katello.po +1564 -812
  161. data/locale/ko/katello.po +1441 -409
  162. data/locale/mr/katello.po +1564 -776
  163. data/locale/or/katello.po +1565 -813
  164. data/locale/pa/katello.po +1559 -792
  165. data/locale/pt/katello.po +1314 -277
  166. data/locale/pt_BR/katello.po +2226 -1181
  167. data/locale/ru/katello.po +1587 -563
  168. data/locale/ta/katello.po +1373 -619
  169. data/locale/te/katello.po +1564 -810
  170. data/locale/zh_CN/katello.po +2936 -1890
  171. data/locale/zh_TW/katello.po +1508 -606
  172. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  173. data/webpack/components/ActionableDetail.js +35 -21
  174. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  175. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  176. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  177. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  178. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  179. data/webpack/components/EditableSwitch.js +8 -2
  180. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  181. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  182. data/webpack/components/Errata/index.js +19 -11
  183. data/webpack/components/Packages/index.js +1 -1
  184. data/webpack/components/Search/Search.js +5 -2
  185. data/webpack/components/Search/__tests__/search.test.js +2 -3
  186. data/webpack/components/SelectOrg/SetOrganization.js +1 -1
  187. data/webpack/components/Table/PageControls.js +3 -6
  188. data/webpack/components/Table/TableHooks.js +46 -7
  189. data/webpack/components/Table/TableWrapper.js +14 -3
  190. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  191. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  192. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  193. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  194. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +3 -4
  195. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  196. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +18 -2
  197. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +12 -0
  198. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +1 -1
  199. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +30 -21
  200. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.scss → ErrataTab/ErrataTab.scss} +0 -0
  201. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +0 -0
  202. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  203. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  204. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  205. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  206. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  207. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  208. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +125 -8
  209. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +27 -4
  210. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +2 -1
  211. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +6 -3
  212. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  213. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  214. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  215. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  216. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  217. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +8 -5
  218. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.scss → TracesTab/TracesTab.scss} +0 -0
  219. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  220. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  221. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  222. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +58 -7
  223. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  224. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +4 -4
  225. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  226. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +12 -5
  227. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  228. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  229. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  230. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  231. data/webpack/components/pf3Table/components/Table.js +2 -3
  232. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  233. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  234. data/webpack/containers/Application/config.js +5 -0
  235. data/webpack/global_index.js +1 -1
  236. data/webpack/global_test_setup.js +1 -1
  237. data/webpack/index.js +7 -0
  238. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  239. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  240. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  241. data/webpack/scenes/Content/ContentConfig.js +55 -5
  242. data/webpack/scenes/Content/ContentPage.js +1 -1
  243. data/webpack/scenes/Content/Details/ContentDetails.js +1 -1
  244. data/webpack/scenes/Content/Details/ContentInfo.js +1 -1
  245. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  246. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  247. data/webpack/scenes/Content/Table/ContentTable.js +1 -1
  248. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  249. data/webpack/scenes/ContentViews/ContentViewsConstants.js +2 -1
  250. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  251. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  252. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +21 -27
  253. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  254. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +8 -3
  255. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +11 -16
  256. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  257. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +14 -8
  258. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  260. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  261. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  262. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  263. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  264. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  265. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +23 -2
  268. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  269. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +16 -17
  270. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  271. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  272. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +30 -34
  273. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  274. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +13 -15
  275. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +1 -1
  276. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +4 -4
  277. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  278. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  279. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +2 -2
  280. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  281. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  282. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  283. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  284. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  285. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  286. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  287. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  288. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  289. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  290. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  291. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  292. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  293. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  294. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  295. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  296. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  297. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  298. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  299. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  300. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  301. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  302. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  303. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  304. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  305. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  306. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  307. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  308. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +6 -1
  309. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  310. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  311. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  312. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  313. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  314. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  315. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  316. data/webpack/services/api/testHelpers.js +5 -3
  317. data/webpack/utils/helpers.js +6 -3
  318. metadata +81 -58
  319. data/app/services/katello/pulp/deb.rb +0 -55
  320. data/app/services/katello/pulp/distribution.rb +0 -7
  321. data/app/services/katello/pulp/docker_blob.rb +0 -7
  322. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  323. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  324. data/app/services/katello/pulp/docker_tag.rb +0 -14
  325. data/app/services/katello/pulp/erratum.rb +0 -129
  326. data/app/services/katello/pulp/file_unit.rb +0 -21
  327. data/app/services/katello/pulp/module_stream.rb +0 -39
  328. data/app/services/katello/pulp/package_category.rb +0 -7
  329. data/app/services/katello/pulp/package_group.rb +0 -20
  330. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  331. data/app/services/katello/pulp/rpm.rb +0 -57
  332. data/app/services/katello/pulp/srpm.rb +0 -29
  333. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  334. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  335. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  336. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  337. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -0,0 +1,90 @@
1
+ import React, { useState } from 'react';
2
+ import {
3
+ Grid,
4
+ GridItem,
5
+ CodeBlock,
6
+ CodeBlockAction,
7
+ CodeBlockCode,
8
+ ClipboardCopyButton,
9
+ ExpandableSection,
10
+ ExpandableSectionToggle,
11
+ } from '@patternfly/react-core';
12
+ import { translate as __ } from 'foremanReact/common/I18n';
13
+ import PropTypes from 'prop-types';
14
+
15
+ import { copyToClipboard } from '../helpers';
16
+
17
+ const ContentSourceTemplate = ({ template, jobInvocationPath }) => {
18
+ const [isExpanded, setIsExpanded] = useState(false);
19
+ const [isCopied, setCopied] = useState(false);
20
+
21
+ const handleCopy = (e) => {
22
+ copyToClipboard(e, template);
23
+ setCopied(true);
24
+ };
25
+
26
+ const actions = (
27
+ <CodeBlockAction>
28
+ <ClipboardCopyButton
29
+ onClick={e => handleCopy(e)}
30
+ exitDelay={600}
31
+ maxWidth="110px"
32
+ variant="plain"
33
+ >
34
+ {isCopied ? __('Copied to clipboard') : __('Copy to clipboard')}
35
+ </ClipboardCopyButton>
36
+ </CodeBlockAction>
37
+ );
38
+
39
+ return (
40
+ <Grid>
41
+ <GridItem span={7}>
42
+ <h1>
43
+ {__("What's next?")}
44
+ </h1>
45
+ <p>
46
+ {jobInvocationPath && (
47
+ <>
48
+ <a href={jobInvocationPath}>
49
+ {__('Run job invocation')}
50
+ </a>
51
+ &nbsp;
52
+ {__('to update configuration on all hosts, or')}
53
+ </>
54
+ )}
55
+ &nbsp;
56
+ {__('update configuration on the hosts manually:')}
57
+ </p>
58
+ </GridItem>
59
+ <GridItem span={7}>
60
+ <CodeBlock actions={actions} className="cs_template_code">
61
+ <CodeBlockCode>
62
+ {__('Change content source')}
63
+ <ExpandableSection isExpanded={isExpanded} isDetached>
64
+ {template}
65
+ </ExpandableSection>
66
+ </CodeBlockCode>
67
+ <ExpandableSectionToggle
68
+ isExpanded={isExpanded}
69
+ onToggle={() => setIsExpanded(!isExpanded)}
70
+ contentId="code-block-expand"
71
+ direction="up"
72
+ >
73
+ {isExpanded ? 'Show less' : 'Show more'}
74
+ </ExpandableSectionToggle>
75
+ </CodeBlock>
76
+ </GridItem>
77
+ </Grid>);
78
+ };
79
+
80
+ ContentSourceTemplate.propTypes = {
81
+ template: PropTypes.string,
82
+ jobInvocationPath: PropTypes.string,
83
+ };
84
+
85
+ ContentSourceTemplate.defaultProps = {
86
+ template: '',
87
+ jobInvocationPath: '',
88
+ };
89
+
90
+ export default ContentSourceTemplate;
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import {
3
+ FormGroup,
4
+ FormSelect,
5
+ FormSelectOption,
6
+ GridItem,
7
+ } from '@patternfly/react-core';
8
+ import { translate as __ } from 'foremanReact/common/I18n';
9
+ import PropTypes from 'prop-types';
10
+
11
+ const FormField = ({
12
+ label, id, value, items, onChange, isLoading, contentHostsCount,
13
+ }) => (
14
+ <GridItem span={7}>
15
+ <FormGroup label={label} fieldId={id} isRequired>
16
+ <FormSelect
17
+ value={value}
18
+ onChange={v => onChange(v)}
19
+ className="without_select2"
20
+ isDisabled={isLoading || items.length === 0 || contentHostsCount === 0}
21
+ id={`${id}_select`}
22
+ isRequired
23
+ >
24
+ <FormSelectOption key={0} value="" label={__('Select ...')} />
25
+ { items.map(item => (
26
+ <FormSelectOption key={item.id} value={item.id} label={item.name} />
27
+ ))}
28
+ </FormSelect>
29
+ </FormGroup>
30
+ </GridItem>
31
+ );
32
+
33
+ FormField.propTypes = {
34
+ label: PropTypes.string.isRequired,
35
+ id: PropTypes.string.isRequired,
36
+ value: PropTypes.string.isRequired,
37
+ items: PropTypes.arrayOf(PropTypes.object).isRequired,
38
+ onChange: PropTypes.func.isRequired,
39
+ isLoading: PropTypes.bool.isRequired,
40
+ contentHostsCount: PropTypes.number.isRequired,
41
+ };
42
+
43
+ export default FormField;
@@ -0,0 +1,3 @@
1
+ export const CHANGE_CONTENT_SOURCE_DATA = 'CHANGE_CONTENT_SOURCE_DATA';
2
+ export const CHANGE_CONTENT_SOURCE = 'CHANGE_CONTENT_SOURCE';
3
+ export const CHANGE_CONTENT_SOURCE_VIEWS = 'CHANGE_CONTENT_SOURCE_VIEWS';
@@ -0,0 +1,27 @@
1
+ import { STATUS } from 'foremanReact/constants';
2
+
3
+ export const getHostIds = () => {
4
+ const cookie = document.cookie.split('; ')
5
+ .find(row => row.startsWith('_ForemanSelectedhosts'));
6
+ const params = new URLSearchParams(cookie);
7
+ const ids = params.get('_ForemanSelectedhosts');
8
+
9
+ if (ids) return JSON.parse(ids);
10
+ return [];
11
+ };
12
+
13
+ export const formIsLoading = (data, contentView, change) => (
14
+ data === STATUS.PENDING ||
15
+ contentView === STATUS.PENDING ||
16
+ change === STATUS.PENDING
17
+ );
18
+
19
+ export const copyToClipboard = (event, textToCopy) => {
20
+ const clipboard = event.currentTarget.parentElement;
21
+ const el = document.createElement('textarea');
22
+ el.value = textToCopy;
23
+ clipboard.appendChild(el);
24
+ el.select();
25
+ document.execCommand('copy');
26
+ clipboard.removeChild(el);
27
+ };
@@ -0,0 +1,126 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { useSelector, useDispatch } from 'react-redux';
3
+
4
+ import { Alert, Grid, GridItem, List, ListItem } from '@patternfly/react-core';
5
+
6
+ import { translate as __ } from 'foremanReact/common/I18n';
7
+ import { STATUS } from 'foremanReact/constants';
8
+ import { foremanUrl } from 'foremanReact/common/helpers';
9
+
10
+ import { selectApiDataStatus,
11
+ selectApiContentViewStatus,
12
+ selectApiChangeContentStatus,
13
+ selectContentHostsIds,
14
+ selectHostsWithoutContent,
15
+ selectEnvironments,
16
+ selectContentSources,
17
+ selectJobInvocationPath,
18
+ selectContentViews,
19
+ selectTemplate } from './selectors';
20
+ import { getHostIds, formIsLoading } from './helpers';
21
+ import { getFormData, changeContentSource, getContentViews } from './actions';
22
+ import ContentSourceForm from './components/ContentSourceForm';
23
+ import ContentSourceTemplate from './components/ContentSourceTemplate';
24
+ import './styles.scss';
25
+
26
+ const ChangeContentSourcePage = () => {
27
+ const dispatch = useDispatch();
28
+
29
+ const apiDataStatus = useSelector(selectApiDataStatus);
30
+ const apiContentViewStatus = useSelector(selectApiContentViewStatus);
31
+ const apiChangeStatus = useSelector(selectApiChangeContentStatus);
32
+
33
+ const isLoading = formIsLoading(apiDataStatus, apiContentViewStatus, apiChangeStatus);
34
+
35
+ const contentHostsIds = useSelector(selectContentHostsIds);
36
+ const hostsWithoutContent = useSelector(selectHostsWithoutContent);
37
+ const environments = useSelector(selectEnvironments);
38
+ const contentSources = useSelector(selectContentSources);
39
+ const jobInvocationPath = useSelector(selectJobInvocationPath);
40
+
41
+ const template = useSelector(selectTemplate);
42
+ const contentViews = useSelector(selectContentViews);
43
+
44
+ const [environmentId, setEnvironmentId] = useState();
45
+ const [contentViewId, setContentViewId] = useState();
46
+ const [contentSourceId, setContentSourceId] = useState();
47
+
48
+ const handleSubmit = (e) => {
49
+ e.preventDefault();
50
+
51
+ dispatch(changeContentSource(environmentId, contentViewId, contentSourceId, contentHostsIds));
52
+ };
53
+
54
+ const handleEnvironment = (envId) => {
55
+ if (envId) {
56
+ dispatch(getContentViews(envId));
57
+ }
58
+
59
+ setEnvironmentId(envId);
60
+ 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
+
81
+ useEffect(() => {
82
+ dispatch(getFormData());
83
+ }, [dispatch]);
84
+
85
+ if (getHostIds().length === 0) {
86
+ return (
87
+ <Grid className="margin-40">
88
+ <GridItem span={7}>
89
+ <Alert
90
+ variant="danger"
91
+ title={__('No hosts with content source found!')}
92
+ />
93
+ { hostsWithoutContent.length > 0 && <IgnoredHostsAlert /> }
94
+ </GridItem>
95
+ </Grid>);
96
+ }
97
+
98
+ return (
99
+ <Grid className="margin-40">
100
+ <GridItem span={7}>
101
+ <h1>{__('Change host content source')}</h1>
102
+
103
+ { hostsWithoutContent.length > 0 && <IgnoredHostsAlert /> }
104
+ </GridItem>
105
+
106
+ <ContentSourceForm
107
+ handleSubmit={handleSubmit}
108
+ environments={environments}
109
+ handleEnvironment={handleEnvironment}
110
+ environmentId={environmentId}
111
+ contentViews={contentViews}
112
+ handleContentView={setContentViewId}
113
+ contentViewId={contentViewId}
114
+ contentSources={contentSources}
115
+ contentSourceId={contentSourceId}
116
+ handleContentSource={setContentSourceId}
117
+ contentHostsIds={contentHostsIds}
118
+ isLoading={isLoading}
119
+ />
120
+ { apiChangeStatus === STATUS.RESOLVED &&
121
+ <ContentSourceTemplate template={template} jobInvocationPath={jobInvocationPath} /> }
122
+ </Grid>
123
+ );
124
+ };
125
+
126
+ export default ChangeContentSourcePage;
@@ -0,0 +1,42 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIResponse,
4
+ selectAPIError,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+
7
+ import { CHANGE_CONTENT_SOURCE_DATA, CHANGE_CONTENT_SOURCE, CHANGE_CONTENT_SOURCE_VIEWS } from './constants';
8
+
9
+ // API statuses
10
+ export const selectApiDataStatus = state =>
11
+ selectAPIStatus(state, CHANGE_CONTENT_SOURCE_DATA);
12
+
13
+ export const selectApiContentViewStatus = state =>
14
+ selectAPIStatus(state, CHANGE_CONTENT_SOURCE_VIEWS);
15
+
16
+ export const selectApiChangeContentStatus = state =>
17
+ selectAPIStatus(state, CHANGE_CONTENT_SOURCE);
18
+
19
+ export const selectError = state => selectAPIError(state, CHANGE_CONTENT_SOURCE);
20
+
21
+ // Selectors
22
+ export const selectContentHostsIds = state =>
23
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).content_hosts_ids || [];
24
+
25
+ export const selectHostsWithoutContent = state =>
26
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).hosts_without_content || [];
27
+
28
+ export const selectEnvironments = state =>
29
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).environments || [];
30
+
31
+ export const selectContentSources = state =>
32
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).content_sources || [];
33
+
34
+ export const selectJobInvocationPath = state =>
35
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_DATA).job_invocation_path;
36
+
37
+ export const selectContentViews = state =>
38
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE_VIEWS).results || [];
39
+
40
+ export const selectTemplate = state =>
41
+ selectAPIResponse(state, CHANGE_CONTENT_SOURCE) || '';
42
+
@@ -0,0 +1,11 @@
1
+ .cs_template_code pre {
2
+ border: 0px !important;
3
+ }
4
+
5
+ .cs_alert {
6
+ margin-bottom: 40px;
7
+ }
8
+
9
+ .margin-40 {
10
+ margin: 40px;
11
+ }
@@ -2,7 +2,6 @@ import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
2
  import ModuleStreamDetailProfiles from '../ModuleStreamDetailProfiles';
3
3
  import { details } from '../../__tests__/moduleStreamDetails.fixtures';
4
4
 
5
- jest.mock('foremanReact/components/Pagination/PaginationWrapper');
6
5
 
7
6
  const fixtures = {
8
7
  'renders with profiles': {
@@ -2,8 +2,6 @@ import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
2
  import ModuleStreamDetails from '../ModuleStreamDetails';
3
3
  import { details, loadingState } from './moduleStreamDetails.fixtures';
4
4
 
5
- jest.mock('foremanReact/components/Pagination/PaginationWrapper');
6
-
7
5
  const mockFunc = jest.fn();
8
6
 
9
7
  const baseProps = {
@@ -4,8 +4,6 @@ import toJson from 'enzyme-to-json';
4
4
  import ModuleStreamsPage from '../ModuleStreamsPage';
5
5
  import ContentPage from '../../../components/Content/ContentPage';
6
6
 
7
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
8
-
9
7
  describe('Module streams page', () => {
10
8
  it('should render and contain appropiate components', async () => {
11
9
  const moduleStreams = {};
@@ -5,8 +5,6 @@ import ContentTable from '../../../components/Content/ContentTable';
5
5
  import TableSchema from '../../ModuleStreams/ModuleStreamsTableSchema';
6
6
  import { Table } from '../../../components/pf3Table';
7
7
 
8
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
9
-
10
8
  describe('Module streams table', () => {
11
9
  it('should render and contain appropiate components', async () => {
12
10
  const moduleStreams = {
@@ -39,7 +39,7 @@ const updateCdnConfigurationErrorToast = (error) => {
39
39
  return messages;
40
40
  };
41
41
 
42
- export const updateCdnConfiguration = (params) => {
42
+ export const updateCdnConfiguration = (params, updateResults, onError) => {
43
43
  const nonNullParams = Object.keys(params)
44
44
  .filter(key => params[key] !== null)
45
45
  .reduce((a, k) => ({ ...a, [k]: params[k] }), {});
@@ -51,6 +51,10 @@ export const updateCdnConfiguration = (params) => {
51
51
  params: nonNullParams,
52
52
  errorToast: error => updateCdnConfigurationErrorToast(error),
53
53
  successToast: response => updateCdnConfigurationSuccessToast(response),
54
+ updateData: (_, resp) => {
55
+ updateResults(resp);
56
+ },
57
+ handleError: onError,
54
58
  });
55
59
  };
56
60
 
@@ -6,6 +6,7 @@ import React, { Component } from 'react';
6
6
  import PropTypes from 'prop-types';
7
7
  import { isEmpty } from 'lodash';
8
8
  import { Grid, Row, Col } from 'react-bootstrap';
9
+ import { Skeleton, Alert } from '@patternfly/react-core';
9
10
  import { Button } from 'patternfly-react';
10
11
  import { translate as __ } from 'foremanReact/common/I18n';
11
12
  import PermissionDenied from 'foremanReact/components/PermissionDenied';
@@ -15,6 +16,7 @@ import SearchBar from './components/SearchBar';
15
16
  import RecommendedRepositorySetsToggler from './components/RecommendedRepositorySetsToggler';
16
17
  import { getSetsComponent, getEnabledComponent } from './helpers';
17
18
  import api from '../../services/api';
19
+ import { AIRGAPPED } from '../Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants';
18
20
 
19
21
  class RedHatRepositoriesPage extends Component {
20
22
  componentDidMount() {
@@ -22,12 +24,13 @@ class RedHatRepositoriesPage extends Component {
22
24
  }
23
25
 
24
26
  loadData() {
27
+ this.props.loadOrganization();
25
28
  this.props.loadEnabledRepos();
26
29
  this.props.loadRepositorySets({ search: { filters: ['rpm'] } });
27
30
  }
28
31
 
29
32
  render() {
30
- const { enabledRepositories, repositorySets } = this.props;
33
+ const { enabledRepositories, repositorySets, organization } = this.props;
31
34
  const { repoParams } = createEnabledRepoParams(enabledRepositories);
32
35
 
33
36
  if (!isEmpty(repositorySets.missingPermissions)) {
@@ -36,6 +39,26 @@ class RedHatRepositoriesPage extends Component {
36
39
  if (!isEmpty(enabledRepositories.missingPermissions)) {
37
40
  return <PermissionDenied missingPermissions={enabledRepositories.missingPermissions} />;
38
41
  }
42
+ if (!(organization?.cdn_configuration)) {
43
+ return <Skeleton />;
44
+ }
45
+ if (organization.cdn_configuration.type === AIRGAPPED) {
46
+ return (
47
+ <Grid id="redhatRepositoriesPage" bsClass="container-fluid">
48
+ <h1>{__('Red Hat Repositories')}</h1>
49
+ <Row className="toolbar-pf">
50
+ <Col>
51
+ <Alert
52
+ variant="info"
53
+ className="repo-sets-alert"
54
+ isInline
55
+ title={__('CDN configuration is set to Air-gapped (disconnected). Repository enablement/disablement is not permitted on this page.')}
56
+ />
57
+ </Col>
58
+ </Row>
59
+ </Grid>
60
+ );
61
+ }
39
62
 
40
63
  return (
41
64
  <Grid id="redhatRepositoriesPage" bsClass="container-fluid">
@@ -99,6 +122,7 @@ class RedHatRepositoriesPage extends Component {
99
122
  }
100
123
 
101
124
  RedHatRepositoriesPage.propTypes = {
125
+ loadOrganization: PropTypes.func.isRequired,
102
126
  loadEnabledRepos: PropTypes.func.isRequired,
103
127
  loadRepositorySets: PropTypes.func.isRequired,
104
128
  updateRecommendedRepositorySets: PropTypes.func.isRequired,
@@ -115,6 +139,12 @@ RedHatRepositoriesPage.propTypes = {
115
139
  // eslint-disable-next-line react/forbid-prop-types
116
140
  missingPermissions: PropTypes.array,
117
141
  }).isRequired,
142
+ organization: PropTypes.shape({
143
+ cdn_configuration: PropTypes.shape({
144
+ type: PropTypes.string,
145
+ }),
146
+ }).isRequired,
147
+
118
148
  };
119
149
 
120
150
  export default RedHatRepositoriesPage;
@@ -9,6 +9,7 @@ describe('RedHatRepositories page', () => {
9
9
  const page = shallow(<RedHatRepositoriesPage
10
10
  loadEnabledRepos={jest.fn()}
11
11
  loadRepositorySets={jest.fn()}
12
+ loadOrganization={jest.fn()}
12
13
  updateRecommendedRepositorySets={jest.fn()}
13
14
  enabledRepositories={{
14
15
  loading: false,
@@ -22,11 +23,19 @@ describe('RedHatRepositories page', () => {
22
23
  search: {},
23
24
  missingPermissions: [],
24
25
  }}
26
+ organization={{
27
+ id: 1000,
28
+ cdn_configuration: {
29
+ type: 'redhat_cdn',
30
+ url: 'http://cdn.example.com',
31
+ },
32
+ }}
25
33
  />);
26
34
 
27
35
  const permissionDeniedPage = shallow(<RedHatRepositoriesPage
28
36
  loadEnabledRepos={jest.fn()}
29
37
  loadRepositorySets={jest.fn()}
38
+ loadOrganization={jest.fn()}
30
39
  updateRecommendedRepositorySets={jest.fn()}
31
40
  enabledRepositories={{
32
41
  loading: false,
@@ -39,6 +48,13 @@ describe('RedHatRepositories page', () => {
39
48
  search: {},
40
49
  missingPermissions: ['view_organizations'],
41
50
  }}
51
+ organization={{
52
+ id: 1000,
53
+ cdn_configuration: {
54
+ type: 'redhat_cdn',
55
+ url: 'http://cdn.example.com',
56
+ },
57
+ }}
42
58
  />);
43
59
 
44
60
  it('should render', async () => {
@@ -112,9 +112,18 @@ exports[`RedHatRepositories page should render 1`] = `
112
112
  <div
113
113
  className="sticky-pagination sticky-pagination-grey"
114
114
  >
115
- <PaginationWrapper
115
+ <Pagination
116
+ className={null}
117
+ isCompact={true}
118
+ itemCount={0}
119
+ noSidePadding={false}
116
120
  onChange={[Function]}
117
- viewType="list"
121
+ onPerPageSelect={null}
122
+ onSetPage={null}
123
+ page={1}
124
+ perPage={null}
125
+ updateParamsByUrl={true}
126
+ variant="bottom"
118
127
  />
119
128
  </div>
120
129
  </ListView>
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { ListView } from 'patternfly-react';
3
3
  import { sprintf, translate as __ } from 'foremanReact/common/I18n';
4
- import Pagination from 'foremanReact/components/Pagination/PaginationWrapper';
4
+ import Pagination from 'foremanReact/components/Pagination';
5
5
 
6
6
  import RepositorySet from './components/RepositorySet';
7
7
  import EnabledRepository from './components/EnabledRepository';
@@ -34,10 +34,10 @@ export const getSetsComponent = (repoSetsState, onPaginationChange) => {
34
34
  <ListView>
35
35
  <div className="sticky-pagination">
36
36
  <Pagination
37
- viewType="list"
38
37
  itemCount={itemCount}
39
- pagination={pagination}
40
38
  onChange={onPaginationChange}
39
+ isCompact
40
+ {...pagination}
41
41
  />
42
42
  </div>
43
43
  {results.map(set => <RepositorySet id={set.id} key={set.id} {...set} />)}
@@ -64,10 +64,10 @@ export const getEnabledComponent = (enabledReposState, onPaginationChange) => {
64
64
  <ListView>
65
65
  <div className="sticky-pagination sticky-pagination-grey">
66
66
  <Pagination
67
- viewType="list"
67
+ isCompact
68
68
  itemCount={itemCount}
69
- pagination={pagination}
70
69
  onChange={onPaginationChange}
70
+ {...pagination}
71
71
  />
72
72
  </div>
73
73
  {repositories.map(repo => <EnabledRepository key={repo.id} {...repo} />)}
@@ -1,23 +1,31 @@
1
1
  /* eslint-disable import/no-extraneous-dependencies */
2
2
  /* eslint import/no-unresolved: [2, { ignore: [foremanReact/*] }] */
3
3
  /* eslint-disable import/no-unresolved */
4
-
4
+ import { bindActionCreators } from 'redux';
5
5
  import { connect } from 'react-redux';
6
6
  import { loadEnabledRepos } from '../../redux/actions/RedHatRepositories/enabled';
7
7
  import { loadRepositorySets, updateRecommendedRepositorySets } from '../../redux/actions/RedHatRepositories/sets';
8
8
  import RedHatRepositoriesPage from './RedHatRepositoriesPage';
9
+ import * as organizationActions from '../Organizations/OrganizationActions';
9
10
 
10
11
  const mapStateToProps = ({
11
12
  katello: {
12
13
  redHatRepositories: { enabled, sets },
14
+ organization,
13
15
  },
14
16
  }) => ({
15
17
  enabledRepositories: enabled,
16
18
  repositorySets: sets,
19
+ organization,
17
20
  });
18
21
 
19
- export default connect(mapStateToProps, {
22
+ // map action dispatchers to props
23
+ const actions = {
24
+ ...organizationActions,
20
25
  loadEnabledRepos,
21
26
  loadRepositorySets,
22
27
  updateRecommendedRepositorySets,
23
- })(RedHatRepositoriesPage);
28
+ };
29
+ const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
30
+
31
+ export default connect(mapStateToProps, mapDispatchToProps)(RedHatRepositoriesPage);