katello 4.18.1 → 4.19.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (388) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/locale/bn/katello.js +379 -109
  3. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +379 -109
  4. data/app/assets/javascripts/katello/locale/ca/katello.js +379 -109
  5. data/app/assets/javascripts/katello/locale/cs/katello.js +380 -110
  6. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +382 -112
  7. data/app/assets/javascripts/katello/locale/de/katello.js +385 -115
  8. data/app/assets/javascripts/katello/locale/de_AT/katello.js +379 -109
  9. data/app/assets/javascripts/katello/locale/de_DE/katello.js +379 -109
  10. data/app/assets/javascripts/katello/locale/el/katello.js +380 -110
  11. data/app/assets/javascripts/katello/locale/en/katello.js +380 -110
  12. data/app/assets/javascripts/katello/locale/en_GB/katello.js +379 -109
  13. data/app/assets/javascripts/katello/locale/en_US/katello.js +379 -109
  14. data/app/assets/javascripts/katello/locale/es/katello.js +383 -113
  15. data/app/assets/javascripts/katello/locale/et_EE/katello.js +379 -109
  16. data/app/assets/javascripts/katello/locale/fr/katello.js +388 -118
  17. data/app/assets/javascripts/katello/locale/gl/katello.js +379 -109
  18. data/app/assets/javascripts/katello/locale/gu/katello.js +379 -109
  19. data/app/assets/javascripts/katello/locale/he_IL/katello.js +379 -109
  20. data/app/assets/javascripts/katello/locale/hi/katello.js +379 -109
  21. data/app/assets/javascripts/katello/locale/id/katello.js +379 -109
  22. data/app/assets/javascripts/katello/locale/it/katello.js +379 -109
  23. data/app/assets/javascripts/katello/locale/ja/katello.js +388 -118
  24. data/app/assets/javascripts/katello/locale/ka/katello.js +385 -115
  25. data/app/assets/javascripts/katello/locale/kn/katello.js +379 -109
  26. data/app/assets/javascripts/katello/locale/ko/katello.js +388 -118
  27. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +379 -109
  28. data/app/assets/javascripts/katello/locale/mr/katello.js +379 -109
  29. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +379 -109
  30. data/app/assets/javascripts/katello/locale/or/katello.js +379 -109
  31. data/app/assets/javascripts/katello/locale/pa/katello.js +379 -109
  32. data/app/assets/javascripts/katello/locale/pl/katello.js +379 -109
  33. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +379 -109
  34. data/app/assets/javascripts/katello/locale/pt/katello.js +379 -109
  35. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +383 -113
  36. data/app/assets/javascripts/katello/locale/ro/katello.js +379 -109
  37. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +379 -109
  38. data/app/assets/javascripts/katello/locale/ru/katello.js +381 -111
  39. data/app/assets/javascripts/katello/locale/sl/katello.js +379 -109
  40. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +379 -109
  41. data/app/assets/javascripts/katello/locale/ta/katello.js +379 -109
  42. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +379 -109
  43. data/app/assets/javascripts/katello/locale/te/katello.js +379 -109
  44. data/app/assets/javascripts/katello/locale/tr/katello.js +379 -109
  45. data/app/assets/javascripts/katello/locale/vi/katello.js +379 -109
  46. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +379 -109
  47. data/app/assets/javascripts/katello/locale/zh/katello.js +379 -109
  48. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +388 -118
  49. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +381 -111
  50. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +41 -12
  51. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -1
  52. data/app/controllers/katello/api/v2/activation_keys_controller.rb +3 -65
  53. data/app/controllers/katello/api/v2/content_view_filter_rules_controller.rb +1 -1
  54. data/app/controllers/katello/api/v2/content_views_controller.rb +18 -3
  55. data/app/controllers/katello/api/v2/debs_controller.rb +21 -11
  56. data/app/controllers/katello/api/v2/docker_tags_controller.rb +7 -0
  57. data/app/controllers/katello/api/v2/flatpak_remote_repositories_controller.rb +21 -19
  58. data/app/controllers/katello/api/v2/host_debs_controller.rb +16 -1
  59. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +3 -60
  60. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +10 -53
  61. data/app/controllers/katello/api/v2/repositories_controller.rb +0 -1
  62. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +10 -0
  63. data/app/controllers/katello/concerns/organizations_controller_extensions.rb +3 -0
  64. data/app/lib/actions/candlepin/activation_key/create.rb +0 -2
  65. data/app/lib/actions/candlepin/activation_key/update.rb +0 -2
  66. data/app/lib/actions/candlepin/product/content_create.rb +3 -5
  67. data/app/lib/actions/candlepin/product/content_update.rb +2 -3
  68. data/app/lib/actions/helpers/rolling_cv_repos.rb +1 -1
  69. data/app/lib/actions/katello/activation_key/create.rb +0 -1
  70. data/app/lib/actions/katello/activation_key/update.rb +0 -2
  71. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +1 -6
  72. data/app/lib/actions/katello/content_credential/update.rb +1 -1
  73. data/app/lib/actions/katello/content_view/add_rolling_repo_clone.rb +18 -24
  74. data/app/lib/actions/katello/content_view/create.rb +9 -4
  75. data/app/lib/actions/katello/content_view/refresh_rolling_repo.rb +6 -1
  76. data/app/lib/actions/katello/content_view/remove_rolling_repo_clone.rb +16 -11
  77. data/app/lib/actions/katello/content_view/update.rb +34 -7
  78. data/app/lib/actions/katello/product/content_create.rb +2 -2
  79. data/app/lib/actions/katello/product/content_destroy.rb +1 -1
  80. data/app/lib/actions/katello/repository/check_matching_content.rb +1 -1
  81. data/app/lib/actions/katello/repository/clone_contents.rb +1 -1
  82. data/app/lib/actions/katello/repository/create.rb +1 -1
  83. data/app/lib/actions/katello/repository/destroy.rb +4 -4
  84. data/app/lib/actions/katello/repository/finish_upload.rb +1 -1
  85. data/app/lib/actions/katello/repository/sync.rb +1 -1
  86. data/app/lib/actions/pulp3/orchestration/repository/copy_all_units.rb +2 -2
  87. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +1 -1
  88. data/app/lib/actions/pulp3/orchestration/repository/multi_copy_all_units.rb +1 -1
  89. data/app/lib/actions/pulp3/repository/save_publication.rb +3 -1
  90. data/app/lib/actions/pulp3/repository/save_version.rb +45 -24
  91. data/app/lib/actions/pulp3/repository/save_versions.rb +2 -1
  92. data/app/lib/katello/resources/candlepin/activation_key.rb +3 -4
  93. data/app/lib/katello/resources/candlepin/upstream_job.rb +9 -1
  94. data/app/lib/katello/resources/candlepin.rb +4 -0
  95. data/app/models/katello/authorization/repository.rb +17 -4
  96. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +0 -7
  97. data/app/models/katello/content_view_deb_filter.rb +10 -0
  98. data/app/models/katello/content_view_deb_filter_rule.rb +7 -0
  99. data/app/models/katello/deb.rb +10 -10
  100. data/app/models/katello/erratum.rb +1 -1
  101. data/app/models/katello/glue/provider.rb +14 -3
  102. data/app/models/katello/host/content_facet.rb +1 -1
  103. data/app/models/katello/host/subscription_facet.rb +1 -7
  104. data/app/models/katello/product_content.rb +2 -2
  105. data/app/models/katello/repository.rb +4 -23
  106. data/app/models/katello/root_repository.rb +2 -5
  107. data/app/services/katello/candlepin/event_handler.rb +0 -33
  108. data/app/services/katello/candlepin/message_handler.rb +0 -41
  109. data/app/services/katello/content_unit_indexer.rb +59 -13
  110. data/app/services/katello/product_content_finder.rb +5 -4
  111. data/app/services/katello/pulp3/alternate_content_source.rb +2 -2
  112. data/app/services/katello/pulp3/ansible_collection.rb +1 -0
  113. data/app/services/katello/pulp3/api/content_guard.rb +5 -5
  114. data/app/services/katello/pulp3/api/core.rb +10 -0
  115. data/app/services/katello/pulp3/deb.rb +1 -0
  116. data/app/services/katello/pulp3/docker_manifest.rb +1 -0
  117. data/app/services/katello/pulp3/docker_manifest_list.rb +1 -0
  118. data/app/services/katello/pulp3/docker_tag.rb +1 -0
  119. data/app/services/katello/pulp3/file_unit.rb +1 -0
  120. data/app/services/katello/pulp3/generic_content_unit.rb +1 -0
  121. data/app/services/katello/pulp3/module_stream.rb +1 -0
  122. data/app/services/katello/pulp3/package_group.rb +1 -0
  123. data/app/services/katello/pulp3/repository/apt.rb +41 -16
  124. data/app/services/katello/pulp3/repository.rb +59 -10
  125. data/app/services/katello/pulp3/rpm.rb +3 -2
  126. data/app/services/katello/pulp3/srpm.rb +3 -2
  127. data/app/services/katello/pulp3/task_group.rb +1 -1
  128. data/app/services/katello/registration_manager.rb +19 -17
  129. data/app/services/katello/repository_type_manager.rb +7 -5
  130. data/app/services/katello/smart_proxy_helper.rb +1 -6
  131. data/app/views/foreman/job_templates/upload_profile.erb +5 -0
  132. data/app/views/katello/api/v2/activation_keys/base.json.rabl +1 -1
  133. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  134. data/app/views/katello/api/v2/debs/thindex.json.rabl +6 -0
  135. data/app/views/katello/api/v2/docker_tags/_base.json.rabl +32 -0
  136. data/app/views/katello/api/v2/docker_tags/show.json.rabl +0 -5
  137. data/app/views/katello/api/v2/flatpak_remotes/index.json.rabl +6 -0
  138. data/app/views/katello/api/v2/host_debs/installed_debs.json.rabl +6 -0
  139. data/app/views/katello/api/v2/hosts_bulk_actions/applicable_errata.json.rabl +1 -1
  140. data/app/views/katello/api/v2/hosts_bulk_actions/applicable_erratum.json.rabl +9 -0
  141. data/app/views/katello/api/v2/hosts_bulk_actions/installable_errata.json.rabl +1 -1
  142. data/app/views/katello/api/v2/hosts_bulk_actions/{erratum.json.rabl → installable_erratum.json.rabl} +3 -3
  143. data/app/views/katello/api/v2/subscription_facet/base.json.rabl +1 -1
  144. data/config/initializers/monkeys.rb +1 -0
  145. data/config/routes/api/v2.rb +2 -2
  146. data/config/routes/overrides.rb +2 -7
  147. data/config/routes.rb +2 -0
  148. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +1 -1
  149. data/db/migrate/20250912000000_add_pulp_prn_fields.rb +73 -0
  150. data/db/migrate/20250912000001_populate_pulp_prn_fields.rb +403 -0
  151. data/db/migrate/20251009142516_remove_auto_attach_from_activation_keys.rb +5 -0
  152. data/db/migrate/20251009142517_remove_autoheal_from_subscription_facets.rb +5 -0
  153. data/db/seeds.d/111-upgrade_tasks.rb +2 -0
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn.po +10 -0
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn_IN.po +10 -0
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ca.po +10 -0
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/cs_CZ.po +10 -0
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +10 -0
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_AT.po +10 -0
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_DE.po +10 -0
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/el.po +12 -2
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_GB.po +10 -0
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_US.po +10 -0
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +10 -0
  165. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/et_EE.po +10 -0
  166. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +10 -0
  167. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gl.po +10 -0
  168. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gu.po +10 -0
  169. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/he_IL.po +10 -0
  170. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/hi.po +10 -0
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/id.po +10 -0
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +10 -0
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +10 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ka.po +10 -0
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/kn.po +10 -0
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +10 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ml_IN.po +10 -0
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/mr.po +10 -0
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/nl_NL.po +10 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/or.po +10 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pa.po +10 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl.po +10 -0
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl_PL.po +10 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt.po +10 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +10 -0
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro.po +10 -0
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro_RO.po +10 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +10 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sl.po +10 -0
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sv_SE.po +10 -0
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta.po +10 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta_IN.po +10 -0
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/te.po +10 -0
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/tr.po +10 -0
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi.po +10 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi_VN.po +10 -0
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh.po +10 -0
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +10 -0
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +10 -0
  200. data/lib/katello/permission_creator.rb +2 -2
  201. data/lib/katello/permissions/host_permissions.rb +0 -6
  202. data/lib/katello/plugin.rb +17 -8
  203. data/lib/katello/tasks/jenkins.rake +1 -1
  204. data/lib/katello/tasks/upgrades/4.19/enable_structured_apt_for_deb.rake +87 -0
  205. data/lib/katello/tasks/upgrades/4.19/populate_repository_version_prns.rake +32 -0
  206. data/lib/katello/version.rb +1 -1
  207. data/lib/monkeys/fix_rpm_repository_gpgcheck.rb +38 -0
  208. data/locale/action_names.rb +0 -6
  209. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  210. data/locale/bn/katello.po +379 -109
  211. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/bn_IN/katello.po +379 -109
  213. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  214. data/locale/ca/katello.po +379 -109
  215. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/cs/katello.po +380 -111
  217. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/cs_CZ/katello.po +382 -112
  219. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  220. data/locale/de/katello.po +386 -116
  221. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  222. data/locale/de_AT/katello.po +379 -109
  223. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/de_DE/katello.po +379 -109
  225. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  226. data/locale/el/katello.po +381 -111
  227. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/en/katello.po +380 -111
  229. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  230. data/locale/en_GB/katello.po +379 -109
  231. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  232. data/locale/en_US/katello.po +379 -109
  233. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/es/katello.po +383 -113
  235. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  236. data/locale/et_EE/katello.po +379 -109
  237. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  238. data/locale/fr/katello.po +389 -119
  239. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/gl/katello.po +379 -109
  241. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/gu/katello.po +379 -109
  243. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/he_IL/katello.po +379 -109
  245. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  246. data/locale/hi/katello.po +379 -109
  247. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  248. data/locale/id/katello.po +379 -109
  249. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/it/katello.po +379 -109
  251. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ja/katello.po +390 -119
  253. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  254. data/locale/ka/katello.po +385 -115
  255. data/locale/katello.pot +1273 -831
  256. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  257. data/locale/kn/katello.po +379 -109
  258. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/ko/katello.po +389 -119
  260. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/ml_IN/katello.po +379 -109
  262. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  263. data/locale/mr/katello.po +379 -109
  264. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  265. data/locale/nl_NL/katello.po +379 -109
  266. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/or/katello.po +379 -109
  268. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  269. data/locale/pa/katello.po +379 -109
  270. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/pl/katello.po +379 -109
  272. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  273. data/locale/pl_PL/katello.po +379 -109
  274. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  275. data/locale/pt/katello.po +379 -109
  276. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/pt_BR/katello.po +383 -113
  278. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  279. data/locale/ro/katello.po +379 -109
  280. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  281. data/locale/ro_RO/katello.po +379 -109
  282. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  283. data/locale/ru/katello.po +381 -111
  284. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  285. data/locale/sl/katello.po +379 -109
  286. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  287. data/locale/sv_SE/katello.po +379 -109
  288. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  289. data/locale/ta/katello.po +379 -109
  290. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  291. data/locale/ta_IN/katello.po +379 -109
  292. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  293. data/locale/te/katello.po +379 -109
  294. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  295. data/locale/tr/katello.po +379 -109
  296. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  297. data/locale/vi/katello.po +379 -109
  298. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  299. data/locale/vi_VN/katello.po +379 -109
  300. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  301. data/locale/zh/katello.po +379 -109
  302. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  303. data/locale/zh_CN/katello.po +389 -119
  304. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  305. data/locale/zh_TW/katello.po +381 -111
  306. data/webpack/ForemanColumnExtensions/index.js +46 -2
  307. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +2 -2
  308. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +0 -2
  309. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeEditModal.test.js +0 -2
  310. data/webpack/components/extensions/Hosts/ActionsBar/index.js +1 -0
  311. data/webpack/components/extensions/Hosts/BulkActions/BulkActionsConstants.js +7 -0
  312. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/BulkChangeHostCollectionsModal.js +388 -0
  313. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/__tests__/BulkChangeHostCollectionsModal.test.js +640 -0
  314. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/actions.js +28 -0
  315. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/index.js +71 -0
  316. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/02_BulkErrataTable.js +1 -1
  317. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/BulkErrataWizard.js +1 -1
  318. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/02_BulkPackagesTable.js +11 -4
  319. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +51 -24
  320. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/01_BulkRepositorySetsTable.js +1 -1
  321. data/webpack/components/extensions/Hosts/BulkActions/HostReview.js +8 -1
  322. data/webpack/containers/Application/config.js +11 -1
  323. data/webpack/global_index.js +3 -0
  324. data/webpack/scenes/{BootedContainerImages → ContainerImages/Booted}/BootedContainerImagesConstants.js +1 -1
  325. data/webpack/scenes/{BootedContainerImages → ContainerImages/Booted}/BootedContainerImagesPage.js +7 -43
  326. data/webpack/scenes/{BootedContainerImages → ContainerImages/Booted}/__tests__/bootedContainerImagesPage.test.js +1 -1
  327. data/webpack/scenes/ContainerImages/ContainerImagesPage.js +86 -0
  328. data/webpack/scenes/ContainerImages/LabelsAnnotationsModal.js +105 -0
  329. data/webpack/scenes/ContainerImages/Synced/Details/ManifestDetails.js +218 -0
  330. data/webpack/scenes/ContainerImages/Synced/Details/ManifestDetailsActions.js +15 -0
  331. data/webpack/scenes/ContainerImages/Synced/Details/ManifestDetailsSelectors.js +16 -0
  332. data/webpack/scenes/ContainerImages/Synced/Details/__tests__/ManifestDetails.test.js +395 -0
  333. data/webpack/scenes/ContainerImages/Synced/Details/__tests__/manifestDetails.fixtures.json +43 -0
  334. data/webpack/scenes/ContainerImages/Synced/Details/__tests__/manifestList.fixtures.json +58 -0
  335. data/webpack/scenes/ContainerImages/Synced/Details/index.js +4 -0
  336. data/webpack/scenes/ContainerImages/Synced/SyncedContainerImagesPage.js +359 -0
  337. data/webpack/scenes/ContainerImages/Synced/SyncedContainerImagesPage.scss +21 -0
  338. data/webpack/scenes/ContainerImages/Synced/__tests__/LabelsAnnotationsModal.test.js +69 -0
  339. data/webpack/scenes/ContainerImages/Synced/__tests__/SyncedContainerImagesPage.test.js +335 -0
  340. data/webpack/scenes/ContainerImages/Synced/__tests__/syncedContainerImages.fixtures.json +105 -0
  341. data/webpack/scenes/ContainerImages/TableEmptyState.js +67 -0
  342. data/webpack/scenes/ContainerImages/containerImagesHelpers.js +48 -0
  343. data/webpack/scenes/ContainerImages/index.js +4 -0
  344. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +29 -3
  345. data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +1 -0
  346. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +45 -1
  347. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +0 -1
  348. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +59 -1
  349. data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +1 -0
  350. data/webpack/scenes/ContentViews/Details/Filters/Rules/DebPackage/AddEditDebPackageRuleModal.js +164 -24
  351. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVDebFilterContent.test.js +268 -0
  352. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvDebFilterDetail.fixtures.json +95 -0
  353. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvDebFilterRules.fixtures.json +31 -0
  354. data/webpack/scenes/ContentViews/Details/Filters/__tests__/emptyCVDebFilterRules.fixtures.json +10 -0
  355. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +0 -1
  356. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +0 -1
  357. data/webpack/scenes/ContentViews/Details/__tests__/contentViewRollingDetail.test.js +15 -0
  358. data/webpack/scenes/ContentViews/Details/__tests__/contentViewRollingDetails.fixtures.json +1 -0
  359. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +9 -0
  360. data/webpack/scenes/FlatpakRemotes/CreateEdit/CreateFlatpakRemoteModal.js +5 -3
  361. data/webpack/scenes/FlatpakRemotes/CreateEdit/EditFlatpakRemotesModal.js +1 -1
  362. data/webpack/scenes/FlatpakRemotes/CreateEdit/FlatpakRemoteform.js +35 -3
  363. data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetails.js +1 -1
  364. data/webpack/scenes/FlatpakRemotes/Details/RemoteRepositories/RemoteRepositoriesTable.css +3 -0
  365. data/webpack/scenes/FlatpakRemotes/Details/RemoteRepositories/RemoteRepositoriesTable.js +63 -132
  366. data/webpack/scenes/FlatpakRemotes/FlatpakRemotesPage.js +67 -143
  367. data/webpack/scenes/SmartProxy/ExpandableCvDetails.js +10 -2
  368. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +13 -2
  369. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -0
  370. data/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js +8 -2
  371. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +67 -1
  372. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +2 -2
  373. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +0 -2
  374. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +15 -5
  375. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +22 -5
  376. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +141 -0
  377. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +2 -2
  378. metadata +82 -56
  379. data/app/lib/actions/katello/host/attach_subscriptions.rb +0 -59
  380. data/app/lib/actions/katello/host/auto_attach_subscriptions.rb +0 -22
  381. data/app/lib/actions/katello/host/remove_subscriptions.rb +0 -50
  382. data/app/lib/actions/katello/organization/simple_content_access/disable.rb +0 -25
  383. data/app/lib/actions/katello/organization/simple_content_access/enable.rb +0 -25
  384. data/app/lib/actions/katello/organization/simple_content_access/toggle.rb +0 -42
  385. data/lib/katello/tasks/migrate_structure_content_for_deb.rake +0 -105
  386. data/lib/katello/tasks/upgrades/4.2/remove_checksum_values.rake +0 -17
  387. /data/webpack/scenes/{BootedContainerImages → ContainerImages/Booted}/__tests__/bootedContainerImages.fixtures.js +0 -0
  388. /data/webpack/scenes/{BootedContainerImages → ContainerImages/Booted}/index.js +0 -0
