katello 4.4.0.2 → 4.5.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) 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/errata_controller.rb +3 -1
  16. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  17. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  18. data/app/controllers/katello/api/v2/module_streams_controller.rb +3 -1
  19. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  20. data/app/controllers/katello/api/v2/package_groups_controller.rb +3 -1
  21. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  22. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  23. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  24. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  25. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  26. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  27. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  28. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  29. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  30. data/app/lib/actions/katello/alternate_content_source/refresh.rb +27 -0
  31. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  32. data/app/lib/actions/katello/cdn_configuration/update.rb +3 -3
  33. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  34. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  35. data/app/lib/actions/katello/content_view/publish.rb +8 -10
  36. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  37. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  38. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  39. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  40. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  41. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  42. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  43. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  44. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  45. data/app/lib/actions/katello/product/content_create.rb +10 -8
  46. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  47. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  48. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  49. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  50. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  51. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  52. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +23 -0
  53. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  54. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  55. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  56. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  57. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  58. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +16 -0
  59. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  60. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +15 -0
  61. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +16 -0
  62. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  63. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  64. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  65. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +1 -4
  66. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -1
  67. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +0 -2
  68. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  69. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  70. data/app/lib/katello/util/errata.rb +2 -3
  71. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  72. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  73. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  74. data/app/models/katello/alternate_content_source.rb +71 -0
  75. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  76. data/app/models/katello/authorization/repository.rb +3 -3
  77. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  78. data/app/models/katello/cdn_configuration.rb +15 -15
  79. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  80. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  81. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  82. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  83. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  84. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  85. data/app/models/katello/content.rb +1 -0
  86. data/app/models/katello/content_credential.rb +6 -0
  87. data/app/models/katello/content_override.rb +7 -3
  88. data/app/models/katello/content_view.rb +33 -2
  89. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  90. data/app/models/katello/content_view_filter.rb +4 -0
  91. data/app/models/katello/content_view_version.rb +12 -0
  92. data/app/models/katello/content_view_version_export_history.rb +3 -1
  93. data/app/models/katello/erratum.rb +9 -5
  94. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  95. data/app/models/katello/host/content_facet.rb +14 -0
  96. data/app/models/katello/host_available_module_stream.rb +12 -0
  97. data/app/models/katello/product_content.rb +1 -0
  98. data/app/models/katello/purpose_sla_status.rb +1 -1
  99. data/app/models/katello/purpose_status.rb +2 -2
  100. data/app/models/katello/repository.rb +7 -4
  101. data/app/models/katello/root_repository.rb +1 -1
  102. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  103. data/app/models/katello/sync_plan.rb +1 -1
  104. data/app/presenters/katello/product_content_presenter.rb +15 -0
  105. data/app/services/katello/applicable_host_queue.rb +1 -1
  106. data/app/services/katello/product_content_finder.rb +12 -2
  107. data/app/services/katello/pulp3/alternate_content_source.rb +123 -0
  108. data/app/services/katello/pulp3/api/file.rb +8 -0
  109. data/app/services/katello/pulp3/api/yum.rb +8 -0
  110. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  111. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  112. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  113. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  114. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  115. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  116. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  117. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  118. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  119. data/app/services/katello/pulp3/erratum.rb +1 -1
  120. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  121. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  122. data/app/services/katello/pulp3/repository.rb +35 -63
  123. data/app/services/katello/pulp3/service_common.rb +66 -0
  124. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  125. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  126. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  127. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  128. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  129. data/app/views/foreman/job_templates/install_group.erb +4 -4
  130. data/app/views/foreman/job_templates/install_package.erb +4 -4
  131. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  132. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  133. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  134. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  135. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  136. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  137. data/app/views/foreman/job_templates/update_group.erb +4 -4
  138. data/app/views/foreman/job_templates/update_package.erb +4 -4
  139. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  140. data/app/views/foreman/smart_proxies/show.html.erb +2 -0
  141. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +24 -0
  142. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  143. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  144. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  145. data/app/views/katello/api/v2/content_facet/show.json.rabl +12 -0
  146. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  147. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  148. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  149. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  150. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  151. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  152. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  153. data/app/views/katello/api/v2/module_streams/show.json.rabl +0 -7
  154. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  155. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  156. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  157. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  158. data/config/routes/api/v2.rb +19 -0
  159. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  160. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  161. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  162. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  163. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  164. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +1 -1
  165. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  166. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  167. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  168. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  169. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  170. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  171. data/db/migrate/20220303160220_remove_duplicate_errata.rb +37 -2
  172. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  173. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  174. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  175. data/db/migrate/20220428203334_add_last_refreshed_to_katello_alternate_content_sources.rb +5 -0
  176. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  177. data/db/seeds.d/150-module_job_templates.rb +1 -1
  178. data/engines/bastion/README.md +1 -0
  179. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  180. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +11 -6
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +1 -1
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  209. data/lib/katello/engine.rb +1 -5
  210. data/lib/katello/permission_creator.rb +34 -4
  211. data/lib/katello/plugin.rb +377 -3
  212. data/lib/katello/tasks/refresh_alternate_content_sources.rake +10 -0
  213. data/lib/katello/tasks/reset.rake.bak +67 -0
  214. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  215. data/lib/katello/version.rb +1 -1
  216. data/locale/action_names.rb +47 -41
  217. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/bn/katello.po +820 -106
  219. data/locale/bn/katello.po.time_stamp +0 -0
  220. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/cs/katello.po +818 -104
  222. data/locale/cs/katello.po.time_stamp +0 -0
  223. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/de/katello.po +893 -179
  225. data/locale/de/katello.po.time_stamp +0 -0
  226. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  227. data/locale/en/katello.po +817 -103
  228. data/locale/en/katello.po.time_stamp +0 -0
  229. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  230. data/locale/es/katello.po +882 -168
  231. data/locale/es/katello.po.time_stamp +0 -0
  232. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  233. data/locale/fr/katello.po +1219 -505
  234. data/locale/fr/katello.po.time_stamp +0 -0
  235. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  236. data/locale/gu/katello.po +826 -112
  237. data/locale/gu/katello.po.time_stamp +0 -0
  238. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  239. data/locale/hi/katello.po +826 -112
  240. data/locale/hi/katello.po.time_stamp +0 -0
  241. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/it/katello.po +863 -148
  243. data/locale/it/katello.po.time_stamp +0 -0
  244. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  245. data/locale/ja/katello.po +1216 -499
  246. data/locale/ja/katello.po.time_stamp +0 -0
  247. data/locale/katello.pot +3847 -2507
  248. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/kn/katello.po +826 -112
  250. data/locale/kn/katello.po.time_stamp +0 -0
  251. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ko/katello.po +912 -198
  253. data/locale/ko/katello.po.time_stamp +0 -0
  254. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/mr/katello.po +826 -112
  256. data/locale/mr/katello.po.time_stamp +0 -0
  257. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/or/katello.po +826 -112
  259. data/locale/or/katello.po.time_stamp +0 -0
  260. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/pa/katello.po +826 -112
  262. data/locale/pa/katello.po.time_stamp +0 -0
  263. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  264. data/locale/pt/katello.po +817 -103
  265. data/locale/pt/katello.po.time_stamp +0 -0
  266. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/pt_BR/katello.po +879 -165
  268. data/locale/pt_BR/katello.po.time_stamp +0 -0
  269. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  270. data/locale/ru/katello.po +927 -213
  271. data/locale/ru/katello.po.time_stamp +0 -0
  272. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  273. data/locale/ta/katello.po +820 -106
  274. data/locale/ta/katello.po.time_stamp +0 -0
  275. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  276. data/locale/te/katello.po +826 -112
  277. data/locale/te/katello.po.time_stamp +0 -0
  278. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  279. data/locale/zh_CN/katello.po +1202 -486
  280. data/locale/zh_CN/katello.po.time_stamp +0 -0
  281. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  282. data/locale/zh_TW/katello.po +856 -142
  283. data/locale/zh_TW/katello.po.time_stamp +0 -0
  284. data/webpack/components/Bookmark/index.js +22 -14
  285. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  286. data/webpack/components/Errata/index.js +38 -8
  287. data/webpack/components/Packages/index.js +1 -4
  288. data/webpack/components/Search/Search.js +22 -3
  289. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  290. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  291. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  292. data/webpack/components/Table/MainTable.js +29 -4
  293. data/webpack/components/Table/MainTable.scss +5 -1
  294. data/webpack/components/Table/TableHooks.js +65 -20
  295. data/webpack/components/Table/TableWrapper.js +9 -3
  296. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  297. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  298. data/webpack/components/TypeAhead/TypeAhead.js +12 -0
  299. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  300. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +7 -2
  301. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  302. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +250 -0
  303. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +232 -0
  304. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  305. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  306. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  307. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  308. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  309. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  310. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  311. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  312. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  313. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +206 -0
  314. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  315. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  316. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  317. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  318. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +118 -0
  319. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  320. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  321. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  322. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  323. data/webpack/components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions.js +37 -0
  324. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  325. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  326. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +11 -0
  327. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  328. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -0
  329. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +6 -1
  330. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +176 -72
  331. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  332. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  333. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  334. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +522 -118
  335. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  336. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +6 -4
  337. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +164 -58
  338. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +59 -49
  339. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  340. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +85 -0
  341. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  342. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  343. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +298 -107
  344. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +14 -7
  345. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/HostTracesActions.js +2 -1
  346. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +104 -0
  347. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +134 -57
  348. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +37 -32
  349. data/webpack/components/extensions/HostDetails/Tabs/{ModuleStreamsTab/__tests__/modules.fixtures.json → __tests__/moduleStreams.fixtures.json} +6 -3
  350. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +261 -0
  351. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +21 -15
  352. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +44 -1
  353. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +4 -1
  354. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +105 -6
  355. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -6
  356. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  357. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +18 -0
  358. data/webpack/containers/Application/config.js +5 -0
  359. data/webpack/global_index.js +32 -9
  360. data/webpack/global_test_setup.js +13 -0
  361. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  362. data/webpack/redux/actions/RedHatRepositories/helpers.js +13 -8
  363. data/webpack/scenes/AlternateContentSources/ACSActions.js +65 -0
  364. data/webpack/scenes/AlternateContentSources/ACSConstants.js +18 -0
  365. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  366. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +24 -0
  367. data/webpack/scenes/AlternateContentSources/Create/ACSCreateContext.js +4 -0
  368. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +160 -0
  369. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +79 -0
  370. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +199 -0
  371. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +104 -0
  372. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +41 -0
  373. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +71 -0
  374. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +57 -0
  375. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +77 -0
  376. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +149 -0
  377. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateData.fixtures.json +3 -0
  378. data/webpack/scenes/AlternateContentSources/Create/__tests__/contentCredentials.fixtures.json +69 -0
  379. data/webpack/scenes/AlternateContentSources/Create/__tests__/smartProxy.fixtures.json +65 -0
  380. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +162 -0
  381. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  382. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  383. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  384. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  385. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  386. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +4 -1
  387. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  388. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  389. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  390. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  391. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  392. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  393. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  394. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  395. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  396. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  397. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  398. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  399. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  400. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  401. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  402. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  403. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  404. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  405. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  406. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  407. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  408. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  409. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  410. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  411. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  412. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  413. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  414. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  415. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  416. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  417. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  418. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  419. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  420. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  421. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  422. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  440. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  441. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  442. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  443. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  444. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  453. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  454. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  455. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  456. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  457. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  458. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  459. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  460. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  461. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  462. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  463. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  464. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -6
  465. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  466. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  467. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  468. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  469. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  470. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  471. data/webpack/scenes/ContentViews/helpers.js +3 -0
  472. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  473. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +1 -10
  474. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +13 -14
  475. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +17 -100
  476. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  477. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  478. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  479. data/webpack/scenes/RedHatRepositories/components/Search.js +4 -4
  480. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +9 -2
  481. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -1
  482. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +10 -1
  483. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  484. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  485. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  486. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  487. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  488. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  489. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  490. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  491. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  492. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  493. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  494. data/webpack/scenes/Tasks/helpers.js +60 -5
  495. data/webpack/utils/helpers.js +2 -0
  496. metadata +186 -41
  497. data/app/models/setting/content.rb +0 -201
  498. data/db/seeds.d/107-enable_dynflow.rb +0 -8
  499. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  500. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +0 -108
  501. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerEmptyState.js +0 -42
  502. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -0,0 +1,15 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module AlternateContentSource
