katello 4.4.1 → 4.5.0

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

Potentially problematic release.


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

Files changed (488) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/activation_key_edit.js +9 -2
  3. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +3 -0
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  5. data/app/controllers/katello/api/v2/alternate_content_sources_bulk_actions_controller.rb +44 -0
  6. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +121 -0
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  9. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  10. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  11. data/app/controllers/katello/api/v2/content_view_repositories_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  14. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  16. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  17. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  18. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  19. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  20. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  21. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  22. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  23. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  24. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  25. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  26. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  27. data/app/lib/actions/katello/alternate_content_source/refresh.rb +27 -0
  28. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  29. data/app/lib/actions/katello/cdn_configuration/update.rb +3 -3
  30. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  31. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  32. data/app/lib/actions/katello/content_view/publish.rb +8 -10
  33. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  34. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  35. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  36. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  37. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  38. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  39. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  40. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  41. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  42. data/app/lib/actions/katello/product/content_create.rb +10 -8
  43. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  44. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  45. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  46. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  47. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  48. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  49. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +23 -0
  50. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  51. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  52. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  53. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  54. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  55. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +16 -0
  56. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  57. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +15 -0
  58. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +16 -0
  59. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  60. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  61. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  62. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -1
  63. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  64. data/app/lib/katello/concerns/base_template_scope_extensions.rb +24 -11
  65. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  66. data/app/lib/katello/util/errata.rb +2 -3
  67. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  68. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  69. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  70. data/app/models/katello/alternate_content_source.rb +71 -0
  71. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  72. data/app/models/katello/authorization/repository.rb +5 -3
  73. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  74. data/app/models/katello/cdn_configuration.rb +15 -15
  75. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  76. data/app/models/katello/concerns/host_managed_extensions.rb +7 -6
  77. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  78. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  79. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  80. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  81. data/app/models/katello/content.rb +1 -0
  82. data/app/models/katello/content_credential.rb +6 -0
  83. data/app/models/katello/content_override.rb +7 -3
  84. data/app/models/katello/content_view.rb +33 -2
  85. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  86. data/app/models/katello/content_view_filter.rb +4 -0
  87. data/app/models/katello/content_view_version.rb +12 -0
  88. data/app/models/katello/content_view_version_export_history.rb +3 -1
  89. data/app/models/katello/erratum.rb +9 -5
  90. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  91. data/app/models/katello/host/content_facet.rb +14 -0
  92. data/app/models/katello/host_available_module_stream.rb +12 -0
  93. data/app/models/katello/product_content.rb +1 -0
  94. data/app/models/katello/purpose_sla_status.rb +1 -1
  95. data/app/models/katello/purpose_status.rb +2 -2
  96. data/app/models/katello/repository.rb +7 -4
  97. data/app/models/katello/root_repository.rb +1 -1
  98. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  99. data/app/models/katello/sync_plan.rb +1 -1
  100. data/app/presenters/katello/product_content_presenter.rb +15 -0
  101. data/app/services/katello/applicable_host_queue.rb +1 -1
  102. data/app/services/katello/product_content_finder.rb +12 -2
  103. data/app/services/katello/pulp3/alternate_content_source.rb +123 -0
  104. data/app/services/katello/pulp3/api/file.rb +8 -0
  105. data/app/services/katello/pulp3/api/yum.rb +8 -0
  106. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  107. data/app/services/katello/pulp3/content_view_version/import.rb +104 -71
  108. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  109. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  110. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  111. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  112. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +102 -38
  113. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  114. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  115. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  116. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  117. data/app/services/katello/pulp3/repository.rb +6 -62
  118. data/app/services/katello/pulp3/service_common.rb +66 -0
  119. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  120. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  121. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  122. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  123. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +10 -8
  124. data/app/views/foreman/job_templates/install_group.erb +4 -4
  125. data/app/views/foreman/job_templates/install_package.erb +4 -4
  126. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  127. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  128. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  129. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  130. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  131. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  132. data/app/views/foreman/job_templates/update_group.erb +4 -4
  133. data/app/views/foreman/job_templates/update_package.erb +4 -4
  134. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  135. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +24 -0
  136. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  137. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  138. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  139. data/app/views/katello/api/v2/content_facet/show.json.rabl +12 -0
  140. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  141. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  142. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  143. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  144. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  145. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  146. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  147. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  148. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  149. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  150. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  151. data/config/routes/api/v2.rb +19 -0
  152. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  153. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  154. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  155. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  156. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  157. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +1 -1
  158. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  159. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  160. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  161. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  162. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  163. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  164. data/db/migrate/20220303160220_remove_duplicate_errata.rb +1 -1
  165. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  166. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  167. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  168. data/db/migrate/20220428203334_add_last_refreshed_to_katello_alternate_content_sources.rb +5 -0
  169. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  170. data/db/seeds.d/150-module_job_templates.rb +1 -1
  171. data/engines/bastion/README.md +1 -0
  172. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  173. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/activation-keys.routes.js +1 -1
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +11 -6
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages.controller.js +11 -3
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -12
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  204. data/lib/katello/engine.rb +1 -5
  205. data/lib/katello/permission_creator.rb +34 -4
  206. data/lib/katello/plugin.rb +377 -3
  207. data/lib/katello/tasks/refresh_alternate_content_sources.rake +15 -0
  208. data/lib/katello/tasks/reset.rake.bak +67 -0
  209. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  210. data/lib/katello/version.rb +1 -1
  211. data/locale/action_names.rb +47 -41
  212. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  213. data/locale/bn/katello.po +820 -106
  214. data/locale/bn/katello.po.time_stamp +0 -0
  215. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  216. data/locale/cs/katello.po +818 -104
  217. data/locale/cs/katello.po.time_stamp +0 -0
  218. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  219. data/locale/de/katello.po +893 -179
  220. data/locale/de/katello.po.time_stamp +0 -0
  221. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  222. data/locale/en/katello.po +817 -103
  223. data/locale/en/katello.po.time_stamp +0 -0
  224. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  225. data/locale/es/katello.po +882 -168
  226. data/locale/es/katello.po.time_stamp +0 -0
  227. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/fr/katello.po +1219 -505
  229. data/locale/fr/katello.po.time_stamp +0 -0
  230. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/gu/katello.po +826 -112
  232. data/locale/gu/katello.po.time_stamp +0 -0
  233. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/hi/katello.po +826 -112
  235. data/locale/hi/katello.po.time_stamp +0 -0
  236. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/it/katello.po +863 -148
  238. data/locale/it/katello.po.time_stamp +0 -0
  239. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/ja/katello.po +1216 -499
  241. data/locale/ja/katello.po.time_stamp +0 -0
  242. data/locale/katello.pot +3847 -2507
  243. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/kn/katello.po +826 -112
  245. data/locale/kn/katello.po.time_stamp +0 -0
  246. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  247. data/locale/ko/katello.po +912 -198
  248. data/locale/ko/katello.po.time_stamp +0 -0
  249. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/mr/katello.po +826 -112
  251. data/locale/mr/katello.po.time_stamp +0 -0
  252. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  253. data/locale/or/katello.po +826 -112
  254. data/locale/or/katello.po.time_stamp +0 -0
  255. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  256. data/locale/pa/katello.po +826 -112
  257. data/locale/pa/katello.po.time_stamp +0 -0
  258. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  259. data/locale/pt/katello.po +817 -103
  260. data/locale/pt/katello.po.time_stamp +0 -0
  261. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  262. data/locale/pt_BR/katello.po +879 -165
  263. data/locale/pt_BR/katello.po.time_stamp +0 -0
  264. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  265. data/locale/ru/katello.po +927 -213
  266. data/locale/ru/katello.po.time_stamp +0 -0
  267. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  268. data/locale/ta/katello.po +820 -106
  269. data/locale/ta/katello.po.time_stamp +0 -0
  270. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/te/katello.po +826 -112
  272. data/locale/te/katello.po.time_stamp +0 -0
  273. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  274. data/locale/zh_CN/katello.po +1202 -486
  275. data/locale/zh_CN/katello.po.time_stamp +0 -0
  276. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  277. data/locale/zh_TW/katello.po +856 -142
  278. data/locale/zh_TW/katello.po.time_stamp +0 -0
  279. data/webpack/components/Bookmark/index.js +22 -14
  280. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  281. data/webpack/components/Errata/index.js +38 -8
  282. data/webpack/components/Packages/index.js +1 -4
  283. data/webpack/components/Search/Search.js +22 -3
  284. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  285. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  286. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  287. data/webpack/components/Table/MainTable.js +29 -4
  288. data/webpack/components/Table/MainTable.scss +5 -1
  289. data/webpack/components/Table/TableHooks.js +65 -20
  290. data/webpack/components/Table/TableWrapper.js +9 -3
  291. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  292. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  293. data/webpack/components/TypeAhead/TypeAhead.js +12 -0
  294. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  295. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +7 -2
  296. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  297. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +250 -0
  298. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +232 -0
  299. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  300. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  301. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  302. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  303. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  304. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  305. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  306. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  307. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  308. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +206 -0
  309. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  310. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  311. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  312. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  313. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +118 -0
  314. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  315. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  316. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  317. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  318. data/webpack/components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions.js +37 -0
  319. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  320. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  321. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +11 -0
  322. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  323. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -0
  324. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +6 -1
  325. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +176 -72
  326. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  327. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  328. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  329. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +522 -118
  330. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  331. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +6 -4
  332. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +164 -58
  333. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +59 -49
  334. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  335. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +85 -0
  336. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  337. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  338. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +298 -107
  339. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +14 -7
  340. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/HostTracesActions.js +2 -1
  341. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +104 -0
  342. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +134 -57
  343. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +37 -32
  344. data/webpack/components/extensions/HostDetails/Tabs/{ModuleStreamsTab/__tests__/modules.fixtures.json → __tests__/moduleStreams.fixtures.json} +6 -3
  345. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +261 -0
  346. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +21 -15
  347. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +44 -1
  348. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +4 -1
  349. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +105 -6
  350. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -6
  351. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  352. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +18 -0
  353. data/webpack/containers/Application/config.js +5 -0
  354. data/webpack/global_index.js +32 -9
  355. data/webpack/global_test_setup.js +13 -0
  356. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  357. data/webpack/redux/actions/RedHatRepositories/helpers.js +13 -8
  358. data/webpack/scenes/AlternateContentSources/ACSActions.js +65 -0
  359. data/webpack/scenes/AlternateContentSources/ACSConstants.js +18 -0
  360. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  361. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +24 -0
  362. data/webpack/scenes/AlternateContentSources/Create/ACSCreateContext.js +4 -0
  363. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +160 -0
  364. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +79 -0
  365. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +199 -0
  366. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +104 -0
  367. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +41 -0
  368. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +71 -0
  369. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +57 -0
  370. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +77 -0
  371. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +149 -0
  372. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateData.fixtures.json +3 -0
  373. data/webpack/scenes/AlternateContentSources/Create/__tests__/contentCredentials.fixtures.json +69 -0
  374. data/webpack/scenes/AlternateContentSources/Create/__tests__/smartProxy.fixtures.json +65 -0
  375. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +162 -0
  376. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  377. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  378. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  379. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  380. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  381. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +4 -1
  382. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  383. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  384. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  385. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  386. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +2 -1
  387. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  388. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  389. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  390. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +2 -2
  391. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -2
  392. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  393. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  394. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  395. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  396. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +16 -2
  397. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  398. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  399. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  400. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  401. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  402. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  404. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  405. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  406. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  407. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  408. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  409. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  410. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  411. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  412. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  413. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  414. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  415. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  416. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  417. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  418. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  419. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  420. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  421. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  434. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  435. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  436. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  437. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  446. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  447. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  448. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  449. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  450. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  451. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  452. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  453. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  454. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  455. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -6
  456. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  457. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  458. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  459. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +2 -2
  460. data/webpack/scenes/ContentViews/helpers.js +3 -0
  461. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  462. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  463. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  464. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  465. data/webpack/scenes/RedHatRepositories/components/Search.js +4 -4
  466. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +9 -2
  467. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -1
  468. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +10 -1
  469. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  470. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  471. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  472. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  473. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  474. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  475. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  476. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  477. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  478. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  479. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  480. data/webpack/scenes/Tasks/helpers.js +60 -5
  481. data/webpack/utils/helpers.js +2 -0
  482. metadata +183 -38
  483. data/app/models/setting/content.rb +0 -201
  484. data/db/seeds.d/107-enable_dynflow.rb +0 -8
  485. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  486. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +0 -108
  487. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerEmptyState.js +0 -42
  488. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -2,20 +2,21 @@ module Katello