@@ -7,6 +7,7 @@ module Katello
7
7
  skip_before_action :authorize
8
8
  before_action :optional_authorize, only: [:token, :catalog]
9
9
  before_action :registry_authorize, except: [:token, :v1_search, :catalog, :static_index]
10
+ before_action :static_index_authorize, only: [:static_index]
10
11
  before_action :authorize_repository_read, only: [:pull_manifest, :tags_list, :check_blob, :pull_blob]
11
12
  before_action :container_push_prop_validation, only: [:start_upload_blob, :upload_blob, :finish_upload_blob, :push_manifest]
12
13
  before_action :create_container_repo_if_needed, only: [:start_upload_blob, :upload_blob, :finish_upload_blob, :push_manifest]
@@ -63,7 +64,7 @@ module Katello
63
64
  "scope=\"repository:registry:pull,push\""
64
65
  end
65
66
 
66
- def set_user_by_token(token, redirect_on_failure = true)
67
+ def authenticate_from_request(token, redirect_on_failure = true)
67
68
  if token
68
69
  token_type, token = token.split
69
70
  if token_type == 'Bearer' && token
@@ -94,7 +95,7 @@ module Katello
94
95
  if @repository && (@repository.environment.registry_unauthenticated_pull || ssl_client_authorized?(@repository.organization.label))
