katello 4.4.2.2 → 4.5.0.rc1

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 (444) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  3. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +98 -0
  4. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  5. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  7. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  8. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  9. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  11. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  12. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  13. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  14. data/app/controllers/katello/api/v2/repositories_controller.rb +9 -3
  15. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  16. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  17. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  18. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  19. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  21. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  22. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +2 -2
  24. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  25. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  26. data/app/lib/actions/katello/content_view/publish.rb +7 -9
  27. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  28. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  29. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  30. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  31. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  32. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  33. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  34. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  35. data/app/lib/actions/katello/product/content_create.rb +10 -8
  36. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  37. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  38. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  39. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  40. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  41. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  42. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  43. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  44. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  45. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  46. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  47. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +18 -0
  48. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  49. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +18 -0
  50. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  51. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  52. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  53. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +4 -1
  54. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +2 -0
  55. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  56. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  57. data/app/lib/katello/util/errata.rb +2 -3
  58. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  59. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  60. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  61. data/app/models/katello/alternate_content_source.rb +66 -0
  62. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  63. data/app/models/katello/authorization/repository.rb +3 -3
  64. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  65. data/app/models/katello/cdn_configuration.rb +15 -15
  66. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  67. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  68. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  69. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  70. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  71. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  72. data/app/models/katello/content.rb +1 -0
  73. data/app/models/katello/content_credential.rb +6 -0
  74. data/app/models/katello/content_override.rb +7 -3
  75. data/app/models/katello/content_view.rb +33 -2
  76. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  77. data/app/models/katello/content_view_filter.rb +4 -0
  78. data/app/models/katello/content_view_version.rb +12 -0
  79. data/app/models/katello/content_view_version_export_history.rb +3 -1
  80. data/app/models/katello/erratum.rb +9 -5
  81. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  82. data/app/models/katello/host/content_facet.rb +14 -0
  83. data/app/models/katello/host_available_module_stream.rb +12 -0
  84. data/app/models/katello/product_content.rb +1 -0
  85. data/app/models/katello/purpose_sla_status.rb +1 -1
  86. data/app/models/katello/purpose_status.rb +2 -2
  87. data/app/models/katello/repository.rb +7 -4
  88. data/app/models/katello/root_repository.rb +1 -1
  89. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  90. data/app/models/katello/sync_plan.rb +1 -1
  91. data/app/presenters/katello/product_content_presenter.rb +15 -0
  92. data/app/services/katello/applicable_host_queue.rb +1 -1
  93. data/app/services/katello/content_unit_indexer.rb +2 -1
  94. data/app/services/katello/product_content_finder.rb +12 -2
  95. data/app/services/katello/pulp3/alternate_content_source.rb +117 -0
  96. data/app/services/katello/pulp3/api/file.rb +8 -0
  97. data/app/services/katello/pulp3/api/yum.rb +8 -0
  98. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  99. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  100. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  101. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  102. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  103. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  104. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  105. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  106. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  107. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  108. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  109. data/app/services/katello/pulp3/repository.rb +7 -91
  110. data/app/services/katello/pulp3/service_common.rb +66 -0
  111. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  112. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  113. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  114. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  115. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  116. data/app/views/foreman/job_templates/install_group.erb +4 -4
  117. data/app/views/foreman/job_templates/install_package.erb +4 -4
  118. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  119. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  120. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  121. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  122. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  123. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  124. data/app/views/foreman/job_templates/update_group.erb +4 -4
  125. data/app/views/foreman/job_templates/update_package.erb +4 -4
  126. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  127. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +15 -0
  128. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  129. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  130. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  131. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  132. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  133. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  134. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  135. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  136. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  137. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  138. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  139. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  140. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  141. data/config/routes/api/v2.rb +7 -0
  142. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  143. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  144. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  145. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  146. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  147. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +10 -12
  148. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  149. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  150. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  151. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  152. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  153. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  154. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  155. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  156. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  157. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  158. data/db/seeds.d/150-module_job_templates.rb +1 -1
  159. data/engines/bastion/README.md +1 -0
  160. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  161. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +10 -5
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  165. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  166. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  167. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  168. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  169. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  170. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  189. data/lib/katello/engine.rb +1 -5
  190. data/lib/katello/permission_creator.rb +32 -4
  191. data/lib/katello/plugin.rb +378 -4
  192. data/lib/katello/tasks/reset.rake.bak +67 -0
  193. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  194. data/lib/katello/version.rb +1 -1
  195. data/locale/action_names.rb +47 -41
  196. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  197. data/locale/bn/katello.po +820 -106
  198. data/locale/bn/katello.po.time_stamp +0 -0
  199. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  200. data/locale/cs/katello.po +818 -104
  201. data/locale/cs/katello.po.time_stamp +0 -0
  202. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  203. data/locale/de/katello.po +893 -179
  204. data/locale/de/katello.po.time_stamp +0 -0
  205. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  206. data/locale/en/katello.po +817 -103
  207. data/locale/en/katello.po.time_stamp +0 -0
  208. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  209. data/locale/es/katello.po +882 -168
  210. data/locale/es/katello.po.time_stamp +0 -0
  211. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/fr/katello.po +1219 -505
  213. data/locale/fr/katello.po.time_stamp +0 -0
  214. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  215. data/locale/gu/katello.po +826 -112
  216. data/locale/gu/katello.po.time_stamp +0 -0
  217. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/hi/katello.po +826 -112
  219. data/locale/hi/katello.po.time_stamp +0 -0
  220. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/it/katello.po +863 -148
  222. data/locale/it/katello.po.time_stamp +0 -0
  223. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/ja/katello.po +1216 -499
  225. data/locale/ja/katello.po.time_stamp +0 -0
  226. data/locale/katello.pot +3847 -2507
  227. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/kn/katello.po +826 -112
  229. data/locale/kn/katello.po.time_stamp +0 -0
  230. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/ko/katello.po +912 -198
  232. data/locale/ko/katello.po.time_stamp +0 -0
  233. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/mr/katello.po +826 -112
  235. data/locale/mr/katello.po.time_stamp +0 -0
  236. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/or/katello.po +826 -112
  238. data/locale/or/katello.po.time_stamp +0 -0
  239. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/pa/katello.po +826 -112
  241. data/locale/pa/katello.po.time_stamp +0 -0
  242. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  243. data/locale/pt/katello.po +817 -103
  244. data/locale/pt/katello.po.time_stamp +0 -0
  245. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  246. data/locale/pt_BR/katello.po +879 -165
  247. data/locale/pt_BR/katello.po.time_stamp +0 -0
  248. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/ru/katello.po +927 -213
  250. data/locale/ru/katello.po.time_stamp +0 -0
  251. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ta/katello.po +820 -106
  253. data/locale/ta/katello.po.time_stamp +0 -0
  254. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/te/katello.po +826 -112
  256. data/locale/te/katello.po.time_stamp +0 -0
  257. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/zh_CN/katello.po +1202 -486
  259. data/locale/zh_CN/katello.po.time_stamp +0 -0
  260. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/zh_TW/katello.po +856 -142
  262. data/locale/zh_TW/katello.po.time_stamp +0 -0
  263. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  264. data/webpack/components/Errata/index.js +38 -8
  265. data/webpack/components/Packages/index.js +1 -4
  266. data/webpack/components/Search/Search.js +18 -3
  267. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  268. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  269. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  270. data/webpack/components/Table/MainTable.js +29 -4
  271. data/webpack/components/Table/TableHooks.js +63 -19
  272. data/webpack/components/Table/TableWrapper.js +4 -2
  273. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  274. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  275. data/webpack/components/TypeAhead/TypeAhead.js +8 -0
  276. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  277. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +5 -2
  278. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  279. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +256 -0
  280. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +202 -0
  281. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  282. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  283. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  284. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  285. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  286. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  287. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  288. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  289. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  290. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +187 -0
  291. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  292. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  293. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  294. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  295. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +110 -0
  296. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  297. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  298. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  299. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  300. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  301. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  302. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +62 -39
  303. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  304. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  305. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  306. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +486 -116
  307. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +147 -1
  308. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +6 -3
  309. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  310. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +2 -1
  311. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +48 -19
  312. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +35 -47
  313. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  314. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  315. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  316. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +269 -132
  317. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +47 -11
  318. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +30 -42
  319. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +36 -1
  320. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +94 -46
  321. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +18 -2
  322. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  323. data/webpack/containers/Application/config.js +5 -0
  324. data/webpack/global_index.js +30 -7
  325. data/webpack/global_test_setup.js +13 -0
  326. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  327. data/webpack/redux/actions/RedHatRepositories/helpers.js +9 -8
  328. data/webpack/scenes/AlternateContentSources/ACSActions.js +53 -0
  329. data/webpack/scenes/AlternateContentSources/ACSConstants.js +4 -0
  330. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  331. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +15 -0
  332. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +152 -0
  333. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  334. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  335. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  336. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  337. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  338. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  339. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  340. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  341. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  342. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  343. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  344. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  346. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  347. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  348. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  349. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  350. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  351. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  352. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  353. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  354. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  355. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  356. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  357. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  358. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  359. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  360. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  361. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  362. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  363. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  364. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  365. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  366. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  367. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  368. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  369. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  370. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  371. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  372. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  373. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  374. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  375. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  376. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  377. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  378. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  379. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  380. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  381. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  382. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  383. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  384. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  385. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  386. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  387. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  388. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  389. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  390. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  391. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  392. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  393. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  394. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  395. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  396. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  397. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  398. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  399. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  400. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  401. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  402. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  403. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  404. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  405. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  406. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  407. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  408. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  409. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  410. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  411. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  412. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  413. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  414. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  415. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +9 -5
  416. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  417. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  418. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  419. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  420. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  421. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  422. data/webpack/scenes/ContentViews/helpers.js +3 -0
  423. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  424. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  425. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  426. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  427. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  428. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  429. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  430. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  431. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  432. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  433. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  434. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  435. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  436. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  437. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  438. data/webpack/scenes/Tasks/helpers.js +33 -5
  439. data/webpack/utils/helpers.js +2 -0
  440. metadata +158 -40
  441. data/app/models/setting/content.rb +0 -201
  442. data/webpack/components/Table/__test__/useBulkSelect.test.js +0 -99
  443. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  444. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -243,12 +243,16 @@ module Katello
