katello 4.20.1 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -56
  3. data/app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js +60 -0
  4. data/app/assets/javascripts/katello/locale/bn/katello.js +366 -129
  5. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +366 -129
  6. data/app/assets/javascripts/katello/locale/ca/katello.js +367 -130
  7. data/app/assets/javascripts/katello/locale/cs/katello.js +367 -130
  8. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +375 -138
  9. data/app/assets/javascripts/katello/locale/de/katello.js +390 -153
  10. data/app/assets/javascripts/katello/locale/de_AT/katello.js +366 -129
  11. data/app/assets/javascripts/katello/locale/de_DE/katello.js +369 -132
  12. data/app/assets/javascripts/katello/locale/el/katello.js +368 -131
  13. data/app/assets/javascripts/katello/locale/en/katello.js +367 -130
  14. data/app/assets/javascripts/katello/locale/en_GB/katello.js +366 -129
  15. data/app/assets/javascripts/katello/locale/en_US/katello.js +366 -129
  16. data/app/assets/javascripts/katello/locale/es/katello.js +388 -151
  17. data/app/assets/javascripts/katello/locale/et_EE/katello.js +366 -129
  18. data/app/assets/javascripts/katello/locale/fr/katello.js +395 -158
  19. data/app/assets/javascripts/katello/locale/gl/katello.js +367 -130
  20. data/app/assets/javascripts/katello/locale/gu/katello.js +367 -130
  21. data/app/assets/javascripts/katello/locale/he_IL/katello.js +366 -129
  22. data/app/assets/javascripts/katello/locale/hi/katello.js +366 -129
  23. data/app/assets/javascripts/katello/locale/id/katello.js +367 -130
  24. data/app/assets/javascripts/katello/locale/it/katello.js +371 -134
  25. data/app/assets/javascripts/katello/locale/ja/katello.js +395 -158
  26. data/app/assets/javascripts/katello/locale/ka/katello.js +391 -154
  27. data/app/assets/javascripts/katello/locale/kn/katello.js +366 -129
  28. data/app/assets/javascripts/katello/locale/ko/katello.js +395 -158
  29. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +366 -129
  30. data/app/assets/javascripts/katello/locale/mr/katello.js +366 -129
  31. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +367 -130
  32. data/app/assets/javascripts/katello/locale/or/katello.js +366 -129
  33. data/app/assets/javascripts/katello/locale/pa/katello.js +366 -129
  34. data/app/assets/javascripts/katello/locale/pl/katello.js +367 -130
  35. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +366 -129
  36. data/app/assets/javascripts/katello/locale/pt/katello.js +366 -129
  37. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +388 -151
  38. data/app/assets/javascripts/katello/locale/ro/katello.js +366 -129
  39. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +366 -129
  40. data/app/assets/javascripts/katello/locale/ru/katello.js +377 -140
  41. data/app/assets/javascripts/katello/locale/sl/katello.js +367 -130
  42. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +367 -130
  43. data/app/assets/javascripts/katello/locale/ta/katello.js +366 -129
  44. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +366 -129
  45. data/app/assets/javascripts/katello/locale/te/katello.js +366 -129
  46. data/app/assets/javascripts/katello/locale/tr/katello.js +366 -129
  47. data/app/assets/javascripts/katello/locale/vi/katello.js +366 -129
  48. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +366 -129
  49. data/app/assets/javascripts/katello/locale/zh/katello.js +366 -129
  50. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +395 -158
  51. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +377 -140
  52. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +2 -2
  53. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +16 -12
  54. data/app/controllers/katello/api/v2/activation_keys_controller.rb +12 -6
  55. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +26 -1
  56. data/app/controllers/katello/api/v2/content_view_environments_controller.rb +14 -0
  57. data/app/controllers/katello/api/v2/content_views_controller.rb +6 -83
  58. data/app/controllers/katello/api/v2/host_packages_controller.rb +2 -2
  59. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +1 -22
  60. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +34 -9
  61. data/app/controllers/katello/api/v2/products_controller.rb +0 -11
  62. data/app/controllers/katello/api/v2/repositories_controller.rb +8 -0
  63. data/app/controllers/katello/api/v2/repository_sets_controller.rb +0 -4
  64. data/app/controllers/katello/api/v2/subscriptions_controller.rb +4 -59
  65. data/app/controllers/katello/api/v2/sync_status_controller.rb +90 -0
  66. data/app/controllers/katello/concerns/api/api_controller.rb +2 -8
  67. data/app/controllers/katello/concerns/api/v2/hostgroups_controller_extensions.rb +3 -2
  68. data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +72 -28
  69. data/app/controllers/katello/concerns/content_views_controller_helpers.rb +89 -0
  70. data/app/helpers/katello/content_options_helper.rb +179 -0
  71. data/app/helpers/katello/host_display_helper.rb +38 -0
  72. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +10 -233
  73. data/app/helpers/katello/kickstart_repository_helper.rb +109 -0
  74. data/app/helpers/katello/sync_management_helper.rb +38 -6
  75. data/app/lib/actions/katello/content_view/incremental_updates.rb +5 -0
  76. data/app/lib/actions/katello/content_view/remove.rb +16 -3
  77. data/app/lib/actions/katello/content_view_environment/reassign_objects.rb +14 -0
  78. data/app/lib/actions/katello/content_view_version/import.rb +18 -7
  79. data/app/lib/actions/katello/content_view_version/incremental_update.rb +20 -15
  80. data/app/lib/actions/katello/environment/destroy.rb +1 -8
  81. data/app/lib/actions/katello/host/recalculate_errata_status.rb +1 -1
  82. data/app/lib/actions/katello/repository_set/enable_repository.rb +1 -1
  83. data/app/lib/actions/pulp3/abstract_async_task.rb +10 -2
  84. data/app/lib/actions/pulp3/orphan_cleanup/purge_completed_tasks.rb +1 -1
  85. data/app/lib/actions/pulp3/repository/delete_distributions.rb +10 -3
  86. data/app/lib/katello/concerns/base_template_scope_extensions.rb +4 -35
  87. data/app/lib/katello/resources/candlepin/activation_key.rb +0 -34
  88. data/app/lib/katello/resources/candlepin/candlepin_ping.rb +17 -3
  89. data/app/lib/katello/resources/candlepin/consumer.rb +0 -56
  90. data/app/lib/katello/resources/candlepin/pool.rb +0 -5
  91. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +0 -6
  92. data/app/lib/katello/resources/cdn.rb +5 -10
  93. data/app/lib/katello/util/cve_hgcf_migrator.rb +78 -0
  94. data/app/lib/katello/util/hostgroup_facets_helper.rb +8 -3
  95. data/app/lib/katello/util/package.rb +4 -4
  96. data/app/lib/katello/util/package_filter.rb +22 -6
  97. data/app/lib/katello/util/path_with_substitutions.rb +1 -1
  98. data/app/models/katello/activation_key.rb +1 -63
  99. data/app/models/katello/alternate_content_source.rb +41 -4
  100. data/app/models/katello/authorization/repository.rb +1 -1
  101. data/app/models/katello/cdn_configuration.rb +2 -4
  102. data/app/models/katello/concerns/host_managed_extensions.rb +2 -23
  103. data/app/models/katello/concerns/hostgroup_extensions.rb +40 -9
  104. data/app/models/katello/concerns/organization_extensions.rb +1 -9
  105. data/app/models/katello/concerns/smart_proxy_extensions.rb +14 -1
  106. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +0 -20
  107. data/app/models/katello/content_credential.rb +3 -3
  108. data/app/models/katello/content_view.rb +35 -6
  109. data/app/models/katello/content_view_environment.rb +3 -0
  110. data/app/models/katello/errata_status.rb +1 -1
  111. data/app/models/katello/glue/candlepin/activation_key.rb +0 -55
  112. data/app/models/katello/glue/candlepin/candlepin_object.rb +1 -2
  113. data/app/models/katello/glue/candlepin/owner.rb +0 -14
  114. data/app/models/katello/glue/candlepin/pool.rb +32 -141
  115. data/app/models/katello/glue/provider.rb +1 -19
  116. data/app/models/katello/host/content_facet.rb +6 -0
  117. data/app/models/katello/host/subscription_facet.rb +1 -20
  118. data/app/models/katello/host_collection.rb +2 -2
  119. data/app/models/katello/hostgroup/content_facet.rb +149 -4
  120. data/app/models/katello/kt_environment.rb +17 -4
  121. data/app/models/katello/ping.rb +1 -9
  122. data/app/models/katello/pool.rb +8 -26
  123. data/app/models/katello/root_repository.rb +0 -2
  124. data/app/models/katello/subscription.rb +0 -8
  125. data/app/models/katello/trace_status.rb +1 -1
  126. data/app/presenters/katello/sync_status_presenter.rb +16 -1
  127. data/app/services/katello/candlepin/consumer.rb +0 -92
  128. data/app/services/katello/content_view_manager.rb +52 -3
  129. data/app/services/katello/host/package_profile_uploader.rb +2 -2
  130. data/app/services/katello/host/profiles_uploader.rb +4 -1
  131. data/app/services/katello/product_content_finder.rb +2 -3
  132. data/app/services/katello/pulp3/alternate_content_source.rb +22 -2
  133. data/app/services/katello/pulp3/api/apt.rb +8 -0
  134. data/app/services/katello/pulp3/content_view_version/export.rb +13 -3
  135. data/app/services/katello/pulp3/repository/generic.rb +2 -1
  136. data/app/services/katello/pulp3/repository.rb +23 -19
  137. data/app/services/katello/pulp3/repository_mirror.rb +104 -11
  138. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +22 -7
  139. data/app/services/katello/pulp3/smart_proxy_repository.rb +39 -17
  140. data/app/services/katello/registration_manager.rb +21 -22
  141. data/app/services/katello/repository_type.rb +2 -2
  142. data/app/views/katello/api/v2/activation_keys/base.json.rabl +0 -4
  143. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +1 -1
  144. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +10 -1
  145. data/app/views/katello/api/v2/content_views/base.json.rabl +5 -0
  146. data/app/views/katello/api/v2/organizations/show.json.rabl +0 -4
  147. data/app/views/katello/api/v2/subscription_facet/show.json.rabl +0 -4
  148. data/app/views/katello/api/v2/subscriptions/base.json.rabl +3 -1
  149. data/app/views/katello/api/v2/subscriptions/index.json.rabl +0 -2
  150. data/app/views/katello/api/v2/subscriptions/show.json.rabl +0 -24
  151. data/app/views/katello/api/v2/sync_status/index.json.rabl +9 -0
  152. data/app/views/katello/api/v2/sync_status/poll.json.rabl +5 -0
  153. data/app/views/katello/api/v2/sync_status/sync.json.rabl +5 -0
  154. data/app/views/katello/hosts/_errata_counts.html.erb +2 -2
  155. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +33 -24
  156. data/config/initializers/inflections.rb +0 -1
  157. data/config/initializers/monkeys.rb +2 -0
  158. data/config/routes/api/v2.rb +7 -20
  159. data/config/routes.rb +5 -10
  160. data/db/migrate/20251110000001_add_deb_fields_to_acs.rb +7 -0
  161. data/db/migrate/20260126190728_drop_katello_subscription_facet_pools_and_pool_activation_keys.katello.rb +35 -0
  162. data/db/migrate/20260225015710_remove_katello_compliance_reasons.katello.rb +20 -0
  163. data/db/migrate/20260301205720_add_fields_to_katello_pool.katello.rb +21 -0
  164. data/db/migrate/20260402151630_add_content_view_environment_to_hostgroup_content_facet.rb +366 -0
  165. data/db/migrate/20260423131700_remove_uuid_from_content_facets.rb +24 -0
  166. data/db/migrate/20260522000000_add_content_facet_id_indexes.rb +15 -0
  167. data/db/seeds.d/109-katello-notification-blueprints.rb +0 -24
  168. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  169. data/engines/bastion/app/assets/javascripts/bastion/i18n/bastion.pot +4 -10
  170. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/activation-key.factory.js +0 -3
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/activation-keys.routes.js +0 -24
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +2 -18
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-repository-sets.controller.js +0 -2
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-associations-content-hosts.html +0 -3
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +0 -7
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-repository-sets.html +0 -4
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion-katello-bootstrap.js +0 -1
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +0 -3
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +21 -9
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-host-bulk-module-streams-modal.html +1 -1
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-modal-helper.service.js +0 -11
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-module-streams.html +1 -1
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/views/erratum-packages.html +2 -2
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-details.controller.js +2 -10
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/views/host-collection-info.html +0 -6
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host-bulk-action.factory.js +0 -3
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host.factory.js +1 -1
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +8 -188
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +4 -3
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +1 -1
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/module-streams/views/partials/module-streams-table.html +1 -1
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/organizations/fenced-pages.service.js +0 -1
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery.html +4 -0
  195. data/engines/bastion_katello/app/assets/stylesheets/bastion_katello/bastion_katello.scss +1 -3
  196. data/lib/katello/engine.rb +0 -26
  197. data/lib/katello/permission_creator.rb +2 -3
  198. data/lib/katello/plugin.rb +15 -5
  199. data/lib/katello/repository_types/python.rb +3 -0
  200. data/lib/katello/repository_types/yum.rb +2 -1
  201. data/lib/katello/tasks/reimport.rake +0 -5
  202. data/lib/katello/tasks/upgrades/4.20/clean_cve_with_no_cvv.rake +23 -0
  203. data/lib/katello/tasks/upgrades/4.21/cleanup_python_publications.rake +183 -0
  204. data/lib/katello/tasks/upgrades/4.21/import_pools.rake +10 -0
  205. data/lib/katello/version.rb +1 -1
  206. data/lib/monkeys/pulp_polymorphic_remote_response.rb +44 -40
  207. data/lib/monkeys/python_remote_provenance.rb +161 -0
  208. data/lib/monkeys/remove_hidden_distribution.rb +4 -0
  209. data/lib/monkeys/remove_overwrite_parameter.rb +19 -0
  210. data/locale/action_names.rb +2 -1
  211. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/bn/katello.po +366 -129
  213. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  214. data/locale/bn_IN/katello.po +366 -129
  215. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/ca/katello.po +368 -131
  217. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/cs/katello.po +367 -130
  219. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  220. data/locale/cs_CZ/katello.po +376 -139
  221. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  222. data/locale/de/katello.po +394 -157
  223. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/de_AT/katello.po +366 -129
  225. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  226. data/locale/de_DE/katello.po +370 -132
  227. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/el/katello.po +368 -131
  229. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  230. data/locale/en/katello.po +367 -130
  231. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  232. data/locale/en_GB/katello.po +366 -129
  233. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/en_US/katello.po +366 -129
  235. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  236. data/locale/es/katello.po +390 -153
  237. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  238. data/locale/et_EE/katello.po +366 -129
  239. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/fr/katello.po +398 -161
  241. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/gl/katello.po +368 -131
  243. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/gu/katello.po +368 -131
  245. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  246. data/locale/he_IL/katello.po +366 -129
  247. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  248. data/locale/hi/katello.po +366 -129
  249. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/id/katello.po +368 -131
  251. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/it/katello.po +373 -135
  253. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  254. data/locale/ja/katello.po +398 -160
  255. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  256. data/locale/ka/katello.po +391 -154
  257. data/locale/katello.pot +2077 -1640
  258. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/kn/katello.po +366 -129
  260. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/ko/katello.po +400 -162
  262. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  263. data/locale/ml_IN/katello.po +366 -129
  264. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  265. data/locale/mr/katello.po +366 -129
  266. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/nl_NL/katello.po +368 -131
  268. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  269. data/locale/or/katello.po +366 -129
  270. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/pa/katello.po +366 -129
  272. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  273. data/locale/pl/katello.po +368 -131
  274. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  275. data/locale/pl_PL/katello.po +366 -129
  276. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/pt/katello.po +366 -129
  278. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  279. data/locale/pt_BR/katello.po +390 -153
  280. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  281. data/locale/ro/katello.po +366 -129
  282. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  283. data/locale/ro_RO/katello.po +366 -129
  284. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  285. data/locale/ru/katello.po +379 -142
  286. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  287. data/locale/sl/katello.po +368 -131
  288. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  289. data/locale/sv_SE/katello.po +369 -132
  290. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  291. data/locale/ta/katello.po +366 -129
  292. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  293. data/locale/ta_IN/katello.po +366 -129
  294. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  295. data/locale/te/katello.po +366 -129
  296. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  297. data/locale/tr/katello.po +366 -129
  298. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  299. data/locale/vi/katello.po +366 -129
  300. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  301. data/locale/vi_VN/katello.po +366 -129
  302. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  303. data/locale/zh/katello.po +366 -129
  304. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  305. data/locale/zh_CN/katello.po +398 -161
  306. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  307. data/locale/zh_TW/katello.po +378 -141
  308. data/webpack/ForemanColumnExtensions/index.js +17 -12
  309. data/webpack/components/ActionableDetail.js +11 -1
  310. data/webpack/components/ActivationKeysSearch/ActivationKeysSearch.test.js +14 -17
  311. data/webpack/components/ActivationKeysSearch/index.js +107 -61
  312. data/webpack/components/Content/__tests__/ContentTable.test.js +135 -26
  313. data/webpack/components/EditableTextInput/EditableTextInput.js +4 -2
  314. data/webpack/components/LoadingState/LoadingState.js +7 -1
  315. data/webpack/components/LoadingState/LoadingState.test.js +41 -21
  316. data/webpack/components/OptionTooltip/__tests__/OptionTooltip.test.js +47 -29
  317. data/webpack/components/RoutedTabs/RoutedTabs.scss +21 -0
  318. data/webpack/components/RoutedTabs/index.js +11 -3
  319. data/webpack/components/SelectOrg/SelectOrg.scss +12 -2
  320. data/webpack/components/SelectOrg/SetOrganization.js +92 -102
  321. data/webpack/components/SelectOrg/__tests__/SetOrganization.test.js +131 -0
  322. data/webpack/components/TooltipButton/TooltipButton.test.js +52 -33
  323. data/webpack/components/WithOrganization/withOrganization.test.js +22 -15
  324. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/AssignHostCVModal.js +2 -24
  325. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/OrderableAssignments.js +18 -28
  326. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/AssignHostCVModal.test.js +90 -33
  327. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +1 -1
  328. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +0 -1
  329. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +1 -1
  330. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +0 -2
  331. data/webpack/components/extensions/Hosts/ActionsBar/index.js +1 -1
  332. data/webpack/components/extensions/Hosts/BulkActions/BulkAssignCVEnvsModal/BulkAssignCVEnvsModal.js +2 -14
  333. data/webpack/components/extensions/Hosts/BulkActions/BulkAssignCVEnvsModal/index.js +1 -1
  334. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/index.js +1 -1
  335. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/index.js +1 -1
  336. data/webpack/components/extensions/Hosts/BulkActions/BulkManageTracesModal/index.js +1 -1
  337. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +1 -1
  338. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/index.js +1 -1
  339. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/01_BulkRepositorySetsTable.js +2 -2
  340. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/BulkRepositorySetsWizard.js +1 -1
  341. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/index.js +1 -1
  342. data/webpack/components/extensions/Hosts/BulkActions/BulkSystemPurposeModal/index.js +1 -1
  343. data/webpack/components/extensions/RegistrationCommands/__tests__/ActivationKeys.test.js +146 -9
  344. data/webpack/components/extensions/RegistrationCommands/__tests__/Force.test.js +52 -6
  345. data/webpack/components/extensions/RegistrationCommands/__tests__/IgnoreSubmanErrors.test.js +52 -6
  346. data/webpack/components/pf3Table/components/CollapseSubscriptionGroupButton.test.js +33 -13
  347. data/webpack/components/pf3Table/components/Table.test.js +102 -25
  348. data/webpack/components/pf3Table/components/TableBody.test.js +52 -14
  349. data/webpack/components/pf3Table/components/TableBodyMessage.test.js +14 -9
  350. data/webpack/components/pf3Table/components/TableSelectionCell.test.js +67 -13
  351. data/webpack/components/pf3Table/components/TableSelectionHeaderCell.test.js +67 -11
  352. data/webpack/components/pf3Table/formatters/EntitlementsInlineEditFormatter.js +4 -4
  353. data/webpack/components/pf3Table/formatters/__tests__/EntitlementsInlineEditFormatter.test.js +53 -46
  354. data/webpack/components/pf3Table/formatters/entitlementsValueFormatter.js +3 -3
  355. data/webpack/containers/Application/config.js +15 -10
  356. data/webpack/redux/OrganizationProducts/__tests__/OrganizationProductsActions.test.js +74 -36
  357. data/webpack/redux/OrganizationProducts/__tests__/OrganizationProductsReducer.test.js +74 -21
  358. data/webpack/redux/OrganizationProducts/__tests__/OrganizationProductsSelectors.test.js +81 -13
  359. data/webpack/redux/OrganizationProducts/__tests__/organizationProducts.fixtures.json +138 -0
  360. data/webpack/redux/actions/RedHatRepositories/helpers.js +2 -0
  361. data/webpack/redux/reducers/index.js +0 -4
  362. data/webpack/scenes/ActivationKeys/Details/components/__tests__/AssignAKCVModal.test.js +1 -1
  363. data/webpack/scenes/ActivationKeys/Details/hooks/useAssignmentManagement.js +3 -25
  364. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +16 -2
  365. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +28 -3
  366. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +25 -5
  367. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +92 -28
  368. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +1 -0
  369. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateDeb.test.js +133 -0
  370. data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +50 -10
  371. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +115 -35
  372. data/webpack/scenes/AlternateContentSources/helpers.js +10 -0
  373. data/webpack/scenes/Content/ContentActions.js +12 -3
  374. data/webpack/scenes/Content/ContentConfig.js +85 -0
  375. data/webpack/scenes/ContentCredentials/ContentCredentialConstants.js +1 -0
  376. data/webpack/scenes/ContentCredentials/ContentCredentialsPage.js +116 -0
  377. data/webpack/scenes/ContentCredentials/Details/AlternateContentSourcesTab.js +127 -0
  378. data/webpack/scenes/ContentCredentials/Details/ContentCredentialsDetails.js +232 -0
  379. data/webpack/scenes/ContentCredentials/Details/ContentCredentialsDetailsActions.js +93 -0
  380. data/webpack/scenes/ContentCredentials/Details/ContentCredentialsDetailsSelectors.js +17 -0
  381. data/webpack/scenes/ContentCredentials/Details/DetailsTab.js +237 -0
  382. data/webpack/scenes/ContentCredentials/Details/ProductsTab.js +133 -0
  383. data/webpack/scenes/ContentCredentials/Details/RepositoriesTab.js +173 -0
  384. data/webpack/scenes/ContentCredentials/Details/__tests__/AlternateContentSourcesTab.test.js +70 -0
  385. data/webpack/scenes/ContentCredentials/Details/__tests__/ContentCredentialsDetails.test.js +474 -0
  386. data/webpack/scenes/ContentCredentials/Details/__tests__/DetailsTab.test.js +493 -0
  387. data/webpack/scenes/ContentCredentials/Details/__tests__/ProductsTab.test.js +85 -0
  388. data/webpack/scenes/ContentCredentials/Details/__tests__/RepositoriesTab.test.js +105 -0
  389. data/webpack/scenes/ContentCredentials/Details/index.js +7 -0
  390. data/webpack/scenes/ContentCredentials/__tests__/ContentCredentialsPage.test.js +180 -0
  391. data/webpack/scenes/ContentCredentials/__tests__/contentCredentialsList.fixtures.json +81 -0
  392. data/webpack/scenes/ContentCredentials/index.js +5 -0
  393. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +29 -6
  394. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +55 -33
  395. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostgroupsForm.js +133 -0
  396. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +49 -4
  397. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +2 -2
  398. data/webpack/scenes/ContentViews/Delete/__tests__/cvDetails.fixtures.json +3 -1
  399. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +36 -3
  400. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +6 -0
  401. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +4 -0
  402. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +22 -0
  403. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +35 -13
  404. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHostgroups.js +173 -0
  405. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +153 -10
  406. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +3 -1
  407. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersionWithoutHostgroups.fixtures.json +941 -0
  408. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/cvDetails.fixtures.json +25 -0
  409. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/cvEnvironments.fixtures.json +15 -0
  410. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +14 -0
  411. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +0 -37
  412. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +35 -5
  413. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +10 -3
  414. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostgroupsForm.js +149 -0
  415. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +59 -37
  416. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +43 -3
  417. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHostgroups.js +62 -0
  418. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -1
  419. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +8 -4
  420. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +46 -104
  421. data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +2 -2
  422. data/webpack/scenes/Hosts/ChangeContentSource/components/MultiCVEnvForm.js +90 -0
  423. data/webpack/scenes/Hosts/ChangeContentSource/index.js +23 -32
  424. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +14 -1
  425. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailArtifacts.js +38 -12
  426. data/webpack/scenes/ModuleStreams/Details/Profiles/ModuleStreamDetailProfiles.js +54 -13
  427. data/webpack/scenes/ModuleStreams/Details/Profiles/ProfileRpmsCellFormatter.js +18 -11
  428. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +41 -11
  429. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ProfileRpmsCellFormatter.test.js +68 -24
  430. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetailArtifacts.test.js +44 -9
  431. data/webpack/scenes/Settings/Tables/__tests__/TableReducer.test.js +49 -29
  432. data/webpack/scenes/SmartProxy/ExpandableCvDetails.js +52 -5
  433. data/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js +1 -0
  434. data/webpack/scenes/Subscriptions/Details/SubscriptionAttributes.js +0 -1
  435. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +0 -4
  436. data/webpack/scenes/Subscriptions/Details/__tests__/SubscriptionDetails.test.js +0 -2
  437. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetailInfo.test.js.snap +0 -10
  438. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +0 -138
  439. data/webpack/scenes/Subscriptions/Details/__tests__/subscriptionDetails.fixtures.js +0 -2
  440. data/webpack/scenes/Subscriptions/Manifest/DeleteManifestModalText.js +5 -37
  441. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +1 -4
  442. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.scss +0 -9
  443. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +0 -59
  444. data/webpack/scenes/Subscriptions/Manifest/ManifestConstants.js +0 -12
  445. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +0 -50
  446. data/webpack/scenes/Subscriptions/Manifest/__tests__/manifest.fixtures.js +0 -36
  447. data/webpack/scenes/Subscriptions/SubscriptionActions.js +10 -5
  448. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +0 -7
  449. data/webpack/scenes/Subscriptions/SubscriptionHelpers.js +1 -2
  450. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +0 -15
  451. data/webpack/scenes/Subscriptions/__tests__/SubscriptionHelpers.test.js +0 -16
  452. data/webpack/scenes/Subscriptions/__tests__/SubscriptionValidations.test.js +5 -6
  453. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +1 -3
  454. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionHelpers.test.js.snap +0 -4
  455. data/webpack/scenes/Subscriptions/__tests__/subscriptions.fixtures.js +2 -21
  456. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTable.js +1 -1
  457. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableHelpers.js +6 -7
  458. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +1 -11
  459. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.fixtures.js +0 -11
  460. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +1 -1
  461. data/webpack/scenes/SyncStatus/SyncStatus.scss +32 -0
  462. data/webpack/scenes/SyncStatus/SyncStatusActions.js +69 -0
  463. data/webpack/scenes/SyncStatus/SyncStatusConstants.js +24 -0
  464. data/webpack/scenes/SyncStatus/SyncStatusPage.js +384 -0
  465. data/webpack/scenes/SyncStatus/SyncStatusSelectors.js +43 -0
  466. data/webpack/scenes/SyncStatus/__tests__/SyncStatusPage.test.js +110 -0
  467. data/webpack/scenes/SyncStatus/components/SyncProgressCell.js +55 -0
  468. data/webpack/scenes/SyncStatus/components/SyncResultCell.js +102 -0
  469. data/webpack/scenes/SyncStatus/components/SyncStatusTable.js +378 -0
  470. data/webpack/scenes/SyncStatus/components/SyncStatusToolbar.js +68 -0
  471. data/webpack/scenes/SyncStatus/components/TreeSelectAllCheckbox.js +118 -0
  472. data/webpack/scenes/SyncStatus/components/__tests__/SyncProgressCell.test.js +51 -0
  473. data/webpack/scenes/SyncStatus/components/__tests__/SyncResultCell.test.js +49 -0
  474. data/webpack/scenes/SyncStatus/components/__tests__/SyncStatusTable.test.js +179 -0
  475. data/webpack/scenes/SyncStatus/components/__tests__/SyncStatusToolbar.test.js +65 -0
  476. data/webpack/scenes/SyncStatus/components/__tests__/TreeSelectAllCheckbox.test.js +93 -0
  477. data/webpack/scenes/SyncStatus/index.js +1 -0
  478. data/webpack/scenes/Tasks/__tests__/TaskActions.test.js +46 -8
  479. data/webpack/scenes/Tasks/__tests__/TaskSelectors.test.js +16 -8
  480. data/webpack/utils/contentViewEnvironmentLabel.js +45 -0
  481. metadata +108 -186
  482. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +0 -29
  483. data/app/controllers/katello/sync_management_controller.rb +0 -84
  484. data/app/lib/actions/candlepin/consumer/attach_subscription.rb +0 -17
  485. data/app/lib/actions/candlepin/consumer/auto_attach_subscriptions.rb +0 -15
  486. data/app/lib/actions/candlepin/consumer/remove_subscription.rb +0 -22
  487. data/app/lib/actions/pulp3/orphan_cleanup/delete_orphaned_migrated_repositories.rb +0 -15
  488. data/app/lib/katello/messaging/connection.rb +0 -9
  489. data/app/lib/katello/messaging/received_message.rb +0 -12
  490. data/app/lib/katello/messaging/stomp_connection.rb +0 -73
  491. data/app/lib/katello/resources/candlepin/entitlement.rb +0 -22
  492. data/app/models/katello/compliance_reason.rb +0 -5
  493. data/app/models/katello/events/delete_latest_content_view_version.rb +0 -40
  494. data/app/models/katello/events/delete_pool.rb +0 -19
  495. data/app/models/katello/events/import_pool.rb +0 -17
  496. data/app/models/katello/pool_activation_key.rb +0 -6
  497. data/app/models/katello/subscription_facet_pool.rb +0 -8
  498. data/app/presenters/katello/activation_key_subscriptions_presenter.rb +0 -10
  499. data/app/presenters/katello/host_subscription_presenter.rb +0 -10
  500. data/app/presenters/katello/host_subscriptions_presenter.rb +0 -24
  501. data/app/services/katello/candlepin/event_handler.rb +0 -27
  502. data/app/services/katello/candlepin/message_handler.rb +0 -73
  503. data/app/services/katello/candlepin_event_listener.rb +0 -61
  504. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +0 -22
  505. data/app/services/katello/ui_notifications/subscriptions/sca_disable_error.rb +0 -13
  506. data/app/services/katello/ui_notifications/subscriptions/sca_disable_success.rb +0 -13
  507. data/app/services/katello/ui_notifications/subscriptions/sca_enable_error.rb +0 -13
  508. data/app/services/katello/ui_notifications/subscriptions/sca_enable_success.rb +0 -13
  509. data/app/views/katello/api/v2/activation_keys/subscriptions.json.rabl +0 -8
  510. data/app/views/katello/api/v2/host_subscriptions/events.json.rabl +0 -7
  511. data/app/views/katello/api/v2/host_subscriptions/index.json.rabl +0 -8
  512. data/app/views/katello/api/v2/subscriptions/organization_index.json.rabl +0 -10
  513. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-add-subscriptions.controller.js +0 -80
  514. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-subscriptions.controller.js +0 -65
  515. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-add-subscriptions.html +0 -26
  516. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-subscriptions-list.html +0 -25
  517. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-subscriptions.html +0 -48
  518. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/subscription-add-or-remove.html +0 -50
  519. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-subscriptions-modal.controller.js +0 -89
  520. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-subscriptions-modal.html +0 -126
  521. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host-subscription.factory.js +0 -24
  522. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscription-start-date.directive.js +0 -21
  523. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscription-type.directive.js +0 -16
  524. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscriptionConsumed.filter.js +0 -21
  525. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscriptions-helper.service.js +0 -72
  526. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscriptions.factory.js +0 -38
  527. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscriptions.module.js +0 -17
  528. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-start-date.html +0 -2
  529. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-type.html +0 -18
  530. data/engines/bastion_katello/app/assets/stylesheets/bastion_katello/host_subscriptions.scss +0 -14
  531. data/engines/bastion_katello/app/assets/stylesheets/bastion_katello/subscriptions.scss +0 -3
  532. data/lib/katello/tasks/unify_hosts.rake +0 -151
  533. data/lib/katello/tasks/upgrades/4.1/fix_invalid_pools.rake +0 -62
  534. data/webpack/components/Content/Details/ContentDetailInfo.js +0 -33
  535. data/webpack/components/Content/Details/ContentDetailRepositories.js +0 -19
  536. data/webpack/components/Content/Details/ContentDetailRepositoryTableSchema.js +0 -40
  537. data/webpack/components/Content/Details/ContentDetails.js +0 -73
  538. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -26
  539. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -20
  540. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -62
  541. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetailInfo.test.js.snap +0 -40
  542. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetailRepositories.test.js.snap +0 -64
  543. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +0 -143
  544. data/webpack/components/Content/__tests__/__snapshots__/ContentTable.test.js.snap +0 -33
  545. data/webpack/components/LoadingState/__snapshots__/LoadingState.test.js.snap +0 -20
  546. data/webpack/components/OptionTooltip/__tests__/__snapshots__/OptionTooltip.test.js.snap +0 -84
  547. data/webpack/components/Select/Select.js +0 -40
  548. data/webpack/components/TooltipButton/__snapshots__/TooltipButton.test.js.snap +0 -91
  549. data/webpack/components/WithOrganization/__snapshots__/withOrganization.test.js.snap +0 -110
  550. data/webpack/components/extensions/Hosts/BulkActions/bulkModalState.js +0 -51
  551. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +0 -86
  552. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/Force.test.js.snap +0 -29
  553. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/IgnoreSubmanErrors.test.js.snap +0 -29
  554. data/webpack/components/pf3Table/components/__snapshots__/CollapseSubscriptionGroupButton.test.js.snap +0 -19
  555. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +0 -153
  556. data/webpack/components/pf3Table/components/__snapshots__/TableBody.test.js.snap +0 -28
  557. data/webpack/components/pf3Table/components/__snapshots__/TableBodyMessage.test.js.snap +0 -13
  558. data/webpack/components/pf3Table/components/__snapshots__/TableSelectionCell.test.js.snap +0 -16
  559. data/webpack/components/pf3Table/components/__snapshots__/TableSelectionHeaderCell.test.js.snap +0 -15
  560. data/webpack/components/pf3Table/formatters/__tests__/__snapshots__/EntitlementsInlineEditFormatter.test.js.snap +0 -230
  561. data/webpack/redux/OrganizationProducts/__tests__/__snapshots__/OrganizationProductsActions.test.js.snap +0 -49
  562. data/webpack/redux/OrganizationProducts/__tests__/__snapshots__/OrganizationProductsReducer.test.js.snap +0 -36
  563. data/webpack/redux/OrganizationProducts/__tests__/__snapshots__/OrganizationProductsSelectors.test.js.snap +0 -9
  564. data/webpack/redux/OrganizationProducts/__tests__/organizationProducts.fixtures.js +0 -143
  565. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +0 -56
  566. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +0 -92
  567. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsActions.js +0 -23
  568. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsConstants.js +0 -3
  569. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsReducer.js +0 -33
  570. data/webpack/scenes/ModuleStreams/Details/Profiles/TableSchema.js +0 -36
  571. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetailInfo.test.js +0 -34
  572. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -240
  573. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetailsActions.test.js +0 -71
  574. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetailsReducer.test.js +0 -56
  575. data/webpack/scenes/ModuleStreams/Details/index.js +0 -17
  576. data/webpack/scenes/ModuleStreams/ModuleStreamsActions.js +0 -29
  577. data/webpack/scenes/ModuleStreams/ModuleStreamsConstants.js +0 -3
  578. data/webpack/scenes/ModuleStreams/ModuleStreamsPage.js +0 -67
  579. data/webpack/scenes/ModuleStreams/ModuleStreamsReducer.js +0 -43
  580. data/webpack/scenes/ModuleStreams/ModuleStreamsTableSchema.js +0 -70
  581. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -150
  582. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsActions.test.js +0 -48
  583. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsReducer.test.js +0 -46
  584. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -116
  585. data/webpack/scenes/ModuleStreams/__tests__/moduleStreams.fixtures.js +0 -72
  586. data/webpack/scenes/ModuleStreams/__tests__/moduleStreams.fixtures.json +0 -93
  587. data/webpack/scenes/ModuleStreams/index.js +0 -17
  588. data/webpack/scenes/Settings/Tables/__tests__/__snapshots__/TableReducer.test.js.snap +0 -76
  589. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailAssociations.js +0 -54
  590. data/webpack/scenes/Subscriptions/Details/__tests__/SubscriptionDetailAssociations.test.js +0 -16
  591. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetailAssociations.test.js.snap +0 -54
  592. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +0 -63
  593. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskSelectors.test.js.snap +0 -9