95
96
  true
96
97
  elsif params['action'] == 'catalog'
97
- set_user_by_token(request.headers['Authorization'], false)
98
+ authenticate_from_request(request.headers['Authorization'], false)
98
99
  elsif (params['action'] == 'token' && params['scope'].blank? && params['account'].blank?)
99
100
  true
100
101
  else
@@ -106,13 +107,26 @@ module Katello
106
107
  @repository = find_readable_repository
107
108
  return true if ['GET', 'HEAD'].include?(request.method) && @repository && !require_user_authorization?
108
109
 
109
- is_user_set = set_user_by_token(request.headers['Authorization'])
110
+ return true if authenticate_from_request(request.headers['Authorization'])
110
111
 
111
- return true if is_user_set
112
+ unauthorized
113
+ end
112
114
 
115
+ def static_index_authorize
116
+ authenticate_from_request(request.headers['Authorization'])
117
+ find_host_by_ip unless @host
118
+ true
119
+ end
120
+
121
+ def find_host_by_ip
122
+ host_ip = request.remote_ip
123
+ @host = ::Host.joins(:primary_interface).where("nics.ip = :host_ip OR nics.ip6 = :host_ip", host_ip: host_ip)&.first
124
+ end
125
+
126
+ def unauthorized
113
127
  redirect_authorization_headers
