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,420 @@
1
+ import React from 'react';
2
+ import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
3
+ import * as hooks from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks';
4
+ import { nockInstance, assertNockRequest, mockForemanAutocomplete } from '../../../../../test-utils/nockWrapper';
5
+ import { foremanApi } from '../../../../../services/api';
6
+ import { HOST_DEBS_KEY, PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from '../DebsTab/HostDebsConstants';
7
+ import { DebsTab } from '../DebsTab/DebsTab.js';
8
+ import mockDebsData from './debs.fixtures.json';
9
+ import { REX_FEATURES } from '../RemoteExecutionConstants';
10
+
11
+ jest.mock('../../hostDetailsHelpers', () => ({
12
+ ...jest.requireActual('../../hostDetailsHelpers'),
13
+ userPermissionsFromHostDetails: () => ({
14
+ create_job_invocations: true,
15
+ edit_hosts: true,
16
+ }),
17
+ }));
18
+
19
+ const contentFacetAttributes = {
20
+ id: 11,
21
+ uuid: 'e5761ea3-4117-4ecf-83d0-b694f99b389e',
22
+ content_view_default: false,
23
+ lifecycle_environment_library: false,
24
+ };
25
+
26
+ const hostname = 'test-host.example.com';
27
+ const renderOptions = (facetAttributes = contentFacetAttributes) => ({
28
+ apiNamespace: HOST_DEBS_KEY,
29
+ initialState: {
30
+ API: {
31
+ HOST_DETAILS: {
32
+ response: {
33
+ id: 1,
34
+ name: hostname,
35
+ content_facet_attributes: { ...facetAttributes },
36
+ },
37
+ status: 'RESOLVED',
38
+ },
39
+ },
40
+ },
41
+ });
42
+
43
+ const hostDebs = foremanApi.getApiUrl('/hosts/1/debs');
44
+ const jobInvocations = foremanApi.getApiUrl('/job_invocations');
45
+ const autocompleteUrl = '/hosts/1/debs/auto_complete_search';
46
+
47
+ const defaultQueryWithoutSearch = {
48
+ include_latest_upgradable: true,
49
+ sort_by: 'name',
50
+ sort_order: 'asc',
51
+ per_page: 20,
52
+ page: 1,
53
+ };
54
+ const defaultQuery = { ...defaultQueryWithoutSearch, search: '' };
55
+
56
+ let firstDeb;
57
+ let secondDeb;
58
+
59
+ beforeEach(() => {
60
+ const { results } = mockDebsData;
61
+ [firstDeb, secondDeb] = results;
62
+ });
63
+
64
+ test('Can call API for packages and show on screen on page load', async (done) => {
65
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
66
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
67
+ const scope = nockInstance
68
+ .get(hostDebs)
69
+ .query(defaultQuery)
70
+ .reply(200, mockDebsData);
71
+
72
+ const { getAllByText } = renderWithRedux(<DebsTab />, renderOptions());
73
+
74
+ // Assert that the packages are now showing on the screen, but wait for them to appear.
75
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
76
+ // Assert request was made and completed, see helper function
77
+ assertNockRequest(autocompleteScope);
78
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
79
+ });
80
+
81
+ test('Can handle no packages being present', async (done) => {
82
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
83
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
84
+
85
+ const noResults = {
86
+ total: 0,
87
+ subtotal: 0,
88
+ page: 1,
89
+ per_page: 20,
90
+ results: [],
91
+ };
92
+
93
+ const scope = nockInstance
94
+ .get(hostDebs)
95
+ .query(defaultQuery)
96
+ .reply(200, noResults);
97
+
98
+ const { queryByText } = renderWithRedux(<DebsTab />, renderOptions());
99
+
100
+ // Assert that there are not any packages showing on the screen.
101
+ await patientlyWaitFor(() => expect(queryByText('This host does not have any packages.')).toBeInTheDocument());
102
+ // Assert request was made and completed, see helper function
103
+ assertNockRequest(autocompleteScope);
104
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
105
+ });
106
+
107
+ test('Can filter by package status', async (done) => {
108
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
109
+ const scope = nockInstance
110
+ .get(hostDebs)
111
+ .query(defaultQuery)
112
+ .reply(200, mockDebsData);
113
+
114
+ const scope2 = nockInstance
115
+ .get(hostDebs)
116
+ .query({ ...defaultQuery, status: 'upgradable' })
117
+ .reply(200, { ...mockDebsData, results: [firstDeb, secondDeb] });
118
+
119
+ const {
120
+ queryByText,
121
+ getByRole,
122
+ getAllByText,
123
+ getByText,
124
+ } = renderWithRedux(<DebsTab />, renderOptions());
125
+
126
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
127
+ // the Upgradable text in the table is just a text node, while the dropdown is a button
128
+ expect(getByText('Up-to date', { ignore: ['button', 'title'] })).toBeInTheDocument();
129
+ expect(getByText('libapt-pkg6.0', { ignore: ['button', 'title'] })).toBeInTheDocument();
130
+ expect(getByText('libmagic1', { ignore: ['button', 'title'] })).toBeInTheDocument();
131
+ expect(getByText('libacl1', { ignore: ['button', 'title'] })).toBeInTheDocument();
132
+
133
+ const statusDropdown = queryByText('Status', { ignore: 'th' });
134
+ expect(statusDropdown).toBeInTheDocument();
135
+ fireEvent.click(statusDropdown);
136
+ const upgradable = getByRole('option', { name: 'select Upgradable' });
137
+ fireEvent.click(upgradable);
138
+ await patientlyWaitFor(() => {
139
+ expect(queryByText('libmagic1')).toBeInTheDocument();
140
+ expect(queryByText('libapt-pkg6.0')).toBeInTheDocument();
141
+ expect(queryByText('libacl1')).not.toBeInTheDocument();
142
+ });
143
+
144
+ assertNockRequest(autocompleteScope);
145
+ assertNockRequest(scope);
146
+ assertNockRequest(scope2, done); // Pass jest callback to confirm test is done
147
+ });
148
+
149
+ test('Can upgrade a package via remote execution', async (done) => {
150
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
151
+
152
+ const scope = nockInstance
153
+ .get(hostDebs)
154
+ .query(defaultQuery)
155
+ .reply(200, mockDebsData);
156
+
157
+ const statusScope = nockInstance
158
+ .get(hostDebs)
159
+ .query({ ...defaultQuery, status: 'upgradable' })
160
+ .reply(200, { ...mockDebsData, results: [firstDeb, secondDeb] });
161
+
162
+ const upgradeScope = nockInstance
163
+ .post(jobInvocations, {
164
+ job_invocation: {
165
+ inputs: {
166
+ package: firstDeb.name,
167
+ },
168
+ search_query: `name ^ (${hostname})`,
169
+ feature: REX_FEATURES.KATELLO_PACKAGE_UPDATE,
170
+ },
171
+ })
172
+ .reply(201);
173
+
174
+ const {
175
+ getByRole,
176
+ getAllByText,
177
+ getAllByLabelText,
178
+ getByText,
179
+ } = renderWithRedux(<DebsTab />, renderOptions());
180
+
181
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
182
+
183
+ const statusDropdown = getByText('Status', { ignore: 'th' });
184
+ expect(statusDropdown).toBeInTheDocument();
185
+ fireEvent.click(statusDropdown);
186
+ const upgradable = getByRole('option', { name: 'select Upgradable' });
187
+ fireEvent.click(upgradable);
188
+ await patientlyWaitFor(() => {
189
+ expect(getByText('libmagic1')).toBeInTheDocument();
190
+ expect(getByText('libapt-pkg6.0')).toBeInTheDocument();
191
+ });
192
+
193
+ const kebabDropdown = getAllByLabelText('Actions');
194
+ kebabDropdown[0].click();
195
+
196
+ const rexAction = getByText('Upgrade via remote execution');
197
+ await patientlyWaitFor(() => expect(rexAction).toBeInTheDocument());
198
+ fireEvent.click(rexAction);
199
+
200
+ assertNockRequest(autocompleteScope);
201
+ assertNockRequest(scope);
202
+ assertNockRequest(statusScope);
203
+ assertNockRequest(upgradeScope, done);
204
+ });
205
+
206
+ test('Can upgrade a package via customized remote execution', async (done) => {
207
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
208
+
209
+ const scope = nockInstance
210
+ .get(hostDebs)
211
+ .query(defaultQuery)
212
+ .reply(200, mockDebsData);
213
+
214
+ const statusScope = nockInstance
215
+ .get(hostDebs)
216
+ .query({ ...defaultQuery, status: 'upgradable' })
217
+ .reply(200, { ...mockDebsData, results: [firstDeb, secondDeb] });
218
+
219
+ const {
220
+ getByRole,
221
+ getAllByText,
222
+ getAllByLabelText,
223
+ getByText,
224
+ } = renderWithRedux(<DebsTab />, renderOptions());
225
+
226
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
227
+
228
+ const statusDropdown = getByText('Status', { ignore: 'th' });
229
+ expect(statusDropdown).toBeInTheDocument();
230
+ fireEvent.click(statusDropdown);
231
+ const upgradable = getByRole('option', { name: 'select Upgradable' });
232
+ fireEvent.click(upgradable);
233
+ await patientlyWaitFor(() => {
234
+ expect(getByText('libapt-pkg6.0')).toBeInTheDocument();
235
+ expect(getByText('libmagic1')).toBeInTheDocument();
236
+ });
237
+
238
+ const kebabDropdown = getAllByLabelText('Actions');
239
+ kebabDropdown[0].click();
240
+
241
+ const rexAction = getByText('Upgrade via customized remote execution');
242
+ const feature = REX_FEATURES.KATELLO_PACKAGE_UPDATE;
243
+ const packageName = firstDeb.name;
244
+
245
+ expect(rexAction).toBeInTheDocument();
246
+ expect(rexAction).toHaveAttribute(
247
+ 'href',
248
+ `/job_invocations/new?feature=${feature}&search=name%20%5E%20(${hostname})&inputs%5Bpackage%5D=${packageName}`,
249
+ );
250
+
251
+ fireEvent.click(rexAction);
252
+
253
+ assertNockRequest(autocompleteScope);
254
+ assertNockRequest(scope);
255
+ assertNockRequest(statusScope, done);
256
+ });
257
+
258
+ test('Can bulk upgrade via remote execution', async (done) => {
259
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
260
+
261
+ const scope = nockInstance
262
+ .get(hostDebs)
263
+ .query(defaultQuery)
264
+ .reply(200, mockDebsData);
265
+
266
+ const upgradeScope = nockInstance
267
+ .post(jobInvocations, {
268
+ job_invocation: {
269
+ inputs: {
270
+ [PACKAGES_SEARCH_QUERY]: `id ^ (${firstDeb.id},${secondDeb.id})`,
271
+ [SELECTED_UPDATE_VERSIONS]: JSON.stringify([]),
272
+ },
273
+ search_query: `name ^ (${hostname})`,
274
+ feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
275
+ },
276
+ })
277
+ .reply(201);
278
+
279
+ const {
280
+ getAllByRole,
281
+ getAllByText,
282
+ getByRole,
283
+ getByLabelText,
284
+ } = renderWithRedux(<DebsTab />, renderOptions());
285
+
286
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
287
+
288
+ getByRole('checkbox', { name: 'Select row 0' }).click();
289
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
290
+ getByRole('checkbox', { name: 'Select row 1' }).click();
291
+ expect(getByLabelText('Select row 1').checked).toEqual(true);
292
+
293
+ const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
294
+ fireEvent.click(upgradeDropdown);
295
+
296
+ const rexAction = getByLabelText('bulk_upgrade_rex');
297
+ expect(rexAction).toBeInTheDocument();
298
+ fireEvent.click(rexAction);
299
+
300
+ assertNockRequest(autocompleteScope);
301
+ assertNockRequest(scope);
302
+ assertNockRequest(upgradeScope, done);
303
+ });
304
+
305
+ test('Can bulk upgrade via customized remote execution', async (done) => {
306
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
307
+
308
+ const scope = nockInstance
309
+ .get(hostDebs)
310
+ .query(defaultQuery)
311
+ .reply(200, mockDebsData);
312
+
313
+ const {
314
+ getAllByRole,
315
+ getAllByText,
316
+ getByRole,
317
+ getByLabelText,
318
+ } = renderWithRedux(<DebsTab />, renderOptions());
319
+
320
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
321
+
322
+ const feature = REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH;
323
+ const packages = `${firstDeb.id},${secondDeb.id}`;
324
+ const job =
325
+ `/job_invocations/new?feature=${feature}&search=name%20%5E%20(${hostname})&inputs%5BPackages%20search%20query%5D=id%20%5E%20(${packages})&inputs%5BSelected%20update%20versions%5D=%5B%5D`;
326
+
327
+ getByRole('checkbox', { name: 'Select row 0' }).click();
328
+ expect(getByLabelText('Select row 0').checked).toEqual(true);
329
+ getByRole('checkbox', { name: 'Select row 1' }).click();
330
+ expect(getByLabelText('Select row 1').checked).toEqual(true);
331
+
332
+ const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
333
+ fireEvent.click(upgradeDropdown);
334
+ expect(upgradeDropdown).not.toHaveAttribute('disabled');
335
+
336
+ const rexAction = getByLabelText('bulk_upgrade_customized_rex');
337
+ expect(rexAction).toBeInTheDocument();
338
+ expect(rexAction).toHaveAttribute('href', job);
339
+
340
+ assertNockRequest(autocompleteScope);
341
+ assertNockRequest(scope, done);
342
+ });
343
+
344
+ test('Upgrade is disabled when there are non-upgradable packages selected', async (done) => {
345
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
346
+
347
+ const scope = nockInstance
348
+ .get(hostDebs)
349
+ .query(defaultQuery)
350
+ .reply(200, mockDebsData);
351
+
352
+ const {
353
+ getAllByRole,
354
+ getAllByText,
355
+ getByLabelText,
356
+ getByRole,
357
+ } = renderWithRedux(<DebsTab />, renderOptions());
358
+
359
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
360
+
361
+ // select an upgradable package
362
+ getByRole('checkbox', { name: 'Select row 0' }).click();
363
+ // select an up-to-date package
364
+ getByRole('checkbox', { name: 'Select row 2' }).click();
365
+ expect(getByLabelText('Select row 2').checked).toEqual(true);
366
+
367
+ const upgradeDropdown = getAllByRole('button', { name: 'Select' })[1];
368
+ expect(upgradeDropdown).toHaveAttribute('disabled');
369
+
370
+ assertNockRequest(autocompleteScope);
371
+ assertNockRequest(scope, done);
372
+ });
373
+
374
+ test('Remove is disabled when in select all mode', async (done) => {
375
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
376
+ const scope = nockInstance
377
+ .get(hostDebs)
378
+ .query(defaultQuery)
379
+ .reply(200, mockDebsData);
380
+
381
+ const {
382
+ getAllByText, getByRole,
383
+ } = renderWithRedux(<DebsTab />, renderOptions());
384
+
385
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
386
+
387
+ // find and click the select all checkbox
388
+ const selectAllCheckbox = getByRole('checkbox', { name: 'Select all' });
389
+ fireEvent.click(selectAllCheckbox);
390
+ getByRole('button', { name: 'bulk_actions' }).click();
391
+
392
+ const removeButton = getByRole('menuitem', { name: 'bulk_remove' });
393
+ await patientlyWaitFor(() => expect(removeButton).toBeInTheDocument());
394
+ expect(removeButton).toHaveAttribute('aria-disabled', 'true');
395
+
396
+ assertNockRequest(autocompleteScope);
397
+ assertNockRequest(scope, done);
398
+ });
399
+
400
+ test('Sets initial search query from url params', async (done) => {
401
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
402
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
403
+ const scope = nockInstance
404
+ .get(hostDebs)
405
+ .query({ ...defaultQuery, search: `name=${firstDeb.name}` })
406
+ .reply(200, { ...mockDebsData, results: [firstDeb] });
407
+
408
+ jest.spyOn(hooks, 'useUrlParams').mockImplementation(() => ({
409
+ searchParam: `name=${firstDeb.name}`,
410
+ }));
411
+
412
+ const { getAllByText, queryByText } = renderWithRedux(<DebsTab />, renderOptions());
413
+
414
+ await patientlyWaitFor(() => expect(getAllByText(firstDeb.name)[0]).toBeInTheDocument());
415
+ expect(queryByText(secondDeb.name)).not.toBeInTheDocument();
416
+
417
+ assertNockRequest(autocompleteScope);
418
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
419
+ });
420
+
@@ -0,0 +1,63 @@
1
+ {
2
+ "total": 18,
3
+ "subtotal": 3,
4
+ "selectable": 3,
5
+ "page": "1",
6
+ "per_page": "20",
7
+ "error": null,
8
+ "search": null,
9
+ "sort": {
10
+ "by": null,
11
+ "order": null
12
+ },
13
+ "results": [
14
+ {
15
+ "id": 32376,
16
+ "pulp_id": "/pulp/api/v3/content/deb/packages/4b817f2d-d428-4eb4-aa4c-6cd9dc2a0300/",
17
+ "name": "cheetah",
18
+ "version": "0.3",
19
+ "architecture": "noarch",
20
+ "epoch": "0",
21
+ "summary": "A dummy package of cheetah",
22
+ "modular": false,
23
+ "filename": "cheetah-0.3-0.8.noarch.deb",
24
+ "sourcedeb": "cheetah-0.3-0.8.src.deb",
25
+ "checksum": "422d0baa0cd9d7713ae796e886a23e17f578f924f74880debdbb7d65fb368dae",
26
+ "uuid": "/pulp/api/v3/content/deb/packages/4b817f2d-d428-4eb4-aa4c-6cd9dc2a0300/",
27
+ "hosts_available_count": 0,
28
+ "hosts_applicable_count": 0
29
+ },
30
+ {
31
+ "id": 32372,
32
+ "pulp_id": "/pulp/api/v3/content/deb/packages/c7aee0d3-32d9-49dd-99f9-9269fae7cb6f/",
33
+ "name": "duck",
34
+ "version": "0.7",
35
+ "architecture": "noarch",
36
+ "epoch": "0",
37
+ "summary": "Quack like a duck at the park.",
38
+ "modular": true,
39
+ "filename": "duck-0.7-1.noarch.deb",
40
+ "sourcedeb": "duck-0.7-1.src.deb",
41
+ "checksum": "5bd363b860ad6783217cbca3bbc3ef260f98d140ffb121bf4c208e3f66c24712",
42
+ "uuid": "/pulp/api/v3/content/deb/packages/c7aee0d3-32d9-49dd-99f9-9269fae7cb6f/",
43
+ "hosts_available_count": 0,
44
+ "hosts_applicable_count": 0
45
+ },
46
+ {
47
+ "id": 32370,
48
+ "pulp_id": "/pulp/api/v3/content/deb/packages/0e9309fd-1a4a-4799-bb49-f3919531b575/",
49
+ "name": "elephant",
50
+ "version": "0.3",
51
+ "architecture": "noarch",
52
+ "epoch": "0",
53
+ "summary": "A dummy package of elephant",
54
+ "modular": false,
55
+ "filename": "elephant-0.3-0.8.noarch.deb",
56
+ "sourcedeb": "elephant-0.3-0.8.src.deb",
57
+ "checksum": "3e1c70cd1b421328acaf6397cb3d16145306bb95f65d1b095fc31372a0a701f3",
58
+ "uuid": "/pulp/api/v3/content/deb/packages/0e9309fd-1a4a-4799-bb49-f3919531b575/",
59
+ "hosts_available_count": 0,
60
+ "hosts_applicable_count": 0
61
+ }
62
+ ]
63
+ }
@@ -39,6 +39,16 @@
39
39
  "host_id": 1,
40
40
  "host": "centos7.katello.lan",
41
41
  "reboot_required": false
42
- }
42
+ },
43
+ {
44
+ "id": 4,
45
+ "application": "dbus",
46
+ "helper": "You will have to reboot your computer",
47
+ "restart_command": "reboot",
48
+ "app_type": "static",
49
+ "host_id": 1,
50
+ "host": "centos7.katello.lan",
51
+ "reboot_required": true
52
+ }
43
53
  ]