2
2
  module Pulp3
3
3
  module ContentViewVersion
4
4
  class ImportValidator
5
- attr_accessor :metadata, :path, :content_view, :smart_proxy
6
-
7
- delegate :organization, :to => :content_view
8
-
9
- def initialize(content_view:, path:, metadata:, smart_proxy:)
10
- self.content_view = content_view
11
- self.path = path
12
- self.metadata = metadata
13
- self.smart_proxy = smart_proxy
5
+ def initialize(import:)
6
+ @content_view = import.content_view
7
+ @path = import.path
8
+ @smart_proxy = import.smart_proxy
9
+ @organization = import.organization
10
+ @metadata_map = import.metadata_map
11
+ @interested_repos = import.intersecting_repos_library_and_metadata
12
+ @redhat_library_products = redhat_library_products
14
13
  end
15
14
 
16
15
  def check!
16
+ fail _("Content view not provided in the metadata") if @metadata_map.content_view.blank?
17
+
17
18
  ensure_pulp_importable!
18
- unless content_view.default?
19
+ unless @content_view.default?
19
20
  ensure_importing_cvv_does_not_exist!
20
21
  ensure_from_cvv_exists!
21
22
  end
@@ -26,113 +27,107 @@ module Katello
26
27
 
27
28
  def ensure_pulp_importable!