114
128
  render_error('unauthorized', :status => :unauthorized)
115
- return false
129
+ false
116
130
  end
117
131
 
118
132
  def container_push_prop_validation(props = nil)
@@ -416,7 +430,12 @@ module Katello
416
430
  )
417
431
  end
418
432
 
419
- instance_repo.update!(version_href: latest_version_href)
433
+ # Fetch version PRN from Pulp API
434
+ # FIXME: Remove this workaround when https://github.com/pulp/pulpcore/issues/7008 is resolved
435
+ version_response = pulp_api.repository_versions_api.read(latest_version_href, {fields: 'prn'})
436
+ latest_version_prn = version_response&.prn
437
+
438
+ instance_repo.update!(version_href: latest_version_href, version_prn: latest_version_prn)
420
439
  # The Pulp repository should not change after first creation
421
440
  if root_repository.repository_references.empty?
422
441
  ::Katello::Pulp3::RepositoryReference.where(root_repository_id: instance_repo.root_id,
@@ -432,6 +451,7 @@ module Katello
432
451
  instance_repo = root_repository&.library_instance
433
452
  distribution_api_response = pulp_api.container_push_distribution_for_repository(pulp_repo_href)
434
453
  pulp_distribution_href = distribution_api_response&.pulp_href
454
+ pulp_distribution_prn = distribution_api_response&.prn
435
455
 
436
456
  if pulp_distribution_href.empty?
437
457
  return render_podman_error(
@@ -445,11 +465,12 @@ module Katello
445
465
  repository_id: instance_repo.id).first
446
466
  if dist
447
467
  if dist.href != pulp_distribution_href
448
- dist.update(href: pulp_distribution_href)
468
+ dist.update(href: pulp_distribution_href, prn: pulp_distribution_prn)
449
469
  end
450
470
  else
451
471
  ::Katello::Pulp3::DistributionReference.create!(path: @container_path_input,
452
472
  href: pulp_distribution_href,
473
+ prn: pulp_distribution_prn,
453
474
  repository_id: instance_repo.id)
454
475
  end
455
476
  end
@@ -851,12 +872,20 @@ module Katello
851
872
  end
852
873
 
853
874
  def static_index
854
- host_ip = request.remote_ip
855
- @host ||= ::Host.joins(:primary_interface).where("nics.ip = :host_ip OR nics.ip6 = :host_ip", host_ip: host_ip)&.first
856
- flatpak_index = (redirect_client { Resources::Registry::Proxy.get(@_request.fullpath, headers) })
857
- flatpak_index_json = JSON.parse(flatpak_index)
858
875
  repos = Repository.readable_docker_catalog(@host)
859
- available_container_repo_names = repos.map(&:container_repository_name)
876
+ return render json: { 'Registry' => request_url, 'Results' => [] } if repos.empty?
877
+
878
+ available_container_repo_names = repos.map(&:container_repository_name).compact
879
+
880
+ flatpak_index = (redirect_client { Resources::Registry::Proxy.get(@_request.fullpath, headers) })
881
+
882
+ begin
883
+ flatpak_index_json = JSON.parse(flatpak_index)
884
+ rescue JSON::ParserError => e
885
+ Rails.logger.error("Failed to parse flatpak index JSON: #{e.message}")
886
+ return render json: { 'Registry' => request_url, 'Results' => [] }
887
+ end
888
+
860
889
  flatpak_index_json['Results'] = flatpak_index_json['Results'].select do |result|
861
890
  available_container_repo_names.include?(result['Name'])
862
891
  end
@@ -447,7 +447,7 @@ module Katello
447
447
  end
448
448
 
449
449
  def rhsm_params
450
- params.slice(:name, :type, :facts, :installedProducts, :autoheal, :releaseVer, :usage, :role, :serviceLevel, :uuid, :capabilities, :guestIds, :lastCheckin).to_h
450
+ params.slice(:name, :type, :facts, :installedProducts, :releaseVer, :usage, :role, :serviceLevel, :uuid, :capabilities, :guestIds, :lastCheckin).to_h
451
451
  end
452
452
 
453
453
  def logger
@@ -7,13 +7,11 @@ module Katello
7
7
  before_action :find_optional_organization, :only => [:index, :create, :show]
8
8
  before_action :find_authorized_katello_resource, :only => [:show, :update, :destroy, :available_releases,
9
9
  :available_host_collections, :add_host_collections, :remove_host_collections,
10
- :content_override, :add_subscriptions, :remove_subscriptions,
11
- :subscriptions]
10
+ :content_override, :subscriptions]
12
11
  before_action :find_content_view_environments, :only => [:create, :update]
