katello 4.13.1 → 4.14.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (386) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js +12 -8
  3. data/app/assets/javascripts/katello/locale/bn/katello.js +274 -22
  4. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +274 -22
  5. data/app/assets/javascripts/katello/locale/ca/katello.js +274 -22
  6. data/app/assets/javascripts/katello/locale/cs/katello.js +274 -22
  7. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +275 -23
  8. data/app/assets/javascripts/katello/locale/de/katello.js +280 -28
  9. data/app/assets/javascripts/katello/locale/de_AT/katello.js +274 -22
  10. data/app/assets/javascripts/katello/locale/de_DE/katello.js +274 -22
  11. data/app/assets/javascripts/katello/locale/el/katello.js +274 -22
  12. data/app/assets/javascripts/katello/locale/en/katello.js +274 -22
  13. data/app/assets/javascripts/katello/locale/en_GB/katello.js +274 -22
  14. data/app/assets/javascripts/katello/locale/en_US/katello.js +274 -22
  15. data/app/assets/javascripts/katello/locale/es/katello.js +276 -24
  16. data/app/assets/javascripts/katello/locale/et_EE/katello.js +274 -22
  17. data/app/assets/javascripts/katello/locale/fr/katello.js +283 -31
  18. data/app/assets/javascripts/katello/locale/gl/katello.js +274 -22
  19. data/app/assets/javascripts/katello/locale/gu/katello.js +274 -22
  20. data/app/assets/javascripts/katello/locale/he_IL/katello.js +274 -22
  21. data/app/assets/javascripts/katello/locale/hi/katello.js +274 -22
  22. data/app/assets/javascripts/katello/locale/id/katello.js +274 -22
  23. data/app/assets/javascripts/katello/locale/it/katello.js +274 -22
  24. data/app/assets/javascripts/katello/locale/ja/katello.js +283 -31
  25. data/app/assets/javascripts/katello/locale/ka/katello.js +280 -28
  26. data/app/assets/javascripts/katello/locale/kn/katello.js +274 -22
  27. data/app/assets/javascripts/katello/locale/ko/katello.js +274 -22
  28. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +274 -22
  29. data/app/assets/javascripts/katello/locale/mr/katello.js +274 -22
  30. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +274 -22
  31. data/app/assets/javascripts/katello/locale/or/katello.js +274 -22
  32. data/app/assets/javascripts/katello/locale/pa/katello.js +274 -22
  33. data/app/assets/javascripts/katello/locale/pl/katello.js +274 -22
  34. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +274 -22
  35. data/app/assets/javascripts/katello/locale/pt/katello.js +274 -22
  36. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +276 -24
  37. data/app/assets/javascripts/katello/locale/ro/katello.js +274 -22
  38. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +274 -22
  39. data/app/assets/javascripts/katello/locale/ru/katello.js +274 -22
  40. data/app/assets/javascripts/katello/locale/sl/katello.js +274 -22
  41. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +274 -22
  42. data/app/assets/javascripts/katello/locale/ta/katello.js +274 -22
  43. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +274 -22
  44. data/app/assets/javascripts/katello/locale/te/katello.js +274 -22
  45. data/app/assets/javascripts/katello/locale/tr/katello.js +274 -22
  46. data/app/assets/javascripts/katello/locale/vi/katello.js +274 -22
  47. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +274 -22
  48. data/app/assets/javascripts/katello/locale/zh/katello.js +274 -22
  49. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +283 -31
  50. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +274 -22
  51. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +118 -74
  52. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +15 -10
  53. data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -1
  54. data/app/controllers/katello/api/v2/api_controller.rb +7 -0
  55. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -4
  56. data/app/controllers/katello/api/v2/debs_controller.rb +3 -2
  57. data/app/controllers/katello/api/v2/environments_controller.rb +2 -4
  58. data/app/controllers/katello/api/v2/host_contents_controller.rb +8 -3
  59. data/app/controllers/katello/api/v2/host_errata_controller.rb +4 -4
  60. data/app/controllers/katello/api/v2/host_packages_controller.rb +2 -2
  61. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -1
  62. data/app/controllers/katello/api/v2/packages_controller.rb +13 -3
  63. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +6 -2
  64. data/app/controllers/katello/api/v2/repositories_controller.rb +3 -4
  65. data/app/controllers/katello/api/v2/repository_sets_controller.rb +13 -14
  66. data/app/controllers/katello/api/v2/subscriptions_controller.rb +15 -9
  67. data/app/controllers/katello/api/v2/sync_controller.rb +2 -2
  68. data/app/controllers/katello/application_controller.rb +1 -1
  69. data/app/controllers/katello/concerns/api/v2/authorization.rb +3 -2
  70. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +28 -0
  71. data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +1 -1
  72. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +4 -3
  73. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +2 -4
  74. data/app/controllers/katello/remote_execution_controller.rb +53 -58
  75. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +19 -2
  76. data/app/helpers/katello/katello_urls_helper.rb +1 -1
  77. data/app/lib/actions/katello/alternate_content_source/alternate_content_source_common.rb +1 -1
  78. data/app/lib/actions/katello/alternate_content_source/update.rb +2 -1
  79. data/app/lib/actions/katello/capsule_content/verify_checksum.rb +1 -2
  80. data/app/lib/actions/katello/content_view/publish.rb +1 -0
  81. data/app/lib/actions/katello/content_view_version/create_repos.rb +1 -0
  82. data/app/lib/actions/katello/content_view_version/incremental_update.rb +3 -2
  83. data/app/lib/actions/katello/environment/{publish_repositories.rb → publish_container_repositories.rb} +10 -8
  84. data/app/lib/actions/katello/foreman/content_update.rb +4 -6
  85. data/app/lib/actions/katello/host/hypervisors_update.rb +6 -4
  86. data/app/lib/actions/katello/repository/create.rb +4 -4
  87. data/app/lib/actions/katello/repository/import_upload.rb +4 -6
  88. data/app/lib/actions/katello/repository/metadata_generate.rb +1 -0
  89. data/app/lib/actions/katello/repository/update.rb +3 -3
  90. data/app/lib/actions/katello/repository_set/enable_repository.rb +5 -6
  91. data/app/lib/actions/middleware/backend_services_check.rb +3 -2
  92. data/app/lib/actions/pulp3/abstract_async_task.rb +2 -4
  93. data/app/lib/actions/pulp3/capsule_content/verify_checksum.rb +1 -2
  94. data/app/lib/actions/pulp3/orchestration/repository/copy_all_units.rb +5 -1
  95. data/app/lib/actions/pulp3/orchestration/repository/delete.rb +5 -2
  96. data/app/lib/actions/pulp3/repository/save_version.rb +3 -5
  97. data/app/lib/katello/concerns/base_template_scope_extensions.rb +5 -9
  98. data/app/lib/katello/errors.rb +1 -0
  99. data/app/lib/katello/http_resource.rb +1 -0
  100. data/app/lib/katello/lazy_accessor.rb +1 -1
  101. data/app/lib/katello/resources/candlepin/candlepin_ping.rb +0 -5
  102. data/app/lib/katello/resources/candlepin/owner.rb +1 -1
  103. data/app/lib/katello/resources/candlepin/pool.rb +1 -2
  104. data/app/lib/katello/resources/candlepin/upstream_job.rb +1 -1
  105. data/app/lib/katello/resources/cdn.rb +3 -2
  106. data/app/lib/katello/resources/discovery/yum.rb +3 -3
  107. data/app/lib/katello/util/cdn_var_substitutor.rb +5 -3
  108. data/app/lib/katello/util/data.rb +3 -2
  109. data/app/lib/katello/util/errata.rb +4 -3
  110. data/app/lib/katello/util/package.rb +3 -3
  111. data/app/lib/katello/util/path_with_substitutions.rb +1 -1
  112. data/app/lib/katello/util/report_table.rb +3 -2
  113. data/app/lib/katello/util/url_matcher.rb +1 -1
  114. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +4 -3
  115. data/app/lib/katello/validators/alternate_content_source_products_validator.rb +5 -7
  116. data/app/lib/katello/validators/container_image_name_validator.rb +1 -1
  117. data/app/lib/katello/validators/katello_name_format_validator.rb +2 -2
  118. data/app/lib/katello/validators/no_trailing_space_validator.rb +2 -2
  119. data/app/lib/katello/validators/prior_validator.rb +2 -2
  120. data/app/lib/katello/validators/product_unique_attribute_validator.rb +2 -4
  121. data/app/models/katello/activation_key.rb +4 -6
  122. data/app/models/katello/alternate_content_source.rb +1 -1
  123. data/app/models/katello/authorization/host_tracer.rb +1 -2
  124. data/app/models/katello/candlepin/repository_mapper.rb +2 -2
  125. data/app/models/katello/concerns/host_managed_extensions.rb +41 -10
  126. data/app/models/katello/concerns/hostgroup_extensions.rb +2 -4
  127. data/app/models/katello/concerns/location_extensions.rb +2 -4
  128. data/app/models/katello/concerns/operatingsystem_extensions.rb +84 -16
  129. data/app/models/katello/concerns/smart_proxy_extensions.rb +4 -4
  130. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +2 -0
  131. data/app/models/katello/content_view.rb +5 -1
  132. data/app/models/katello/content_view_environment.rb +19 -4
  133. data/app/models/katello/content_view_environment_content_facet.rb +11 -0
  134. data/app/models/katello/erratum.rb +1 -1
  135. data/app/models/katello/event.rb +1 -1
  136. data/app/models/katello/glue/provider.rb +1 -2
  137. data/app/models/katello/hash_util.rb +1 -1
  138. data/app/models/katello/host/content_facet.rb +16 -3
  139. data/app/models/katello/host/subscription_facet.rb +27 -4
  140. data/app/models/katello/host_collection.rb +12 -8
  141. data/app/models/katello/pool.rb +5 -1
  142. data/app/models/katello/product.rb +7 -4
  143. data/app/models/katello/provider.rb +1 -2
  144. data/app/models/katello/repository.rb +18 -4
  145. data/app/models/katello/root_repository.rb +19 -0
  146. data/app/models/katello/rpm.rb +2 -2
  147. data/app/models/katello/subscription_facet_pool.rb +1 -1
  148. data/app/models/katello/sync_plan.rb +5 -4
  149. data/app/models/katello/task_status.rb +18 -18
  150. data/app/presenters/katello/product_host_count_presenter.rb +10 -0
  151. data/app/services/katello/candlepin/consumer.rb +11 -11
  152. data/app/services/katello/candlepin/message_handler.rb +3 -2
  153. data/app/services/katello/content_unit_indexer.rb +6 -0
  154. data/app/services/katello/pulp3/alternate_content_source.rb +1 -3
  155. data/app/services/katello/pulp3/api/core.rb +1 -1
  156. data/app/services/katello/pulp3/api/docker.rb +10 -0
  157. data/app/services/katello/pulp3/content_view_version/export.rb +1 -0
  158. data/app/services/katello/pulp3/content_view_version/import.rb +6 -4
  159. data/app/services/katello/pulp3/content_view_version/importable_products.rb +1 -3
  160. data/app/services/katello/pulp3/repository/apt.rb +4 -16
  161. data/app/services/katello/pulp3/repository/yum.rb +9 -5
  162. data/app/services/katello/pulp3/repository.rb +2 -2
  163. data/app/services/katello/pulp3/repository_mirror.rb +2 -9
  164. data/app/services/katello/pulp3/task.rb +4 -2
  165. data/app/services/katello/registration_manager.rb +13 -3
  166. data/app/services/katello/smart_proxy_helper.rb +1 -0
  167. data/app/views/dashboard/_host_collection_widget.html.erb +5 -4
  168. data/app/views/foreman/job_templates/install_errata.erb +2 -0
  169. data/app/views/foreman/job_templates/install_errata_-_katello_ansible_default.erb +2 -0
  170. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +2 -0
  171. data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +3 -1
  172. data/app/views/foreman/job_templates/install_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  173. data/app/views/foreman/job_templates/remove_packages_by_search_query_-_katello_ansible_default.erb +2 -2
  174. data/app/views/foreman/job_templates/resolve_traces.erb +5 -1
  175. data/app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  176. data/app/views/foreman/job_templates/upload_profile.erb +2 -0
  177. data/app/views/foreman/smart_proxies/_reclaim_space.html.erb +7 -5
  178. data/app/views/katello/api/v2/content_facet/base.json.rabl +18 -2
  179. data/app/views/katello/api/v2/packages/thindex.json.rabl +6 -0
  180. data/app/views/katello/api/v2/repositories/show.json.rabl +8 -8
  181. data/app/views/katello/api/v2/repository_sets/show.json.rabl +1 -1
  182. data/app/views/katello/api/v2/subscription_facet/base.json.rabl +1 -1
  183. data/app/views/katello/api/v2/subscriptions/index.json.rabl +1 -0
  184. data/app/views/katello/api/v2/subscriptions/show.json.rabl +1 -0
  185. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +14 -11
  186. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +4 -4
  187. data/config/routes/api/v2.rb +3 -1
  188. data/config/routes.rb +1 -3
  189. data/db/migrate/20160114200145_add_mirror_on_sync_to_repositories.rb +1 -0
  190. data/db/migrate/20160131182301_add_download_policy_to_katello_repositories.rb +1 -0
  191. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +3 -0
  192. data/db/migrate/20240522165308_add_priority_to_content_view_environment_content_facet.rb +5 -0
  193. data/db/migrate/20240621121212_katello_repository_debs_id_bigint.rb +6 -0
  194. data/db/migrate/20240729192228_add_convert2rhel_to_host_facets.rb +9 -0
  195. data/db/seeds.d/102-organizations.rb +5 -7
  196. data/db/seeds.d/150-module_job_templates.rb +7 -9
  197. data/db/seeds.d/75-job_templates.rb +9 -16
  198. data/engines/bastion_katello/README.md +3 -0
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-errata.controller.js +3 -3
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +6 -6
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/views/erratum-content-hosts.html +2 -2
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -4
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +6 -6
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +28 -27
  205. data/engines/bastion_katello/lib/bastion_katello/engine.rb +2 -2
  206. data/lib/katello/engine.rb +1 -8
  207. data/lib/katello/permission_creator.rb +3 -2
  208. data/lib/katello/plugin.rb +31 -27
  209. data/lib/katello/tasks/clean_old_file_repos.rake +2 -4
  210. data/lib/katello/tasks/reset.rake +3 -4
  211. data/lib/katello/version.rb +1 -1
  212. data/lib/katello.rb +0 -2
  213. data/lib/monkeys/ar_postgres_evr_t.rb +2 -0
  214. data/locale/action_names.rb +1 -1
  215. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/bn/katello.po +274 -22
  217. data/locale/bn_IN/katello.po +274 -22
  218. data/locale/ca/katello.po +274 -22
  219. data/locale/cs/katello.po +274 -22
  220. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/cs_CZ/katello.po +275 -23
  222. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  223. data/locale/de/katello.po +280 -28
  224. data/locale/de_AT/katello.po +274 -22
  225. data/locale/de_DE/katello.po +274 -22
  226. data/locale/el/katello.po +274 -22
  227. data/locale/en/katello.po +274 -22
  228. data/locale/en_GB/katello.po +274 -22
  229. data/locale/en_US/katello.po +274 -22
  230. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/es/katello.po +276 -24
  232. data/locale/et_EE/katello.po +274 -22
  233. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/fr/katello.po +283 -31
  235. data/locale/gl/katello.po +274 -22
  236. data/locale/gu/katello.po +274 -22
  237. data/locale/he_IL/katello.po +274 -22
  238. data/locale/hi/katello.po +274 -22
  239. data/locale/id/katello.po +274 -22
  240. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  241. data/locale/it/katello.po +274 -22
  242. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  243. data/locale/ja/katello.po +283 -31
  244. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  245. data/locale/ka/katello.po +280 -28
  246. data/locale/katello.pot +1001 -527
  247. data/locale/kn/katello.po +274 -22
  248. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/ko/katello.po +274 -22
  250. data/locale/ml_IN/katello.po +274 -22
  251. data/locale/mr/katello.po +274 -22
  252. data/locale/nl_NL/katello.po +274 -22
  253. data/locale/or/katello.po +274 -22
  254. data/locale/pa/katello.po +274 -22
  255. data/locale/pl/katello.po +274 -22
  256. data/locale/pl_PL/katello.po +274 -22
  257. data/locale/pt/katello.po +274 -22
  258. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/pt_BR/katello.po +276 -24
  260. data/locale/ro/katello.po +274 -22
  261. data/locale/ro_RO/katello.po +274 -22
  262. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  263. data/locale/ru/katello.po +274 -22
  264. data/locale/sl/katello.po +274 -22
  265. data/locale/sv_SE/katello.po +274 -22
  266. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/ta/katello.po +274 -22
  268. data/locale/ta_IN/katello.po +274 -22
  269. data/locale/te/katello.po +274 -22
  270. data/locale/tr/katello.po +274 -22
  271. data/locale/vi/katello.po +274 -22
  272. data/locale/vi_VN/katello.po +274 -22
  273. data/locale/zh/katello.po +274 -22
  274. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  275. data/locale/zh_CN/katello.po +283 -31
  276. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/zh_TW/katello.po +274 -22
  278. data/webpack/ForemanColumnExtensions/index.js +44 -1
  279. data/webpack/components/Table/TableWrapper.js +6 -0
  280. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +24 -3
  281. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +124 -56
  282. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +2 -3
  283. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViewDetailsCard.test.js +44 -10
  284. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +75 -31
  285. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  286. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +1 -1
  287. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +22 -7
  288. data/webpack/components/extensions/Hosts/ActionsBar/ActionsBar.scss +14 -0
  289. data/webpack/components/extensions/Hosts/ActionsBar/index.js +82 -23
  290. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js +5 -2
  291. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/02_BulkErrataTable.js +171 -0
  292. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_Review.js +160 -0
  293. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +99 -0
  294. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/BulkErrataWizard.js +157 -0
  295. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/index.js +24 -0
  296. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/02_BulkPackagesTable.js +157 -0
  297. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_Review.js +168 -0
  298. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +141 -0
  299. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +252 -0
  300. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/index.js +24 -0
  301. data/webpack/components/extensions/Hosts/BulkActions/HostReview.js +176 -0
  302. data/webpack/components/extensions/Hosts/TableRowActions/index.js +17 -0
  303. data/webpack/global_index.js +11 -3
  304. data/webpack/redux/actions/RedHatRepositories/repositorySetRepositories.js +5 -6
  305. data/webpack/redux/reducers/RedHatRepositories/__tests__/repositorySetRepositories.test.js +1 -1
  306. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +1 -1
  307. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +2 -1
  308. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +2 -1
  309. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -1
  310. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
  311. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +2 -1
  312. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -2
  313. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +2 -1
  314. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -2
  315. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +2 -1
  316. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +2 -1
  317. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +2 -1
  318. data/webpack/scenes/ContentViews/components/ContentViewSelect/ContentViewSelectOption.js +2 -2
  319. data/webpack/scenes/Subscriptions/Details/SubscriptionAttributes.js +1 -0
  320. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetailInfo.test.js.snap +10 -0
  321. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +6 -0
  322. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +2 -0
  323. data/webpack/scenes/Subscriptions/__tests__/subscriptions.fixtures.js +14 -0
  324. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableHelpers.js +1 -0
  325. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +10 -0
  326. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.fixtures.js +1 -0
  327. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/__snapshots__/SubscriptionsToolbar.test.js.snap +10 -0
  328. data/webpack/scenes/Tasks/helpers.js +1 -1
  329. metadata +24 -63
  330. data/app/assets/javascripts/katello/containers/container.js +0 -304
  331. data/app/lib/katello/util/http_helper.rb +0 -15
  332. data/app/models/732bd3db9f64c621c64d2be4f2a838727aac0845.patch +0 -61
  333. data/app/models/katello/repository.rb.bak +0 -978
  334. data/app/services/katello/pulp3/content_view_version/import_validator.rb.bak +0 -166
  335. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb.bak +0 -164
  336. data/lib/katello/tasks/update_repository_expiry.rake +0 -114
  337. data/locale/bn/katello.po.time_stamp +0 -0
  338. data/locale/bn_IN/katello.po.time_stamp +0 -0
  339. data/locale/ca/katello.po.time_stamp +0 -0
  340. data/locale/cs/katello.po.time_stamp +0 -0
  341. data/locale/cs_CZ/katello.po.time_stamp +0 -0
  342. data/locale/de/katello.po.time_stamp +0 -0
  343. data/locale/de_AT/katello.po.time_stamp +0 -0
  344. data/locale/de_DE/katello.po.time_stamp +0 -0
  345. data/locale/el/katello.po.time_stamp +0 -0
  346. data/locale/en/katello.po.time_stamp +0 -0
  347. data/locale/en_GB/katello.po.time_stamp +0 -0
  348. data/locale/en_US/katello.po.time_stamp +0 -0
  349. data/locale/es/katello.po.time_stamp +0 -0
  350. data/locale/et_EE/katello.po.time_stamp +0 -0
  351. data/locale/fr/katello.po.time_stamp +0 -0
  352. data/locale/gl/katello.po.time_stamp +0 -0
  353. data/locale/gu/katello.po.time_stamp +0 -0
  354. data/locale/he_IL/katello.po.time_stamp +0 -0
  355. data/locale/hi/katello.po.time_stamp +0 -0
  356. data/locale/id/katello.po.time_stamp +0 -0
  357. data/locale/it/katello.po.time_stamp +0 -0
  358. data/locale/ja/katello.po.time_stamp +0 -0
  359. data/locale/ka/katello.po.time_stamp +0 -0
  360. data/locale/kn/katello.po.time_stamp +0 -0
  361. data/locale/ko/katello.po.time_stamp +0 -0
  362. data/locale/ml_IN/katello.po.time_stamp +0 -0
  363. data/locale/mr/katello.po.time_stamp +0 -0
  364. data/locale/nl_NL/katello.po.time_stamp +0 -0
  365. data/locale/or/katello.po.time_stamp +0 -0
  366. data/locale/pa/katello.po.time_stamp +0 -0
  367. data/locale/pl/katello.po.time_stamp +0 -0
  368. data/locale/pl_PL/katello.po.time_stamp +0 -0
  369. data/locale/pt/katello.po.time_stamp +0 -0
  370. data/locale/pt_BR/katello.po.time_stamp +0 -0
  371. data/locale/ro/katello.po.time_stamp +0 -0
  372. data/locale/ro_RO/katello.po.time_stamp +0 -0
  373. data/locale/ru/katello.po.time_stamp +0 -0
  374. data/locale/sl/katello.po.time_stamp +0 -0
  375. data/locale/sv_SE/katello.po.time_stamp +0 -0
  376. data/locale/ta/katello.po.time_stamp +0 -0
  377. data/locale/ta_IN/katello.po.time_stamp +0 -0
  378. data/locale/te/katello.po.time_stamp +0 -0
  379. data/locale/tr/katello.po.time_stamp +0 -0
  380. data/locale/vi/katello.po.time_stamp +0 -0
  381. data/locale/vi_VN/katello.po.time_stamp +0 -0
  382. data/locale/zh/katello.po.time_stamp +0 -0
  383. data/locale/zh_CN/katello.po.time_stamp +0 -0
  384. data/locale/zh_TW/katello.po.time_stamp +0 -0
  385. data/webpack/global_test_setup.js.bak +0 -59
  386. data/webpack/utils/useKatelloDocUrl.js +0 -18