28
29
  api = ::Katello::Pulp3::Api::Core.new(@smart_proxy).importer_check_api
29
- response = api.pulp_import_check_post(toc: "#{@path}/#{@metadata[:toc]}")
30
+ response = api.pulp_import_check_post(toc: "#{@path}/#{@metadata_map.toc}")
30
31
  unless response.toc.is_valid
31
32
  fail response.toc.messages.join("\n")
32
33
  end
33
34
  end
34
35
 
35
36
  def ensure_importing_cvv_does_not_exist!
36
- major = metadata[:content_view_version][:major]
37
- minor = metadata[:content_view_version][:minor]
37
+ major = @metadata_map.content_view_version.major
38
+ minor = @metadata_map.content_view_version.minor
38
39
 
39
- if ::Katello::ContentViewVersion.where(major: major, minor: minor, content_view: content_view).exists?
40
+ if ::Katello::ContentViewVersion.where(major: major, minor: minor, content_view: @content_view).exists?
40
41
  fail _("Content View Version specified in the metadata - '%{name}' already exists. "\
41
- "If you wish to replace the existing version, delete %{name} and try again. " % { name: "#{content_view.name} #{major}.#{minor}" })
42
+ "If you wish to replace the existing version, delete %{name} and try again. " % { name: "#{@content_view.name} #{major}.#{minor}" })
42
43
  end
