katello 4.4.1 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (488) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/activation_key_edit.js +9 -2
  3. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +3 -0
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  5. data/app/controllers/katello/api/v2/alternate_content_sources_bulk_actions_controller.rb +44 -0
  6. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +121 -0
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  9. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  10. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  11. data/app/controllers/katello/api/v2/content_view_repositories_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  14. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  16. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  17. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  18. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  19. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  20. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  21. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  22. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  23. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  24. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  25. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  26. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  27. data/app/lib/actions/katello/alternate_content_source/refresh.rb +27 -0
  28. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  29. data/app/lib/actions/katello/cdn_configuration/update.rb +3 -3
  30. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  31. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  32. data/app/lib/actions/katello/content_view/publish.rb +8 -10
  33. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  34. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  35. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  36. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  37. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  38. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  39. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  40. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  41. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  42. data/app/lib/actions/katello/product/content_create.rb +10 -8
  43. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  44. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  45. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  46. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  47. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  48. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  49. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +23 -0
  50. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  51. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  52. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  53. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  54. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  55. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +16 -0
  56. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  57. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +15 -0
  58. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +16 -0
  59. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  60. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  61. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  62. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -1
  63. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  64. data/app/lib/katello/concerns/base_template_scope_extensions.rb +24 -11
  65. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  66. data/app/lib/katello/util/errata.rb +2 -3
  67. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  68. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  69. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  70. data/app/models/katello/alternate_content_source.rb +71 -0
  71. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  72. data/app/models/katello/authorization/repository.rb +5 -3
  73. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  74. data/app/models/katello/cdn_configuration.rb +15 -15
  75. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  76. data/app/models/katello/concerns/host_managed_extensions.rb +7 -6
  77. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  78. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  79. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  80. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  81. data/app/models/katello/content.rb +1 -0
  82. data/app/models/katello/content_credential.rb +6 -0
  83. data/app/models/katello/content_override.rb +7 -3
  84. data/app/models/katello/content_view.rb +33 -2
  85. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  86. data/app/models/katello/content_view_filter.rb +4 -0
  87. data/app/models/katello/content_view_version.rb +12 -0
  88. data/app/models/katello/content_view_version_export_history.rb +3 -1
  89. data/app/models/katello/erratum.rb +9 -5
  90. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  91. data/app/models/katello/host/content_facet.rb +14 -0
  92. data/app/models/katello/host_available_module_stream.rb +12 -0
  93. data/app/models/katello/product_content.rb +1 -0
  94. data/app/models/katello/purpose_sla_status.rb +1 -1
  95. data/app/models/katello/purpose_status.rb +2 -2
  96. data/app/models/katello/repository.rb +7 -4
  97. data/app/models/katello/root_repository.rb +1 -1
  98. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  99. data/app/models/katello/sync_plan.rb +1 -1
  100. data/app/presenters/katello/product_content_presenter.rb +15 -0
  101. data/app/services/katello/applicable_host_queue.rb +1 -1
  102. data/app/services/katello/product_content_finder.rb +12 -2
  103. data/app/services/katello/pulp3/alternate_content_source.rb +123 -0
  104. data/app/services/katello/pulp3/api/file.rb +8 -0
  105. data/app/services/katello/pulp3/api/yum.rb +8 -0
  106. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  107. data/app/services/katello/pulp3/content_view_version/import.rb +104 -71
  108. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  109. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  110. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  111. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  112. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +102 -38
  113. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  114. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  115. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  116. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  117. data/app/services/katello/pulp3/repository.rb +6 -62
  118. data/app/services/katello/pulp3/service_common.rb +66 -0
  119. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  120. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  121. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  122. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  123. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +10 -8
  124. data/app/views/foreman/job_templates/install_group.erb +4 -4
  125. data/app/views/foreman/job_templates/install_package.erb +4 -4
  126. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  127. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  128. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  129. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  130. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  131. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  132. data/app/views/foreman/job_templates/update_group.erb +4 -4
  133. data/app/views/foreman/job_templates/update_package.erb +4 -4
  134. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  135. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +24 -0
  136. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  137. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  138. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  139. data/app/views/katello/api/v2/content_facet/show.json.rabl +12 -0
  140. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  141. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  142. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  143. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  144. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  145. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  146. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  147. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  148. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  149. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  150. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  151. data/config/routes/api/v2.rb +19 -0
  152. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  153. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  154. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  155. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  156. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  157. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +1 -1
  158. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  159. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  160. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  161. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  162. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  163. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  164. data/db/migrate/20220303160220_remove_duplicate_errata.rb +1 -1
  165. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  166. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  167. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  168. data/db/migrate/20220428203334_add_last_refreshed_to_katello_alternate_content_sources.rb +5 -0
  169. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  170. data/db/seeds.d/150-module_job_templates.rb +1 -1
  171. data/engines/bastion/README.md +1 -0
  172. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  173. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/activation-keys.routes.js +1 -1
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +11 -6
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages.controller.js +11 -3
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -12
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  204. data/lib/katello/engine.rb +1 -5
  205. data/lib/katello/permission_creator.rb +34 -4
  206. data/lib/katello/plugin.rb +377 -3
  207. data/lib/katello/tasks/refresh_alternate_content_sources.rake +15 -0
  208. data/lib/katello/tasks/reset.rake.bak +67 -0
  209. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  210. data/lib/katello/version.rb +1 -1
  211. data/locale/action_names.rb +47 -41
  212. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  213. data/locale/bn/katello.po +820 -106
  214. data/locale/bn/katello.po.time_stamp +0 -0
  215. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/cs/katello.po +818 -104
  217. data/locale/cs/katello.po.time_stamp +0 -0
  218. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  219. data/locale/de/katello.po +893 -179
  220. data/locale/de/katello.po.time_stamp +0 -0
  221. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  222. data/locale/en/katello.po +817 -103
  223. data/locale/en/katello.po.time_stamp +0 -0
  224. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  225. data/locale/es/katello.po +882 -168
  226. data/locale/es/katello.po.time_stamp +0 -0
  227. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/fr/katello.po +1219 -505
  229. data/locale/fr/katello.po.time_stamp +0 -0
  230. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/gu/katello.po +826 -112
  232. data/locale/gu/katello.po.time_stamp +0 -0
  233. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/hi/katello.po +826 -112
  235. data/locale/hi/katello.po.time_stamp +0 -0
  236. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/it/katello.po +863 -148
  238. data/locale/it/katello.po.time_stamp +0 -0
  239. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/ja/katello.po +1216 -499
  241. data/locale/ja/katello.po.time_stamp +0 -0
  242. data/locale/katello.pot +3847 -2507
  243. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/kn/katello.po +826 -112
  245. data/locale/kn/katello.po.time_stamp +0 -0
  246. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  247. data/locale/ko/katello.po +912 -198
  248. data/locale/ko/katello.po.time_stamp +0 -0
  249. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/mr/katello.po +826 -112
  251. data/locale/mr/katello.po.time_stamp +0 -0
  252. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  253. data/locale/or/katello.po +826 -112
  254. data/locale/or/katello.po.time_stamp +0 -0
  255. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  256. data/locale/pa/katello.po +826 -112
  257. data/locale/pa/katello.po.time_stamp +0 -0
  258. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/pt/katello.po +817 -103
  260. data/locale/pt/katello.po.time_stamp +0 -0
  261. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  262. data/locale/pt_BR/katello.po +879 -165
  263. data/locale/pt_BR/katello.po.time_stamp +0 -0
  264. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  265. data/locale/ru/katello.po +927 -213
  266. data/locale/ru/katello.po.time_stamp +0 -0
  267. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  268. data/locale/ta/katello.po +820 -106
  269. data/locale/ta/katello.po.time_stamp +0 -0
  270. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/te/katello.po +826 -112
  272. data/locale/te/katello.po.time_stamp +0 -0
  273. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  274. data/locale/zh_CN/katello.po +1202 -486
  275. data/locale/zh_CN/katello.po.time_stamp +0 -0
  276. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/zh_TW/katello.po +856 -142
  278. data/locale/zh_TW/katello.po.time_stamp +0 -0
  279. data/webpack/components/Bookmark/index.js +22 -14
  280. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  281. data/webpack/components/Errata/index.js +38 -8
  282. data/webpack/components/Packages/index.js +1 -4
  283. data/webpack/components/Search/Search.js +22 -3
  284. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  285. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  286. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  287. data/webpack/components/Table/MainTable.js +29 -4
  288. data/webpack/components/Table/MainTable.scss +5 -1
  289. data/webpack/components/Table/TableHooks.js +65 -20
  290. data/webpack/components/Table/TableWrapper.js +9 -3
  291. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  292. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  293. data/webpack/components/TypeAhead/TypeAhead.js +12 -0
  294. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  295. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +7 -2
  296. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  297. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +250 -0
  298. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +232 -0
  299. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  300. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  301. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  302. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  303. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  304. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  305. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  306. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  307. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  308. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +206 -0
  309. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  310. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  311. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  312. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  313. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +118 -0
  314. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  315. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  316. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  317. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  318. data/webpack/components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions.js +37 -0
  319. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  320. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  321. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +11 -0
  322. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  323. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -0
  324. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +6 -1
  325. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +176 -72
  326. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  327. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  328. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  329. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +522 -118
  330. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  331. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +6 -4
  332. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +164 -58
  333. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +59 -49
  334. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  335. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +85 -0
  336. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  337. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  338. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +298 -107
  339. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +14 -7
  340. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/HostTracesActions.js +2 -1
  341. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +104 -0
  342. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +134 -57
  343. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +37 -32
  344. data/webpack/components/extensions/HostDetails/Tabs/{ModuleStreamsTab/__tests__/modules.fixtures.json → __tests__/moduleStreams.fixtures.json} +6 -3
  345. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +261 -0
  346. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +21 -15
  347. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +44 -1
  348. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +4 -1
  349. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +105 -6
  350. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -6
  351. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  352. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +18 -0
  353. data/webpack/containers/Application/config.js +5 -0
  354. data/webpack/global_index.js +32 -9
  355. data/webpack/global_test_setup.js +13 -0
  356. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  357. data/webpack/redux/actions/RedHatRepositories/helpers.js +13 -8
  358. data/webpack/scenes/AlternateContentSources/ACSActions.js +65 -0
  359. data/webpack/scenes/AlternateContentSources/ACSConstants.js +18 -0
  360. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  361. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +24 -0
  362. data/webpack/scenes/AlternateContentSources/Create/ACSCreateContext.js +4 -0
  363. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +160 -0
  364. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +79 -0
  365. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +199 -0
  366. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +104 -0
  367. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +41 -0
  368. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +71 -0
  369. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +57 -0
  370. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +77 -0
  371. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +149 -0
  372. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateData.fixtures.json +3 -0
  373. data/webpack/scenes/AlternateContentSources/Create/__tests__/contentCredentials.fixtures.json +69 -0
  374. data/webpack/scenes/AlternateContentSources/Create/__tests__/smartProxy.fixtures.json +65 -0
  375. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +162 -0
  376. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  377. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  378. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  379. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  380. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  381. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +4 -1
  382. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  383. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  384. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  385. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  386. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +2 -1
  387. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  388. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  389. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  390. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +2 -2
  391. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -2
  392. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  393. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  394. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  395. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  396. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +16 -2
  397. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  398. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  399. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  400. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  401. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  402. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  404. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  405. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  406. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  407. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  408. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  409. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  410. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  411. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  412. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  413. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  414. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  415. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  416. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  417. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  418. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  419. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  420. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  421. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  434. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  435. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  436. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  437. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  446. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  447. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  448. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  449. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  450. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  451. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  452. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  453. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  454. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  455. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -6
  456. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  457. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  458. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  459. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +2 -2
  460. data/webpack/scenes/ContentViews/helpers.js +3 -0
  461. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  462. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  463. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  464. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  465. data/webpack/scenes/RedHatRepositories/components/Search.js +4 -4
  466. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +9 -2
  467. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -1
  468. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +10 -1
  469. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  470. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  471. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  472. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  473. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  474. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  475. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  476. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  477. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  478. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  479. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  480. data/webpack/scenes/Tasks/helpers.js +60 -5
  481. data/webpack/utils/helpers.js +2 -0
  482. metadata +183 -38
  483. data/app/models/setting/content.rb +0 -201
  484. data/db/seeds.d/107-enable_dynflow.rb +0 -8
  485. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  486. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +0 -108
  487. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerEmptyState.js +0 -42
  488. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -90,8 +90,10 @@ module Katello