243
243
  api.content_distribution_trees_api.list(options)
244
244
  end
245
245
 
246
- def add_filter_content(source_repo_ids, filters, filter_list_map)
246
+ def add_filter_content(source_repo_ids, filters, filter_list_map, additional_included_errata)
247
247
  filters.each do |filter|
248
248
  if filter.inclusion
249
249
  source_repo_ids.each do |repo_id|
250
250
  filter_list_map[:whitelist_ids] += filter.content_unit_pulp_ids(::Katello::Repository.find(repo_id))
251
251
  end
252
+ elsif filter.class == ContentViewErratumFilter
253
+ source_repo_ids.each do |repo_id|
254
+ filter_list_map[:blacklist_ids] += filter.content_unit_pulp_ids(::Katello::Repository.find(repo_id), additional_included_errata)
255
+ end
252
256
  else
253
257
  source_repo_ids.each do |repo_id|
254
258
  filter_list_map[:blacklist_ids] += filter.content_unit_pulp_ids(::Katello::Repository.find(repo_id))
@@ -297,6 +301,7 @@ module Katello
297
301
  filter_list_map
298
302
  end
299
303
 
304
+ # rubocop:disable Metrics/MethodLength
300
305
  def copy_content_from_mapping(repo_id_map, options = {})
301
306
  repo_id_map.each do |source_repo_ids, dest_repo_map|
