katello 4.4.0.2 → 4.5.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/activation_key_edit.js +9 -2
  3. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +3 -0
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  5. data/app/controllers/katello/api/v2/alternate_content_sources_bulk_actions_controller.rb +44 -0
  6. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +121 -0
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  9. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  10. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  11. data/app/controllers/katello/api/v2/content_view_repositories_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  14. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/errata_controller.rb +3 -1
  16. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  17. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  18. data/app/controllers/katello/api/v2/module_streams_controller.rb +3 -1
  19. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  20. data/app/controllers/katello/api/v2/package_groups_controller.rb +3 -1
  21. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  22. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  23. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  24. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  25. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  26. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  27. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  28. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  29. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  30. data/app/lib/actions/katello/alternate_content_source/refresh.rb +27 -0
  31. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  32. data/app/lib/actions/katello/cdn_configuration/update.rb +3 -3
  33. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  34. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  35. data/app/lib/actions/katello/content_view/publish.rb +8 -10
  36. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  37. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  38. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  39. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  40. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  41. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  42. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  43. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  44. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  45. data/app/lib/actions/katello/product/content_create.rb +10 -8
  46. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  47. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  48. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  49. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  50. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  51. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  52. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +23 -0
  53. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  54. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  55. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  56. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  57. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  58. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +16 -0
  59. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  60. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +15 -0
  61. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +16 -0
  62. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  63. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  64. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  65. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +1 -4
  66. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -1
  67. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +0 -2
  68. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  69. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  70. data/app/lib/katello/util/errata.rb +2 -3
  71. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  72. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  73. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  74. data/app/models/katello/alternate_content_source.rb +71 -0
  75. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  76. data/app/models/katello/authorization/repository.rb +3 -3
  77. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  78. data/app/models/katello/cdn_configuration.rb +15 -15
  79. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  80. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  81. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  82. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  83. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  84. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  85. data/app/models/katello/content.rb +1 -0
  86. data/app/models/katello/content_credential.rb +6 -0
  87. data/app/models/katello/content_override.rb +7 -3
  88. data/app/models/katello/content_view.rb +33 -2
  89. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  90. data/app/models/katello/content_view_filter.rb +4 -0
  91. data/app/models/katello/content_view_version.rb +12 -0
  92. data/app/models/katello/content_view_version_export_history.rb +3 -1
  93. data/app/models/katello/erratum.rb +9 -5
  94. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  95. data/app/models/katello/host/content_facet.rb +14 -0
  96. data/app/models/katello/host_available_module_stream.rb +12 -0
  97. data/app/models/katello/product_content.rb +1 -0
  98. data/app/models/katello/purpose_sla_status.rb +1 -1
  99. data/app/models/katello/purpose_status.rb +2 -2
  100. data/app/models/katello/repository.rb +7 -4
  101. data/app/models/katello/root_repository.rb +1 -1
  102. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  103. data/app/models/katello/sync_plan.rb +1 -1
  104. data/app/presenters/katello/product_content_presenter.rb +15 -0
  105. data/app/services/katello/applicable_host_queue.rb +1 -1
  106. data/app/services/katello/product_content_finder.rb +12 -2
  107. data/app/services/katello/pulp3/alternate_content_source.rb +123 -0
  108. data/app/services/katello/pulp3/api/file.rb +8 -0
  109. data/app/services/katello/pulp3/api/yum.rb +8 -0
  110. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  111. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  112. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  113. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  114. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  115. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  116. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  117. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  118. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  119. data/app/services/katello/pulp3/erratum.rb +1 -1
  120. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  121. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  122. data/app/services/katello/pulp3/repository.rb +35 -63
  123. data/app/services/katello/pulp3/service_common.rb +66 -0
  124. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  125. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  126. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  127. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  128. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  129. data/app/views/foreman/job_templates/install_group.erb +4 -4
  130. data/app/views/foreman/job_templates/install_package.erb +4 -4
  131. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  132. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  133. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  134. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  135. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  136. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  137. data/app/views/foreman/job_templates/update_group.erb +4 -4
  138. data/app/views/foreman/job_templates/update_package.erb +4 -4
  139. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  140. data/app/views/foreman/smart_proxies/show.html.erb +2 -0
  141. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +24 -0
  142. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  143. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  144. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  145. data/app/views/katello/api/v2/content_facet/show.json.rabl +12 -0
  146. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  147. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  148. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  149. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  150. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  151. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  152. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  153. data/app/views/katello/api/v2/module_streams/show.json.rabl +0 -7
  154. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  155. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  156. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  157. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  158. data/config/routes/api/v2.rb +19 -0
  159. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  160. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  161. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  162. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  163. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  164. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +1 -1
  165. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  166. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  167. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  168. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  169. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  170. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  171. data/db/migrate/20220303160220_remove_duplicate_errata.rb +37 -2
  172. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  173. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  174. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  175. data/db/migrate/20220428203334_add_last_refreshed_to_katello_alternate_content_sources.rb +5 -0
  176. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  177. data/db/seeds.d/150-module_job_templates.rb +1 -1
  178. data/engines/bastion/README.md +1 -0
  179. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  180. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +11 -6
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +1 -1
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  209. data/lib/katello/engine.rb +1 -5
  210. data/lib/katello/permission_creator.rb +34 -4
  211. data/lib/katello/plugin.rb +377 -3
  212. data/lib/katello/tasks/refresh_alternate_content_sources.rake +10 -0
  213. data/lib/katello/tasks/reset.rake.bak +67 -0
  214. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  215. data/lib/katello/version.rb +1 -1
  216. data/locale/action_names.rb +47 -41
  217. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/bn/katello.po +820 -106
  219. data/locale/bn/katello.po.time_stamp +0 -0
  220. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/cs/katello.po +818 -104
  222. data/locale/cs/katello.po.time_stamp +0 -0
  223. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/de/katello.po +893 -179
  225. data/locale/de/katello.po.time_stamp +0 -0
  226. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  227. data/locale/en/katello.po +817 -103
  228. data/locale/en/katello.po.time_stamp +0 -0
  229. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  230. data/locale/es/katello.po +882 -168
  231. data/locale/es/katello.po.time_stamp +0 -0
  232. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  233. data/locale/fr/katello.po +1219 -505
  234. data/locale/fr/katello.po.time_stamp +0 -0
  235. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  236. data/locale/gu/katello.po +826 -112
  237. data/locale/gu/katello.po.time_stamp +0 -0
  238. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  239. data/locale/hi/katello.po +826 -112
  240. data/locale/hi/katello.po.time_stamp +0 -0
  241. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/it/katello.po +863 -148
  243. data/locale/it/katello.po.time_stamp +0 -0
  244. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  245. data/locale/ja/katello.po +1216 -499
  246. data/locale/ja/katello.po.time_stamp +0 -0
  247. data/locale/katello.pot +3847 -2507
  248. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/kn/katello.po +826 -112
  250. data/locale/kn/katello.po.time_stamp +0 -0
  251. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ko/katello.po +912 -198
  253. data/locale/ko/katello.po.time_stamp +0 -0
  254. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/mr/katello.po +826 -112
  256. data/locale/mr/katello.po.time_stamp +0 -0
  257. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/or/katello.po +826 -112
  259. data/locale/or/katello.po.time_stamp +0 -0
  260. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/pa/katello.po +826 -112
  262. data/locale/pa/katello.po.time_stamp +0 -0
  263. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  264. data/locale/pt/katello.po +817 -103
  265. data/locale/pt/katello.po.time_stamp +0 -0
  266. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/pt_BR/katello.po +879 -165
  268. data/locale/pt_BR/katello.po.time_stamp +0 -0
  269. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  270. data/locale/ru/katello.po +927 -213
  271. data/locale/ru/katello.po.time_stamp +0 -0
  272. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  273. data/locale/ta/katello.po +820 -106
  274. data/locale/ta/katello.po.time_stamp +0 -0
  275. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  276. data/locale/te/katello.po +826 -112
  277. data/locale/te/katello.po.time_stamp +0 -0
  278. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  279. data/locale/zh_CN/katello.po +1202 -486
  280. data/locale/zh_CN/katello.po.time_stamp +0 -0
  281. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  282. data/locale/zh_TW/katello.po +856 -142
  283. data/locale/zh_TW/katello.po.time_stamp +0 -0
  284. data/webpack/components/Bookmark/index.js +22 -14
  285. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  286. data/webpack/components/Errata/index.js +38 -8
  287. data/webpack/components/Packages/index.js +1 -4
  288. data/webpack/components/Search/Search.js +22 -3
  289. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  290. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  291. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  292. data/webpack/components/Table/MainTable.js +29 -4
  293. data/webpack/components/Table/MainTable.scss +5 -1
  294. data/webpack/components/Table/TableHooks.js +65 -20
  295. data/webpack/components/Table/TableWrapper.js +9 -3
  296. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  297. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  298. data/webpack/components/TypeAhead/TypeAhead.js +12 -0
  299. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  300. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +7 -2
  301. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  302. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +250 -0
  303. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +232 -0
  304. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  305. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  306. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  307. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  308. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  309. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  310. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  311. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  312. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  313. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +206 -0
  314. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  315. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  316. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  317. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  318. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +118 -0
  319. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  320. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  321. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  322. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  323. data/webpack/components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions.js +37 -0
  324. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  325. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  326. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +11 -0
  327. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  328. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -0
  329. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +6 -1
  330. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +176 -72
  331. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  332. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  333. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  334. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +522 -118
  335. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  336. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +6 -4
  337. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +164 -58
  338. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +59 -49
  339. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  340. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +85 -0
  341. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  342. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  343. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +298 -107
  344. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +14 -7
  345. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/HostTracesActions.js +2 -1
  346. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +104 -0
  347. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +134 -57
  348. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +37 -32
  349. data/webpack/components/extensions/HostDetails/Tabs/{ModuleStreamsTab/__tests__/modules.fixtures.json → __tests__/moduleStreams.fixtures.json} +6 -3
  350. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +261 -0
  351. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +21 -15
  352. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +44 -1
  353. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +4 -1
  354. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +105 -6
  355. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -6
  356. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  357. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +18 -0
  358. data/webpack/containers/Application/config.js +5 -0
  359. data/webpack/global_index.js +32 -9
  360. data/webpack/global_test_setup.js +13 -0
  361. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  362. data/webpack/redux/actions/RedHatRepositories/helpers.js +13 -8
  363. data/webpack/scenes/AlternateContentSources/ACSActions.js +65 -0
  364. data/webpack/scenes/AlternateContentSources/ACSConstants.js +18 -0
  365. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  366. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +24 -0
  367. data/webpack/scenes/AlternateContentSources/Create/ACSCreateContext.js +4 -0
  368. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +160 -0
  369. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +79 -0
  370. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +199 -0
  371. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +104 -0
  372. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +41 -0
  373. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +71 -0
  374. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +57 -0
  375. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +77 -0
  376. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +149 -0
  377. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateData.fixtures.json +3 -0
  378. data/webpack/scenes/AlternateContentSources/Create/__tests__/contentCredentials.fixtures.json +69 -0
  379. data/webpack/scenes/AlternateContentSources/Create/__tests__/smartProxy.fixtures.json +65 -0
  380. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +162 -0
  381. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  382. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  383. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  384. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  385. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  386. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +4 -1
  387. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  388. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  389. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  390. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  391. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  392. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  393. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  394. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  395. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  396. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  397. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  398. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  399. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  400. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  401. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  402. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  403. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  404. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  405. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  406. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  407. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  408. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  409. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  410. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  411. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  412. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  413. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  414. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  415. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  416. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  417. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  418. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  419. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  420. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  421. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  422. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  440. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  441. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  442. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  443. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  444. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  453. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  454. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  455. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  456. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  457. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  458. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  459. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  460. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  461. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  462. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  463. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  464. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -6
  465. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  466. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  467. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  468. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  469. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  470. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  471. data/webpack/scenes/ContentViews/helpers.js +3 -0
  472. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  473. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +1 -10
  474. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +13 -14
  475. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +17 -100
  476. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  477. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  478. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  479. data/webpack/scenes/RedHatRepositories/components/Search.js +4 -4
  480. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +9 -2
  481. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -1
  482. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +10 -1
  483. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  484. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  485. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  486. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  487. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  488. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  489. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  490. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  491. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  492. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  493. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  494. data/webpack/scenes/Tasks/helpers.js +60 -5
  495. data/webpack/utils/helpers.js +2 -0
  496. metadata +186 -41
  497. data/app/models/setting/content.rb +0 -201
  498. data/db/seeds.d/107-enable_dynflow.rb +0 -8
  499. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  500. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +0 -108
  501. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerEmptyState.js +0 -42
  502. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -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,112 @@ 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