43
44
  end
44
45
 
45
46
  def ensure_from_cvv_exists!
46
- major = metadata[:content_view_version][:major]
47
- minor = metadata[:content_view_version][:minor]
47
+ major = @metadata_map.content_view_version.major
48
+ minor = @metadata_map.content_view_version.minor
48
49
 
49
- if metadata[:from_content_view_version].present?
50
- from_major = metadata[:from_content_view_version][:major]
51
- from_minor = metadata[:from_content_view_version][:minor]
50
+ if @metadata_map.from_content_view_version
51
+ from_major = @metadata_map.from_content_view_version.major
52
+ from_minor = @metadata_map.from_content_view_version.minor
52
53
 
53
- unless ::Katello::ContentViewVersion.where(major: from_major, minor: from_minor, content_view: content_view).exists?
54
+ unless ::Katello::ContentViewVersion.where(major: from_major, minor: from_minor, content_view: @content_view).exists?
54
55
  fail _("Prior Content View Version specified in the metadata - '%{name}' does not exist. "\
55
- "Please import the metadata for '%{name}' before importing '%{current}' " % { name: "#{content_view.name} #{from_major}.#{from_minor}",
56
- current: "#{content_view.name} #{major}.#{minor}"})
56
+ "Please import the metadata for '%{name}' before importing '%{current}' " % { name: "#{@content_view.name} #{from_major}.#{from_minor}",
57
+ current: "#{@content_view.name} #{major}.#{minor}"})
57
58
  end
58
59
  end
59
60
  end
60
61
 
61
62
  def ensure_manifest_imported!
62
- rh_repos = ::Katello::Pulp3::ContentViewVersion::Import.metadata_map(metadata, redhat_only: true)
63
- if rh_repos.any? && !content_view.organization.manifest_imported?
63
+ any_rh_repos = @metadata_map.repositories.any?(&:redhat)
64
+ if any_rh_repos && !@organization.manifest_imported?
64
65
  fail _("No manifest found. Import a manifest with the appropriate subscriptions "\
65
66
  "before importing content.")
66
67
  end
67
68
  end
68
69
 
69
- def repos_in_library
70
- ::Katello::Pulp3::ContentViewVersion::Import.
71
- repositories_in_library(content_view.organization)
72
- end
70
+ def ensure_metadata_matches_repos_in_library!
71
+ bad_repos = @interested_repos.select do |katello_repo|
72
+ metadata_repo = metadata_repo_for_katello_repo(katello_repo)
73
73
 
74
- def metadata_map
75
- @metadata_map ||= ::Katello::Pulp3::ContentViewVersion::Import.metadata_map(metadata)
76
- end
74
+ next unless metadata_repo
77
75
 
78
- def ensure_metadata_matches_repos_in_library!
79
- metadata_map = ::Katello::Pulp3::ContentViewVersion::Import.metadata_map(metadata)
80
- interested_repos = ::Katello::Pulp3::ContentViewVersion::Import.
81
- intersecting_repos_library_and_metadata(organization: organization,
82
- metadata: metadata)
83
- bad_repos = interested_repos.select do |repo|
84
- repo_in_metadata = metadata_map[[repo.product.label, repo.label]]
85
- repo.redhat? != repo_in_metadata[:redhat] ||
86
- repo.slice(:name, :label, :content_type) != repo_in_metadata.slice(:name, :label, :content_type)
76
+ !(katello_repo.content_type == metadata_repo.content_type &&
77
+ katello_repo.redhat? == metadata_repo.redhat)
87
78
  end
88
79
 
89
80
  if bad_repos.any?
90
- repos_to_report = bad_repos.map { |repo| [repo.product.label, repo.label] }
91
81
  fail _("The following repositories provided in the import metadata have an incorrect content type or provider type. "\
92
82
  "Make sure the export and import repositories are of the same type before importing\n "\
93
- "%{repos}" % { content_view: content_view.name,
94
- repos: generate_product_repo_i18n_string(repos_to_report).join("")}
83
+ "%{repos}" % { content_view: @content_view.name,
84
+ repos: generate_product_repo_i18n_string(bad_repos).join("")}
95
85
  )