302
307
  filters = [ContentViewErratumFilter, ContentViewPackageGroupFilter, ContentViewPackageFilter].collect do |filter_class|
@@ -305,8 +310,20 @@ module Katello
305
310
  modular_filters = ContentViewModuleStreamFilter.where(:id => dest_repo_map[:filter_ids])
306
311
  filters.flatten!.compact!
307
312
 
313
+ errata_filters = ContentViewErratumFilter.where(:id => dest_repo_map[:filter_ids])
314
+
315
+ # Only filter out RPMs & modules via an erratum filter if they're not included in other allowed errata.
316
+ # Begin this by calculating all the errata that should be copied.
317
+ # If there are exclude filters, send the errata to the relevant methods to ensure their contents aren't excluded.
318
+ additional_included_errata = []
319
+ all_excluded_errata = []
320
+ unless errata_filters.blacklist.empty?
321
+ all_included_errata, all_excluded_errata = filtered_errata(errata_filters, source_repo_ids)
322
+ additional_included_errata = all_included_errata - all_excluded_errata
323
+ end
324
+
308
325
  filter_list_map = { whitelist_ids: [], blacklist_ids: [] }
309
- filter_list_map = add_filter_content(source_repo_ids, filters, filter_list_map)
326
+ filter_list_map = add_filter_content(source_repo_ids, filters, filter_list_map, additional_included_errata)
310
327
  filter_list_map = add_un_modular_rpms(source_repo_ids, filters, filter_list_map)
311
328
  filter_list_map = add_modular_content(source_repo_ids, filters, modular_filters, filter_list_map)
312
329
 
@@ -320,7 +337,7 @@ module Katello
320
337
 
321
338
  if content_unit_hrefs.any?
322
339
  source_repo_ids.each do |source_repo_id|
323
- content_unit_hrefs += additional_content_hrefs(::Katello::Repository.find(source_repo_id), content_unit_hrefs)
340
+ content_unit_hrefs += additional_content_hrefs(::Katello::Repository.find(source_repo_id), content_unit_hrefs, all_excluded_errata)
324
341
  end
325
342
  end
326
343
 
@@ -331,29 +348,68 @@ module Katello
331
348
 
332
349
  multi_copy_units(repo_id_map, dependency_solving)
333
350
  end
351
+ # rubocop:enable Metrics/MethodLength
352
+
353
+ # Calculate errata that should be included and excluded.
354
+ # https://projects.theforeman.org/issues/34437
355
+ def filtered_errata(errata_filters, source_repository_ids)
356
+ if errata_filters.whitelist.empty?
357
+ all_included_errata = ::Katello::Erratum.joins("inner join katello_repository_errata on katello_errata.id = katello_repository_errata.erratum_id").
358
+ joins("inner join katello_repositories on katello_repositories.id = katello_repository_errata.repository_id").
359
+ where("katello_repositories.id in (?)", source_repository_ids)
360
+ else
361
+ all_included_errata = errata_filters.whitelist.collect do |filter|
362
+ ::Katello::Erratum.joins("inner join katello_repository_errata on katello_errata.id = katello_repository_errata.erratum_id").
363
+ where(filter.generate_clauses(nil)).where("katello_repository_errata.repository_id in (?)", source_repository_ids)
364
+ end
365
+ all_included_errata.flatten!
366
+ end
367
+ all_excluded_errata = errata_filters.blacklist.collect do |filter|
368
+ ::Katello::Erratum.joins("inner join katello_repository_errata on katello_errata.id = katello_repository_errata.erratum_id").
369
+ where(filter.generate_clauses(nil)).where("katello_repository_errata.repository_id in (?)", source_repository_ids)
370
+ end
371
+ all_excluded_errata.flatten!
372
+ return all_included_errata, all_excluded_errata
373
+ end
334
374
 