44
- 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])
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 { |r| r.label == repo.label }
26
+ if root
27
+ updatable << { repository: root, options: update_repo_params(repo) }
28
+ elsif repo.redhat
29
+ content = repo.content
30
+ product_content = product_content_by_label(content.label)
52
31
  substitutions = {
53
- basearch: params[:arch],
54
- releasever: params[:minor]
32
+ basearch: repo.arch,
33
+ releasever: repo.minor
55
34
  }
56
35
  creatable << { product: product, content: product_content, substitutions: substitutions }
57
36
  else
58
- creatable << { repository: product.add_repo(params) }
37
+ creatable << { repository: product.add_repo(create_repo_params(repo)) }
59
38
  end
60
39
  end
61
40
  end
41
+
42
+ private
43
+
44
+ def product_for_metadata_repo(repo)
45
+ if repo.redhat && repo.product.cp_id
46
+ @organization.products.includes(:root_repositories).find_by(cp_id: repo.product.cp_id)
47
+ else
48
+ @organization.products.includes(:root_repositories).find_by(label: repo.product.label)
49
+ end
50
+ end
51
+
52
+ def product_content_by_label(content_label)
53
+ ::Katello::Content.find_by_label(content_label)
54
+ end
55
+
56
+ def gpg_key_id(metadata_repo)
57
+ if metadata_repo.gpg_key
58
+ @organization.gpg_keys.find_by(name: metadata_repo.gpg_key.name).id
59
+ end
60
+ end
61
+
62
+ def create_repo_params(metadata_repo)
63
+ keys = [
64
+ :name,
65
+ :label,
66
+ :description,
67
+ :arch,
68
+ :unprotected,
69
+ :content_type,
70
+ :checksum_type,
71
+ :os_versions,
72
+ :major,
73
+ :minor,
74
+ :download_policy,
75
+ :mirroring_policy
76
+ ]
77
+
78
+ params = {}
79
+ params[:gpg_key_id] = gpg_key_id(metadata_repo)
80
+
81
+ keys.each do |key|
82
+ params[key] = metadata_repo.send(key)
83
+ end
84
+
85
+ params
86
+ end
87
+
88
+ def update_repo_params(metadata_repo)
89
+ keys = [
90
+ :description,
91
+ :arch,
92
+ :unprotected,
93
+ :checksum_type,
94
+ :os_versions,
95
+ :major,
96
+ :minor,
97
+ :download_policy,
98
+ :mirroring_policy
99
+ ]
100
+
101
+ params = {}
102
+ params[:gpg_key_id] = gpg_key_id(metadata_repo)
103
+
104
+ keys.each do |key|
105
+ value = metadata_repo.send(key)
106
+ params[key] = value if value
107
+ end
108
+
109
+ params
110
+ end
62
111
  end
63
112
  end
64
113
  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
@@ -119,7 +119,7 @@ module Katello
119
119
  date.to_i.to_s == date ? epoch_to_date(date) : date
120
120
  end
121
121
 
122
- def epoch_to_date(epoch)
122
+ def self.epoch_to_date(epoch)
123
123
  Time.at(epoch.to_i).to_s
124
124
  end
125
125
  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