@@ -0,0 +1,25 @@
1
+ {
2
+ "id": 10,
3
+ "name": "Billy",
4
+ "label": "Billy",
5
+ "description": "",
6
+ "organization_id": 1,
7
+ "hostgroups": [
8
+ {
9
+ "id": 1,
10
+ "name": "HG10"
11
+ },
12
+ {
13
+ "id": 2,
14
+ "name": "HG20"
15
+ }
16
+ ],
17
+ "environments": [
18
+ {
19
+ "id": 1,
20
+ "name": "Library",
21
+ "label": "Library",
22
+ "hostgroups": [1, 2]
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "total": 1,
3
+ "subtotal": 1,
4
+ "page": 1,
5
+ "per_page": 20,
6
+ "results": [
7
+ {
8
+ "id": 100,
9
+ "name": "Library/Eeloo",
10
+ "label": "Library/Eeloo",
11
+ "content_view_version_id": 134,
12
+ "environment_id": 1
13
+ }
14
+ ]
15
+ }
@@ -7,22 +7,26 @@ import {
7
7
  getNumberOfActivationKeys,
8
8
  getNumberOfEnvironments,
9
9
  getNumberOfHosts,
10
+ getNumberOfHostgroups,
10
11
  } from './BulkDeleteHelpers';
11
12
  import ConfirmBulkDelete from './Steps/ConfirmBulkDelete';
12
13
  import FinishBulkDelete from './Steps/FinishBulkDelete';
13
14
  import ReassignActivationKeys from './Steps/ReassignActivationKeys';
14
15
  import ReassignHosts from './Steps/ReassignHosts';
16
+ import ReassignHostgroups from './Steps/ReassignHostgroups';
15
17
  import ReviewEnvironments from './Steps/ReviewEnvironments';
16
18
 
17
19
  const bulkDeleteSteps = ({
18
20
  versions,
19
21
  selectedCVForAK,
20
22
  selectedCVForHosts,
23
+ selectedCVForHostgroups,
21
24
  currentStep,
22
25
  }) => {
23
26
  const affectedEnvironmentCount = getNumberOfEnvironments(versions);
24
27
  const activationKeyCount = getNumberOfActivationKeys(versions);
25
28
  const hostCount = getNumberOfHosts(versions);
29
+ const hostgroupCount = getNumberOfHostgroups(versions);
26
30
  const deleteSteps = [];
27
31
 
28
32
  if (affectedEnvironmentCount) {
@@ -44,6 +48,16 @@ const bulkDeleteSteps = ({
44
48
  });
45
49
  }
46
50
 
51
+ if (hostgroupCount) {
52
+ deleteSteps.push({
53
+ name: hostgroupCount > 1 ?
54
+ __('Reassign affected host groups') :
55
+ __('Reassign affected host group'),
56
+ component: <ReassignHostgroups />,
57
+ enableNext: !!selectedCVForHostgroups,
58
+ });
59
+ }
60
+
47
61
  if (activationKeyCount) {
48
62
  deleteSteps.push({
49
63
  name: activationKeyCount > 1 ?
@@ -15,8 +15,6 @@ import {
15
15
  selectFilesComparisonStatus,
16
16
  selectErrataComparison,
17
17
  selectErrataComparisonStatus,
18
- selectModuleStreamsComparison,
19
- selectModuleStreamsComparisonStatus,
20
18
  selectDebPackagesComparison,
21
19
  selectDebPackagesComparisonStatus,
22
20
  selectDockerTagsComparison,
@@ -33,7 +31,6 @@ import {
33
31
  getRPMPackagesComparison,
34
32
  getFilesComparison,
35
33
  getErrataComparison,
36
- getModuleStreamsComparison,
37
34
  getDebPackagesComparison,
38
35
  getDockerTagsComparison,
39
36
  getContainerManifestListsComparison,
@@ -280,40 +277,6 @@ export default ({
280
277
  [__('Type')]: 'type',
281
278
  },
282
279
  },
283
- {
284
- name: __('Module streams'),
285
- getCountKey: (itemVersionOne, itemVersionTwo) =>
286
- itemVersionOne?.module_stream_count || itemVersionTwo?.module_stream_count,
287
- responseSelector: state =>
288
- selectModuleStreamsComparison(state, versionOneId, versionTwoId, viewBy),
289
- statusSelector: state =>
290
- selectModuleStreamsComparisonStatus(state, versionOneId, versionTwoId, viewBy),
291
- autocompleteEndpoint: '/katello/api/v2/module_streams',
292
- bookmarkController: 'katello_content_view_components',
293
- fetchItems: params => getModuleStreamsComparison(versionOneId, versionTwoId, viewBy, params),
294
- columnHeaders: [
295
- {
296
- title: __('Name'),
297
- getProperty: item => (
298
- <a href={urlBuilder(`module_streams/${item?.id}`, '')}>
299
- {item?.name}
300
- </a>),
301
- },
302
- { title: __('Stream'), getProperty: item => item?.stream },
303
- { title: __('Version'), getProperty: item => item?.version },
304
- { title: __('Context'), getProperty: item => item?.context },
305
- { title: __('Arch'), getProperty: item => item?.arch },
306
- { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
307
- { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
308
- ],
309
- sortConfig: {
310
- [__('Name')]: 'name',
311
- [__('Stream')]: 'stream',
312
- [__('Version')]: 'version',
313
- [__('Context')]: 'context',
314
- [__('Arch')]: 'arch',
315
- },
316
- },
317
280
  {
318
281
  name: __('Deb packages'),
319
282
  getCountKey: (itemVersionOne, itemVersionTwo) =>
@@ -10,6 +10,7 @@ import getEnvironmentPaths from '../../../components/EnvironmentPaths/Environmen
10
10
  import CVEnvironmentSelectionForm from './RemoveSteps/CVEnvironmentSelectionForm';
11
11
  import CVReassignActivationKeysForm from './RemoveSteps/CVReassignActivationKeysForm';
12
12
  import CVReassignHostsForm from './RemoveSteps/CVReassignHostsForm';
13
+ import CVReassignHostgroupsForm from './RemoveSteps/CVReassignHostgroupsForm';
13
14
  import CVVersionRemoveReview from './RemoveSteps/CVVersionRemoveReview';
14
15
  import CVVersionDeleteFinish from './RemoveSteps/CVVersionDeleteFinish';
15
16
  import getContentViewDetails from '../../ContentViewDetailActions';
@@ -23,14 +24,18 @@ const RemoveCVVersionWizard = ({
23
24
  }) => {
24
25
  const [selectedEnvForAK, setSelectedEnvForAK] = useState([]);
25
26
  const [selectedEnvForHost, setSelectedEnvForHost] = useState([]);
27
+ const [selectedEnvForHostgroup, setSelectedEnvForHostgroup] = useState([]);
26
28
  const dispatch = useDispatch();
27
29
  const selectedEnvSet = useSet([]);
28
30
  const [selectedCVForAK, setSelectedCVForAK] = useState(null);
29
31
  const [selectedCVNameForAK, setSelectedCVNameForAK] = useState(null);
30
32
  const [selectedCVForHosts, setSelectedCVForHosts] = useState(null);
31
33
  const [selectedCVNameForHosts, setSelectedCVNameForHosts] = useState(null);
34
+ const [selectedCVForHostgroups, setSelectedCVForHostgroups] = useState(null);
35
+ const [selectedCVNameForHostgroups, setSelectedCVNameForHostgroups] = useState(null);
32
36
  const [affectedActivationKeys, setAffectedActivationKeys] = useState(false);
33
37
  const [affectedHosts, setAffectedHosts] = useState(false);
38
+ const [affectedHostgroups, setAffectedHostgroups] = useState(false);
34
39
  const [deleteFlow, setDeleteFlow] = useState(deleteWizard || false);
35
40
  const [removeDeletionFlow, setRemoveDeletionFlow] = useState(false);
36
41
  const [canReview, setCanReview] = useState(false);
@@ -53,11 +58,17 @@ const RemoveCVVersionWizard = ({
53
58
  const activationStepComplete = affectedActivationKeys ?
54
59
  selectedEnvForAK && selectedCVForAK :
55
60
  true;
61
+ const hostgroupsStepComplete = affectedHostgroups ?
62
+ selectedEnvForHostgroup && selectedCVForHostgroups :
63
+ true;
56
64
  setCanReview(hostsStepComplete &&
57
65
  activationStepComplete &&
66
+ hostgroupsStepComplete &&
58
67
  (selectedEnvSet.size || versionEnvironments.length === 0));
59
68
  }, [affectedHosts, selectedEnvForHost, selectedCVForHosts, versionEnvironments,
60
- affectedActivationKeys, selectedEnvForAK, selectedCVForAK, selectedEnvSet.size]);
69
+ affectedActivationKeys, selectedEnvForAK, selectedCVForAK,
70
+ affectedHostgroups, selectedEnvForHostgroup, selectedCVForHostgroups,
71
+ selectedEnvSet.size]);
61
72
 
62
73
  const environmentSelectionStep = {
63
74
  id: 1,
@@ -74,17 +85,27 @@ const RemoveCVVersionWizard = ({
74
85
  canJumpTo: affectedHosts,
75
86
  };
76
87
 
77
- const activationStep = {
88
+ const hostgroupStep = {
78
89
  id: 3,
90
+ name: 'Reassign affected host groups',
91
+ component: <CVReassignHostgroupsForm />,
92
+ enableNext: (affectedHostgroups ? selectedEnvForHostgroup && selectedCVForHostgroups : true),
93
+ canJumpTo: affectedHostgroups &&
94
+ (affectedHosts ? selectedEnvForHost && selectedCVForHosts : true),
95
+ };
96
+
97
+ const activationStep = {
98
+ id: 4,
79
99
  name: 'Reassign affected activation keys',
80
100
  component: <CVReassignActivationKeysForm />,
81
101
  enableNext: canReview,
82
102
  canJumpTo: affectedActivationKeys &&
83
- (affectedHosts ? selectedEnvForHost && selectedCVForHosts : true),
103
+ (affectedHosts ? selectedEnvForHost && selectedCVForHosts : true) &&
104
+ (affectedHostgroups ? selectedEnvForHostgroup && selectedCVForHostgroups : true),
84
105
  };
85
106
 
86
107
  const reviewStep = {
87
- id: 4,
108
+ id: 5,
88
109
  name: 'Review',
89
110
  component: <CVVersionRemoveReview />,
90
111
  canJumpTo: canReview,
@@ -92,7 +113,7 @@ const RemoveCVVersionWizard = ({
92
113
  };
93
114
 
94
115
  const finishStep = {
95
- id: 5,
116
+ id: 6,
96
117
  name: 'Finish',
97
118
  component: <CVVersionDeleteFinish />,
98
119
  isFinishedStep: true,
@@ -101,6 +122,7 @@ const RemoveCVVersionWizard = ({
101
122
  const steps = [
102
123
  environmentSelectionStep,
103
124
  ...(affectedHosts ? [hostStep] : []),
125
+ ...(affectedHostgroups ? [hostgroupStep] : []),
104
126
  ...(affectedActivationKeys ? [activationStep] : []),
105
127
  reviewStep,
106
128
  finishStep,
@@ -115,8 +137,10 @@ const RemoveCVVersionWizard = ({
115
137
  setIsOpen,
116
138
  affectedActivationKeys,
117
139
  affectedHosts,
140
+ affectedHostgroups,
118
141
  setAffectedActivationKeys,
119
142
  setAffectedHosts,
143
+ setAffectedHostgroups,
120
144
  deleteFlow,
121
145
  setDeleteFlow,
122
146
  removeDeletionFlow,
@@ -125,15 +149,21 @@ const RemoveCVVersionWizard = ({
125
149
  selectedCVForHosts,
126
150
  setSelectedCVNameForHosts,
127
151
  setSelectedCVForHosts,
152
+ selectedCVForHostgroups,
153
+ setSelectedCVNameForHostgroups,
154
+ setSelectedCVForHostgroups,
128
155
  selectedCVForAK,
129
156
  setSelectedCVNameForAK,
130
157
  selectedCVNameForAK,
131
158
  selectedCVNameForHosts,
159
+ selectedCVNameForHostgroups,
132
160
  setSelectedCVForAK,
133
161
  selectedEnvForAK,
134
162
  setSelectedEnvForAK,
135
163
  selectedEnvForHost,
136
164
  setSelectedEnvForHost,
165
+ selectedEnvForHostgroup,
166
+ setSelectedEnvForHostgroup,
137
167
  selectedEnvSet,
138
168
  }}
139
169
  >
@@ -9,7 +9,7 @@ const CVEnvironmentSelectionForm = () => {
9
9
  const [alertDismissed, setAlertDismissed] = useState(false);
10
10
  const {
11
11
  versionNameToRemove, versionEnvironments, selectedEnvSet,
12
- setAffectedActivationKeys, setAffectedHosts, deleteFlow,
12
+ setAffectedActivationKeys, setAffectedHosts, setAffectedHostgroups, deleteFlow,
13
13
  removeDeletionFlow, setRemoveDeletionFlow,
14
14
  } = useContext(DeleteContext);
15
15
 
@@ -34,7 +34,12 @@ const CVEnvironmentSelectionForm = () => {
34
34
  const needsAKReassignment = selectedEnvironments.some(env =>
35
35
  (env.activation_key_count || 0) > (env.multi_env_ak_count || 0));
36
36
  setAffectedActivationKeys(needsAKReassignment);
37
- }, [setAffectedActivationKeys, setAffectedHosts,
37
+
38
+ // Hostgroups are always single-CVE, so any hostgroups in selected envs need reassignment
39
+ const needsHostgroupReassignment = selectedEnvironments.some(env =>
40
+ (env.hostgroup_count || 0) > 0);
41
+ setAffectedHostgroups(needsHostgroupReassignment);
42
+ }, [setAffectedActivationKeys, setAffectedHosts, setAffectedHostgroups,
38
43
  versionEnvironments, selectedEnvSet, selectedEnvSet.size]);
39
44
 
40
45
  const onSelectAll = (event, isSelected) => {
@@ -49,6 +54,7 @@ const CVEnvironmentSelectionForm = () => {
49
54
  const columnHeaders = [
50
55
  __('Environment'),
51
56
  __('Hosts'),
57
+ __('Host groups'),
52
58
  __('Activation keys'),
53
59
  ];
54
60
 
@@ -102,7 +108,7 @@ const CVEnvironmentSelectionForm = () => {
102
108
  <Tbody>
103
109
  {versionEnvironments?.map(({
104
110
  id, name, activation_key_count: akCount,
105
- host_count: hostCount,
111
+ host_count: hostCount, hostgroup_count: hostgroupCount,
106
112
  }, rowIndex) =>
107
113
  (
108
114
  <Tr ouiaId={`${name}_${id}`} key={`${name}_${id}`}>
@@ -119,6 +125,7 @@ const CVEnvironmentSelectionForm = () => {
119
125
  {name}
120
126
  </Td>
121
127
  <Td>{hostCount}</Td>
128
+ <Td>{hostgroupCount}</Td>
122
129
  <Td>{akCount}</Td>
123
130
  </Tr>
124
131
  ))
@@ -0,0 +1,149 @@
1
+ import React, { useState, useContext } from 'react';
2
+ import { useDispatch, useSelector } from 'react-redux';
3
+ import useDeepCompareEffect from 'use-deep-compare-effect';
4
+ import { ExpandableSection } from '@patternfly/react-core';
5
+ import { SelectOption } from '@patternfly/react-core/deprecated';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { translate as __ } from 'foremanReact/common/I18n';
8
+ import EnvironmentPaths from '../../../../components/EnvironmentPaths/EnvironmentPaths';
9
+ import getContentViews from '../../../../ContentViewsActions';
10
+ import { selectContentViewError, selectContentViews, selectContentViewStatus } from '../../../../ContentViewSelectors';
11
+ import DeleteContext from '../DeleteContext';
12
+ import ContentViewSelect from '../../../../components/ContentViewSelect/ContentViewSelect';
13
+ import { getCVPlaceholderText, shouldDisableCVSelect } from '../../../../components/ContentViewSelect/helpers';
14
+ import AffectedHostgroups from '../affectedHostgroups';
15
+
16
+ const CVReassignHostgroupsForm = () => {
17
+ const dispatch = useDispatch();
18
+ const contentViewsInEnvResponse = useSelector(state => selectContentViews(state, 'hostgroup'));
19
+ const contentViewsInEnvStatus = useSelector(state => selectContentViewStatus(state, 'hostgroup'));
20
+ const contentViewsInEnvError = useSelector(state => selectContentViewError(state, 'hostgroup'));
21
+ const cvInEnvLoading = contentViewsInEnvStatus === STATUS.PENDING;
22
+ const [cvSelectOpen, setCVSelectOpen] = useState(false);
23
+ const [cvSelectOptions, setCvSelectionOptions] = useState([]);
24
+ const [showHostgroups, setShowHostgroups] = useState(false);
25
+ const {
26
+ cvId,
27
+ selectedEnvForHostgroup,
28
+ setSelectedEnvForHostgroup,
29
+ currentStep,
30
+ selectedCVForHostgroups,
31
+ setSelectedCVNameForHostgroups,
32
+ setSelectedCVForHostgroups,
33
+ selectedEnvSet,
34
+ } = useContext(DeleteContext);
35
+
36
+ // Fetch content views for selected environment to reassign hostgroups to
37
+ useDeepCompareEffect(
38
+ () => {
39
+ if (selectedEnvForHostgroup.length) {
40
+ dispatch(getContentViews({
41
+ environment_id: selectedEnvForHostgroup[0].id,
42
+ include_default: true,
43
+ full_result: true,
44
+ }, 'hostgroup'));
45
+ }
46
+ setCVSelectOpen(false);
47
+ },
48
+ [selectedEnvForHostgroup, dispatch, setCVSelectOpen],
49
+ );
50
+
51
+ // Upon receiving CVs in selected env, form select options for the content view drop down
52
+ useDeepCompareEffect(() => {
53
+ const { results = {} } = contentViewsInEnvResponse;
54
+ if (!cvInEnvLoading && results && selectedCVForHostgroups) {
55
+ const isSelectedCVEligible = results.filter(cv =>
56
+ cv.id === selectedCVForHostgroups).length > 0;
57
+ if (!isSelectedCVEligible) {
58
+ setSelectedCVForHostgroups(null);
59
+ setSelectedCVNameForHostgroups(null);
60
+ }
61
+ }
62
+ if (!cvInEnvLoading && results && selectedEnvForHostgroup.length) {
63
+ setCvSelectionOptions(results.map(cv => (
64
+ <SelectOption
65
+ key={cv.id}
66
+ value={cv.id}
67
+ >
68
+ {cv.name}
69
+ </SelectOption>
70
+ )));
71
+ }
72
+ }, [
73
+ contentViewsInEnvResponse,
74
+ contentViewsInEnvStatus,
75
+ currentStep,
76
+ contentViewsInEnvError,
77
+ selectedEnvForHostgroup,
78
+ setSelectedCVForHostgroups,
79
+ setSelectedCVNameForHostgroups,
80
+ cvInEnvLoading,
81
+ selectedCVForHostgroups,
82
+ ]);
83
+
84
+ const fetchSelectedCVName = (id) => {
85
+ const { results } = contentViewsInEnvResponse ?? { };
86
+ return results?.filter(cv => cv.id === id)[0]?.name;
87
+ };
88
+
89
+ const onClear = () => {
90
+ setSelectedCVForHostgroups(null);
91
+ setSelectedCVNameForHostgroups(null);
92
+ };
93
+
94
+ const onSelect = (event, selection) => {
95
+ setSelectedCVForHostgroups(selection);
96
+ setSelectedCVNameForHostgroups(fetchSelectedCVName(selection));
97
+ setCVSelectOpen(false);
98
+ };
99
+
100
+ const placeholderText = getCVPlaceholderText({
101
+ contentSourceId: null,
102
+ environments: selectedEnvForHostgroup,
103
+ contentViewsStatus: contentViewsInEnvStatus,
104
+ cvSelectOptions,
105
+ });
106
+
107
+ const disableCVSelect = shouldDisableCVSelect({
108
+ contentSourceId: null,
109
+ environments: selectedEnvForHostgroup,
110
+ contentViewsStatus: contentViewsInEnvStatus,
111
+ cvSelectOptions,
112
+ });
113
+
114
+ return (
115
+ <>
116
+ <EnvironmentPaths
117
+ userCheckedItems={selectedEnvForHostgroup}
118
+ setUserCheckedItems={setSelectedEnvForHostgroup}
119
+ publishing={false}
120
+ headerText={__('Select lifecycle environment')}
121
+ multiSelect={false}
122
+ />
123
+ <ContentViewSelect
124
+ onClear={onClear}
125
+ selections={selectedCVForHostgroups}
126
+ onSelect={onSelect}
127
+ isOpen={cvSelectOpen}
128
+ isDisabled={disableCVSelect}
129
+ onToggle={isExpanded => setCVSelectOpen(isExpanded)}
130
+ id="selectCVForHostgroups"
131
+ ouiaId="selectCVForHostgroups"
132
+ name="selectCVForHostgroups"
133
+ aria-label="selectCVForHostgroups"
134
+ placeholderText={placeholderText}
135
+ >
136
+ {cvSelectOptions}
137
+ </ContentViewSelect>
138
+ <ExpandableSection
139
+ toggleText={showHostgroups ? __('Hide host groups') : __('Show host groups')}
140
+ onToggle={(_event, expanded) => setShowHostgroups(expanded)}
141
+ isExpanded={showHostgroups}
142
+ >
143
+ <AffectedHostgroups cvId={cvId} selectedEnvSet={selectedEnvSet} />
144
+ </ExpandableSection>
145
+ </>
146
+ );
147
+ };
148
+
149
+ export default CVReassignHostgroupsForm;
@@ -4,6 +4,7 @@ import { useHistory } from 'react-router-dom';
4
4
  import { STATUS } from 'foremanReact/constants';
5
5
  import useDeepCompareEffect from 'use-deep-compare-effect';
6
6
  import { translate as __ } from 'foremanReact/common/I18n';
7
+ import api from 'foremanReact/API';
7
8
  import { selectRemoveCVVersionStatus } from '../../../ContentViewDetailSelectors';
8
9
  import getContentViewDetails, { removeContentViewVersion } from '../../../ContentViewDetailActions';
9
10
  import Loading from '../../../../../../components/Loading';
@@ -15,6 +16,7 @@ const CVVersionDeleteFinish = () => {
15
16
  setIsOpen, selectedEnvSet,
16
17
  selectedCVForAK, selectedEnvForAK, selectedCVForHosts,
17
18
  selectedEnvForHost, affectedActivationKeys, affectedHosts,
19
+ selectedCVForHostgroups, selectedEnvForHostgroup, affectedHostgroups,
18
20
  deleteFlow, removeDeletionFlow,
19
21
  } = useContext(DeleteContext);
20
22
 
@@ -40,49 +42,69 @@ const CVVersionDeleteFinish = () => {
40
42
  versionEnvironments.map(env => env.id) :
41
43
  selectedEnv.map(env => env.id);
42
44
 
43
- let params = {
44
- id: cvId,
45
- environment_ids: environmentIdParams,
46
- };
47
-
48
- if (affectedActivationKeys) {
49
- params = {
50
- ...params,
51
- key_content_view_id: selectedCVForAK,
52
- key_environment_id: selectedEnvForAK[0].id,
45
+ const buildParamsAndDispatch = async () => {
46
+ let params = {
47
+ id: cvId,
48
+ environment_ids: environmentIdParams,
53
49
  };
54
- }
55
50
 
56
- if (affectedHosts) {
57
- params = {
58
- ...params,
59
- system_content_view_id: selectedCVForHosts,
60
- system_environment_id: selectedEnvForHost[0].id,
61
- };
62
- }
51
+ if (affectedActivationKeys) {
52
+ params = {
53
+ ...params,
54
+ key_content_view_id: selectedCVForAK,
55
+ key_environment_id: selectedEnvForAK[0].id,
56
+ };
57
+ }
63
58
 
64
- if (deleteFlow || removeDeletionFlow) {
65
- params = {
66
- ...params,
67
- content_view_version_ids: [versionIdToRemove],
68
- };
69
- }
59
+ if (affectedHosts) {
60
+ params = {
61
+ ...params,
62
+ system_content_view_id: selectedCVForHosts,
63
+ system_environment_id: selectedEnvForHost[0].id,
64
+ };
65
+ }
66
+
67
+ if (affectedHostgroups) {
68
+ // Fetch the CVEnv ID for the selected CV and environment
69
+ const response = await api.get('/katello/api/v2/content_view_environments', {}, {
70
+ content_view_id: selectedCVForHostgroups,
71
+ lifecycle_environment_id: selectedEnvForHostgroup[0].id,
72
+ });
73
+ const cvEnvId = response.data?.results?.[0]?.id;
74
+ if (cvEnvId) {
75
+ params = {
76
+ ...params,
77
+ hostgroup_content_view_environment_id: cvEnvId,
78
+ };
79
+ }
80
+ }
81
+
82
+ if (deleteFlow || removeDeletionFlow) {
83
+ params = {
84
+ ...params,
85
+ content_view_version_ids: [versionIdToRemove],
86
+ };
87
+ }
88
+
89
+ dispatch(removeContentViewVersion(
90
+ cvId,
91
+ versionIdToRemove,
92
+ versionEnvironments,
93
+ params,
94
+ () => {
95
+ dispatch(getContentViewDetails(cvId));
96
+ if (pathname !== '/versions') push('/versions');
97
+ },
98
+ ));
99
+ };
70
100
 
71
- dispatch(removeContentViewVersion(
72
- cvId,
73
- versionIdToRemove,
74
- versionEnvironments,
75
- params,
76
- () => {
77
- dispatch(getContentViewDetails(cvId));
78
- if (pathname !== '/versions') push('/versions');
79
- },
80
- ));
101
+ buildParamsAndDispatch();
81
102
  }
82
- }, [affectedActivationKeys, affectedHosts, cvId, deleteFlow,
103
+ }, [affectedActivationKeys, affectedHosts, affectedHostgroups, cvId, deleteFlow,
83
104
  dispatch, pathname, push, removeDeletionFlow, removeDispatched,
84
- selectedCVForAK, selectedCVForHosts, selectedEnv, selectedEnvForAK,
85
- selectedEnvForHost, setIsOpen, versionEnvironments, versionIdToRemove]);
105
+ selectedCVForAK, selectedCVForHosts, selectedCVForHostgroups,
106
+ selectedEnv, selectedEnvForAK, selectedEnvForHost, selectedEnvForHostgroup,
107
+ setIsOpen, versionEnvironments, versionIdToRemove]);
86
108
 
87
109
  return <Loading loadingText={__('Please wait while the task starts..')} />;
88
110
  };
@@ -9,15 +9,18 @@ import DeleteContext from '../DeleteContext';
9
9
  import WizardHeader from '../../../../components/WizardHeader';
10
10
  import AffectedHosts from '../affectedHosts';
11
11
  import AffectedActivationKeys from '../affectedActivationKeys';
12
+ import AffectedHostgroups from '../affectedHostgroups';
12
13
 
13
14
  const CVVersionRemoveReview = () => {
14
15
  const [alertDismissed, setAlertDismissed] = useState(false);
15
16
  const [showHosts, setShowHosts] = useState(false);
16
17
  const [showAKs, setShowAKs] = useState(false);
18
+ const [showHostgroups, setShowHostgroups] = useState(false);
17
19
  const {
18
20
  cvId, versionEnvironments, versionIdToRemove, versionNameToRemove, selectedEnvSet,
19
21
  selectedEnvForAK, selectedCVNameForAK, selectedCVNameForHosts,
20
- selectedEnvForHost, deleteFlow, removeDeletionFlow,
22
+ selectedEnvForHost, selectedCVNameForHostgroups, selectedEnvForHostgroup,
23
+ deleteFlow, removeDeletionFlow, affectedHostgroups,
21
24
  } = useContext(DeleteContext);
22
25
  const cvVersions = useSelector(state => selectCVVersions(state, cvId));
23
26
  const versionDeleteInfo = __(`Version ${versionNameToRemove} will be deleted from all environments. It will no longer be available for promotion.`);
@@ -43,6 +46,9 @@ const CVVersionRemoveReview = () => {
43
46
  sum + (env.multi_env_ak_count || 0), 0);
44
47
  const singleCVActivationKeysCount = akCount - multiCVActivationKeysCount;
45
48
 
49
+ const hostgroupCount = selectedEnvs.reduce((sum, env) =>
50
+ sum + (env.hostgroup_count || 0), 0);
51
+
46
52
  return (
47
53
  <>
48
54
  <WizardHeader title={__('Review details')} />
@@ -125,7 +131,7 @@ const CVVersionRemoveReview = () => {
125
131
  </Flex>
126
132
  )}
127
133
  <ExpandableSection
128
- toggleText={showHosts ? 'Hide hosts' : 'Show hosts'}
134
+ toggleText={showHosts ? __('Hide hosts') : __('Show hosts')}
129
135
  onToggle={() => setShowHosts(prev => !prev)}
130
136
  isExpanded={showHosts}
131
137
  >
@@ -195,7 +201,7 @@ const CVVersionRemoveReview = () => {
195
201
  </Flex>
196
202
  )}
197
203
  <ExpandableSection
198
- toggleText={showAKs ? 'Hide activation keys' : 'Show activation keys'}
204
+ toggleText={showAKs ? __('Hide activation keys') : __('Show activation keys')}
199
205
  onToggle={() => setShowAKs(prev => !prev)}
200
206
  isExpanded={showAKs}
201
207
  >
@@ -209,6 +215,40 @@ const CVVersionRemoveReview = () => {
209
215
  />
210
216
  </ExpandableSection>
211
217
  </>}
218
+ {affectedHostgroups &&
219
+ <>
220
+ <h3>{__('Host groups')}</h3>
221
+ <Flex>
222
+ <FlexItem><ExclamationTriangleIcon /></FlexItem>
223
+ <FlexItem data-testid="hostgroups-remove">
224
+ <FormattedMessage
225
+ id="hostgroups-remove"
226
+ defaultMessage="{count, plural, one {# {singular}} other {# {plural}}} will be moved to content view {cvName} in {envName}."
227
+ values={{
228
+ count: hostgroupCount,
229
+ singular: __('host group'),
230
+ plural: __('host groups'),
231
+ cvName: selectedCVNameForHostgroups,
232
+ envName: selectedEnvForHostgroup[0] && (
233
+ <Label color="purple" href={`/lifecycle_environments/${selectedEnvForHostgroup[0].id}`}>
234
+ {selectedEnvForHostgroup[0].name}
235
+ </Label>
236
+ ),
237
+ }}
238
+ />
239
+ </FlexItem>
240
+ </Flex>
241
+ <ExpandableSection
242
+ toggleText={showHostgroups ? __('Hide host groups') : __('Show host groups')}
243
+ onToggle={() => setShowHostgroups(prev => !prev)}
244
+ isExpanded={showHostgroups}
245
+ >
246
+ <AffectedHostgroups
247
+ cvId={cvId}
248
+ selectedEnvSet={selectedEnvSet}
249
+ />
250
+ </ExpandableSection>
251
+ </>}
212
252
  </>
213
253
  );
214
254
  };