@@ -0,0 +1,176 @@
1
+ import React, { useEffect } from 'react'; // Don't useContext here so this component is reusable
2
+ import PropTypes from 'prop-types';
3
+ import {
4
+ Alert,
5
+ ToolbarItem,
6
+ Text,
7
+ TextContent,
8
+ TextVariants,
9
+ } from '@patternfly/react-core';
10
+ import TableIndexPage from 'foremanReact/components/PF4/TableIndexPage/TableIndexPage';
11
+ import { HOSTS_API_PATH } from 'foremanReact/routes/Hosts/constants';
12
+ import { translate as __ } from 'foremanReact/common/I18n';
13
+ import SelectAllCheckbox from 'foremanReact/components/PF4/TableIndexPage/Table/SelectAllCheckbox';
14
+ import { RowSelectTd } from 'foremanReact/components/HostsIndex/RowSelectTd';
15
+ import { getPageStats } from 'foremanReact/components/PF4/TableIndexPage/Table/helpers';
16
+
17
+ const HostReview = ({
18
+ initialSelectedHosts,
19
+ hostsBulkSelect,
20
+ setShouldValidateStep,
21
+ }) => {
22
+ const apiOptions = { key: 'HOST_REVIEW' };
23
+
24
+ const {
25
+ hostsBulkSelect: {
26
+ selectPage,
27
+ selectAll,
28
+ selectNone,
29
+ selectOne,
30
+ isSelected,
31
+ selectedCount,
32
+ areAllRowsSelected,
33
+ areAllRowsOnPageSelected,
34
+ updateSearchQuery,
35
+ hasInteracted,
36
+ },
37
+ hostsMetadata: {
38
+ subtotal,
39
+ total,
40
+ page,
41
+ per_page: perPage,
42
+ },
43
+ hostsResponse: response,
44
+ } = hostsBulkSelect;
45
+
46
+ const { response: { results } = {} } = response;
47
+
48
+ useEffect(() => {
49
+ if (results?.length && hasInteracted) {
50
+ setShouldValidateStep(true);
51
+ }
52
+ }, [setShouldValidateStep, results?.length, hasInteracted]);
53
+
54
+ const pageStats = getPageStats({ total: subtotal, page, perPage });
55
+ const selectionToolbar = (
56
+ <ToolbarItem key="selectAll">
57
+ <SelectAllCheckbox
58
+ {...{
59
+ selectedCount,
60
+ pageRowCount: pageStats.pageRowCount,
61
+ areAllRowsSelected,
62
+ areAllRowsOnPageSelected,
63
+ selectAll,
64
+ selectNone,
65
+ selectPage,
66
+ }}
67
+ totalCount={total}
68
+ areAllRowsOnPageSelected={areAllRowsOnPageSelected()}
69
+ areAllRowsSelected={areAllRowsSelected()}
70
+ />
71
+ </ToolbarItem>
72
+ );
73
+
74
+ const columns = {
75
+ name: {
76
+ title: __('Name'),
77
+ wrapper: ({ name, display_name: displayName }) => (
78
+ <a target="_blank" href={`hosts/${name}`} rel="noreferrer">{displayName}</a>
79
+ ),
80
+ isSorted: true,
81
+ weight: 50,
82
+ },
83
+ os_title: {
84
+ title: __('OS'),
85
+ wrapper: hostDetails => hostDetails?.operatingsystem_name,
86
+ isSorted: true,
87
+ weight: 100,
88
+ },
89
+ };
90
+
91
+ // restrict search query to only selected hosts
92
+ const restrictedSearchQuery = (newSearch) => {
93
+ let newSearchQuery = initialSelectedHosts;
94
+ const trimmedSearch = newSearch?.trim() ?? '';
95
+ if (!!trimmedSearch && !trimmedSearch.includes(initialSelectedHosts)) {
96
+ newSearchQuery = `${initialSelectedHosts} and ${trimmedSearch}`;
97
+ }
98
+ return newSearchQuery;
99
+ };
100
+
101
+ return (
102
+ <>
103
+ <TextContent>
104
+ <Text ouiaId="mpw-step-3-header" component={TextVariants.h3}>
105
+ {__('Review hosts')}
106
+ </Text>
107
+ <Text ouiaId="mpw-step-3-content" component={TextVariants.p}>
108
+ {__('Review and optionally exclude hosts from your selection.')}
109
+ </Text>
110
+ </TextContent>
111
+ {selectedCount === 0 && hasInteracted && (
112
+ <Alert
113
+ ouiaId="no-hosts-alert"
114
+ variant="danger"
115
+ isInline
116
+ title={__('You must select at least one host.')}
117
+ style={{ marginBottom: '1rem' }}
118
+ />
119
+ )}
120
+ <TableIndexPage
121
+ columns={columns}
122
+ showCheckboxes
123
+ apiUrl={HOSTS_API_PATH}
124
+ apiOptions={apiOptions}
125
+ headerText={__('Hosts')}
126
+ header={null}
127
+ controller="hosts"
128
+ creatable={false}
129
+ replacementResponse={response}
130
+ selectionToolbar={selectionToolbar}
131
+ updateSearchQuery={updateSearchQuery}
132
+ restrictedSearchQuery={restrictedSearchQuery}
133
+ rowSelectTd={RowSelectTd}
134
+ selectOne={selectOne}
135
+ isSelected={isSelected}
136
+ updateParamsByUrl={false}
137
+ bookmarksPosition="right"
138
+ />
139
+ </>
140
+ );
141
+ };
142
+
143
+ HostReview.propTypes = {
144
+ initialSelectedHosts: PropTypes.string,
145
+ hostsBulkSelect: PropTypes.shape({
146
+ hostsBulkSelect: PropTypes.shape({
147
+ selectPage: PropTypes.func,
148
+ selectAll: PropTypes.func,
149
+ selectNone: PropTypes.func,
150
+ selectOne: PropTypes.func,
151
+ exclusionSet: PropTypes.object, // eslint-disable-line react/forbid-prop-types
152
+ isSelected: PropTypes.func,
153
+ selectedCount: PropTypes.number,
154
+ areAllRowsSelected: PropTypes.func,
155
+ areAllRowsOnPageSelected: PropTypes.func,
156
+ updateSearchQuery: PropTypes.func,
157
+ inclusionSet: PropTypes.object, // eslint-disable-line react/forbid-prop-types
158
+ hasInteracted: PropTypes.bool,
159
+ }),
160
+ hostsMetadata: PropTypes.shape({
161
+ total: PropTypes.number,
162
+ page: PropTypes.number,
163
+ per_page: PropTypes.number,
164
+ subtotal: PropTypes.number,
165
+ }),
166
+ hostsResponse: PropTypes.shape([]),
167
+ }),
168
+ setShouldValidateStep: PropTypes.func.isRequired,
169
+ };
170
+
171
+ HostReview.defaultProps = {
172
+ hostsBulkSelect: {},
173
+ initialSelectedHosts: '',
174
+ };
175
+
176
+ export default HostReview;
@@ -0,0 +1,17 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { foremanUrl } from 'foremanReact/common/helpers';
3
+
4
+ const hostTableRowActions = (hostDetails) => {
5
+ const hostIsRegistered = hostDetails?.subscription_facet_attributes?.uuid;
6
+ return [
7
+ {
8
+ title: __('Change content view environments'),
9
+ onClick: () => {
10
+ window.location.href = foremanUrl(`hosts/${hostDetails.display_name}#/Overview?content_view_assignment=true`);
11
+ },
12
+ isDisabled: !hostIsRegistered,
13
+ },
14
+ ];
15
+ };
16
+
17
+ export default hostTableRowActions;
@@ -4,8 +4,10 @@ import { registerReducer } from 'foremanReact/common/MountingService';
4
4
  import { translate as __ } from 'foremanReact/common/I18n';