90
90
  self.providers.anonymous.first
91
91
  end
92
92
 
93
- def manifest_imported?
94
- owner_details['upstreamConsumer'].present?
93
+ def manifest_imported?(cached: false)
94
+ Rails.cache.fetch("#{self.label}_manifest_imported?", expires_in: 1.minute, force: !cached) do
95
+ owner_details['upstreamConsumer'].present?
96
+ end
95
97
  end
96
98
 
97
99
  def manifest_expired?
@@ -6,8 +6,11 @@ module Katello
6
6
  included do
7
7
  validates :value, inclusion: { in: ::Katello::RootRepository::DOWNLOAD_POLICIES },
8
8
  if: ->(setting) { setting.name == 'default_download_policy' }
9
+ validates_with ::Katello::Validators::ContentDefaultHttpProxySettingValidator,
10
+ if: proc { |s| s.name == 'content_default_http_proxy' && HttpProxy.table_exists? }
9
11
 
10
12
  after_save :recalculate_errata_status
13
+ after_save :add_organizations_and_locations_if_global_http_proxy
11
14
  after_commit :update_global_proxies
12
15
  end
13
16
 
@@ -27,6 +30,17 @@ module Katello
27
30
  end
28
31
  end
29
32
  end
33
+
34
+ def add_organizations_and_locations_if_global_http_proxy
35
+ if name == 'content_default_http_proxy' && (::HttpProxy.table_exists? rescue(false))
36
+ proxy = HttpProxy.where(name: value).first
37
+
38
+ if proxy
39
+ proxy.update_attribute(:organizations, Organization.unscoped.all)
40
+ proxy.update_attribute(:locations, Location.unscoped.all)
41
+ end
42
+ end
43
+ end
30
44
  end