13
- before_action :verify_simple_content_access_disabled, :only => [:add_subscriptions]
14
12
  before_action :validate_release_version, :only => [:create, :update]
15
13
 
16
- wrap_parameters :include => (ActivationKey.attribute_names + %w(host_collection_ids service_level auto_attach purpose_role purpose_usage content_view_environments))
14
+ wrap_parameters :include => (ActivationKey.attribute_names + %w(host_collection_ids service_level purpose_role purpose_usage content_view_environments))
17
15
 
18
16
  def_param_group :activation_key do
19
17
  param :organization_id, :number, :desc => N_("organization identifier"), :required => true
@@ -22,7 +20,6 @@ module Katello
22
20
  param :unlimited_hosts, :bool, :desc => N_("can the activation key have unlimited hosts")
23
21
  param :release_version, String, :desc => N_("content release version")
24
22
  param :service_level, String, :desc => N_("service level")
25
- param :auto_attach, :bool, :desc => N_("auto attach subscriptions upon registration"), deprecated: true
26
23
  param :purpose_usage, String, :desc => N_("Sets the system purpose usage")
27
24
  param :purpose_role, String, :desc => N_("Sets the system purpose usage")
28
25
 
@@ -125,8 +122,7 @@ module Katello
125
122
  @new_activation_key.reload
126
123
  sync_task(::Actions::Katello::ActivationKey::Update, @new_activation_key,
127
124
  :service_level => @activation_key.service_level,
128
- :release_version => @activation_key.release_version,
129
- :auto_attach => @activation_key.auto_attach
125
+ :release_version => @activation_key.release_version
130
126
  )
131
127
  @activation_key.pools.each do |pool|
132
128
  @new_activation_key.subscribe(pool[:id])
@@ -181,46 +177,6 @@ module Katello
181
177
  respond_for_show(:resource => @activation_key)
182
178
  end
183
179
 
184
- def deprecate_entitlement_mode_endpoint
185
- ::Foreman::Deprecation.api_deprecation_warning(N_("This endpoint is deprecated and will be removed in an upcoming release. Simple Content Access is the only supported content access mode."))
186
- end
187
-
188
- api :PUT, "/activation_keys/:id/add_subscriptions", N_("Attach a subscription"), deprecated: true
189
- param :id, :number, :desc => N_("ID of the activation key"), :required => true
190
- param :subscription_id, :number, :desc => N_("Subscription identifier"), :required => false
191
- param :quantity, :number, :desc => N_("Quantity of this subscription to add"), :required => false
192
- param :subscriptions, Array, :desc => N_("Array of subscriptions to add"), :required => false do
193
- param :id, String, :desc => N_("Subscription Pool uuid"), :required => false
194
- param :quantity, :number, :desc => N_("Quantity of this subscriptions to add"), :required => false
195
- end
196
- def add_subscriptions
197
- deprecate_entitlement_mode_endpoint
198
- if params[:subscriptions]
199
- params[:subscriptions].each { |subscription| @activation_key.subscribe(subscription[:id], subscription[:quantity]) }
200
- elsif params[:subscription_id]
201
- @activation_key.subscribe(params[:subscription_id], params[:quantity])
202
- end
203
-
204
- respond_for_index(:collection => subscription_index, :template => 'subscriptions')
205
- end
206
-
207
- api :PUT, "/activation_keys/:id/remove_subscriptions", N_("Unattach a subscription"), deprecated: true
208
- param :id, :number, :desc => N_("ID of the activation key"), :required => true
209
- param :subscription_id, String, :desc => N_("Subscription ID"), :required => false
210
- param :subscriptions, Array, :desc => N_("Array of subscriptions to add"), :required => false do
211
- param :id, String, :desc => N_("Subscription Pool uuid"), :required => false
212
- end
213
- def remove_subscriptions
214
- deprecate_entitlement_mode_endpoint
215
- if params[:subscriptions]
216
- params[:subscriptions].each { |subscription| @activation_key.unsubscribe(subscription[:id]) }
217
- elsif params[:subscription_id]
218
- @activation_key.unsubscribe(params[:subscription_id])
219
- end
220
-
221
- respond_for_index(:collection => subscription_index, :template => 'subscriptions')
222
- end
223
-
224
180
  api :PUT, "/activation_keys/:id/content_override", N_("Override content for activation_key")
225
181
  param :id, :number, :desc => N_("ID of the activation key"), :required => true