335
- def copy_content_for_source(source_repository, options = {}) # rubocop:disable Metrics/CyclomaticComplexity
336
- filters = [ContentViewErratumFilter, ContentViewPackageGroupFilter, ContentViewPackageFilter].collect do |filter_class|
375
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
376
+ def copy_content_for_source(source_repository, options = {})
377
+ package_filters = [ContentViewPackageGroupFilter, ContentViewPackageFilter].collect do |filter_class|
337
378
  filter_class.where(:id => options[:filter_ids])
338
379
  end
380
+ package_filters.flatten!.compact!
381
+
382
+ errata_filters = ContentViewErratumFilter.where(:id => options[:filter_ids])
339
383
 
340
- filters.flatten!.compact!
341
384
  whitelist_ids = []
342
385
  blacklist_ids = []
343
- filters.each do |filter|
386
+
387
+ # Only filter out RPMs & modules via an erratum filter if they're not included in other allowed errata.
388
+ # Begin this by calculating all the errata that should be copied.
389
+ # If there are exclude filters, send the errata to the relevant methods to ensure their contents aren't excluded.
390
+ additional_included_errata = []
391
+ all_excluded_errata = []
392
+ unless errata_filters.blacklist.empty?
393
+ all_included_errata, all_excluded_errata = filtered_errata(errata_filters, [source_repository.id])
394
+ additional_included_errata = all_included_errata - all_excluded_errata
395
+ end
396
+
397
+ (errata_filters + package_filters).each do |filter|
344
398
  if filter.inclusion
345
399
  whitelist_ids += filter.content_unit_pulp_ids(source_repository)
400
+ elsif filter.class == ContentViewErratumFilter
401
+ blacklist_ids += filter.content_unit_pulp_ids(source_repository, additional_included_errata)
346
402
  else
347
403
  blacklist_ids += filter.content_unit_pulp_ids(source_repository)
348
404
  end
349
405
  end
350
406
 
351
- whitelist_ids = source_repository.rpms.where(:modular => false).pluck(:pulp_id).sort if (whitelist_ids.empty? && filters.select { |filter| filter.inclusion }.empty?)
407
+ whitelist_ids = source_repository.rpms.where(:modular => false).pluck(:pulp_id).sort if (whitelist_ids.empty? && (errata_filters + package_filters).select { |filter| filter.inclusion }.empty?)
352
408
 
353
409
  modular_filters = ContentViewModuleStreamFilter.where(:id => options[:filter_ids])
354
410
  inclusion_modular_filters = modular_filters.select { |filter| filter.inclusion }
355
411
  exclusion_modular_filters = modular_filters - inclusion_modular_filters
356
- if inclusion_modular_filters.empty? && !(filters.any? { |filter| filter.class == ContentViewErratumFilter && filter.inclusion })
412
+ if inclusion_modular_filters.empty? && errata_filters.whitelist.empty?
357
413
  whitelist_ids += source_repository.rpms.where(:modular => true).pluck(:pulp_id).sort
358
414
  whitelist_ids += source_repository.module_streams.pluck(:pulp_id).sort
359
415
  end
@@ -362,10 +418,11 @@ module Katello
362
418
  content_unit_hrefs = whitelist_ids - blacklist_ids
363
419
  content_unit_hrefs += source_repository.srpms.pluck(:pulp_id)
364
420
  if content_unit_hrefs.any?
365
- content_unit_hrefs += additional_content_hrefs(source_repository, content_unit_hrefs)
421
+ content_unit_hrefs += additional_content_hrefs(source_repository, content_unit_hrefs, all_excluded_errata)
366
422
  end
367
423
  copy_units(source_repository, content_unit_hrefs.uniq, options[:remove_all])
368
424
  end
425
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
369
426
 
370
427
  def modular_packages(source_repository, filters)
371
428
  list_ids = []
@@ -375,13 +432,14 @@ module Katello
375
432
  list_ids
376
433
  end
377
434
 
378
- def additional_content_hrefs(source_repository, content_unit_hrefs)
435
+ def additional_content_hrefs(source_repository, content_unit_hrefs, all_excluded_errata)
379
436
  repo_service = source_repository.backend_service(SmartProxy.pulp_primary)
380
437
  options = { :repository_version => source_repository.version_href }
381
438
 
