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
@@ -43,6 +43,9 @@ module Katello
43
43
  param :repository_ids, Array, :desc => N_("list of repository ids")
44
44
  param :description, String, :desc => N_("description of the filter")
45
45
  def create
46
+ if @view.rolling?
47
+ fail HttpErrors::BadRequest, _("It's not possible to create a filter for a rolling content view.")
48
+ end
46
49
  params[:type] = "erratum" if (params[:type] == "erratum_date" || params[:type] == "erratum_id")
47
50
  filter = ContentViewFilter.create_for(params[:type], filter_params.merge(:content_view => @view))
48
51
  respond :resource => filter
@@ -60,6 +60,9 @@ module Katello
60
60
  param :environment_ids, Array, :desc => N_("Identifiers for Lifecycle Environment")
61
61
  param :description, String, :desc => N_("The description for the content view version promotion")
62
62
  def promote
63
+ if @view.rolling?
64
+ fail HttpErrors::BadRequest, _("It's not possible to promote a rolling content view.")
65
+ end
63
66
  is_force = ::Foreman::Cast.to_bool(params[:force])
64
67
  task = async_task(::Actions::Katello::ContentView::Promote,
65
68
  @content_view_version, @environments, is_force, params[:description])
@@ -97,6 +100,9 @@ Alternatively, use the 'force' parameter to regenerate metadata locally. New ver
97
100
  api :DELETE, "/content_view_versions/:id", N_("Remove content view version")
98
101
  param :id, :number, :desc => N_("Content view version identifier"), :required => true
99
102
  def destroy
103
+ if @view.rolling?
104
+ fail HttpErrors::BadRequest, _("It's not possible to destroy a version of a rolling content view.")
105
+ end
100
106
  task = async_task(::Actions::Katello::ContentViewVersion::Destroy, @content_view_version)
101
107
  respond_for_async :resource => task
102
108
  end
@@ -84,12 +84,14 @@ module Katello
84
84
  param :name, String, :desc => N_("Name of the content view"), :required => true
85
85
  param :label, String, :desc => N_("Content view label")
86
86
  param :composite, :bool, :desc => N_("Composite content view")
87
+ param :rolling, :bool, :desc => N_("Rolling content view")
87
88
  param_group :content_view
88
89
  def create
89
90
  @content_view = ContentView.create!(view_params) do |view|
90
91
  view.organization = @organization
91
92
  view.label ||= labelize_params(params[:content_view])
92
93
  end
94
+ sync_task(::Actions::Katello::ContentView::Create, @content_view)
93
95
 
94
96
  respond :resource => @content_view
95
97
  end
@@ -192,6 +194,9 @@ module Katello
192
194
  param :key_content_view_id, :number, :desc => N_("content view to reassign orphaned activation keys to")
193
195
  param :key_environment_id, :number, :desc => N_("environment to reassign orphaned activation keys to")
194
196
  def bulk_delete_versions
197
+ if @content_view.rolling?
198
+ fail HttpErrors::BadRequest, _("It's not possible to bulk remove versions from a rolling content view.")
199
+ end
195
200
  params[:bulk_content_view_version_ids] ||= {}
196
201
 