226
182
  param :content_overrides, Array, :desc => N_("Array of Content override parameters to be added in bulk") do
@@ -273,17 +229,6 @@ module Katello
273
229
 
274
230
  private
275
231
 
276
- def subscription_index
277
- subs = @activation_key.subscriptions
278
- {
279
- :results => subs,
280
- :subtotal => subs.count,
281
- :total => subs.count,
282
- :page => 1,
283
- :per_page => subs.count,
284
- }
285
- end
286
-
287
232
  def find_cve_for_single
288
233
  environment_id = params.dig(:environment, :id) || params[:environment_id]
289
234
  content_view_id = params.dig(:content_view, :id) || params[:content_view_id]
@@ -379,7 +324,6 @@ module Katello
379
324
  :content_view_id,
380
325
  :release_version,
381
326
  :service_level,
382
- :auto_attach,
383
327
  :max_hosts,
384
328
  :unlimited_hosts,
385
329
  :purpose_role,
@@ -408,12 +352,6 @@ module Katello
408
352
  key_params
409
353
  end
410
354
 
411
- def verify_simple_content_access_disabled
412
- if @activation_key.organization.simple_content_access?
413
- fail HttpErrors::BadRequest, _("The specified organization is in Simple Content Access mode. Attaching subscriptions is disabled")
414
- end
415
- end
416
-
417
355
  def validate_release_version
418
356
  @organization ||= find_organization
419
357
  if params[:release_version].present? && !@organization.library.available_releases.include?(params[:release_version])
@@ -95,7 +95,7 @@ module Katello
95
95
  update_params = rule_params
96
96
  update_params[:name] = update_params[:name].first if update_params[:name]
97
97
 
98
- if @rule.filter.content_type == ContentViewPackageFilter::CONTENT_TYPE
98
+ if [ContentViewPackageFilter::CONTENT_TYPE, ContentViewDebFilter::CONTENT_TYPE].include?(@rule.filter.content_type)
99
99
  update_params[:version] = "" unless rule_params[:version]
100
100
  update_params[:min_version] = "" unless rule_params[:min_version]
101
101
  update_params[:max_version] = "" unless rule_params[:max_version]
@@ -21,6 +21,7 @@ module Katello
21
21
  param :description, String, :desc => N_("Description for the content view")
22
22
  param :repository_ids, Array, :desc => N_("List of repository ids")
23
23
  param :component_ids, Array, :desc => N_("List of component content view version ids for composite views")
24
+ param :environment_ids, Array, :desc => N_("List of lifecycle environments for rolling content views")
24
25
  param :auto_publish, :bool, :desc => N_("Enable/Disable auto publish of composite view")
25
26
  param :solve_dependencies, :bool, :desc => N_("Solve RPM dependencies by default on Content View publish, defaults to false")
26
27
  param :import_only, :bool, :desc => N_("Designate this Content View for importing from upstream servers only. Defaults to false")
@@ -42,6 +43,7 @@ module Katello
42
43
  {
43
44
  :component_ids => Katello::ContentViewVersion,
44
45
  :repository_ids => Katello::Repository,
46
+ :environment_ids => Katello::KTEnvironment,
45
47
  }
46
48
  end
47
49
 
@@ -87,11 +89,12 @@ module Katello
87
89
  param :rolling, :bool, :desc => N_("Rolling content view")
88
90
  param_group :content_view
89
91
  def create
92
+ validate_environment_ids!(params[:rolling])
90
93
  @content_view = ContentView.create!(view_params) do |view|
91
94
  view.organization = @organization
92
95
  view.label ||= labelize_params(params[:content_view])
93
96
  end
94
- sync_task(::Actions::Katello::ContentView::Create, @content_view)
97
+ sync_task(::Actions::Katello::ContentView::Create, @content_view, sanitized_environment_ids)
95
98
 
96
99
  respond :resource => @content_view
97
100
  end
@@ -101,7 +104,8 @@ module Katello
101
104
  param :name, String, :desc => N_("New name for the content view")
102
105
  param_group :content_view
103
106
  def update
104
- sync_task(::Actions::Katello::ContentView::Update, @content_view, view_params)
107
+ validate_environment_ids!(@content_view.rolling?)
108
+ sync_task(::Actions::Katello::ContentView::Update, @content_view, view_params, sanitized_environment_ids)
105
109
  respond :resource => @content_view.reload
106
110
  end
107
111
 
@@ -299,12 +303,23 @@ module Katello
299
303
  if (!@content_view || !@content_view.composite?)
300
304
  attrs.push({:repository_ids => []}, :repository_ids)
301
305
  end
302
- result = params.require(:content_view).permit(*attrs).to_h
306
+ result = {}
307
+ result = params.require(:content_view).permit(*attrs).to_h unless action_name == "update" && @content_view.rolling? && params[:content_view].empty?
303
308
  # sanitize repository_ids to be a list of integers
304
309
  result[:repository_ids] = result[:repository_ids].compact.map(&:to_i) if result[:repository_ids].present?
305
310
  result
306
311
  end
307
312
 
313
+ def sanitized_environment_ids
314
+ params[:environment_ids]&.compact&.map(&:to_i)
315
+ end
316
+
317
+ def validate_environment_ids!(rolling)
318
+ if params[:environment_ids] && !rolling
319
+ fail HttpErrors::BadRequest, _("It's not possible to provide environment_ids for anything other than a rolling content view.")
320
+ end
321
+ end
322
+
308
323
  def find_environment
309
324
  return if !params.key?(:environment_id) && params[:action] == "index"
310
325
  @environment = KTEnvironment.readable.find(params[:environment_id])
@@ -13,15 +13,15 @@ module Katello
13
13
  def auto_complete(search)
14
14
  page_size = Katello::Concerns::FilteredAutoCompleteSearch::PAGE_SIZE
15
15
  debs = Deb.in_repositories(@repositories)
16
- col = ''
17
- case search
18
- when 'name'
19
- col = "#{Deb.table_name}.name"
20
- when 'arch'
21
- col = "#{Deb.table_name}.architecture"
22
- end
23
- debs = debs.where("#{col} ILIKE ?", "#{params[:term]}%").select(col).group(col).order(col).limit(page_size)
24
- render :json => debs.pluck(col)
16
+ col = case search
17
+ when 'name' then "#{Deb.table_name}.name"
18
+ when 'arch' then "#{Deb.table_name}.architecture"
19
+ end
20
+ return render json: [] if col.blank?
21
+
22
+ scope = debs.select(col).group(col).order(col).limit(page_size)
23
+ scope = scope.where("#{col} ILIKE ?", "%#{params[:term]}%") if params[:term].present?
24
+ render json: scope.pluck(Arel.sql(col))
25
25
  end
26
26
 
27
27
  def auto_complete_name
@@ -29,7 +29,7 @@ module Katello
29
29
  end
30
30
 