96
86
  end
97
87
  end
98
88
 
99
89
  def ensure_redhat_products_metadata_are_in_the_library!
100
- products_in_library = ::Katello::Product.in_org(organization).redhat.pluck(:label)
101
-
102
- # Map products to repositories in the metadata
103
- # {product_label: [repositories with this product]}
104
- products_in_metadata_map = {}
90
+ missing = @metadata_map.repositories.select do |repo|
91
+ repo.redhat && katello_product_for_metadata_repo(repo).nil?
92
+ end
105
93
 
106
- metadata[:repositories].values.each do |repo|
107
- next unless repo[:redhat]
108
- products_in_metadata_map[repo[:product][:label]] ||= []
109
- products_in_metadata_map[repo[:product][:label]] << repo
94
+ if missing.any?
95
+ repos_in_import = generate_product_repo_i18n_string(missing)
96
+ fail _("The organization's manifest does not contain the subscriptions required to enable the following repositories.\n "\
97
+ "%{repos}" % { content_view: @content_view.name, repos: repos_in_import.join("")}
98
+ )
110
99
  end
100
+ end
101
+
102
+ private
111
103
 
112
- products_not_in_library = products_in_metadata_map.keys - products_in_library
113
-
114
- unless products_not_in_library.blank?
115
- # make a list of [product_name, repo_name] pairs to report to the user
116
- product_repos = []
117
- products_not_in_library.each do |prod|
118
- products_in_metadata_map[prod].each do |repo|
119
- product_name = metadata[:products][prod][:name]
120
- repo_name = repo[:name]
121
- product_repos << [product_name, repo_name]
122
- end
104
+ def katello_product_for_metadata_repo(metadata_repo)
105
+ @redhat_library_products.find do |product|
106
+ if metadata_repo.redhat && metadata_repo.product.cp_id
107
+ product.cp_id == metadata_repo.product.cp_id
108
+ else
109
+ product.label == metadata_repo.product.label
123
110
  end
111
+ end
112
+ end
124
113
 
125
- repos_in_import = generate_product_repo_i18n_string(product_repos)
126
- fail _("The organization's manifest does not contain the subscriptions required to enable the following repositories.\n "\
127
- "%{repos}" % { content_view: content_view.name, repos: repos_in_import.join("")}
128
- )
114
+ def metadata_repo_for_katello_repo(repo)
115
+ @metadata_map.repositories.find do |metadata_repo|
116
+ if repo.redhat? && metadata_repo.product.cp_id
117
+ repo.label == metadata_repo.label && repo.product.cp_id == metadata_repo.product.cp_id
118
+ else
119
+ repo.label == metadata_repo.label && repo.product.label == metadata_repo.product.label
120
+ end
129
121
  end
130
122
  end
131
123
 
132
- def generate_product_repo_i18n_string(product_repos)
133
- # product_repos look like [["prod1", "repo1", false], ["prod2", "repo2", false]]
134
- product_repos.map do |product, repo|
135
- _("\n* Product = '%{product}', Repository = '%{repository}'" % { product: product, repository: repo })
124
+ def redhat_library_products
125
+ ::Katello::Product.in_org(@organization).redhat
126
+ end
127
+
128
+ def generate_product_repo_i18n_string(metadata_repos)
129
+ metadata_repos.map do |repo|
130
+ _("\n* Product = '%{product}', Repository = '%{repository}'" % { product: repo.product.name, repository: repo.name })
136
131
  end
137
132
  end
138
133
  end
@@ -2,19 +2,14 @@ module Katello
2
2
  module Pulp3
3
3
  module ContentViewVersion
4
4
  class ImportableProducts
5
- attr_accessor :creatable, :updatable, :organization, :metadata
5
+ attr_reader :creatable, :updatable
6
6
 
7
- def initialize(organization:, metadata:)
8
- self.organization = organization
9
- self.metadata = metadata
10
- self.creatable = []
11
- self.updatable = []
12
- end
13
-
14
- def products_in_library
15
- # Get the product labels in library
16
- return @products_in_library unless @products_in_library.blank?
17
- @products_in_library = Set.new(::Katello::Product.in_org(organization).custom.pluck(:label))
7
+ def initialize(organization:, metadata_products:)
8
+ @organization = organization
9
+ @metadata_products = metadata_products
10
+ @creatable = []
11
+ @updatable = []
12
+ @products_in_library = ::Katello::Product.in_org(@organization).custom
18
13
  end
19
14
 
20
15
  def generate!
@@ -23,24 +18,45 @@ module Katello
23
18
  # They are ready to be created
24
19
  # updatable: products that are both in the metadata and library.
25
20
  # These may contain updates to the product and hence ready to be updated.