5
+ class Refresh < Pulp3::Abstract
6
+ def plan(acs, smart_proxy)
7
+ sequence do
8
+ plan_action(Actions::Pulp3::AlternateContentSource::Refresh, acs, smart_proxy)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module AlternateContentSource
5
+ class Update < Pulp3::Abstract
6
+ def plan(acs, smart_proxy)
7
+ sequence do
8
+ plan_action(Actions::Pulp3::AlternateContentSource::UpdateRemote, acs, smart_proxy)
9
+ plan_action(Actions::Pulp3::AlternateContentSource::Update, acs, smart_proxy)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -10,7 +10,7 @@ module Actions
10
10
  plan_action(Actions::Pulp3::Repository::CopyContent, repo, SmartProxy.pulp_primary!,
11
11
  repo.library_instance,
12
12
  copy_all: true,
13
- mirror: content_view_version.content_view.library_import?)
13
+ mirror: content_view_version.content_view.generated?)
14
14
  plan_action(Actions::Pulp3::Repository::SaveVersion, repo.library_instance)
15
15
  plan_action(Katello::Repository::IndexContent, id: repo.library_instance_id)
16
16
  plan_action(Katello::Repository::MetadataGenerate, repo.library_instance, :force => true)
@@ -0,0 +1,51 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module ContentViewVersion
5
+ class ExportRepository < Actions::EntryAction
6
+ def plan(repository,
7
+ chunk_size: nil,
8
+ from_history: nil)
9
+ action_subject(repository)
10
+ validate_repositories_immediate!(repository)
11
+
12
+ content_view = ::Katello::Pulp3::ContentViewVersion::Export.find_repository_export_view(
13
+ repository: repository,
14
+ create_by_default: true)
15
+ content_view.update!(repository_ids: [repository.library_instance_or_self.id])
16
+
17
+ sequence do
18
+ publish_action = plan_action(::Actions::Katello::ContentView::Publish, content_view, '')
19
+ export_action = plan_action(Actions::Katello::ContentViewVersion::Export,
20
+ content_view_version: publish_action.version,
21
+ chunk_size: chunk_size,
22
+ from_history: from_history)
23
+ plan_self(export_action_output: export_action.output)
24
+ end
25
+ end
26
+
27
+ def run
28
+ output[:export_history_id] = input[:export_action_output][:export_history_id]
29
+ end
30
+
31
+ def humanized_name
32
+ _("Export Repository")
33
+ end
34
+
35
+ def rescue_strategy
36
+ Dynflow::Action::Rescue::Skip
37
+ end
38
+
39
+ def validate_repositories_immediate!(repository)
40
+ unless repository.immediate?
41
+ fail _("NOTE: Unable to fully export repository '%{repository}' because"\
42
+ " it does not have the 'immediate' download policy."\
43
+ " Update the download policy and sync the affected repository to include them in the export."\
44
+ % { repository: repository.name })
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -16,8 +16,8 @@ module Actions
16
16
  ).output
