katello 4.4.1 → 4.5.0

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 (488) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/activation_key_edit.js +9 -2
  3. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +3 -0
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  5. data/app/controllers/katello/api/v2/alternate_content_sources_bulk_actions_controller.rb +44 -0
  6. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +121 -0
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  9. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  10. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  11. data/app/controllers/katello/api/v2/content_view_repositories_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  14. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  16. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  17. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  18. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  19. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  20. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  21. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  22. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  23. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  24. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  25. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  26. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  27. data/app/lib/actions/katello/alternate_content_source/refresh.rb +27 -0
  28. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  29. data/app/lib/actions/katello/cdn_configuration/update.rb +3 -3
  30. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  31. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  32. data/app/lib/actions/katello/content_view/publish.rb +8 -10
  33. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  34. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  35. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  36. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  37. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  38. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  39. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  40. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  41. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  42. data/app/lib/actions/katello/product/content_create.rb +10 -8
  43. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  44. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  45. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  46. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  47. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  48. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  49. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +23 -0
  50. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  51. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  52. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  53. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  54. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  55. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +16 -0
  56. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  57. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +15 -0
  58. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +16 -0
  59. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  60. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  61. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  62. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -1
  63. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  64. data/app/lib/katello/concerns/base_template_scope_extensions.rb +24 -11
  65. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  66. data/app/lib/katello/util/errata.rb +2 -3
  67. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  68. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  69. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  70. data/app/models/katello/alternate_content_source.rb +71 -0
  71. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  72. data/app/models/katello/authorization/repository.rb +5 -3
  73. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  74. data/app/models/katello/cdn_configuration.rb +15 -15
  75. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  76. data/app/models/katello/concerns/host_managed_extensions.rb +7 -6
  77. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  78. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  79. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  80. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  81. data/app/models/katello/content.rb +1 -0
  82. data/app/models/katello/content_credential.rb +6 -0
  83. data/app/models/katello/content_override.rb +7 -3
  84. data/app/models/katello/content_view.rb +33 -2
  85. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  86. data/app/models/katello/content_view_filter.rb +4 -0
  87. data/app/models/katello/content_view_version.rb +12 -0
  88. data/app/models/katello/content_view_version_export_history.rb +3 -1
  89. data/app/models/katello/erratum.rb +9 -5
  90. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  91. data/app/models/katello/host/content_facet.rb +14 -0
  92. data/app/models/katello/host_available_module_stream.rb +12 -0
  93. data/app/models/katello/product_content.rb +1 -0
  94. data/app/models/katello/purpose_sla_status.rb +1 -1
  95. data/app/models/katello/purpose_status.rb +2 -2
  96. data/app/models/katello/repository.rb +7 -4
  97. data/app/models/katello/root_repository.rb +1 -1
  98. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  99. data/app/models/katello/sync_plan.rb +1 -1
  100. data/app/presenters/katello/product_content_presenter.rb +15 -0
  101. data/app/services/katello/applicable_host_queue.rb +1 -1
  102. data/app/services/katello/product_content_finder.rb +12 -2
  103. data/app/services/katello/pulp3/alternate_content_source.rb +123 -0
  104. data/app/services/katello/pulp3/api/file.rb +8 -0
  105. data/app/services/katello/pulp3/api/yum.rb +8 -0
  106. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  107. data/app/services/katello/pulp3/content_view_version/import.rb +104 -71
  108. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  109. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  110. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  111. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  112. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +102 -38
  113. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  114. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  115. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  116. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  117. data/app/services/katello/pulp3/repository.rb +6 -62
  118. data/app/services/katello/pulp3/service_common.rb +66 -0
  119. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  120. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  121. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  122. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  123. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +10 -8
  124. data/app/views/foreman/job_templates/install_group.erb +4 -4
  125. data/app/views/foreman/job_templates/install_package.erb +4 -4
  126. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  127. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  128. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  129. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  130. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  131. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  132. data/app/views/foreman/job_templates/update_group.erb +4 -4
  133. data/app/views/foreman/job_templates/update_package.erb +4 -4
  134. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  135. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +24 -0
  136. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  137. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  138. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  139. data/app/views/katello/api/v2/content_facet/show.json.rabl +12 -0
  140. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  141. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  142. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  143. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  144. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  145. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  146. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  147. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  148. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  149. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  150. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  151. data/config/routes/api/v2.rb +19 -0
  152. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  153. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  154. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  155. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  156. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  157. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +1 -1
  158. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  159. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  160. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  161. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  162. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  163. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  164. data/db/migrate/20220303160220_remove_duplicate_errata.rb +1 -1
  165. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  166. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  167. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  168. data/db/migrate/20220428203334_add_last_refreshed_to_katello_alternate_content_sources.rb +5 -0
  169. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  170. data/db/seeds.d/150-module_job_templates.rb +1 -1
  171. data/engines/bastion/README.md +1 -0
  172. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  173. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/activation-keys.routes.js +1 -1
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +11 -6
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages.controller.js +11 -3
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -12
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  204. data/lib/katello/engine.rb +1 -5
  205. data/lib/katello/permission_creator.rb +34 -4
  206. data/lib/katello/plugin.rb +377 -3
  207. data/lib/katello/tasks/refresh_alternate_content_sources.rake +15 -0
  208. data/lib/katello/tasks/reset.rake.bak +67 -0
  209. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  210. data/lib/katello/version.rb +1 -1
  211. data/locale/action_names.rb +47 -41
  212. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  213. data/locale/bn/katello.po +820 -106
  214. data/locale/bn/katello.po.time_stamp +0 -0
  215. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/cs/katello.po +818 -104
  217. data/locale/cs/katello.po.time_stamp +0 -0
  218. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  219. data/locale/de/katello.po +893 -179
  220. data/locale/de/katello.po.time_stamp +0 -0
  221. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  222. data/locale/en/katello.po +817 -103
  223. data/locale/en/katello.po.time_stamp +0 -0
  224. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  225. data/locale/es/katello.po +882 -168
  226. data/locale/es/katello.po.time_stamp +0 -0
  227. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/fr/katello.po +1219 -505
  229. data/locale/fr/katello.po.time_stamp +0 -0
  230. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/gu/katello.po +826 -112
  232. data/locale/gu/katello.po.time_stamp +0 -0
  233. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/hi/katello.po +826 -112
  235. data/locale/hi/katello.po.time_stamp +0 -0
  236. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/it/katello.po +863 -148
  238. data/locale/it/katello.po.time_stamp +0 -0
  239. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/ja/katello.po +1216 -499
  241. data/locale/ja/katello.po.time_stamp +0 -0
  242. data/locale/katello.pot +3847 -2507
  243. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/kn/katello.po +826 -112
  245. data/locale/kn/katello.po.time_stamp +0 -0
  246. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  247. data/locale/ko/katello.po +912 -198
  248. data/locale/ko/katello.po.time_stamp +0 -0
  249. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/mr/katello.po +826 -112
  251. data/locale/mr/katello.po.time_stamp +0 -0
  252. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  253. data/locale/or/katello.po +826 -112
  254. data/locale/or/katello.po.time_stamp +0 -0
  255. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  256. data/locale/pa/katello.po +826 -112
  257. data/locale/pa/katello.po.time_stamp +0 -0
  258. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/pt/katello.po +817 -103
  260. data/locale/pt/katello.po.time_stamp +0 -0
  261. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  262. data/locale/pt_BR/katello.po +879 -165
  263. data/locale/pt_BR/katello.po.time_stamp +0 -0
  264. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  265. data/locale/ru/katello.po +927 -213
  266. data/locale/ru/katello.po.time_stamp +0 -0
  267. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  268. data/locale/ta/katello.po +820 -106
  269. data/locale/ta/katello.po.time_stamp +0 -0
  270. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/te/katello.po +826 -112
  272. data/locale/te/katello.po.time_stamp +0 -0
  273. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  274. data/locale/zh_CN/katello.po +1202 -486
  275. data/locale/zh_CN/katello.po.time_stamp +0 -0
  276. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/zh_TW/katello.po +856 -142
  278. data/locale/zh_TW/katello.po.time_stamp +0 -0
  279. data/webpack/components/Bookmark/index.js +22 -14
  280. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  281. data/webpack/components/Errata/index.js +38 -8
  282. data/webpack/components/Packages/index.js +1 -4
  283. data/webpack/components/Search/Search.js +22 -3
  284. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  285. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  286. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  287. data/webpack/components/Table/MainTable.js +29 -4
  288. data/webpack/components/Table/MainTable.scss +5 -1
  289. data/webpack/components/Table/TableHooks.js +65 -20
  290. data/webpack/components/Table/TableWrapper.js +9 -3
  291. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  292. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  293. data/webpack/components/TypeAhead/TypeAhead.js +12 -0
  294. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  295. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +7 -2
  296. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  297. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +250 -0
  298. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +232 -0
  299. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  300. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  301. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  302. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  303. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  304. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  305. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  306. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  307. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  308. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +206 -0
  309. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  310. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  311. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  312. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  313. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +118 -0
  314. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  315. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  316. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  317. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  318. data/webpack/components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions.js +37 -0
  319. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  320. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  321. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +11 -0
  322. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  323. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -0
  324. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +6 -1
  325. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +176 -72
  326. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  327. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  328. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  329. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +522 -118
  330. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  331. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +6 -4
  332. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +164 -58
  333. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +59 -49
  334. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  335. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +85 -0
  336. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  337. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  338. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +298 -107
  339. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +14 -7
  340. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/HostTracesActions.js +2 -1
  341. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +104 -0
  342. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +134 -57
  343. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +37 -32
  344. data/webpack/components/extensions/HostDetails/Tabs/{ModuleStreamsTab/__tests__/modules.fixtures.json → __tests__/moduleStreams.fixtures.json} +6 -3
  345. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +261 -0
  346. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +21 -15
  347. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +44 -1
  348. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +4 -1
  349. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +105 -6
  350. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -6
  351. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  352. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +18 -0
  353. data/webpack/containers/Application/config.js +5 -0
  354. data/webpack/global_index.js +32 -9
  355. data/webpack/global_test_setup.js +13 -0
  356. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  357. data/webpack/redux/actions/RedHatRepositories/helpers.js +13 -8
  358. data/webpack/scenes/AlternateContentSources/ACSActions.js +65 -0
  359. data/webpack/scenes/AlternateContentSources/ACSConstants.js +18 -0
  360. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  361. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +24 -0
  362. data/webpack/scenes/AlternateContentSources/Create/ACSCreateContext.js +4 -0
  363. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +160 -0
  364. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +79 -0
  365. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +199 -0
  366. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +104 -0
  367. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +41 -0
  368. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +71 -0
  369. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +57 -0
  370. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +77 -0
  371. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +149 -0
  372. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateData.fixtures.json +3 -0
  373. data/webpack/scenes/AlternateContentSources/Create/__tests__/contentCredentials.fixtures.json +69 -0
  374. data/webpack/scenes/AlternateContentSources/Create/__tests__/smartProxy.fixtures.json +65 -0
  375. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +162 -0
  376. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  377. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  378. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  379. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  380. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  381. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +4 -1
  382. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  383. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  384. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  385. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  386. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +2 -1
  387. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  388. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  389. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  390. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +2 -2
  391. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -2
  392. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  393. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  394. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  395. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  396. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +16 -2
  397. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  398. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  399. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  400. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  401. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  402. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  404. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  405. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  406. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  407. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  408. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  409. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  410. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  411. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  412. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  413. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  414. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  415. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  416. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  417. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  418. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  419. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  420. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  421. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  434. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  435. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  436. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  437. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  446. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  447. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  448. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  449. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  450. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  451. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  452. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  453. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  454. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  455. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -6
  456. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  457. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  458. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  459. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +2 -2
  460. data/webpack/scenes/ContentViews/helpers.js +3 -0
  461. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  462. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  463. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  464. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  465. data/webpack/scenes/RedHatRepositories/components/Search.js +4 -4
  466. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +9 -2
  467. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -1
  468. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +10 -1
  469. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  470. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  471. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  472. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  473. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  474. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  475. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  476. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  477. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  478. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  479. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  480. data/webpack/scenes/Tasks/helpers.js +60 -5
  481. data/webpack/utils/helpers.js +2 -0
  482. metadata +183 -38
  483. data/app/models/setting/content.rb +0 -201
  484. data/db/seeds.d/107-enable_dynflow.rb +0 -8
  485. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  486. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +0 -108
  487. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerEmptyState.js +0 -42
  488. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -1,7 +1,6 @@