31
45
  end
32
46
  end
@@ -22,7 +22,8 @@ module Katello
22
22
  CONTAINER_GATEWAY_FEATURE = "Container_Gateway".freeze
23
23
 
24
24
  DOWNLOAD_INHERIT = 'inherit'.freeze
25
- DOWNLOAD_POLICIES = [::Katello::RootRepository::DOWNLOAD_ON_DEMAND, ::Katello::RootRepository::DOWNLOAD_IMMEDIATE, DOWNLOAD_INHERIT].freeze
25
+ DOWNLOAD_STREAMED = 'streamed'.freeze
26
+ DOWNLOAD_POLICIES = [::Katello::RootRepository::DOWNLOAD_ON_DEMAND, ::Katello::RootRepository::DOWNLOAD_IMMEDIATE, DOWNLOAD_INHERIT, DOWNLOAD_STREAMED].freeze
26
27
 
27
28
  included do
28
29
  include ForemanTasks::Concerns::ActionSubject
@@ -10,6 +10,7 @@ module Katello
10
10
  scoped_search :on => :label, :complete_value => true
11
11
  scoped_search :relation => :products, :on => :name, :rename => :product_name, :complete_value => true
12
12
  scoped_search :on => :label, :rename => :content_label, :complete_value => true
13
+ scoped_search :on => :cp_content_id, :complete_value => true
13
14
 
