katello 4.4.2.2 → 4.5.0.rc1

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

Potentially problematic release.


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

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