katello 4.16.1 → 4.17.0.rc1

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 (557) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js +5 -3
  3. data/app/assets/javascripts/katello/locale/bn/katello.js +82 -31
  4. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +82 -31
  5. data/app/assets/javascripts/katello/locale/ca/katello.js +82 -31
  6. data/app/assets/javascripts/katello/locale/cs/katello.js +82 -31
  7. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +83 -32
  8. data/app/assets/javascripts/katello/locale/de/katello.js +82 -31
  9. data/app/assets/javascripts/katello/locale/de_AT/katello.js +82 -31
  10. data/app/assets/javascripts/katello/locale/de_DE/katello.js +82 -31
  11. data/app/assets/javascripts/katello/locale/el/katello.js +82 -31
  12. data/app/assets/javascripts/katello/locale/en/katello.js +82 -31
  13. data/app/assets/javascripts/katello/locale/en_GB/katello.js +84 -33
  14. data/app/assets/javascripts/katello/locale/en_US/katello.js +82 -31
  15. data/app/assets/javascripts/katello/locale/es/katello.js +82 -31
  16. data/app/assets/javascripts/katello/locale/et_EE/katello.js +82 -31
  17. data/app/assets/javascripts/katello/locale/fr/katello.js +83 -32
  18. data/app/assets/javascripts/katello/locale/gl/katello.js +82 -31
  19. data/app/assets/javascripts/katello/locale/gu/katello.js +83 -32
  20. data/app/assets/javascripts/katello/locale/he_IL/katello.js +82 -31
  21. data/app/assets/javascripts/katello/locale/hi/katello.js +82 -31
  22. data/app/assets/javascripts/katello/locale/id/katello.js +82 -31
  23. data/app/assets/javascripts/katello/locale/it/katello.js +84 -33
  24. data/app/assets/javascripts/katello/locale/ja/katello.js +83 -32
  25. data/app/assets/javascripts/katello/locale/ka/katello.js +82 -31
  26. data/app/assets/javascripts/katello/locale/kn/katello.js +82 -31
  27. data/app/assets/javascripts/katello/locale/ko/katello.js +82 -31
  28. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +82 -31
  29. data/app/assets/javascripts/katello/locale/mr/katello.js +82 -31
  30. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +82 -31
  31. data/app/assets/javascripts/katello/locale/or/katello.js +82 -31
  32. data/app/assets/javascripts/katello/locale/pa/katello.js +82 -31
  33. data/app/assets/javascripts/katello/locale/pl/katello.js +83 -32
  34. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +82 -31
  35. data/app/assets/javascripts/katello/locale/pt/katello.js +82 -31
  36. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +82 -31
  37. data/app/assets/javascripts/katello/locale/ro/katello.js +82 -31
  38. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +82 -31
  39. data/app/assets/javascripts/katello/locale/ru/katello.js +84 -33
  40. data/app/assets/javascripts/katello/locale/sl/katello.js +82 -31
  41. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +83 -32
  42. data/app/assets/javascripts/katello/locale/ta/katello.js +82 -31
  43. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +82 -31
  44. data/app/assets/javascripts/katello/locale/te/katello.js +82 -31
  45. data/app/assets/javascripts/katello/locale/tr/katello.js +82 -31
  46. data/app/assets/javascripts/katello/locale/vi/katello.js +82 -31
  47. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +82 -31
  48. data/app/assets/javascripts/katello/locale/zh/katello.js +82 -31
  49. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +83 -32
  50. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +84 -33
  51. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +19 -3
  52. data/app/controllers/katello/api/v2/content_view_components_controller.rb +6 -6
  53. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +3 -0
  54. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +6 -0
  55. data/app/controllers/katello/api/v2/content_views_controller.rb +12 -1
  56. data/app/controllers/katello/api/v2/exports_controller.rb +3 -0
  57. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +12 -14
  58. data/app/controllers/katello/api/v2/organizations_controller.rb +10 -10
  59. data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +8 -2
  60. data/app/lib/actions/helpers/rolling_cv_repos.rb +25 -0
  61. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +6 -1
  62. data/app/lib/actions/katello/content_view/add_rolling_repo_clone.rb +39 -0
  63. data/app/lib/actions/katello/content_view/create.rb +3 -0
  64. data/app/lib/actions/katello/content_view/refresh_rolling_repo.rb +40 -0
  65. data/app/lib/actions/katello/content_view/remove.rb +8 -4
  66. data/app/lib/actions/katello/content_view/remove_rolling_repo_clone.rb +28 -0
  67. data/app/lib/actions/katello/content_view/update.rb +8 -0
  68. data/app/lib/actions/katello/repository/check_matching_content.rb +1 -8
  69. data/app/lib/actions/katello/repository/import_upload.rb +5 -0
  70. data/app/lib/actions/katello/repository/sync.rb +8 -4
  71. data/app/lib/actions/katello/repository/upload_files.rb +7 -1
  72. data/app/lib/actions/pulp3/orchestration/orphan_cleanup/remove_orphans.rb +3 -2
  73. data/app/lib/actions/pulp3/orphan_cleanup/delete_orphan_repository_versions.rb +8 -1
  74. data/app/lib/katello/errors.rb +8 -0
  75. data/app/lib/katello/validators/container_image_name_validator.rb +3 -2
  76. data/app/models/katello/authorization/repository.rb +11 -1
  77. data/app/models/katello/concerns/host_managed_extensions.rb +2 -2
  78. data/app/models/katello/concerns/pulp_database_unit.rb +12 -42
  79. data/app/models/katello/concerns/smart_proxy_extensions.rb +8 -0
  80. data/app/models/katello/content_view.rb +14 -1
  81. data/app/models/katello/content_view_component.rb +4 -0
  82. data/app/models/katello/content_view_environment.rb +1 -0
  83. data/app/models/katello/content_view_version.rb +3 -2
  84. data/app/models/katello/host/content_facet.rb +18 -5
  85. data/app/models/katello/product_content.rb +3 -1
  86. data/app/models/katello/repository.rb +3 -3
  87. data/app/services/katello/content_unit_indexer.rb +1 -1
  88. data/app/services/katello/pulp3/api/content_guard.rb +1 -1
  89. data/app/services/katello/pulp3/api/core.rb +6 -0
  90. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +58 -1
  91. data/app/services/katello/pulp3/smart_proxy_repository.rb +67 -3
  92. data/app/services/katello/smart_proxy_helper.rb +6 -1
  93. data/app/views/foreman/job_templates/install_errata_-_katello_ansible_default.erb +15 -1
  94. data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +15 -1
  95. data/app/views/foreman/job_templates/install_group_-_katello_ansible_default.erb +15 -2
  96. data/app/views/foreman/job_templates/install_packages_by_search_query_-_katello_ansible_default.erb +21 -2
  97. data/app/views/foreman/job_templates/remove_group_-_katello_ansible_default.erb +15 -1
  98. data/app/views/foreman/job_templates/remove_packages_by_search_query_-_katello_ansible_default.erb +20 -1
  99. data/app/views/foreman/job_templates/update_group_-_katello_ansible_default.erb +15 -2
  100. data/app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb +17 -1
  101. data/app/views/katello/api/v2/activation_keys/base.json.rabl +1 -0
  102. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +2 -1
  103. data/app/views/katello/api/v2/content_facet/base.json.rabl +2 -0
  104. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +12 -0
  105. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  106. data/app/views/katello/api/v2/environments/show.json.rabl +14 -0
  107. data/app/views/katello/api/v2/hosts/base.json.rabl +1 -0
  108. data/app/views/katello/api/v2/organizations/show.json.rabl +2 -0
  109. data/app/views/katello/api/v2/repositories/base.json.rabl +2 -1
  110. data/db/migrate/20190930192813_add_pulp3_hrefs_to_content_types.rb +1 -1
  111. data/db/migrate/20241022122325_add_rolling_to_katello_content_views.rb +5 -0
  112. data/db/migrate/20241025151105_remove_pulp3_migrated_hrefs_from_content_tables.rb +1 -1
  113. data/db/migrate/20250215143303_drop_katello_yum_metadata_file.rb +5 -0
  114. data/db/migrate/20250409120843_fix_file_download_policy.rb +11 -0
  115. data/db/migrate/20250410155300_change_ansible_templates_category.rb +22 -0
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -0
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn.po +90 -31
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn_IN.po +90 -31
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ca.po +90 -31
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/cs_CZ.po +90 -31
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +93 -60
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_AT.po +90 -31
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_DE.po +90 -31
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/el.po +90 -31
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_GB.po +94 -35
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_US.po +90 -31
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +93 -40
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/et_EE.po +90 -31
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +254 -192
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gl.po +90 -31
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gu.po +90 -31
  132. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/he_IL.po +90 -31
  133. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/hi.po +90 -31
  134. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/id.po +90 -31
  135. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +90 -35
  136. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +113 -52
  137. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ka.po +93 -34
  138. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/kn.po +90 -31
  139. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +101 -40
  140. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ml_IN.po +90 -31
  141. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/mr.po +90 -31
  142. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/nl_NL.po +90 -31
  143. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/or.po +90 -31
  144. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pa.po +90 -31
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl.po +90 -31
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl_PL.po +90 -31
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt.po +90 -31
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +93 -40
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro.po +90 -31
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro_RO.po +90 -31
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +91 -34
  152. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sl.po +90 -31
  153. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sv_SE.po +90 -31
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta.po +90 -31
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta_IN.po +90 -31
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/te.po +90 -31
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/tr.po +90 -31
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi.po +90 -31
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi_VN.po +90 -31
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh.po +90 -31
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +99 -40
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +92 -33
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +14 -14
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +3 -0
  165. data/lib/katello/engine.rb +9 -1
  166. data/lib/katello/repository_types/python.rb +1 -1
  167. data/lib/katello/tasks/repository.rake +1 -1
  168. data/lib/katello/version.rb +1 -1
  169. data/locale/action_names.rb +186 -0
  170. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  171. data/locale/bn/katello.po +82 -31
  172. data/locale/bn/katello.po.time_stamp +0 -0
  173. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  174. data/locale/bn_IN/katello.po +82 -31
  175. data/locale/bn_IN/katello.po.time_stamp +0 -0
  176. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  177. data/locale/ca/katello.po +82 -31
  178. data/locale/ca/katello.po.time_stamp +0 -0
  179. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  180. data/locale/cs/katello.po +82 -31
  181. data/locale/cs/katello.po.time_stamp +0 -0
  182. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  183. data/locale/cs_CZ/katello.po +83 -32
  184. data/locale/cs_CZ/katello.po.time_stamp +0 -0
  185. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  186. data/locale/de/katello.po +82 -31
  187. data/locale/de/katello.po.time_stamp +0 -0
  188. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  189. data/locale/de_AT/katello.po +82 -31
  190. data/locale/de_AT/katello.po.time_stamp +0 -0
  191. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  192. data/locale/de_DE/katello.po +82 -31
  193. data/locale/de_DE/katello.po.time_stamp +0 -0
  194. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  195. data/locale/el/katello.po +82 -31
  196. data/locale/el/katello.po.time_stamp +0 -0
  197. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  198. data/locale/en/katello.po +82 -31
  199. data/locale/en/katello.po.time_stamp +0 -0
  200. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  201. data/locale/en_GB/katello.po +84 -33
  202. data/locale/en_GB/katello.po.time_stamp +0 -0
  203. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  204. data/locale/en_US/katello.po +82 -31
  205. data/locale/en_US/katello.po.time_stamp +0 -0
  206. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  207. data/locale/es/katello.po +82 -31
  208. data/locale/es/katello.po.time_stamp +0 -0
  209. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  210. data/locale/et_EE/katello.po +82 -31
  211. data/locale/et_EE/katello.po.time_stamp +0 -0
  212. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  213. data/locale/fr/katello.po +83 -32
  214. data/locale/fr/katello.po.time_stamp +0 -0
  215. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/gl/katello.po +82 -31
  217. data/locale/gl/katello.po.time_stamp +0 -0
  218. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  219. data/locale/gu/katello.po +84 -33
  220. data/locale/gu/katello.po.time_stamp +0 -0
  221. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  222. data/locale/he_IL/katello.po +82 -31
  223. data/locale/he_IL/katello.po.time_stamp +0 -0
  224. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  225. data/locale/hi/katello.po +82 -31
  226. data/locale/hi/katello.po.time_stamp +0 -0
  227. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/id/katello.po +82 -31
  229. data/locale/id/katello.po.time_stamp +0 -0
  230. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/it/katello.po +85 -34
  232. data/locale/it/katello.po.time_stamp +0 -0
  233. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/ja/katello.po +83 -32
  235. data/locale/ja/katello.po.time_stamp +0 -0
  236. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/ka/katello.po +82 -31
  238. data/locale/ka/katello.po.time_stamp +0 -0
  239. data/locale/katello.pot +1232 -1140
  240. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  241. data/locale/kn/katello.po +82 -31
  242. data/locale/kn/katello.po.time_stamp +0 -0
  243. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/ko/katello.po +82 -31
  245. data/locale/ko/katello.po.time_stamp +0 -0
  246. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  247. data/locale/ml_IN/katello.po +82 -31
  248. data/locale/ml_IN/katello.po.time_stamp +0 -0
  249. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/mr/katello.po +82 -31
  251. data/locale/mr/katello.po.time_stamp +0 -0
  252. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  253. data/locale/nl_NL/katello.po +82 -31
  254. data/locale/nl_NL/katello.po.time_stamp +0 -0
  255. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  256. data/locale/or/katello.po +82 -31
  257. data/locale/or/katello.po.time_stamp +0 -0
  258. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/pa/katello.po +82 -31
  260. data/locale/pa/katello.po.time_stamp +0 -0
  261. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  262. data/locale/pl/katello.po +84 -33
  263. data/locale/pl/katello.po.time_stamp +0 -0
  264. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  265. data/locale/pl_PL/katello.po +82 -31
  266. data/locale/pl_PL/katello.po.time_stamp +0 -0
  267. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  268. data/locale/pt/katello.po +82 -31
  269. data/locale/pt/katello.po.time_stamp +0 -0
  270. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/pt_BR/katello.po +82 -31
  272. data/locale/pt_BR/katello.po.time_stamp +0 -0
  273. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  274. data/locale/ro/katello.po +82 -31
  275. data/locale/ro/katello.po.time_stamp +0 -0
  276. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/ro_RO/katello.po +82 -31
  278. data/locale/ro_RO/katello.po.time_stamp +0 -0
  279. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  280. data/locale/ru/katello.po +85 -34
  281. data/locale/ru/katello.po.time_stamp +0 -0
  282. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  283. data/locale/sl/katello.po +82 -31
  284. data/locale/sl/katello.po.time_stamp +0 -0
  285. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  286. data/locale/sv_SE/katello.po +84 -33
  287. data/locale/sv_SE/katello.po.time_stamp +0 -0
  288. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  289. data/locale/ta/katello.po +82 -31
  290. data/locale/ta/katello.po.time_stamp +0 -0
  291. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  292. data/locale/ta_IN/katello.po +82 -31
  293. data/locale/ta_IN/katello.po.time_stamp +0 -0
  294. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  295. data/locale/te/katello.po +82 -31
  296. data/locale/te/katello.po.time_stamp +0 -0
  297. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  298. data/locale/tr/katello.po +82 -31
  299. data/locale/tr/katello.po.time_stamp +0 -0
  300. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  301. data/locale/vi/katello.po +82 -31
  302. data/locale/vi/katello.po.time_stamp +0 -0
  303. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  304. data/locale/vi_VN/katello.po +82 -31
  305. data/locale/vi_VN/katello.po.time_stamp +0 -0
  306. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  307. data/locale/zh/katello.po +82 -31
  308. data/locale/zh/katello.po.time_stamp +0 -0
  309. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  310. data/locale/zh_CN/katello.po +83 -32
  311. data/locale/zh_CN/katello.po.time_stamp +0 -0
  312. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  313. data/locale/zh_TW/katello.po +85 -34
  314. data/locale/zh_TW/katello.po.time_stamp +0 -0
  315. data/webpack/ForemanColumnExtensions/index.js +12 -4
  316. data/webpack/components/ActivationKeysSearch/index.js +6 -7
  317. data/webpack/components/Bookmark/AddBookmarkModal.js +3 -3
  318. data/webpack/components/Bookmark/Bookmark.scss +3 -3
  319. data/webpack/components/Bookmark/index.js +7 -2
  320. data/webpack/components/EditableSwitch.js +1 -1
  321. data/webpack/components/EditableTextInput/EditableTextInput.js +1 -1
  322. data/webpack/components/EditableTextInput/editableTextInput.scss +1 -1
  323. data/webpack/components/Errata/index.js +1 -24
  324. data/webpack/components/Loading.js +10 -6
  325. data/webpack/components/Packages/index.js +2 -1
  326. data/webpack/components/SelectAllCheckbox/index.js +7 -3
  327. data/webpack/components/SelectableDropdown/SelectableDropdown.js +21 -3
  328. data/webpack/components/Table/EmptyStateMessage.js +12 -14
  329. data/webpack/components/Table/MainTable.js +8 -7
  330. data/webpack/components/Table/MainTable.scss +4 -4
  331. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +4 -1
  332. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +1 -1
  333. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +9 -6
  334. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +2 -1
  335. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +4 -1
  336. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +23 -6
  337. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +1 -1
  338. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +5 -3
  339. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.scss +3 -3
  340. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +1 -1
  341. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +25 -10
  342. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +5 -2
  343. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.scss +2 -2
  344. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +5 -4
  345. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeCard.test.js +6 -3
  346. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeEditModal.test.js +19 -12
  347. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +1 -1
  348. data/webpack/components/extensions/HostDetails/DetailsTabCards/HwPropertiesCard.js +1 -4
  349. data/webpack/components/extensions/HostDetails/DetailsTabCards/ImageModeCard.js +1 -4
  350. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +1 -4
  351. data/webpack/components/extensions/HostDetails/DetailsTabCards/__test__/HwPropertiesCard.test.js +63 -0
  352. data/webpack/components/extensions/HostDetails/DetailsTabCards/__test__/ImageModeCard.test.js +73 -0
  353. data/webpack/components/extensions/HostDetails/DetailsTabCards/__test__/InstalledProductsCard.test.js +45 -0
  354. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.js +12 -2
  355. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebInstallModal.scss +1 -1
  356. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebsTab.js +10 -13
  357. data/webpack/components/extensions/HostDetails/Tabs/DebsTab/DebsTab.scss +1 -1
  358. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +46 -21
  359. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.scss +1 -1
  360. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +15 -7
  361. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +13 -3
  362. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.scss +1 -1
  363. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +34 -20
  364. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.scss +1 -1
  365. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +8 -6
  366. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +5 -3
  367. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.scss +1 -1
  368. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +12 -13
  369. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +16 -6
  370. data/webpack/components/extensions/HostDetails/Tabs/__tests__/debsInstallModal.test.js +10 -5
  371. data/webpack/components/extensions/HostDetails/Tabs/__tests__/debsTab.test.js +48 -22
  372. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +123 -47
  373. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +14 -7
  374. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +10 -5
  375. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +41 -24
  376. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +50 -25
  377. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +50 -25
  378. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +3 -0
  379. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_Review.js +16 -2
  380. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +6 -2
  381. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/BulkErrataWizard.js +5 -1
  382. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_Review.js +16 -2
  383. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +6 -2
  384. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +15 -2
  385. data/webpack/components/extensions/Hosts/BulkActions/HostReview.js +1 -1
  386. data/webpack/components/extensions/Hosts/BulkActions/__tests__/bulkChangeHostCVModal.test.js +2 -1
  387. data/webpack/components/extensions/Hosts/FontAwesomeImageModeIcon.js +1 -1
  388. data/webpack/components/extensions/Hosts/ImageModeHostAlert.js +14 -0
  389. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +14 -17
  390. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/Force.test.js.snap +1 -1
  391. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/IgnoreSubmanErrors.test.js.snap +1 -1
  392. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +38 -49
  393. data/webpack/containers/Application/overrides.scss +7 -7
  394. data/webpack/ouia_id_check.js +15 -11
  395. data/webpack/redux/actions/RedHatRepositories/helpers.js +0 -2
  396. data/webpack/scenes/ActivationKeys/Details/__tests__/activationKeyDetails.test.js +12 -6
  397. data/webpack/scenes/ActivationKeys/Details/components/DeleteMenu.js +12 -2
  398. data/webpack/scenes/ActivationKeys/Details/components/EditModal.js +3 -3
  399. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +3 -1
  400. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +3 -1
  401. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +12 -6
  402. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +1 -1
  403. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +22 -7
  404. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +2 -2
  405. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +1 -1
  406. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +6 -3
  407. data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +25 -15
  408. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditCredentials.js +9 -6
  409. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +2 -2
  410. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditSmartProxies.js +1 -1
  411. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +33 -7
  412. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSEdits.test.js +10 -5
  413. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSExpandableDetails.test.js +4 -2
  414. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +10 -8
  415. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +4 -2
  416. data/webpack/scenes/BootedContainerImages/BootedContainerImagesPage.js +5 -5
  417. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +8 -4
  418. data/webpack/scenes/Content/__tests__/contentTable.test.js +4 -2
  419. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -1
  420. data/webpack/scenes/ContentViews/Copy/__tests__/contentViewCopyResult.fixtures.json +1 -0
  421. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +2 -1
  422. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +86 -31
  423. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.scss +10 -2
  424. data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +1 -0
  425. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +10 -4
  426. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +3 -1
  427. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +6 -6
  428. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +7 -2
  429. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +7 -2
  430. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +3 -3
  431. data/webpack/scenes/ContentViews/Delete/Steps/CVEnvironmentSelectionForm.scss +1 -1
  432. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +2 -1
  433. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +3 -2
  434. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +10 -8
  435. data/webpack/scenes/ContentViews/Delete/__tests__/cvDetails.fixtures.json +2 -1
  436. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +16 -5
  437. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +19 -5
  438. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentEnvironments.js +1 -1
  439. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +11 -2
  440. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/compositeCVDetails.fixtures.json +2 -1
  441. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +69 -27
  442. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/publishedContentViewDetails.fixtures.json +2 -1
  443. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +22 -29
  444. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +6 -2
  445. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +20 -7
  446. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +4 -2
  447. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +5 -2
  448. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +3 -1
  449. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +1 -1
  450. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +4 -2
  451. data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +13 -1
  452. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +23 -7
  453. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +23 -5
  454. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +15 -3
  455. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +15 -3
  456. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +13 -1
  457. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +6 -4
  458. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +11 -1
  459. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +4 -2
  460. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/matchContentModal.scss +1 -1
  461. data/webpack/scenes/ContentViews/Details/Filters/Rules/DebPackage/AddEditDebPackageRuleModal.js +2 -2
  462. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +4 -4
  463. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +18 -12
  464. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +7 -11
  465. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +81 -70
  466. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewErrataByDateDetails.fixtures.json +1 -0
  467. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +4 -2
  468. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +52 -38
  469. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +9 -4
  470. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +18 -12
  471. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErratumFilterDetails.fixtures.json +1 -0
  472. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailModuleAffectedRepos.fixtures.json +1 -0
  473. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailWithAffectedRepos.fixtures.json +1 -0
  474. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterFixutre.fixture.json +2 -1
  475. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +77 -67
  476. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilterDetails.fixtures.json +1 -0
  477. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvPackageFilterDetail.fixtures.json +1 -0
  478. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +2 -2
  479. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +4 -2
  480. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +1 -1
  481. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +7 -5
  482. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +6 -3
  483. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  484. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +3 -2
  485. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +3 -1
  486. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +2 -2
  487. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +3 -1
  488. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +3 -1
  489. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +4 -4
  490. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.scss +11 -11
  491. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareHeader.js +15 -5
  492. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionEnvironments.js +1 -1
  493. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +13 -3
  494. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +3 -1
  495. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +17 -13
  496. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +12 -7
  497. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +64 -7
  498. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +52 -21
  499. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +30 -16
  500. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +7 -7
  501. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +5 -3
  502. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +4 -2
  503. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +6 -3
  504. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +2 -1
  505. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +6 -6
  506. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +35 -4
  507. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  508. data/webpack/scenes/ContentViews/Details/__tests__/contentViewRollingDetail.test.js +197 -0
  509. data/webpack/scenes/ContentViews/Details/__tests__/contentViewRollingDetails.fixtures.json +82 -0
  510. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +3 -7
  511. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +2 -2
  512. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +6 -5
  513. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +3 -1
  514. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +15 -7
  515. data/webpack/scenes/ContentViews/Publish/cvPublishForm.scss +4 -4
  516. data/webpack/scenes/ContentViews/Table/ContentViewVersionCell.js +6 -4
  517. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +14 -3
  518. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +3 -0
  519. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +1 -0
  520. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +89 -2
  521. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +85 -14
  522. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +2 -1
  523. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +20 -6
  524. data/webpack/scenes/ContentViews/components/ContentViewSelect/ContentViewSelect.js +4 -1
  525. data/webpack/scenes/ContentViews/components/ContentViewSelect/ContentViewSelectOption.js +11 -2
  526. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +27 -7
  527. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +2 -2
  528. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +6 -2
  529. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +4 -1
  530. data/webpack/scenes/ContentViews/components/FiltersAppliedIcon.js +4 -2
  531. data/webpack/scenes/ContentViews/components/NeedsPublishIcon.js +7 -6
  532. data/webpack/scenes/ContentViews/components/NeedsPublishIcon.scss +2 -2
  533. data/webpack/scenes/ContentViews/components/contentViewIcon.scss +16 -3
  534. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +6 -1
  535. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +3 -3
  536. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +2 -1
  537. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +5 -3
  538. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +3 -2
  539. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +1 -1
  540. data/webpack/scenes/Hosts/ChangeContentSource/components/HostsModal.js +1 -1
  541. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +1 -1
  542. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/__snapshots__/EnabledRepositoryContent.test.js.snap +1 -1
  543. data/webpack/scenes/RedHatRepositories/index.scss +1 -1
  544. data/webpack/scenes/SmartProxy/ExpandableCvDetails.js +27 -7
  545. data/webpack/scenes/SmartProxy/ExpandedSmartProxyRepositories.js +51 -2
  546. data/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js +2 -2
  547. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +14 -9
  548. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationForm.scss +1 -1
  549. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CustomCdnTypeForm.js +2 -2
  550. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/NetworkSyncForm.js +6 -6
  551. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +2 -1
  552. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CustomCdnTypeForm.test.js +2 -1
  553. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/ExportSyncForm.test.js +2 -1
  554. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/NetworkSyncForm.test.js +2 -1
  555. metadata +125 -53
  556. data/app/models/katello/yum_metadata_file.rb +0 -22
  557. data/app/services/katello/pulp3/yum_metadata_file.rb +0 -20
