katello 4.15.0 → 4.16.0.rc2

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.

Potentially problematic release.


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

Files changed (513) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/katello_object.js +2 -2
  3. data/app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js +9 -8
  4. data/app/assets/javascripts/katello/locale/bn/katello.js +248 -263
  5. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +247 -262
  6. data/app/assets/javascripts/katello/locale/ca/katello.js +247 -262
  7. data/app/assets/javascripts/katello/locale/cs/katello.js +521 -536
  8. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +253 -268
  9. data/app/assets/javascripts/katello/locale/de/katello.js +248 -263
  10. data/app/assets/javascripts/katello/locale/de_AT/katello.js +247 -262
  11. data/app/assets/javascripts/katello/locale/de_DE/katello.js +249 -264
  12. data/app/assets/javascripts/katello/locale/el/katello.js +251 -266
  13. data/app/assets/javascripts/katello/locale/en/katello.js +253 -268
  14. data/app/assets/javascripts/katello/locale/en_GB/katello.js +263 -278
  15. data/app/assets/javascripts/katello/locale/en_US/katello.js +247 -262
  16. data/app/assets/javascripts/katello/locale/es/katello.js +248 -263
  17. data/app/assets/javascripts/katello/locale/et_EE/katello.js +247 -262
  18. data/app/assets/javascripts/katello/locale/fr/katello.js +250 -265
  19. data/app/assets/javascripts/katello/locale/gl/katello.js +247 -262
  20. data/app/assets/javascripts/katello/locale/gu/katello.js +249 -264
  21. data/app/assets/javascripts/katello/locale/he_IL/katello.js +249 -264
  22. data/app/assets/javascripts/katello/locale/hi/katello.js +248 -263
  23. data/app/assets/javascripts/katello/locale/id/katello.js +261 -275
  24. data/app/assets/javascripts/katello/locale/it/katello.js +252 -267
  25. data/app/assets/javascripts/katello/locale/ja/katello.js +250 -265
  26. data/app/assets/javascripts/katello/locale/ka/katello.js +247 -262
  27. data/app/assets/javascripts/katello/locale/kn/katello.js +248 -263
  28. data/app/assets/javascripts/katello/locale/ko/katello.js +248 -263
  29. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +247 -262
  30. data/app/assets/javascripts/katello/locale/mr/katello.js +248 -263
  31. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +252 -267
  32. data/app/assets/javascripts/katello/locale/or/katello.js +248 -263
  33. data/app/assets/javascripts/katello/locale/pa/katello.js +248 -263
  34. data/app/assets/javascripts/katello/locale/pl/katello.js +248 -263
  35. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +247 -262
  36. data/app/assets/javascripts/katello/locale/pt/katello.js +248 -263
  37. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +248 -263
  38. data/app/assets/javascripts/katello/locale/ro/katello.js +247 -262
  39. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +247 -262
  40. data/app/assets/javascripts/katello/locale/ru/katello.js +253 -268
  41. data/app/assets/javascripts/katello/locale/sl/katello.js +247 -262
  42. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +248 -263
  43. data/app/assets/javascripts/katello/locale/ta/katello.js +248 -263
  44. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +247 -262
  45. data/app/assets/javascripts/katello/locale/te/katello.js +248 -263
  46. data/app/assets/javascripts/katello/locale/tr/katello.js +247 -262
  47. data/app/assets/javascripts/katello/locale/vi/katello.js +247 -262
  48. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +247 -262
  49. data/app/assets/javascripts/katello/locale/zh/katello.js +247 -262
  50. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +250 -265
  51. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +255 -270
  52. data/app/assets/javascripts/katello/sync_management/sync_management.js +16 -2
  53. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +46 -10
  54. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -1
  55. data/app/controllers/katello/api/v2/activation_keys_controller.rb +4 -9
  56. data/app/controllers/katello/api/v2/content_uploads_controller.rb +2 -1
  57. data/app/controllers/katello/api/v2/content_view_filter_rules_controller.rb +3 -1
  58. data/app/controllers/katello/api/v2/content_views_controller.rb +4 -1
  59. data/app/controllers/katello/api/v2/environments_controller.rb +4 -0
  60. data/app/controllers/katello/api/v2/errata_controller.rb +12 -1
  61. data/app/controllers/katello/api/v2/flatpak_remote_repositories_controller.rb +81 -0
  62. data/app/controllers/katello/api/v2/flatpak_remotes_controller.rb +86 -0
  63. data/app/controllers/katello/api/v2/host_bootc_images_controller.rb +71 -0
  64. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +4 -6
  65. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +3 -5
  66. data/app/controllers/katello/api/v2/repositories_controller.rb +18 -3
  67. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +0 -8
  68. data/app/controllers/katello/concerns/api/v2/http_proxies_controller_extensions.rb +17 -0
  69. data/app/controllers/katello/concerns/http_proxies_controller_extensions.rb +20 -0
  70. data/app/controllers/katello/sync_management_controller.rb +6 -2
  71. data/app/helpers/katello/content_source_helper.rb +8 -1
  72. data/app/helpers/katello/content_view_helper.rb +3 -1
  73. data/app/lib/actions/candlepin/activation_key/create.rb +1 -3
  74. data/app/lib/actions/candlepin/activation_key/update.rb +1 -3
  75. data/app/lib/actions/candlepin/environment/set_content.rb +17 -4
  76. data/app/lib/actions/katello/activation_key/create.rb +1 -2
  77. data/app/lib/actions/katello/activation_key/update.rb +2 -4
  78. data/app/lib/actions/katello/capsule_content/refresh_repos.rb +7 -1
  79. data/app/lib/actions/katello/content_view/presenters/incremental_updates_presenter.rb +3 -2
  80. data/app/lib/actions/katello/content_view/publish.rb +7 -2
  81. data/app/lib/actions/katello/content_view_environment/reassign_objects.rb +11 -2
  82. data/app/lib/actions/katello/content_view_version/incremental_update.rb +31 -22
  83. data/app/lib/actions/katello/flatpak/mirror_remote_repository.rb +30 -0
  84. data/app/lib/actions/katello/flatpak/scan_remote.rb +17 -12
  85. data/app/lib/actions/katello/host/update_system_purpose.rb +1 -6
  86. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +18 -2
  87. data/app/lib/actions/pulp3/orchestration/repository/multi_copy_all_units.rb +5 -0
  88. data/app/lib/actions/pulp3/repository/multi_copy_units.rb +4 -0
  89. data/app/lib/katello/api/v2/rendering.rb +2 -1
  90. data/app/lib/katello/concerns/base_template_scope_extensions.rb +3 -4
  91. data/app/lib/katello/concerns/bookmark_controller_validator_extensions.rb +13 -0
  92. data/app/lib/katello/resources/candlepin/activation_key.rb +3 -5
  93. data/app/lib/katello/resources/candlepin/product.rb +2 -1
  94. data/app/lib/katello/util/cveak_migrator.rb +3 -2
  95. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +2 -2
  96. data/app/lib/katello/validators/container_image_name_validator.rb +1 -1
  97. data/app/lib/katello/validators/content_validator.rb +1 -1
  98. data/app/lib/katello/validators/content_view_environment_coherent_default_validator.rb +2 -2
  99. data/app/lib/katello/validators/content_view_environment_org_validator.rb +2 -2
  100. data/app/lib/katello/validators/content_view_environment_validator.rb +3 -3
  101. data/app/lib/katello/validators/content_view_erratum_filter_rule_validator.rb +12 -12
  102. data/app/lib/katello/validators/content_view_filter_version_validator.rb +1 -1
  103. data/app/lib/katello/validators/generated_content_view_validator.rb +1 -1
  104. data/app/lib/katello/validators/gpg_key_content_type_validator.rb +2 -2
  105. data/app/lib/katello/validators/gpg_key_content_validator.rb +5 -5
  106. data/app/lib/katello/validators/katello_label_format_validator.rb +4 -4
  107. data/app/lib/katello/validators/katello_name_format_validator.rb +2 -2
  108. data/app/lib/katello/validators/katello_url_format_validator.rb +1 -1
  109. data/app/lib/katello/validators/library_presence_validator.rb +1 -1
  110. data/app/lib/katello/validators/no_trailing_space_validator.rb +1 -1
  111. data/app/lib/katello/validators/non_library_environment_validator.rb +1 -1
  112. data/app/lib/katello/validators/not_in_library_validator.rb +1 -1
  113. data/app/lib/katello/validators/path_descendents_validator.rb +1 -1
  114. data/app/lib/katello/validators/prior_validator.rb +1 -1
  115. data/app/lib/katello/validators/product_unique_attribute_validator.rb +1 -1
  116. data/app/lib/katello/validators/repo_disablement_validator.rb +2 -2
  117. data/app/lib/katello/validators/root_repository_unique_attribute_validator.rb +1 -1
  118. data/app/lib/katello/validators/self_reference_environment_validator.rb +1 -1
  119. data/app/lib/katello/validators/unique_field_in_org.rb +1 -1
  120. data/app/models/katello/activation_key.rb +6 -17
  121. data/app/models/katello/authorization/flatpak_remote.rb +33 -0
  122. data/app/models/katello/concerns/content_facet_host_extensions.rb +2 -1
  123. data/app/models/katello/concerns/host_managed_extensions.rb +8 -5
  124. data/app/models/katello/concerns/http_proxy_extensions.rb +4 -0
  125. data/app/models/katello/concerns/smart_proxy_extensions.rb +30 -6
  126. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +0 -8
  127. data/app/models/katello/content_view.rb +6 -4
  128. data/app/models/katello/content_view_erratum_filter.rb +18 -2
  129. data/app/models/katello/content_view_version.rb +6 -0
  130. data/app/models/katello/docker_manifest.rb +8 -0
  131. data/app/models/katello/docker_manifest_list.rb +8 -0
  132. data/app/models/katello/erratum.rb +8 -2
  133. data/app/models/katello/flatpak_remote.rb +16 -0
  134. data/app/models/katello/flatpak_remote_repository.rb +18 -0
  135. data/app/models/katello/flatpak_remote_repository_manifest.rb +4 -0
  136. data/app/models/katello/glue/candlepin/pool.rb +1 -1
  137. data/app/models/katello/glue/pulp/repos.rb +12 -1
  138. data/app/models/katello/host/content_facet.rb +42 -3
  139. data/app/models/katello/host/subscription_facet.rb +4 -12
  140. data/app/models/katello/repository.rb +22 -8
  141. data/app/models/katello/rhel_lifecycle_status.rb +6 -0
  142. data/app/models/katello/root_repository.rb +6 -8
  143. data/app/models/katello/upstream_pool.rb +1 -0
  144. data/app/overrides/add_organization_attributes.rb +6 -0
  145. data/app/services/katello/product_content_finder.rb +2 -1
  146. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +1 -1
  147. data/app/services/katello/pulp3/docker_manifest.rb +3 -2
  148. data/app/services/katello/pulp3/docker_manifest_list.rb +3 -2
  149. data/app/services/katello/pulp3/repository/ansible_collection.rb +8 -1
  150. data/app/services/katello/pulp3/repository/apt.rb +37 -21
  151. data/app/services/katello/pulp3/repository/file.rb +4 -2
  152. data/app/services/katello/pulp3/repository.rb +4 -0
  153. data/app/services/katello/pulp3/task.rb +2 -2
  154. data/app/views/foreman/job_templates/bootc_action.erb +26 -0
  155. data/app/views/foreman/job_templates/bootc_rollback.erb +13 -0
  156. data/app/views/foreman/job_templates/bootc_status.erb +13 -0
  157. data/app/views/foreman/job_templates/bootc_switch.erb +13 -0
  158. data/app/views/foreman/job_templates/bootc_upgrade.erb +13 -0
  159. data/app/views/foreman/job_templates/flatpak_install.erb +23 -0
  160. data/app/views/foreman/job_templates/flatpak_login_action.erb +30 -0
  161. data/app/views/foreman/job_templates/flatpak_setup.erb +27 -0
  162. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +1 -1
  163. data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +1 -1
  164. data/app/views/foreman/job_templates/resolve_traces_-_katello_ansible_default.erb +1 -1
  165. data/app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  166. data/app/views/katello/api/v2/activation_keys/base.json.rabl +0 -4
  167. data/app/views/katello/api/v2/content_facet/base.json.rabl +2 -1
  168. data/app/views/katello/api/v2/content_facet/show.json.rabl +2 -0
  169. data/app/views/katello/api/v2/content_view_filter_rules/show.json.rabl +1 -0
  170. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +5 -1
  171. data/app/views/katello/api/v2/docker_manifest_lists/show.json.rabl +1 -1
  172. data/app/views/katello/api/v2/docker_manifests/show.json.rabl +1 -1
  173. data/app/views/katello/api/v2/flatpak_remote_repositories/base.json.rabl +4 -0
  174. data/app/views/katello/api/v2/flatpak_remote_repositories/index.json.rabl +7 -0
  175. data/app/views/katello/api/v2/flatpak_remote_repositories/show.json.rabl +13 -0
  176. data/app/views/katello/api/v2/flatpak_remotes/base.json.rabl +5 -0
  177. data/app/views/katello/api/v2/flatpak_remotes/index.json.rabl +8 -0
  178. data/app/views/katello/api/v2/flatpak_remotes/permissions.json.rabl +11 -0
  179. data/app/views/katello/api/v2/flatpak_remotes/show.json.rabl +3 -0
  180. data/app/views/katello/api/v2/hosts/base.json.rabl +0 -8
  181. data/app/views/katello/api/v2/hosts/os_attributes.json.rabl +13 -0
  182. data/app/views/katello/api/v2/http_proxies/show.json.rabl +1 -0
  183. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -0
  184. data/app/views/katello/api/v2/repositories/show.json.rabl +1 -0
  185. data/app/views/katello/api/v2/subscription_facet/base.json.rabl +0 -4
  186. data/app/views/katello/api/v2/subscriptions/show.json.rabl +1 -1
  187. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +2 -1
  188. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +10 -4
  189. data/app/views/overrides/http_proxies/_update_setting_input.html.erb +18 -0
  190. data/app/views/overrides/organizations/_step_1_override.html.erb +5 -0
  191. data/config/initializers/monkeys.rb +0 -1
  192. data/config/initializers/pagelets.rb +6 -0
  193. data/config/routes/api/registry.rb +1 -0
  194. data/config/routes/api/v2.rb +21 -0
  195. data/config/routes/overrides.rb +1 -0
  196. data/config/routes.rb +2 -0
  197. data/db/migrate/20190605014649_add_purpose_addons.rb +0 -12
  198. data/db/migrate/20200213184848_create_evr_type.rb +126 -1
  199. data/db/migrate/20200818192230_update_system_purpose_status.rb +0 -1
  200. data/db/migrate/20240207191223_remove_entitlement_mode_host_statuses.rb +0 -1
  201. data/db/migrate/20240924161240_katello_recreate_evr_constructs.rb +160 -0
  202. data/db/migrate/20241022121706_add_sync_dependencies_option.rb +5 -0
  203. data/db/migrate/20241101144625_remove_system_purpose_addons.rb +9 -0
  204. data/db/migrate/20241107002541_add_registry_url_to_katello_flatpak_remotes.rb +5 -0
  205. data/db/migrate/20241112145802_add_manifest_entity_to_content_facets.rb +7 -0
  206. data/db/migrate/20241120213713_add_allow_other_types_to_content_view_erratum_filter_rules.rb +6 -0
  207. data/db/migrate/20241206183052_add_content_type_to_container_manifests_and_lists.rb +9 -0
  208. data/db/seeds.d/75-job_templates.rb +5 -1
  209. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +2 -2
  210. data/engines/bastion/vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap-tpls.js +3 -3
  211. data/engines/bastion/vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap.js +3 -3
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details-info.controller.js +0 -5
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +1 -41
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-info.html +0 -12
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/new/views/activation-key-new.html +2 -1
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/subscription-add-or-remove.html +1 -1
  217. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-release-version-modal.controller.js +3 -1
  218. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-system-purpose-modal.controller.js +1 -41
  219. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-traces-modal.controller.js +1 -1
  220. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-errata-modal.html +2 -2
  221. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-release-version-modal.html +1 -1
  222. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-subscriptions-modal.html +2 -2
  223. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-system-purpose-modal.html +0 -13
  224. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-errata.html +1 -1
  225. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details-info.controller.js +0 -5
  226. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +1 -35
  227. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -14
  228. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-provisioning-info.html +1 -1
  229. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  230. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.controller.js +46 -22
  231. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb-content-views.controller.js +2 -1
  232. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/views/debs.html +4 -0
  233. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-content-views.html +1 -1
  234. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-details.html +1 -1
  235. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-errata.html +1 -1
  236. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/views/errata-tasks-list.html +2 -1
  237. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +85 -29
  238. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn.po +338 -93
  239. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn_IN.po +340 -95
  240. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ca.po +340 -95
  241. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/cs_CZ.po +341 -96
  242. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +31 -54
  243. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_AT.po +338 -93
  244. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_DE.po +338 -93
  245. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/el.po +341 -96
  246. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_GB.po +349 -104
  247. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_US.po +338 -93
  248. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +33 -56
  249. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/et_EE.po +338 -93
  250. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +80 -68
  251. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gl.po +340 -95
  252. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gu.po +340 -95
  253. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/he_IL.po +339 -111
  254. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/hi.po +340 -95
  255. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/id.po +379 -130
  256. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +342 -103
  257. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +70 -83
  258. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ka.po +84 -90
  259. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/kn.po +340 -95
  260. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +130 -138
  261. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ml_IN.po +338 -93
  262. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/mr.po +340 -95
  263. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/nl_NL.po +343 -97
  264. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/or.po +340 -95
  265. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pa.po +340 -95
  266. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl.po +340 -95
  267. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl_PL.po +338 -93
  268. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt.po +338 -93
  269. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +40 -63
  270. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro.po +338 -93
  271. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro_RO.po +338 -93
  272. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +343 -102
  273. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sl.po +338 -93
  274. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sv_SE.po +340 -95
  275. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta.po +338 -93
  276. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta_IN.po +340 -95
  277. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/te.po +340 -95
  278. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/tr.po +338 -93
  279. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi.po +338 -93
  280. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi_VN.po +338 -93
  281. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh.po +338 -93
  282. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +70 -83
  283. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +362 -105
  284. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +29 -29
  285. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +1 -1
  286. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/products-bulk-advanced-sync-modal.controller.js +1 -1
  287. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/views/products-bulk-sync-plan-modal.html +2 -2
  288. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +24 -8
  289. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-tasks.html +2 -1
  290. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +2 -2
  291. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +21 -8
  292. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/os-versions.service.js +1 -0
  293. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/views/product-info.html +3 -3
  294. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/views/product-tasks.html +2 -1
  295. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +4 -2
  296. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery.html +2 -1
  297. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +3 -3
  298. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/views/partials/product-table-sync-status.html +1 -1
  299. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-start-date.html +1 -1
  300. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/views/sync-plan-info.html +1 -1
  301. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/views/sync-plans.html +2 -2
  302. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/tasks-table.directive.js +2 -1
  303. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/views/task-details.html +2 -2
  304. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/views/tasks-index.html +1 -1
  305. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/views/tasks-table.html +1 -1
  306. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/views/user-tasks-table.html +1 -1
  307. data/lib/katello/engine.rb +6 -0
  308. data/lib/katello/permission_creator.rb +37 -0
  309. data/lib/katello/permissions/host_permissions.rb +2 -0
  310. data/lib/katello/permissions/registry_permissions.rb +1 -0
  311. data/lib/katello/plugin.rb +18 -1
  312. data/lib/katello/repository_types/docker.rb +0 -1
  313. data/lib/katello/repository_types/python.rb +1 -1
  314. data/lib/katello/version.rb +1 -1
  315. data/lib/katello.rb +2 -0
  316. data/locale/Makefile +20 -24
  317. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  318. data/locale/bn/katello.po +248 -263
  319. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  320. data/locale/bn_IN/katello.po +247 -262
  321. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  322. data/locale/ca/katello.po +247 -262
  323. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  324. data/locale/cs/katello.po +524 -799
  325. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  326. data/locale/cs_CZ/katello.po +254 -269
  327. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  328. data/locale/de/katello.po +248 -263
  329. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  330. data/locale/de_AT/katello.po +247 -262
  331. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  332. data/locale/de_DE/katello.po +250 -265
  333. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  334. data/locale/el/katello.po +252 -267
  335. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  336. data/locale/en/katello.po +257 -271
  337. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  338. data/locale/en_GB/katello.po +264 -279
  339. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  340. data/locale/en_US/katello.po +247 -262
  341. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  342. data/locale/es/katello.po +248 -263
  343. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  344. data/locale/et_EE/katello.po +247 -262
  345. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  346. data/locale/fr/katello.po +250 -265
  347. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  348. data/locale/gl/katello.po +247 -262
  349. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  350. data/locale/gu/katello.po +250 -265
  351. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  352. data/locale/he_IL/katello.po +249 -264
  353. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  354. data/locale/hi/katello.po +248 -263
  355. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  356. data/locale/id/katello.po +264 -275
  357. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  358. data/locale/it/katello.po +254 -270
  359. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  360. data/locale/ja/katello.po +250 -265
  361. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  362. data/locale/ka/katello.po +247 -262
  363. data/locale/katello.pot +1216 -1215
  364. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  365. data/locale/kn/katello.po +248 -263
  366. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  367. data/locale/ko/katello.po +248 -263
  368. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  369. data/locale/ml_IN/katello.po +247 -262
  370. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  371. data/locale/mr/katello.po +248 -263
  372. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  373. data/locale/nl_NL/katello.po +254 -268
  374. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  375. data/locale/or/katello.po +248 -263
  376. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  377. data/locale/pa/katello.po +248 -263
  378. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  379. data/locale/pl/katello.po +249 -264
  380. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  381. data/locale/pl_PL/katello.po +247 -262
  382. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  383. data/locale/pt/katello.po +248 -263
  384. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  385. data/locale/pt_BR/katello.po +248 -263
  386. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  387. data/locale/ro/katello.po +247 -262
  388. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  389. data/locale/ro_RO/katello.po +247 -262
  390. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  391. data/locale/ru/katello.po +255 -270
  392. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  393. data/locale/sl/katello.po +247 -262
  394. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  395. data/locale/sv_SE/katello.po +249 -264
  396. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  397. data/locale/ta/katello.po +248 -263
  398. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  399. data/locale/ta_IN/katello.po +247 -262
  400. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  401. data/locale/te/katello.po +248 -263
  402. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  403. data/locale/tr/katello.po +247 -262
  404. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  405. data/locale/vi/katello.po +247 -262
  406. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  407. data/locale/vi_VN/katello.po +247 -262
  408. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  409. data/locale/zh/katello.po +247 -262
  410. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  411. data/locale/zh_CN/katello.po +250 -265
  412. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  413. data/locale/zh_TW/katello.po +257 -272
  414. data/webpack/ForemanColumnExtensions/index.js +71 -3
  415. data/webpack/ForemanColumnExtensions/index.scss +9 -0
  416. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +1 -0
  417. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +14 -8
  418. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +1 -1
  419. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +1 -20
  420. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +3 -61
  421. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeCard.test.js +0 -5
  422. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeEditModal.test.js +0 -5
  423. data/webpack/components/extensions/HostDetails/DetailsTabCards/ImageModeCard.js +87 -0
  424. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +28 -2
  425. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.js +1 -1
  426. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +2 -2
  427. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +1 -1
  428. data/webpack/components/extensions/Hosts/FontAwesomeImageModeIcon.js +55 -0
  429. data/webpack/containers/Application/config.js +5 -0
  430. data/webpack/global_index.js +3 -1
  431. data/webpack/redux/actions/RedHatRepositories/helpers.js +12 -6
  432. data/webpack/scenes/BootedContainerImages/BootedContainerImagesConstants.js +5 -0
  433. data/webpack/scenes/BootedContainerImages/BootedContainerImagesPage.js +244 -0
  434. data/webpack/scenes/BootedContainerImages/__tests__/bootedContainerImages.fixtures.js +42 -0
  435. data/webpack/scenes/BootedContainerImages/__tests__/bootedContainerImagesPage.test.js +233 -0
  436. data/webpack/scenes/BootedContainerImages/index.js +4 -0
  437. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +1 -2
  438. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +39 -7
  439. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +13 -2
  440. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +1 -1
  441. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +1 -0
  442. data/webpack/scenes/ContentViews/Details/Repositories/RepoIcon.js +4 -2
  443. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +1 -2
  444. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +20 -1
  445. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +20 -1
  446. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +128 -18
  447. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedActivationKeys.fixture.json +0 -1
  448. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +1 -2
  449. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -4
  450. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +5 -1
  451. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +6 -1
  452. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +1 -1
  453. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +5 -1
  454. data/webpack/scenes/SmartProxy/ExpandableCvDetails.js +4 -2
  455. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +38 -0
  456. data/webpack/scenes/Subscriptions/Details/SubscriptionPurposeAttributes.js +0 -1
  457. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetailInfo.test.js.snap +0 -10
  458. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +0 -3
  459. data/webpack/scenes/Subscriptions/Details/__tests__/subscriptionDetails.fixtures.js +0 -1
  460. metadata +61 -58
  461. data/app/models/katello/activation_key_purpose_addon.rb +0 -6
  462. data/app/models/katello/purpose_addon.rb +0 -11
  463. data/app/models/katello/subscription_facet_purpose_addon.rb +0 -6
  464. data/lib/monkeys/fx_sqlite_skip.rb +0 -13
  465. data/locale/action_names.rb +0 -181
  466. data/locale/bn/katello.po.time_stamp +0 -0
  467. data/locale/bn_IN/katello.po.time_stamp +0 -0
  468. data/locale/ca/katello.po.time_stamp +0 -0
  469. data/locale/cs/katello.po.time_stamp +0 -0
  470. data/locale/cs_CZ/katello.po.time_stamp +0 -0
  471. data/locale/de/katello.po.time_stamp +0 -0
  472. data/locale/de_AT/katello.po.time_stamp +0 -0
  473. data/locale/de_DE/katello.po.time_stamp +0 -0
  474. data/locale/el/katello.po.time_stamp +0 -0
  475. data/locale/en/katello.po.time_stamp +0 -0
  476. data/locale/en_GB/katello.po.time_stamp +0 -0
  477. data/locale/en_US/katello.po.time_stamp +0 -0
  478. data/locale/es/katello.po.time_stamp +0 -0
  479. data/locale/et_EE/katello.po.time_stamp +0 -0
  480. data/locale/fr/katello.po.time_stamp +0 -0
  481. data/locale/gl/katello.po.time_stamp +0 -0
  482. data/locale/gu/katello.po.time_stamp +0 -0
  483. data/locale/he_IL/katello.po.time_stamp +0 -0
  484. data/locale/hi/katello.po.time_stamp +0 -0
  485. data/locale/id/katello.po.time_stamp +0 -0
  486. data/locale/it/katello.po.time_stamp +0 -0
  487. data/locale/ja/katello.po.time_stamp +0 -0
  488. data/locale/ka/katello.po.time_stamp +0 -0
  489. data/locale/kn/katello.po.time_stamp +0 -0
  490. data/locale/ko/katello.po.time_stamp +0 -0
  491. data/locale/ml_IN/katello.po.time_stamp +0 -0
  492. data/locale/mr/katello.po.time_stamp +0 -0
  493. data/locale/nl_NL/katello.po.time_stamp +0 -0
  494. data/locale/or/katello.po.time_stamp +0 -0
  495. data/locale/pa/katello.po.time_stamp +0 -0
  496. data/locale/pl/katello.po.time_stamp +0 -0
  497. data/locale/pl_PL/katello.po.time_stamp +0 -0
  498. data/locale/pt/katello.po.time_stamp +0 -0
  499. data/locale/pt_BR/katello.po.time_stamp +0 -0
  500. data/locale/ro/katello.po.time_stamp +0 -0
  501. data/locale/ro_RO/katello.po.time_stamp +0 -0
  502. data/locale/ru/katello.po.time_stamp +0 -0
  503. data/locale/sl/katello.po.time_stamp +0 -0
  504. data/locale/sv_SE/katello.po.time_stamp +0 -0
  505. data/locale/ta/katello.po.time_stamp +0 -0
  506. data/locale/ta_IN/katello.po.time_stamp +0 -0
  507. data/locale/te/katello.po.time_stamp +0 -0
  508. data/locale/tr/katello.po.time_stamp +0 -0
  509. data/locale/vi/katello.po.time_stamp +0 -0
  510. data/locale/vi_VN/katello.po.time_stamp +0 -0
  511. data/locale/zh/katello.po.time_stamp +0 -0
  512. data/locale/zh_CN/katello.po.time_stamp +0 -0
  513. data/locale/zh_TW/katello.po.time_stamp +0 -0