382
439
  errata_to_include = filter_errata_by_pulp_href(source_repository.errata, content_unit_hrefs,
383
440
  source_repository.rpms.pluck(:filename) +
384
- source_repository.srpms.pluck(:filename))
441
+ source_repository.srpms.pluck(:filename)) -
442
+ all_excluded_errata
385
443
  content_unit_hrefs += errata_to_include.collect do |erratum|
386
444
  erratum.repository_errata.where(repository_id: source_repository.id).pluck(:erratum_pulp3_href)
387
445
  end
@@ -4,6 +4,7 @@ module Katello
4
4
  module Pulp3
5
5
  class Repository
6
6
  include Katello::Util::HttpProxy
7
+ include Katello::Pulp3::ServiceCommon
7
8
  attr_accessor :repo
8
9
  attr_accessor :smart_proxy
9
10
  delegate :root, to: :repo
@@ -49,13 +50,6 @@ module Katello
49
50
  @api ||= self.class.api(smart_proxy, repo.content_type)
50
51
  end
51
52
 
52
- def ignore_404_exception(*)
53
- yield
54
- rescue api.api_exception_class => e
55
- raise e unless e.code == 404
56
- nil
57
- end
58
-
59
53
  def published?
60
54
  !repo.publication_href.nil?
61
55
  end
@@ -74,56 +68,8 @@ module Katello
74
68
  end
75
69
 
76
70
  def create_remote
77
- if remote_options[:url]&.start_with?('uln')
78
- remote_file_data = api.class.remote_uln_class.new(remote_options)
79
- else
80
- remote_file_data = api.remote_class.new(remote_options)
81
- end
82
- reformat_api_exception do
83
- if remote_options[:url]&.start_with?('uln')
84
- response = api.remotes_uln_api.create(remote_file_data)
85
- else
86
- response = api.remotes_api.create(remote_file_data)
87
- end
88
- repo.update!(:remote_href => response.pulp_href)
89
- end
90
- end
91
-
92
- # When updating a repository, we need to update the remote, but this is
93
- # an async task. If some validation occurs, we won't know about it until
94
- # the task runs. Errors during a repository update task are very difficult to
95
- # handle once the task is in its run phase, so this creates a test remote
96
- # with a random name in order to validate the remote's configuration
97
- def create_test_remote
98
- test_remote_options = remote_options
99
- test_remote_options[:name] = test_remote_name
100
- if remote_options[:url]&.start_with?('uln')
101
- remote_file_data = api.class.remote_uln_class.new(test_remote_options)
102
- else
103
- remote_file_data = api.remote_class.new(test_remote_options)
104
- end
105
-
106
- reformat_api_exception do
107
- if remote_options[:url]&.start_with?('uln')
108
- response = api.remotes_uln_api.create(remote_file_data)
109
- else
110
- response = api.remotes_api.create(remote_file_data)
111
- end
112
- #delete is async, but if its not properly deleted, orphan cleanup will take care of it later
113
- delete_remote(response.pulp_href)
114
- end
115
- end
116
-
117
- def test_remote_name
118
- "test_remote_#{SecureRandom.uuid}"
119
- end
120
-
121
- def reformat_api_exception
122
- yield
123
- rescue api.client_module::ApiError => exception
124
- body = JSON.parse(exception.response_body) rescue body
125
- body = body.values.join(',') if body.respond_to?(:values)
126
- raise ::Katello::Errors::Pulp3Error, body
71
+ response = super
72
+ repo.update!(:remote_href => response.pulp_href)
127
73
  end
128
74
 
129
75
  def update_remote
@@ -285,17 +231,11 @@ module Katello
285
231
  return update_distribution
286
232
  end
287
233
 
288
- if dist && dist_ref
289
- # If the saved distribution reference is wrong, delete it and use the existing distribution
290
- if dist.pulp_href != dist_ref.href
291
- dist_ref.destroy
292
- save_distribution_references([dist.pulp_href])
293
- end
234
+ if dist_ref
294
235
  return update_distribution
295
236
  end
296
237
 
297
238
  # Since we got this far, we need to create a new distribution
298
- # Note: the distribution reference can't be saved yet because distribution creation is async
299
239
  begin
300
240
  create_distribution(relative_path)
301
241
  rescue api.client_module::ApiError => e
@@ -313,9 +253,6 @@ module Katello
313
253
 
314
254
  def create_distribution(path)
315
255
  distribution_data = api.distribution_class.new(secure_distribution_options(path))
316
- unless ::Katello::RepositoryTypeManager.find(repo.content_type).pulp3_skip_publication
317
- fail_missing_publication(distribution_data.publication)
318
- end
319
256
  api.distributions_api.create(distribution_data)
320
257
  end
321
258
 
@@ -323,16 +260,9 @@ module Katello
323
260
  api.distributions_api.list(args).results
324
261
  end
325
262
 
326
- def read_distribution(href = distribution_reference.href)
327
- ignore_404_exception { api.distributions_api.read(href) }
328
- end
329
-
330
263
  def update_distribution
331
264
  if distribution_reference
332
265
  options = secure_distribution_options(relative_path).except(:name)