31
31
  def auto_complete_arch
32
- auto_complete('architecture')
32
+ auto_complete('arch')
33
33
  end
34
34
 
35
35
  api :GET, "/debs", N_("List deb packages")
@@ -52,6 +52,16 @@ module Katello
52
52
  super
53
53
  end
54
54
 
55
+ def thindex
56
+ sort_by, sort_order, options = sort_options
57
+
58
+ options[:select] = "DISTINCT ON (#{Deb.table_name}.name) #{Deb.table_name}.id, #{Deb.table_name}.name"
59
+ final_relation = custom_index_relation(Deb.all)
60
+
61
+ result = scoped_search(final_relation, sort_by, sort_order, options)
62
+ respond_for_index(:collection => result, :template => "thindex")
63
+ end
64
+
55
65
  def final_custom_index_relation(collection)
56
66
  # :packages_restrict_latest is intended to filter the result set after all
57
67
  # other constraints have been applied, including the scoped_search
@@ -95,7 +105,7 @@ module Katello
95
105
  collection = collection.installable_for_hosts(@hosts)
96
106
  elsif not_installed && params[:host_id]
97
107
  host = @hosts.first
98
- collection = Katello::Deb.apt_installable_for_host(host)
108
+ collection = Katello::Deb.deb_installable_for_host(host)
99
109
  elsif applicable
100
110
  collection = collection.applicable_to_hosts(@hosts)
101
111
  end
@@ -46,6 +46,13 @@ module Katello
46
46
 
47
47
  private
48
48
 
49
+ def custom_index_relation(collection)
50
+ collection.includes(
51
+ schema1: { docker_taggable: :docker_manifests },
52
+ schema2: { docker_taggable: :docker_manifests }
53
+ )
54
+ end
55
+
49
56
  def find_repositories
50
57
  @repositories = Repository.readable.where(:id => params[:repoids])
51
58
  end
@@ -4,7 +4,7 @@ module Katello
4
4
 
5
5
  before_action :find_remote_repository, :except => [:index, :auto_complete_search]
6
6
  before_action :find_optional_organization, :only => [:index, :auto_complete_search]
7
- before_action :find_product, :only => [:mirror]
7
+ before_action :find_and_validate_product_for_mirroring, :only => [:mirror]
8
8
 
9
9
  resource_description do
10
10
  name 'Flatpak Remote Repositories'
@@ -56,7 +56,6 @@ module Katello
56
56
  param :product_name, String, :desc => N_("Name of the product to mirror the remote repository to")
57
57
  param :organization_id, :number, :desc => N_("organization identifier")
58
58
  def mirror
59
- validate_product_for_mirroring
60
59
  task = async_task(::Actions::Katello::Flatpak::MirrorRemoteRepository, @flatpak_remote_repository, @product)
61
60
  respond_for_async :resource => task
62
61
  end
@@ -75,10 +74,17 @@ module Katello
75
74
  @flatpak_remote_repository
76
75
  end
77
76
 
78
- def find_product
77
+ protected
78
+
79
+ def rejected_autocomplete_items
80
+ ['flatpak_remote_id', 'flatpak_remote']
81
+ end
82
+
83
+ private
84
+
85
+ def find_and_validate_product_for_mirroring
79
86
  if params[:product_id]
80
- @product = Product.editable.find(params[:product_id])
81
- throw_resource_not_found(name: 'product', id: params[:product_id]) unless @product
87
+ @product = Product.editable.find(params[:product_id]) # will throw not found if id is invalid
82
88
  elsif params[:product_name] && params[:organization_id]
83
89
  @product = Product.editable.find_by(name: params[:product_name], organization_id: params[:organization_id])
84
90
  unless @product
@@ -86,22 +92,18 @@ module Katello
86
92
  { name: params[:product_name], org_id: params[:organization_id] }
87
93
  fail HttpErrors::NotFound, msg
88
94
  end
95
+ elsif params[:product_name]
96
+ msg = _("Organization must be specified when providing product by name.")
97
+ fail HttpErrors::BadRequest, msg
98
+ else
99
+ msg = _("Product must be specified.")
100
+ fail HttpErrors::BadRequest, msg
89
101
  end
90
- @product
91
- end
92
102
 
93
- protected
94
-
95
- def rejected_autocomplete_items
96
- ['flatpak_remote_id', 'flatpak_remote']
97
- end
98
-
99
- private
100
-
101
- def validate_product_for_mirroring
102
- return unless @product&.redhat?
103
- msg = _("Flatpak repositories cannot be mirrored into Red Hat products. Please select a custom product.")
104
- fail HttpErrors::UnprocessableEntity, msg
103
+ if @product.redhat?
104
+ msg = _("Flatpak repositories cannot be mirrored into Red Hat products. Please select a custom product.")
105
+ fail HttpErrors::UnprocessableEntity, msg
106
+ end
105
107
  end
106
108
  end
107
109
  end
@@ -1,14 +1,29 @@
1
1
  module Katello
2
2
  class Api::V2::HostDebsController < Api::V2::ApiController
3
3
  include Katello::Concerns::FilteredAutoCompleteSearch
4
+ include Katello::Concerns::Api::V2::RepositoryContentController
4
5
 
5
- before_action :find_host
6
+ before_action :find_host, only: [:index]
6
7
 
7
8
  resource_description do
8
9
  api_version 'v2'
9
10
  api_base_url "/api"
10
11
  end
11
12
 
13
+ api :GET, "/host_debs/installed_debs", N_("Return a list of installed debs distinct by name")
14
+ param_group :search, ::Katello::Api::V2::ApiController
15
+ def installed_debs
16
+ _sort_by, _sort_order, options = sort_options
17
+ sort_by = 'name'
18
+ sort_order = 'asc'
19
+
20
+ options[:select] = "DISTINCT ON (#{::Katello::InstalledDeb.table_name}.name) #{::Katello::InstalledDeb.table_name}.id, #{::Katello::InstalledDeb.table_name}.name"
21
+ final_relation = ::Katello::InstalledDeb.all
22
+
23
+ result = scoped_search(final_relation, sort_by, sort_order, options)
24
+ respond_for_index(:collection => result, :template => "installed_debs")
25
+ end
26
+
12
27
  api :GET, "/hosts/:host_id/debs", N_("List deb packages installed on the host")
13
28
  param :host_id, :number, :required => true, :desc => N_("ID of the host")
14
29
  param :include_latest_upgradable, :boolean, :desc => N_("Also include the latest upgradable package version for each host package")
@@ -2,7 +2,6 @@ module Katello
2
2
  class Api::V2::HostSubscriptionsController < Katello::Api::V2::ApiController
3
3
  include Katello::Concerns::Api::V2::ContentOverridesController
4
4
  before_action :find_host, :except => :create