14
15
  after_update :update_repository_names, :if => :propagate_name_change?
15
16
 
@@ -29,6 +29,12 @@ module Katello
29
29
  :inverse_of => :ssl_client_cert, :dependent => :nullify
30
30
  has_many :ssl_key_root_repos, :class_name => "Katello::RootRepository", :foreign_key => "ssl_client_key_id",
31
31
  :inverse_of => :ssl_client_key, :dependent => :nullify
32
+ has_many :ssl_ca_alternate_content_sources, :class_name => "Katello::AlternateContentSource", :foreign_key => "ssl_ca_cert_id",
33
+ :inverse_of => :ssl_ca_cert, :dependent => :nullify
34
+ has_many :ssl_client_alternate_content_sources, :class_name => "Katello::AlternateContentSource", :foreign_key => "ssl_client_cert_id",
35
+ :inverse_of => :ssl_client_cert, :dependent => :nullify
36
+ has_many :ssl_key_alternate_content_sources, :class_name => "Katello::AlternateContentSource", :foreign_key => "ssl_client_key_id",
37
+ :inverse_of => :ssl_client_key, :dependent => :nullify
32
38
  belongs_to :organization, :inverse_of => :gpg_keys
33
39
 
34
40
  validates_lengths_from_database
@@ -43,9 +43,13 @@ module Katello
43
43
  end
44
44
 
45
45
  def ==(other)
46
- self.content_label == other.content_label &&
47
- self.name == other.name &&
48
- self.value == other.value
46
+ if self.class == other.class
47
+ self.content_label == other.content_label &&
48
+ self.name == other.name &&
49
+ self.value == other.value
50
+ else
51
+ super
52
+ end
49
53
  end
50
54
 
51
55
  def to_hash
@@ -11,7 +11,6 @@ module Katello
11
11
  CONTENT_DIR = "content_views".freeze
12
12
  IMPORT_LIBRARY = "Import-Library".freeze
13
13
  EXPORT_LIBRARY = "Export-Library".freeze
14
-
15
14
  belongs_to :organization, :inverse_of => :content_views, :class_name => "::Organization"
16
15
 
17
16
  has_many :content_view_environments, :class_name => "Katello::ContentViewEnvironment", :dependent => :destroy
@@ -19,7 +18,6 @@ module Katello
19
18
 
20
19
  has_many :content_view_versions, :class_name => "Katello::ContentViewVersion", :dependent => :destroy
21
20
  alias_method :versions, :content_view_versions
22
-
23
21
  # Note the difference between content_view_components and component_composites both refer to
24
22
  # ContentViewComponent but mean different things.
25
23
  # content_view_components -> Topdown, given I am a composite CV get the associated components belonging to me
@@ -73,6 +71,12 @@ module Katello
73
71
  inclusion: { in: [false], message: "Import-only Content Views can not solve dependencies"},
74
72
  if: :solve_dependencies
75
73
  validate :import_only_immutable
74
+ validates :generated_for,
75
+ exclusion: { in: [:none], message: "Generated Content Views can not be Composite"},
76
+ if: :composite
77
+ validates :generated_for,
78
+ exclusion: { in: [:none], message: "Generated Content Views can not solve dependencies"},
79
+ if: :solve_dependencies
76
80
 
77
81
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
78
82
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
@@ -81,11 +85,26 @@ module Katello
81
85
  scope :non_default, -> { where(:default => false) }
82
86
  scope :composite, -> { where(:composite => true) }
83
87
  scope :non_composite, -> { where(:composite => [nil, false]) }
88
+ scope :generated, -> { where.not(:generated_for => :none) }
89
+ scope :generated_for_repository, -> { where(:generated_for => [:repository_export, :repository_import]) }
90
+ scope :not_generated_for_repository, -> { where.not(id: generated_for_repository) }
91
+
92
+ scope :generated_for_library, -> { where(:generated_for => [:library_export, :library_import]) }
84
93
 
85
94
  scoped_search :on => :name, :complete_value => true
86
95
  scoped_search :on => :organization_id, :complete_value => true, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
87
96
  scoped_search :on => :label, :complete_value => true
88
97
  scoped_search :on => :composite, :complete_value => true
98
+ scoped_search :on => :generated_for, :complete_value => true
99
+ scoped_search :on => :default # just for ordering
100
+
101
+ enum generated_for: {
102
+ none: 0,
103
+ library_export: 1,
104
+ repository_export: 2,
105
+ library_import: 3,
106
+ repository_import: 4
107
+ }, _prefix: true
89
108
 