333
- unless ::Katello::RepositoryTypeManager.find(repo.content_type).pulp3_skip_publication
334
- fail_missing_publication(options[:publication])
335
- end
336
266
  distribution_reference.update(:content_guard_href => options[:content_guard])
337
267
  api.distributions_api.partial_update(distribution_reference.href, options)
338
268
  end
@@ -391,12 +321,6 @@ module Katello
391
321
  hrefs.each do |href|
392
322
  pulp3_distribution_data = api.get_distribution(href)
393
323
  path, content_guard_href = pulp3_distribution_data&.base_path, pulp3_distribution_data&.content_guard
394
- if distribution_reference
395
- found_distribution = read_distribution(distribution_reference.href)
396
- unless found_distribution
397
- distribution_reference.destroy
398
- end
399
- end
400
324
  unless distribution_reference
401
325
  # Ensure that duplicates won't be created in the case of a race condition
402
326
  DistributionReference.where(path: path, href: href, repository_id: repo.id, content_guard_href: content_guard_href).first_or_create!
@@ -436,10 +360,8 @@ module Katello
436
360
  }
437
361
  remote_options[:url] = root.url unless root.url.blank?
438
362
  remote_options[:download_concurrency] = root.download_concurrency unless root.download_concurrency.blank?
439
- if !root.upstream_username.blank? && !root.upstream_password.blank?
440
- remote_options.merge!(username: root.upstream_username,
441
- password: root.upstream_password)
442
- end
363
+ remote_options.merge!(username: root&.upstream_username,
364
+ password: root&.upstream_password)
443
365
  remote_options.merge!(ssl_remote_options)
444
366
  end
445
367
 
@@ -479,7 +401,7 @@ module Katello
479
401
  client_key: root.product.key,
480
402
  ca_cert: Katello::Repository.feed_ca_cert(root.url)
481
403
  }