17
17
 
18
18
  plan_action(
19
- ::Actions::Pulp3::ContentViewVersion::Import,
20
- content_view_version_id: content_view_version.id,
19
+ ::Actions::Pulp3::ContentViewVersion::CreateImport,
20
+ organization_id: content_view_version.content_view.organization_id,
21
21
  smart_proxy_id: smart_proxy.id,
22
22
  importer_data: importer_output[:importer_data],
23
23
  path: path,
@@ -36,7 +36,10 @@ module Actions
36
36
  content_view_name: content_view_version.name
37
37
  )
38
38
  plan_action(::Actions::Pulp3::ContentViewVersion::DestroyImporter,
39
+ organization_id: content_view_version.content_view.organization_id,
39
40
  smart_proxy_id: smart_proxy.id,
41
+ path: path,
42
+ metadata: metadata,
40
43
  importer_data: importer_output[:importer_data])
41
44
  plan_self(
42
45
  content_view_name: content_view_version.name,
@@ -3,7 +3,6 @@ module Actions
3
3
  module Repository
4
4
  class RefreshDistribution < Pulp3::AbstractAsyncTask
5
5
  include Helpers::Presenter
6
- middleware.use Actions::Middleware::ExecuteIfContentsChanged
7
6
 
8
7
  def plan(repository, smart_proxy, options = {})
9
8
  smart_proxy = SmartProxy.unscoped.find_by(id: smart_proxy) #support bulk actions
@@ -16,11 +15,9 @@ module Actions
16
15
  :repository_id => repository.id,
17
16
  :smart_proxy_id => smart_proxy.id
18
17
  }