197
202
  versions = find_bulk_items(bulk_params: params[:bulk_content_view_version_ids],
@@ -237,6 +242,9 @@ module Katello
237
242
  param :name, String, :required => true, :desc => N_("New content view name")
238
243
  def copy
239
244
  @content_view = Katello::ContentView.readable.find_by(:id => params[:id])
245
+ if @content_view.rolling?
246
+ fail HttpErrors::BadRequest, _("It's not possible to copy a rolling content view.")
247
+ end
240
248
  throw_resource_not_found(name: 'content_view', id: params[:id]) if @content_view.blank?
241
249
  ensure_non_default
242
250
  new_content_view = @content_view.copy(params[:content_view][:name])
@@ -246,6 +254,9 @@ module Katello
246
254
  private
247
255
 
248
256
  def validate_publish_params!
257
+ if @content_view.rolling?
258
+ fail HttpErrors::BadRequest, _("It's not possible to publish a rolling content view.")
259
+ end
249
260
  if params[:repos_units].present? && @content_view.composite?
250
261
  fail HttpErrors::BadRequest, _("Directly setting package lists on composite content views is not allowed. Please " \
251
262
  "update the components, then re-publish the composite.")
@@ -284,7 +295,7 @@ module Katello
284
295
  def view_params
285
296
  attrs = [:name, :description, :auto_publish, :solve_dependencies, :import_only,
286
297
  :default, :created_at, :updated_at, :next_version, {:component_ids => []}]
287
- attrs.push(:label, :composite) if action_name == "create"
298
+ attrs.push(:label, :composite, :rolling) if action_name == "create"
288
299
  if (!@content_view || !@content_view.composite?)
289
300
  attrs.push({:repository_ids => []}, :repository_ids)
290
301
  end
@@ -108,6 +108,9 @@ module Katello
108
108
  @version = ContentViewVersion.exportable.find_by_id(params[:id])
109
109
  throw_resource_not_found(name: 'content view version', id: params[:id]) if @version.blank?
110
110
  @view = @version.content_view
111
+ if @view.rolling?
112
+ fail HttpErrors::BadRequest, _("It's not possible to export a rolling content view.")
113
+ end
111
114
  end
112
115
 
113
116
  def find_history
@@ -240,20 +240,18 @@ module Katello
240
240
  def find_content_overrides
241
241
  if !params.dig(:content_overrides_search, :search).nil?
242
242
 
243
- content_labels = ::Katello::Content.joins(:product_contents)
244
- .where("#{Katello::ProductContent.table_name}.product_id": @host.organization.products.subscribable.enabled)
245
- .search_for(params[:content_overrides_search][:search])
246
- .pluck(:label)
247
-
248
- if Foreman::Cast.to_bool(params.dig(:content_overrides_search, :limit_to_env))
249
- env_content = ProductContentFinder.new(
250
- :match_subscription => false,
251
- :match_environment => true,
252
- :consumable => @host.subscription_facet
253
- ).product_content
254
- env_content_labels = ::Katello::Content.find(env_content.pluck(:content_id)).pluck(:label)
255
- content_labels &= env_content_labels
256
- end
243
+ content = ::Katello::Content.joins(:product_contents)
244
+ .where("#{Katello::ProductContent.table_name}.product_id": @host.organization.products.subscribable.enabled)
245
+
246
+ env_content = ProductContentFinder.new(
247
+ :match_subscription => false,
248
+ :match_environment => Foreman::Cast.to_bool(params.dig(:content_overrides_search, :limit_to_env)),
249
+ :consumable => @host.subscription_facet
250
+ ).product_content
251
+ content = content.where(id: env_content.pluck(:content_id))
252
+
253
+ content_labels = content.search_for(params[:content_overrides_search][:search])
254
+ .pluck(:label)
257
255
 
258
256
  @content_overrides = content_labels.map do |label|
259
257
  { content_label: label,
@@ -109,16 +109,16 @@ module Katello
109
109
  respond_for_async :resource => task
110
110
  end
111
111
 
112
- api :PUT, "/organizations/:label/cancel_repo_discover", N_("Cancel repository discovery")
113
- param :label, String, :desc => N_("Organization label")
112
+ api :PUT, "/organizations/:id/cancel_repo_discover", N_("Cancel repository discovery")
113
+ param :id, String, :desc => N_("Organization ID or title")
114
114
  param :url, String, :desc => N_("base url to perform repo discovery on")
115
115
  def cancel_repo_discover
116
116
  task = @organization.cancel_repo_discovery
117
117
  respond_for_async :resource => task
118
118
  end
119
119
 
120
- api :GET, "/organizations/:label/download_debug_certificate", N_("Download a debug certificate")
121
- param :label, String, :desc => N_("Organization label")
120
+ api :GET, "/organizations/:id/download_debug_certificate", N_("Download a debug certificate")
121
+ param :id, String, :desc => N_("Organization ID or title")
122
122
  def download_debug_certificate
123
123
  pem = @organization.debug_cert
124
124
  data = "#{pem[:key]}\n\n#{pem[:cert]}"
@@ -168,11 +168,15 @@ module Katello
168
168
 
169
169
  protected
170
170
 
171
+ def organization_export_content_permission?
172
+ org = Organization.friendly.find(params[:id])
173
+ org&.authorized?(:export_content)
174
+ end
175
+
171
176
  def action_permission
172
177
  if params[:action] == "releases"
173
178
  :view
174
- elsif params[:action] == "download_debug_certificate" &&
175
- Organization.find(params[:id]).authorized?(:export_content)
179
+ elsif params[:action] == "download_debug_certificate" && organization_export_content_permission?
176
180
  :view
177
181
  elsif %w(download_debug_certificate redhat_provider repo_discover cdn_configuration
178
182
  cancel_repo_discover).include?(params[:action])
@@ -182,10 +186,6 @@ module Katello
182
186
  end
183
187
  end
184
188
 
185
- def resource_identifying_attributes
186
- %w(id label)
187
- end
188
-
189
189
  def skip_nested_id
190
190
  ["default_content_view_id", "library_id"]
191
191
  end
@@ -119,7 +119,11 @@ module Katello
119
119
  return deny_access unless KTEnvironment.promotable.where(:id => env_ids).count == env_ids.size && view.promotable_or_removable?
120
120
 
121
121
  total_count = Katello::Host::ContentFacet.with_content_views(view).with_environments(env_ids).count
122
- if total_count > 0
122
+ single_env_host_count = Katello::Host::ContentFacet
123
+ .with_content_views(view)
124
+ .with_environments(env_ids)
125
+ .count { |facet| !facet.multi_content_view_environment? }
126
+ if single_env_host_count > 0
123
127
  unless options[:system_content_view_id] && options[:system_environment_id]
124
128
  fail _("Unable to reassign content hosts. Please provide system_content_view_id and system_environment_id.")
125
129
  end
@@ -132,7 +136,9 @@ module Katello
132
136
  end
133
137
  end
134
138
 
135
- if Katello::ActivationKey.with_content_views(view).with_environments(env_ids).count > 0
139
+ keys = Katello::ActivationKey.with_content_views(view).with_environments(env_ids)
140
+ single_env_keys_exist = keys.any? { |key| !key.multi_content_view_environment? }
141
+ if single_env_keys_exist
136
142
  # if we are reassigning activation key environments/ cv
137
143
  # make sure the activation key using present environments or cv are editable.
138
144
  unless options[:key_content_view_id] && options[:key_environment_id]
@@ -0,0 +1,25 @@
1
+ module Actions
2
+ module Helpers
3
+ module RollingCVRepos
4
+ def find_related_rolling_repos(repo)
5
+ repo.root.repositories.in_environment(repo.environment).where(
6
+ content_view_version: ::Katello::ContentViewVersion.where(content_view: ::Katello::ContentView.rolling)
7
+ )
8
+ end
9
+
10
+ def update_rolling_content_views(repo)
11
+ concurrence do
12
+ find_related_rolling_repos(repo).each do |rolling_repo|
13
+ plan_action(::Actions::Katello::ContentView::RefreshRollingRepo, rolling_repo, true)
14
+ end
15
+ end
16
+ end
17
+
18
+ def update_rolling_content_views_async(repo, contents_changed)
19
+ find_related_rolling_repos(repo).each do |rolling_repo|
20
+ ForemanTasks.async_task(::Actions::Katello::ContentView::RefreshRollingRepo, rolling_repo, contents_changed)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -2,6 +2,7 @@ module Actions
2
2
  module Katello
3
3
  module CapsuleContent
4
4
  class SyncCapsule < ::Actions::EntryAction
5
+ include Helpers::RollingCVRepos
5
6
  # rubocop:disable Metrics/MethodLength
6
7
  execution_plan_hooks.use :update_content_counts, :on => :success
7
8
  def plan(smart_proxy, options = {})
@@ -58,7 +59,11 @@ module Actions
58
59
  smart_proxy_helper.lifecycle_environment_check(environment, repository)
59
60
  if repository
60
61
  if skip_metatadata_check || !repository.smart_proxy_sync_histories.where(:smart_proxy_id => smart_proxy).any? { |sph| !sph.finished_at.nil? }
61
- [repository]
62
+ if repository.library_instance?
63
+ [repository] + find_related_rolling_repos(repository)
64
+ else
65
+ [repository]
66
+ end
62
67
  end
63
68
  else
64
69
  repositories = smart_proxy_helper.repositories_available_to_capsule(environment, content_view).by_rpm_count
@@ -0,0 +1,39 @@
1
+ module Actions
2
+ module Katello
3
+ module ContentView
4
+ class AddRollingRepoClone < Actions::EntryAction
5
+ def plan(content_view, repository_ids)
6
+ library = content_view.organization.library
7
+ clone_ids = []
8
+
9
+ concurrence do
10
+ ::Katello::Repository.where(id: repository_ids).each do |repository|
11
+ sequence do
12
+ clone = content_view.get_repo_clone(library, repository).first
13
+ if clone.nil?
14
+ clone = repository.build_clone(content_view: content_view, environment: library)
15
+ clone.save!
16
+ end
17
+ plan_action(RefreshRollingRepo, clone, false)
18
+
19
+ view_env_cp_id = content_view.content_view_environment(library).cp_id
20
+ content_id = repository.content_id
21
+ plan_action(Actions::Candlepin::Environment::AddContentToEnvironment, :view_env_cp_id => view_env_cp_id, :content_id => content_id)
22
+ clone_ids << clone.id
23
+ end
24
+ end
25
+ end
26
+ plan_self(repository_ids: clone_ids)
27
+ end
28
+
29
+ def run
30
+ if Setting[:foreman_proxy_content_auto_sync]
31
+ ::Katello::Repository.where(id: input[:repository_ids]).each do |repo|
32
+ ForemanTasks.async_task(::Actions::Katello::Repository::CapsuleSync, repo)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -4,6 +4,9 @@ module Actions
4
4
  class Create < Actions::Base
5
5
  def plan(content_view)
6
6
  content_view.save!
7
+ if content_view.rolling?
8
+ plan_action(AddToEnvironment, content_view.create_new_version, content_view.organization.library)
9
+ end
7
10
  end
8
11
 
9
12
  def humanized_name
@@ -0,0 +1,40 @@
1
+ module Actions
2
+ module Katello
3
+ module ContentView
4
+ class RefreshRollingRepo < Actions::EntryAction
5
+ def plan(repository, contents_changed)
6
+ action_subject repository
7
+ sequence do
8
+ plan_self(repository_id: repository.id, contents_changed: contents_changed)
9
+ plan_action(Pulp3::Repository::RefreshDistribution, repository, SmartProxy.pulp_primary)
10
+ plan_action(Repository::IndexContent, id: repository.id, source_repository_id: repository.library_instance.id)
11
+ plan_action(Actions::Katello::Applicability::Repository::Regenerate, :repo_ids => [repository.id])
12
+ end
13
+ end
14
+
15
+ def humanized_name
16
+ _('Refresh RollingCV Repo')
17
+ end
18
+
19
+ def run
20
+ repository = ::Katello::Repository.find(input[:repository_id])
21
+ library_instance = repository.library_instance
22
+ # ensure IndexContent is not skipped!
23
+ repository.last_contents_changed = DateTime.now if repository.version_href != library_instance.version_href
24
+
25
+ repository.version_href = library_instance.version_href
26
+ repository.publication_href = library_instance.publication_href
27
+ if repository.deb_using_structured_apt?
28
+ repository.content_id = library_instance.content_id
29
+ end
30
+ repository.save!
31
+ end
32
+
33
+ def finalize
34
+ repository = ::Katello::Repository.find(input[:repository_id])
35
+ repository.clear_smart_proxy_sync_histories if input[:contents_changed]
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -119,13 +119,17 @@ module Actions
119
119
  end
120
120
  all_cv_envs = combined_cv_envs(cv_envs, versions)
121
121
 
122
- if all_cv_envs.flat_map(&:hosts).any? && !cve_exists?(options[:system_environment_id],
123
- options[:system_content_view_id])
122
+ single_env_hosts_exist = all_cv_envs.flat_map(&:hosts).any? do |host|
123
+ !host.content_facet.multi_content_view_environment?
124
+ end
125
+ if single_env_hosts_exist && !cve_exists?(options[:system_environment_id], options[:system_content_view_id])
124
126
  fail _("Unable to reassign systems. Please check system_content_view_id and system_environment_id.")
125
127
  end
126
128
 
127
- if all_cv_envs.flat_map(&:activation_keys).any? && !cve_exists?(options[:key_environment_id],
128
- options[:key_content_view_id])
129
+ single_env_keys_exist = all_cv_envs.flat_map(&:activation_keys).any? do |key|
130
+ !key.multi_content_view_environment?
131
+ end
132
+ if single_env_keys_exist && !cve_exists?(options[:key_environment_id], options[:key_content_view_id])
129
133
  fail _("Unable to reassign activation_keys. Please check activation_key_content_view_id and activation_key_environment_id.")
130
134
  end
131
135
  end
@@ -0,0 +1,28 @@
1
+ module Actions
2
+ module Katello
3
+ module ContentView
4
+ class RemoveRollingRepoClone < Actions::EntryAction
5
+ def plan(content_view, repository_ids)
6
+ library = content_view.organization.library
7
+
8
+ clone_repo_ids = []
9
+ concurrence do
10
+ ::Katello::Repository.where(id: repository_ids).each do |repository|
11
+ clone_repo = content_view.get_repo_clone(library, repository).first
12
+ next if clone_repo.nil?
13
+
14
+ clone_repo_ids << clone_repo.id
15
+ plan_action(Actions::Pulp3::Repository::DeleteDistributions, clone_repo.id, SmartProxy.pulp_primary)
16
+ end
17
+ plan_action(Candlepin::Environment::SetContent, content_view, library, content_view.content_view_environment(library))
18
+ end
19
+ plan_self(repository_ids: clone_repo_ids)
20
+ end
21
+
22
+ def run
23
+ ::Katello::Repository.where(id: input[:repository_ids]).destroy_all
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -28,6 +28,14 @@ module Actions
28
28
  end
29
29
  end
30
30
 
31
+ if content_view.rolling? && content_view_params.key?(:repository_ids)
32
+ repo_ids_to_add = content_view_params[:repository_ids] - content_view.repository_ids
33
+ repo_ids_to_remove = content_view.repository_ids - content_view_params[:repository_ids]
34
+
35
+ plan_action(AddRollingRepoClone, content_view, repo_ids_to_add) if repo_ids_to_add.any?
36
+ plan_action(RemoveRollingRepoClone, content_view, repo_ids_to_remove) if repo_ids_to_remove.any?
37
+ end
38
+
31
39
  content_view.update!(content_view_params)
32
40
  end
33
41
  end
@@ -21,11 +21,10 @@ module Actions
21
21
  errata = errata_match?(source_repo, target_repo)
22
22
  package_groups = package_groups_match?(source_repo, target_repo)
23
23
  distributions = distributions_match?(source_repo, target_repo)
24
- yum_metadata_files = yum_metadata_files_match?(source_repo, target_repo)
25
24
  checksum_match = (target_repo.saved_checksum_type == source_repo.saved_checksum_type)
26
25
 
27
26
  output[:checksum_match] = checksum_match
28
- output[:matching_content] = yum_metadata_files && srpms_match && rpms && errata && package_groups && distributions && target_repo_published && checksum_match
27
+ output[:matching_content] = srpms_match && rpms && errata && package_groups && distributions && target_repo_published && checksum_match
29
28
  end
30
29
 
31
30
  if source_repo.content_type == ::Katello::Repository::DEB_TYPE
@@ -66,12 +65,6 @@ module Actions
66
65
  def distributions_match?(source_repo, target_repo)
67
66
  source_repo.distribution_information == target_repo.distribution_information
68
67
  end
69
-
70
- def yum_metadata_files_match?(source_repo, target_repo)
71
- source_repo_items = source_repo.yum_metadata_files.pluck(:name, :checksum).sort.uniq
72
- target_repo_items = target_repo.yum_metadata_files.pluck(:name, :checksum).sort.uniq
73
- source_repo_items == target_repo_items
74
- end
75
68
  end
76
69
  end
77
70
  end
@@ -3,6 +3,8 @@ module Actions
3
3
  module Katello
4
4
  module Repository
5
5
  class ImportUpload < Actions::EntryAction
6
+ include Helpers::RollingCVRepos
7
+
6
8
  # rubocop:disable Metrics/MethodLength
7
9
  def plan(repository, uploads, options = {})
8
10
  action_subject(repository)
@@ -52,6 +54,9 @@ module Actions
52
54
  plan_action(Katello::Repository::MetadataGenerate, repository, force_publication: true) if generate_metadata
53
55
  plan_action(Actions::Katello::Applicability::Repository::Regenerate, :repo_ids => [repository.id]) if generate_applicability
54
56
  plan_self(repository_id: repository.id, sync_capsule: sync_capsule, upload_results: upload_results)
57
+
58
+ # Refresh rolling CVs that have this repository
59
+ update_rolling_content_views(repository)
55
60
  end
56
61
  end
57
62
  # rubocop:enable Metrics/MethodLength
@@ -5,6 +5,7 @@ module Actions
5
5
  class Sync < Actions::EntryAction
6
6
  extend ApipieDSL::Class
7
7
  include Helpers::Presenter
8
+ include Helpers::RollingCVRepos
8
9
  include ::Actions::ObservableAction
9
10
  middleware.use Actions::Middleware::ExecuteIfContentsChanged
10
11
 
@@ -62,16 +63,19 @@ module Actions
62
63
  end
63
64
 
64
65
  def run
66
+ end
67
+
68
+ def finalize
65
69
  repo = ::Katello::Repository.find(input[:id])
70
+ if repo
71
+ repo&.audit_sync
72
+ update_rolling_content_views_async(repo, input[:contents_changed])
73
+ end
66
74
  repo.clear_smart_proxy_sync_histories if input[:contents_changed]
67
75
  ForemanTasks.async_task(Repository::CapsuleSync, repo) if Setting[:foreman_proxy_content_auto_sync]
68
76
  rescue ::Katello::Errors::CapsuleCannotBeReached # skip any capsules that cannot be connected to
69
77
  end
70
78
 
71
- def finalize
72
- ::Katello::Repository.find(input[:id])&.audit_sync
73
- end
74
-
75
79
  def humanized_name
76
80
  if input && input[:validate_contents]
77
81
  _("Synchronize: Validate Content")
@@ -6,6 +6,8 @@ module Actions
6
6
  module Katello
7
7
  module Repository
8
8
  class UploadFiles < Actions::EntryAction
9
+ include Helpers::RollingCVRepos
10
+
9
11
  def plan(repository, files, content_type = nil, options = {})
10
12
  action_subject(repository)
11
13
  repository.check_ready_to_act!
@@ -38,6 +40,9 @@ module Actions
38
40
  plan_action(FinishUpload, repository, content_type: content_type, upload_actions: upload_actions)
39
41
  plan_self(tmp_files: tmp_files)
40
42
  plan_action(Actions::Katello::Applicability::Repository::Regenerate, :repo_ids => [repository.id]) if generate_applicability
43
+
44
+ # Refresh rolling CVs that have this repository
45
+ update_rolling_content_views(repository)
41
46
  end
42
47
  ensure
43
48
  # Delete tmp files when some exception occurred. Would be
@@ -46,7 +51,8 @@ module Actions
46
51
  end
47
52
 
48
53
  def run
49
- ForemanTasks.async_task(Repository::CapsuleSync, ::Katello::Repository.find(input[:repository][:id])) if Setting[:foreman_proxy_content_auto_sync]
54
+ repository = ::Katello::Repository.find(input[:repository][:id])
55
+ ForemanTasks.async_task(Repository::CapsuleSync, repository) if Setting[:foreman_proxy_content_auto_sync]
50
56
  rescue ::Katello::Errors::CapsuleCannotBeReached # skip any capsules that cannot be connected to
51
57
  end
52
58
 
@@ -6,13 +6,14 @@ module Actions
6
6
  def plan(proxy)
7
7
  if proxy.pulp3_enabled?
8
8
  sequence do
9
- plan_action(Actions::Pulp3::OrphanCleanup::DeleteOrphanRepositoryVersions, proxy)
10
9
  if proxy.pulp_mirror?
11
10
  plan_action(Actions::Pulp3::OrphanCleanup::RemoveUnneededRepos, proxy)
12
- plan_action(Actions::Pulp3::OrphanCleanup::DeleteOrphanDistributions, proxy)
13
11
  plan_action(Actions::Pulp3::OrphanCleanup::DeleteOrphanAlternateContentSources, proxy)
14
12
  plan_action(Actions::Pulp3::OrphanCleanup::DeleteOrphanRemotes, proxy)
15
13
  end
14
+ # Deleting repos causes orphaned distributions, so delete them before the distributions.
15
+ plan_action(Actions::Pulp3::OrphanCleanup::DeleteOrphanDistributions, proxy)
16
+ plan_action(Actions::Pulp3::OrphanCleanup::DeleteOrphanRepositoryVersions, proxy)
16
17
  plan_action(Actions::Pulp3::OrphanCleanup::RemoveOrphans, proxy)
17
18
  plan_action(Actions::Pulp3::OrphanCleanup::PurgeCompletedTasks, proxy)
18
19
  end
@@ -6,8 +6,15 @@ module Actions
6
6
  plan_self(:smart_proxy_id => smart_proxy.id)
7
7
  end
8
8
 
9
+ def rescue_strategy
10
+ Dynflow::Action::Rescue::Skip
11
+ end
12
+
9
13
  def run
10
- output[:pulp_tasks] = ::Katello::Pulp3::SmartProxyRepository.instance_for_type(smart_proxy).delete_orphan_repository_versions
14
+ cleanup_outputs = ::Katello::Pulp3::SmartProxyRepository.instance_for_type(smart_proxy).delete_orphan_repository_versions
15
+ output[:pulp_tasks] = cleanup_outputs[:pulp_tasks]
16
+ output[:errors] = cleanup_outputs[:errors]
17
+ fail ::Katello::Errors::OrphanCleanupRepoVersionDeleteError if output[:errors].any?
11
18
  end
12
19
  end
13
20
  end
@@ -14,6 +14,8 @@ module Katello
14
14
 
15
15
  class MultiEnvironmentNotSupportedError < StandardError; end
16
16
 
17
+ class ContentViewEnvironmentError < StandardError; end
18
+
17
19
  # unauthorized access
18
20
  class SecurityViolation < StandardError; end
19
21
 
@@ -170,5 +172,11 @@ module Katello
170
172
  _("This Organization's subscription manifest has expired. Please import a new manifest.")
171
173
  end
172
174
  end
175
+
176
+ class OrphanCleanupRepoVersionDeleteError < StandardError
177
+ def message
178
+ _('Orphan cleanup failed to delete some Pulp repository versions. Check the logs for more details.')
179
+ end
180
+ end
173
181
  end
174
182
  end
@@ -3,12 +3,13 @@ module Katello
3
3
  class ContainerImageNameValidator < ActiveModel::EachValidator
4
4
  def validate_each(record, attribute, value)
5
5
  if value && !ContainerImageNameValidator.validate_name(value)
6
- record.errors.add(attribute, N_("invalid container image name"))
6
+ record.errors.add(attribute, N_("The generated container repository name is invalid. Please review the lifecycle environment's registry name pattern. It may be caused by special characters in the components that make up the name, like the organization."))
7
7
  end
8
8
  end
9
9
 
10
10
  def self.validate_name(name)
11
- if name.empty? || name.length > 255 || !/\A([a-z0-9]+[a-z0-9\-_.]*)+(\/[a-z0-9]+[a-z0-9\-_.]*)*\z/.match?(name)
11
+ # regexp-source: https://specs.opencontainers.org/distribution-spec/?v=v1.0.0#DISTRIBUTION-SPEC-26
12
+ if name.empty? || name.length > 255 || !/\A[a-z0-9]+([\-_.][a-z0-9]+)*(\/[a-z0-9]+([\-_.][a-z0-9]+)*)*\z/.match?(name)
12
13
  return false
13
14
  end
14
15
  true
@@ -37,7 +37,17 @@ module Katello
37
37
  joins(:root).where("#{Repository.table_name}.id in (?) or #{self.table_name}.id in (?) or #{self.table_name}.id in (?) or #{self.table_name}.id in (?)", in_products, in_content_views, in_versions, in_environments)
38
38
  end
39
39
 
40
- def readable_docker_catalog
40
+ def readable_docker_catalog(host = nil)
41
+ if host
42
+ repo_ids = nil
43
+ if host&.content_view_environments&.any?
44
+ repo_ids = host.content_view_environments.flat_map do |cve|
45
+ cve&.content_view_version&.repositories&.where(environment_id: cve.environment)&.non_archived&.docker_type&.pluck(:id)
46
+ end
47
+ end
48
+ repos = Katello::Repository.where(id: repo_ids)
49
+ return repos
50
+ end
41
51
  readable_docker_catalog_as(User.current)
42
52
  end
43
53
 
@@ -89,7 +89,7 @@ module Katello
89
89
  prepend Overrides
90
90
 
91
91
  delegate :content_source_id, :single_content_view, :single_lifecycle_environment, :default_environment?, :single_content_view_environment?, :multi_content_view_environment?, :kickstart_repository_id, :bound_repositories,
92
- :content_view_environment_labels, :installable_errata, :installable_rpms, :image_mode_host?, to: :content_facet, allow_nil: true
92
+ :content_view_environment_labels, :installable_errata, :installable_rpms, :image_mode_host?, :yum_or_yum_transient, to: :content_facet, allow_nil: true
93
93
 
94
94
  delegate :release_version, :purpose_role, :purpose_usage, to: :subscription_facet, allow_nil: true
95
95
 
@@ -624,7 +624,7 @@ class ::Host::Managed::Jail < Safemode::Jail
624
624
  :installed_packages, :traces_helpers, :advisory_ids, :package_names_for_job_template,
625
625
  :filtered_entitlement_quantity_consumed, :bound_repositories,
626
626
  :single_content_view, :single_lifecycle_environment, :content_view_environment_labels, :multi_content_view_environment?,
627
- :release_version, :purpose_role, :purpose_usage
627
+ :release_version, :purpose_role, :purpose_usage, :image_mode_host?, :yum_or_yum_transient
628
628
  end
629
629
 
630
630
  class ActiveRecord::Associations::CollectionProxy::Jail < Safemode::Jail