482
- elsif root.redhat? && root.cdn_configuration.upstream_server?
404
+ elsif root.redhat? && root.cdn_configuration.network_sync?
483
405
  {
484
406
  client_cert: root.cdn_configuration.ssl_cert,
485
407
  client_key: root.cdn_configuration.ssl_key,
@@ -551,12 +473,6 @@ module Katello
551
473
  return 0 if root.retain_package_versions_count.nil? || root.using_mirrored_content?
552
474
  root.retain_package_versions_count.to_i
553
475
  end
554
-
555
- def fail_missing_publication(publication_href)
556
- unless lookup_publication(publication_href)
557
- fail _("The repository's publication is missing. Please run a 'complete sync' on %s." % repo.name)
558
- end
559
- end
560
476
  end
561
477
  end
562
478
  end
@@ -0,0 +1,66 @@
1
+ module Katello
2
+ module Pulp3
3
+ module ServiceCommon
4
+ def create_remote
5
+ response = nil
6
+ if remote_options[:url]&.start_with?('uln')
7
+ remote_file_data = api.class.remote_uln_class.new(remote_options)
8
+ else
9
+ remote_file_data = api.remote_class.new(remote_options)
10
+ end
11
+ reformat_api_exception do
12
+ if remote_options[:url]&.start_with?('uln')
13
+ response = api.remotes_uln_api.create(remote_file_data)
14
+ else
15
+ response = api.remotes_api.create(remote_file_data)
16
+ end
17
+ end
18
+ response
19
+ end
20
+
21
+ def test_remote_name
22
+ "test_remote_#{SecureRandom.uuid}"
23
+ end
24
+
25
+ # When updating a repository, we need to update the remote, but this is
26
+ # an async task. If some validation occurs, we won't know about it until
27
+ # the task runs. Errors during a repository update task are very difficult to
28
+ # handle once the task is in its run phase, so this creates a test remote
29
+ # with a random name in order to validate the remote's configuration
30
+ def create_test_remote
31
+ test_remote_options = remote_options
32
+ test_remote_options[:name] = test_remote_name
33
+ if remote_options[:url]&.start_with?('uln')
34
+ remote_file_data = api.class.remote_uln_class.new(test_remote_options)
35
+ else
36
+ remote_file_data = api.remote_class.new(test_remote_options)
37
+ end
38
+
39
+ reformat_api_exception do
40
+ if remote_options[:url]&.start_with?('uln')
41
+ response = api.remotes_uln_api.create(remote_file_data)
42
+ else
43
+ response = api.remotes_api.create(remote_file_data)
44
+ end
45
+ #delete is async, but if its not properly deleted, orphan cleanup will take care of it later
46
+ delete_remote(response.pulp_href)
47
+ end
48
+ end
49
+
50
+ def ignore_404_exception(*)
51
+ yield
52
+ rescue api.api_exception_class => e
53
+ raise e unless e.code == 404
54
+ nil
55
+ end
56
+
57
+ def reformat_api_exception
58
+ yield
59
+ rescue api.client_module::ApiError => exception
60
+ body = JSON.parse(exception.response_body) rescue body
61
+ body = body.values.join(',') if body.respond_to?(:values)
62
+ raise ::Katello::Errors::Pulp3Error, body
63
+ end
64
+ end
65
+ end
66
+ end
@@ -76,12 +76,15 @@ module Katello
76
76
  def delete_orphan_remotes
77
77
  tasks = []
78
78
  repo_names = Katello::Repository.pluck(:pulp_id)
79
+ acs_remotes = Katello::SmartProxyAlternateContentSource.pluck(:remote_href)
79
80
  pulp3_enabled_repo_types.each do |repo_type|
80
81
  api = repo_type.pulp3_api(smart_proxy)
81
82
  remotes = api.remotes_list
82
83
 
83
84
  remotes.each do |remote|
84
- tasks << api.delete_remote(remote.pulp_href) unless repo_names.include?(remote.name)
85
+ if !repo_names.include?(remote.name) && !acs_remotes.include?(remote.pulp_href)
86
+ tasks << api.delete_remote(remote.pulp_href)
87
+ end
85
88
  end
86
89
  end
87
90
  tasks
@@ -0,0 +1,22 @@
1
+ module Katello
2
+ module UINotifications
3
+ module ContentView
4
+ class DelelteLatestVersionFailure < ::UINotifications::Base
5
+ private
6
+
7
+ def create
8
+ Notification.create!(
9
+ subject: subject,
10
+ initiator: initiator,
11
+ audience: ::Notification::AUDIENCE_ADMIN,
12
+ notification_blueprint: blueprint
13
+ )
14
+ end
15
+
16
+ def blueprint
17
+ @blueprint ||= NotificationBlueprint.find_by(name: 'content_view_auto_publish_error')
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -3,7 +3,7 @@ kind: job_template
3
3
  name: Change content source
4
4
  job_category: Katello
5
5
  model: JobTemplate
6
- provider_type: SSH
6
+ provider_type: script
7
7
  description_format: Configure subscription manager to new content source
8
8
  feature: katello_change_content_source
9
9
  %>
@@ -1,23 +1,23 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Install Errata - Katello SSH Default
3
+ name: Install Errata - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Install errata %{errata}'
6
6
  feature: katello_errata_install
7
- provider_type: SSH
7
+ provider_type: script
8
8
  template_inputs:
9
9
  - name: errata
10
10
  description: A comma-separated list of errata to install
11
11
  input_type: user
12
12
  required: true
13
13
  foreign_input_sets:
14
- - template: Package Action - SSH Default
14
+ - template: Package Action - Script Default
15
15
  exclude: action,package
16
16
  %>
17
17
  <% if @host.operatingsystem.family == 'Suse' -%>
18
18
  <% advisories = input(:errata).split(',').join(' ') %>
19
- <%= render_template('Package Action - SSH Default', :action => 'install -n -t patch', :package => advisories) %>
19
+ <%= render_template('Package Action - Script Default', :action => 'install -n -t patch', :package => advisories) %>
20
20
  <% else %>
21
21
  <% advisories = input(:errata).split(',').map { |e| "--advisory=#{e}" }.join(' ') %>
22
- <%= render_template('Package Action - SSH Default', :action => 'update-minimal', :package => advisories) %>
22
+ <%= render_template('Package Action - Script Default', :action => 'update-minimal', :package => advisories) %>
23
23
  <% end %>
@@ -1,26 +1,27 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Install errata by search query - Katello SSH Default
3
+ name: Install errata by search query - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Install errata %{Errata search query}'
6
6
  feature: katello_errata_install_by_search
7
- provider_type: SSH
7
+ provider_type: script
8
8
  template_inputs:
9
9
  - name: Errata search query
10
10
  description: Filter criteria for errata to be installed.
11
11
  input_type: user
12
12
  required: false
13
13
  foreign_input_sets:
14
- - template: Package Action - SSH Default
14
+ - template: Package Action - Script Default
15
15
  exclude: action,package
16
16
  %>
17
17
 
18
18
  <% if @host.operatingsystem.family == 'Suse' -%>
19
19
  <% advisories = @host.advisory_ids(search: input("Errata search query")).join(' ') %>
20
- <%= render_template('Package Action - SSH Default', :action => 'install -n -t patch', :package => advisories) %>
20
+ <%= render_template('Package Action - Script Default', :action => 'install -n -t patch', :package => advisories) %>
21
21
  <% else %>
22
22
  <% advisory_ids = @host.advisory_ids(search: input("Errata search query")) %>
23
+ <% raise "No errata matching given search query" if !input("Errata search query").blank? && advisory_ids.empty? %>
23
24
 
24
25
  <% advisories = advisory_ids.map { |e| "--advisory=#{e}" }.join(' ') %>
25
- <%= render_template('Package Action - SSH Default', :action => 'update-minimal', :package => advisories) %>
26
- <% end %>
26
+ <%= render_template('Package Action - Script Default', :action => 'update-minimal', :package => advisories) %>
27
+ <% end %>
@@ -1,13 +1,13 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Install Group - Katello SSH Default
3
+ name: Install Group - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Install package group(s) %{package}'
6
6
  feature: katello_group_install
7
- provider_type: SSH
7
+ provider_type: script
8
8
  foreign_input_sets:
9
- - template: Package Action - SSH Default
9
+ - template: Package Action - Script Default
10
10
  exclude: action
11
11
  %>
12
12
 
13
- <%= render_template('Package Action - SSH Default', :action => 'group install') %>
13
+ <%= render_template('Package Action - Script Default', :action => 'group install') %>
@@ -1,13 +1,13 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Install Package - Katello SSH Default
3
+ name: Install Package - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Install package(s) %{package}'
6
6
  feature: katello_package_install
7
- provider_type: SSH
7
+ provider_type: script
8
8
  foreign_input_sets:
9
- - template: Package Action - SSH Default
9
+ - template: Package Action - Script Default
10
10
  exclude: action
11
11
  %>
12
12
 
13
- <%= render_template('Package Action - SSH Default', :action => 'install') %>
13
+ <%= render_template('Package Action - Script Default', :action => 'install') %>
@@ -1,10 +1,10 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Install packages by search query - Katello SSH Default
3
+ name: Install packages by search query - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Install package(s) %{Package search query}'
6
6
  feature: katello_package_install_by_search
7
- provider_type: SSH
7
+ provider_type: script
8
8
  template_inputs:
9
9
  - name: Package search query
10
10
  description: Filter criteria for packages to be installed. IMPORTANT- If left blank, the job will attempt to install all possible packages.
@@ -16,4 +16,4 @@ template_inputs:
16
16
  search: input('Package search query')
17
17
  ) -%>
