katello 4.3.0.rc4 → 4.4.0.rc2

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 (458) 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 +4 -1
  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_bulk_actions_controller.rb +10 -1
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +42 -14
  12. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  13. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  14. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  15. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  16. data/app/graphql/types/host_collection.rb +18 -0
  17. data/app/helpers/katello/content_source_helper.rb +43 -0
  18. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  19. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  20. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  21. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  22. data/app/lib/actions/katello/repository/discover.rb +1 -14
  23. data/app/lib/actions/katello/repository/errata_mail.rb +4 -5
  24. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  25. data/app/lib/actions/katello/repository/sync.rb +2 -2
  26. data/app/lib/actions/pulp3/abstract.rb +1 -1
  27. data/app/lib/actions/pulp3/abstract_async_task.rb +1 -1
  28. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +14 -4
  29. data/app/lib/actions/pulp3/content_view_version/create_import_history.rb +1 -2
  30. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  31. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  32. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  33. data/app/lib/actions/pulp3/repository/reclaim_space.rb +3 -10
  34. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  35. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  36. data/app/lib/katello/errors.rb +3 -3
  37. data/app/lib/katello/logging.rb +6 -1
  38. data/app/lib/katello/repo_discovery.rb +27 -19
  39. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  40. data/app/lib/katello/resources/cdn.rb +4 -2
  41. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  42. data/app/lib/katello/util/pulpcore_content_filters.rb +2 -1
  43. data/app/models/katello/candlepin/repository_mapper.rb +3 -2
  44. data/app/models/katello/cdn_configuration.rb +38 -6
  45. data/app/models/katello/concerns/audit_comment_extensions.rb +17 -0
  46. data/app/models/katello/concerns/host_managed_extensions.rb +34 -2
  47. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  48. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  49. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  50. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  51. data/app/models/katello/content_view.rb +4 -4
  52. data/app/models/katello/content_view_filter.rb +1 -1
  53. data/app/models/katello/content_view_history.rb +1 -1
  54. data/app/models/katello/content_view_version.rb +6 -2
  55. data/app/models/katello/content_view_version_export_history.rb +3 -2
  56. data/app/models/katello/content_view_version_import_history.rb +4 -4
  57. data/app/models/katello/deb.rb +1 -3
  58. data/app/models/katello/docker_meta_tag.rb +1 -1
  59. data/app/models/katello/erratum.rb +0 -15
  60. data/app/models/katello/glue/provider.rb +1 -1
  61. data/app/models/katello/glue/pulp/repos.rb +3 -1
  62. data/app/models/katello/host/content_facet.rb +2 -27
  63. data/app/models/katello/host/info_provider.rb +9 -0
  64. data/app/models/katello/host/subscription_facet.rb +2 -2
  65. data/app/models/katello/host_available_module_stream.rb +10 -0
  66. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  67. data/app/models/katello/installed_package.rb +1 -0
  68. data/app/models/katello/product.rb +1 -1
  69. data/app/models/katello/product_content.rb +2 -2
  70. data/app/models/katello/repository.rb +13 -12
  71. data/app/models/katello/root_repository.rb +65 -16
  72. data/app/models/katello/rpm.rb +8 -2
  73. data/app/models/setting/content.rb +15 -5
  74. data/app/services/cert/rhsm_client.rb +1 -5
  75. data/app/services/katello/component_view_presenter.rb +1 -1
  76. data/app/services/katello/content_unit_indexer.rb +166 -0
  77. data/app/services/katello/organization_creator.rb +23 -8
  78. data/app/services/katello/pulp/repository/docker.rb +1 -1
  79. data/app/services/katello/pulp/repository/yum.rb +0 -54
  80. data/app/services/katello/pulp/repository.rb +0 -6
  81. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  82. data/app/services/katello/pulp3/api/apt.rb +7 -0
  83. data/app/services/katello/pulp3/api/yum.rb +4 -0
  84. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  85. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -1
  86. data/app/services/katello/pulp3/deb.rb +10 -9
  87. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  88. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  89. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  90. data/app/services/katello/pulp3/erratum.rb +51 -56
  91. data/app/services/katello/pulp3/file_unit.rb +9 -6
  92. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  93. data/app/services/katello/pulp3/module_stream.rb +76 -30
  94. data/app/services/katello/pulp3/package_group.rb +5 -5
  95. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  96. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  97. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  98. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  99. data/app/services/katello/pulp3/repository/yum.rb +23 -16
  100. data/app/services/katello/pulp3/repository.rb +31 -10
  101. data/app/services/katello/pulp3/repository_mirror.rb +18 -4
  102. data/app/services/katello/pulp3/rpm.rb +13 -13
  103. data/app/services/katello/pulp3/srpm.rb +10 -9
  104. data/app/services/katello/registration_manager.rb +1 -1
  105. data/app/services/katello/repository_type.rb +15 -4
  106. data/app/services/katello/repository_type_manager.rb +1 -1
  107. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  108. data/app/services/katello/upstream_connection_checker.rb +2 -2
  109. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  110. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  111. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  112. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  113. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +19 -0
  114. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +19 -0
  115. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  116. data/app/views/katello/api/v2/content_views/base.json.rabl +8 -4
  117. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  118. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +1 -0
  119. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -0
  120. data/app/views/katello/api/v2/repositories/show.json.rabl +3 -1
  121. data/app/views/katello/layouts/react.html.erb +0 -1
  122. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  123. data/config/initializers/monkeys.rb +0 -1
  124. data/config/routes/api/v2.rb +1 -0
  125. data/config/routes/overrides.rb +3 -0
  126. data/config/routes.rb +2 -0
  127. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  128. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  129. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +2 -0
  130. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +11 -2
  131. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  132. data/db/migrate/20211202172358_add_repository_mirroring_policy.rb +26 -0
  133. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  134. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  135. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  136. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  137. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  138. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  139. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  140. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  141. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +23 -0
  142. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  143. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  144. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +10 -3
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  152. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  153. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +29 -10
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +49 -35
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +30 -0
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +29 -6
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +48 -23
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  162. data/lib/katello/engine.rb +4 -0
  163. data/lib/katello/permission_creator.rb +1 -1
  164. data/lib/katello/permissions/host_permissions.rb +3 -1
  165. data/lib/katello/plugin.rb +9 -1
  166. data/lib/katello/repository_types/deb.rb +0 -1
  167. data/lib/katello/repository_types/docker.rb +4 -4
  168. data/lib/katello/repository_types/file.rb +0 -1
  169. data/lib/katello/repository_types/ostree.rb +4 -6
  170. data/lib/katello/repository_types/python.rb +5 -1
  171. data/lib/katello/repository_types/yum.rb +2 -9
  172. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  173. data/lib/katello/tasks/import_applicability.rake +1 -1
  174. data/lib/katello/tasks/jenkins.rake +0 -2
  175. data/lib/katello/tasks/repository.rake +4 -1
  176. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  177. data/lib/katello/version.rb +1 -1
  178. data/locale/action_names.rb +8 -7
  179. data/locale/bn/katello.po +1402 -650
  180. data/locale/cs/katello.po +1217 -96
  181. data/locale/de/katello.po +2359 -1347
  182. data/locale/en/katello.po +1216 -94
  183. data/locale/es/katello.po +2201 -1172
  184. data/locale/fr/katello.po +2601 -1615
  185. data/locale/gu/katello.po +1564 -814
  186. data/locale/hi/katello.po +1563 -810
  187. data/locale/it/katello.po +1311 -282
  188. data/locale/ja/katello.po +2534 -1518
  189. data/locale/katello.pot +3430 -1326
  190. data/locale/kn/katello.po +1564 -812
  191. data/locale/ko/katello.po +1441 -409
  192. data/locale/mr/katello.po +1564 -776
  193. data/locale/or/katello.po +1565 -813
  194. data/locale/pa/katello.po +1559 -792
  195. data/locale/pt/katello.po +1314 -277
  196. data/locale/pt_BR/katello.po +2226 -1181
  197. data/locale/ru/katello.po +1587 -563
  198. data/locale/ta/katello.po +1373 -619
  199. data/locale/te/katello.po +1564 -810
  200. data/locale/zh_CN/katello.po +2936 -1890
  201. data/locale/zh_TW/katello.po +1508 -606
  202. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  203. data/webpack/components/ActionableDetail.js +35 -21
  204. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  205. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  206. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  207. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  208. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +1 -1
  209. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  210. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  211. data/webpack/components/EditableSwitch.js +8 -2
  212. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  213. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  214. data/webpack/components/Errata/index.js +95 -29
  215. data/webpack/components/ErratumTypeLabel.js +16 -16
  216. data/webpack/components/MultiSelect/index.js +2 -2
  217. data/webpack/components/Packages/index.js +1 -1
  218. data/webpack/components/RoutedTabs/index.js +2 -1
  219. data/webpack/components/Search/Search.js +5 -2
  220. data/webpack/components/Search/__tests__/search.test.js +2 -3
  221. data/webpack/components/Select/Select.js +1 -1
  222. data/webpack/components/SelectOrg/SelectOrgReducer.js +15 -15
  223. data/webpack/components/SelectOrg/SetOrganization.js +2 -2
  224. data/webpack/components/Table/PageControls.js +3 -6
  225. data/webpack/components/Table/TableHooks.js +47 -7
  226. data/webpack/components/Table/TableWrapper.js +25 -7
  227. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  228. data/webpack/components/TypeAhead/helpers/commonPropTypes.js +1 -1
  229. data/webpack/components/TypeAhead/helpers/helpers.js +14 -14
  230. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +1 -1
  231. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  232. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  233. data/webpack/components/WithOrganization/withOrganization.js +3 -3
  234. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  235. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +108 -0
  236. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +56 -0
  237. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  238. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +49 -2
  239. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +14 -1
  240. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +6 -4
  241. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +1 -0
  242. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  243. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +86 -75
  244. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.scss +11 -0
  245. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +3 -3
  246. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  247. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  248. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  249. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  250. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +16 -0
  251. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +3 -0
  252. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsSelectors.js +19 -0
  253. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +241 -0
  254. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +108 -0
  255. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +34 -0
  256. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  257. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  258. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +357 -64
  259. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.scss +3 -7
  260. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +103 -4
  261. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +6 -1
  262. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +45 -42
  263. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.scss +3 -3
  264. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  265. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  266. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  267. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  268. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  269. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +66 -61
  270. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.scss +11 -0
  271. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  272. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  274. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +312 -11
  275. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  276. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +26 -30
  277. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +25 -5
  279. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  280. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  281. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  282. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  283. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +4 -0
  284. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  285. data/webpack/components/extensions/RegistrationCommands/fields/LifecycleEnvironment.js +1 -1
  286. data/webpack/components/extensions/about/SystemStatuses.js +1 -1
  287. data/webpack/components/extensions/about/SystemStatusesReducer.js +10 -10
  288. data/webpack/components/pf3Table/components/Table.js +4 -5
  289. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  290. data/webpack/components/pf3Table/components/TableBody.js +2 -2
  291. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  292. data/webpack/containers/Application/config.js +6 -1
  293. data/webpack/containers/Application/overrides.scss +56 -7
  294. data/webpack/global_index.js +4 -1
  295. data/webpack/global_test_setup.js +1 -1
  296. data/webpack/index.js +7 -0
  297. data/webpack/redux/OrganizationProducts/OrganizationProductsReducer.js +15 -15
  298. data/webpack/redux/reducers/RedHatRepositories/enabled.js +43 -43
  299. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +43 -43
  300. data/webpack/redux/reducers/RedHatRepositories/sets.js +31 -31
  301. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsReducer.js +26 -26
  302. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsReducer.js +19 -19
  303. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  304. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  305. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  306. data/webpack/scenes/Content/ContentConfig.js +55 -5
  307. data/webpack/scenes/Content/ContentPage.js +5 -5
  308. data/webpack/scenes/Content/Details/ContentDetails.js +23 -21
  309. data/webpack/scenes/Content/Details/ContentInfo.js +2 -2
  310. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  311. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  312. data/webpack/scenes/Content/Table/ContentTable.js +2 -2
  313. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  314. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -4
  315. data/webpack/scenes/ContentViews/ContentViewsPage.js +17 -13
  316. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -1
  317. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +3 -2
  318. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +2 -2
  319. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  320. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +22 -11
  321. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +31 -18
  322. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +1 -1
  323. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  324. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +22 -28
  325. data/webpack/scenes/ContentViews/Details/ContentViewDetailReducer.js +8 -8
  326. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  327. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +32 -30
  328. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +9 -4
  329. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +14 -17
  330. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +3 -0
  331. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +1 -1
  332. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +8 -8
  333. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +4 -4
  334. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +6 -6
  335. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +16 -9
  336. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +46 -46
  337. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +17 -17
  338. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +17 -17
  339. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +4 -4
  340. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  341. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +17 -11
  342. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +1 -1
  343. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  344. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +17 -17
  345. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  346. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  347. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  348. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  349. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  350. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  351. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  352. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  353. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +24 -3
  354. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  355. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +28 -28
  356. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +18 -18
  358. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +3 -3
  359. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +3 -3
  360. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  361. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -1
  362. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -1
  363. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -35
  364. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  365. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +5 -2
  366. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +39 -40
  367. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +46 -34
  368. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +66 -49
  369. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +5 -5
  370. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  371. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  372. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +2 -2
  373. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +5 -5
  374. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +3 -3
  375. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  376. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  377. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +18 -18
  378. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -10
  379. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  380. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +8 -8
  381. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  382. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  383. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  384. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  385. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  386. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  387. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  388. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  389. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  390. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsReducer.js +18 -18
  391. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  392. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  393. data/webpack/scenes/ModuleStreams/ModuleStreamsReducer.js +26 -26
  394. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  395. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  396. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  397. data/webpack/scenes/Organizations/OrganizationReducer.js +8 -8
  398. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  399. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  400. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  401. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +4 -4
  402. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -1
  403. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  404. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  405. data/webpack/scenes/Settings/SettingsReducer.js +14 -14
  406. data/webpack/scenes/Settings/Tables/TableReducer.js +23 -23
  407. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailInfo.js +2 -2
  408. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProductContent.js +15 -15
  409. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProducts.js +1 -1
  410. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailReducer.js +34 -34
  411. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +13 -13
  412. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  413. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  414. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  415. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  416. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  417. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  418. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  419. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  420. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  421. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +11 -6
  422. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryReducer.js +16 -16
  423. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +149 -149
  424. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsReducer.js +41 -41
  425. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  426. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  427. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  428. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  429. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  430. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/DeleteDialog.js +6 -6
  431. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +12 -12
  432. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  433. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  434. data/webpack/services/api/testHelpers.js +5 -3
  435. data/webpack/services/index.js +36 -36
  436. data/webpack/utils/helpers.js +11 -8
  437. metadata +98 -60
  438. data/app/services/katello/pulp/deb.rb +0 -55
  439. data/app/services/katello/pulp/distribution.rb +0 -7
  440. data/app/services/katello/pulp/docker_blob.rb +0 -7
  441. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  442. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  443. data/app/services/katello/pulp/docker_tag.rb +0 -14
  444. data/app/services/katello/pulp/erratum.rb +0 -129
  445. data/app/services/katello/pulp/file_unit.rb +0 -21
  446. data/app/services/katello/pulp/module_stream.rb +0 -39
  447. data/app/services/katello/pulp/package_category.rb +0 -7
  448. data/app/services/katello/pulp/package_group.rb +0 -20
  449. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  450. data/app/services/katello/pulp/rpm.rb +0 -57
  451. data/app/services/katello/pulp/srpm.rb +0 -29
  452. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  453. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  454. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  455. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  456. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +0 -16
  457. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +0 -12
  458. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -1,10 +1,11 @@
