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,72 @@
1
+ {
2
+ "total": 18,
3
+ "subtotal": 3,
4
+ "selectable": 3,
5
+ "page": "1",
6
+ "per_page": "20",
7
+ "error": null,
8
+ "search": null,
9
+ "sort": {
10
+ "by": null,
11
+ "order": null
12
+ },
13
+ "results": [
14
+ {
15
+ "id": 32376,
16
+ "pulp_id": "/pulp/api/v3/content/rpm/packages/4b817f2d-d428-4eb4-aa4c-6cd9dc2a0300/",
17
+ "name": "cheetah",
18
+ "version": "0.3",
19
+ "release": "0.8",
20
+ "arch": "noarch",
21
+ "epoch": "0",
22
+ "summary": "A dummy package of cheetah",
23
+ "modular": false,
24
+ "filename": "cheetah-0.3-0.8.noarch.rpm",
25
+ "sourcerpm": "cheetah-0.3-0.8.src.rpm",
26
+ "checksum": "422d0baa0cd9d7713ae796e886a23e17f578f924f74880debdbb7d65fb368dae",
27
+ "nvrea": "cheetah-0.3-0.8.noarch",
28
+ "nvra": "cheetah-0.3-0.8.noarch",
29
+ "uuid": "/pulp/api/v3/content/rpm/packages/4b817f2d-d428-4eb4-aa4c-6cd9dc2a0300/",
30
+ "hosts_available_count": 0,
31
+ "hosts_applicable_count": 0
32
+ },
33
+ {
34
+ "id": 32372,
35
+ "pulp_id": "/pulp/api/v3/content/rpm/packages/c7aee0d3-32d9-49dd-99f9-9269fae7cb6f/",
36
+ "name": "duck",
37
+ "version": "0.7",
38
+ "release": "1",
39
+ "arch": "noarch",
40
+ "epoch": "0",
41
+ "summary": "Quack like a duck at the park.",
42
+ "modular": true,
43
+ "filename": "duck-0.7-1.noarch.rpm",
44
+ "sourcerpm": "duck-0.7-1.src.rpm",
45
+ "checksum": "5bd363b860ad6783217cbca3bbc3ef260f98d140ffb121bf4c208e3f66c24712",
46
+ "nvrea": "duck-0.7-1.noarch",
47
+ "nvra": "duck-0.7-1.noarch",
48
+ "uuid": "/pulp/api/v3/content/rpm/packages/c7aee0d3-32d9-49dd-99f9-9269fae7cb6f/",
49
+ "hosts_available_count": 0,
50
+ "hosts_applicable_count": 0
51
+ },
52
+ {
53
+ "id": 32370,
54
+ "pulp_id": "/pulp/api/v3/content/rpm/packages/0e9309fd-1a4a-4799-bb49-f3919531b575/",
55
+ "name": "elephant",
56
+ "version": "0.3",
57
+ "release": "0.8",
58
+ "arch": "noarch",
59
+ "epoch": "0",
60
+ "summary": "A dummy package of elephant",
61
+ "modular": false,
62
+ "filename": "elephant-0.3-0.8.noarch.rpm",
63
+ "sourcerpm": "elephant-0.3-0.8.src.rpm",
64
+ "checksum": "3e1c70cd1b421328acaf6397cb3d16145306bb95f65d1b095fc31372a0a701f3",
65
+ "nvrea": "elephant-0.3-0.8.noarch",
66
+ "nvra": "elephant-0.3-0.8.noarch",
67
+ "uuid": "/pulp/api/v3/content/rpm/packages/0e9309fd-1a4a-4799-bb49-f3919531b575/",
68
+ "hosts_available_count": 0,
69
+ "hosts_applicable_count": 0
70
+ }
71
+ ]
72
+ }
@@ -1,6 +1,7 @@
1
1
  import { REX_FEATURES } from './RemoteExecutionConstants';
2
- import { KATELLO_TRACER_PACKAGE, TRACES_SEARCH_QUERY } from './HostTracesConstants';
3
- import { ERRATA_SEARCH_QUERY } from '../HostErrata/HostErrataConstants';
2
+ import { TRACES_SEARCH_QUERY } from './TracesTab/HostTracesConstants';
3
+ import { ERRATA_SEARCH_QUERY } from './ErrataTab/HostErrataConstants';
4
+ import { PACKAGE_SEARCH_QUERY } from '../YumInstallablePackages/YumInstallablePackagesConstants';
4
5
 