19
- refresh_options[:contents_changed] if options.key?(:contents_changed)
20
18
  action = plan_self(refresh_options)
21
19
 
22
- plan_action(SaveDistributionReferences, repository, smart_proxy,
23
- action.output, :contents_changed => options[:contents_changed])
20
+ plan_action(SaveDistributionReferences, repository, smart_proxy, action.output)
24
21
  end
25
22
  end
26
23
 
@@ -5,7 +5,7 @@ module Actions
5
5
  #This task creates a content unit and may or may not create a new repository version in the process
6
6
  def plan(file, repository, smart_proxy, tasks, unit_type_id, options = {})
7
7
  options[:file_name] = file[:filename]
8
- options[:sha256] = file[:sha256] || Digest::SHA256.hexdigest(File.read(file[:path]))
8
+ options[:sha256] = file[:sha256] || (Digest::SHA256.hexdigest(File.read(file[:path])) if file[:path].present?)
9
9
  plan_self(:repository_id => repository.id, :smart_proxy_id => smart_proxy.id, :tasks => tasks, :unit_type_id => unit_type_id, :options => options)
10
10
  end
11
11
 
@@ -2,8 +2,6 @@ module Actions
2
2
  module Pulp3
3
3
  module Repository
4
4
  class SaveDistributionReferences < Pulp3::Abstract
5
- middleware.use Actions::Middleware::ExecuteIfContentsChanged
6
-
7
5
  def plan(repository, smart_proxy, tasks, options = {})
8
6
  plan_self(repository_id: repository.id, smart_proxy_id: smart_proxy.id, tasks: tasks, contents_changed: options[:contents_changed])
9
7
  end
@@ -23,6 +23,7 @@ module Katello
23
23
  rescue_from Errors::CdnSubstitutionError, :with => :rescue_from_bad_data
24
24
  rescue_from Errors::RegistrationError, :with => :rescue_from_bad_data
25
25
  rescue_from ActionController::ParameterMissing, :with => :rescue_from_missing_param
26
+ rescue_from ::ForemanTasks::Lock::LockConflict, :with => :rescue_from_bad_data
26
27
  end
27
28
 
28
29
  protected
@@ -118,7 +118,9 @@ module Katello
118
118
 
119
119
  def find_organization(label)