90
109
  set_crud_hooks :content_view
91
110
 
@@ -123,6 +142,14 @@ module Katello
123
142
  name.start_with? EXPORT_LIBRARY
124
143
  end
125
144
 
145
+ def generated_for_repository?
146
+ generated_for_repository_export? || generated_for_repository_import?
147
+ end
148
+
149
+ def generated_for_library?
150
+ generated_for_library_export? || generated_for_library_import?
151
+ end
152
+
126
153
  def content_host_count
127
154
  hosts.count
128
155
  end
@@ -211,6 +238,10 @@ module Katello
211
238
  self.environments.many?
212
239
  end
213
240
 
241
+ def generated?
242
+ !generated_for_none?
243
+ end
244
+
214
245
  #NOTE: this function will most likely become obsolete once we drop api v1
215
246
  def as_json(options = {})
216
247
  result = self.attributes
@@ -26,21 +26,33 @@ module Katello
26
26
  end
27
27
  end
28
28
 
29
- def content_unit_pulp_ids(repo)
29
+ def content_unit_pulp_ids(repo, additional_included_errata = [])
30
30
  return [] if erratum_rules.blank?
31
31
 
32
32
  if filter_by_id?
33
33
  errata_ids = erratum_rules.map(&:errata_id)
34
- errata_pulp_ids = errata_package_pulp_ids_from_errata_ids(repo, errata_ids)
35
- errata_pulp_ids += errata_module_stream_pulp_ids_from_errata_ids(errata_ids)
34
+ # additional_included_errata and inclusion filters don't work together (since it only applies when excluding)
35
+ if self.inclusion?
36
+ errata_pulp_ids = errata_package_pulp_ids_from_errata_ids(repo, errata_ids, [])
37
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_errata_ids(errata_ids, [])
38
+ else
39
+ errata_pulp_ids = errata_package_pulp_ids_from_errata_ids(repo, errata_ids, additional_included_errata)
40
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_errata_ids(errata_ids, additional_included_errata)
41
+ end
36
42
  else
37
43
  clauses = []
38
44
  clauses << errata_from
39
45
  clauses << errata_to
40
46
  clauses << types_clause
41
- package_filenames = Erratum.list_filenames_by_clauses(repo, clauses.compact)
42
- errata_pulp_ids = errata_package_pulp_ids_from_package_filenames(repo, package_filenames)
43
- errata_pulp_ids += errata_module_stream_pulp_ids_from_clauses(repo, clauses.compact)
47
+ if self.inclusion?
48
+ package_filenames = Erratum.list_filenames_by_clauses(repo, clauses.compact, [])
49
+ errata_pulp_ids = errata_package_pulp_ids_from_package_filenames(repo, package_filenames)
50
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_clauses(repo, clauses.compact, [])
51
+ else
52
+ package_filenames = Erratum.list_filenames_by_clauses(repo, clauses.compact, additional_included_errata)
53
+ errata_pulp_ids = errata_package_pulp_ids_from_package_filenames(repo, package_filenames)
54
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_clauses(repo, clauses.compact, additional_included_errata)
55
+ end
44
56
  end
45
57
 
46
58
  errata_pulp_ids
@@ -53,8 +65,8 @@ module Katello
53
65
  repo.rpms.where("filename ILIKE ANY ( array[?] )", query_params)
54
66
  end
55
67
 
56
- def errata_module_stream_pulp_ids_from_clauses(repo, clauses)
57
- module_streams = Erratum.list_modular_streams_by_clauses(repo, clauses)
68
+ def errata_module_stream_pulp_ids_from_clauses(repo, clauses, additional_included_errata)
69
+ module_streams = Erratum.list_modular_streams_by_clauses(repo, clauses, additional_included_errata)
58
70
  module_streams.pluck(:pulp_id)
59
71
  end
60
72
 
@@ -62,13 +74,15 @@ module Katello
62
74
  rpms_by_filename(repo, package_filenames).pluck(:pulp_id)
63
75
  end
64
76
 
65
- def errata_module_stream_pulp_ids_from_errata_ids(errata_ids)
66
- module_streams = Katello::Erratum.where(:errata_id => errata_ids).map(&:module_streams).compact.flatten
77
+ def errata_module_stream_pulp_ids_from_errata_ids(errata_ids, additional_included_errata)
78
+ module_streams = Katello::Erratum.where(:errata_id => errata_ids).map(&:module_streams).compact.flatten -
79
+ Katello::Erratum.where(:errata_id => additional_included_errata.pluck(:errata_id)).map(&:module_streams).compact.flatten
67
80
  module_streams.pluck(:pulp_id)
68
81
  end
69
82
 
70
- def errata_package_pulp_ids_from_errata_ids(repo, errata_ids)
71
- package_filenames = Katello::ErratumPackage.joins(:erratum).where("#{Erratum.table_name}.errata_id" => errata_ids).pluck(:filename)
83
+ def errata_package_pulp_ids_from_errata_ids(repo, errata_ids, additional_included_errata)
84
+ package_filenames = Katello::ErratumPackage.joins(:erratum).where("#{Erratum.table_name}.errata_id" => errata_ids).pluck(:filename) -
85
+ Katello::ErratumPackage.joins(:erratum).where("#{Erratum.table_name}.errata_id" => additional_included_errata.pluck(:errata_id)).pluck(:filename)
72
86
  rpms_by_filename(repo, package_filenames).pluck(:pulp_id)