@@ -7,13 +7,76 @@ import {
7
7
  PackageIcon,
8
8
  } from '@patternfly/react-icons';
9
9
  import { Link } from 'react-router-dom';
10
- import { Flex, FlexItem, Popover, Badge } from '@patternfly/react-core';
10
+ import {
11
+ Flex,
12
+ FlexItem,
13
+ Popover,
14
+ Badge,
15
+ DescriptionList,
16
+ DescriptionListGroup,
17
+ DescriptionListDescription as Dd,
18
+ DescriptionListTerm as Dt,
19
+ Text,
20
+ TextVariants,
21
+ } from '@patternfly/react-core';
11
22
  import { translate as __ } from 'foremanReact/common/I18n';
12
23
  import RelativeDateTime from 'foremanReact/components/common/dates/RelativeDateTime';
13
24
  import { ContentViewEnvironmentDisplay } from '../components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard';
14
25
  import { truncate } from '../utils/helpers';
26
+ import RepoIcon from '../scenes/ContentViews/Details/Repositories/RepoIcon';
27
+ import FontAwesomeImageModeIcon from '../components/extensions/Hosts/FontAwesomeImageModeIcon';
28
+ import './index.scss';
15
29
 
16
30
  const hostsIndexColumnExtensions = [
31
+ {
32
+ columnName: 'bootc_booted_image',
33
+ title: (
34
+ <Text title={__('Image mode / package mode')} ouiaId="image-mode-column-title" className="pf-c-table__text">{__('Type')}</Text>
35
+ ),
36
+ wrapper: (hostDetails) => {
37
+ const imageMode = hostDetails?.content_facet_attributes?.bootc_booted_image;
38
+ const digest = hostDetails?.content_facet_attributes?.bootc_booted_digest;
39
+ return (
40
+ <span className={imageMode ? 'image-mode-column-td-icon' : 'package-mode-column-td-icon'}>
41
+ {imageMode ?
42
+ <Popover
43
+ id="image-mode-tooltip"
44
+ className="image-mode-tooltip"
45
+ maxWidth="74rem"
46
+ headerContent={hostDetails.display_name}
47
+ bodyContent={
48
+ <Flex direction={{ default: 'column' }}>
49
+ <FlexItem>
50
+ <Flex direction={{ default: 'row' }} alignItems={{ default: 'alignItemsCenter' }}>
51
+ <FlexItem>
52
+ <FontAwesomeImageModeIcon />
53
+ </FlexItem>
54
+ <Text ouiaId="image-mode-popover-h4" component={TextVariants.h4}>{__('Image-mode host')}</Text>
55
+ </Flex>
56
+ </FlexItem>
57
+ <DescriptionList isCompact isHorizontal>
58
+ <DescriptionListGroup>
59
+ <Dt>{__('Running image')}</Dt>
60
+ <Dd>{hostDetails.content_facet_attributes.bootc_booted_image}</Dd>
61
+ </DescriptionListGroup>
62
+ <DescriptionListGroup>
63
+ <Dt>{__('Digest')}</Dt>
64
+ <Dd>{digest}</Dd>
65
+ </DescriptionListGroup>
66
+ </DescriptionList>
67
+ </Flex>
68
+ }
69
+ >
70
+ <FontAwesomeImageModeIcon title={__('Image mode')} />
71
+ </Popover>
72
+ : <span style={{ color: 'var(--pf-global--palette--black-600)' }}><RepoIcon type="yum" customTooltip={__('Package mode')} /></span>
73
+ }
74
+ </span>
75
+ );
76
+ },
77
+ weight: 35, // between power status (0) and name (50)
78
+ isSorted: true,
79
+ },
17
80
  {
18
81
  columnName: 'rhel_lifecycle_status',
19
82
  title: __('RHEL Lifecycle status'),
@@ -32,6 +95,7 @@ const hostsIndexColumnExtensions = [
32
95
  const registered = !!hostDetails?.subscription_facet_attributes?.uuid;
33
96
  const { security, bugfix, enhancement } = errataCounts ?? {};
34
97
  const upgradableRpmCount = hostDetails?.content_facet_attributes?.upgradable_package_count;
98
+ const upgradableDebCount = hostDetails?.content_facet_attributes?.upgradable_deb_count;
35
99
  if (!registered) return '—';
36
100
  const hostErrataUrl = type => `hosts/${hostDetails?.name}#/Content/errata?type=${type}&show=installable`;
37
101
  return (
@@ -54,10 +118,14 @@ const hostsIndexColumnExtensions = [
54
118
  <Link to={hostErrataUrl('enhancement')}>{enhancement}</Link>
55
119
  </FlexItem>
56
120
  }
57
- {upgradableRpmCount !== undefined &&
121
+ {(upgradableRpmCount !== undefined || upgradableDebCount !== undefined) &&
58
122
  <FlexItem>
59
123
  <PackageIcon />
60
- <Link to={`hosts/${hostDetails?.name}#/Content/Packages?status=Upgradable`}>{upgradableRpmCount}</Link>
124
+ { hostDetails?.operatingsystem_family === 'Debian' ?
125
+ <Link to={`hosts/${hostDetails?.name}#/Content/Debs?status=Upgradable`}>{upgradableDebCount}</Link>
126
+ :
127
+ <Link to={`hosts/${hostDetails?.name}#/Content/Packages?status=Upgradable`}>{upgradableRpmCount}</Link>
128
+ }
61
129
  </FlexItem>
62
130
  }
63
131
  </Flex>
@@ -0,0 +1,9 @@
1
+ #image-mode-column-title-icon {
2
+ padding: 5px;
3
+ }
4
+ .image-mode-column-td-icon {
5
+ padding: 6px;
6
+ }
7
+ .package-mode-column-td-icon {
8
+ padding: 4px;
9
+ }
@@ -1,3 +1,4 @@
1
1
  // eslint-disable-next-line import/prefer-default-export
2
2
  export const useForemanSettings = () => ({ perPage: 20 });
3
3
  export const useForemanVersion = () => 'nightly';
4
+ export const useForemanHostsPageUrl = () => '/new/hosts';
@@ -22,6 +22,9 @@ const HostActionsBar = () => {
22
22
  const recalculateApplicability = ['edit_hosts', 'create_job_invocations'];
23
23
  const showRecalculate =
24
24
  can(recalculateApplicability, userPermissionsFromHostDetails({ hostDetails }));
25
+ const changeContentSource = ['view_smart_proxies', 'view_capsule_content'];
26
+ const showChangeContentSource =
27
+ can(changeContentSource, userPermissionsFromHostDetails({ hostDetails }));
25
28
 
26
29
  const refreshHostDetails = () => dispatch({
27
30
  type: 'API_GET',
@@ -62,14 +65,17 @@ const HostActionsBar = () => {
62
65
  </DropdownItem>
63
66
  )
64
67
  }
65
- <DropdownItem
66
- ouiaId="katello-change-host-content-source"
67
- key="katello-change-host-content-source"
68
- href={foremanUrl(`/change_host_content_source?host_id=${hostDetails?.id}&initialContentSourceId=${hostDetails?.content_facet_attributes?.content_source_id}`)}
69
- icon={<CubeIcon />}
70
- >
71
- {__('Change content source')}
72
- </DropdownItem>
68
+ {showChangeContentSource && (
69
+ <DropdownItem
70
+ ouiaId="katello-change-host-content-source"
71
+ key="katello-change-host-content-source"
72
+ href={foremanUrl(`/change_host_content_source?host_id=${hostDetails?.id}&initialContentSourceId=${hostDetails?.content_facet_attributes?.content_source_id}`)}
73
+ icon={<CubeIcon />}
74
+ >
75
+ {__('Change content source')}
76
+ </DropdownItem>
77
+ )
78
+ }
73
79
  </>
74
80
  );
75
81
  };
@@ -130,7 +130,7 @@ const ErrataOverviewCard = ({ hostDetails }) => {
130
130
  <ErrataToggleGroupItem
131
131
  text={__('Installable')}
132
132
  aria-label="Show installable errata chart"
133
- tooltipText={__('Installable errata are applicable errata that are available in the host\'s content view and lifecycle environment.')}
133
+ tooltipText={__('Installable errata are applicable errata that are available in the host\'s assigned content view environments.')}
134
134
  isSelected={errataCategory === 'installable'}
135
135
  onChange={selected => selected && setErrataCategory('installable')}
136
136
  />
@@ -17,8 +17,6 @@ import {
17
17
  FlexItem,
18
18
  GridItem,
19
19
  Label,
20
- List,
21
- ListItem,
22
20
  Tooltip,
23
21
  Skeleton,
24
22
  CardExpandableContent,
@@ -41,12 +39,11 @@ const SystemPurposeCard = ({ hostDetails, akDetails }) => {
41
39
  const { organization_id: orgId, name } = details;
42
40
  const subscriptionFacetAttributes = details?.subscription_facet_attributes;
43
41
  const {
44
- purposeRole, purposeUsage, purposeAddons, releaseVersion, serviceLevel,
42
+ purposeRole, purposeUsage, releaseVersion, serviceLevel,
45
43
  } = propsToCamelCase((subscriptionFacetAttributes || details) ?? {});
46
44
  const sysPurposeProps = {
47
45
  purposeRole,
48
46
  purposeUsage,
49
- purposeAddons,
50
47
  releaseVersion,
51
48
  serviceLevel,
52
49
  };
@@ -142,21 +139,6 @@ const SystemPurposeCard = ({ hostDetails, akDetails }) => {
142
139
  <Dd>
143
140
  {dataIsLoading ? <Skeleton /> : releaseVersion}
144
141
  </Dd>
145
- {!!purposeAddons?.length && (
146
- <>
147
- <Dt>{__('Add-ons')}</Dt>
148
- {dataIsLoading ? <Skeleton /> : (
149
- <Dd>
150
- <List isPlain>
151
- {purposeAddons.map(addon => (
152
- <ListItem key={addon}>{addon}</ListItem>
153
- ))}
154
- </List>
155
- </Dd>
156
- )}
157
- </>
158
- )
159
- }
160
142
  </DescriptionListGroup>
161
143
  </DescriptionList>
162
144
  {showEditButton && (
@@ -201,7 +183,6 @@ SystemPurposeCard.propTypes = {
201
183
  purpose_role: PropTypes.string,
202
184
  release_version: PropTypes.string,
203
185
  service_level: PropTypes.string,
204
- purpose_addons: PropTypes.arrayOf(PropTypes.string),
205
186
  permissions: PropTypes.shape({
206
187
  edit_activation_keys: PropTypes.bool,
207
188
  }),
@@ -1,6 +1,5 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import { useSelector, useDispatch } from 'react-redux';
3
- import { isEqual } from 'lodash';
4
3
  import PropTypes from 'prop-types';
5
4
  import { STATUS } from 'foremanReact/constants';
6
5
  import { propsToCamelCase } from 'foremanReact/common/helpers';
@@ -11,9 +10,6 @@ import {
11
10
  FormGroup,
12
11
  FormSelect,
13
12
  FormSelectOption,
14
- Select,
15
- SelectOption,
16
- SelectVariant,
17
13
  } from '@patternfly/react-core';
18
14
  import { FormattedMessage } from 'react-intl';
19
15
  import { translate as __ } from 'foremanReact/common/I18n';
@@ -29,27 +25,23 @@ import { defaultUsages, defaultRoles, defaultServiceLevels } from './SystemPurpo
29
25
  import { getActivationKey } from '../../../../../scenes/ActivationKeys/Details/ActivationKeyActions';
30
26
 
31
27
  const SystemPurposeEditModal = ({
32
- closeModal, name, purposeRole, purposeUsage, purposeAddons,
28
+ closeModal, name, purposeRole, purposeUsage,
33
29
  serviceLevel, releaseVersion, isOpen, orgId, id, type,
34
30
  }) => {
35
31
  const initialPurposeRole = purposeRole ?? '';
36
32
  const initialServiceLevel = serviceLevel ?? '';
37
33
  const initialPurposeUsage = purposeUsage ?? '';
38
34
  const initialReleaseVersion = releaseVersion ?? '';
39
- const initialPurposeAddons = purposeAddons ?? [];
40
35
  const [selectedRole, setSelectedRole] = useState(initialPurposeRole);
41
36
  const [selectedServiceLevel, setSelectedServiceLevel] = useState(initialServiceLevel);
42
37
  const [selectedUsage, setSelectedUsage] = useState(initialPurposeUsage);
43
- const [addonSelectOpen, setAddonSelectOpen] = useState(false);
44
- const [selectedAddons, setSelectedAddons] = useState(initialPurposeAddons);
45
38
  const [selectedReleaseVersion, setSelectedReleaseVersion] = useState(initialReleaseVersion);
46
39
 
47
40
  const unmodified = (
48
41
  selectedRole === initialPurposeRole &&
49
42
  selectedServiceLevel === initialServiceLevel &&
50
43
  selectedUsage === initialPurposeUsage &&
51
- selectedReleaseVersion === initialReleaseVersion &&
52
- isEqual(selectedAddons, initialPurposeAddons)
44
+ selectedReleaseVersion === initialReleaseVersion
53
45
  );
54
46
  const dispatch = useDispatch();
55
47
 
@@ -58,7 +50,7 @@ const SystemPurposeEditModal = ({
58
50
  const orgDetails = propsToCamelCase(organizationDetails ?? { systemPurposes: {} });
59
51
  const availableSyspurposeAttributes = orgDetails?.systemPurposes ?? {};
60
52
  const availableServiceLevels = orgDetails?.serviceLevels ?? [];
61
- const { addons: availableAddons, roles: availableRoles, usage: availableUsages }
53
+ const { roles: availableRoles, usage: availableUsages }
62
54
  = availableSyspurposeAttributes;
63
55
  const selectorAPIKey = type === 'host' ? 'AVAILABLE_RELEASE_VERSIONS' : 'RELEASES';
64
56
 
@@ -79,19 +71,6 @@ const SystemPurposeEditModal = ({
79
71
  }
80
72
  }, [type, id, availableReleaseVersionsStatus, actionToDispatch, dispatch]);
81
73
 
82
- const toggleAddonSelect = isOpenState => setAddonSelectOpen(isOpenState);
83
-
84
- const onAddonSelect = (_event, selected) => {
85
- const newSelectedAddons = new Set(selectedAddons);
86
- if (!selected) return;
87
- if (newSelectedAddons.has(selected)) {
88
- newSelectedAddons.delete(selected);
89
- } else {
90
- newSelectedAddons.add(selected);
91
- }
92
- setSelectedAddons([...newSelectedAddons]);
93
- };
94
-
95
74
  const refreshHostDetails = () => dispatch({
96
75
  type: 'API_GET',
97
76
  payload: {
@@ -122,14 +101,6 @@ const SystemPurposeEditModal = ({
122
101
  const usageOptions =
123
102
  buildOptions(defaultUsages, availableUsages, selectedUsage, purposeUsage);
124
103
 
125
- // addons may be present on the host but not available from subscriptions,
126
- // so we combine the options here
127
- const addonToObject = addon => ({ label: addon, value: addon });
128
- const addonsOptions =
129
- [...new Set([ // don't repeat addons if they are already selected
130
- ...purposeAddons.map(addonToObject), ...availableAddons?.map(addonToObject) ?? [],
131
- ])];
132
-
133
104
  const serviceLevelOptions =
134
105
  buildOptions(defaultServiceLevels, availableServiceLevels, selectedServiceLevel, serviceLevel);
135
106
 
@@ -148,7 +119,6 @@ const SystemPurposeEditModal = ({
148
119
  autoheal: true,
149
120
  purpose_role: optionsToValue(roleOptions, selectedRole),
150
121
  purpose_usage: optionsToValue(usageOptions, selectedUsage),
151
- purpose_addons: selectedAddons,
152
122
  release_version: optionsToValue(releaseVersionOptions, selectedReleaseVersion),
153
123
  service_level: optionsToValue(serviceLevelOptions, selectedServiceLevel),
154
124
  },
@@ -161,7 +131,6 @@ const SystemPurposeEditModal = ({
161
131
  autoheal: true,
162
132
  purpose_role: optionsToValue(roleOptions, selectedRole),
163
133
  purpose_usage: optionsToValue(usageOptions, selectedUsage),
164
- purpose_addons: selectedAddons,
165
134
  release_version: optionsToValue(releaseVersionOptions, selectedReleaseVersion),
166
135
  service_level: optionsToValue(serviceLevelOptions, selectedServiceLevel),
167
136
  },
@@ -174,7 +143,6 @@ const SystemPurposeEditModal = ({
174
143
  setSelectedRole(initialPurposeRole);
175
144
  setSelectedServiceLevel(initialServiceLevel);
176
145
  setSelectedUsage(initialPurposeUsage);
177
- setSelectedAddons(initialPurposeAddons);
178
146
  setSelectedReleaseVersion(initialReleaseVersion);
179
147
  closeModal();
180
148
  };
@@ -277,31 +245,6 @@ const SystemPurposeEditModal = ({
277
245
  ))}
278
246
  </FormSelect>
279
247
  </FormGroup>
280
- <FormGroup label={__('Add-ons')} fieldId="addons">
281
- <span id="syspurpose-addons-title" hidden>
282
- Checkbox Title
283
- </span>
284
- <Select
285
- variant={SelectVariant.typeaheadMulti}
286
- aria-label="syspurpose-addons"
287
- ouiaId="syspurpose-addons-select"
288
- onToggle={toggleAddonSelect}
289
- onSelect={onAddonSelect}
290
- selections={selectedAddons}
291
- isOpen={addonSelectOpen}
292
- placeholderText={__('Select add-ons')}
293
- aria-labelledby="syspurpose-addons-title"
294
- menuAppendTo="parent"
295
- >
296
- {addonsOptions.map(option => (
297
- <SelectOption
298
- key={option.value}
299
- value={option.value}
300
- label={option.label}
301
- />
302
- ))}
303
- </Select>
304
- </FormGroup>
305
248
  </Form>
306
249
  </Modal>
307
250
  );
@@ -314,7 +257,6 @@ SystemPurposeEditModal.propTypes = {
314
257
  name: PropTypes.string,
315
258
  purposeRole: PropTypes.string.isRequired,
316
259
  purposeUsage: PropTypes.string.isRequired,
317
- purposeAddons: PropTypes.arrayOf(PropTypes.string).isRequired,
318
260
  serviceLevel: PropTypes.string.isRequired,
319
261
  releaseVersion: PropTypes.string,
320
262
  isOpen: PropTypes.bool.isRequired,
@@ -16,7 +16,6 @@ const baseHostDetails = {
16
16
  edit_hosts: true,
17
17
  },
18
18
  subscription_facet_attributes: {
19
- purpose_addons: ['Addon1', 'Addon2'],
20
19
  purpose_role: 'Red Hat Enterprise Linux Server',
21
20
  purpose_usage: 'Production',
22
21
  service_level: 'Premium',
@@ -61,8 +60,6 @@ test('shows system purpose details for a host', async (done) => {
61
60
  expect(getByText('Red Hat Enterprise Linux Server')).toBeInTheDocument();
62
61
  expect(getByText('Production')).toBeInTheDocument();
63
62
  expect(getByText('Premium')).toBeInTheDocument();
64
- expect(getByText('Addon1')).toBeInTheDocument();
65
- expect(getByText('Addon2')).toBeInTheDocument();
66
63
  expect(getByText('8')).toBeInTheDocument();
67
64
 
68
65
  assertNockRequest(orgScope);
@@ -77,8 +74,6 @@ test('shows system purpose details for an activation key', () => {
77
74
  expect(getByText('Red Hat Enterprise Linux Server')).toBeInTheDocument();
78
75
  expect(getByText('Production')).toBeInTheDocument();
79
76
  expect(getByText('Premium')).toBeInTheDocument();
80
- expect(getByText('Addon1')).toBeInTheDocument();
81
- expect(getByText('Addon2')).toBeInTheDocument();
82
77
  expect(getByText('8')).toBeInTheDocument();
83
78
  });
84
79
 
@@ -22,7 +22,6 @@ const baseHostDetails = {
22
22
  edit_hosts: true,
23
23
  },
24
24
  subscription_facet_attributes: {
25
- purpose_addons: ['Addon1', 'Addon2'],
26
25
  purpose_role: 'Red Hat Enterprise Linux Server',
27
26
  purpose_usage: 'Production',
28
27
  service_level: 'Premium',
@@ -85,8 +84,6 @@ describe('SystemPurposeEditModal', () => {
85
84
  expect(getByText('Red Hat Enterprise Linux Server')).toBeInTheDocument();
86
85
  expect(getByText('Production')).toBeInTheDocument();
87
86
  expect(getByText('Premium')).toBeInTheDocument();
88
- expect(getByText('Addon1')).toBeInTheDocument();
89
- expect(getByText('Addon2')).toBeInTheDocument();
90
87
  expect(getByText('8')).toBeInTheDocument();
91
88
 
92
89
  assertNockRequest(orgScope);
@@ -136,7 +133,6 @@ describe('SystemPurposeEditModal', () => {
136
133
  // we're going to change role from 'Server' to 'Workstation'
137
134
  purpose_role: 'Red Hat Enterprise Linux Workstation',
138
135
  purpose_usage: 'Production',
139
- purpose_addons: ['Addon1', 'Addon2'],
140
136
  release_version: '8',
141
137
  service_level: 'Premium',
142
138
  },
@@ -191,7 +187,6 @@ describe('SystemPurposeEditModal', () => {
191
187
  autoheal: true,
192
188
  purpose_role: 'Red Hat Enterprise Linux Workstation',
193
189
  purpose_usage: 'Production',
194
- purpose_addons: ['Addon1', 'Addon2'],
195
190
  release_version: '8',
196
191
  service_level: 'Premium',
197
192
  },
@@ -0,0 +1,87 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import {
5
+ DescriptionList,
6
+ DescriptionListGroup,
7
+ DescriptionListDescription as Dd,
8
+ DescriptionListTerm as Dt,
9
+ } from '@patternfly/react-core';
10
+ import CardTemplate from 'foremanReact/components/HostDetails/Templates/CardItem/CardTemplate';
11
+ import FontAwesomeImageModeIcon from '../../../../components/extensions/Hosts/FontAwesomeImageModeIcon';
12
+ import { createJob } from '../Tabs/customizedRexUrlHelpers';
13
+
14
+ const cardHeader = (
15
+ <>
16
+ <span style={{ marginRight: '0.5rem' }}>{__('Image mode details')}</span>
17
+ <FontAwesomeImageModeIcon />
18
+ </>
19
+ );
20
+ const actionUrl = hostname => createJob({
21
+ hostname,
22
+ feature: 'katello_bootc_action',
23
+ inputs: {},
24
+ });
25
+
26
+ const ImageModeCard = ({ isExpandedGlobal, hostDetails }) => {
27
+ const imageMode = hostDetails?.content_facet_attributes?.bootc_booted_image;
28
+ if (!imageMode) return null;
29
+ const getValueOrDash = value => (value || '—');
30
+ return (
31
+ <CardTemplate
32
+ header={cardHeader}
33
+ expandable
34
+ masonryLayout
35
+ isExpandedGlobal={isExpandedGlobal}
36
+ >
37
+ <a href={actionUrl(hostDetails.name)}>{__('Modify via remote execution')}</a>
38
+ <DescriptionList isHorizontal>
39
+ <DescriptionListGroup>
40
+ <Dt>{__('Running image')}</Dt>
41
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_booted_image)}</Dd>
42
+ <Dt>{__('Running image digest')}</Dt>
43
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_booted_digest)}</Dd>
44
+
45
+ <Dt>{__('Staged image')}</Dt>
46
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_staged_image)}</Dd>
47
+ <Dt>{__('Staged image digest')}</Dt>
48
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_staged_digest)}</Dd>
49
+
50
+ <Dt>{__('Available image')}</Dt>
51
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_available_image)}</Dd>
52
+ <Dt>{__('Available image digest')}</Dt>
53
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_available_digest)}</Dd>
54
+
55
+ <Dt>{__('Rollback image')}</Dt>
56
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_rollback_image)}</Dd>
57
+ <Dt>{__('Rollback image digest')}</Dt>
58
+ <Dd>{getValueOrDash(hostDetails.content_facet_attributes.bootc_rollback_digest)}</Dd>
59
+ </DescriptionListGroup>
60
+ </DescriptionList>
61
+ </CardTemplate>
62
+ );
63
+ };
64
+
65
+ ImageModeCard.propTypes = {
66
+ isExpandedGlobal: PropTypes.bool,
67
+ hostDetails: PropTypes.shape({
68
+ name: PropTypes.string,
69
+ content_facet_attributes: PropTypes.shape({
70
+ bootc_booted_image: PropTypes.string,
71
+ bootc_booted_digest: PropTypes.string,
72
+ bootc_staged_image: PropTypes.string,
73
+ bootc_staged_digest: PropTypes.string,
74
+ bootc_available_image: PropTypes.string,
75
+ bootc_available_digest: PropTypes.string,
76
+ bootc_rollback_image: PropTypes.string,
77
+ bootc_rollback_digest: PropTypes.string,
78
+ }),
79
+ }),
80
+ };
81
+
82
+ ImageModeCard.defaultProps = {
83
+ isExpandedGlobal: false,
84
+ hostDetails: {},
85
+ };
86
+
87
+ export default ImageModeCard;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
+ import { FormattedMessage } from 'react-intl';
3
4
  import { translate as __ } from 'foremanReact/common/I18n';
4
5
  import {
5
6
  DescriptionList,
@@ -55,12 +56,14 @@ const RegistrationCard = ({ isExpandedGlobal, hostDetails }) => {
55
56
  const subscriptionFacetAttributes
56
57
  = propsToCamelCase(hostDetails?.subscription_facet_attributes || {});
57
58
  const {
58
- registeredAt, activationKeys, user,
59
+ registeredAt, registeredThrough, activationKeys, user,
59
60
  }
60
61
  = subscriptionFacetAttributes;
61
62
  const contentFacetAttributes
62
63
  = propsToCamelCase(hostDetails?.content_facet_attributes || {});
63
64
  const { contentSourceName } = contentFacetAttributes;
65
+ const { contentSource } = propsToCamelCase(contentFacetAttributes || {});
66
+ const { loadBalanced, registrationHost } = propsToCamelCase(contentSource || {});
64
67
  const login = user?.login;
65
68
  if (!registeredAt) return null;
66
69
  return (
@@ -79,9 +82,32 @@ const RegistrationCard = ({ isExpandedGlobal, hostDetails }) => {
79
82
  <DescriptionListTerm>{__('Registered by')}</DescriptionListTerm>
80
83
  <RegisteredBy user={login} activationKeys={activationKeys} />
81
84
  </DescriptionListGroup>
85
+ <DescriptionListGroup>
86
+ <DescriptionListTerm>{__('Registered to')}</DescriptionListTerm>
87
+ <DescriptionListDescription>{registeredThrough}</DescriptionListDescription>
88
+ </DescriptionListGroup>
89
+ {loadBalanced && (
90
+ <DescriptionListGroup>
91
+ <DescriptionListTerm>{__('Load balancer')}</DescriptionListTerm>
92
+ <DescriptionListDescription>{registrationHost}</DescriptionListDescription>
93
+ </DescriptionListGroup>
94
+ )}
82
95
  <DescriptionListGroup>
83
96
  <DescriptionListTerm>{__('Content source')}</DescriptionListTerm>
84
- <DescriptionListDescription>{contentSourceName}</DescriptionListDescription>
97
+ {!loadBalanced && (
98
+ <DescriptionListDescription>{contentSourceName}</DescriptionListDescription>
99
+ )}
100
+ {loadBalanced && (
101
+ <DescriptionListDescription>
102
+ <FormattedMessage
103
+ id="load-balancer-content-source-text"
104
+ defaultMessage={__('Content may come from {contentSourceName} or any other Smart Proxy behind the load balancer.')}
105
+ values={{
106
+ contentSourceName: <strong>{contentSourceName}</strong>,
107
+ }}
108
+ />
109
+ </DescriptionListDescription>
110
+ )}
85
111
  </DescriptionListGroup>
86
112
  </DescriptionList>
87
113
  </CardTemplate>
@@ -87,7 +87,7 @@ const DebInstallModal = ({
87
87
  isOpen, closeModal, hostId, hostName, triggerPackageInstall,
88
88
  }) => {
89
89
  const emptyContentTitle = __('No packages available to install');
90
- const emptyContentBody = __('No packages available to install on this host. Please check the host\'s content view and lifecycle environment.');
90
+ const emptyContentBody = __('No packages available to install on this host. Please check the host\'s assigned content view environments.');
91
91
  const emptySearchTitle = __('No matching packages found');
92
92
  const emptySearchBody = __('Try changing your search settings.');
93
93
  const columnHeaders = ['', __('Package'), __('Version')];
@@ -427,7 +427,7 @@ export const ErrataTab = () => {
427
427
  />
428
428
  <ErrataToggleGroupItem
429
429
  text={__('Installable')}
430
- tooltipText={__('Installable errata are applicable errata that are available in the host\'s content view and lifecycle environment.')}
430
+ tooltipText={__('Installable errata are applicable errata that are available in the host\'s assigned content view environments.')}
431
431
  buttonId="installableToggle"
432
432
  aria-label="Show installable errata"
433
433
  isSelected={toggleGroupState === INSTALLABLE}
@@ -557,7 +557,7 @@ export const ErrataTab = () => {
557
557
  <span>
558
558
  <Tooltip
559
559
  content={
560
- __("This erratum is not installable because it is not in this host's content view and lifecycle environment.")
560
+ __("This erratum is not installable because it is not in this host's assigned content view environments.")
561
561
  }
562
562
  >
563
563
 
@@ -87,7 +87,7 @@ const PackageInstallModal = ({
87
87
  isOpen, closeModal, hostId, hostName, triggerPackageInstall,
88
88
  }) => {
89
89
  const emptyContentTitle = __('No packages available to install');
90
- const emptyContentBody = __('No packages available to install on this host. Please check the host\'s content view and lifecycle environment.');
90
+ const emptyContentBody = __('No packages available to install on this host. Please check the host\'s assigned content view environments.');
91
91
  const emptySearchTitle = __('No matching packages found');
92
92
  const emptySearchBody = __('Try changing your search settings.');
93
93
  const columnHeaders = ['', __('Package'), __('Version')];