120
120
  response = get("/api/v2/organizations?search=#{CGI.escape("label = #{label}")}")
121
- JSON.parse(response)['results'].first
121
+ JSON.parse(response)['results'].first.tap do |org|
122
+ fail "Specified organization was not found: #{label}" if org.nil?
123
+ end
122
124
  rescue => e
123
125
  Rails.logger.error("Couldn't load upstream organization with label=#{label} error=#{e.message}")
124
126
  raise e
@@ -56,10 +56,9 @@ module Katello
56
56
  matching_errata = []
57
57
  errata.each do |erratum|
58
58
  # The erratum should be copied if package_pulp_hrefs has all of its packages that are available in the source repo.
59
- next if erratum.packages.empty?
60
59
  rpms_in_erratum_and_source_repo = erratum.packages.pluck(:filename) & source_repo_rpm_filenames
61
- next if rpms_in_erratum_and_source_repo.empty?
62
- if (rpms_in_erratum_and_source_repo - rpm_filenames - srpm_filenames).empty?
60
+ if (rpms_in_erratum_and_source_repo - rpm_filenames - srpm_filenames).empty? ||
61
+ erratum.packages.empty? || rpms_in_erratum_and_source_repo.empty?
63
62
  matching_errata << erratum
64
63
  end
65
64
  end
@@ -0,0 +1,29 @@
1
+ module Katello
2
+ module Validators
3
+ class AlternateContentSourcePathValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ if value
6
+ if attribute == :base_url
7
+ unless AlternateContentSourcePathValidator.validate_base_url(value)
8
+ record.errors[attribute] << N_("%s is not a valid path") % value
9
+ end
10
+ elsif attribute == :subpaths
11
+ unless AlternateContentSourcePathValidator.validate_subpaths(value)
12
+ record.errors[attribute] << N_('All subpaths must have a slash at the end and none at the front')
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ def self.validate_base_url(base_url)
19
+ base_url =~ /\A#{URI::DEFAULT_PARSER.make_regexp}\z/
20
+ end
21
+
22
+ # Subpaths must have a slash at the end and none at the front: 'path/'
23
+ def self.validate_subpaths(subpaths)
24
+ bad_subpaths = subpaths.select { |subpath| subpath[0] == '/' || subpath[-1] != '/' }
25
+ bad_subpaths.empty?
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ module Katello
2
+ module Validators
3
+ class ContentDefaultHttpProxySettingValidator < ActiveModel::Validator
4
+ def validate(record)
5
+ proxy = HttpProxy.where(name: record.value).first
6
+ return if proxy || record.value.blank?
7
+
8
+ record.errors.add(:base, _('There is no such HTTP proxy'))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -5,12 +5,17 @@ module Katello
5
5
  #support lifecycle_environment_id for foreman models
6
6
  environment_id = record.respond_to?(:lifecycle_environment_id) ? record.lifecycle_environment_id : record.environment_id
7
7
 
8
- if record.content_view_id && environment_id
8
+ if record.content_view_id
9
9
  view = ContentView.where(:id => record.content_view_id).first
10
- env = KTEnvironment.where(:id => environment_id).first
11
- unless view.blank? || env.blank? || view.in_environment?(env)
12
- record.errors[:base] << _("Content view '%{view}' is not in environment '%{env}'") %
13
- {:view => view.name, :env => env.name}
10
+ if environment_id
11
+ env = KTEnvironment.where(:id => environment_id).first
12
+ unless view.blank? || env.blank? || view.in_environment?(env)
13
+ record.errors[:base] << _("Content view '%{view}' is not in environment '%{env}'") %
14
+ {:view => view.name, :env => env.name}
15
+ end
16
+ end
17
+ if view&.generated_for_repository?
18
+ record.errors[:base] << _("Generated Content views cannot be assigned to Host/Activation Keys")
14
19
  end
15
20
  end
16
21
  end
@@ -0,0 +1,71 @@
1
+ module Katello
2
+ class AlternateContentSource < Katello::Model
3
+ include Ext::LabelFromName
4
+ include Encryptable
5
+ include ::ScopedSearchExtensions
6
+ include Authorization::AlternateContentSource
7
+ include ForemanTasks::Concerns::ActionSubject
8
+
9
+ self.table_name = :katello_alternate_content_sources
10
+
11
+ # TODO: simplified, rhui
12
+ ACS_TYPES = %w(custom).freeze
13
+ CONTENT_TYPES = [::Katello::Repository::YUM_TYPE, ::Katello::Repository::FILE_TYPE].freeze
14
+
15
+ encrypts :upstream_password
16
+
17
+ belongs_to :ssl_ca_cert, inverse_of: :ssl_ca_alternate_content_sources, class_name: "Katello::ContentCredential"
18
+ belongs_to :ssl_client_cert, inverse_of: :ssl_client_alternate_content_sources, class_name: "Katello::ContentCredential"
19
+ belongs_to :ssl_client_key, inverse_of: :ssl_key_alternate_content_sources, class_name: "Katello::ContentCredential"
20
+ belongs_to :http_proxy, inverse_of: :alternate_content_sources
21
+ has_many :smart_proxy_alternate_content_sources, dependent: :destroy,
22
+ inverse_of: :alternate_content_source
23
+ has_many :smart_proxies, through: :smart_proxy_alternate_content_sources
24
+
25
+ validates :base_url, if: :custom?, presence: true
26
+ validates :verify_ssl, if: :custom?, exclusion: [nil]
27
+ validates :alternate_content_source_type, inclusion: {
28
+ in: ->(_) { ACS_TYPES },
29
+ allow_blank: false,
30
+ message: ->(_, _) { _("is not a valid type. Must be one of the following: %s") % ACS_TYPES.join(',') }
31
+ }
32
+ validates :content_type, if: :custom?, inclusion: {
33
+ in: ->(_) { RepositoryTypeManager.defined_repository_types.keys & CONTENT_TYPES },
34
+ allow_blank: false,
35
+ message: ->(_, _) { _("is not allowed for ACS. Must be one of the following: %s") % (RepositoryTypeManager.defined_repository_types.keys & CONTENT_TYPES).join(',') }
36
+ }
37
+ validates_with Validators::AlternateContentSourcePathValidator, :attributes => [:base_url, :subpaths], :if => :custom?
38
+
39
+ scoped_search on: :name, complete_value: true
40
+ scoped_search on: :label, complete_value: true
41
+ scoped_search on: :description, complete_value: true
42
+ scoped_search on: :base_url, complete_value: true
43
+ scoped_search on: :subpath, ext_method: :search_by_subpath
44
+ scoped_search on: :content_type, complete_value: true
45
+ scoped_search on: :alternate_content_source_type, complete_value: true
46
+ scoped_search on: :upstream_username, complete_value: true
47
+ scoped_search on: :smart_proxy_id, relation: :smart_proxy_alternate_content_sources, validator: ScopedSearch::Validators::INTEGER, only_explicit: true
48
+
49
+ def backend_service(smart_proxy)
50
+ @service ||= ::Katello::Pulp3::AlternateContentSource.new(self, smart_proxy)
51
+ end
52
+
53
+ def custom?
54
+ alternate_content_source_type == 'custom'
55
+ end
56
+
57
+ def self.with_type(content_type)
58
+ where(content_type: content_type)
59
+ end
60
+
61
+ def self.search_by_subpath(_key, operator, value)
62
+ conditions = sanitize_sql_for_conditions(["? #{operator} ANY (subpaths)", value_to_sql(operator, value)])
63
+ { conditions: conditions }
64
+ end
65
+
66
+ def latest_dynflow_refresh_task
67
+ @latest_dynflow_refresh_task ||= ForemanTasks::Task::DynflowTask.where(:label => Actions::Katello::AlternateContentSource::Refresh.name).
68
+ for_resource(self).order(:started_at).last
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,33 @@
1
+ module Katello
2
+ module Authorization::AlternateContentSource
3
+ extend ActiveSupport::Concern
4
+
5
+ include Authorizable
6
+
7
+ def readable?
8
+ authorized?(:view_alternate_content_sources)
9
+ end
10
+
11
+ def editable?
12
+ authorized?(:edit_alternate_content_sources)
13
+ end
14
+
15
+ def deletable?
16
+ authorized?(:destroy_alternate_content_sources)
17
+ end
18
+
19
+ module ClassMethods
20
+ def readable
21
+ authorized(:view_alternate_content_sources)
22
+ end
23
+
24
+ def editable
25
+ authorized(:edit_alternate_content_sources)
26
+ end
27
+
28
+ def deletable
29
+ authorized(:destroy_alternate_content_sources)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -4,12 +4,12 @@ module Katello
4
4
 
5
5
  delegate :editable?, to: :product
6
6
 
7
- def deletable?(remove_from_content_view_versions = false)
8
- product.editable? && (remove_from_content_view_versions || !promoted?)
7
+ def deletable?(remove_from_content_view_versions = true)
8
+ product.editable? && (remove_from_content_view_versions || !promoted? || !self.content_views.generated_for_none.exists?)
9
9
  end
10
10
 
11
11
  def redhat_deletable?(remove_from_content_view_versions = false)
12
- (remove_from_content_view_versions || !self.promoted?) && self.product.editable?
12
+ (remove_from_content_view_versions || !self.promoted? || !self.content_views.generated_for_none.exists?) && self.product.editable?
13
13
  end
14
14
 
15
15
  def readable?
@@ -10,10 +10,17 @@ module Katello
10
10
  end
11
11
 
12
12
  def find_repository
13
- root = ::Katello::RootRepository.where(product_id: product.id,
14
- content_id: content.cp_content_id,
15
- minor: minor,
16
- arch: arch).first
13
+ if substitutions[:basearch]
14
+ root = ::Katello::RootRepository.where(product_id: product.id,
15
+ content_id: content.cp_content_id,
16
+ minor: minor,
17
+ arch: arch).first
18
+ else
19
+ root = ::Katello::RootRepository.where(product_id: product.id,
20
+ content_id: content.cp_content_id,
21
+ minor: minor).first
22
+ end
23
+
17
24
  if root
18
25
  Katello::Repository.where(root: root,
19
26
  environment_id: product.organization.library.id).first
@@ -44,7 +51,7 @@ module Katello
44
51
  end
45
52
 
46
53
  def validate!
47
- return if katello_content_type == Repository::OSTREE_TYPE || product.organization.cdn_configuration.airgapped?
54
+ return if katello_content_type == Repository::OSTREE_TYPE || product.organization.cdn_configuration.export_sync?
48
55
  substitutor.validate_substitutions(content, substitutions)
49
56
  end
50
57
 
@@ -74,7 +81,7 @@ module Katello
74
81
  end
75
82
 
76
83
  def feed_url
77
- return if product.organization.cdn_configuration.airgapped?
84
+ return if product.organization.cdn_configuration.export_sync?
78
85
  @feed_url ||= if product.cdn_resource&.respond_to?(:repository_url)
79
86
  product.cdn_resource.repository_url(content_label: content.label, arch: arch, major: version[:major], minor: version[:minor])
80
87
  else
@@ -3,24 +3,24 @@ module Katello
3
3
  include Encryptable
4
4
  self.inheritance_column = nil
5
5
  CDN_TYPE = 'redhat_cdn'.freeze
6
- UPSTREAM_SERVER_TYPE = 'upstream_server'.freeze
7
- AIRGAPPED_TYPE = 'airgapped'.freeze
6
+ NETWORK_SYNC = 'network_sync'.freeze
7
+ EXPORT_SYNC = 'export_sync'.freeze
8
8
 
9
- TYPES = [CDN_TYPE, UPSTREAM_SERVER_TYPE, AIRGAPPED_TYPE].freeze
9
+ TYPES = [CDN_TYPE, NETWORK_SYNC, EXPORT_SYNC].freeze
10
10
 
11
11
  belongs_to :organization, :inverse_of => :cdn_configuration
12
12
 
13
13
  belongs_to :ssl_ca_credential, :class_name => "Katello::ContentCredential", :inverse_of => :ssl_ca_cdn_configurations
14
14
 
15
15
  encrypts :password
16
- validates :password, presence: true, if: :upstream_server?
17
- validates :username, presence: true, if: :upstream_server?
18
- validates :upstream_organization_label, presence: true, if: :upstream_server?
16
+ validates :password, presence: true, if: :network_sync?
17
+ validates :username, presence: true, if: :network_sync?
18
+ validates :upstream_organization_label, presence: true, if: :network_sync?
19
19
 
20
- validates :url, presence: true, unless: :airgapped?
21
- validates_with Validators::KatelloUrlFormatValidator, attributes: :url, unless: :airgapped?
20
+ validates :url, presence: true, unless: :export_sync?
21
+ validates_with Validators::KatelloUrlFormatValidator, attributes: :url, unless: :export_sync?
22
22
  validates_with Validators::KatelloLabelFormatValidator, attributes: :upstream_organization_label, if: proc { upstream_organization_label.present? }
23
- validate :non_redhat_configuration, if: :upstream_server?
23
+ validate :non_redhat_configuration, if: :network_sync?
24
24
 
25
25
  before_validation :reset_fields
26
26
 
@@ -32,20 +32,20 @@ module Katello
32
32
  type == CDN_TYPE
33
33
  end
34
34
 
35
- def airgapped?
36
- type == AIRGAPPED_TYPE
35
+ def export_sync?
36
+ type == EXPORT_SYNC
37
37
  end
38
38
 
39
- def upstream_server?
40
- type == UPSTREAM_SERVER_TYPE
39
+ def network_sync?
40
+ type == NETWORK_SYNC
41
41
  end
42
42
 
43
43
  private
44
44
 
45
45
  def reset_fields
46
- return if upstream_server?
46
+ return if network_sync?
47
47
 
48
- self.url = nil if airgapped?
48
+ self.url = nil if export_sync?
49
49
  self.url ||= SETTINGS[:katello][:redhat_repository_url] if redhat_cdn?
50
50
  self.username = nil
51
51
  self.password = nil
@@ -33,6 +33,9 @@ module Katello
33
33
  has_many :applicable_debs, :through => :content_facet
34
34
  has_many :applicable_rpms, :through => :content_facet
35
35
  has_many :applicable_module_streams, :through => :content_facet
36
+ has_many :bound_repositories, :through => :content_facet
37
+ has_many :bound_root_repositories, :through => :content_facet
38
+ has_many :bound_content, :through => :content_facet
36
39
 
37
40
  scoped_search :relation => :content_view, :on => :name, :complete_value => true, :rename => :content_view
38
41
  scoped_search :relation => :content_facet, :on => :content_view_id, :rename => :content_view_id, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
@@ -46,6 +49,8 @@ module Katello
46
49
  scoped_search :relation => :applicable_rpms, :on => :nvra, :rename => :applicable_rpms, :complete_value => true, :ext_method => :find_by_applicable_rpms, :only_explicit => true
47
50
  scoped_search :relation => :applicable_rpms, :on => :nvra, :rename => :upgradable_rpms, :complete_value => true, :ext_method => :find_by_installable_rpms, :only_explicit => true
48
51
  scoped_search :relation => :content_source, :on => :name, :complete_value => true, :rename => :content_source
52
+ scoped_search :relation => :bound_root_repositories, :on => :name, :rename => :repository, :complete_value => true, :ext_method => :find_by_repository_name, :only_explicit => true
53
+ scoped_search :relation => :bound_content, :on => :label, :rename => :repository_content_label, :complete_value => true, :ext_method => :find_by_repository_content_label, :only_explicit => true
49
54
 
50
55
  # preserve options set by facets framework, but add new :reject_if statement
51
56
  accepts_nested_attributes_for(
@@ -129,6 +134,26 @@ module Katello
129
134
  end
130
135
  end
131
136
 
137
+ def find_by_repository_content_label(_key, operator, value)
138
+ conditions = sanitize_sql_for_conditions(["#{Katello::Content.table_name}.label #{operator} ?", value_to_sql(operator, value)])
139
+ facets = Katello::Host::ContentFacet.joins_repositories.where(conditions)
140
+ if facets.empty?
141
+ { :conditions => "1=0" }
142
+ else
143
+ { :conditions => "#{::Host::Managed.table_name}.id IN (#{facets.pluck(:host_id).join(',')})" }
144
+ end
145
+ end
146
+
147
+ def find_by_repository_name(_key, operator, value)
148
+ conditions = sanitize_sql_for_conditions(["#{Katello::RootRepository.table_name}.name #{operator} ?", value_to_sql(operator, value)])
149
+ facets = Katello::Host::ContentFacet.joins_repositories.where(conditions)
150
+ if facets.empty?
151
+ { :conditions => "1=0" }
152
+ else
153
+ { :conditions => "#{::Host::Managed.table_name}.id IN (#{facets.pluck(:host_id).join(',')})" }
154
+ end
155
+ end
156
+
132
157
  def in_content_view_environment(content_view: nil, lifecycle_environment: nil)
133
158
  relation = self.joins(:content_facet)
134
159
  relation = relation.where("#{::Katello::Host::ContentFacet.table_name}.content_view_id" => content_view) if content_view
@@ -45,7 +45,7 @@ module Katello
45
45
  prepend ::ForemanRemoteExecution::HostExtensions if ::Katello.with_remote_execution?
46
46
  prepend Overrides
47
47
 
48
- delegate :content_source_id, :content_view_id, :lifecycle_environment_id, :kickstart_repository_id, to: :content_facet, allow_nil: true
48
+ delegate :content_source_id, :content_view_id, :lifecycle_environment_id, :kickstart_repository_id, :bound_repositories, to: :content_facet, allow_nil: true
49
49
 
50
50
  has_many :dispatch_histories, :class_name => "::Katello::Agent::DispatchHistory", :foreign_key => :host_id, :dependent => :delete_all
51
51
 
@@ -424,9 +424,10 @@ module Katello
424
424
  ::Katello::Erratum.installable_for_hosts([self]).search_for(search).pluck(:errata_id)
425
425
  end
426
426
 
427
- def valid_content_override_label?(content_label)
428
- available_content = subscription_facet.candlepin_consumer.available_product_content
429
- available_content.map(&:content).any? { |content| content.label == content_label }
427
+ def filtered_entitlement_quantity_consumed(pool)
428
+ entitlements = subscription_facet.candlepin_consumer.filter_entitlements(pool.cp_id)
429
+ return nil if entitlements.empty?
430
+ entitlements.sum { |e| e[:quantity] }
430
431
  end
431
432
 
432
433
  protected
@@ -446,7 +447,8 @@ end
446
447
  class ::Host::Managed::Jail < Safemode::Jail
447
448
  allow :content_source, :subscription_manager_configuration_url, :rhsm_organization_label,
448
449
  :host_collections, :pools, :hypervisor_host, :lifecycle_environment, :content_view,
449
- :installed_packages, :traces_helpers, :advisory_ids, :package_names_for_job_template
450
+ :installed_packages, :traces_helpers, :advisory_ids, :package_names_for_job_template,
451
+ :filtered_entitlement_quantity_consumed, :bound_repositories
450
452
  end
451
453
 
452
454
  class ActiveRecord::Associations::CollectionProxy::Jail < Safemode::Jail
@@ -6,6 +6,8 @@ module Katello
6
6
  included do
7
7
  has_many :root_repositories, :class_name => "::Katello::RootRepository", :foreign_key => :http_proxy_id,
8
8
  :inverse_of => :http_proxy, :dependent => :nullify
9
+ has_many :alternate_content_sources, :class_name => "::Katello::AlternateContentSource", :foreign_key => :http_proxy_id,
10
+ :inverse_of => :http_proxy, :dependent => :nullify
9
11
  after_update :update_default_proxy_setting
10
12
  after_commit :update_repository_proxy_details
11
13
  before_destroy :remove_references_to_proxy
@@ -29,6 +31,7 @@ module Katello
29
31
 
30
32
  def remove_references_to_proxy
31
33
  root_repos = repositories_with_proxy(nil).uniq.sort
34
+ acss = ::Katello::AlternateContentSource.where(http_proxy_id: id)
32
35
 
33
36
  setting = Setting.find_by(name: 'content_default_http_proxy')
34
37
  if setting&.value && setting.value == self.name
@@ -43,6 +46,17 @@ module Katello
43
46
  http_proxy_policy: Katello::RootRepository::GLOBAL_DEFAULT_HTTP_PROXY,
44
47
  http_proxy_id: nil)
45
48
  end
49
+
50
+ unless acss.empty?
51
+ acss.each do |acs|
52
+ ForemanTasks.async_task(
53
+ ::Actions::Katello::AlternateContentSource::Update,
54
+ acs,
55
+ acs.smart_proxies,
56
+ http_proxy_id: nil
57
+ )
58
+ end
59
+ end
46
60
  end
47
61
 
48
62
  def update_default_proxy_setting
@@ -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