5
6
  export const createJob = ({
6
7
  hostname, feature, inputs,
@@ -15,10 +16,16 @@ export const createJob = ({
15
16
  return `/job_invocations/new?${urlQuery}`;
16
17
  };
17
18
 
18
- export const katelloPackageInstallUrl = ({ hostname }) => createJob({
19
+ export const katelloPackageInstallUrl = ({ hostname, packages }) => createJob({
19
20
  hostname,
20
21
  feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL,
21
- inputs: { package: KATELLO_TRACER_PACKAGE },
22
+ inputs: { package: packages },
23
+ });
24
+
25
+ export const katelloPackageInstallBySearchUrl = ({ hostname, search }) => createJob({
26
+ hostname,
27
+ feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL_BY_SEARCH,
28
+ inputs: { [PACKAGE_SEARCH_QUERY]: search },
22
29
  });
23
30
 
24
31
  export const resolveTraceUrl = ({ hostname, search }) => createJob({
@@ -29,6 +36,6 @@ export const resolveTraceUrl = ({ hostname, search }) => createJob({
29
36
 
30
37
  export const errataInstallUrl = ({ hostname, search }) => createJob({
31
38
  hostname,
32
- feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL,
39
+ feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH,
33
40
  inputs: { [ERRATA_SEARCH_QUERY]: search },
34
41
  });
@@ -0,0 +1,18 @@
1
+ import { API_OPERATIONS, get } from 'foremanReact/redux/API';
2
+ import katelloApi from '../../../../services/api';
3
+ import { HOST_YUM_INSTALLABLE_PACKAGES_KEY } from './YumInstallablePackagesConstants';
4
+
5
+ export const getHostYumInstallablePackages = (hostId, params) => get({
6
+ type: API_OPERATIONS.GET,
7
+ key: HOST_YUM_INSTALLABLE_PACKAGES_KEY,
8
+ url: katelloApi.getApiUrl('/packages'),
9
+ params: {
10
+ ...params,
11
+ host_id: hostId,
12
+ packages_restrict_not_installed: true,
13
+ packages_restrict_applicable: false,
14
+ packages_restrict_latest: true,
15
+ },
16
+ });
17
+ export default getHostYumInstallablePackages;
18
+
@@ -0,0 +1,3 @@
1
+ export const HOST_YUM_INSTALLABLE_PACKAGES_KEY = 'HOST_YUM_INSTALLABLE_PACKAGES';
2
+ export const PACKAGE_SEARCH_QUERY = 'Package search query';
3
+ export default HOST_YUM_INSTALLABLE_PACKAGES_KEY;
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { HOST_YUM_INSTALLABLE_PACKAGES_KEY } from './YumInstallablePackagesConstants';
8
+
9
+ export const selectHostYumInstallablePackages = state =>
10
+ selectAPIResponse(state, HOST_YUM_INSTALLABLE_PACKAGES_KEY) || {};
11
+
12
+ export const selectHostYumInstallablePackagesStatus = state =>
13
+ selectAPIStatus(state, HOST_YUM_INSTALLABLE_PACKAGES_KEY) || STATUS.PENDING;
14
+
15
+ export const selectHostYumInstallablePackagesError = state =>
16
+ selectAPIError(state, HOST_YUM_INSTALLABLE_PACKAGES_KEY);
@@ -0,0 +1,19 @@
1
+ import { propsToCamelCase } from 'foremanReact/common/helpers';
2
+
3
+ export const REMOTE_EXECUTION = 'remoteExecution';
4
+ export const KATELLO_AGENT = 'katelloAgent';
5
+
6
+ const defaultRemoteActionMethod = ({ hostDetails }) => {
7
+ const {
8
+ content_facet_attributes: contentFacetAttributes,
9
+ } = hostDetails;
10
+ const contentFacet = propsToCamelCase(contentFacetAttributes ?? {});
11
+ const katelloAgentAvailable = (contentFacet.katelloAgentInstalled &&
12
+ contentFacet.katelloAgentEnabled);
13
+ if (contentFacet.remoteExecutionByDefault || !katelloAgentAvailable) {
14
+ return REMOTE_EXECUTION;
15
+ }
16
+ return KATELLO_AGENT;
17
+ };
18
+
19
+ export default defaultRemoteActionMethod;
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { Table as PfTable } from 'patternfly-react';
4
4
  import { noop } from 'foremanReact/common/helpers';
5
5
  import EmptyState from 'foremanReact/components/common/EmptyState';
6
- import Pagination from 'foremanReact/components/Pagination/PaginationWrapper';
6
+ import Pagination from 'foremanReact/components/Pagination';
7
7
 
8
8
  import TableBody from './TableBody';
9
9
 
@@ -43,10 +43,9 @@ const Table = ({
43
43
  </PfTable.PfProvider>
44
44
  {shouldRenderPagination && (
45
45
  <Pagination
46
- viewType="table"
47
46
  itemCount={itemCount}
48
- pagination={pagination}
49
47
  onChange={onPaginationChange}
48
+ {...pagination}
50
49
  />
51
50
  )}
52
51
  </div>
@@ -1,10 +1,7 @@
1
1
  import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
-
3
2
  import Table from './Table';
4
3
  import { columnsFixtures, rowsFixtures } from './TableFixtures';
5
4
 
6
- jest.mock('foremanReact/components/Pagination/PaginationWrapper');
7
-
8
5
  const fixtures = {
9
6
  'renders Table with emptyState': {
10
7
  columns: columnsFixtures,
@@ -137,16 +137,17 @@ exports[`Table renders Table with pagination 1`] = `
137
137
  >
138
138
  some children
139
139
  </TablePfProvider>
140
- <PaginationWrapper
140
+ <Pagination
141
+ className={null}
141
142
  itemCount={2}
143
+ noSidePadding={false}
142
144
  onChange={[Function]}
143
- pagination={
144
- Object {
145
- "page": 1,
146
- "perPage": 20,
147
- }
148
- }
149
- viewType="table"
145
+ onPerPageSelect={null}
146
+ onSetPage={null}
147
+ page={1}
148
+ perPage={20}
149
+ updateParamsByUrl={true}
150
+ variant="bottom"
150
151
  />
151
152
  </div>
152
153
  `;
@@ -14,6 +14,7 @@ import ContentViewDetails from '../../scenes/ContentViews/Details';
14
14
  import Content from '../../scenes/Content';
15
15
  import ContentDetails from '../../scenes/Content/Details';
16
16
  import withHeader from './withHeaders';
17
+ import ChangeContentSource from '../../scenes/Hosts/ChangeContentSource';
17
18
 
18
19
  // eslint-disable-next-line import/prefer-default-export
19
20
  export const links = [
@@ -75,4 +76,8 @@ export const links = [
75
76
  path: 'content/:content_type([a-z_]+)/:id([0-9]+)',
76
77
  component: WithOrganization(withHeader(ContentDetails, { title: __('Content Details') })),
77
78
  },
79
+ {
80
+ path: 'change_host_content_source',
81
+ component: WithOrganization(withHeader(ChangeContentSource, { title: __('Change host content source') })),
82
+ },
78
83
  ];
@@ -11,7 +11,7 @@ import ErrataOverviewCard from './components/extensions/HostDetails/Cards/Errata
11
11
 
12
12
  // import SubscriptionTab from './components/extensions/HostDetails/Tabs/SubscriptionTab';
13
13
  import RepositorySetsTab from './components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab';
14
- import TracesTab from './components/extensions/HostDetails/Tabs/TracesTab';
14
+ import TracesTab from './components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js';
15
15
  import extendReducer from './components/extensions/reducers';
16
16
  import rootReducer from './redux/reducers';
17
17
 
@@ -8,7 +8,7 @@ global.console.error = (error, stack) => {
8
8
  };
9
9
 
10
10
  // Increase jest timeout as some tests using multiple http mocks can time out on CI systems.
11
- jest.setTimeout(300000);
11
+ jest.setTimeout(process.env.JEST_TIMEOUT || 15000);
12
12
 
13
13
  afterAll(() => {
14
14
  jest.resetModules();
data/webpack/index.js CHANGED
@@ -6,6 +6,8 @@
6
6
  import componentRegistry from 'foremanReact/components/componentRegistry';
7
7
  import Application from './containers/Application/index';
8
8
  import Content from './scenes/SmartProxy/Content';
9
+ import ChangeContentSource from './scenes/Hosts/ChangeContentSource';
10
+
9
11
  import './redux';
10
12
  // Not currently mocking anything
11
13
  // import './services/api/setupMocks';
@@ -19,3 +21,8 @@ componentRegistry.register({
19
21
  name: 'Content',
20
22
  type: Content,
21
23
  });
24
+
25
+ componentRegistry.register({
26
+ name: 'ChangeContentSource',
27
+ type: ChangeContentSource,
28
+ });
@@ -2,8 +2,6 @@ import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
2
  import AnsibleCollectionDetails from '../AnsibleCollectionDetails';
3
3
  import { details, loadingState } from './AnsibleCollectionDetails.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 AnsibleCollectionsPage from '../AnsibleCollectionsPage';
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('Ansible Collections page', () => {
10
8
  it('should render and contain appropiate components', async () => {
11
9
  const ansibleCollections = {};
@@ -5,8 +5,6 @@ import ContentTable from '../../../components/Content/ContentTable';
5
5
  import TableSchema from '../../AnsibleCollections/AnsibleCollectionsTableSchema';
6
6
  import { Table } from '../../../components/pf3Table';
7
7
 
8
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
9
-
10
8
  describe('Ansible Collections table', () => {
11
9
  it('should render and contain appropiate components', async () => {
12
10
  const ansibleCollections = {
@@ -1,5 +1,4 @@
1
1
  import React from 'react';
2
- import { Link } from 'react-router-dom';
3
2
  import { urlBuilder } from 'foremanReact/common/urlHelpers';
4
3
  import { translate as __ } from 'foremanReact/common/I18n';
5
4
  import ContentInfo from './Details/ContentInfo';
@@ -7,7 +6,8 @@ import LastSync from '../ContentViews/Details/Repositories/LastSync';
7
6
  import ContentRepositories from './Details/ContentRepositories';
8
7
  import ContentCounts from '../ContentViews/Details/Repositories/ContentCounts';
9
8
 
10
- export default () => [
9
+ // Keep in mind when editing this file that the ContentViewVersionDetailConfig consumes this array.
10
+ export default [
11
11
  {
12
12
  names: {
13
13
  pluralTitle: __('Python Packages'),
@@ -18,7 +18,7 @@ export default () => [
18
18
  singularLabel: 'python_package',
19
19
  },
20
20
  columnHeaders: [
21
- { title: __('Name'), getProperty: unit => (<Link to={urlBuilder(`content/python_packages/${unit?.id}`, '')}>{unit?.name}</Link>) },
21
+ { title: __('Name'), getProperty: unit => (<a href={urlBuilder(`content/python_packages/${unit?.id}`, '')}>{unit?.name}</a>) },
22
22
  { title: __('Version'), getProperty: unit => unit?.version },
23
23
  { title: __('Filename'), getProperty: unit => unit?.filename },
24
24
  ],
@@ -82,6 +82,57 @@ export default () => [
82
82
  pluralLabel: 'ostree_refs',
83
83
  singularLabel: 'ostree_ref',
84
84
  },
85
+ columnHeaders: [
86
+ { title: __('Name'), getProperty: unit => (<a href={urlBuilder(`content/ostree_refs/${unit?.id}`, '')}>{unit?.name}</a>) },
87
+ { title: __('Version'), getProperty: unit => unit?.version },
88
+ ],
89
+ tabs: [
90
+ {
91
+ tabKey: 'details',
92
+ title: __('Details'),
93
+ getContent: (contentType, id, tabKey) => <ContentInfo {...{ contentType, id, tabKey }} />,
94
+ columnHeaders: [
95
+ { title: __('Name'), getProperty: unit => unit?.name },
96
+ { title: __('Version'), getProperty: unit => unit?.version },
97
+ ],
98
+ },
99
+ {
100
+ tabKey: 'repositories',
101
+ title: __('Repositories'),
102
+ getContent: (contentType, id, tabKey) =>
103
+ <ContentRepositories {...{ contentType, id, tabKey }} />,
104
+ columnHeaders: [
105
+ {
106
+ title: __('Name'),
107
+ getProperty: unit =>
108
+ <a href={urlBuilder(`products/${unit?.product.id}/repositories/${unit?.id}`, '')}>{unit?.name}</a>,
109
+ },
110
+ {
111
+ title: __('Product'),
112
+ getProperty: unit =>
113
+ <a href={urlBuilder(`products/${unit?.product.id}`, '')}>{unit?.product.name}</a>,
114
+ },
115
+ {
116
+ title: __('Sync Status'),
117
+ getProperty: unit =>
118
+ (<LastSync
119
+ startedAt={unit?.started_at}
120
+ lastSyncWords={unit?.last_sync_words}
121
+ lastSync={unit?.last_sync}
122
+ />),
123
+ },
124
+ {
125
+ title: __('Content Count'),
126
+ getProperty: unit =>
127
+ (<ContentCounts
128
+ productId={unit.product.id}
129
+ repoId={unit.id}
130
+ counts={unit.content_counts}
131
+ />),
132
+ },
133
+ ],
134
+ },
135
+ ],
85
136
  },
86
137
  {
87
138
  names: {
@@ -93,11 +144,10 @@ export default () => [
93
144
  singularLabel: 'ansible_collection',
94
145
  },
95
146
  columnHeaders: [
96
- { title: __('Name'), getProperty: unit => (<Link to={urlBuilder(`content/ansible_collections/${unit?.id}`, '')}>{unit?.name}</Link>) },
147
+ { title: __('Name'), getProperty: unit => (<a href={urlBuilder(`content/ansible_collections/${unit?.id}`, '')}>{unit?.name}</a>) },
97
148
  { title: __('Author'), getProperty: unit => unit?.namespace },
98
149
  { title: __('Version'), getProperty: unit => unit?.version },
99
150
  { title: __('Checksum'), getProperty: unit => unit?.checksum },
100
-
101
151
  ],
102
152
  tabs: [
103
153
  {
@@ -27,7 +27,7 @@ const ContentPage = () => {
27
27
  const types = {};
28
28
  contentTypesResponse.forEach((type) => {
29
29
  if (type.generic_browser) {
30
- const typeConfig = ContentConfig().find(config =>
30
+ const typeConfig = ContentConfig.find(config =>
31
31
  config.names.singularLabel === type.label);
32
32
  if (typeConfig) {
33
33
  const { names } = typeConfig;
@@ -16,7 +16,7 @@ const ContentDetails = () => {
16
16
 
17
17
  const { id, content_type: contentType } = useParams();
18
18
  const contentId = Number(id);
19
- const config = ContentConfig().find(type =>
19
+ const config = ContentConfig.find(type =>
20
20
  type.names.pluralLabel === contentType);
21
21
  const { pluralTitle, pluralLabel } = config.names;
22
22
 
@@ -19,7 +19,7 @@ const ContentInfo = ({ contentType, id, tabKey }) => {
19
19
  const detailsResponse = useSelector(selectContentDetails);
20
20
  const detailsStatus = useSelector(selectContentDetailsStatus);
21
21
 
22
- const config = contentConfig().find(type => type.names.pluralLabel === contentType);
22
+ const config = contentConfig.find(type => type.names.pluralLabel === contentType);
23
23
  const { columnHeaders } = config.tabs.find(header => header.tabKey === tabKey);
24
24
 
25
25
  useEffect(() => {
@@ -20,7 +20,7 @@ const ContentRepositories = ({ contentType, id, tabKey }) => {
20
20
  const [searchQuery, updateSearchQuery] = useState('');
21
21
  const { results, ...metadata } = response;
22
22
 
23
- const config = contentConfig().find(type => type.names.pluralLabel === contentType);
23
+ const config = contentConfig.find(type => type.names.pluralLabel === contentType);
24
24
  const typeSingularLabel = config.names.singularLabel;
25
25
  const { columnHeaders } = config.tabs.find(header => header.tabKey === tabKey);
26
26
 
@@ -59,8 +59,8 @@ test('Can call API for Python package details and show details tab on page load'
59
59
  test('Can call API for Python package repository details and show repositories tab', async (done) => {
60
60
  const autocompleteUrl = '/repositories/auto_complete_search';
61
61
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
62
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
63
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
62
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
63
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
64
64
 
65
65
  const results = pythonPackageRepositoryDetailsResponse.results[0];
66
66
  const repoName = results.name;
@@ -122,8 +122,8 @@ test('Can call API for Ansible collection details and show details tab on page l
122
122
  test('Can call API for Ansible collection repository details and show repositories tab', async (done) => {
123
123
  const autocompleteUrl = '/repositories/auto_complete_search';
124
124
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
125
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
126
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
125
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
126
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
127
127
 
128
128
  const results = ansibleCollectionRepositoryDetailsResponse.results[0];
129
129
  const repoName = results.name;
@@ -18,7 +18,7 @@ const ContentTable = ({
18
18
  const [searchQuery, updateSearchQuery] = useState('');
19
19
  const { results, ...metadata } = response;
20
20
 
21
- const { columnHeaders } = contentConfig().find(type =>
21
+ const { columnHeaders } = contentConfig.find(type =>
22
22
  type.names.singularLabel === contentTypes[selectedContentType][0]);
23
23
 
24
24
  return (
@@ -16,8 +16,8 @@ let searchDelayScope;
16
16
  let autoSearchScope;
17
17
 
18
18
  beforeEach(() => {
19
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
20
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
19
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
20
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
21
21
  });
22
22
 
23
23
  afterEach(() => {
@@ -74,7 +74,7 @@ test('Can call API for Ansible collections and show table on page load', async (
74
74
  renderWithRedux(<ContentTable
75
75
  contentTypes={mockContentTypes}
76
76
  selectedContentType="Ansible Collections"
77
- setSelectedContentType={() => {}}
77
+ setSelectedContentType={() => { }}
78
78
  showContentTypeSelector={false}
79
79
  />);
80
80
 
@@ -1,4 +1,5 @@
1
1
  import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { toUpper } from 'lodash';
2
3
 
3
4
  const CONTENT_VIEWS_KEY = 'CONTENT_VIEWS';
4
5
  export const CREATE_CONTENT_VIEW_KEY = 'CONTENT_VIEW_CREATE';
@@ -22,11 +23,11 @@ export const RPM_PACKAGE_GROUPS_CONTENT = 'RPM_PACKAGE_GROUPS_CONTENT';
22
23
  export const REPOSITORY_CONTENT = 'REPOSITORY_CONTENT';
23
24
  export const ERRATA_CONTENT = 'ERRATA_CONTENT';
24
25
  export const DOCKER_TAGS_CONTENT = 'DOCKER_TAGS_CONTENT';
25
- export const ANSIBLE_COLLECTIONS_CONTENT = 'ANSIBLE_COLLECTIONS_CONTENT';
26
26
  export const MODULE_STREAMS_CONTENT = 'MODULE_STREAMS_CONTENT';
27
27
  export const DEB_PACKAGES_CONTENT = 'DEB_PACKAGES_CONTENT';
28
28
  export const RPM_PACKAGES_CONTENT = 'RPM_PACKAGES_CONTENT';
29
29
  export const FILE_CONTENT = 'FILE_CONTENT';
30
+ export const generatedContentKey = pluralLabel => `${toUpper(pluralLabel)}_CONTENT`;
30
31
  export const cvDetailsKey = cvId => `${CONTENT_VIEWS_KEY}_${cvId}`;
31
32
  export const cvDetailsRepoKey = cvId => `${CONTENT_VIEWS_KEY}_REPOSITORIES_${cvId}`;
32
33
  export const cvFilterRepoKey = filterId => `CV_FILTER_REPOSITORIES_${filterId}`;
@@ -44,8 +44,8 @@ beforeEach(() => {
44
44
  .get('/api/v2/bookmarks')
45
45
  .query(true)
46
46
  .reply(200, {});
47
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
48
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
47
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
48
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
49
49
  });
50
50
 
51
51
  afterEach(() => {
@@ -99,12 +99,12 @@ test('Can call API for CVs and show Delete Wizard for the row', async (done) =>
99
99
  test('Can open Delete wizard and delete CV with all steps', async (done) => {
100
100
  const hostAutocompleteUrl = '/hosts/auto_complete_search';
101
101
  const hostAutocompleteScope = mockForemanAutocomplete(nockInstance, hostAutocompleteUrl);
102
- const hostSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
103
- const hostAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
102
+ const hostSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
103
+ const hostAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
104
104
  const akAutocompleteUrl = '/activation_keys/auto_complete_search';
105
105
  const akAutocompleteScope = mockAutocomplete(nockInstance, akAutocompleteUrl);
106
- const akSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
107
- const akAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
106
+ const akSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
107
+ const akAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
108
108
 
109
109
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
110
110
 
@@ -25,8 +25,8 @@ let autoSearchScope;
25
25
  beforeEach(() => {
26
26
  const { results } = cvComponentData;
27
27
  [firstComponent] = results;
28
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
29
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
28
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
29
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
30
30
  });
31
31
 
32
32
  afterEach(() => {