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
@@ -1,5 +1,7 @@
1
1
  import { useState, useRef, useEffect, useCallback } from 'react';
2
2
  import { isEmpty } from 'lodash';
3
+ import { useLocation } from 'react-router-dom';
4
+ import { friendlySearchParam } from '../../utils/helpers';
3
5
 
4
6
  class ReactConnectedSet extends Set {
5
7
  constructor(initialValue, forceRender) {
@@ -68,6 +70,7 @@ export const useSelectionSet = ({
68
70
  const pageIds = results?.map(result => result[idColumn]) ?? [];
69
71
  const selectableResults = results?.filter(result => isSelectable(result)) ?? [];
70
72
  const selectableIds = new Set(selectableResults.map(result => result[idColumn]));
73
+ const selectedResults = useRef({}); // { id: result }
71
74
  const canSelect = id => selectableIds.has(id);
72
75
  const areAllRowsOnPageSelected = () =>
73
76
  Number(pageIds?.length) > 0 &&
@@ -76,13 +79,28 @@ export const useSelectionSet = ({
76
79
  const areAllRowsSelected = () =>
77
80
  Number(selectionSet.size) > 0 && selectionSet.size === Number(metadata.selectable);
78
81
 
79
- const selectPage = () => selectionSet.addAll(pageIds.filter(canSelect));
80
- const selectNone = () => selectionSet.clear();
81
- const selectOne = (isSelected, id) => {
82
+ const selectPage = () => {
83
+ const selectablePageIds = pageIds.filter(canSelect);
84
+ selectionSet.addAll(selectablePageIds);
85
+ // eslint-disable-next-line no-restricted-syntax
86
+ for (const result of selectableResults) {
87
+ selectedResults.current[result[idColumn]] = result;
88
+ }
89
+ };
90
+ const clearSelectedResults = () => {
91
+ selectedResults.current = {};
92
+ };
93
+ const selectNone = () => {
94
+ selectionSet.clear();
95
+ clearSelectedResults();
96
+ };
97
+ const selectOne = (isSelected, id, data) => {
82
98
  if (canSelect(id)) {
83
99
  if (isSelected) {
100
+ if (data) selectedResults.current[id] = data;
84
101
  selectionSet.add(id);
85
102
  } else {
103
+ delete selectedResults.current[id];
86
104
  selectionSet.delete(id);
87
105
  }
88
106
  }
@@ -102,6 +120,8 @@ export const useSelectionSet = ({
102
120
  isSelected,
103
121
  isSelectable: canSelect,
104
122
  selectionSet,
123
+ selectedResults: Object.values(selectedResults.current),
124
+ clearSelectedResults,
105
125
  };
106
126
  };
107
127
 
@@ -117,6 +137,7 @@ export const useBulkSelect = ({
117
137
  results,
118
138
  metadata,
119
139
  initialArry = [],
140
+ initialSearchQuery = '',
120
141
  idColumn = 'id',
121
142
  isSelectable,
122
143
  }) => {
@@ -125,7 +146,7 @@ export const useBulkSelect = ({
125
146
  results, metadata, initialArry, idColumn, isSelectable,
126
147
  });
127
148
  const exclusionSet = useSet([]);
128
- const [searchQuery, updateSearchQuery] = useState('');
149
+ const [searchQuery, updateSearchQuery] = useState(initialSearchQuery);
129
150
  const [selectAllMode, setSelectAllMode] = useState(false);
130
151
  const selectedCount = selectAllMode ?
131
152
  Number(metadata.selectable) - exclusionSet.size : selectOptions.selectedCount;
@@ -155,9 +176,10 @@ export const useBulkSelect = ({
155
176
  setSelectAllMode(false);
156
177
  exclusionSet.clear();
157
178
  inclusionSet.clear();
158
- }, [exclusionSet, inclusionSet]);
179
+ selectOptions.clearSelectedResults();
180
+ }, [exclusionSet, inclusionSet, selectOptions]);
159
181
 
160
- const selectOne = (isRowSelected, id) => {
182
+ const selectOne = (isRowSelected, id, data) => {
161
183
  if (selectAllMode) {
162
184
  if (isRowSelected) {
163
185
  exclusionSet.delete(id);
@@ -165,7 +187,7 @@ export const useBulkSelect = ({
165
187
  exclusionSet.add(id);
166
188
  }
167
189
  } else {
168
- selectOptions.selectOne(isRowSelected, id);
190
+ selectOptions.selectOne(isRowSelected, id, data);
169
191
  }
170
192
  };
171
193
 
@@ -219,3 +241,20 @@ export const useBulkSelect = ({
219
241
  areAllRowsSelected,
220
242
  };
221
243
  };
244
+
245
+ // takes a url query like ?type=security&search=name+~+foo
246
+ // and returns an object
247
+ // {
248
+ // type: 'security',
249
+ // searchParam: 'name ~ foo'
250
+ // }
251
+ export const useUrlParams = () => {
252
+ const location = useLocation();
253
+ const { search: urlSearchParam, ...urlParams }
254
+ = Object.fromEntries(new URLSearchParams(location.search).entries());
255
+ const searchParam = urlSearchParam ? friendlySearchParam(urlSearchParam) : '';
256
+ return {
257
+ searchParam,
258
+ ...urlParams,
259
+ };
260
+ };
@@ -26,6 +26,7 @@ const TableWrapper = ({
26
26
  foremanApiAutoComplete,
27
27
  searchQuery,
28
28
  updateSearchQuery,
29
+ searchPlaceholderText,
29
30
  additionalListeners,
30
31
  activeFilters,
31
32
  displaySelectAllCheckbox,
@@ -35,6 +36,8 @@ const TableWrapper = ({
35
36
  areAllRowsOnPageSelected,
36
37
  areAllRowsSelected,
37
38
  selectedCount,
39
+ selectedResults,
40
+ clearSelectedResults,
38
41
  emptySearchBody,
39
42
  disableSearch,
40
43
  nodesBelowSearch,
@@ -182,10 +185,12 @@ const TableWrapper = ({
182
185
  <Search
183
186
  isDisabled={unresolvedStatusOrNoRows && !searchQuery}
184
187
  patternfly4
188
+ initialInputValue={searchQuery && searchQuery}
185
189
  onSearch={search => updateSearchQuery(search)}
186
190
  getAutoCompleteParams={getAutoCompleteParams}
187
191
  foremanApiAutoComplete={foremanApiAutoComplete}
188
192
  bookmarkController={bookmarkController}
193
+ placeholder={searchPlaceholderText}
189
194
  />
190
195
  </FlexItem>
191
196
  }
@@ -260,6 +265,7 @@ TableWrapper.propTypes = {
260
265
  }),
261
266
  autocompleteEndpoint: PropTypes.string.isRequired,
262
267
  foremanApiAutoComplete: PropTypes.bool,
268
+ searchPlaceholderText: PropTypes.string,
263
269
  actionButtons: PropTypes.node,
264
270
  toggleGroup: PropTypes.node,
265
271
  children: PropTypes.node,
@@ -279,6 +285,8 @@ TableWrapper.propTypes = {
279
285
  ])),
280
286
  displaySelectAllCheckbox: PropTypes.bool,
281
287
  selectedCount: PropTypes.number,
288
+ selectedResults: PropTypes.arrayOf(PropTypes.object),
289
+ clearSelectedResults: PropTypes.func,
282
290
  selectAll: PropTypes.func,
283
291
  selectNone: PropTypes.func,
284
292
  selectPage: PropTypes.func,
@@ -297,13 +305,16 @@ TableWrapper.defaultProps = {
297
305
  activeFilters: [],
298
306
  defaultFilters: [],
299
307
  foremanApiAutoComplete: false,
308
+ searchPlaceholderText: undefined,
300
309
  actionButtons: null,
301
310
  toggleGroup: null,
302
311
  displaySelectAllCheckbox: false,
303
312
  selectedCount: 0,
304
- selectAll: noop,
305
- selectNone: noop,
306
- selectPage: noop,
313
+ selectedResults: [],
314
+ clearSelectedResults: noop,
315
+ selectAll: undefined,
316
+ selectNone: undefined,
317
+ selectPage: undefined,
307
318
  areAllRowsOnPageSelected: noop,
308
319
  areAllRowsSelected: noop,
309
320
  emptySearchBody: __('Try changing your search settings.'),
@@ -22,6 +22,7 @@ const TypeAhead = ({
22
22
  autoSearchEnabled,
23
23
  autoSearchDelay,
24
24
  bookmarkController,
25
+ placeholder,
25
26
  }) => {
26
27
  const [inputValue, setInputValue] = useState(initialInputValue);
27
28
 
@@ -79,6 +80,7 @@ const TypeAhead = ({
79
80
  onSearch,
80
81
  items,
81
82
  activeItems,
83
+ placeholder,
82
84
  shouldShowItems: isOpen && items.length > 0,
83
85
  };
84
86
 
@@ -86,7 +88,7 @@ const TypeAhead = ({
86
88
  <div>
87
89
  {patternfly4 ?
88
90
  <TypeAheadSearchPf4 autoSearchEnabled={autoSearchEnabled} {...typeAheadProps} /> :
89
- <TypeAheadSearch actionText={actionText} {...typeAheadProps} />}
91
+ <TypeAheadSearch actionText={actionText} {...typeAheadProps} placeholder={null} />}
90
92
  </div>
91
93
  );
92
94
  }}
@@ -112,6 +114,7 @@ TypeAhead.propTypes = {
112
114
  autoSearchEnabled: PropTypes.bool.isRequired,
113
115
  autoSearchDelay: PropTypes.number,
114
116
  bookmarkController: PropTypes.string,
117
+ placeholder: PropTypes.string,
115
118
  };
116
119
 
117
120
  TypeAhead.defaultProps = {
@@ -121,6 +124,7 @@ TypeAhead.defaultProps = {
121
124
  isDisabled: undefined,
122
125
  autoSearchDelay: 500,
123
126
  bookmarkController: undefined,
127
+ placeholder: undefined,
124
128
  };
125
129
 
126
130
  export default TypeAhead;
@@ -8,7 +8,7 @@ import { commonInputPropTypes } from '../helpers/commonPropTypes';
8
8
  import './TypeAheadInput.scss';
9
9
 
10
10
  const TypeAheadInput = ({
11
- onKeyPress, onInputFocus, passedProps, isDisabled, autoSearchEnabled,
11
+ onKeyPress, onInputFocus, passedProps, isDisabled, autoSearchEnabled, placeholder,
12
12
  }) => {
13
13
  const inputRef = useRef(null);
14
14
  const {
@@ -33,6 +33,7 @@ const TypeAheadInput = ({
33
33
  onChange={onChangeWrapper}
34
34
  type="search"
35
35
  iconVariant={autoSearchEnabled && 'search'}
36
+ placeholder={placeholder}
36
37
  />
37
38
  {
38
39
  value && (
@@ -50,10 +51,12 @@ TypeAheadInput.propTypes = {
50
51
  isDisabled: PropTypes.bool,
51
52
  autoSearchEnabled: PropTypes.bool.isRequired,
52
53
  ...commonInputPropTypes,
54
+ placeholder: PropTypes.string,
53
55
  };
54
56
 
55
57
  TypeAheadInput.defaultProps = {
56
58
  isDisabled: undefined,
59
+ placeholder: '',
57
60
  };
58
61
 
59
62
  export default TypeAheadInput;
@@ -12,7 +12,7 @@ import Bookmark from './../../../components/Bookmark';
12
12
  const TypeAheadSearch = ({
13
13
  userInputValue, clearSearch, getInputProps, getItemProps, isOpen, highlightedIndex,
14
14
  selectedItem, selectItem, openMenu, onSearch, items, activeItems, shouldShowItems,
15
- autoSearchEnabled, isDisabled, bookmarkController, inputValue,
15
+ autoSearchEnabled, isDisabled, bookmarkController, inputValue, placeholder,
16
16
  }) => (
17
17
  <>
18
18
  <InputGroup>
@@ -34,6 +34,7 @@ const TypeAheadSearch = ({
34
34
  onInputFocus={openMenu}
35
35
  passedProps={{ ...getInputProps(), clearSearch }}
36
36
  autoSearchEnabled={autoSearchEnabled}
37
+ placeholder={placeholder}
37
38
  />
38
39
  <>
39
40
  {bookmarkController &&
@@ -26,7 +26,7 @@ const HostContentViewDetails = ({
26
26
  }
27
27
 
28
28
  return (
29
- <GridItem rowSpan={2} md={6} lg={4}>
29
+ <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
30
30
  <Card isHoverable>
31
31
  <CardHeader>
32
32
  <CardTitle>{__('Content view details')}</CardTitle>
@@ -8,7 +8,6 @@ import {
8
8
  FlexItem,
9
9
  GridItem,
10
10
  } from '@patternfly/react-core';
11
- import { urlBuilder } from 'foremanReact/common/urlHelpers';
12
11
  import { translate as __ } from 'foremanReact/common/I18n';
13
12
  import { propsToCamelCase } from 'foremanReact/common/helpers';
14
13
  import PropTypes from 'prop-types';
@@ -30,7 +29,7 @@ function HostInstallableErrata({
30
29
  w: 'enhancements', x: 'enhancement', y: errataEnhance, z: errataTotal,
31
30
  }];
32
31
  return (
33
- <GridItem rowSpan={2} md={3} lg={4}>
32
+ <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
34
33
  <Card isHoverable>
35
34
  <CardHeader>
36
35
  <CardTitle>{__('Installable Errata')}</CardTitle>
@@ -38,7 +37,7 @@ function HostInstallableErrata({
38
37
  <CardBody>
39
38
  <Flex direction="column">
40
39
  <FlexItem>
41
- <a href={urlBuilder(`content_hosts/${id}/errata`, '')}>
40
+ <a href="#/Content/errata">
42
41
  {errataTotal} errata
43
42
  </a>
44
43
  </FlexItem>
@@ -61,7 +60,7 @@ function HostInstallableErrata({
61
60
  />
62
61
  </div>
63
62
  </div>
64
- <div className="erratalegend">
63
+ <div className="erratalegend" style={{ minWidth: '140px' }}>
65
64
  <FlexItem>
66
65
  <ErrataMapper data={chartData} id={id} />
67
66
  </FlexItem>
@@ -0,0 +1,2 @@
1
+ const hostIdNotReady = { type: 'NOOP_HOST_ID_NOT_READY' };
2
+ export default hostIdNotReady;
@@ -1,6 +1,13 @@
1
- import { API_OPERATIONS, get } from 'foremanReact/redux/API';
1
+ import { API_OPERATIONS, get, put } from 'foremanReact/redux/API';
2
+ import { renderTaskStartedToast } from '../../../../scenes/Tasks/helpers';
2
3
  import { foremanApi } from '../../../../services/api';
3
- import { HOST_PACKAGES_KEY } from './HostPackagesConstants';
4
+ import { getResponseErrorMsgs } from '../../../../utils/helpers';
5
+ import { HOST_PACKAGES_INSTALL_KEY, HOST_PACKAGES_KEY } from './HostPackagesConstants';
6
+
7
+ const errorToast = (error) => {
8
+ const message = getResponseErrorMsgs(error.response);
9
+ return message;
10
+ };
4
11
 
5
12
  export const getInstalledPackagesWithLatest = (hostId, params) => get({
6
13
  type: API_OPERATIONS.GET,
@@ -9,3 +16,12 @@ export const getInstalledPackagesWithLatest = (hostId, params) => get({
9
16
  params,
10
17
  });
11
18
  export default getInstalledPackagesWithLatest;
19
+
20
+ export const installPackageViaKatelloAgent = (hostId, params) => put({
21
+ type: API_OPERATIONS.PUT,
22
+ key: HOST_PACKAGES_INSTALL_KEY,
23
+ url: foremanApi.getApiUrl(`/hosts/${hostId}/packages/install`),
24
+ handleSuccess: ({ data }) => renderTaskStartedToast(data),
25
+ errorToast: error => errorToast(error),
26
+ params,
27
+ });
@@ -1,2 +1,14 @@
1
1
  export const HOST_PACKAGES_KEY = 'HOST_PACKAGES';
2
+ export const HOST_PACKAGES_INSTALL_KEY = 'HOST_PACKAGES_KATELLO_AGENT_INSTALL';
3
+
4
+ export const PACKAGES_VERSION_STATUSES = {
5
+ UPGRADABLE: 'Upgradable',
6
+ UP_TO_DATE: 'Up-to date',
7
+ };
8
+
9
+ export const VERSION_STATUSES_TO_PARAM = {
10
+ [PACKAGES_VERSION_STATUSES.UPGRADABLE]: 'upgradable',
11
+ [PACKAGES_VERSION_STATUSES.UP_TO_DATE]: 'up-to-date',
12
+ };
13
+
2
14
  export default HOST_PACKAGES_KEY;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { Route, Switch, Redirect } from 'react-router-dom';
3
3
  import { PackagesTab } from '../PackagesTab';
4
- import { ErrataTab } from '../ErrataTab';
4
+ import { ErrataTab } from '../ErrataTab/ErrataTab.js';
5
5
  import { route } from './helpers';
6
6
 
7
7
  const SecondaryTabRoutes = () => (
@@ -20,18 +20,20 @@ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
20
20
  import IsoDate from 'foremanReact/components/common/dates/IsoDate';
21
21
  import { urlBuilder } from 'foremanReact/common/urlHelpers';
22
22
  import { propsToCamelCase } from 'foremanReact/common/helpers';
23
- import SelectableDropdown from '../../../SelectableDropdown';
24
- import { useSet, useBulkSelect } from '../../../../components/Table/TableHooks';
25
- import TableWrapper from '../../../../components/Table/TableWrapper';
26
- import { ErrataType, ErrataSeverity } from '../../../../components/Errata';
27
- import { getInstallableErrata, regenerateApplicability, applyViaKatelloAgent } from '../HostErrata/HostErrataActions';
23
+ import SelectableDropdown from '../../../../SelectableDropdown';
24
+ import { useSet, useBulkSelect, useUrlParams } from '../../../../../components/Table/TableHooks';
25
+ import TableWrapper from '../../../../../components/Table/TableWrapper';
26
+ import { ErrataType, ErrataSeverity } from '../../../../../components/Errata';
27
+ import { getInstallableErrata, regenerateApplicability, applyViaKatelloAgent } from './HostErrataActions';
28
28
  import ErratumExpansionDetail from './ErratumExpansionDetail';
29
29
  import ErratumExpansionContents from './ErratumExpansionContents';
30
- import { selectHostErrataStatus } from '../HostErrata/HostErrataSelectors';
31
- import { HOST_ERRATA_KEY, ERRATA_TYPES, ERRATA_SEVERITIES, TYPES_TO_PARAM, SEVERITIES_TO_PARAM } from '../HostErrata/HostErrataConstants';
32
- import { installErrata } from './RemoteExecutionActions';
33
- import { errataInstallUrl } from './customizedRexUrlHelpers';
30
+ import { selectHostErrataStatus } from './HostErrataSelectors';
31
+ import { HOST_ERRATA_KEY, ERRATA_TYPES, ERRATA_SEVERITIES, TYPES_TO_PARAM, SEVERITIES_TO_PARAM, PARAM_TO_FRIENDLY_NAME } from './HostErrataConstants';
32
+ import { installErrata } from '../RemoteExecutionActions';
33
+ import { errataInstallUrl } from '../customizedRexUrlHelpers';
34
34
  import './ErrataTab.scss';
35
+ import hostIdNotReady from '../../HostDetailsActions';
36
+ import defaultRemoteActionMethod, { KATELLO_AGENT } from '../../hostDetailsHelpers';
35
37
 
36
38
  export const ErrataTab = () => {
37
39
  const hostDetails = useSelector(state => selectAPIResponse(state, 'HOST_DETAILS'));
@@ -46,14 +48,21 @@ export const ErrataTab = () => {
46
48
  const [ALL, INSTALLABLE] = toggleGroupStates;
47
49
  const ERRATA_TYPE = __('Type');
48
50
  const ERRATA_SEVERITY = __('Severity');
49
- const [toggleGroupState, setToggleGroupState] = useState(INSTALLABLE);
50
-
51
51
  const [isBulkActionOpen, setIsBulkActionOpen] = useState(false);
52
52
  const toggleBulkAction = () => setIsBulkActionOpen(prev => !prev);
53
53
  const expandedErrata = useSet([]);
54
54
  const erratumIsExpanded = id => expandedErrata.has(id);
55
- const [errataTypeSelected, setErrataTypeSelected] = useState(ERRATA_TYPE);
56
- const [errataSeveritySelected, setErrataSeveritySelected] = useState(ERRATA_SEVERITY);
55
+ const {
56
+ type: initialType,
57
+ severity: initialSeverity,
58
+ show,
59
+ searchParam,
60
+ } = useUrlParams();
61
+ const [toggleGroupState, setToggleGroupState] = useState(show ?? INSTALLABLE);
62
+ const [errataTypeSelected, setErrataTypeSelected]
63
+ = useState(PARAM_TO_FRIENDLY_NAME[initialType] ?? ERRATA_TYPE);
64
+ const [errataSeveritySelected, setErrataSeveritySelected]
65
+ = useState(PARAM_TO_FRIENDLY_NAME[initialSeverity] ?? ERRATA_SEVERITY);
57
66
  const activeFilters = [errataTypeSelected, errataSeveritySelected];
58
67
  const defaultFilters = [ERRATA_TYPE, ERRATA_SEVERITY];
59
68
 
@@ -72,7 +81,7 @@ export const ErrataTab = () => {
72
81
 
73
82
  const fetchItems = useCallback(
74
83
  (params) => {
75
- if (!hostId) return null;
84
+ if (!hostId) return hostIdNotReady;
76
85
  const modifiedParams = { ...params };
77
86
  if (errataTypeSelected !== ERRATA_TYPE) {
78
87
  modifiedParams.type = TYPES_TO_PARAM[errataTypeSelected];
@@ -104,6 +113,7 @@ export const ErrataTab = () => {
104
113
  metadata,
105
114
  idColumn: 'errata_id',
106
115
  isSelectable: result => result.installable,
116
+ initialSearchQuery: searchParam || '',
107
117
  });
108
118
 
109
119
  if (!hostId) return <Skeleton />;
@@ -146,13 +156,12 @@ export const ErrataTab = () => {
146
156
  { errata_ids: [id] },
147
157
  ));
148
158
 
149
- const katelloAgentAvailable = (contentFacet.katelloAgentInstalled &&
150
- contentFacet.katelloAgentEnabled);
159
+ const defaultRemoteAction = defaultRemoteActionMethod({ hostDetails });
151
160
  const apply = () => {
152
- if (contentFacet.remoteExecutionByDefault || !katelloAgentAvailable) {
153
- applyViaRemoteExecution();
154
- } else {
161
+ if (defaultRemoteAction === KATELLO_AGENT) {
155
162
  applyByKatelloAgent();
163
+ } else {
164
+ applyViaRemoteExecution();
156
165
  }
157
166
  };
158
167
 
@@ -167,7 +176,7 @@ export const ErrataTab = () => {
167
176
  </DropdownItem>,
168
177
  ];
169
178
 
170
- if (katelloAgentAvailable) {
179
+ if (defaultRemoteAction === KATELLO_AGENT) {
171
180
  dropdownItems.push((
172
181
  <DropdownItem
173
182
  aria-label="apply_via_katello_agent"
@@ -239,7 +248,7 @@ export const ErrataTab = () => {
239
248
  );
240
249
 
241
250
  const hostIsNonLibrary = (
242
- !contentFacet.contentViewDefault && !contentFacet.lifecycleEnvironmentLibrary
251
+ contentFacet?.contentViewDefault === false && contentFacet.lifecycleEnvironmentLibrary === false
243
252
  );
244
253
  const toggleGroup = (
245
254
  <Split hasGutter>
@@ -1,8 +1,8 @@
1
1
  import { API_OPERATIONS, get, put } from 'foremanReact/redux/API';
2
- import { foremanApi } from '../../../../services/api';
2
+ import { foremanApi } from '../../../../../services/api';
3
3
  import { HOST_ERRATA_KEY, HOST_ERRATA_APPLICABILITY_KEY, HOST_ERRATA_APPLY_KEY } from './HostErrataConstants';
4
- import { getResponseErrorMsgs } from '../../../../utils/helpers';
5
- import { renderTaskStartedToast } from '../../../../scenes/Tasks/helpers';
4
+ import { getResponseErrorMsgs } from '../../../../../utils/helpers';
5
+ import { renderTaskStartedToast } from '../../../../../scenes/Tasks/helpers';
6
6
 
7
7
  const errorToast = (error) => {
8
8
  const message = getResponseErrorMsgs(error.response);
@@ -29,6 +29,17 @@ export const SEVERITIES_TO_PARAM = {
29
29
  [ERRATA_SEVERITIES.CRITICAL]: 'Critical',
30
30
  };
31
31
 
32
+ export const PARAM_TO_FRIENDLY_NAME = {
33
+ security: 'Security',
34
+ bugfix: 'Bugfix',
35
+ enhancement: 'Enhancement',
36
+ none: 'N/A',
37
+ low: 'Low',
38
+ moderate: 'Moderate',
39
+ important: 'Important',
40
+ critical: 'Critical',
41
+ };
42
+
32
43
  export default HOST_ERRATA_KEY;
33
44
 
34
45
  export const ERRATA_SEARCH_QUERY = 'Errata search query';