73
87
  end
74
88
 
@@ -162,6 +162,10 @@ module Katello
162
162
  if self.content_view.import_only?
163
163
  errors.add(:base, _("cannot add filter to import-only view"))
164
164
  end
165
+
166
+ if self.content_view.generated?
167
+ errors.add(:base, _("cannot add filter to generated content views"))
168
+ end
165
169
  end
166
170
 
167
171
  def validate_filter_repos(errors, content_view)
@@ -344,6 +344,18 @@ module Katello
344
344
  save!
345
345
  end
346
346
 
347
+ def auto_publish_composites!
348
+ metadata = {
349
+ description: _("Auto Publish - Triggered by '%s'") % self.name,
350
+ triggered_by: self.id
351
+ }
352
+ self.content_view.auto_publish_components.pluck(:composite_content_view_id).each do |composite_id|
353
+ ::Katello::EventQueue.push_event(::Katello::Events::AutoPublishCompositeView::EVENT_TYPE, composite_id) do |attrs|
354
+ attrs[:metadata] = metadata
355
+ end
356
+ end
357
+ end
358
+
347
359
  def repository_type_counts_map
348
360
  counts = {}
349
361
  Katello::RepositoryTypeManager.enabled_repository_types.keys.each do |repo_type|
@@ -53,8 +53,10 @@ module Katello
53
53
 
54
54
  def self.generate_audit_comment(user:, content_view_version:, from_version: nil, metadata:)
55
55
  export_type = export_type_from_metadata(metadata)
56
- if content_view_version.content_view.library_export?
56
+ if content_view_version.content_view.generated_for_library?
57
57
  export_descriptor = "library export"
58
+ elsif content_view_version.content_view.generated_for_repository?
59
+ export_descriptor = "repository export"
58
60
  else
59
61
  export_descriptor = "export of content view '#{content_view_version.content_view.name}' version #{content_view_version.version}"
60
62
  export_descriptor += " from #{from_version.name}" if from_version
@@ -108,25 +108,29 @@ module Katello
108
108
  installable_for_hosts(hosts).select(:id)
109
109
  end
110
110
 
111
- def self.list_filenames_by_clauses(repo, clauses)
111
+ def self.list_filenames_by_clauses(repo, clauses, additional_included_errata)
112
112
  query_clauses = clauses.map do |clause|
113
113
  "(#{clause.to_sql})"
114
114
  end
115
115
  statement = query_clauses.join(" AND ")
116
116
 
117
117
  Katello::ErratumPackage.joins(:erratum => :repository_errata).
118
- where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
119
- where(statement).pluck(:filename)
118
+ where("#{RepositoryErratum.table_name}.repository_id" => repo.id).where(statement).pluck(:filename) -
119
+ Katello::ErratumPackage.joins(:erratum => :repository_errata).where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
120
+ where("#{Erratum.table_name}.errata_id" => additional_included_errata.pluck(:errata_id)).pluck(:filename)
120
121
  end
121
122
 
122
- def self.list_modular_streams_by_clauses(repo, clauses)
123
+ def self.list_modular_streams_by_clauses(repo, clauses, additional_included_errata)
123
124
  query_clauses = clauses.map do |clause|
124
125
  "(#{clause.to_sql})"
125
126
  end
126
127
  statement = query_clauses.join(" AND ")
127
128
  ModuleStream.where(:id => ModuleStreamErratumPackage.joins(:erratum_package => {:erratum => :repository_errata}).
128
129
  where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
129
- where(statement).select("#{ModuleStreamErratumPackage.table_name}.module_stream_id"))
130
+ where(statement).select("#{ModuleStreamErratumPackage.table_name}.module_stream_id")) -
131
+ ModuleStream.where(:id => ModuleStreamErratumPackage.joins(:erratum_package => {:erratum => :repository_errata}).
132
+ where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
133
+ where(statement).where("#{Erratum.table_name}.errata_id" => additional_included_errata.pluck(:errata_id)).select("#{ModuleStreamErratumPackage.table_name}.module_stream_id"))
130
134
  end
131
135
 
132
136
  def module_streams
@@ -0,0 +1,40 @@
1
+ module Katello
2
+ module Events
3
+ class DeleteLatestContentViewVersion
4
+ EVENT_TYPE = 'delete_latest_content_view_version'.freeze
5
+
6
+ attr_reader :content_view
7
+ attr_accessor :metadata, :retry
8
+
9
+ def self.retry_seconds
10
+ 18
11
+ end
12
+
13
+ def initialize(content_view_id)
14
+ @content_view = ::Katello::ContentView.find_by_id(content_view_id)
15
+ Rails.logger.warn "Content View not found for ID #{object_id}" if @content_view.nil?
16
+ yield(self) if block_given?
17
+ end
18
+
19
+ def run
20
+ return unless content_view
21
+
22
+ begin
23
+ ForemanTasks.async_task(::Actions::Katello::ContentView::Remove, content_view,
24
+ content_view_versions: [content_view.latest_version_object],
25
+ content_view_environments: content_view.latest_version_object.content_view_environments)
26
+ rescue => e
27
+ self.retry = true if e.is_a?(ForemanTasks::Lock::LockConflict)
28
+ deliver_failure_notification
29
+ raise e
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def deliver_failure_notification
36
+ ::Katello::UINotifications::ContentView::DelelteLatestVersionFailure.deliver!(content_view)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -19,6 +19,8 @@ module Katello
19
19
 