@@ -5,13 +5,11 @@ module Katello
5
5
  extend ActiveSupport::Concern
6
6
  # Class.repository_association_class
7
7
  included do
8
- if many_repository_associations
9
- # rubocop:disable Rails/ReflectionClassName
10
- has_many repository_association.to_sym, class_name: repository_association_class_name,
11
- dependent: :delete_all, inverse_of: association_name
12
- has_many :repositories, through: repository_association.to_sym, class_name: "Katello::Repository"
13
- include ::Katello::Concerns::SearchByRepositoryName
14
- end
8
+ # rubocop:disable Rails/ReflectionClassName
9
+ has_many repository_association.to_sym, class_name: repository_association_class_name,
10
+ dependent: :delete_all, inverse_of: association_name
11
+ has_many :repositories, through: repository_association.to_sym, class_name: "Katello::Repository"
12
+ include ::Katello::Concerns::SearchByRepositoryName
15
13
  end
16
14
 
17
15
  def backend_data
@@ -50,10 +48,6 @@ module Katello
50
48
  "::Katello::Pulp::#{self.name.demodulize}".constantize
51
49
  end
52
50
 
53
- def many_repository_associations
54
- self != YumMetadataFile
55
- end
56
-
57
51
  def repository_association
58
52
  repository_association_class_name.demodulize.pluralize.underscore