18
18
 
19
- <%= render_template('Package Action - SSH Default', :action => 'install', :package => package_names.join(' ')) %>
19
+ <%= render_template('Package Action - Script Default', :action => 'install', :package => package_names.join(' ')) %>
@@ -1,13 +1,13 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Remove Group - Katello SSH Default
3
+ name: Remove Group - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Remove package group(s) %{package}'
6
6
  feature: katello_group_remove
7
- provider_type: SSH
7
+ provider_type: script
8
8
  foreign_input_sets:
9
- - template: Package Action - SSH Default
9
+ - template: Package Action - Script Default
10
10
  exclude: action
11
11
  %>
12
12
 
13
- <%= render_template('Package Action - SSH Default', :action => 'group remove') %>
13
+ <%= render_template('Package Action - Script Default', :action => 'group remove') %>
@@ -1,13 +1,13 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Remove Package - Katello SSH Default
3
+ name: Remove Package - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Remove package(s) %{package}'
6
6
  feature: katello_package_remove
7
- provider_type: SSH
7
+ provider_type: script
8
8
  foreign_input_sets:
9
- - template: Package Action - SSH Default
9
+ - template: Package Action - Script Default
10
10
  exclude: action
11
11
  %>
12
12
 
13
- <%= render_template('Package Action - SSH Default', :action => 'remove') %>
13
+ <%= render_template('Package Action - Script Default', :action => 'remove') %>
@@ -1,10 +1,10 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Remove Packages by search query - Katello SSH Default
3
+ name: Remove Packages by search query - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Remove packages %{Packages search query}'
6
6
  feature: katello_packages_remove_by_search
7
- provider_type: SSH
7
+ provider_type: script
8
8
  template_inputs:
9
9
  - name: Packages search query
10
10
  description: Filter criteria for packages to be removed.
@@ -16,4 +16,4 @@ template_inputs:
16
16
  search: input('Packages search query')
17
17
  ) -%>
18
18
 
19
- <%= render_template('Package Action - SSH Default', :action => 'remove', :package => package_names.join(' ')) %>
19
+ <%= render_template('Package Action - Script Default', :action => 'remove', :package => package_names.join(' ')) %>
@@ -1,10 +1,10 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Resolve Traces - Katello SSH Default
3
+ name: Resolve Traces - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Resolve Traces'
6
6
  feature: katello_host_tracer_resolve
7
- provider_type: SSH
7
+ provider_type: script
8
8
  template_inputs:
9
9
  - name: Traces search query
10
10
  description: Search query to provide traces to resolve
@@ -1,10 +1,10 @@
1
1
  <%#
2
2
  kind: job_template
3
- name: Restart Services - Katello SSH Default
3
+ name: Restart Services - Katello Script Default
4
4
  job_category: Katello
5
5
  description_format: 'Restart Services'
6
6
  feature: katello_service_restart
7
- provider_type: SSH
7
+ provider_type: script
8
8
  template_inputs:
9
9
  - name: helper
10
10
  description: A comma separated list of commands to run to restart services
@@ -19,5 +19,5 @@ reboot = commands.delete('reboot')
19
19
  <%= commands.join("\n") %>
20
20
  katello-tracer-upload
21
21
  <% if reboot -%>
22
- <%= render_template('Power Action - SSH Default', action: 'restart') %>
22
+ <%= render_template('Power Action - Script Default', action: 'restart') %>
23
23
  <% end %>