1
1
  import React from 'react';
2
- import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
2
+ import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
3
3
  import { nockInstance, assertNockRequest, mockForemanAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
4
4
  import { foremanApi } from '../../../../../services/api';
5
- import { HOST_PACKAGES_KEY } from '../../HostPackages/HostPackagesConstants';
5
+ import { HOST_PACKAGES_KEY, PACKAGES_SEARCH_QUERY } from '../../HostPackages/HostPackagesConstants';
6
6
  import { PackagesTab } from '../PackagesTab';
7
7
  import mockPackagesData from './packages.fixtures.json';
8
+ import { REX_FEATURES } from '../RemoteExecutionConstants';
8
9
 
9
10
  const contentFacetAttributes = {
10
11
  id: 11,
@@ -13,6 +14,7 @@ const contentFacetAttributes = {
13
14
  lifecycle_environment_library: false,
14
15
  };
15
16
 
17
+ const hostname = 'test-host.example.com';
16
18
  const renderOptions = (facetAttributes = contentFacetAttributes) => ({
17
19
  apiNamespace: HOST_PACKAGES_KEY,
18
20
  initialState: {
@@ -20,6 +22,7 @@ const renderOptions = (facetAttributes = contentFacetAttributes) => ({
20
22
  HOST_DETAILS: {
21
23
  response: {
22
24
  id: 1,
25
+ name: hostname,
23
26
  content_facet_attributes: { ...facetAttributes },
24
27
  },
25
28
  status: 'RESOLVED',
@@ -28,18 +31,26 @@ const renderOptions = (facetAttributes = contentFacetAttributes) => ({
28
31
  },
29
32
  });
30
33
 
31
- const hostPackages = foremanApi.getApiUrl('/hosts/1/packages?include_latest_upgradable=true&per_page=20&page=1');
34
+ const hostPackages = foremanApi.getApiUrl('/hosts/1/packages');
35
+ const jobInvocations = foremanApi.getApiUrl('/job_invocations');
32
36
  const autocompleteUrl = '/hosts/1/packages/auto_complete_search';
37
+ const defaultQueryWithoutSearch = {
38
+ include_latest_upgradable: true,
39
+ per_page: 20,
40
+ page: 1,
41
+ };
42
+ const defaultQuery = { ...defaultQueryWithoutSearch, search: '' };
33
43
 
34
- let firstPackages;
44
+ let firstPackage;
45
+ let secondPackage;
35
46
  let searchDelayScope;
36
47
  let autoSearchScope;
37
48
 
38
49
  beforeEach(() => {
39
50
  const { results } = mockPackagesData;
40
- [firstPackages] = results;
41
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
42
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
51
+ [firstPackage, secondPackage] = results;
52
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
53
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
43
54
  });
44
55
 
45
56
  afterEach(() => {
@@ -50,22 +61,21 @@ afterEach(() => {
50
61
  test('Can call API for packages and show on screen on page load', async (done) => {
51
62
  // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
52
63
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
53
-
54
- // return tracedata results when we look for packages
55
64
  const scope = nockInstance
56
65
  .get(hostPackages)
66
+ .query(defaultQuery)
57
67
  .reply(200, mockPackagesData);
58
68
 
59
69
  const { getAllByText } = renderWithRedux(<PackagesTab />, renderOptions());
60
70
 
61
71
  // Assert that the packages are now showing on the screen, but wait for them to appear.
62
- await patientlyWaitFor(() => expect(getAllByText(firstPackages.name)[0]).toBeInTheDocument());
72
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
63
73
  // Assert request was made and completed, see helper function
64
74
  assertNockRequest(autocompleteScope);
65
75
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
66
76
  });
67
77
 
68
- test('Can handle no packags being present', async (done) => {
78
+ test('Can handle no packages being present', async (done) => {
69
79
  // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
70
80
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
71
81
 
@@ -79,6 +89,7 @@ test('Can handle no packags being present', async (done) => {
79
89
 
80
90
  const scope = nockInstance
81
91
  .get(hostPackages)
92
+ .query(defaultQuery)
82
93
  .reply(200, noResults);
83
94
 
84
95
  const { queryByText } = renderWithRedux(<PackagesTab />, renderOptions());
@@ -89,3 +100,293 @@ test('Can handle no packags being present', async (done) => {
89
100
  assertNockRequest(autocompleteScope);
90
101
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
91
102
  });
103
+
104
+ test('Can filter by package status', async (done) => {
105
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
106
+ const scope = nockInstance
107
+ .get(hostPackages)
108
+ .query(defaultQuery)
109
+ .reply(200, mockPackagesData);
110
+
111
+ const scope2 = nockInstance
112
+ .get(hostPackages)
113
+ .query({ ...defaultQuery, status: 'upgradable' })
114
+ .reply(200, { ...mockPackagesData, results: [firstPackage] });
115
+
116
+ const {
117
+ queryByText,
118
+ getByRole,
119
+ getAllByText,
120
+ getByText,
121
+ } = renderWithRedux(<PackagesTab />, renderOptions());
122
+
123
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
124
+ // the Upgradable text in the table is just a text node, while the dropdown is a button
125
+ expect(getByText('Up-to date', { ignore: ['button', 'title'] })).toBeInTheDocument();
126
+ expect(getByText('coreutils', { ignore: ['button', 'title'] })).toBeInTheDocument();
127
+ expect(getByText('acl', { ignore: ['button', 'title'] })).toBeInTheDocument();
128
+
129
+ const statusDropdown = queryByText('Status', { ignore: 'th' });
130
+ expect(statusDropdown).toBeInTheDocument();
131
+ fireEvent.click(statusDropdown);
132
+ const upgradable = getByRole('option', { name: 'select Upgradable' });
133
+ fireEvent.click(upgradable);
134
+ await patientlyWaitFor(() => {
135
+ expect(queryByText('coreutils')).toBeInTheDocument();
136
+ expect(queryByText('acl')).not.toBeInTheDocument();
137
+ });
138
+
139
+ assertNockRequest(autocompleteScope);
140
+ assertNockRequest(scope);
141
+ assertNockRequest(searchDelayScope);
142
+ assertNockRequest(autoSearchScope);
143
+ assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
144
+ });
145
+
146
+ test('Can upgrade a package via remote execution', async (done) => {
147
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
148
+
149
+ const scope = nockInstance
150
+ .get(hostPackages)
151
+ .query(defaultQuery)
152
+ .reply(200, mockPackagesData);
153
+
154
+ const statusScope = nockInstance
155
+ .get(hostPackages)
156
+ .query({ ...defaultQuery, status: 'upgradable' })
157
+ .reply(200, { ...mockPackagesData, results: [firstPackage] });
158
+
159
+ const upgradeScope = nockInstance
160
+ .post(jobInvocations, {
161
+ job_invocation: {
162
+ inputs: {
163
+ package: firstPackage.upgradable_version,
164
+ },
165
+ search_query: `name ^ (${hostname})`,
166
+ feature: REX_FEATURES.KATELLO_PACKAGE_UPDATE,
167
+ },
168
+ })
169
+ .reply(201);
170
+
171
+ const {
172
+ getByRole,
173
+ getAllByText,
174
+ getByLabelText,
175
+ getByText,
176
+ } = renderWithRedux(<PackagesTab />, renderOptions());
177
+
178
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
179
+
180
+ const statusDropdown = getByText('Status', { ignore: 'th' });
181
+ expect(statusDropdown).toBeInTheDocument();
182
+ fireEvent.click(statusDropdown);
183
+ const upgradable = getByRole('option', { name: 'select Upgradable' });
184
+ fireEvent.click(upgradable);
185
+ await patientlyWaitFor(() => {
186
+ expect(getByText('coreutils')).toBeInTheDocument();
187
+ });
188
+
189
+ const kebabDropdown = getByLabelText('Actions');
190
+ kebabDropdown.click();
191
+
192
+ const rexAction = getByText('Upgrade via remote execution');
193
+ await patientlyWaitFor(() => expect(rexAction).toBeInTheDocument());
194
+ fireEvent.click(rexAction);
195
+
196
+ assertNockRequest(autocompleteScope);
197
+ assertNockRequest(scope);
198
+ assertNockRequest(statusScope);
199
+ assertNockRequest(upgradeScope, done);
200
+ });
201
+
202
+ test('Can upgrade a package via customized remote execution', async (done) => {
203
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
204
+
205
+ const scope = nockInstance
206
+ .get(hostPackages)
207
+ .query(defaultQuery)
208
+ .reply(200, mockPackagesData);
209
+
210
+ const statusScope = nockInstance
211
+ .get(hostPackages)
212
+ .query({ ...defaultQuery, status: 'upgradable' })
213
+ .reply(200, { ...mockPackagesData, results: [firstPackage] });
214
+
215
+ const {
216
+ getByRole,
217
+ getAllByText,
218
+ getByLabelText,
219
+ getByText,
220
+ } = renderWithRedux(<PackagesTab />, renderOptions());
221
+
222
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
223
+
224
+ const statusDropdown = getByText('Status', { ignore: 'th' });
225
+ expect(statusDropdown).toBeInTheDocument();
226
+ fireEvent.click(statusDropdown);
227
+ const upgradable = getByRole('option', { name: 'select Upgradable' });
228
+ fireEvent.click(upgradable);
229
+ await patientlyWaitFor(() => {
230
+ expect(getByText('coreutils')).toBeInTheDocument();
231
+ });
232
+
233
+ const kebabDropdown = getByLabelText('Actions');
234
+ kebabDropdown.click();
235
+
236
+ const rexAction = getByText('Upgrade via customized remote execution');
237
+ const feature = REX_FEATURES.KATELLO_PACKAGE_UPDATE;
238
+ const packageName = firstPackage.upgradable_version;
239
+
240
+ expect(rexAction).toBeInTheDocument();
241
+ expect(rexAction).toHaveAttribute(
242
+ 'href',
243
+ `/job_invocations/new?feature=${feature}&host_ids=name%20%5E%20(${hostname})&inputs%5Bpackage%5D=${packageName}`,
244
+ );
245
+
246
+ fireEvent.click(rexAction);
247
+
248
+ assertNockRequest(autocompleteScope);
249
+ assertNockRequest(scope);
250
+ assertNockRequest(statusScope, done);
251
+ });
252
+
253
+ test('Can bulk upgrade via remote execution', async (done) => {
254
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
255
+
256
+ const scope = nockInstance
257
+ .get(hostPackages)
258
+ .query(defaultQuery)
259
+ .reply(200, mockPackagesData);
260
+
261
+ const upgradeScope = nockInstance
262
+ .post(jobInvocations, {
263
+ job_invocation: {
264
+ inputs: {
265
+ [PACKAGES_SEARCH_QUERY]: `id ^ (${firstPackage.id},${secondPackage.id})`,
266
+ },
267
+ search_query: `name ^ (${hostname})`,
268
+ feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
269
+ },
270
+ })
271
+ .reply(201);
272
+
273
+ const {
274
+ getAllByRole,
275
+ getAllByText,
276
+ getByRole,
277
+ getByLabelText,
278
+ } = renderWithRedux(<PackagesTab />, renderOptions());
279
+
280
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
281
+
282
+ getByRole('checkbox', { name: 'Select row 0' }).click();
283
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
284
+ getByRole('checkbox', { name: 'Select row 1' }).click();
285
+ expect(getByLabelText('Select row 1').checked).toEqual(true);
286
+
287
+ const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
288
+ fireEvent.click(upgradeDropdown);
289
+
290
+ const rexAction = getByLabelText('bulk_upgrade_rex');
291
+ expect(rexAction).toBeInTheDocument();
292
+ fireEvent.click(rexAction);
293
+
294
+ assertNockRequest(autocompleteScope);
295
+ assertNockRequest(scope);
296
+ assertNockRequest(upgradeScope, done);
297
+ });
298
+
299
+ test('Can bulk upgrade via customized remote execution', async (done) => {
300
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
301
+
302
+ const scope = nockInstance
303
+ .get(hostPackages)
304
+ .query(defaultQuery)
305
+ .reply(200, mockPackagesData);
306
+
307
+ const {
308
+ getAllByRole,
309
+ getAllByText,
310
+ getByRole,
311
+ getByLabelText,
312
+ } = renderWithRedux(<PackagesTab />, renderOptions());
313
+
314
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
315
+
316
+ const feature = REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH;
317
+ const packages = `${firstPackage.id},${secondPackage.id}`;
318
+ const job =
319
+ `/job_invocations/new?feature=${feature}&host_ids=name%20%5E%20(${hostname})&inputs%5BPackages%20search%20query%5D=id%20%5E%20(${packages})`;
320
+
321
+ getByRole('checkbox', { name: 'Select row 0' }).click();
322
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
323
+ getByRole('checkbox', { name: 'Select row 1' }).click();
324
+ expect(getByLabelText('Select row 1').checked).toEqual(true);
325
+
326
+ const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
327
+ fireEvent.click(upgradeDropdown);
328
+ expect(upgradeDropdown).not.toHaveAttribute('disabled');
329
+
330
+ const rexAction = getByLabelText('bulk_upgrade_customized_rex');
331
+ expect(rexAction).toBeInTheDocument();
332
+ expect(rexAction).toHaveAttribute('href', job);
333
+
334
+ assertNockRequest(autocompleteScope);
335
+ assertNockRequest(scope, done);
336
+ });
337
+
338
+ test('Upgrade is disabled when there are non-upgradable packages selected', async (done) => {
339
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
340
+
341
+ const scope = nockInstance
342
+ .get(hostPackages)
343
+ .query(defaultQuery)
344
+ .reply(200, mockPackagesData);
345
+
346
+ const {
347
+ getAllByRole,
348
+ getAllByText,
349
+ getByLabelText,
350
+ getByRole,
351
+ } = renderWithRedux(<PackagesTab />, renderOptions());
352
+
353
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
354
+
355
+ // select an upgradable package
356
+ getByRole('checkbox', { name: 'Select row 0' }).click();
357
+ // select an up-to-date package
358
+ getByRole('checkbox', { name: 'Select row 2' }).click();
359
+ expect(getByLabelText('Select row 2').checked).toEqual(true);
360
+
361
+ const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
362
+ expect(upgradeDropdown).toHaveAttribute('disabled');
363
+
364
+ assertNockRequest(autocompleteScope);
365
+ assertNockRequest(scope, done);
366
+ });
367
+
368
+ test('Remove is disabled when in select all mode', async (done) => {
369
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
370
+ const scope = nockInstance
371
+ .get(hostPackages)
372
+ .query(defaultQuery)
373
+ .reply(200, mockPackagesData);
374
+
375
+ const {
376
+ getAllByText, getByRole,
377
+ } = renderWithRedux(<PackagesTab />, renderOptions());
378
+
379
+ await patientlyWaitFor(() => expect(getAllByText(firstPackage.name)[0]).toBeInTheDocument());
380
+
381
+ // find and click the select all checkbox
382
+ const selectAllCheckbox = getByRole('checkbox', { name: 'Select all' });
383
+ fireEvent.click(selectAllCheckbox);
384
+ getByRole('button', { name: 'bulk_actions' }).click();
385
+
386
+ const removeButton = getByRole('button', { name: 'bulk_remove' });
387
+ await patientlyWaitFor(() => expect(removeButton).toBeInTheDocument());
388
+ expect(removeButton).toHaveAttribute('aria-disabled', 'true');
389
+
390
+ assertNockRequest(autocompleteScope);
391
+ assertNockRequest(scope, done);
392
+ });
@@ -59,8 +59,8 @@ beforeEach(() => {
59
59
  const { results } = mockRepoSetData;
60
60
  [firstRepoSet] = results;
61
61
  bookmarkScope = nockInstance.get(repositorySetBookmarks).reply(200, mockBookmarkData);
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
 
66
66
  afterEach(() => {
@@ -3,8 +3,8 @@ import { renderWithRedux, waitFor, patientlyWaitFor, fireEvent, act } from 'reac
3
3
  import nock, { nockInstance, assertNockRequest, mockForemanAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
4
4
  import { foremanApi } from '../../../../../services/api';
5
5
  import { REX_FEATURES } from '../RemoteExecutionConstants';
6
- import { HOST_TRACES_KEY, TRACES_SEARCH_QUERY } from '../HostTracesConstants';
7
- import TracesTab from '../TracesTab';
6
+ import { HOST_TRACES_KEY, TRACES_SEARCH_QUERY } from '../TracesTab/HostTracesConstants';
7
+ import TracesTab from '../TracesTab/TracesTab.js';
8
8
  import mockTraceData from './traces.fixtures.json';
9
9
  import mockResolveTraceTask from './resolveTraces.fixtures.json';
10
10
  import emptyTraceResults from './tracerEmptyTraceResults.fixtures.json';
@@ -40,10 +40,6 @@ const renderOptions = isTracerInstalled => ({ // sets initial Redux state
40
40
  },
41
41
  });
42
42
 
43
- // Find the checkbox to the left of the trace.
44
- // (We could also have just found the checkbox by its aria-label "Select row 0",
45
- // but this is closer to how the user would do it)
46
- const checkboxToTheLeftOf = node => node.previousElementSibling.firstElementChild;
47
43
  const actionMenuToTheRightOf = node => node.nextElementSibling.firstElementChild.firstElementChild;
48
44
 
49
45
  const hostTraces = foremanApi.getApiUrl('/hosts/1/traces?per_page=20&page=1');
@@ -51,16 +47,15 @@ const autocompleteUrl = '/hosts/1/traces/auto_complete_search';
51
47
  const jobInvocations = foremanApi.getApiUrl('/job_invocations');
52
48
 
53
49
  let firstTrace;
54
- let secondTrace;
55
50
  let searchDelayScope;
56
51
  let autoSearchScope;
57
52
 
58
53
  describe('With tracer installed', () => {
59
54
  beforeEach(() => {
60
55
  const { results } = mockTraceData;
61
- [firstTrace, secondTrace] = results;
62
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
63
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
56
+ [firstTrace] = results;
57
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
58
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
64
59
  });
65
60
 
66
61
  afterEach(() => {
@@ -119,17 +114,17 @@ describe('With tracer installed', () => {
119
114
  .reply(201, mockResolveTraceTask);
120
115
 
121
116
 
122
- const { getByText } = renderWithRedux(
117
+ const { getByText, getByLabelText } = renderWithRedux(
123
118
  <TracesTab />,
124
119
  renderOptions(true),
125
120
  );
121
+
126
122
  let traceCheckbox;
127
- // Find the trace.
123
+ // Find the trace checkbox.
128
124
  await patientlyWaitFor(() => {
129
- const traceNameNode = getByText(firstTrace.application);
130
- traceCheckbox = checkboxToTheLeftOf(traceNameNode);
125
+ traceCheckbox = getByLabelText('Select row 0');
131
126
  });
132
- traceCheckbox.click();
127
+ fireEvent.click(traceCheckbox);
133
128
  expect(traceCheckbox.checked).toEqual(true);
134
129
 
135
130
  const restartAppButton = getByText('Restart app');
@@ -158,16 +153,17 @@ describe('With tracer installed', () => {
158
153
  .reply(201, mockResolveTraceTask);
159
154
 
160
155
 
161
- const { getByText, getByLabelText, queryByText } = renderWithRedux(
156
+ const { getByLabelText, queryByText } = renderWithRedux(
162
157
  <TracesTab />,
163
158
  renderOptions(true),
164
159
  );
165
160
  let traceCheckbox;
161
+
162
+ // Find the trace.
166
163
  await patientlyWaitFor(() => {
167
- const traceNameNode = getByText(firstTrace.application);
168
- traceCheckbox = checkboxToTheLeftOf(traceNameNode);
164
+ traceCheckbox = getByLabelText('Select row 0');
169
165
  });
170
- traceCheckbox.click();
166
+ fireEvent.click(traceCheckbox);
171
167
  expect(traceCheckbox.checked).toEqual(true);
172
168
  const actionMenu = getByLabelText('bulk_actions');
173
169
  actionMenu.click();
@@ -204,14 +200,16 @@ describe('With tracer installed', () => {
204
200
  );
205
201
 
206
202
  let traceCheckbox;
207
- // Assert that the traces are now showing on the screen, but wait for them to appear.
203
+ // Find the trace.
208
204
  await patientlyWaitFor(() => {
209
- const traceNameNode = getByText(firstTrace.application);
210
- traceCheckbox = checkboxToTheLeftOf(traceNameNode);
205
+ traceCheckbox = getByLabelText('Select row 0');
211
206
  });
207
+
208
+
212
209
  const selectAllCheckbox = getByLabelText('Select all');
213
210
  fireEvent.click(selectAllCheckbox);
214
211
  expect(traceCheckbox.checked).toEqual(true);
212
+
215
213
  fireEvent.click(getByLabelText('Select row 0')); // de select
216
214
  fireEvent.click(getByLabelText('Select row 2')); // de select
217
215
 
@@ -298,16 +296,15 @@ describe('With tracer installed', () => {
298
296
  .get(hostTraces)
299
297
  .reply(200, mockTraceData);
300
298
 
301
- const { getByText, getByLabelText, queryByText } = renderWithRedux(
299
+ const { getByLabelText, queryByText } = renderWithRedux(
302
300
  <TracesTab />,
303
301
  renderOptions(true),
304
302
  );
305
303
  let traceCheckbox;
306
304
  await patientlyWaitFor(() => {
307
- const traceNameNode = getByText(firstTrace.application);
308
- traceCheckbox = checkboxToTheLeftOf(traceNameNode);
305
+ traceCheckbox = getByLabelText('Select row 0');
309
306
  });
310
- traceCheckbox.click();
307
+ fireEvent.click(traceCheckbox);
311
308
  expect(traceCheckbox.checked).toEqual(true);
312
309
 
313
310
  const actionMenu = getByLabelText('bulk_actions');
@@ -327,7 +324,7 @@ describe('With tracer installed', () => {
327
324
  describe('Remote execution URL helper logic', () => {
328
325
  beforeEach(() => {
329
326
  const { results } = mockTraceData;
330
- [firstTrace, secondTrace] = results;
327
+ [firstTrace] = results;
331
328
  });
332
329
 
333
330
  afterEach(() => {
@@ -341,14 +338,13 @@ describe('With tracer installed', () => {
341
338
  .get(hostTraces)
342
339
  .reply(200, mockTraceData);
343
340
 
344
- const { getByText } = renderWithRedux(
341
+ const { getByLabelText } = renderWithRedux(
345
342
  <TracesTab />,
346
343
  renderOptions(true),
347
344
  );
348
345
  let traceCheckbox;
349
346
  await patientlyWaitFor(() => {
350
- const traceNameNode = getByText(secondTrace.application);
351
- traceCheckbox = checkboxToTheLeftOf(traceNameNode);
347
+ traceCheckbox = getByLabelText('Select row 1');
352
348
  });
353
349
  expect(traceCheckbox.disabled).toEqual(true);
354
350
 
@@ -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,8 @@
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';
5
+ import { PACKAGES_SEARCH_QUERY } from '../HostPackages/HostPackagesConstants';
4
6
 
5
7
  export const createJob = ({
6
8
  hostname, feature, inputs,
@@ -15,10 +17,28 @@ export const createJob = ({
15
17
  return `/job_invocations/new?${urlQuery}`;
16
18
  };
17
19
 
18
- export const katelloPackageInstallUrl = ({ hostname }) => createJob({
20
+ export const katelloPackageInstallUrl = ({ hostname, packages }) => createJob({
19
21
  hostname,
20
22
  feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL,
21
- inputs: { package: KATELLO_TRACER_PACKAGE },
23
+ inputs: { package: packages },
24
+ });
25
+
26
+ export const katelloPackageInstallBySearchUrl = ({ hostname, search }) => createJob({
27
+ hostname,
28
+ feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL_BY_SEARCH,
29
+ inputs: { [PACKAGE_SEARCH_QUERY]: search },
30
+ });
31
+
32
+ export const katelloPackageUpdateUrl = ({ hostname, packageName }) => createJob({
33
+ hostname,
34
+ feature: REX_FEATURES.KATELLO_PACKAGE_UPDATE,
35
+ inputs: { package: packageName },
36
+ });
37
+
38
+ export const packagesUpdateUrl = ({ hostname, search }) => createJob({
39
+ hostname,
40
+ feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
41
+ inputs: { [PACKAGES_SEARCH_QUERY]: search },
22
42
  });
23
43
 
24
44
  export const resolveTraceUrl = ({ hostname, search }) => createJob({
@@ -29,6 +49,6 @@ export const resolveTraceUrl = ({ hostname, search }) => createJob({
29
49
 
30
50
  export const errataInstallUrl = ({ hostname, search }) => createJob({
31
51
  hostname,
32
- feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL,
52
+ feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH,
33
53
  inputs: { [ERRATA_SEARCH_QUERY]: search },
34
54
  });