44
54
  }
@@ -140,9 +140,69 @@ describe('With tracer installed', () => {
140
140
  assertNockRequest(scope, done);
141
141
  });
142
142
 
143
+ test('Warns you when one of the selected traces requires reboot', async (done) => {
144
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
145
+
146
+ const scope = nockInstance
147
+ .get(hostTraces)
148
+ .query(true)
149
+ .reply(200, mockTraceData);
150
+
151
+ const { getByLabelText, queryByText } = renderWithRedux(
152
+ <TracesTab />,
153
+ renderOptions(true),
154
+ );
155
+
156
+ let traceCheckbox;
157
+ // Find the trace checkbox.
158
+ await patientlyWaitFor(() => {
159
+ traceCheckbox = getByLabelText('Select row 3'); // this should be dbus, our static trace
160
+ });
161
+ fireEvent.click(traceCheckbox);
162
+ expect(traceCheckbox.checked).toEqual(true);
163
+
164
+ await patientlyWaitFor(() => {
165
+ expect(queryByText('1 selected')).toBeInTheDocument();
166
+ expect(queryByText('Reboot host')).toBeInTheDocument();
167
+ expect(queryByText('At least one of the selected items requires the host to reboot')).toBeInTheDocument();
168
+ });
169
+ assertNockRequest(autocompleteScope);
170
+ assertNockRequest(scope, done);
171
+ });
172
+
173
+ test('Warns about reboot when using select all', async (done) => {
174
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
175
+
176
+ const scope = nockInstance
177
+ .get(hostTraces)
178
+ .query(true)
179
+ .reply(200, mockTraceData);
180
+
181
+ const { getByLabelText, queryByText } = renderWithRedux(
182
+ <TracesTab />,
183
+ renderOptions(true),
184
+ );
185
+
186
+ let traceCheckbox;
187
+ // Find the trace checkbox.
188
+ await patientlyWaitFor(() => {
189
+ traceCheckbox = getByLabelText('Select all');
190
+ });
191
+ fireEvent.click(traceCheckbox);
192
+ expect(traceCheckbox.checked).toEqual(true);
193
+
194
+ await patientlyWaitFor(() => {
195
+ expect(queryByText('20 selected')).toBeInTheDocument();
196
+ expect(queryByText('Reboot host')).toBeInTheDocument();
197
+ expect(queryByText('At least one of the selected items requires the host to reboot')).toBeInTheDocument();
198
+ });
199
+ assertNockRequest(autocompleteScope);
200
+ assertNockRequest(scope, done);
201
+ });
202
+
143
203
  test('Can bulk restart traces via remote execution', async (done) => {
144
- // This is the same test as above,
145
- // but using the table action bar instead of the Restart app button
204
+ // This is the same test as 'Can bulk restart traces via Restart App button',
205
+ // but using the table action bar instead
146
206
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
147
207
 
148
208
  const scope = nockInstance
@@ -214,7 +274,7 @@ describe('With tracer installed', () => {
214
274
  fireEvent.click(getByLabelText('Select row 0')); // de select
215
275
  fireEvent.click(getByLabelText('Select row 2')); // de select
216
276
 
217
- fireEvent.click(getByText('Restart app'));
277
+ fireEvent.click(getByText('Reboot host'));
218
278
 
219
279
  assertNockRequest(autocompleteScope);
220
280
  assertNockRequest(resolveTracesScope);
@@ -9,6 +9,7 @@ const MODULE_STREAMS_KEY = 'MODULE_STREAMS';
9
9
  const DEB_PACKAGES_KEY = 'DEB_PACKAGES';
10
10
  const DOCKER_TAGS_KEY = 'DOCKER_TAGS';
11
11
  const FILES_KEY = 'FILES';
12
+ const CONTAINER_MANIFEST_LISTS_KEY = 'CONTAINER_MANIFEST_LISTS';
12
13
  export const CREATE_CONTENT_VIEW_KEY = 'CONTENT_VIEW_CREATE';
13
14
  export const COPY_CONTENT_VIEW_KEY = 'CONTENT_VIEW_COPY';
14
15
  export const CREATE_CONTENT_VIEW_FILTER_KEY = 'CONTENT_VIEW_FILTER_CREATE';
@@ -31,6 +32,7 @@ export const RPM_PACKAGE_GROUPS_CONTENT = 'RPM_PACKAGE_GROUPS_CONTENT';
31
32
  export const REPOSITORY_CONTENT = 'REPOSITORY_CONTENT';
32
33
  export const ERRATA_CONTENT = 'ERRATA_CONTENT';
33
34
  export const DOCKER_TAGS_CONTENT = 'DOCKER_TAGS_CONTENT';
35
+ export const CONTAINER_MANIFEST_LIST_CONTENT = 'CONTAINER_MANIFEST_LIST_CONTENT';
34
36
  export const MODULE_STREAMS_CONTENT = 'MODULE_STREAMS_CONTENT';
35
37
  export const DEB_PACKAGES_CONTENT = 'DEB_PACKAGES_CONTENT';
36
38
  export const RPM_PACKAGES_CONTENT = 'RPM_PACKAGES_CONTENT';
@@ -72,6 +74,7 @@ export const cvErrataCompareKey = (versionOne, versionTwo, viewBy) => `${ERRATA_
72
74
  export const cvModuleStreamsCompareKey = (versionOne, versionTwo, viewBy) => `${MODULE_STREAMS_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
73
75
  export const cvDebPackagesCompareKey = (versionOne, versionTwo, viewBy) => `${DEB_PACKAGES_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
74
76
  export const cvDockerTagsCompareKey = (versionOne, versionTwo, viewBy) => `${DOCKER_TAGS_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
77
+ export const cvContainerManifestListsCompareKey = (versionOne, versionTwo, viewBy) => `${CONTAINER_MANIFEST_LISTS_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
75
78
  export const filesCompareKey = (versionOne, versionTwo, viewBy) => `${FILES_KEY}_COMPARE_${versionOne}_${versionTwo}_VIEW_BY_${toUpper(viewBy)}`;
76
79
  // Repo added to content view status display and key
77
80
  export const ADDED = __('Added');
@@ -77,18 +77,6 @@
77
77
  "build_status_label": "Installed",
78
78
  "errata_status": 0,
79
79
  "errata_status_label": "All errata applied",
80
- "subscription_status": 5,
81
- "subscription_status_label": "Simple Content Access",
82
- "purpose_sla_status": 0,
83
- "purpose_sla_status_label": "Unknown",
84
- "purpose_role_status": 0,
85
- "purpose_role_status_label": "Unknown",
86
- "purpose_usage_status": 0,
87
- "purpose_usage_status_label": "Unknown",
88
- "purpose_addons_status": 0,
89
- "purpose_addons_status_label": "Unknown",
90
- "purpose_status": 0,
91
- "purpose_status_label": "Unknown",
92
80
  "name": "affectedHost.example.com",
93
81
  "id": 1,
94
82
  "puppet_proxy_id": null,
@@ -134,7 +122,6 @@
134
122
  "content_source": null,
135
123
  "kickstart_repository": null
136
124
  },
137
- "subscription_global_status": 0,
138
125
  "subscription_facet_attributes": {
139
126
  "id": 2,
140
127
  "uuid": "457997e1-ac07-40e4-85b7-e382a3563e4a",
@@ -47,6 +47,7 @@ import {
47
47
  MODULE_STREAMS_CONTENT,
48
48
  DEB_PACKAGES_CONTENT,
49
49
  DOCKER_TAGS_CONTENT,
50
+ CONTAINER_MANIFEST_LIST_CONTENT,
50
51
  generatedContentKey,
51
52
  STATUS_TRANSLATIONS_ENUM,
52
53
  bulkRemoveVersionKey,
@@ -58,7 +59,7 @@ import {
58
59
  cvDebPackagesCompareKey,
59
60
  filesCompareKey,
60
61
  genericContentCompareKey,
61
- cvRepositoriesCompareKey,
62
+ cvRepositoriesCompareKey, cvContainerManifestListsCompareKey,
62
63
  } from '../ContentViewsConstants';
63
64
  import api, { foremanApi, orgId } from '../../../services/api';
64
65
  import { getResponseErrorMsgs } from '../../../utils/helpers';
@@ -179,6 +180,19 @@ export const getDockerTagsComparison = (versionOne, versionTwo, viewBy, params)
179
180
  });
180
181
  };
181
182
 
183
+ export const getContainerManifestListsComparison = (versionOne, versionTwo, viewBy, params) => {
184
+ const versions = { content_view_version_ids: [versionOne, versionTwo] };
185
+ const restrictComparison = { restrict_comparison: viewBy };
186
+ const apiParams = { ...versions, ...restrictComparison, ...params };
187
+ const apiUrl = '/docker_manifest_lists/compare';
188
+ return get({
189
+ key: cvContainerManifestListsCompareKey(versionOne, versionTwo, viewBy),
190
+ params: apiParams,
191
+ errorToast: error => __(`Something went wrong while retrieving the container tags! ${getResponseErrorMsgs(error.response)}`),
192
+ url: api.getApiUrl(apiUrl),
193
+ });
194
+ };
195
+
182
196
  export const getFilesComparison = (versionOne, versionTwo, viewBy, params) => {
183
197
  const versions = { content_view_version_ids: [versionOne, versionTwo] };
184
198
  const restrictComparison = { restrict_comparison: viewBy };
@@ -268,6 +282,14 @@ export const getDockerTags = params => get({
268
282
  errorToast: error => __(`Something went wrong while getting container tags! ${getResponseErrorMsgs(error.response)}`),
269
283
  });
270
284
 
285
+ export const getContainerManifestLists = params => get({
286
+ type: API_OPERATIONS.GET,
287
+ key: CONTAINER_MANIFEST_LIST_CONTENT,
288
+ url: api.getApiUrl('/docker_manifest_lists'),
289
+ params,
290
+ errorToast: error => __(`Something went wrong while getting container manifest lists! ${getResponseErrorMsgs(error.response)}`),
291
+ });
292
+
271
293
  export const getErrata = params => get({
272
294
  type: API_OPERATIONS.GET,
273
295
  key: ERRATA_CONTENT,