20
20
  has_many :content_facet_repositories, :class_name => "Katello::ContentFacetRepository", :dependent => :destroy, :inverse_of => :content_facet
21
21
  has_many :bound_repositories, :through => :content_facet_repositories, :class_name => "Katello::Repository", :source => :repository
22
+ has_many :bound_content, :through => :bound_repositories, :class_name => "Katello::Content", :source => :content
23
+ has_many :bound_root_repositories, :through => :bound_repositories, :class_name => "Katello::RootRepository", :source => :root
22
24
 
23
25
  has_many :content_facet_applicable_debs, :class_name => "Katello::ContentFacetApplicableDeb", :dependent => :delete_all, :inverse_of => :content_facet
24
26
  has_many :applicable_debs, :through => :content_facet_applicable_debs, :class_name => "Katello::Deb", :source => :deb
@@ -178,6 +180,18 @@ module Katello
178
180
  joins_installable_relation(Katello::Rpm, Katello::ContentFacetApplicableRpm)
179
181
  end
180
182
 
183
+ def self.joins_repositories
184
+ facet_repository = Katello::ContentFacetRepository.table_name
185
+ root_repository = Katello::RootRepository.table_name
186
+ repository = Katello::Repository.table_name
187
+
188
+ self.joins("INNER JOIN #{facet_repository} on #{facet_repository}.content_facet_id = #{table_name}.id",
189
+ "INNER JOIN #{repository} on #{repository}.id = #{facet_repository}.repository_id",
190
+ "INNER JOIN #{root_repository} on #{root_repository}.id = #{repository}.root_id",
191
+ "INNER JOIN #{Katello::Content.table_name} on #{Katello::Content.table_name}.cp_content_id = #{root_repository}.content_id").
192
+ where("#{facet_repository}.content_facet_id = #{self.table_name}.id")
193
+ end
194
+
181
195
  def content_view_version
182
196
  content_view.version(lifecycle_environment)
183
197
  end
@@ -27,6 +27,7 @@ module Katello
27
27
 
28
28
  scoped_search :on => :name, :relation => :available_module_stream, :complete_value => true
29
29
  scoped_search :on => :stream, :relation => :available_module_stream, :complete_value => false
30
+ scoped_search :on => :installed_profiles
30
31
  scoped_search :on => :status, :complete_value => STATUS
31
32
 
32
33
  def upgradable?
@@ -47,6 +48,17 @@ module Katello
47
48
  end
48
49
  end
49
50
 
51
+ def self.installed_status(status, host)
52
+ case status
53
+ when 'not installed'
54
+ where(installed_profiles: [])
55
+ when 'upgradable'
56
+ where(id: upgradable(host).pluck(:id))
57
+ when 'up to date'
58
+ where(status: 'enabled').where.not(installed_profiles: []).where.not(id: upgradable(host).pluck(:id))
59
+ end
60
+ end
61
+
50
62
  def self.upgradable(host)
51
63
  upgradable_module_name_streams = ModuleStream.installable_for_hosts([host]).select(:name, :stream)
52
64
 
@@ -16,6 +16,7 @@ module Katello
16
16
  }
17
17
 
18
18
  scoped_search :on => :name, :relation => :content
19
+ scoped_search :relation => :product, :on => :name, :rename => :product
19
20
  scoped_search :on => :content_type, :relation => :content, :complete_value => true
20
21
  scoped_search :on => :label, :relation => :content
21
22
  scoped_search :on => :content_url, :relation => :content, :rename => :path
@@ -2,7 +2,7 @@ module Katello
2
2
  class PurposeSlaStatus < HostStatus::Status
3
3
  UNKNOWN = Katello::PurposeStatus::UNKNOWN
4
4
  def self.status_name
5
- N_('Service Level')
5
+ N_('Service level')
6
6
  end
7
7
 
8
8
  def self.humanized_name
@@ -17,7 +17,7 @@ module Katello
17
17
  end
18
18
 
19
19
  def self.status_name
20
- N_('System Purpose')
20
+ N_('System purpose')
21
21
  end
22
22
 
23
23
  def self.humanized_name
@@ -31,7 +31,7 @@ module Katello
31
31
  when MISMATCHED
32
32
  N_('Mismatched')
33
33
  when NOT_SPECIFIED
34
- N_('Not Specified')
34
+ N_('Not specified')
35
35
  else
36
36
  N_('Unknown')
37
37
  end
@@ -307,7 +307,7 @@ module Katello
307
307
  end