26
- metadata[:products].each do |product_label, params|
27
- next if params[:redhat]
28
- if params[:gpg_key].blank?
29
- params[:gpg_key_id] = nil
30
- else
31
- params[:gpg_key_id] = organization.gpg_keys.find_by(name: params[:gpg_key][:name]).id
32
- end
33
- params = params.except(:gpg_key, :redhat)
34
- if products_in_library.include? product_label
21
+ @metadata_products.each do |product|
22
+ next if product.redhat
23
+
24
+ library_product = @products_in_library.find { |p| p.label == product.label }
25
+ if library_product
35
26
  # add to the update list if product is already available
36
- product = ::Katello::Product.in_org(organization).find_by(label: product_label)
37
- updatable << { product: product, options: params.except(:name, :label) }
27
+ updatable << { product: library_product, options: update_params(product) }
38
28
  else
39
29
  # add to the create list if its a new product
40
- creatable << { product: ::Katello::Product.new(params) }
30
+ creatable << { product: ::Katello::Product.new(create_params(product)) }
41
31
  end
42
32
  end
43
33
  end
34
+
35
+ private
36
+
37
+ def create_params(metadata_product)
38
+ {
39
+ gpg_key_id: gpg_key_id(metadata_product),
40
+ name: metadata_product.name,
41
+ label: metadata_product.label,
42
+ description: metadata_product.description
43
+ }
44
+ end
45
+
46
+ def update_params(metadata_product)
47
+ params = {
48
+ gpg_key_id: gpg_key_id(metadata_product),
49
+ description: metadata_product.description
50
+ }
51
+
52
+ params
53
+ end
54
+
55
+ def gpg_key_id(metadata_product)
56
+ if metadata_product.gpg_key
57
+ @organization.gpg_keys.where(name: metadata_product.gpg_key.name).pluck(:id).first
58
+ end
59
+ end
44
60
  end
45
61
  end
46
62
  end
@@ -2,63 +2,127 @@ module Katello
2
2
  module Pulp3
3
3
  module ContentViewVersion
4
4
  class ImportableRepositories
5
- attr_reader :creatable, :updatable, :organization, :metadata, :redhat
5
+ attr_reader :creatable, :updatable
6
6
 
7
- def initialize(organization:, metadata:, redhat: false)
7
+ def initialize(organization:, metadata_repositories:)
8
8
  @organization = organization
9
- @metadata = metadata
9
+ @metadata_repositories = metadata_repositories
10
10
  @creatable = []
11
11
  @updatable = []
12
- @redhat = redhat
13
- end
14
-
15
- def product_content_by_label(content_label)
16
- ::Katello::Content.find_by_label(content_label)
17
- end
18
-
19
- def repositories_in_library
20
- return @repositories_in_library unless @repositories_in_library.blank?
21
- repo_type = redhat ? :redhat : :custom
22
- # fetch a list of [product, repo] pairs for every non-redhat library repo
23
- product_repos_in_library = Import.repositories_in_library(organization).send(repo_type).
24
- pluck("#{Katello::Product.table_name}.label",
25
- "#{Katello::RootRepository.table_name}.label")
26
- @repositories_in_library = Set.new(product_repos_in_library.compact)
27
12
  end
28
13
 
29
14
  def generate!
30
- # This set's up a 2 different list of importable root repositories
15
+ # For Red Hat repositories or Custom Repositories in the metadata exclusively
16
+ # Set up a 2 different list of importable root repositories
31
17
  # creatable: repos that are part of the metadata but not in the library.
32
18
  # They are ready to be created
33
19
  # updatable: repo that are both in the metadata and library.
34
20
  # These may contain updates to the repo and hence ready to be updated.
35
- metadata_map = Import.metadata_map(metadata, custom_only: !redhat, redhat_only: redhat)
36
- metadata_map.keys.each do |product_label, repo_label|
37
- product = Katello::Product.in_org(organization).find_by(label: product_label)
38
- fail _("Unable to find product '%s' in organization '%s'" % [product_label, organization.name]) if product.blank?
39
- params = metadata_map[[product_label, repo_label]]
40
- if params[:gpg_key].blank?
41
- params[:gpg_key_id] = nil
42
- else
43
- params[:gpg_key_id] = organization.gpg_keys.find_by(name: params[:gpg_key][:name]).id
21
+ @metadata_repositories.each do |repo|
22
+ product = product_for_metadata_repo(repo)
23
+ fail _("Unable to find product '%s' in organization '%s'" % [repo.product.label, @organization.name]) if product.blank?
24
+
25
+ root = product.root_repositories.find do |r|
26
+ if repo.content&.id && repo.redhat
27
+ r.content.cp_content_id == repo.content.id &&
28
+ r.arch == repo.arch &&
29
+ r.major == repo.major &&
30
+ r.minor == repo.minor
31
+ else
32
+ r.label == repo.label
33
+ end
44
34
  end