5
- before_action :check_subscriptions, :only => [:add_subscriptions, :remove_subscriptions]
6
5
  before_action :find_content_view_environment, :only => :create
7
6
  before_action :check_registration_services, :only => [:destroy, :create]
8
7
  before_action :find_content_overrides, :only => [:content_override]
@@ -17,10 +16,9 @@ module Katello
17
16
 
18
17
  def_param_group :subscription_facet_attributes do
19
18
  param :release_version, String, :desc => N_("Release version for this Host to use (7Server, 7.1, etc)")
20
- param :autoheal, :bool, :desc => N_("Sets whether the Host will autoheal subscriptions upon checkin")
21
19
  param :purpose_usage, String, :desc => N_("Sets the system purpose usage")
22
20
  param :purpose_role, String, :desc => N_("Sets the system purpose usage")
23
- param :service_level, String, :desc => N_("Service level to be used for autoheal")
21
+ param :service_level, String, :desc => N_("Service level")
24
22
  param :hypervisor_guest_uuids, Array, :desc => N_("List of hypervisor guest uuids")
25
23
  param :installed_products_attributes, Array, :desc => N_("List of products installed on the host") do
26
24
  param_group :installed_products, Api::V2::HostSubscriptionsController
@@ -51,18 +49,6 @@ module Katello
51
49
  full_result_response(presenter.subscriptions)
52
50
  end
53
51
 
54
- api :PUT, "/hosts/:host_id/subscriptions/auto_attach", N_("Trigger an auto-attach of subscriptions"), deprecated: true
55
- param :host_id, Integer, :desc => N_("Id of the host"), :required => true
56
- def auto_attach
57
- deprecate_entitlement_mode_endpoint
58
- if @host.organization.simple_content_access?
59
- fail ::Katello::HttpErrors::BadRequest, _("This host's organization is in Simple Content Access mode. Auto-attach is disabled")
60
- end
61
-
62
- sync_task(::Actions::Katello::Host::AutoAttachSubscriptions, @host)
63
- respond_for_index(:collection => index_response(reload_host: true), :template => "index")
64
- end
65
-
66
52
  api :DELETE, "/hosts/:host_id/subscriptions/", N_("Unregister the host as a subscription consumer")
67
53
  param :host_id, Integer, :desc => N_("Id of the host"), :required => true
68
54
  def destroy
@@ -80,7 +66,7 @@ module Katello
80
66
  param_group :installed_products, ::Katello::Api::V2::HostSubscriptionsController
81
67
  end
82
68
  param :release_version, String, :desc => N_("Release version of the content host")
83
- param :service_level, String, :desc => N_("A service level for auto-healing process, e.g. SELF-SUPPORT")
69
+ param :service_level, String, :desc => N_("Service level, e.g. SELF-SUPPORT")
84
70
  param :lifecycle_environment_id, Integer, :desc => N_("Lifecycle Environment ID"), :required => true
85
71
  param :content_view_id, Integer, :desc => N_("Content View ID"), :required => true
86
72
  def create
@@ -115,45 +101,6 @@ module Katello
115
101
  rhsm_params
116
102
  end
117
103
 
118
- api :PUT, "/hosts/:host_id/subscriptions/remove_subscriptions", N_("Remove subscriptions from a host"), deprecated: true
119
- param :host_id, Integer, :desc => N_("Id of the host"), :required => true
120
- param :subscriptions, Array, :desc => N_("Array of subscriptions to remove") do
121
- param :id, String, :desc => N_("Subscription Pool id"), :required => true
122
- param :quantity, Integer, :desc => N_("If specified, remove the first instance of a subscription with matching id and quantity"), :required => false
123
- end
124
- def remove_subscriptions
125
- deprecate_entitlement_mode_endpoint
126
- #combine the quantities for duplicate pools into PoolWithQuantities objects
127
- pool_id_quantities = params.require(:subscriptions).inject({}) do |new_hash, subscription|
128
- new_hash[subscription['id']] ||= PoolWithQuantities.new(Pool.with_identifier(subscription['id']))
129
- new_hash[subscription['id']].quantities << subscription['quantity']
130
- new_hash
131
- end
132
-
133
- sync_task(::Actions::Katello::Host::RemoveSubscriptions, @host, pool_id_quantities.values)
134
- respond_for_index(:collection => index_response(reload_host: true), :template => "index")
135
- end
136
-
137
- api :PUT, "/hosts/:host_id/subscriptions/add_subscriptions", N_("Add a subscription to a host"), deprecated: true
138
- param :host_id, Integer, :desc => N_("Id of the host"), :required => true
139
- param :subscriptions, Array, :desc => N_("Array of subscriptions to add"), :required => true do
140
- param :id, String, :desc => N_("Subscription Pool id"), :required => true
141
- param :quantity, :number, :desc => N_("Quantity of this subscriptions to add"), :required => true
142
- end
143
- def add_subscriptions
144
- deprecate_entitlement_mode_endpoint
145
- if @host.organization.simple_content_access?
146
- fail ::Katello::HttpErrors::BadRequest, _("This host's organization is in Simple Content Access mode. Attaching subscriptions is disabled.")
147
- end
148
-
149
- pools_with_quantities = params.require(:subscriptions).map do |sub_params|
150
- PoolWithQuantities.new(Pool.with_identifier(sub_params['id']), sub_params['quantity'].to_i)
151
- end
152
-
153
- sync_task(::Actions::Katello::Host::AttachSubscriptions, @host, pools_with_quantities)
154
- respond_for_index(:collection => index_response(reload_host: true), :template => "index")
155
- end
156
-
157
104
  api :GET, "/hosts/:host_id/subscriptions/product_content", N_("Get content and overrides for the host")
158
105
  param :host_id, String, :desc => N_("Id of the host"), :required => true
159
106
  param :content_access_mode_all, :bool, :desc => N_("Get all content available, not just that provided by subscriptions")
@@ -215,10 +162,6 @@ module Katello
215
162
  fail HttpErrors::NotFound, _("Couldn't find specified content view and lifecycle environment.") if @content_view_environment.nil?
216
163
  end
217
164
 
218
- def check_subscriptions
219
- fail HttpErrors::BadRequest, _("subscriptions not specified") if params[:subscriptions].blank?
220
- end
221
-
222
165
  def check_registration_services
223
166
  fail "Unable to register system, not all services available" unless Katello::RegistrationManager.check_registration_services
224
167
  end
@@ -228,7 +171,7 @@ module Katello
228
171
  end
229
172
 
230
173
  def action_permission
231
- if ['add_subscriptions', 'destroy', 'remove_subscriptions', 'auto_attach', 'content_override'].include?(params[:action])
174
+ if ['destroy', 'content_override'].include?(params[:action])
232
175
  :edit
233
176
  elsif ['index', 'events', 'product_content', 'available_release_versions', 'enabled_repositories'].include?(params[:action])
234
177
  :view