308
308
 
309
309
  def immediate?
310
- root.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_IMMEDIATE
310
+ root.download_policy == ::Katello::RootRepository::DOWNLOAD_IMMEDIATE
311
311
  end
312
312
 
313
313
  def yum_gpg_key_url
@@ -338,7 +338,8 @@ module Katello
338
338
  end
339
339
 
340
340
  def published_in_versions
341
- Katello::ContentViewVersion.with_repositories(self.library_instances_inverse).distinct
341
+ Katello::ContentViewVersion.with_repositories(self.library_instances_inverse)
342
+ .where(content_view_id: Katello::ContentView.not_generated_for_repository).distinct
342
343
  end
343
344
 
344
345
  def self.errata_with_package_counts(repo)
@@ -664,7 +665,9 @@ module Katello
664
665
  end
665
666
 
666
667
  def self.smart_proxy_syncable
667
- where.not(:environment_id => nil)
668
+ joins(:content_view_version => :content_view).
669
+ merge(ContentView.not_generated_for_repository).
670
+ where.not(environment_id: nil)
668
671
  end
669
672
 
670
673
  def exist_for_environment?(environment, content_view, attribute = nil)
@@ -965,7 +968,7 @@ module Katello
965
968
  property :docker_upstream_name, String, desc: 'Returns name of the upstream docker repository'
966
969
  end
967
970
  class Jail < ::Safemode::Jail
968
- allow :name, :label, :docker_upstream_name
971
+ allow :name, :label, :docker_upstream_name, :content_counts
969
972
  end
970
973
  end
971
974
  end
@@ -63,7 +63,7 @@ module Katello
63
63
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
64
64
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
65
65
  validates_with Validators::KatelloUrlFormatValidator, :attributes => :url,
66
- :nil_allowed => proc { |repo| repo.custom? || repo.organization.cdn_configuration.airgapped? },
66
+ :nil_allowed => proc { |repo| repo.custom? || repo.organization.cdn_configuration.export_sync? },
67
67
  :field_name => :url
68
68
  validates_with Validators::RootRepositoryUniqueAttributeValidator, :attributes => :name
69
69
  validates_with Validators::RootRepositoryUniqueAttributeValidator, :attributes => :label
@@ -0,0 +1,8 @@
1
+ module Katello
2
+ class SmartProxyAlternateContentSource < Katello::Model
3
+ # Do not use active record callbacks in this join model. Direct INSERTs and DELETEs are done
4
+ self.table_name = :katello_smart_proxy_alternate_content_sources
5
+ belongs_to :smart_proxy, :inverse_of => :smart_proxy_alternate_content_sources, :class_name => 'SmartProxy'
6
+ belongs_to :alternate_content_source, :inverse_of => :smart_proxy_alternate_content_sources, :class_name => 'Katello::AlternateContentSource'
7
+ end
8
+ end
@@ -83,7 +83,7 @@ module Katello
83
83
  ::Katello::Util::Support.active_record_retry do
84
84
  self.save!
85
85
  end
86
- old_rec_logic.cancel
86
+ old_rec_logic.reload.cancel
87
87
  start_recurring_logic
88
88
  end
89
89
  toggle_enabled(params[:enabled]) if (params.key?(:enabled) && params[:enabled] != self.enabled?)
@@ -23,5 +23,20 @@ module Katello
23
23
  return [] if overrides.blank?
24
24
  overrides.select { |pc| pc.content_label == content.label }
25
25
  end
26
+
27
+ def status
28
+ overidden_value = enabled_content_override&.computed_value
29
+ if overidden_value.nil?
30
+ {
31
+ status: enabled ? "enabled" : "disabled",
32
+ overridden: false
33
+ }
34
+ else
35
+ {
36
+ status: overidden_value ? "enabled" : "disabled",
37
+ overridden: true
38
+ }
39
+ end
40
+ end
26
41
  end
27
42
  end
@@ -1,7 +1,7 @@
1
1
  module Katello
2
2
  class ApplicableHostQueue
3
3
  def self.batch_size
4
- ::Setting::Content.find_by(name: "applicability_batch_size").value
4
+ Setting["applicability_batch_size"]
5
5
  end
6
6
 
7
7
  def self.queue_depth
@@ -30,8 +30,18 @@ module Katello
30
30
  consumable.organization.enabled_product_content_for(roots)
31
31
  end
32
32
 
33
- def self.wrap_with_overrides(product_contents:, overrides:)
34
- product_contents.map { |pc| ProductContentPresenter.new(pc, overrides) }
33
+ def self.wrap_with_overrides(product_contents:, overrides:, status: nil)
34
+ pc_with_overrides = product_contents.map { |pc| ProductContentPresenter.new(pc, overrides) }
35
+ if status
36
+ pc_with_overrides.keep_if do |pc|
37
+ if status == "overridden"
38
+ pc.status[:overridden]
39
+ else
40
+ pc.status[:status] == status
41
+ end
42
+ end
43
+ end
44
+ pc_with_overrides
35
45
  end
36
46
 
37
47
  def presenter_with_overrides(overrides)