katello 4.11.1 → 4.12.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 (349) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/katello.global.js +1 -1
  3. data/app/assets/javascripts/katello/locale/bn/katello.js +76 -85
  4. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +76 -85
  5. data/app/assets/javascripts/katello/locale/ca/katello.js +80 -86
  6. data/app/assets/javascripts/katello/locale/cs/katello.js +79 -85
  7. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +91 -88
  8. data/app/assets/javascripts/katello/locale/de/katello.js +97 -94
  9. data/app/assets/javascripts/katello/locale/de_AT/katello.js +76 -85
  10. data/app/assets/javascripts/katello/locale/de_DE/katello.js +76 -85
  11. data/app/assets/javascripts/katello/locale/el/katello.js +86 -86
  12. data/app/assets/javascripts/katello/locale/en/katello.js +76 -85
  13. data/app/assets/javascripts/katello/locale/en_GB/katello.js +88 -85
  14. data/app/assets/javascripts/katello/locale/en_US/katello.js +76 -85
  15. data/app/assets/javascripts/katello/locale/es/katello.js +94 -94
  16. data/app/assets/javascripts/katello/locale/et_EE/katello.js +76 -85
  17. data/app/assets/javascripts/katello/locale/fr/katello.js +97 -94
  18. data/app/assets/javascripts/katello/locale/gl/katello.js +80 -86
  19. data/app/assets/javascripts/katello/locale/gu/katello.js +76 -85
  20. data/app/assets/javascripts/katello/locale/he_IL/katello.js +76 -85
  21. data/app/assets/javascripts/katello/locale/hi/katello.js +76 -85
  22. data/app/assets/javascripts/katello/locale/id/katello.js +76 -85
  23. data/app/assets/javascripts/katello/locale/it/katello.js +89 -86
  24. data/app/assets/javascripts/katello/locale/ja/katello.js +97 -94
  25. data/app/assets/javascripts/katello/locale/ka/katello.js +92 -92
  26. data/app/assets/javascripts/katello/locale/kn/katello.js +76 -85
  27. data/app/assets/javascripts/katello/locale/ko/katello.js +91 -94
  28. data/app/assets/javascripts/katello/locale/locale/katello.js +1051 -1048
  29. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +76 -85
  30. data/app/assets/javascripts/katello/locale/mr/katello.js +76 -85
  31. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +76 -85
  32. data/app/assets/javascripts/katello/locale/or/katello.js +76 -85
  33. data/app/assets/javascripts/katello/locale/pa/katello.js +76 -85
  34. data/app/assets/javascripts/katello/locale/pl/katello.js +76 -85
  35. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +76 -85
  36. data/app/assets/javascripts/katello/locale/pt/katello.js +76 -85
  37. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +94 -94
  38. data/app/assets/javascripts/katello/locale/ro/katello.js +76 -85
  39. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +76 -85
  40. data/app/assets/javascripts/katello/locale/ru/katello.js +91 -94
  41. data/app/assets/javascripts/katello/locale/sl/katello.js +76 -85
  42. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +80 -86
  43. data/app/assets/javascripts/katello/locale/ta/katello.js +76 -85
  44. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +76 -85
  45. data/app/assets/javascripts/katello/locale/te/katello.js +76 -85
  46. data/app/assets/javascripts/katello/locale/tr/katello.js +76 -85
  47. data/app/assets/javascripts/katello/locale/vi/katello.js +76 -85
  48. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +76 -85
  49. data/app/assets/javascripts/katello/locale/zh/katello.js +76 -85
  50. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +97 -94
  51. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +91 -94
  52. data/app/assets/javascripts/katello/sync_management/index.js +0 -1
  53. data/app/assets/javascripts/katello/sync_management/sync_management.js +365 -308
  54. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -0
  55. data/app/controllers/katello/api/v2/debs_controller.rb +4 -0
  56. data/app/controllers/katello/api/v2/host_debs_controller.rb +13 -1
  57. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -3
  58. data/app/controllers/katello/api/v2/repositories_controller.rb +2 -8
  59. data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +0 -1
  60. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +7 -3
  61. data/app/controllers/katello/concerns/organizations_controller_extensions.rb +1 -17
  62. data/app/helpers/katello/concerns/dashboard_helper_extensions.rb +0 -20
  63. data/app/lib/actions/katello/content_view/publish.rb +3 -3
  64. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  65. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +5 -5
  66. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +5 -5
  67. data/app/lib/actions/katello/content_view_version/import.rb +14 -13
  68. data/app/lib/actions/katello/content_view_version/import_library.rb +4 -4
  69. data/app/lib/actions/katello/content_view_version/import_repository.rb +3 -3
  70. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  71. data/app/lib/actions/katello/host/hypervisors_update.rb +0 -1
  72. data/app/lib/actions/katello/organization/manifest_delete.rb +1 -1
  73. data/app/lib/actions/katello/organization/manifest_refresh.rb +16 -16
  74. data/app/lib/actions/katello/repository/sync.rb +2 -4
  75. data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +20 -15
  76. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +17 -14
  77. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +11 -11
  78. data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +18 -13
  79. data/app/lib/actions/pulp3/repository/import_upload.rb +13 -5
  80. data/app/lib/actions/pulp3/repository/save_artifact.rb +23 -12
  81. data/app/lib/katello/api/v2/error_handling.rb +1 -1
  82. data/app/lib/katello/lazy_accessor.rb +6 -6
  83. data/app/lib/katello/resources/candlepin/owner.rb +2 -2
  84. data/app/mailers/katello/errata_mailer.rb +3 -3
  85. data/app/models/katello/concerns/host_managed_extensions.rb +29 -76
  86. data/app/models/katello/concerns/hostgroup_extensions.rb +4 -2
  87. data/app/models/katello/concerns/organization_extensions.rb +1 -1
  88. data/app/models/katello/concerns/pulp_database_unit.rb +1 -1
  89. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +0 -27
  90. data/app/models/katello/content_view.rb +11 -6
  91. data/app/models/katello/content_view_version.rb +2 -0
  92. data/app/models/katello/deb.rb +8 -0
  93. data/app/models/katello/host/content_facet.rb +19 -14
  94. data/app/models/katello/host/subscription_facet.rb +0 -19
  95. data/app/models/katello/host_tracer.rb +9 -5
  96. data/app/models/katello/installed_deb.rb +1 -0
  97. data/app/models/katello/repository.rb +3 -2
  98. data/app/models/katello/trace_status.rb +6 -2
  99. data/app/overrides/add_organization_attributes.rb +0 -18
  100. data/app/presenters/katello/host_deb_presenter.rb +23 -0
  101. data/app/services/katello/candlepin/consumer.rb +0 -4
  102. data/app/services/katello/candlepin/event_handler.rb +6 -25
  103. data/app/services/katello/candlepin/message_handler.rb +1 -21
  104. data/app/services/katello/host/profiles_uploader.rb +17 -6
  105. data/app/services/katello/host_status_manager.rb +0 -22
  106. data/app/services/katello/organization_creator.rb +2 -2
  107. data/app/services/katello/pulp3/api/apt.rb +1 -1
  108. data/app/services/katello/pulp3/content_view_version/export.rb +2 -2
  109. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -0
  110. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +3 -0
  111. data/app/services/katello/pulp3/repository/apt.rb +16 -6
  112. data/app/services/katello/registration_manager.rb +1 -13
  113. data/app/views/katello/api/v2/host_debs/base.json.rabl +2 -0
  114. data/app/views/katello/api/v2/hosts/base.json.rabl +9 -0
  115. data/app/views/katello/api/v2/subscription_facet/base_with_root.json.rabl +0 -3
  116. data/app/views/katello/api/v2/subscription_facet/show.json.rabl +3 -0
  117. data/app/views/katello/sync_management/index.html.erb +14 -13
  118. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +20 -16
  119. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +6 -4
  120. data/app/views/overrides/organizations/_edit_override.html.erb +0 -12
  121. data/db/migrate/20131014225132_add_users_fields.rb +0 -1
  122. data/db/migrate/20150603045418_remove_user_fields.rb +0 -2
  123. data/db/migrate/20160404132250_remove_katello_from_notification_name.rb +4 -22
  124. data/db/migrate/20160505181337_rename_katello_settings.rb +2 -2
  125. data/db/migrate/20200818192230_update_system_purpose_status.rb +9 -3
  126. data/db/migrate/20240111032511_add_index_to_host_installed_packages.rb +16 -0
  127. data/db/migrate/20240123120109_remove_pulp_export_destination_setting.rb +9 -0
  128. data/db/migrate/20240207191223_remove_entitlement_mode_host_statuses.rb +30 -0
  129. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  130. data/engines/bastion/app/assets/javascripts/bastion/bastion.js +0 -2
  131. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +6 -2
  132. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-associations-content-hosts.html +0 -4
  133. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +0 -1
  134. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion-katello-bootstrap.js +45 -29
  135. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts-helper.service.js +0 -10
  136. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +0 -1
  137. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -21
  138. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-subscriptions.html +0 -5
  139. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +0 -7
  140. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +5 -5
  141. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +9 -1
  142. data/engines/bastion_katello/lib/bastion_katello/engine.rb +0 -6
  143. data/lib/katello/engine.rb +0 -3
  144. data/lib/katello/plugin.rb +2 -11
  145. data/lib/katello/tasks/rubocop.rake +0 -9
  146. data/lib/katello/tasks/unify_hosts.rake +0 -1
  147. data/lib/katello/tasks/upgrades/4.12/update_content_access_modes.rake +35 -0
  148. data/lib/katello/version.rb +1 -1
  149. data/locale/action_names.rb +12 -6
  150. data/locale/bn/katello.po +19 -28
  151. data/locale/bn/katello.po.time_stamp +0 -0
  152. data/locale/bn/katello.pox +0 -0
  153. data/locale/bn_IN/katello.po +19 -28
  154. data/locale/bn_IN/katello.po.time_stamp +0 -0
  155. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  156. data/locale/ca/katello.po +20 -29
  157. data/locale/ca/katello.po.time_stamp +0 -0
  158. data/locale/cs/katello.po +19 -29
  159. data/locale/cs/katello.po.time_stamp +0 -0
  160. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  161. data/locale/cs_CZ/katello.po +20 -29
  162. data/locale/cs_CZ/katello.po.time_stamp +0 -0
  163. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  164. data/locale/de/katello.po +20 -29
  165. data/locale/de/katello.po.time_stamp +0 -0
  166. data/locale/de_AT/katello.po +19 -28
  167. data/locale/de_AT/katello.po.time_stamp +0 -0
  168. data/locale/de_DE/katello.po +19 -28
  169. data/locale/de_DE/katello.po.time_stamp +0 -0
  170. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  171. data/locale/el/katello.po +20 -29
  172. data/locale/el/katello.po.time_stamp +0 -0
  173. data/locale/en/katello.po +19 -28
  174. data/locale/en/katello.po.time_stamp +0 -0
  175. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  176. data/locale/en_GB/katello.po +19 -28
  177. data/locale/en_GB/katello.po.time_stamp +0 -0
  178. data/locale/en_US/katello.po +19 -28
  179. data/locale/en_US/katello.po.time_stamp +0 -0
  180. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  181. data/locale/es/katello.po +20 -29
  182. data/locale/es/katello.po.time_stamp +0 -0
  183. data/locale/et_EE/katello.po +19 -28
  184. data/locale/et_EE/katello.po.time_stamp +0 -0
  185. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  186. data/locale/fr/katello.po +20 -29
  187. data/locale/fr/katello.po.time_stamp +0 -0
  188. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  189. data/locale/gl/katello.po +20 -29
  190. data/locale/gl/katello.po.time_stamp +0 -0
  191. data/locale/gu/katello.po +19 -28
  192. data/locale/gu/katello.po.time_stamp +0 -0
  193. data/locale/he_IL/katello.po +19 -28
  194. data/locale/he_IL/katello.po.time_stamp +0 -0
  195. data/locale/hi/katello.po +19 -28
  196. data/locale/hi/katello.po.time_stamp +0 -0
  197. data/locale/id/katello.po +19 -28
  198. data/locale/id/katello.po.time_stamp +0 -0
  199. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  200. data/locale/it/katello.po +20 -29
  201. data/locale/it/katello.po.time_stamp +0 -0
  202. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  203. data/locale/ja/katello.po +20 -29
  204. data/locale/ja/katello.po.time_stamp +0 -0
  205. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  206. data/locale/ka/katello.po +20 -29
  207. data/locale/ka/katello.po.time_stamp +0 -0
  208. data/locale/katello.pot +363 -348
  209. data/locale/kn/katello.po +19 -28
  210. data/locale/kn/katello.po.time_stamp +0 -0
  211. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/ko/katello.po +20 -29
  213. data/locale/ko/katello.po.time_stamp +0 -0
  214. data/locale/messages.mo +0 -0
  215. data/locale/ml_IN/katello.po +19 -28
  216. data/locale/ml_IN/katello.po.time_stamp +0 -0
  217. data/locale/mr/katello.po +19 -28
  218. data/locale/mr/katello.po.time_stamp +0 -0
  219. data/locale/nl_NL/katello.po +19 -28
  220. data/locale/nl_NL/katello.po.time_stamp +0 -0
  221. data/locale/or/katello.po +19 -28
  222. data/locale/or/katello.po.time_stamp +0 -0
  223. data/locale/pa/katello.po +19 -28
  224. data/locale/pa/katello.po.time_stamp +0 -0
  225. data/locale/pl/katello.po +19 -28
  226. data/locale/pl/katello.po.time_stamp +0 -0
  227. data/locale/pl_PL/katello.po +19 -28
  228. data/locale/pl_PL/katello.po.time_stamp +0 -0
  229. data/locale/pt/katello.po +19 -28
  230. data/locale/pt/katello.po.time_stamp +0 -0
  231. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  232. data/locale/pt_BR/katello.po +20 -29
  233. data/locale/pt_BR/katello.po.time_stamp +0 -0
  234. data/locale/ro/katello.po +19 -28
  235. data/locale/ro/katello.po.time_stamp +0 -0
  236. data/locale/ro_RO/katello.po +19 -28
  237. data/locale/ro_RO/katello.po.time_stamp +0 -0
  238. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  239. data/locale/ru/katello.po +20 -29
  240. data/locale/ru/katello.po.time_stamp +0 -0
  241. data/locale/sl/katello.po +19 -28
  242. data/locale/sl/katello.po.time_stamp +0 -0
  243. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/sv_SE/katello.po +20 -29
  245. data/locale/sv_SE/katello.po.time_stamp +0 -0
  246. data/locale/ta/katello.po +19 -28
  247. data/locale/ta/katello.po.time_stamp +0 -0
  248. data/locale/ta_IN/katello.po +19 -28
  249. data/locale/ta_IN/katello.po.time_stamp +0 -0
  250. data/locale/te/katello.po +19 -28
  251. data/locale/te/katello.po.time_stamp +0 -0
  252. data/locale/tr/katello.po +19 -28
  253. data/locale/tr/katello.po.time_stamp +0 -0
  254. data/locale/vi/katello.po +19 -28
  255. data/locale/vi/katello.po.time_stamp +0 -0
  256. data/locale/vi_VN/katello.po +19 -28
  257. data/locale/vi_VN/katello.po.time_stamp +0 -0
  258. data/locale/zh/katello.po +19 -28
  259. data/locale/zh/katello.po.time_stamp +0 -0
  260. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/zh_CN/katello.po +20 -29
  262. data/locale/zh_CN/katello.po.time_stamp +0 -0
  263. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  264. data/locale/zh_TW/katello.po +20 -29
  265. data/locale/zh_TW/katello.po.time_stamp +0 -0
  266. data/package.json +0 -1
  267. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  268. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +4 -1
  269. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.js +250 -0
  270. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.scss +3 -0
  271. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebsTab.js +585 -0
  272. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebsTab.scss +12 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/HostDebsActions.js +13 -0
  274. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/HostDebsConstants.js +13 -0
  275. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/HostDebsSelectors.js +16 -0
  276. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/InstallableDebsActions.js +17 -0
  277. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/InstallableDebsConstants.js +3 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/InstallableDebsSelectors.js +16 -0
  279. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +1 -8
  280. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +2 -0
  281. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +4 -18
  282. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +13 -5
  283. data/webpack/components/extensions/HostDetails/Tabs/__tests__/debs.fixtures.json +31 -0
  284. data/webpack/components/extensions/HostDetails/Tabs/__tests__/debsInstallModal.test.js +226 -0
  285. data/webpack/components/extensions/HostDetails/Tabs/__tests__/debsTab.test.js +420 -0
  286. data/webpack/components/extensions/HostDetails/Tabs/__tests__/installableDebs.fixtures.json +63 -0
  287. data/webpack/components/extensions/HostDetails/Tabs/__tests__/traces.fixtures.json +11 -1
  288. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +63 -3
  289. data/webpack/scenes/ContentViews/ContentViewsConstants.js +3 -0
  290. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +0 -13
  291. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +23 -1
  292. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +19 -1
  293. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +0 -13
  294. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +37 -3
  295. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +10 -2
  296. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +0 -13
  297. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -5
  298. data/webpack/scenes/Organizations/OrganizationSelectors.js +0 -3
  299. data/webpack/scenes/Subscriptions/Manifest/index.js +1 -4
  300. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +3 -25
  301. data/webpack/scenes/Subscriptions/SubscriptionsSelectors.js +0 -3
  302. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsSelectors.test.js +0 -3
  303. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +0 -22
  304. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsSelectors.test.js.snap +0 -3
  305. data/webpack/scenes/Subscriptions/index.js +1 -2
  306. metadata +93 -190
  307. data/app/controllers/katello/concerns/content_facet_hosts_controller_extensions.rb +0 -22
  308. data/app/models/katello/concerns/widget_extensions.rb +0 -23
  309. data/app/models/katello/purpose_addons_status.rb +0 -28
  310. data/app/models/katello/purpose_role_status.rb +0 -28
  311. data/app/models/katello/purpose_sla_status.rb +0 -28
  312. data/app/models/katello/purpose_status.rb +0 -71
  313. data/app/models/katello/purpose_usage_status.rb +0 -28
  314. data/app/models/katello/subscription_status.rb +0 -71
  315. data/app/services/katello/candlepin/system_purpose.rb +0 -49
  316. data/app/views/dashboard/_subscription_status_widget.html.erb +0 -37
  317. data/app/views/dashboard/_subscription_widget.html.erb +0 -85
  318. data/app/views/overrides/organizations/_index_header_override.html.erb +0 -3
  319. data/app/views/overrides/organizations/_index_row_override.html.erb +0 -3
  320. data/app/views/overrides/organizations/_step_1_override.html.erb +0 -10
  321. data/config/locales/README +0 -10
  322. data/config/locales/bn.yml +0 -182
  323. data/config/locales/compare_upstream.sh +0 -21
  324. data/config/locales/cs.yml +0 -211
  325. data/config/locales/de.yml +0 -203
  326. data/config/locales/en.yml +0 -205
  327. data/config/locales/es.yml +0 -199
  328. data/config/locales/fr.yml +0 -222
  329. data/config/locales/gu.yml +0 -181
  330. data/config/locales/hi.yml +0 -199
  331. data/config/locales/it.yml +0 -205
  332. data/config/locales/ja.yml +0 -197
  333. data/config/locales/kn.yml +0 -199
  334. data/config/locales/ko.yml +0 -197
  335. data/config/locales/mr.yml +0 -178
  336. data/config/locales/or.yml +0 -181
  337. data/config/locales/pa.yml +0 -181
  338. data/config/locales/pt-BR.yml +0 -207
  339. data/config/locales/pt.yml +0 -207
  340. data/config/locales/ru.yml +0 -257
  341. data/config/locales/ta.yml +0 -181
  342. data/config/locales/te.yml +0 -181
  343. data/config/locales/update.sh +0 -14
  344. data/config/locales/zh-CN.yml +0 -199
  345. data/config/locales/zh-TW.yml +0 -199
  346. data/engines/bastion/app/assets/javascripts/bastion/bastion-bootstrap.js +0 -17
  347. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/content-access-mode-banner.directive.js +0 -22
  348. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +0 -10
  349. data/webpack/scenes/Subscriptions/Manifest/SimpleContentAccess.js +0 -96