45
- content = params[:content]
46
- params = params.except(:redhat, :product, :gpg_key, :content)
47
- if repositories_in_library.include? [product_label, repo_label]
48
- repo = ::Katello::RootRepository.find_by(product: product, label: repo_label)
49
- updatable << { repository: repo, options: params.except(:label, :name, :content_type) }
50
- elsif redhat
51
- product_content = product_content_by_label(content[:label])
35
+
36
+ if root
37
+ updatable << { repository: root, options: update_repo_params(repo) }
38
+ elsif repo.redhat
39
+ product_content = fetch_product_content(repo.content, product)
52
40
  substitutions = {
53
- basearch: params[:arch],
54
- releasever: params[:minor]
41
+ basearch: repo.arch,
42
+ releasever: repo.minor
55
43
  }
56
44
  creatable << { product: product, content: product_content, substitutions: substitutions }
57
45
  else
58
- creatable << { repository: product.add_repo(params) }
46
+ creatable << { repository: product.add_repo(create_repo_params(repo)) }
59
47
  end
60
48
  end
61
49
  end
50
+
51
+ private
52
+
53
+ def product_for_metadata_repo(repo)
54
+ if repo.redhat && repo.product.cp_id
55
+ @organization.products.includes(:root_repositories).find_by(cp_id: repo.product.cp_id)
56
+ else
57
+ @organization.products.includes(:root_repositories).find_by(label: repo.product.label)
58
+ end
59
+ end
60
+
61
+ def fetch_product_content(content_metadata, product)
62
+ query = ::Katello::Content.joins(:product_contents).where("#{Katello::ProductContent.table_name}.product_id": product.id)
63
+ table_name = Katello::Content.table_name
64
+ if content_metadata&.id
65
+ query.find_by("#{table_name}.cp_content_id": content_metadata.id)
66
+ else
67
+ query.find_by("#{table_name}.label": content_metadata.label)
68
+ end
69
+ end
70
+
71
+ def gpg_key_id(metadata_repo)
72
+ if metadata_repo.gpg_key
73
+ @organization.gpg_keys.find_by(name: metadata_repo.gpg_key.name).id
74
+ end
75
+ end
76
+
77
+ def create_repo_params(metadata_repo)
78
+ keys = [
79
+ :name,
80
+ :label,
81
+ :description,
82
+ :arch,
83
+ :unprotected,
84
+ :content_type,
85
+ :checksum_type,
86
+ :os_versions,
87
+ :major,
88
+ :minor,
89
+ :download_policy,
90
+ :mirroring_policy
91
+ ]
92
+
93
+ params = {}
94
+ params[:gpg_key_id] = gpg_key_id(metadata_repo)
95
+
96
+ keys.each do |key|
97
+ params[key] = metadata_repo.send(key)
98
+ end
99
+
100
+ params
101
+ end
102
+
103
+ def update_repo_params(metadata_repo)
104
+ keys = [
105
+ :description,
106
+ :arch,
107
+ :unprotected,
108
+ :checksum_type,
109
+ :os_versions,
110
+ :major,
111
+ :minor,
112
+ :download_policy,
113
+ :mirroring_policy
114
+ ]
115
+
116
+ params = {}
117
+ params[:gpg_key_id] = gpg_key_id(metadata_repo)
118
+
119
+ keys.each do |key|
120
+ value = metadata_repo.send(key)
121
+ params[key] = value if value
122
+ end
123
+
124
+ params
125
+ end
62
126
  end
63
127
  end
64
128
  end
@@ -17,7 +17,7 @@ module Katello
17
17
  def generate!
18
18
  ret = { organization: organization.name,
19
19
  repositories: {},
20
- content_view: content_view.slice(:name, :label, :description),
20
+ content_view: content_view.slice(:name, :label, :description, :generated_for),
21
21
  content_view_version: content_view_version.slice(:major, :minor, :description),
22
22
  incremental: from_content_view_version.present?
23
23
  }
@@ -51,7 +51,7 @@ module Katello
51
51
  end
52
52
 
53
53
  def generate_product_metadata(product)
54
- product.slice(:name, :label, :description).
54
+ product.slice(:name, :label, :description, :cp_id).
55
55
  merge(gpg_key: generate_gpg_metadata(product.gpg_key),
56
56
  redhat: product.redhat?)
57
57
  end