1
1
  import { API_OPERATIONS, get, put } from 'foremanReact/redux/API';
2
- import { renderTaskStartedToast } from '../../../../../scenes/Tasks/helpers';
2
+ import { errorToast, renderTaskStartedToast } from '../../../../../scenes/Tasks/helpers';
3
3
  import { foremanApi } from '../../../../../services/api';
4
- import { getResponseErrorMsgs } from '../../../../../utils/helpers';
5
4
  import {
6
5
  HOST_PACKAGES_INSTALL_KEY,
7
6
  HOST_PACKAGES_KEY,
@@ -9,11 +8,6 @@ import {
9
8
  HOST_PACKAGES_UPGRADE_KEY,
10
9
  } from './HostPackagesConstants';
11
10
 
12
- const errorToast = (error) => {
13
- const message = getResponseErrorMsgs(error.response);
14
- return message;
15
- };
16
-
17
11
  export const getInstalledPackagesWithLatest = (hostId, params) => get({
18
12
  type: API_OPERATIONS.GET,
19
13
  key: HOST_PACKAGES_KEY,
@@ -15,7 +15,6 @@ import { HOST_YUM_INSTALLABLE_PACKAGES_KEY } from './YumInstallablePackagesConst
15
15
  import { selectHostYumInstallablePackagesStatus } from './YumInstallablePackagesSelectors';
16
16
  import { getHostYumInstallablePackages } from './YumInstallablePackagesActions';
17
17
  import './PackageInstallModal.scss';
18
- import { installPackageBySearch } from '../RemoteExecutionActions';
19
18
  import { katelloPackageInstallBySearchUrl, katelloPackageInstallUrl } from '../customizedRexUrlHelpers';
20
19
  import hostIdNotReady from '../../HostDetailsActions';
21
20
  import { installPackageViaKatelloAgent } from './HostPackagesActions';
@@ -64,7 +63,6 @@ const InstallDropdown = ({
64
63
  onSelect={onActionSelect}
65
64
  toggle={
66
65
  <DropdownToggle
67
- isPrimary
68
66
  isDisabled={isDisabled}
69
67
  splitButtonItems={[
70
68
  <DropdownToggleAction key="install" onClick={defaultRemoteAction}>
@@ -72,6 +70,7 @@ const InstallDropdown = ({
72
70
  </DropdownToggleAction>,
73
71
  ]}
74
72
  splitButtonVariant="action"
73
+ toggleVariant="primary"
75
74
  toggleIndicator={isActionOpen ? CaretUpIcon : CaretDownIcon}
76
75
  onToggle={onActionToggle}
77
76
  />
@@ -101,7 +100,7 @@ InstallDropdown.defaultProps = {
101
100
  };
102
101
 
103
102
  const PackageInstallModal = ({
104
- isOpen, closeModal, hostId, hostName, showKatelloAgent,
103
+ isOpen, closeModal, hostId, hostName, showKatelloAgent, triggerPackageInstall,
105
104
  }) => {
106
105
  const emptyContentTitle = __('No packages available to install');
107
106
  const emptyContentBody = __('No packages available to install on this host. Please check the host\'s content view and lifecycle environment.');
@@ -127,6 +126,7 @@ const PackageInstallModal = ({
127
126
  selectedResults,
128
127
  ...selectAll
129
128
  } = useBulkSelect({ results, metadata });
129
+
130
130
  const fetchItems = (params) => {
131
131
  if (!hostId) return hostIdNotReady;
132
132
 
@@ -141,7 +141,7 @@ const PackageInstallModal = ({
141
141
  const selectedPackageNames = () => selectedResults.map(({ name }) => name);
142
142
 
143
143
  const installViaRex = () => {
144
- dispatch(installPackageBySearch({ hostname: hostName, search: fetchBulkParams() }));
144
+ triggerPackageInstall(fetchBulkParams());
145
145
  selectNone();
146
146
  closeModal();
147
147
  };
@@ -210,6 +210,7 @@ const PackageInstallModal = ({
210
210
  selectNone,
211
211
  }
212
212
  }
213
+ ouiaId="host-package-install-table"
213
214
  additionalListeners={[hostId]}
214
215
  fetchItems={fetchItems}
215
216
  searchPlaceholderText={__('Search available packages')}
@@ -270,6 +271,7 @@ PackageInstallModal.propTypes = {
270
271
  hostId: PropTypes.number.isRequired,
271
272
  hostName: PropTypes.string.isRequired,
272
273
  showKatelloAgent: PropTypes.bool,
274
+ triggerPackageInstall: PropTypes.func.isRequired,
273
275
  };
274
276
 
275
277
  PackageInstallModal.defaultProps = {
@@ -12,6 +12,7 @@ import {
12
12
  Skeleton,
13
13
  Split,
14
14
  SplitItem,
15
+ Spinner,
15
16
  } from '@patternfly/react-core';
16
17
  import { TableVariant, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table';
17
18
  import { translate as __ } from 'foremanReact/common/I18n';
@@ -20,7 +21,7 @@ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
20
21
  import { urlBuilder } from 'foremanReact/common/urlHelpers';
21
22
  import SelectableDropdown from '../../../../SelectableDropdown';
22
23
  import TableWrapper from '../../../../../components/Table/TableWrapper';
23
- import { useBulkSelect } from '../../../../../components/Table/TableHooks';
24
+ import { useBulkSelect, useTableSort, useUrlParams } from '../../../../../components/Table/TableHooks';
24
25
  import { PackagesStatus, PackagesLatestVersion } from '../../../../../components/Packages';
25
26
  import {
26
27
  getInstalledPackagesWithLatest,
@@ -32,12 +33,22 @@ import { selectHostPackagesStatus } from './HostPackagesSelectors';
32
33
  import {
33
34
  HOST_PACKAGES_KEY, PACKAGES_VERSION_STATUSES, VERSION_STATUSES_TO_PARAM,
34
35
  } from './HostPackagesConstants';
35
- import { removePackage, updatePackage, removePackages, updatePackages } from '../RemoteExecutionActions';
36
+ import { removePackage, updatePackage, removePackages, updatePackages, installPackageBySearch } from '../RemoteExecutionActions';
36
37
  import { katelloPackageUpdateUrl, packagesUpdateUrl } from '../customizedRexUrlHelpers';
37
38
  import './PackagesTab.scss';
38
39
  import hostIdNotReady from '../../HostDetailsActions';
39
40
  import PackageInstallModal from './PackageInstallModal';
40
- import { defaultRemoteActionMethod, KATELLO_AGENT } from '../../hostDetailsHelpers';
41
+ import { defaultRemoteActionMethod,
42
+ hasRequiredPermissions as can,
43
+ missingRequiredPermissions as cannot,
44
+ KATELLO_AGENT,
45
+ userPermissionsFromHostDetails } from '../../hostDetailsHelpers';
46
+ import SortableColumnHeaders from '../../../../Table/components/SortableColumnHeaders';
47
+ import { useRexJobPolling } from '../RemoteExecutionHooks';
48
+
49
+ const invokeRexJobs = ['create_job_invocations'];
50
+ const doKatelloAgentActions = ['edit_hosts'];
51
+ const createBookmarks = ['create_bookmarks'];
41
52
 
42
53
  export const PackagesTab = () => {
43
54
  const hostDetails = useSelector(state => selectAPIResponse(state, 'HOST_DETAILS'));
@@ -46,9 +57,10 @@ export const PackagesTab = () => {
46
57
  name: hostname,
47
58
  } = hostDetails;
48
59
 
60
+ const { searchParam, status: statusParam } = useUrlParams();
49
61
  const dispatch = useDispatch();
50
62
  const PACKAGE_STATUS = __('Status');
51
- const [packageStatusSelected, setPackageStatusSelected] = useState(PACKAGE_STATUS);
63
+ const [packageStatusSelected, setPackageStatusSelected] = useState(statusParam ?? PACKAGE_STATUS);
52
64
  const activeFilters = [packageStatusSelected];
53
65
  const defaultFilters = [PACKAGE_STATUS];
54
66
  const [isBulkActionOpen, setIsBulkActionOpen] = useState(false);
@@ -56,6 +68,9 @@ export const PackagesTab = () => {
56
68
  const [isModalOpen, setIsModalOpen] = useState(false);
57
69
  const closeModal = () => setIsModalOpen(false);
58
70
  const showKatelloAgent = (defaultRemoteActionMethod({ hostDetails }) === KATELLO_AGENT);
71
+ const showActions = showKatelloAgent ?
72
+ can(doKatelloAgentActions, userPermissionsFromHostDetails({ hostDetails })) :
73
+ can(invokeRexJobs, userPermissionsFromHostDetails({ hostDetails }));
59
74
 
60
75
  const [isActionOpen, setIsActionOpen] = useState(false);
61
76
  const onActionSelect = () => {
@@ -69,13 +84,28 @@ export const PackagesTab = () => {
69
84
  const emptyContentBody = __('Packages will appear here when available.');
70
85
  const emptySearchTitle = __('No matching packages found');
71
86
  const emptySearchBody = __('Try changing your search settings.');
87
+ const errorSearchTitle = __('Problem searching packages');
72
88
  const columnHeaders = [
73
89
  __('Package'),
74
90
  __('Status'),
75
- __('Installed Version'),
76
- __('Upgradable To'),
91
+ __('Installed version'),
92
+ __('Upgradable to'),
77
93
  ];
78
94
 
95
+ const COLUMNS_TO_SORT_PARAMS = {
96
+ [columnHeaders[0]]: 'nvra',
97
+ [columnHeaders[2]]: 'version',
98
+ };
99
+
100
+ const {
101
+ pfSortParams, apiSortParams,
102
+ activeSortColumn, activeSortDirection,
103
+ } = useTableSort({
104
+ allColumns: columnHeaders,
105
+ columnsToSortParams: COLUMNS_TO_SORT_PARAMS,
106
+ initialSortColumnName: 'Package',
107
+ });
108
+
79
109
  const fetchItems = useCallback(
80
110
  (params) => {
81
111
  if (!hostId) return hostIdNotReady;
@@ -83,22 +113,23 @@ export const PackagesTab = () => {
83
113
  if (packageStatusSelected !== PACKAGE_STATUS) {
84
114
  modifiedParams.status = VERSION_STATUSES_TO_PARAM[packageStatusSelected];
85
115
  }
86
- return getInstalledPackagesWithLatest(hostId, modifiedParams);
116
+ return getInstalledPackagesWithLatest(hostId, { ...apiSortParams, ...modifiedParams });
87
117
  },
88
- [hostId, PACKAGE_STATUS, packageStatusSelected],
118
+ [hostId, PACKAGE_STATUS, packageStatusSelected, apiSortParams],
89
119
  );
90
120
 
91
121
  const response = useSelector(state => selectAPIResponse(state, HOST_PACKAGES_KEY));
92
122
  const { results, ...metadata } = response;
123
+ const { error: errorSearchBody } = metadata;
93
124
  const status = useSelector(state => selectHostPackagesStatus(state));
94
125
  const {
95
126
  selectOne,
96
127
  isSelected,
97
128
  searchQuery,
129
+ updateSearchQuery,
98
130
  selectedCount,
99
131
  isSelectable,
100
132
  selectedResults,
101
- updateSearchQuery,
102
133
  selectNone,
103
134
  selectAllMode,
104
135
  areAllRowsSelected,
@@ -107,8 +138,65 @@ export const PackagesTab = () => {
107
138
  } = useBulkSelect({
108
139
  results,
109
140
  metadata,
141
+ initialSearchQuery: searchParam || '',
142
+ });
143
+
144
+ const packageRemoveAction = packageName => removePackage({
145
+ hostname,
146
+ packageName,
147
+ });
148
+
149
+ const {
150
+ triggerJobStart: triggerPackageRemove, lastCompletedJob: lastCompletedPackageRemove,
151
+ isPolling: isRemoveInProgress,
152
+ } = useRexJobPolling(packageRemoveAction);
153
+
154
+ const packageBulkRemoveAction = bulkParams => removePackages({
155
+ hostname,
156
+ search: bulkParams,
157
+ });
158
+
159
+ const {
160
+ triggerJobStart: triggerBulkPackageRemove,
161
+ lastCompletedJob: lastCompletedBulkPackageRemove,
162
+ isPolling: isBulkRemoveInProgress,
163
+ } = useRexJobPolling(packageBulkRemoveAction);
164
+
165
+ const packageUpgradeAction = packageName => updatePackage({
166
+ hostname,
167
+ packageName,
168
+ });
169
+
170
+ const {
171
+ triggerJobStart: triggerPackageUpgrade,
172
+ lastCompletedJob: lastCompletedPackageUpgrade,
173
+ isPolling: isUpgradeInProgress,
174
+ } = useRexJobPolling(packageUpgradeAction);
175
+
176
+ const packageBulkUpgradeAction = bulkParams => updatePackages({
177
+ hostname,
178
+ search: bulkParams,
110
179
  });
111
180
 
181
+ const {
182
+ triggerJobStart: triggerBulkPackageUpgrade,
183
+ lastCompletedJob: lastCompletedBulkPackageUpgrade,
184
+ isPolling: isBulkUpgradeInProgress,
185
+ } = useRexJobPolling(packageBulkUpgradeAction);
186
+
187
+ const packageInstallAction
188
+ = bulkParams => installPackageBySearch({ hostname, search: bulkParams });
189
+
190
+ const {
191
+ triggerJobStart: triggerPackageInstall,
192
+ lastCompletedJob: lastCompletedPackageInstall,
193
+ isPolling: isInstallInProgress,
194
+ } = useRexJobPolling(packageInstallAction);
195
+
196
+ const actionInProgress = (isRemoveInProgress || isUpgradeInProgress
197
+ || isBulkRemoveInProgress || isBulkUpgradeInProgress || isInstallInProgress);
198
+ const disabledReason = __('A remote execution job is in progress.');
199
+
112
200
  if (!hostId) return <Skeleton />;
113
201
 
114
202
  const handleInstallPackagesClick = () => {
@@ -116,10 +204,7 @@ export const PackagesTab = () => {
116
204
  setIsModalOpen(true);
117
205
  };
118
206
 
119
- const removePackageViaRemoteExecution = packageName => dispatch(removePackage({
120
- hostname,
121
- packageName,
122
- }));
207
+ const removePackageViaRemoteExecution = packageName => triggerPackageRemove(packageName);
123
208
 
124
209
  const removeViaKatelloAgent = (packageName) => {
125
210
  dispatch(removePackageViaKatelloAgent(hostId, { packages: [packageName] }));
@@ -130,7 +215,7 @@ export const PackagesTab = () => {
130
215
  const selected = fetchBulkParams();
131
216
  setIsBulkActionOpen(false);
132
217
  selectNone();
133
- dispatch(removePackages({ hostname, search: selected }));
218
+ triggerBulkPackageRemove(selected);
134
219
  };
135
220
 
136
221
  const selectedPackageNames = () => selectedResults.map(({ name }) => name);
@@ -159,19 +244,13 @@ export const PackagesTab = () => {
159
244
  }
160
245
  };
161
246
 
162
- const upgradeViaRemoteExecution = packageName => dispatch(updatePackage({
163
- hostname,
164
- packageName,
165
- }));
247
+ const upgradeViaRemoteExecution = packageName => triggerPackageUpgrade(packageName);
166
248
 
167
249
  const upgradeBulkViaRemoteExecution = () => {
168
250
  const selected = fetchBulkParams();
169
251
  setIsBulkActionOpen(false);
170
252
  selectNone();
171
- dispatch(updatePackages({
172
- hostname,
173
- search: selected,
174
- }));
253
+ triggerBulkPackageUpgrade(selected);
175
254
  };
176
255
 
177
256
  const upgradeBulkViaKatelloAgent = () => {
@@ -204,6 +283,9 @@ export const PackagesTab = () => {
204
283
  (defaultRemoteAction === KATELLO_AGENT && selectAllMode && !areAllRowsSelected()) ||
205
284
  (!selectAllMode && !allUpgradable());
206
285
 
286
+ const readOnlyBookmarks =
287
+ cannot(createBookmarks, userPermissionsFromHostDetails({ hostDetails }));
288
+
207
289
  const dropdownUpgradeItems = [
208
290
  <DropdownItem
209
291
  aria-label="bulk_upgrade_rex"
@@ -251,7 +333,7 @@ export const PackagesTab = () => {
251
333
  return newStatus;
252
334
  });
253
335
 
254
- const actionButtons = (
336
+ const actionButtons = showActions ? (
255
337
  <Split hasGutter>
256
338
  <SplitItem>
257
339
  <ActionList isIconList>
@@ -265,8 +347,9 @@ export const PackagesTab = () => {
265
347
  {__('Upgrade')}
266
348
  </DropdownToggleAction>,
267
349
  ]}
268
- isDisabled={disableUpgrade()}
350
+ isDisabled={actionInProgress || disableUpgrade()}
269
351
  splitButtonVariant="action"
352
+ toggleVariant="primary"
270
353
  onToggle={onActionToggle}
271
354
  />
272
355
  }
@@ -275,19 +358,21 @@ export const PackagesTab = () => {
275
358
  />
276
359
  </ActionListItem>
277
360
  <ActionListItem>
278
- <Dropdown
279
- toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
280
- isOpen={isBulkActionOpen}
281
- isPlain
282
- dropdownItems={dropdownRemoveItems}
283
- />
361
+ {actionInProgress ? <Spinner size="lg" style={{ marginLeft: '1em', marginTop: '4px' }} /> : (
362
+ <Dropdown
363
+ toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
364
+ isOpen={isBulkActionOpen}
365
+ isPlain
366
+ dropdownItems={dropdownRemoveItems}
367
+ />
368
+ )}
284
369
  </ActionListItem>
285
370
  </ActionList>
286
371
  </SplitItem>
287
372
  </Split>
288
- );
373
+ ) : null;
289
374
 
290
- const toggleGroup = (
375
+ const statusFilters = (
291
376
  <Split hasGutter>
292
377
  <SplitItem>
293
378
  <SelectableDropdown
@@ -312,32 +397,43 @@ export const PackagesTab = () => {
312
397
  emptyContentBody,
313
398
  emptySearchTitle,
314
399
  emptySearchBody,
400
+ errorSearchTitle,
401
+ errorSearchBody,
315
402
  status,
316
403
  activeFilters,
317
404
  defaultFilters,
318
405
  actionButtons,
319
406
  searchQuery,
320
407
  updateSearchQuery,
321
- toggleGroup,
408
+ toggleGroup: statusFilters,
322
409
  selectedCount,
323
410
  selectNone,
324
411
  areAllRowsSelected,
325
412
  }
326
413
  }
327
- additionalListeners={[hostId, packageStatusSelected]}
414
+ ouiaId="host-packages-table"
415
+ additionalListeners={[hostId, packageStatusSelected,
416
+ activeSortDirection, activeSortColumn, lastCompletedPackageUpgrade,
417
+ lastCompletedPackageRemove, lastCompletedBulkPackageRemove,
418
+ lastCompletedBulkPackageUpgrade, lastCompletedPackageInstall]}
328
419
  fetchItems={fetchItems}
420
+ bookmarkController="katello_host_installed_packages"
421
+ readOnlyBookmarks={readOnlyBookmarks}
329
422
  autocompleteEndpoint={`/hosts/${hostId}/packages/auto_complete_search`}
330
423
  foremanApiAutoComplete
331
424
  rowsCount={results?.length}
332
425
  variant={TableVariant.compact}
333
426
  {...selectAll}
334
- displaySelectAllCheckbox
427
+ displaySelectAllCheckbox={showActions}
335
428
  >
336
429
  <Thead>
337
430
  <Tr>
338
431
  <Th key="select-all" />
339
- {columnHeaders.map(col =>
340
- <Th key={col}>{col}</Th>)}
432
+ <SortableColumnHeaders
433
+ columnHeaders={columnHeaders}
434
+ pfSortParams={pfSortParams}
435
+ columnsToSortParams={COLUMNS_TO_SORT_PARAMS}
436
+ />
341
437
  <Th />
342
438
  </Tr>
343
439
  </Thead>
@@ -354,6 +450,7 @@ export const PackagesTab = () => {
354
450
  const rowActions = [
355
451
  {
356
452
  title: __('Remove'),
453
+ isDisabled: actionInProgress,
357
454
  onClick: () => handlePackageRemove(packageName),
358
455
  },
359
456
  ];
@@ -363,6 +460,7 @@ export const PackagesTab = () => {
363
460
  {
364
461
  title: __('Upgrade via remote execution'),
365
462
  onClick: () => upgradeViaRemoteExecution(upgradableVersion),
463
+ isDisabled: actionInProgress,
366
464
  },
367
465
  {
368
466
  title: __('Upgrade via customized remote execution'),
@@ -374,14 +472,18 @@ export const PackagesTab = () => {
374
472
 
375
473
  return (
376
474
  <Tr key={`${id}`}>
377
- <Td select={{
378
- disable: false,
379
- isSelected: isSelected(id),
380
- onSelect: (event, selected) => selectOne(selected, id, pkg),
381
- rowIndex,
382
- variant: 'checkbox',
383
- }}
384
- />
475
+ {showActions ? (
476
+ <Td
477
+ select={{
478
+ disable: actionInProgress,
479
+ isSelected: isSelected(id),
480
+ onSelect: (event, selected) => selectOne(selected, id, pkg),
481
+ rowIndex,
482
+ variant: 'checkbox',
483
+ }}
484
+ title={actionInProgress ? disabledReason : undefined}
485
+ />
486
+ ) : <Td>&nbsp;</Td>}
385
487
  <Td>
386
488
  {rpmId
387
489
  ? <a href={urlBuilder(`packages/${rpmId}`, '')}>{packageName}</a>
@@ -391,12 +493,14 @@ export const PackagesTab = () => {
391
493
  <Td><PackagesStatus {...pkg} /></Td>
392
494
  <Td>{installedVersion.replace(`${packageName}-`, '')}</Td>
393
495
  <Td><PackagesLatestVersion {...pkg} /></Td>
394
- <Td
395
- key={`rowActions-${id}`}
396
- actions={{
397
- items: rowActions,
398
- }}
399
- />
496
+ {showActions ? (
497
+ <Td
498
+ key={`rowActions-${id}`}
499
+ actions={{
500
+ items: rowActions,
501
+ }}
502
+ />
503
+ ) : null}
400
504
  </Tr>
401
505
  );
402
506
  })
@@ -405,13 +509,15 @@ export const PackagesTab = () => {
405
509
  </TableWrapper>
406
510
  </div>
407
511
  {hostId &&
408
- <PackageInstallModal
409
- isOpen={isModalOpen}
410
- closeModal={closeModal}
411
- hostId={hostId}
412
- hostName={hostname}
413
- showKatelloAgent={showKatelloAgent}
414
- />
512
+ <PackageInstallModal
513
+ isOpen={isModalOpen}
514
+ closeModal={closeModal}
515
+ hostId={hostId}
516
+ key={hostId}
517
+ hostName={hostname}
518
+ showKatelloAgent={showKatelloAgent}
519
+ triggerPackageInstall={triggerPackageInstall}
520
+ />
415
521
  }
416
522
  </div>
417
523
  );
@@ -1,18 +1,14 @@
1
- import { API_OPERATIONS, post } from 'foremanReact/redux/API';
1
+ import { API_OPERATIONS, get, post } from 'foremanReact/redux/API';
2
+ import { stopInterval, withInterval } from 'foremanReact/redux/middlewares/IntervalMiddleware';
2
3
  import { REX_JOB_INVOCATIONS_KEY, REX_FEATURES } from './RemoteExecutionConstants';
3
4
  import { foremanApi } from '../../../../services/api';
4
- import { getResponseErrorMsgs } from '../../../../utils/helpers';
5
- import { renderTaskStartedToast } from '../../../../scenes/Tasks/helpers';
5
+ import { errorToast, renderRexJobStartedToast } from '../../../../scenes/Tasks/helpers';
6
6
  import { ERRATA_SEARCH_QUERY } from './ErrataTab/HostErrataConstants';
7
7
  import { TRACES_SEARCH_QUERY } from './TracesTab/HostTracesConstants';
8
8
  import { PACKAGE_SEARCH_QUERY } from './PackagesTab/YumInstallablePackagesConstants';
9
9
  import { PACKAGES_SEARCH_QUERY } from './PackagesTab/HostPackagesConstants';
10
10
 
11
- const errorToast = (error) => {
12
- const message = getResponseErrorMsgs(error.response);
13
- return message;
14
- };
15
-
11
+ // PARAM BUILDING
16
12
  const baseParams = ({ feature, hostname, inputs = {} }) => ({
17
13
  job_invocation: {
18
14
  feature,
@@ -80,16 +76,42 @@ const katelloHostErrataInstallParams = ({
80
76
  feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH,
81
77
  });
82
78
 
83
- export const installPackage = ({ hostname, packageName }) => post({
79
+ const katelloModuleStreamActionsParams = ({ hostname, action, moduleSpec }) =>
80
+ baseParams({
81
+ hostname,
82
+ inputs: { action, module_spec: moduleSpec },
83
+ feature: REX_FEATURES.KATELLO_HOST_MODULE_STREAM_ACTION,
84
+ });
85
+
86
+ const showRexToast = response => renderRexJobStartedToast(response.data);
87
+
88
+ // JOB POLLING
89
+ const pollJobKey = key => `${key}_POLL_REX_JOB`;
90
+
91
+ export const getJob = (key, jobId, handleSuccess) => get({
92
+ key,
93
+ url: foremanApi.getApiUrl(`/job_invocations/${jobId}`),
94
+ handleSuccess,
95
+ });
96
+
97
+ export const startPollingJob = ({
98
+ key, jobId, handleSuccess, interval = 1000,
99
+ }) =>
100
+ withInterval(getJob(pollJobKey(key), jobId, handleSuccess), interval);
101
+
102
+ export const stopPollingJob = ({ key }) => stopInterval(pollJobKey(key));
103
+
104
+ // JOB INVOCATIONS
105
+ export const installPackage = ({ hostname, packageName, handleSuccess }) => post({
84
106
  type: API_OPERATIONS.POST,
85
107
  key: REX_JOB_INVOCATIONS_KEY,
86
108
  url: foremanApi.getApiUrl('/job_invocations'),
87
109
  params: katelloPackageInstallParams({ hostname, packageName }),
88
- handleSuccess: response => renderTaskStartedToast({
89
- humanized: { action: `Install ${packageName} on ${hostname}` },
90
- id: response?.data?.dynflow_task?.id,
91
- }),
92
- errorToast: error => errorToast(error),
110
+ handleSuccess: (response) => {
111
+ showRexToast(response);
112
+ if (handleSuccess) handleSuccess(response);
113
+ },
114
+ errorToast,
93
115
  });
94
116
 
95
117
  export const installPackageBySearch = ({ hostname, search }) => post({
@@ -97,11 +119,8 @@ export const installPackageBySearch = ({ hostname, search }) => post({
97
119
  key: REX_JOB_INVOCATIONS_KEY,
98
120
  url: foremanApi.getApiUrl('/job_invocations'),
99
121
  params: katelloPackageInstallBySearchParams({ hostname, search }),
100
- handleSuccess: response => renderTaskStartedToast({
101
- humanized: { action: `Install packages on ${hostname}` },
102
- id: response?.data?.dynflow_task?.id,
103
- }),
104
- errorToast: error => errorToast(error),
122
+ handleSuccess: showRexToast,
123
+ errorToast,
105
124
  });
106
125
 
107
126
  export const removePackage = ({ hostname, packageName }) => post({
@@ -109,11 +128,8 @@ export const removePackage = ({ hostname, packageName }) => post({
109
128
  key: REX_JOB_INVOCATIONS_KEY,
110
129
  url: foremanApi.getApiUrl('/job_invocations'),
111
130
  params: katelloPackageRemoveParams({ hostname, packageName }),
112
- handleSuccess: response => renderTaskStartedToast({
113
- humanized: { action: `Remove ${packageName} on ${hostname}` },
114
- id: response?.data?.dynflow_task?.id,
115
- }),
116
- errorToast: error => errorToast(error),
131
+ handleSuccess: showRexToast,
132
+ errorToast,
117
133
  });
118
134
 
119
135
  export const removePackages = ({ hostname, search }) => post({
@@ -121,11 +137,8 @@ export const removePackages = ({ hostname, search }) => post({
121
137
  key: REX_JOB_INVOCATIONS_KEY,
122
138
  url: foremanApi.getApiUrl('/job_invocations'),
123
139
  params: katelloPackagesRemoveParams({ hostname, search }),
124
- handleSuccess: response => renderTaskStartedToast({
125
- humanized: { action: `Remove packages on ${hostname}` },
126
- id: response?.data?.dynflow_task?.id,
127
- }),
128
- errorToast: error => errorToast(error),
140
+ handleSuccess: showRexToast,
141
+ errorToast,
129
142
  });
130
143
 
131
144
  export const updatePackage = ({ hostname, packageName }) => post({
@@ -133,11 +146,8 @@ export const updatePackage = ({ hostname, packageName }) => post({
133
146
  key: REX_JOB_INVOCATIONS_KEY,
134
147
  url: foremanApi.getApiUrl('/job_invocations'),
135
148
  params: katelloPackageUpdateParams({ hostname, packageName }),
136
- handleSuccess: response => renderTaskStartedToast({
137
- humanized: { action: `Update ${packageName} on ${hostname}` },
138
- id: response?.data?.dynflow_task?.id,
139
- }),
140
- errorToast: error => errorToast(error),
149
+ handleSuccess: showRexToast,
150
+ errorToast,
141
151
  });
142
152
 
143
153
  export const updatePackages = ({ hostname, search }) => post({
@@ -145,11 +155,8 @@ export const updatePackages = ({ hostname, search }) => post({
145
155
  key: REX_JOB_INVOCATIONS_KEY,
146
156
  url: foremanApi.getApiUrl('/job_invocations'),
147
157
  params: katelloPackagesUpdateParams({ hostname, search }),
148
- handleSuccess: response => renderTaskStartedToast({
149
- humanized: { action: `Update on ${hostname}` },
150
- id: response?.data?.dynflow_task?.id,
151
- }),
152
- errorToast: error => errorToast(error),
158
+ handleSuccess: showRexToast,
159
+ errorToast,
153
160
  });
154
161
 
155
162
  export const resolveTraces = ({ hostname, search }) => post({
@@ -157,11 +164,8 @@ export const resolveTraces = ({ hostname, search }) => post({
157
164
  key: REX_JOB_INVOCATIONS_KEY,
158
165
  url: foremanApi.getApiUrl('/job_invocations'),
159
166
  params: katelloTracerResolveParams({ hostname, search }),
160
- handleSuccess: response => renderTaskStartedToast({
161
- humanized: { action: `Resolve traces on ${hostname}` },
162
- id: response?.data?.dynflow_task?.id,
163
- }),
164
- errorToast: error => errorToast(error),
167
+ handleSuccess: showRexToast,
168
+ errorToast,
165
169
  });
166
170
 
167
171
  export const installErrata = ({
@@ -173,9 +177,15 @@ export const installErrata = ({
173
177
  params: katelloHostErrataInstallParams({
174
178
  hostname, search,
175
179
  }),
176
- handleSuccess: response => renderTaskStartedToast({
177
- humanized: { action: `Install errata on ${hostname}` },
178
- id: response?.data?.dynflow_task?.id,
179
- }),
180
- errorToast: error => errorToast(error),
180
+ handleSuccess: showRexToast,
181
+ errorToast,
182
+ });
183
+
184
+ export const moduleStreamAction = ({ hostname, action, moduleSpec }) => post({
185
+ type: API_OPERATIONS.POST,
186
+ key: REX_JOB_INVOCATIONS_KEY,
187
+ url: foremanApi.getApiUrl('/job_invocations'),
188
+ params: katelloModuleStreamActionsParams({ hostname, action, moduleSpec }),
189
+ handleSuccess: showRexToast,
190
+ errorToast,
181
191
  });