@@ -0,0 +1,585 @@
1
+ import React, { useCallback, useState, useRef } from 'react';
2
+ import { useSelector } from 'react-redux';
3
+ import {
4
+ ActionList,
5
+ ActionListItem,
6
+ Dropdown,
7
+ DropdownItem,
8
+ DropdownSeparator,
9
+ DropdownToggle,
10
+ DropdownToggleAction,
11
+ KebabToggle,
12
+ Select,
13
+ SelectOption,
14
+ SelectVariant,
15
+ Skeleton,
16
+ Split,
17
+ SplitItem,
18
+ } from '@patternfly/react-core';
19
+ import { TableVariant, Thead, Tbody, Tr, Th, Td, TableText } from '@patternfly/react-table';
20
+ import PropTypes from 'prop-types';
21
+ import { translate as __ } from 'foremanReact/common/I18n';
22
+ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
23
+
24
+ import { urlBuilder } from 'foremanReact/common/urlHelpers';
25
+ import { useSet, useBulkSelect, useUrlParams } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks';
26
+ import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort';
27
+ import SelectableDropdown from '../../../../SelectableDropdown';
28
+ import TableWrapper from '../../../../../components/Table/TableWrapper';
29
+ import PackagesStatus from '../../../../../components/Packages';
30
+ import {
31
+ getInstalledDebs,
32
+ } from './HostDebsActions';
33
+ import { selectHostDebsStatus } from './HostDebsSelectors';
34
+ import {
35
+ HOST_DEBS_KEY, PACKAGES_VERSION_STATUSES, VERSION_STATUSES_TO_PARAM,
36
+ } from './HostDebsConstants';
37
+ import { removePackage, updatePackage, removePackages, updatePackages, installPackageBySearch } from '../RemoteExecutionActions';
38
+ import { katelloPackageUpdateUrl, packagesUpdateUrl } from '../customizedRexUrlHelpers';
39
+ import './DebsTab.scss';
40
+ import hostIdNotReady, { getHostDetails } from '../../HostDetailsActions';
41
+ import DebInstallModal from './DebInstallModal';
42
+ import { hasRequiredPermissions as can,
43
+ missingRequiredPermissions as cannot,
44
+ userPermissionsFromHostDetails } from '../../hostDetailsHelpers';
45
+ import SortableColumnHeaders from '../../../../Table/components/SortableColumnHeaders';
46
+ import { useRexJobPolling } from '../RemoteExecutionHooks';
47
+
48
+ export const hideDebsTab = ({ hostDetails }) => !(hostDetails?.operatingsystem_family === 'Debian');
49
+
50
+ const invokeRexJobs = ['create_job_invocations'];
51
+ const createBookmarks = ['create_bookmarks'];
52
+
53
+ const UpdateVersionsSelect = ({
54
+ packageName,
55
+ rowIndex,
56
+ selections,
57
+ upgradableVersions,
58
+ toggleUpgradableVersionSelect,
59
+ onUpgradableVersionSelect,
60
+ upgradableVersionSelectOpen,
61
+ }) => {
62
+ if (upgradableVersions === null) {
63
+ return <TableText wrapModifier="nowrap">—</TableText>;
64
+ } else if (upgradableVersions.length === 1) {
65
+ return <TableText wrapModifier="nowrap">{upgradableVersions[0]}</TableText>;
66
+ }
67
+
68
+ return (
69
+ <div>
70
+ <span id="style-select-id">
71
+ <Select
72
+ variant={SelectVariant.single}
73
+ aria-label="upgradable-version-select"
74
+ ouiaId="upgradable-version-select"
75
+ onToggle={isOpen => toggleUpgradableVersionSelect(isOpen, rowIndex)}
76
+ onSelect={(event, selected) => {
77
+ onUpgradableVersionSelect(event, selected, rowIndex, packageName);
78
+ }}
79
+ selections={selections}
80
+ isOpen={upgradableVersionSelectOpen.has(rowIndex)}
81
+ isPlain
82
+ >
83
+ {upgradableVersions.map(version => (
84
+ <SelectOption
85
+ key={version}
86
+ value={version}
87
+ label={`${version}-version-select-option`}
88
+ />
89
+ ))}
90
+ </Select>
91
+ </span>
92
+ </div>
93
+ );
94
+ };
95
+
96
+ UpdateVersionsSelect.propTypes = {
97
+ packageName: PropTypes.string.isRequired,
98
+ rowIndex: PropTypes.number.isRequired,
99
+ selections: PropTypes.string,
100
+ upgradableVersions: PropTypes.arrayOf(PropTypes.string),
101
+ toggleUpgradableVersionSelect: PropTypes.func,
102
+ onUpgradableVersionSelect: PropTypes.func,
103
+ upgradableVersionSelectOpen: PropTypes.shape({
104
+ has: PropTypes.func,
105
+ rowIndex: PropTypes.number,
106
+ }),
107
+ };
108
+
109
+ UpdateVersionsSelect.defaultProps = {
110
+ selections: null,
111
+ upgradableVersions: null,
112
+ toggleUpgradableVersionSelect: undefined,
113
+ onUpgradableVersionSelect: undefined,
114
+ upgradableVersionSelectOpen: null,
115
+ };
116
+
117
+ export const DebsTab = () => {
118
+ const hostDetails = useSelector(state => selectAPIResponse(state, 'HOST_DETAILS'));
119
+ const {
120
+ id: hostId,
121
+ name: hostname,
122
+ } = hostDetails;
123
+
124
+ const { searchParam, status: statusParam } = useUrlParams();
125
+ const PACKAGE_STATUS = __('Status');
126
+ const [packageStatusSelected, setPackageStatusSelected] = useState(statusParam ?? PACKAGE_STATUS);
127
+ const activeFilters = [packageStatusSelected];
128
+ const defaultFilters = [PACKAGE_STATUS];
129
+ const [isBulkActionOpen, setIsBulkActionOpen] = useState(false);
130
+ const toggleBulkAction = () => setIsBulkActionOpen(prev => !prev);
131
+ const [isModalOpen, setIsModalOpen] = useState(false);
132
+ const closeModal = () => setIsModalOpen(false);
133
+ const showActions = can(invokeRexJobs, userPermissionsFromHostDetails({ hostDetails }));
134
+
135
+ const [isActionOpen, setIsActionOpen] = useState(false);
136
+ const onActionSelect = () => {
137
+ setIsActionOpen(false);
138
+ };
139
+ const onActionToggle = () => {
140
+ setIsActionOpen(prev => !prev);
141
+ };
142
+
143
+ const upgradableVersionSelectOpen = useSet([]);
144
+ const toggleUpgradableVersionSelect = (isOpenState, rowIndex) => {
145
+ if (isOpenState) {
146
+ upgradableVersionSelectOpen.add(rowIndex);
147
+ } else {
148
+ upgradableVersionSelectOpen.delete(rowIndex);
149
+ }
150
+ };
151
+
152
+ const selectedNewVersions = useRef({});
153
+ const onUpgradableVersionSelect = (_event, selected, rowIndex, packageName) => {
154
+ toggleUpgradableVersionSelect(false, rowIndex);
155
+ selectedNewVersions.current[packageName] = selected;
156
+ };
157
+
158
+ const emptyContentTitle = __('This host does not have any packages.');
159
+ const emptyContentBody = __('Packages will appear here when available.');
160
+ const emptySearchTitle = __('No matching packages found');
161
+ const emptySearchBody = __('Try changing your search settings.');
162
+ const errorSearchTitle = __('Problem searching packages');
163
+ const columnHeaders = [
164
+ __('Package'),
165
+ __('Status'),
166
+ __('Installed version'),
167
+ __('Upgradable to'),
168
+ ];
169
+
170
+ const COLUMNS_TO_SORT_PARAMS = {
171
+ [columnHeaders[0]]: 'name',
172
+ [columnHeaders[2]]: 'version',
173
+ };
174
+
175
+ const {
176
+ pfSortParams, apiSortParams,
177
+ activeSortColumn, activeSortDirection,
178
+ } = useTableSort({
179
+ allColumns: columnHeaders,
180
+ columnsToSortParams: COLUMNS_TO_SORT_PARAMS,
181
+ initialSortColumnName: 'Package',
182
+ });
183
+
184
+ const fetchItems = useCallback(
185
+ (params) => {
186
+ if (!hostId) return hostIdNotReady;
187
+ const modifiedParams = { ...params };
188
+ if (packageStatusSelected !== PACKAGE_STATUS) {
189
+ modifiedParams.status = VERSION_STATUSES_TO_PARAM[packageStatusSelected];
190
+ }
191
+ return getInstalledDebs(hostId, { ...apiSortParams, ...modifiedParams });
192
+ },
193
+ [hostId, PACKAGE_STATUS, packageStatusSelected, apiSortParams],
194
+ );
195
+
196
+ const response = useSelector(state => selectAPIResponse(state, HOST_DEBS_KEY));
197
+ const { results, ...metadata } = response;
198
+ const { error: errorSearchBody } = metadata;
199
+ const status = useSelector(state => selectHostDebsStatus(state));
200
+ const {
201
+ selectOne,
202
+ isSelected,
203
+ searchQuery,
204
+ updateSearchQuery,
205
+ selectedCount,
206
+ isSelectable,
207
+ selectedResults,
208
+ selectNone,
209
+ selectAllMode,
210
+ areAllRowsSelected,
211
+ fetchBulkParams,
212
+ ...selectAll
213
+ } = useBulkSelect({
214
+ results,
215
+ metadata,
216
+ initialSearchQuery: searchParam || '',
217
+ });
218
+
219
+ const packageRemoveAction = packageName => removePackage({
220
+ hostname,
221
+ packageName,
222
+ });
223
+
224
+ const {
225
+ triggerJobStart: triggerPackageRemove, lastCompletedJob: lastCompletedPackageRemove,
226
+ isPolling: isRemoveInProgress,
227
+ } = useRexJobPolling(packageRemoveAction);
228
+
229
+ const packageBulkRemoveAction = bulkParams => removePackages({
230
+ hostname,
231
+ search: bulkParams,
232
+ });
233
+
234
+ const {
235
+ triggerJobStart: triggerBulkPackageRemove,
236
+ lastCompletedJob: lastCompletedBulkPackageRemove,
237
+ isPolling: isBulkRemoveInProgress,
238
+ } = useRexJobPolling(packageBulkRemoveAction);
239
+
240
+ const packageUpgradeAction = ({ packageName }) => updatePackage({
241
+ hostname,
242
+ packageName,
243
+ });
244
+
245
+ const {
246
+ triggerJobStart: triggerPackageUpgrade,
247
+ lastCompletedJob: lastCompletedPackageUpgrade,
248
+ isPolling: isUpgradeInProgress,
249
+ } = useRexJobPolling(packageUpgradeAction, getHostDetails({ hostname }));
250
+
251
+ const packageBulkUpgradeAction = bulkParams => updatePackages({
252
+ hostname,
253
+ search: bulkParams,
254
+ versions: JSON.stringify([]),
255
+ });
256
+
257
+ const {
258
+ triggerJobStart: triggerBulkPackageUpgrade,
259
+ lastCompletedJob: lastCompletedBulkPackageUpgrade,
260
+ isPolling: isBulkUpgradeInProgress,
261
+ } = useRexJobPolling(packageBulkUpgradeAction, getHostDetails({ hostname }));
262
+
263
+ const packageInstallAction
264
+ = bulkParams => installPackageBySearch({ hostname, search: bulkParams });
265
+
266
+ const {
267
+ triggerJobStart: triggerPackageInstall,
268
+ lastCompletedJob: lastCompletedPackageInstall,
269
+ isPolling: isInstallInProgress,
270
+ } = useRexJobPolling(packageInstallAction, getHostDetails({ hostname }));
271
+
272
+ const actionInProgress = (isRemoveInProgress || isUpgradeInProgress
273
+ || isBulkRemoveInProgress || isBulkUpgradeInProgress || isInstallInProgress);
274
+ const disabledReason = __('A remote execution job is in progress.');
275
+
276
+ if (!hostId) return <Skeleton />;
277
+
278
+ const handleInstallPackagesClick = () => {
279
+ setIsBulkActionOpen(false);
280
+ setIsModalOpen(true);
281
+ };
282
+
283
+ const removePackageViaRemoteExecution = packageName => triggerPackageRemove(packageName);
284
+
285
+ const removePackagesViaRemoteExecution = () => {
286
+ const selected = fetchBulkParams();
287
+ setIsBulkActionOpen(false);
288
+ selectNone();
289
+ triggerBulkPackageRemove(selected);
290
+ };
291
+
292
+ const removeBulk = () => removePackagesViaRemoteExecution();
293
+
294
+ const handlePackageRemove = packageName => removePackageViaRemoteExecution(packageName);
295
+
296
+ const upgradeViaRemoteExecution = ({ packageName, upgradableVersions }) => (
297
+ triggerPackageUpgrade({ packageName, upgradableVersions })
298
+ );
299
+
300
+ const upgradeBulkViaRemoteExecution = () => {
301
+ const selected = fetchBulkParams();
302
+ setIsBulkActionOpen(false);
303
+ selectNone();
304
+ triggerBulkPackageUpgrade(selected);
305
+ };
306
+
307
+ const upgradeBulk = () => upgradeBulkViaRemoteExecution();
308
+
309
+ const upgradeViaCustomizedRemoteExecution = selectedCount ?
310
+ packagesUpdateUrl({
311
+ hostname,
312
+ search: fetchBulkParams(),
313
+ versions: JSON.stringify([]),
314
+ }) : '#';
315
+
316
+ const disableRemove = () => selectedCount === 0 || selectAllMode;
317
+
318
+ const allUpgradable = () => selectedResults.length > 0 &&
319
+ selectedResults.every(item => item.upgradable_versions?.length > 0);
320
+ const disableUpgrade = () => selectedCount === 0 ||
321
+ (selectAllMode && packageStatusSelected !== 'Upgradable') ||
322
+ (!selectAllMode && !allUpgradable());
323
+
324
+ const readOnlyBookmarks =
325
+ cannot(createBookmarks, userPermissionsFromHostDetails({ hostDetails }));
326
+
327
+ const dropdownUpgradeItems = [
328
+ <DropdownItem
329
+ aria-label="bulk_upgrade_rex"
330
+ ouiaId="bulk_upgrade_rex"
331
+ key="bulk_upgrade_rex"
332
+ component="button"
333
+ onClick={upgradeBulkViaRemoteExecution}
334
+ >
335
+ {__('Upgrade via remote execution')}
336
+ </DropdownItem>,
337
+ <DropdownItem
338
+ aria-label="bulk_upgrade_customized_rex"
339
+ ouiaId="bulk_upgrade_customized_rex"
340
+ key="bulk_upgrade_customized_rex"
341
+ component="a"
342
+ href={upgradeViaCustomizedRemoteExecution}
343
+ >
344
+ {__('Upgrade via customized remote execution')}
345
+ </DropdownItem>,
346
+ ];
347
+
348
+ const dropdownRemoveItems = [
349
+ <DropdownItem
350
+ aria-label="bulk_remove"
351
+ ouiaId="bulk_remove"
352
+ key="bulk_remove"
353
+ component="button"
354
+ onClick={removeBulk}
355
+ isDisabled={disableRemove()}
356
+ >
357
+ {__('Remove')}
358
+ </DropdownItem>,
359
+ <DropdownSeparator key="separator" ouiaId="separator" />,
360
+ <DropdownItem
361
+ aria-label="install_pkg_on_host"
362
+ ouiaId="install_pkg_on_host"
363
+ key="install_pkg_on_host"
364
+ component="button"
365
+ onClick={handleInstallPackagesClick}
366
+ >
367
+ {__('Install packages')}
368
+ </DropdownItem>,
369
+ ];
370
+
371
+ const handlePackageStatusSelected = newStatus => setPackageStatusSelected((prevStatus) => {
372
+ if (prevStatus === newStatus) {
373
+ return PACKAGE_STATUS;
374
+ }
375
+ return newStatus;
376
+ });
377
+
378
+ const actionButtons = showActions ? (
379
+ <Split hasGutter>
380
+ <SplitItem>
381
+ <ActionList isIconList>
382
+ <ActionListItem>
383
+ <Dropdown
384
+ ouiaId="upgrade_actions_dropdown"
385
+ onSelect={onActionSelect}
386
+ toggle={
387
+ <DropdownToggle
388
+ ouiaId="upgrade_actions_dropdown_toggle"
389
+ splitButtonItems={[
390
+ <DropdownToggleAction key="action" aria-label="upgrade_actions" onClick={upgradeBulk}>
391
+ {__('Upgrade')}
392
+ </DropdownToggleAction>,
393
+ ]}
394
+ isDisabled={actionInProgress || disableUpgrade()}
395
+ splitButtonVariant="action"
396
+ toggleVariant="primary"
397
+ onToggle={onActionToggle}
398
+ />
399
+ }
400
+ isOpen={isActionOpen}
401
+ dropdownItems={dropdownUpgradeItems}
402
+ />
403
+ </ActionListItem>
404
+ <ActionListItem>
405
+ <Dropdown
406
+ toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
407
+ isOpen={isBulkActionOpen}
408
+ isPlain
409
+ dropdownItems={dropdownRemoveItems}
410
+ ouiaId="bulk_actions_dropdown"
411
+ />
412
+ </ActionListItem>
413
+ </ActionList>
414
+ </SplitItem>
415
+ </Split>
416
+ ) : null;
417
+
418
+ const statusFilters = (
419
+ <Split hasGutter>
420
+ <SplitItem>
421
+ <SelectableDropdown
422
+ id="package-status-dropdown"
423
+ title={PACKAGE_STATUS}
424
+ showTitle={false}
425
+ items={Object.values(PACKAGES_VERSION_STATUSES)}
426
+ selected={packageStatusSelected}
427
+ setSelected={handlePackageStatusSelected}
428
+ />
429
+ </SplitItem>
430
+ </Split>
431
+ );
432
+
433
+ const resetFilters = () => setPackageStatusSelected(PACKAGE_STATUS);
434
+
435
+ return (
436
+ <div>
437
+ <div id="debs-tab">
438
+ <TableWrapper
439
+ {...{
440
+ metadata,
441
+ emptyContentTitle,
442
+ emptyContentBody,
443
+ emptySearchTitle,
444
+ emptySearchBody,
445
+ errorSearchTitle,
446
+ errorSearchBody,
447
+ status,
448
+ activeFilters,
449
+ defaultFilters,
450
+ actionButtons,
451
+ searchQuery,
452
+ updateSearchQuery,
453
+ toggleGroup: statusFilters,
454
+ selectedCount,
455
+ selectNone,
456
+ areAllRowsSelected,
457
+ resetFilters,
458
+ }
459
+ }
460
+ ouiaId="host-debs-table"
461
+ additionalListeners={[hostId, packageStatusSelected,
462
+ activeSortDirection, activeSortColumn, lastCompletedPackageUpgrade,
463
+ lastCompletedPackageRemove, lastCompletedBulkPackageRemove,
464
+ lastCompletedBulkPackageUpgrade, lastCompletedPackageInstall]}
465
+ fetchItems={fetchItems}
466
+ bookmarkController="katello_host_installed_debs"
467
+ readOnlyBookmarks={readOnlyBookmarks}
468
+ autocompleteEndpoint={`/api/v2/hosts/${hostId}/debs`}
469
+ rowsCount={results?.length}
470
+ variant={TableVariant.compact}
471
+ {...selectAll}
472
+ displaySelectAllCheckbox={showActions}
473
+ requestKey={HOST_DEBS_KEY}
474
+ alwaysShowActionButtons={false}
475
+ >
476
+ <Thead>
477
+ <Tr ouiaId="row-header">
478
+ <Th key="select-all" />
479
+ <SortableColumnHeaders
480
+ columnHeaders={columnHeaders}
481
+ pfSortParams={pfSortParams}
482
+ columnsToSortParams={COLUMNS_TO_SORT_PARAMS}
483
+ />
484
+ <Th />
485
+ </Tr>
486
+ </Thead>
487
+ <Tbody>
488
+ {results?.map((pkg, rowIndex) => {
489
+ const {
490
+ id,
491
+ name: packageName,
492
+ version: installedVersion,
493
+ deb_id: debId,
494
+ upgradable_versions: upgradableVersions,
495
+ } = pkg;
496
+
497
+ const rowActions = [
498
+ {
499
+ title: __('Remove'),
500
+ isDisabled: actionInProgress,
501
+ onClick: () => handlePackageRemove(packageName),
502
+ },
503
+ ];
504
+
505
+ if (upgradableVersions) {
506
+ rowActions.unshift(
507
+ {
508
+ title: __('Upgrade via remote execution'),
509
+ onClick: () => upgradeViaRemoteExecution({ packageName, upgradableVersions }),
510
+ isDisabled: actionInProgress,
511
+ },
512
+ {
513
+ title: __('Upgrade via customized remote execution'),
514
+ component: 'a',
515
+ href: katelloPackageUpdateUrl({
516
+ hostname,
517
+ packageName,
518
+ }),
519
+ },
520
+ );
521
+ }
522
+
523
+ return (
524
+ <Tr key={id} ouiaId={`action-row-${id}`}>
525
+ {showActions ? (
526
+ <Td
527
+ select={{
528
+ disable: actionInProgress,
529
+ isSelected: isSelected(id),
530
+ onSelect: (event, selected) => selectOne(selected, id, pkg),
531
+ rowIndex,
532
+ variant: 'checkbox',
533
+ }}
534
+ title={actionInProgress ? disabledReason : undefined}
535
+ />
536
+ ) : <Td>&nbsp;</Td>}
537
+ <Td>
538
+ {debId
539
+ ? <a href={urlBuilder(`debs/${debId}`, '')}>{packageName}</a>
540
+ : packageName
541
+ }
542
+ </Td>
543
+ <Td><PackagesStatus {...pkg} /></Td>
544
+ <Td>{installedVersion.replace(`${packageName}-`, '')}</Td>
545
+ <Td>
546
+ <UpdateVersionsSelect
547
+ packageName={packageName}
548
+ rowIndex={rowIndex}
549
+ selections={selectedNewVersions.current[packageName]}
550
+ upgradableVersions={upgradableVersions}
551
+ toggleUpgradableVersionSelect={toggleUpgradableVersionSelect}
552
+ onUpgradableVersionSelect={onUpgradableVersionSelect}
553
+ upgradableVersionSelectOpen={upgradableVersionSelectOpen}
554
+ />
555
+ </Td>
556
+ {showActions ? (
557
+ <Td
558
+ key={`rowActions-${id}`}
559
+ actions={{
560
+ items: rowActions,
561
+ }}
562
+ />
563
+ ) : null}
564
+ </Tr>
565
+ );
566
+ })
567
+ }
568
+ </Tbody>
569
+ </TableWrapper>
570
+ </div>
571
+ {hostId &&
572
+ <DebInstallModal
573
+ isOpen={isModalOpen}
574
+ closeModal={closeModal}
575
+ hostId={hostId}
576
+ key={hostId}
577
+ hostName={hostname}
578
+ triggerPackageInstall={triggerPackageInstall}
579
+ />
580
+ }
581
+ </div>
582
+ );
583
+ };
584
+
585
+ export default DebsTab;
@@ -0,0 +1,12 @@
1
+ #debs-tab {
2
+ margin: 16px 0;
3
+ }
4
+
5
+ #debs-alert {
6
+ margin: 16px 24px;
7
+ }
8
+
9
+ #style-select-id .pf-c-select button.pf-c-select__toggle {
10
+ font-size: 1em;
11
+ margin-left: -0.5rem;
12
+ }
@@ -0,0 +1,13 @@
1
+ import { API_OPERATIONS, get } from 'foremanReact/redux/API';
2
+ import { foremanApi } from '../../../../../services/api';
3
+ import {
4
+ HOST_DEBS_KEY,
5
+ } from './HostDebsConstants';
6
+
7
+ export const getInstalledDebs = (hostId, params) => get({
8
+ type: API_OPERATIONS.GET,
9
+ key: HOST_DEBS_KEY,
10
+ url: foremanApi.getApiUrl(`/hosts/${hostId}/debs?include_latest_upgradable=true`),
11
+ params,
12
+ });
13
+ export default getInstalledDebs;
@@ -0,0 +1,13 @@
1
+ export const HOST_DEBS_KEY = 'HOST_DEBS';
2
+ export const PACKAGES_SEARCH_QUERY = 'Packages search query';
3
+ export const SELECTED_UPDATE_VERSIONS = 'Selected update versions';
4
+
5
+ export const PACKAGES_VERSION_STATUSES = {
6
+ UPGRADABLE: 'Upgradable',
7
+ UP_TO_DATE: 'Up-to date',
8
+ };
9
+
10
+ export const VERSION_STATUSES_TO_PARAM = {
11
+ [PACKAGES_VERSION_STATUSES.UPGRADABLE]: 'upgradable',
12
+ [PACKAGES_VERSION_STATUSES.UP_TO_DATE]: 'up-to-date',
13
+ };
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { HOST_DEBS_KEY } from './HostDebsConstants';
8
+
9
+ export const selectHostDebs = state =>
10
+ selectAPIResponse(state, HOST_DEBS_KEY) || {};
11
+
12
+ export const selectHostDebsStatus = state =>
13
+ selectAPIStatus(state, HOST_DEBS_KEY) || STATUS.PENDING;
14
+
15
+ export const selectHostDebsError = state =>
16
+ selectAPIError(state, HOST_DEBS_KEY);
@@ -0,0 +1,17 @@
1
+ import { API_OPERATIONS, get } from 'foremanReact/redux/API';
2
+ import katelloApi from '../../../../../services/api';
3
+ import { HOST_INSTALLABLE_DEBS_KEY } from './InstallableDebsConstants';
4
+
5
+ export const getHostInstallableDebs = (hostId, params) => get({
6
+ type: API_OPERATIONS.GET,
7
+ key: HOST_INSTALLABLE_DEBS_KEY,
8
+ url: katelloApi.getApiUrl('/debs'),
9
+ params: {
10
+ ...params,
11
+ host_id: hostId,
12
+ packages_restrict_not_installed: true,
13
+ packages_restrict_applicable: false,
14
+ },
15
+ });
16
+ export default getHostInstallableDebs;
17
+
@@ -0,0 +1,3 @@
1
+ export const HOST_INSTALLABLE_DEBS_KEY = 'HOST_INSTALLABLE_DEBS';
2
+ export const PACKAGE_SEARCH_QUERY = 'Package search query';
3
+ export default HOST_INSTALLABLE_DEBS_KEY;
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { HOST_INSTALLABLE_DEBS_KEY } from './InstallableDebsConstants';
8
+
9
+ export const selectHostInstallableDebs = state =>
10
+ selectAPIResponse(state, HOST_INSTALLABLE_DEBS_KEY) || {};
11
+
12
+ export const selectHostInstallableDebsStatus = state =>
13
+ selectAPIStatus(state, HOST_INSTALLABLE_DEBS_KEY) || STATUS.PENDING;
14
+
15
+ export const selectHostInstallableDebsError = state =>
16
+ selectAPIError(state, HOST_INSTALLABLE_DEBS_KEY);
@@ -47,14 +47,7 @@ import {
47
47
  userPermissionsFromHostDetails,
48
48
  } from '../../hostDetailsHelpers';
49
49
 
50
- const moduleStreamSupported = ({ os, version }) =>
51
- os.match(/RedHat|RHEL|CentOS|Rocky|AlmaLinux|Oracle Linux/i) && Number(version) > 7;
52
- export const hideModuleStreamsTab = ({ hostDetails }) => {
53
- const osMatch = hostDetails?.operatingsystem_name?.match(/(\D+) (\d+)/);
54
- if (!osMatch) return false;
55
- const [, os, version] = osMatch;
56
- return !(osMatch && moduleStreamSupported({ os, version }));
57
- };
50
+ export const hideModuleStreamsTab = ({ hostDetails }) => !(hostDetails?.operatingsystem_family === 'Redhat' && Number(hostDetails?.operatingsystem_major > 7));
58
51
 
59
52
  const EnabledIcon = ({ streamText, streamInstallStatus, upgradable }) => {
60
53
  switch (true) {