@@ -0,0 +1,117 @@
1
+ module Katello
2
+ module Pulp3
3
+ module ContentViewVersion
4
+ class MetadataMap
5
+ class MetadataContentView < OpenStruct; end
6
+
7
+ class MetadataContentViewVersion < OpenStruct; end
8
+
9
+ class MetadataProduct < OpenStruct; end
10
+
11
+ class MetadataRepository < OpenStruct; end
12
+
13
+ class MetadataGpgKey < OpenStruct; end
14
+
15
+ class MetadataRepositoryContent < OpenStruct; end
16
+
17
+ attr_reader :toc,
18
+ :products,
19
+ :repositories,
20
+ :gpg_keys,
21
+ :content_view,
22
+ :content_view_version,
23
+ :from_content_view_version
24
+
25
+ def initialize(metadata:)
26
+ @toc = metadata[:toc]
27
+ @gpg_keys = parse_gpg_keys(metadata[:gpg_keys]) if metadata[:gpg_keys]
28
+ @products = parse_products(metadata[:products]) if metadata[:products]
29
+ @repositories = parse_repositories(metadata[:repositories]) if metadata[:repositories]
30
+ @content_view = parse_content_view(metadata[:content_view]) if metadata[:content_view]
31
+ @content_view_version = parse_content_view_version(metadata[:content_view_version]) if metadata[:content_view_version]
32
+ @from_content_view_version = parse_content_view_version(metadata[:from_content_view_version]) if metadata[:from_content_view_version]
33
+ end
34
+
35
+ private
36
+
37
+ def parse_gpg_keys(gpg_keys)
38
+ gpg_keys.values.map do |g|
39
+ MetadataGpgKey.new(
40
+ name: g[:name],
41
+ content_type: g[:content_type],
42
+ content: g[:content]
43
+ )
44
+ end
45
+ end
46
+
47
+ def parse_content_view(content_view)
48
+ MetadataContentView.new(
49
+ name: content_view['name'],
50
+ label: content_view['label'],
51
+ description: content_view['description'],
52
+ generated_for: content_view['generated_for']
53
+ )
54
+ end
55
+
56
+ def parse_products(products)
57
+ products.values.map do |p|
58
+ MetadataProduct.new(
59
+ name: p[:name],
60
+ label: p[:label],
61
+ cp_id: p[:cp_id],
62
+ description: p[:description],
63
+ gpg_key: gpg_key_for_product(p),
64
+ redhat: ::Foreman::Cast.to_bool(p[:redhat])
65
+ )
66
+ end
67
+ end
68
+
69
+ def parse_content_view_version(version)
70
+ MetadataContentViewVersion.new(
71
+ major: version[:major],
72
+ minor: version[:minor],
73
+ description: version[:description]
74
+ )
75
+ end
76
+
77
+ def parse_repositories(repositories)
78
+ repositories.map do |pulp_name, repo|
79
+ MetadataRepository.new(
80
+ pulp_name: pulp_name,
81
+ name: repo[:name],
82
+ label: repo[:label],
83
+ description: repo[:description],
84
+ arch: repo[:arch],
85
+ content_type: repo[:content_type],
86
+ unprotected: repo[:unprotected],
87
+ checksum_type: repo[:checksum_type],
88
+ os_versions: repo[:os_versions],
89
+ major: repo[:major],
90
+ minor: repo[:minor],
91
+ download_policy: repo[:download_policy],
92
+ mirroring_policy: repo[:mirroring_policy],
93
+ redhat: repo[:redhat],
94
+ product: product_for_repo(repo),
95
+ gpg_key: gpg_key_for_repo(repo),
96
+ content: repo[:content] ? MetadataRepositoryContent.new(id: repo[:content][:id], label: repo[:content][:label]) : nil
97
+ )
98
+ rescue => e
99
+ raise _("Invalid repository in the metadata %{repo} error=%{error}") % { repo: repo, error: e.message }
100
+ end
101
+ end
102
+
103
+ def gpg_key_for_repo(repo)
104
+ @gpg_keys.find { |g| g.name == repo[:gpg_key][:name] } if repo[:gpg_key].present?
105
+ end
106
+
107
+ def gpg_key_for_product(product)
108
+ @gpg_keys.find { |g| g.name == product[:gpg_key][:name] } if product[:gpg_key].present?
109
+ end
110
+
111
+ def product_for_repo(repo)
112
+ @products.find { |p| p.label == repo[:product][:label] }
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -128,9 +128,14 @@ module Katello
128
128
 
129
129
  def self.find_duplicate_unit(repository, unit_type_id, file, checksum)
130
130
  filter_label = :sha256
131
+ path_label = :relative_path
131
132
  if unit_type_id == 'ostree_ref'
132
133
  filter_label = :checksum
133
134
  end
135
+ if unit_type_id == 'rpm'
136
+ filter_label = :pkg_id
137
+ path_label = :location_href
138
+ end
134
139
  content_backend_service = SmartProxy.pulp_primary.content_service(unit_type_id)
135
140
  duplicates_allowed = ::Katello::RepositoryTypeManager.find_content_type(unit_type_id).try(:duplicates_allowed)
136
141
  if repository.generic? && duplicates_allowed
@@ -144,7 +149,7 @@ module Katello
144
149
  else
145
150
  duplicate_sha_path_content_list = content_backend_service.content_api.list(
146
151
  filter_label => checksum,
147
- "relative_path": file[:filename])
152
+ path_label => file[:filename])
148
153
  end
149
154
  duplicate_sha_path_content_list
150
155
  end