5
5
  import { registerColumns } from 'foremanReact/components/HostsIndex/Columns/core';
6
6
  import componentRegistry from 'foremanReact/components/componentRegistry';
7
+ import { registerGetActions } from 'foremanReact/components/HostsIndex/TableRowActions/core';
7
8
 
8
9
  import hostsIndexColumnExtensions from './ForemanColumnExtensions/index';
10
+ import hostTableRowActions from './components/extensions/Hosts/TableRowActions';
9
11
  import SystemStatuses from './components/extensions/about';
10
12
  import {
11
13
  RegistrationCommands,
@@ -33,8 +35,8 @@ import HostsIndexActionsBar from './components/extensions/Hosts/ActionsBar';
33
35
  import RecentCommunicationCardExtensions from './components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions';
34
36
  import SystemPurposeCard from './components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard';
35
37
  import BulkChangeHostCVModal from './components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js';
36
-
37
-
38
+ import BulkPackagesWizardModal from './components/extensions/Hosts/BulkActions/BulkPackagesWizard/index.js';
39
+ import BulkErrataWizardModal from './components/extensions/Hosts/BulkActions/BulkErrataWizard/index.js';
38
40
  import ActivationKeysSearch from './components/ActivationKeysSearch';
39
41
 
40
42
  registerReducer('katelloExtends', extendReducer);
@@ -90,9 +92,15 @@ addGlobalFill('host-tab-details-cards', 'HW properties', <HwPropertiesCard key="
90
92
 
91
93
  // Hosts Index page extensions
92
94
  addGlobalFill('_all-hosts-modals', 'BulkChangeHostCVModal', <BulkChangeHostCVModal key="bulk-change-host-cv-modal" />, 100);
95
+ addGlobalFill('_all-hosts-modals', 'BulkPackagesWizardModal', <BulkPackagesWizardModal key="bulk-packages-wizard-modal" />, 200);
96
+ addGlobalFill('_all-hosts-modals', 'BulkErrataWizardModal', <BulkErrataWizardModal key="bulk-errata-wizard-modal" />, 200);
93
97
 
94
98
  registerColumns(hostsIndexColumnExtensions);
95
-
99
+ registerGetActions({
100
+ pluginName: 'katello',
101
+ getActionsFunc: hostTableRowActions,
102
+ tableName: 'hosts',
103
+ });
96
104
 
97
105
  componentRegistry.register({
98
106
  name: 'ActivationKeysSearch',
@@ -68,13 +68,12 @@ const loadRepositorySetRepos = (contentId, productId) => async (dispatch) => {
68
68
  productId,
69
69
  results: data.results,
70
70
  });
71
- } catch (response) {
72
- const error = response && response.data && response.data.error;
73
- return dispatch({
74
- type: REPOSITORY_SET_REPOSITORIES_FAILURE,
75
- contentId,
71
+ } catch (error) {
72
+ return dispatch(apiError(
73
+ REPOSITORY_SET_REPOSITORIES_FAILURE,
76
74
  error,
77
- });
75
+ { contentId },
76
+ ));
78
77
  }
79
78
  };
80
79
 
@@ -39,7 +39,7 @@ describe('repositorySetRepositories reducer', () => {
39
39
  it('should have error on REPOSITORY_SET_REPOSITORIES_FAILURE', () => {
40
40
  expect(reducer(initialState, {
41
41
  type: types.REPOSITORY_SET_REPOSITORIES_FAILURE,
42
- contentId,
42
+ payload: { contentId },
43
43
  error: 'Unable to process request.',
44
44
  })).toEqual(errorState);
45
45
  });
@@ -81,7 +81,7 @@ export default (state = initialState, action) => {
81
81
  });
82
82
 
83
83
  case REPOSITORY_SET_REPOSITORIES_FAILURE:
84
- return state.set(action.contentId, {
84
+ return state.set(action.payload.contentId, {
85
85
  loading: false,
86
86
  repositories: [],
87
87
  error: action.error,
@@ -4,6 +4,7 @@ import { Modal, ModalVariant } from '@patternfly/react-core';
4
4
  import { FormattedMessage } from 'react-intl';
5
5
  import { translate as __ } from 'foremanReact/common/I18n';
6
6
  import CopyContentViewForm from './CopyContentViewForm';
7
+ import { truncate } from '../../../utils/helpers';
7
8
 
8
9
  const CopyContentViewModal = ({
9
10
  cvId, cvName, show, setIsOpen,
@@ -11,7 +12,7 @@ const CopyContentViewModal = ({
11
12
  const description = (
12
13
  <FormattedMessage
13
14
  id="copy-cv-description"
14
- values={{ cv: <b>{cvName}</b> }}
15
+ values={{ cv: <b>{truncate(cvName)}</b> }}
15
16
  defaultMessage={__('This will create a copy of {cv}, including details, repositories, and filters. Generated data such as history, tasks and versions will not be copied.')}
16
17
  />
17
18
  );
@@ -14,6 +14,7 @@ import {
14
14
  selectCVDetailStatus,
15
15
  } from '../../Details/ContentViewDetailSelectors';
16
16
  import getContentViewDetails, { addComponent } from '../ContentViewDetailActions';
17
+ import { truncate } from '../../../../utils/helpers';
17
18
 
18
19
  const ComponentContentViewAddModal = ({
19
20
  cvId, componentCvId, componentId, latest, componentVersionId, show, setIsOpen,
@@ -84,7 +85,7 @@ const ComponentContentViewAddModal = ({
84
85
  variant={ModalVariant.small}
85
86
  isOpen={show}
86
87
  ouiaId="add-update-cv-modal"
87
- description={__(`Select available version of ${cvName} to use`)}
88
+ description={__(`Select available version of ${truncate(cvName)} to use`)}
88
89
  onClose={() => {
89
90
  setIsOpen(false);
90
91
  }}
@@ -9,6 +9,7 @@ import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';
9
9
  import { useDispatch } from 'react-redux';
10
10
  import { translate as __ } from 'foremanReact/common/I18n';
11
11
  import getContentViewDetails, { addComponent } from '../ContentViewDetailActions';
12
+ import { truncate } from '../../../../utils/helpers';
12
13
 
13
14
  const ComponentContentViewBulkAddModal = ({ cvId, rowsToAdd, onClose }) => {
14
15
  const dispatch = useDispatch();
@@ -62,7 +63,7 @@ const ComponentContentViewBulkAddModal = ({ cvId, rowsToAdd, onClose }) => {
62
63
  aria-label="componentCvName"
63
64
  key={componentCvName}
64
65
  >
65
- <CardTitle aria-label={componentCvName}>{componentCvName}</CardTitle>
66
+ <CardTitle aria-label={componentCvName}>{truncate(componentCvName)}</CardTitle>
66
67
  <CardBody>
67
68
  <FormGroup label={__('Version')} isRequired fieldId="version">
68
69
  <Select
@@ -36,6 +36,7 @@ import ComponentContentViewAddModal from './ComponentContentViewAddModal';
36
36
  import ComponentContentViewBulkAddModal from './ComponentContentViewBulkAddModal';
37
37
  import { hasPermission } from '../../helpers';
38
38
  import InactiveText from '../../components/InactiveText';
39
+ import { truncate } from '../../../../utils/helpers';
39
40
 
40
41
 
41
42
  const ContentViewComponents = ({ cvId, details }) => {
@@ -144,7 +145,7 @@ const ContentViewComponents = ({ cvId, details }) => {
144
145
 
145
146
  const cells = [
146
147
  { title: <Bullseye><ContentViewIcon composite={false} /></Bullseye> },
147
- { title: <a href={urlBuilder('content_views', '') + id}>{name}</a> },
148
+ { title: <a href={urlBuilder('content_views', '') + id}>{truncate(name)}</a> },
148
149
  {
149
150
  title: (
150
151
  <Split>
@@ -39,6 +39,7 @@ import ContentViewDeleteWizard from '../Delete/ContentViewDeleteWizard';
39
39
  import EmptyStateMessage from '../../../components/Table/EmptyStateMessage';
40
40
  import { CONTENT_VIEW_NEEDS_PUBLISH_RESET, cvVersionTaskPollingKey } from '../ContentViewsConstants';
41
41
  import { clearPollTaskData, stopPollingTask } from '../../Tasks/TaskActions';
42
+ import { truncate } from '../../../utils/helpers';
42
43
 
43
44
  export default () => {
44
45
  const { id } = useParams();
@@ -161,7 +162,7 @@ export default () => {
161
162
  <FlexItem>
162
163
  <TextContent>
163
164
  <Text ouiaId="cv-details-header-name" component={TextVariants.h1}>
164
- <ContentViewIcon count={name} composite={composite} />
165
+ <ContentViewIcon count={truncate(name)} composite={composite} />
165
166
  </Text>
166
167
  </TextContent>
167
168
  </FlexItem>
@@ -4,6 +4,7 @@ import React, {
4
4
  useState,
5
5
  } from 'react';
6
6
  import { FormattedMessage } from 'react-intl';
7
+ import { getDocsURL } from 'foremanReact/common/helpers';
7
8
  import { translate as __ } from 'foremanReact/common/I18n';
8
9
  import { urlBuilder } from 'foremanReact/common/urlHelpers';
9
10
  import { STATUS } from 'foremanReact/constants';
@@ -40,7 +41,6 @@ import {
40
41
  Td,
41
42
  } from '@patternfly/react-table';
42
43
  import { useSelectionSet } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks';
43
- import { useKatelloDocUrl } from '../../../../utils/useKatelloDocUrl';
44
44
  import AddedStatusLabel from '../../../../components/AddedStatusLabel';
45
45
  import SelectableDropdown from '../../../../components/SelectableDropdown';
46
46
  import TableWrapper from '../../../../components/Table/TableWrapper';
@@ -139,7 +139,7 @@ const ContentViewRepositories = ({ cvId, details }) => {
139
139
  __('Status'),
140
140
  ];
141
141
 
142
- const documentationUrl = useKatelloDocUrl('Managing_Content', '#Products_and_Repositories_content-management');
142
+ const documentationUrl = getDocsURL('Managing_Content', 'Products_and_Repositories_content-management');
143
143
 
144
144
  useEffect(() => {
145
145
  dispatch(getRepositoryTypes());
@@ -12,6 +12,7 @@ import ComponentEnvironments from '../Details/ComponentContentViews/ComponentEnv
12
12
  import './cvPublishForm.scss';
13
13
  import WizardHeader from '../components/WizardHeader';
14
14
  import { selectCVNeedsPublish } from '../Details/ContentViewDetailSelectors';
15
+ import { truncate } from '../../../utils/helpers';
15
16
 
16
17
  const CVPublishForm = ({
17
18
  description,
@@ -83,7 +84,7 @@ const CVPublishForm = ({
83
84
  <TextContent>{__('Repositories common to the selected content view versions will merge, resulting in a composite content view that is a union of all content from each of the content view versions.')}</TextContent>
84
85
  </Alert>)
85
86
  }
86
- {__('A new version of ')}<b>{composite ? <RegistryIcon /> : <EnterpriseIcon />} {name}</b>
87
+ {__('A new version of ')}<b>{composite ? <RegistryIcon /> : <EnterpriseIcon />} {truncate(name)}</b>
87
88
  {__(' will be created and automatically promoted to the ' +
88
89
  'Library environment. You can promote to other environments as well. ')
89
90
  }
@@ -16,6 +16,7 @@ import ComponentEnvironments from '../Details/ComponentContentViews/ComponentEnv
16
16
  import { selectEnvironmentPaths, selectEnvironmentPathsStatus } from '../components/EnvironmentPaths/EnvironmentPathSelectors';
17
17
  import WizardHeader from '../components/WizardHeader';
18
18
  import { selectCVFilters, selectCVFiltersStatus } from '../Details/ContentViewDetailSelectors';
19
+ import { truncate } from '../../../utils/helpers';
19
20
 
20
21
  const CVPublishReview = ({
21
22
  details: {
@@ -53,7 +54,7 @@ const CVPublishReview = ({
53
54
  title={__('Review details')}
54
55
  description={
55
56
  <>
56
- {__('Review your currently selected changes for ')}<b>{composite ? <RegistryIcon /> : <EnterpriseIcon />} {name}.</b>
57
+ {__('Review your currently selected changes for ')}<b>{composite ? <RegistryIcon /> : <EnterpriseIcon />} {truncate(name)}.</b>
57
58
  {filtered && (
58
59
  <Alert
59
60
  ouiaId="filters-applied-alert"
@@ -78,7 +79,7 @@ const CVPublishReview = ({
78
79
  <Tbody>
79
80
  <Tr ouiaId="cv-publish-review-table-row">
80
81
  <Td>
81
- <><ContentViewIcon composite={composite} description={name} /><InactiveText text={__('Newly published')} /></>
82
+ <><ContentViewIcon composite={composite} description={truncate(name)} /><InactiveText text={__('Newly published')} /></>
82
83
  </Td>
83
84
  <Td>
84
85
  {__('Version')} {nextVersion}
@@ -15,6 +15,7 @@ import {
15
15
  import { stopPollingTask } from '../../Tasks/TaskActions';
16
16
  import { cvVersionTaskPollingKey } from '../ContentViewsConstants';
17
17
  import { getContentViewFilters } from '../Details/ContentViewDetailActions';
18
+ import { truncate } from '../../../utils/helpers';
18
19
 
19
20
  const PublishContentViewWizard = ({
20
21
  details, show, onClose,
@@ -108,7 +109,7 @@ const PublishContentViewWizard = ({
108
109
  return (
109
110
  <Wizard
110
111
  title={__('Publish')}
111
- description={currentStep === 3 ? __(`Publishing ${name}`) : __(`Determining settings for ${name}`)}
112
+ description={currentStep === 3 ? __(`Publishing ${truncate(name)}`) : __(`Determining settings for ${truncate(name)}`)}
112
113
  steps={steps}
113
114
  startAtStep={currentStep}
114
115
  // Let the wizard handle step change
@@ -24,6 +24,7 @@ import InactiveText from '../components/InactiveText';
24
24
  import ContentViewVersionCell from './ContentViewVersionCell';
25
25
  import DetailsExpansion from '../expansions/DetailsExpansion';
26
26
  import ContentViewDeleteWizard from '../Delete/ContentViewDeleteWizard';
27
+ import { truncate } from '../../../utils/helpers';
27
28
 
28
29
  const ContentViewTable = () => {
29
30
  const response = useSelector(selectContentViews);
@@ -265,7 +266,7 @@ const ContentViewTable = () => {
265
266
  }}
266
267
  />
267
268
  <Td><ContentViewIcon position="right" composite={composite} /></Td>
268
- <Td><Link to={`${urlBuilder('content_views', '')}${cvId}`}>{name}</Link></Td>
269
+ <Td><Link to={`${urlBuilder('content_views', '')}${cvId}`}>{truncate(name)}</Link></Td>
269
270
  <Td>{lastPublished ? <LongDateTime date={lastPublished} showRelativeTimeTooltip /> : <InactiveText text={__('Not yet published')} />}</Td>
270
271
  <Td><LastSync startedAt={startedAt} lastSync={lastTask} lastSyncWords={lastSyncWords} emptyMessage="N/A" /></Td>
271
272
  <Td>{latestVersion ?
@@ -10,6 +10,7 @@ import {
10
10
  selectCVDetails, selectCVDetailStatus, selectCVFilterDetails, selectCVFilterDetailStatus,
11
11
  selectCVVersionDetails, selectCVVersionDetailsStatus,
12
12
  } from '../Details/ContentViewDetailSelectors';
13
+ import { truncate } from '../../../utils/helpers';
13
14
 
14
15
  const CVBreadcrumb = () => {
15
16
  const { id } = useParams();
@@ -47,7 +48,7 @@ const CVBreadcrumb = () => {
47
48
  Object.keys(breadcrumbItems).length === 1) {
48
49
  const cvRecordCrumb = {
49
50
  [`b_${cvDetails?.name}`]: {
50
- render: () => (<Link to={`/content_views/${cvId}`}>{cvDetails?.name}</Link>),
51
+ render: () => (<Link to={`/content_views/${cvId}`}>{truncate(cvDetails?.name)}</Link>),
51
52
  },
52
53
  };
53
54
  const tabName = splitHash[1];
@@ -7,7 +7,7 @@ import {
7
7
  global_palette_black_600 as pfDescriptionColor,
8
8
  } from '@patternfly/react-tokens';
9
9
  import ContentViewIcon from '../../../../scenes/ContentViews/components/ContentViewIcon';
10
- import { uniq } from '../../../../utils/helpers';
10
+ import { truncate, uniq } from '../../../../utils/helpers';
11
11
 
12
12
  export const ContentViewDescription = ({ cv, versionNumber }) => {
13
13
  const descriptionStyle = {
@@ -63,7 +63,7 @@ const ContentViewSelectOption = ({ cv, env, value }) => (
63
63
  flexWrap={{ default: 'nowrap' }}
64
64
  alignItems={{ default: 'alignItemsFlexStart', sm: 'alignItemsFlexStart' }}
65
65
  >
66
- {cv.name}
66
+ {truncate(cv.name)}
67
67
  <ContentViewDescription
68
68
  cv={cv}
69
69
  versionNumber={relevantVersionFromCv(cv, env)}
@@ -15,4 +15,5 @@ export default {
15
15
  type: __('Type'),
16
16
  multi_entitlement: __('Multi-entitlement'),
17
17
  stacking_id: __('Stacking ID'),
18
+ product_host_count: __('Product Host Count'),
18
19
  };
@@ -150,6 +150,16 @@ exports[`subscriptions detail associations page renders correctly 1`] = `
150
150
  SER0421
151
151
  </td>
152
152
  </tr>
153
+ <tr>
154
+ <td>
155
+ <b>
156
+ Product Host Count
157
+ </b>
158
+ </td>
159
+ <td>
160
+
161
+ </td>
162
+ </tr>
153
163
  <tr>
154
164
  <td>
155
165
  <b>
@@ -102,6 +102,11 @@ export const SUBSCRIPTION_TABLE_COLUMNS = [
102
102
  label: __('Entitlements'),
103
103
  value: false,
104
104
  },
105
+ {
106
+ key: 'product_host_count',
107
+ label: __('Product Host Count'),
108
+ value: false,
109
+ },
105
110
  ];
106
111
 
107
112
  export const SUBSCRIPTION_TABLE_DEFAULT_COLUMNS = [
@@ -114,4 +119,5 @@ export const SUBSCRIPTION_TABLE_DEFAULT_COLUMNS = [
114
119
  'consumed',
115
120
  'quantity',
116
121
  'type',
122
+ 'product_host_count',
117
123
  ];
@@ -117,6 +117,7 @@ exports[`subscriptions page should render 1`] = `
117
117
  "instance_multiplier": 1,
118
118
  "multi_entitlement": null,
119
119
  "name": "zoo",
120
+ "product_host_count": 1,
120
121
  "product_id": "853987721546",
121
122
  "product_name": "zoo",
122
123
  "quantity": -1,
@@ -143,6 +144,7 @@ exports[`subscriptions page should render 1`] = `
143
144
  "instance_multiplier": 1,
144
145
  "multi_entitlement": null,
145
146
  "name": "hsdfhsdh",
147
+ "product_host_count": 0,
146
148
  "product_id": "947637693017",
147
149
  "product_name": "hsdfhsdh",
148
150
  "quantity": -1,
@@ -63,6 +63,7 @@ export const requestSuccessResponse = Immutable({
63
63
  unmapped_guest: false,
64
64
  virt_only: false,
65
65
  virt_who: false,
66
+ product_host_count: 1,
66
67
  },
67
68
  {
68
69
  id: 4,
@@ -89,6 +90,7 @@ export const requestSuccessResponse = Immutable({
89
90
  unmapped_guest: false,
90
91
  virt_only: false,
91
92
  virt_who: false,
93
+ product_host_count: 0,
92
94
  },
93
95
  ],
94
96
  });
@@ -110,6 +112,7 @@ export const quantitiesRequestSuccessResponse = Immutable({
110
112
  4,
111
113
  5,
112
114
  ],
115
+ product_host_count: 9469,
113
116
  },
114
117
  {
115
118
  id: '6b123381519abf020151ab082c5e4678',
@@ -125,6 +128,7 @@ export const quantitiesRequestSuccessResponse = Immutable({
125
128
  local_pool_ids: [
126
129
  6,
127
130
  ],
131
+ product_host_count: 9469,
128
132
  },
129
133
  ],
130
134
  page: 1,
@@ -167,6 +171,7 @@ export const groupedSubscriptions = Immutable({
167
171
  unmapped_guest: false,
168
172
  virt_only: false,
169
173
  virt_who: false,
174
+ product_host_count: 1,
170
175
  },
171
176
  {
172
177
  id: 4,
@@ -193,6 +198,7 @@ export const groupedSubscriptions = Immutable({
193
198
  unmapped_guest: false,
194
199
  virt_only: false,
195
200
  virt_who: false,
201
+ product_host_count: 0,
196
202
  },
197
203
  ],
198
204
  searchIsActive: false,
@@ -236,6 +242,7 @@ export const successState = Immutable({
236
242
  unmapped_guest: false,
237
243
  virt_only: false,
238
244
  virt_who: false,
245
+ product_host_count: 1,
239
246
  },
240
247
  {
241
248
  id: 4,
@@ -262,6 +269,7 @@ export const successState = Immutable({
262
269
  unmapped_guest: false,
263
270
  virt_only: false,
264
271
  virt_who: false,
272
+ product_host_count: 0,
265
273
  },
266
274
  ],
267
275
  searchIsActive: false,
@@ -454,6 +462,11 @@ export const tableColumns = [
454
462
  label: 'Entitlements',
455
463
  value: true,
456
464
  },
465
+ {
466
+ key: 'product_host_count',
467
+ label: 'Product Host Count',
468
+ value: true,
469
+ },
457
470
  ];
458
471
 
459
472
  export const loadTableColumnsSuccessAction = [
@@ -470,6 +483,7 @@ export const loadTableColumnsSuccessAction = [
470
483
  'consumed',
471
484
  'quantity',
472
485
  'type',
486
+ 'product_host_count',
473
487
  ],
474
488
  },
475
489
  },
@@ -50,6 +50,7 @@ const buildTableCollapseRow = (subscriptionGroup) => {
50
50
  name: first.name,
51
51
  virt_only: first.virt_only,
52
52
  hypervisor: first.hypervisor,
53
+ product_host_count: 'NA',
53
54
  };
54
55
  return heading;
55
56
  };