59
53
  end
@@ -86,27 +80,11 @@ module Katello
86
80
  end
87
81
 
88
82
  def copy_repository_associations(source_repo, dest_repo)
89
- if many_repository_associations
90
- delete_query = "delete from #{repository_association_class.table_name} where repository_id = #{dest_repo.id} and
91
- #{unit_id_field} not in (select #{unit_id_field} from #{repository_association_class.table_name} where repository_id = #{source_repo.id})"
92
- ActiveRecord::Base.transaction do
93
- ActiveRecord::Base.connection.execute(delete_query)
94
- self.repository_association_class.import(db_columns_copy, db_values_copy(source_repo, dest_repo), validate: false)
95
- end
96
- else
97
- columns = column_names - ["id", "pulp_id", "created_at", "updated_at", "repository_id"]
98
- queries = []
99
- queries << "delete from #{self.table_name} where repository_id = #{dest_repo.id} and
100
- pulp_id not in (select pulp_id from #{self.table_name} where repository_id = #{source_repo.id})"
101
- queries << "insert into #{self.table_name} (repository_id, pulp_id, #{columns.join(',')})
102
- select #{dest_repo.id} as repository_id, pulp_id, #{columns.join(',')} from #{self.table_name}
103
- where repository_id = #{source_repo.id} and pulp_id not in (select pulp_id
104
- from #{self.table_name} where repository_id = #{dest_repo.id})"
105
- ActiveRecord::Base.transaction do
106
- queries.each do |query|
107
- ActiveRecord::Base.connection.execute(query)
108
- end
109
- end
83
+ delete_query = "delete from #{repository_association_class.table_name} where repository_id = #{dest_repo.id} and
84
+ #{unit_id_field} not in (select #{unit_id_field} from #{repository_association_class.table_name} where repository_id = #{source_repo.id})"
85
+ ActiveRecord::Base.transaction do
86
+ ActiveRecord::Base.connection.execute(delete_query)
87
+ self.repository_association_class.import(db_columns_copy, db_values_copy(source_repo, dest_repo), validate: false)
110
88
  end
111
89
  end
112
90
 
@@ -168,19 +146,11 @@ module Katello
168
146
  end
169
147
 
170
148
  def orphaned
171
- if many_repository_associations
172
- left_joins(repository_association.to_sym).where("#{repository_association_class.table_name}.#{unit_id_field}" => nil)
173
- else
174
- where.not(:repository_id => ::Katello::Repository.select(:id))
175
- end
149
+ left_joins(repository_association.to_sym).where("#{repository_association_class.table_name}.#{unit_id_field}" => nil)
176
150
  end
177
151
 
178
152
  def in_repositories(repos)
179
- if many_repository_associations
180
- where(:id => repository_association_class.where(:repository_id => repos).select(unit_id_field))
181
- else
182
- where(:repository_id => repos)
183
- end
153
+ where(:id => repository_association_class.where(:repository_id => repos).select(unit_id_field))
184
154
  end
185
155
 
186
156
  def pulp_data(pulp_id)
@@ -602,6 +602,14 @@ module Katello
602
602
  repos_in_env_cv(environment, content_view) - repos_in_sync_history
603
603
  end
604
604
 
605
+ def up_to_date?(environment = nil, content_view = nil)
606
+ total_repos = repos_in_env_cv(environment, content_view)&.count
607
+ pending_sync = repos_pending_sync(environment, content_view)&.count
608
+ return true if pending_sync&.zero? && total_repos&.positive?
609
+ return false if total_repos.to_i == pending_sync.to_i
610
+ return 'partial'
611
+ end
612
+
605
613
  def rhsm_url
606
614
  # Since Foreman 3.1 this setting is set
607
615
  if (rhsm_url = setting(SmartProxy::PULP3_FEATURE, 'rhsm_url'))
@@ -71,6 +71,16 @@ module Katello
71
71
  validates :composite,
72
72
  inclusion: { in: [false], message: "Composite Content Views can not solve dependencies" },
73
73
  if: :solve_dependencies
74
+ validates :rolling, :inclusion => [true, false]
75
+ validates :rolling,
76
+ inclusion: { in: [false], message: "Rolling content views can not solve dependencies" },
77
+ if: :solve_dependencies
78
+ validates :rolling,
79
+ inclusion: { in: [false], message: "Rolling content views can not be composite" },
80
+ if: :composite
81
+ validates :rolling,
82
+ inclusion: { in: [false], message: "Rolling content views can not be import only" },
83
+ if: :import_only
74
84
  validates :import_only, :inclusion => [true, false]
75
85
  validates :import_only,
76
86
  inclusion: { in: [false], message: "Import-only Content Views can not be Composite" },
@@ -93,6 +103,8 @@ module Katello
93
103
  scope :non_default, -> { where(:default => false) }
94
104
  scope :composite, -> { where(:composite => true) }
95
105
  scope :non_composite, -> { where(:composite => [nil, false]) }
106
+ scope :rolling, -> { where(:rolling => true) }
107
+ scope :non_rolling, -> { where(:rolling => [nil, false]) }
96
108
  scope :generated, -> { where.not(:generated_for => :none) }
97
109
  scope :generated_for_repository, -> {
98
110
  where(:generated_for => [:repository_export,
@@ -113,6 +125,7 @@ module Katello
113
125
  scoped_search :on => :organization_id, :complete_value => true, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
114
126
  scoped_search :on => :label, :complete_value => true
115
127
  scoped_search :on => :composite, :complete_value => { :true => true, :false => false }
128
+ scoped_search :on => :rolling, :complete_value => { :true => true, :false => false }
116
129
  scoped_search :on => :generated_for, :complete_value => true
117
130
  scoped_search :on => :default # just for ordering
118
131
  scoped_search :on => :name, :complete_value => true,
@@ -804,7 +817,7 @@ module Katello
804
817
  end
805
818
 
806
819
  def unpublishable?
807
- default? || import_only? || generated?
820
+ default? || import_only? || generated? || rolling?
808
821
  end
809
822
 
810
823
  def needs_publish?
@@ -53,6 +53,10 @@ module Katello
53
53
  errors.add(:base, _("Cannot add default content view to composite content view"))
54
54
  end
55
55
 
56
+ if view.rolling?
57
+ errors.add(:base, _("Cannot add rolling content view to composite content view"))
58
+ end
59
+
56
60
  if attached_content_view_ids.include?(view.id)
57
61
  errors.add(:base, _("Another component already includes content view with ID %s" % view.id))
58
62
  end
@@ -21,6 +21,7 @@ module Katello
21
21
  validates_lengths_from_database
22
22
  validates :environment_id, uniqueness: {scope: :content_view_id}, presence: true
23
23
  validates :content_view_id, presence: true
24
+ validates :content_view_version_id, presence: true
24
25
  validates_with Validators::ContentViewEnvironmentOrgValidator
25
26
  validates_with Validators::ContentViewEnvironmentCoherentDefaultValidator
26
27
 
@@ -45,6 +45,7 @@ module Katello
45
45
  :class_name => "Katello::ContentViewVersion", :inverse_of => :components
46
46
  has_many :published_in_composite_content_views, through: :composites, source: :content_view
47
47
  delegate :default, :default?, to: :content_view
48
+ delegate :rolling, :rolling?, to: :content_view
48
49
 
49
50
  validates_lengths_from_database
50
51
 
@@ -185,7 +186,7 @@ module Katello
185
186
  end
186
187
 
187
188
  def archived_repos
188
- self.default? ? self.repositories : self.repos(nil)
189
+ (self.default? || self.rolling?) ? self.repositories : self.repos(nil)
189
190
  end
190
191
 
191
192
  def non_archive_repos
@@ -389,7 +390,7 @@ module Katello
389
390
  end
390
391
 
391
392
  def check_ready_to_promote!(to_env)
392
- fail _("Default content view versions cannot be promoted") if default?
393
+ fail _("Default and Rolling content view versions cannot be promoted") if default? || rolling?
393
394
  content_view.check_composite_action_allowed!(to_env)
394
395
  content_view.check_docker_repository_names!(to_env)
395
396
  content_view.check_orphaned_content_facets!(environments: [to_env])
@@ -105,6 +105,14 @@ module Katello
105
105
  bootc_booted_image.present?
106
106
  end
107
107
 
108
+ def yum_or_yum_transient
109
+ if image_mode_host?
110
+ 'dnf --transient'
111
+ else
112
+ 'yum'
113
+ end
114
+ end
115
+
108
116
  def cves_changed?
109
117
  cves_changed
110
118
  end
@@ -149,6 +157,7 @@ module Katello
149
157
  end
150
158
 
151
159
  # rubocop:disable Metrics/CyclomaticComplexity
160
+ # rubocop:disable Metrics/PerceivedComplexity
152
161
  def assign_single_environment(
153
162
  content_view_id: nil, lifecycle_environment_id: nil, environment_id: nil,
154
163
  content_view: nil, lifecycle_environment: nil, environment: nil
@@ -165,11 +174,15 @@ module Katello
165
174
  end
166
175
 
167
176
  content_view_environment = ::Katello::ContentViewEnvironment
168
- .where(:content_view_id => content_view_id, :environment_id => lifecycle_environment_id)
169
- .first_or_create do |cve|
170
- Rails.logger.info("ContentViewEnvironment not found for content view '#{cve.content_view_name}' and environment '#{cve.environment&.name}'; creating a new one.")
177
+ .find_by(:content_view_id => content_view_id, :environment_id => lifecycle_environment_id)
178
+ if content_view_environment.nil?
179
+ env_label = ::Katello::KTEnvironment.find_by(:id => lifecycle_environment_id)&.label
180
+ fail ::Katello::Errors::ContentViewEnvironmentError, _("Unable to find a lifecycle environment with ID %s") % lifecycle_environment_id if env_label.nil?
181
+ cv_label = ::Katello::ContentView.find_by(:id => content_view_id)&.label
182
+ fail ::Katello::Errors::ContentViewEnvironmentError, _("Unable to find a content view with ID %s") % content_view_id if cv_label.nil?
183
+ hypothetical_cve_label = "%s/%s" % [env_label, cv_label]
184
+ fail ::Katello::Errors::ContentViewEnvironmentError, _("Cannot assign content view environment %s: The content view has either not been published or has not been promoted to that lifecycle environment.") % hypothetical_cve_label
171
185
  end
172
- fail _("Unable to create ContentViewEnvironment. Check the logs for more information.") if content_view_environment.nil?
173
186
 
174
187
  self.content_view_environments = [content_view_environment]
175
188
  end
@@ -453,7 +466,7 @@ module Katello
453
466
  :errata_counts, :id, :kickstart_repository, :kickstart_repository_id, :kickstart_repository_name,
454
467
  :upgradable_deb_count, :upgradable_module_stream_count, :upgradable_rpm_count, :uuid,
455
468
  :installable_security_errata_count, :installable_bugfix_errata_count, :installable_enhancement_errata_count,
456
- :single_content_view, :single_lifecycle_environment, :content_view_environment_labels
469
+ :single_content_view, :single_lifecycle_environment, :content_view_environment_labels, :yum_or_yum_transient
457
470
  end
458
471
  end
459
472
  end
@@ -45,7 +45,9 @@ module Katello
45
45
  end
46
46
 
47
47
  def self.enabled(organization)
48
- joins(:content).where("#{self.content_table_name}.cp_content_id" => Katello::RootRepository.in_organization(organization).select(:content_id))
48
+ content_ids = Katello::RootRepository.in_organization(organization).where.not(content_id: nil).pluck(:content_id)
49
+ structured_apt_content_ids = Katello::Repository.in_organization(organization).library.pluck(:content_id)
50
+ joins(:content).where("#{self.content_table_name}.cp_content_id" => content_ids + structured_apt_content_ids)
49
51
  end
50
52
 
51
53
  def self.with_valid_subscription(organization)
@@ -72,8 +72,6 @@ module Katello
72
72
  has_many :repository_docker_manifest_lists, :class_name => "Katello::RepositoryDockerManifestList", :dependent => :delete_all
73
73
  has_many :docker_manifest_lists, :through => :repository_docker_manifest_lists
74
74
 
75
- has_many :yum_metadata_files, :dependent => :destroy, :class_name => "Katello::YumMetadataFile"
76
-
77
75
  has_many :repository_docker_tags, :class_name => "Katello::RepositoryDockerTag", :dependent => :delete_all
78
76
  has_many :docker_tags, :through => :repository_docker_tags
79
77
 
@@ -718,6 +716,8 @@ module Katello
718
716
  def archived_instance
719
717
  if self.environment_id.nil? || self.library_instance_id.nil?
720
718
  self
719
+ elsif self.content_view.rolling?
720
+ self.library_instance
721
721
  else
722
722
  self.content_view_version.archived_repos.where(:root_id => self.root_id).first
723
723
  end
@@ -1057,7 +1057,7 @@ module Katello
1057
1057
  return [] if version_href.blank?
1058
1058
 
1059
1059
  pulp_api = Katello::Pulp3::Repository.instance_for_type(self, SmartProxy.pulp_primary).api.content_release_components_api
1060
- pulp_api.list({:repository_version => version_href}).results.map { |x| x.component }.uniq
1060
+ pulp_api.list({:repository_version => version_href}).results.map { |x| x.plain_component }.uniq
1061
1061
  end
1062
1062
 
1063
1063
  def deb_sanitize_pulp_distribution(distribution)
@@ -56,7 +56,7 @@ module Katello
56
56
  import_associations(units) if @repository
57
57
  end
58
58
 
59
- if @model_class.many_repository_associations && @repository
59
+ if @repository
60
60
  sync_repository_associations(association_tracker, additive: filtered_indexing)
61
61
  end
62
62
  end
@@ -66,7 +66,7 @@ module Katello
66
66
  end
67
67
 
68
68
  def partial_update(href)
69
- data = PulpCertguardClient::CertguardRHSMCertGuard.new(ca_certificate: ca_cert)
69
+ data = { ca_certificate: ca_cert }
70
70
  rhsm_api_client.partial_update(href, data)
71
71
  end
72
72
 
@@ -211,6 +211,12 @@ module Katello
211
211
  self.class.fetch_from_list { |page_opts| repository_versions_api.list(repository_href, page_opts.merge(options)) }
212
212
  end
213
213
 
214
+ def publications_list_all(args = {})
215
+ self.class.fetch_from_list do |page_opts|
216
+ publications_api.list(page_opts.merge(args))
217
+ end
218
+ end
219
+
214
220
  def distributions_list_all(args = {})
215
221
  self.class.fetch_from_list do |page_opts|
216
222
  distributions_api.list(page_opts.merge(args))
@@ -37,6 +37,62 @@ module Katello
37
37
  repo_version_map
38
38
  end
39
39
 
40
+ def report_misconfigured_repository_version(api, href)
41
+ # Reasons for distributions distributing orphaned repository versions:
42
+ # 1. The sync succeeded but Pulp did not update the publication (yum content)
43
+ # - Fix: completely resync the repository to the smart proxy (need to verify)
44
+ # 2. The sync suceeded but metadata was not generated (non-yum content)
45
+ # - Fix: completely resync the repository on the smart proxy (need to verify)
46
+ # 3. A repository, distribution, and publication was lost track of
47
+ # - Fix: same as 4
48
+ # 4. Pulp content was modified outside of Katello
49
+ # - Fix: find repositories outside of Katello and delete them. Deleting the entire repo works and leaves an orphaned distribution.
50
+ # - If RemoveUnneededRepos goes first, this should be taken care of.
51
+ # 5. An older repository version has a distribution, but the repository is not an orphan
52
+ # - Fix: delete the orphan distribution
53
+ errors = []
54
+ related_distributions = if api.repository_type.publications_api_class.present?
55
+ publication_hrefs = api.publications_list_all(repository_version: href).map(&:pulp_href)
56
+ # Searching distributions by publication isn't supported
57
+ api.distributions_list_all.select { |dist| publication_hrefs.include? dist.publication }
58
+ else
59
+ # Searching distributions by repository version isn't supported
60
+ api.distributions_list_all.select { |dist| dist.repository_version == href }
61
+ end
62
+ repositories_to_redistribute = ::Katello::Repository.where(pulp_id: related_distributions.map(&:name))
63
+ if repositories_to_redistribute.present?
64
+ warning = "Completely resync (skip metadata check) repositories with the following paths to the smart proxy with ID #{smart_proxy.id}: " \
65
+ "#{repositories_to_redistribute.map(&:relative_path).join(', ')}. " \
66
+ "Orphan cleanup is skipped for these repositories until they are fixed on smart proxy with ID #{smart_proxy.id}. " \
67
+ "Try `hammer capsule content synchronize --id #{smart_proxy.id} --skip-metadata-check 1 ...` using " \
68
+ "--repository-id with #{repositories_to_redistribute.map(&:id).join(', ')}."
69
+ errors << warning
70
+ Rails.logger.warn(warning)
71
+ end
72
+ Rails.logger.debug("Orphan cleanup error: investigate the version_href #{href} on the smart proxy with ID #{smart_proxy.id} " \
73
+ "and the related distributions #{related_distributions.map(&:pulp_href)}")
74
+ Rails.logger.debug('It is likely that the related distributions are distributing an older version of the repository.')
75
+ errors
76
+ end
77
+
78
+ # See app/services/katello/pulp3/smart_proxy_repository.rb#delete_orphan_repository_versions for foreman orphan cleanup
79
+ def delete_orphan_repository_versions
80
+ tasks = []
81
+ errors = []
82
+ orphan_repository_versions.each do |api, version_hrefs|
83
+ version_hrefs.each do |href|
84
+ tasks << api.repository_versions_api.delete(href)
85
+ rescue => e
86
+ if e.message.include?('Please update the necessary distributions first.')
87
+ errors << report_misconfigured_repository_version(api, href)
88
+ else
89
+ raise e
90
+ end
91
+ end
92
+ end
93
+ { pulp_tasks: tasks.flatten, errors: errors.flatten }
94
+ end
95
+
40
96
  def delete_orphan_repositories
41
97
  tasks = []
42
98
 
@@ -70,7 +126,8 @@ module Katello
70
126
  def self.orphan_distribution?(distribution)
71
127
  distribution.try(:publication).nil? &&
72
128
  distribution.try(:repository).nil? &&
73
- distribution.try(:repository_version).nil?
129
+ distribution.try(:repository_version).nil? ||
130
+ ::Katello::Repository.pluck(:pulp_id).exclude?(distribution.name)
74
131
  end
75
132
 
76
133
  def delete_orphan_alternate_content_sources
@@ -33,14 +33,53 @@ module Katello
33
33
  katello_repos.select { |repo| repo_ids.include? repo.pulp_id }
34
34
  end
35
35
 
36
+ def report_misconfigured_repository_version(api, href)
37
+ errors = []
38
+ related_distributions = if api.repository_type.publications_api_class.present?
39
+ publication_hrefs = api.publications_list_all(repository_version: href).map(&:pulp_href)
40
+ # Searching distributions by publication isn't supported
41
+ api.distributions_list_all.select { |dist| publication_hrefs.include? dist.publication }
42
+ else
43
+ # Searching distributions by repository version isn't supported
44
+ api.distributions_list_all.select { |dist| dist.repository_version == href }
45
+ end
46
+ repositories_to_redistribute = ::Katello::Repository.joins(:distribution_references)
47
+ .where(:distribution_references => { :href => related_distributions.map(&:pulp_href) })
48
+ if repositories_to_redistribute.present?
49
+ warning = 'Completely resync (skip metadata check) or regenerate metadata for repositories with the following paths: ' \
50
+ "#{repositories_to_redistribute.map(&:relative_path).join(', ')}. " \
51
+ "Orphan cleanup is skipped for these repositories until they are fixed on smart proxy with ID #{smart_proxy.id}. "
52
+ if repositories_to_redistribute.in_default_view.any?
53
+ warning += "Try `hammer repository synchronize --skip-metadata-check 1 ...` using --id with #{repositories_to_redistribute.in_default_view.map(&:id).join(', ')}. " \
54
+ end
55
+ if repositories_to_redistribute.in_non_default_view.any?
56
+ warning += "Try `hammer content-view version republish-repositories ...` using --id with #{repositories_to_redistribute.in_non_default_view.pluck(:content_view_version_id).uniq.join(', ')}." \
57
+ end
58
+ errors << warning
59
+ Rails.logger.warn(warning)
60
+ end
61
+ Rails.logger.debug("Orphan cleanup error: investigate the version_href #{href} " \
62
+ "and the related distributions #{related_distributions.map(&:pulp_href)}")
63
+ Rails.logger.debug('It is likely that the related distributions are distributing an older version of the repository.')
64
+ errors
65
+ end
66
+
67
+ # See app/services/katello/pulp3/smart_proxy_mirror_repository.rb#delete_orphan_repository_versions for content proxy orphan cleanup
36
68
  def delete_orphan_repository_versions
37
69
  tasks = []
70
+ errors = []
38
71
  orphan_repository_versions.each do |api, version_hrefs|
39
- tasks << version_hrefs.collect do |href|
40
- api.repository_versions_api.delete(href)
72
+ version_hrefs.each do |href|
73
+ tasks << api.repository_versions_api.delete(href)
74
+ rescue => e
75
+ if e.message.include?('Please update the necessary distributions first.')
76
+ errors << report_misconfigured_repository_version(api, href)
77
+ else
78
+ raise e
79
+ end
41
80
  end
42
81
  end
43
- tasks.flatten
82
+ { pulp_tasks: tasks.flatten, errors: errors.flatten }
44
83
  end
45
84
 
46
85
  def pulp3_enabled_repo_types
@@ -49,6 +88,31 @@ module Katello
49
88
  end
50
89
  end
51
90
 
91
+ def orphan_distributions
92
+ # Each key is a Pulp 3 plugin API and each value is the list of version_hrefs
93
+ distribution_map = {}
94
+ pulp3_enabled_repo_types.each do |repo_type|
95
+ api = repo_type.pulp3_api(smart_proxy)
96
+ katello_dist_hrefs = ::Katello::RootRepository.where(content_type: repo_type.id)
97
+ .joins(:repositories => :distribution_references)
98
+ .pluck(:href)
99
+ pulp_dist_hrefs = api.distributions_list_all.map(&:pulp_href)
100
+ distribution_map[api] = pulp_dist_hrefs - katello_dist_hrefs
101
+ end
102
+
103
+ distribution_map
104
+ end
105
+
106
+ def delete_orphan_distributions
107
+ tasks = []
108
+ orphan_distributions.each do |api, hrefs|
109
+ tasks << hrefs.collect do |href|
110
+ api.distributions_api.delete(href)
111
+ end
112
+ end
113
+ tasks.flatten
114
+ end
115
+
52
116
  def orphan_repository_versions
53
117
  # Each key is a Pulp 3 plugin API and each value is the list of version_hrefs
54
118
  repo_version_map = {}
@@ -1,5 +1,6 @@
1
1
  module Katello
2
2
  class SmartProxyHelper
3
+ include ::Actions::Helpers::RollingCVRepos
3
4
  attr_accessor :smart_proxy
4
5
 
5
6
  def initialize(smart_proxy)
@@ -39,7 +40,11 @@ module Katello
39
40
  def combined_repos_available_to_capsule(environment = nil, content_view = nil, repository = nil)
40
41
  lifecycle_environment_check(environment, repository)
41
42
  if repository && !library_export_repo(repository)
42
- [repository]
43
+ if repository.library_instance?
44
+ [repository] + find_related_rolling_repos(repository)
45
+ else
46
+ [repository]
47
+ end
43
48
  else
44
49
  repositories_available_to_capsule(environment, content_view)
45
50
  end
@@ -20,6 +20,20 @@ kind: job_template
20
20
  <%= render_template('Run Command - Ansible Default', :command => "zypper -n install -t patch #{advisories}") %>
21
21
  <% else -%>
22
22
  <% advisories = input(:errata).split(',').map { |e| "--advisory=#{e}" }.join(' ') -%>
23
- <%= render_template('Run Command - Ansible Default', :command => "yum -y update-minimal #{advisories}") %>
23
+ ---
24
+ - hosts: all
25
+ tasks:
26
+ <%= indent(4) { snippet('check_bootc_status') } %>
27
+ - name: Install errata via dnf for image mode machines
28
+ shell:
29
+ cmd: 'dnf -y --transient update-minimal <%= advisories %>'
30
+ register: out
31
+ when: is_bootc_host
32
+ - name: Install errata normally
33
+ shell:
34
+ cmd: 'yum -y update-minimal <%= advisories %>'
35
+ register: out
36
+ when: not is_bootc_host
37
+ - debug: var=out
24
38
  <% end -%>
25
39
  <%= snippet_if_exists(template_name + " custom post") %>
@@ -21,6 +21,20 @@ template_inputs:
21
21
  <%= render_template('Run Command - Ansible Default', :command => "zypper -n install -t patch #{advisory_ids.join(' ')}") %>
22
22
  <% else -%>
23
23
  <% advisories = advisory_ids.map { |e| "--advisory=#{e}" }.join(' ') -%>
24
- <%= render_template('Run Command - Ansible Default', :command => "yum -y update-minimal #{advisories}") %>
24
+ ---
25
+ - hosts: all
26
+ tasks:
27
+ <%= indent(4) { snippet('check_bootc_status') } %>
28
+ - name: Install errata via dnf for image mode machines
29
+ shell:
30
+ cmd: 'dnf -y --transient update-minimal <%= advisories %>'
31
+ register: out
32
+ when: is_bootc_host
33
+ - name: Install errata normally
34
+ shell:
35
+ cmd: 'yum -y update-minimal <%= advisories %>'
36
+ register: out
37
+ when: not is_bootc_host
38
+ - debug: var=out
25
39
  <% end -%>
26
40
  <%= snippet_if_exists(template_name + " custom post") %>
@@ -12,5 +12,18 @@ template_inputs:
12
12
  provider_type: Ansible
13
13
  kind: job_template
14
14
  %>
15
-
16
- <%= render_template('Run Command - Ansible Default', :command => "yum -y group install #{input('package')}") %>
15
+ ---
16
+ - hosts: all
17
+ tasks:
18
+ <%= indent(4) { snippet('check_bootc_status') } %>
19
+ - name: Install groups via dnf for image mode machines
20
+ shell:
21
+ cmd: 'dnf -y --transient groupinstall <%= input('package') %>'
22
+ register: out
23
+ when: is_bootc_host
24
+ - name: Install groups normally
25
+ shell:
26
+ cmd: 'yum -y groupinstall <%= input('package') %>'
27
+ register: out
28
+ when: not is_bootc_host
29
+ - debug: var=out
@@ -18,11 +18,30 @@ template_inputs:
18
18
  ---
19
19
  - hosts: all
20
20
  tasks:
21
- - package:
21
+ <%= indent(4) { snippet('check_bootc_status') } %>
22
+ - name: Enable bootc overlay
23
+ shell:
24
+ cmd: 'bootc usr-overlay'
25
+ register: out
26
+ ignore_errors: true
27
+ when: is_bootc_host
28
+ - debug: var=out
29
+ - name: Install packages via dnf for image mode machines
30
+ package:
31
+ use: 'dnf'
22
32
  <% if package_names.empty? -%>
23
33
  name: []
24
34
  <% else -%>
25
35
  name: <%= indent(10) { to_yaml(package_names).gsub(/---/, "") } -%>
26
36
  state: present
27
37
  <% end -%>
28
-
38
+ when: is_bootc_host
39
+ - name: Install packages normally
40
+ package:
41
+ <% if package_names.empty? -%>
42
+ name: []
43
+ <% else -%>
44
+ name: <%= indent(10) { to_yaml(package_names).gsub(/---/, "") } -%>
45
+ state: present
46
+ <% end -%>
47
+ when: not is_bootc_host
@@ -13,4 +13,18 @@ provider_type: Ansible
13
13
  kind: job_template
14
14
  %>
15
15
 
16
- <%= render_template('Run Command - Ansible Default', :command => "yum -y group remove #{input('package')}") %>
16
+ ---
17
+ - hosts: all
18
+ tasks:
19
+ <%= indent(4) { snippet('check_bootc_status') } %>
20
+ - name: Remove groups via dnf for image mode machines
21
+ shell:
22
+ cmd: 'dnf -y --transient group remove <%= input('package') %>'
23
+ register: out
24
+ when: is_bootc_host
25
+ - name: Remove groups normally
26
+ shell:
27
+ cmd: 'yum -y group remove <%= input('package') %>'
28
+ register: out
29
+ when: not is_bootc_host
30
+ - debug: var=out
@@ -18,9 +18,28 @@ template_inputs:
18
18
  ---
19
19
  - hosts: all
20
20
  tasks:
21
- - package:
21
+ <%= indent(4) { snippet('check_bootc_status') } %>
22
+ - name: Enable bootc overlay
23
+ shell:
24
+ cmd: 'bootc usr-overlay'
25
+ register: out
26
+ ignore_errors: true
27
+ when: is_bootc_host
28
+ - debug: var=out
29
+ - name: Remove packages via dnf for image mode machines
30
+ package:
22
31
  name:
23
32
  <% package_names.each do |package_name| -%>
24
33
  - <%= package_name %>
25
34
  <% end -%>
26
35
  state: absent
36
+ use: 'dnf'
37
+ when: is_bootc_host
38
+ - name: Remove packages normally
39
+ package:
40
+ name:
41
+ <% package_names.each do |package_name| -%>
42
+ - <%= package_name %>
43
+ <% end -%>
44
+ state: absent
45
+ when: not is_bootc_host