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
@@ -19,6 +19,8 @@ module Katello
19
19
 
20
20
  has_many :content_facet_repositories, :class_name => "Katello::ContentFacetRepository", :dependent => :destroy, :inverse_of => :content_facet
21
21
  has_many :bound_repositories, :through => :content_facet_repositories, :class_name => "Katello::Repository", :source => :repository
22
+ has_many :bound_content, :through => :bound_repositories, :class_name => "Katello::Content", :source => :content
23
+ has_many :bound_root_repositories, :through => :bound_repositories, :class_name => "Katello::RootRepository", :source => :root
22
24
 
23
25
  has_many :content_facet_applicable_debs, :class_name => "Katello::ContentFacetApplicableDeb", :dependent => :delete_all, :inverse_of => :content_facet
24
26
  has_many :applicable_debs, :through => :content_facet_applicable_debs, :class_name => "Katello::Deb", :source => :deb
@@ -178,6 +180,18 @@ module Katello
178
180
  joins_installable_relation(Katello::Rpm, Katello::ContentFacetApplicableRpm)
179
181
  end
180
182
 
183
+ def self.joins_repositories
184
+ facet_repository = Katello::ContentFacetRepository.table_name
185
+ root_repository = Katello::RootRepository.table_name
186
+ repository = Katello::Repository.table_name
187
+
188
+ self.joins("INNER JOIN #{facet_repository} on #{facet_repository}.content_facet_id = #{table_name}.id",
189
+ "INNER JOIN #{repository} on #{repository}.id = #{facet_repository}.repository_id",
190
+ "INNER JOIN #{root_repository} on #{root_repository}.id = #{repository}.root_id",
191
+ "INNER JOIN #{Katello::Content.table_name} on #{Katello::Content.table_name}.cp_content_id = #{root_repository}.content_id").
192
+ where("#{facet_repository}.content_facet_id = #{self.table_name}.id")
193
+ end
194
+
181
195
  def content_view_version
182
196
  content_view.version(lifecycle_environment)
183
197
  end
@@ -27,6 +27,7 @@ module Katello
27
27
 
28
28
  scoped_search :on => :name, :relation => :available_module_stream, :complete_value => true
29
29
  scoped_search :on => :stream, :relation => :available_module_stream, :complete_value => false
30
+ scoped_search :on => :installed_profiles
30
31
  scoped_search :on => :status, :complete_value => STATUS
31
32
 
32
33
  def upgradable?
@@ -47,6 +48,17 @@ module Katello
47
48
  end
48
49
  end
49
50
 
51
+ def self.installed_status(status, host)
52
+ case status
53
+ when 'not installed'
54
+ where(installed_profiles: [])
55
+ when 'upgradable'
56
+ where(id: upgradable(host).pluck(:id))
57
+ when 'up to date'
58
+ where(status: 'enabled').where.not(installed_profiles: []).where.not(id: upgradable(host).pluck(:id))
59
+ end
60
+ end
61
+
50
62
  def self.upgradable(host)
51
63
  upgradable_module_name_streams = ModuleStream.installable_for_hosts([host]).select(:name, :stream)
52
64
 
@@ -16,6 +16,7 @@ module Katello
16
16
  }
17
17
 
18
18
  scoped_search :on => :name, :relation => :content
19
+ scoped_search :relation => :product, :on => :name, :rename => :product
19
20
  scoped_search :on => :content_type, :relation => :content, :complete_value => true
20
21
  scoped_search :on => :label, :relation => :content
21
22
  scoped_search :on => :content_url, :relation => :content, :rename => :path
@@ -2,7 +2,7 @@ module Katello
2
2
  class PurposeSlaStatus < HostStatus::Status
3
3
  UNKNOWN = Katello::PurposeStatus::UNKNOWN
4
4
  def self.status_name
5
- N_('Service Level')
5
+ N_('Service level')
6
6
  end
7
7
 
8
8
  def self.humanized_name
@@ -17,7 +17,7 @@ module Katello
17
17
  end
18
18
 
19
19
  def self.status_name
20
- N_('System Purpose')
20
+ N_('System purpose')
21
21
  end
22
22
 
23
23
  def self.humanized_name
@@ -31,7 +31,7 @@ module Katello
31
31
  when MISMATCHED
32
32
  N_('Mismatched')
33
33
  when NOT_SPECIFIED
34
- N_('Not Specified')
34
+ N_('Not specified')
35
35
  else
36
36
  N_('Unknown')
37
37
  end
@@ -307,7 +307,7 @@ module Katello
307
307
  end
308
308
 
309
309
  def immediate?
310
- root.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_IMMEDIATE
310
+ root.download_policy == ::Katello::RootRepository::DOWNLOAD_IMMEDIATE
311
311
  end
312
312
 
313
313
  def yum_gpg_key_url
@@ -338,7 +338,8 @@ module Katello
338
338
  end
339
339
 
340
340
  def published_in_versions
341
- Katello::ContentViewVersion.with_repositories(self.library_instances_inverse).distinct
341
+ Katello::ContentViewVersion.with_repositories(self.library_instances_inverse)
342
+ .where(content_view_id: Katello::ContentView.not_generated_for_repository).distinct
342
343
  end
343
344
 
344
345
  def self.errata_with_package_counts(repo)
@@ -664,7 +665,9 @@ module Katello
664
665
  end
665
666
 
666
667
  def self.smart_proxy_syncable
667
- where.not(:environment_id => nil)
668
+ joins(:content_view_version => :content_view).
669
+ merge(ContentView.not_generated_for_repository).
670
+ where.not(environment_id: nil)
668
671
  end
669
672
 
670
673
  def exist_for_environment?(environment, content_view, attribute = nil)
@@ -965,7 +968,7 @@ module Katello
965
968
  property :docker_upstream_name, String, desc: 'Returns name of the upstream docker repository'
966
969
  end
967
970
  class Jail < ::Safemode::Jail
968
- allow :name, :label, :docker_upstream_name
971
+ allow :name, :label, :docker_upstream_name, :content_counts
969
972
  end
970
973
  end
971
974
  end
@@ -63,7 +63,7 @@ module Katello
63
63
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
64
64
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
65
65
  validates_with Validators::KatelloUrlFormatValidator, :attributes => :url,
66
- :nil_allowed => proc { |repo| repo.custom? || repo.organization.cdn_configuration.airgapped? },
66
+ :nil_allowed => proc { |repo| repo.custom? || repo.organization.cdn_configuration.export_sync? },
67
67
  :field_name => :url
68
68
  validates_with Validators::RootRepositoryUniqueAttributeValidator, :attributes => :name
69
69
  validates_with Validators::RootRepositoryUniqueAttributeValidator, :attributes => :label
@@ -0,0 +1,8 @@
1
+ module Katello
2
+ class SmartProxyAlternateContentSource < Katello::Model
3
+ # Do not use active record callbacks in this join model. Direct INSERTs and DELETEs are done
4
+ self.table_name = :katello_smart_proxy_alternate_content_sources
5
+ belongs_to :smart_proxy, :inverse_of => :smart_proxy_alternate_content_sources, :class_name => 'SmartProxy'
6
+ belongs_to :alternate_content_source, :inverse_of => :smart_proxy_alternate_content_sources, :class_name => 'Katello::AlternateContentSource'
7
+ end
8
+ end
@@ -83,7 +83,7 @@ module Katello
83
83
  ::Katello::Util::Support.active_record_retry do
84
84
  self.save!
85
85
  end
86
- old_rec_logic.cancel
86
+ old_rec_logic.reload.cancel
87
87
  start_recurring_logic
88
88
  end
89
89
  toggle_enabled(params[:enabled]) if (params.key?(:enabled) && params[:enabled] != self.enabled?)
@@ -23,5 +23,20 @@ module Katello
23
23
  return [] if overrides.blank?
24
24
  overrides.select { |pc| pc.content_label == content.label }
25
25
  end
26
+
27
+ def status
28
+ overidden_value = enabled_content_override&.computed_value
29
+ if overidden_value.nil?
30
+ {
31
+ status: enabled ? "enabled" : "disabled",
32
+ overridden: false
33
+ }
34
+ else
35
+ {
36
+ status: overidden_value ? "enabled" : "disabled",
37
+ overridden: true
38
+ }
39
+ end
40
+ end
26
41
  end
27
42
  end
@@ -1,7 +1,7 @@
1
1
  module Katello
2
2
  class ApplicableHostQueue
3
3
  def self.batch_size
4
- ::Setting::Content.find_by(name: "applicability_batch_size").value
4
+ Setting["applicability_batch_size"]
5
5
  end
6
6
 
7
7
  def self.queue_depth
@@ -22,6 +22,7 @@ module Katello
22
22
  end
23
23
 
24
24
  def import_all(filtered_indexing = false)
25
+ additive = filtered_indexing || (@repository&.mirroring_policy == 'additive')
25
26
  association_tracker = RepoAssociationTracker.new(@content_type, @service_class, @repository)
26
27
  units_from_pulp.each do |units|
27
28
  units.each do |unit|
@@ -51,7 +52,7 @@ module Katello
51
52
  end
52
53
 
53
54
  if @model_class.many_repository_associations && @repository
54
- sync_repository_associations(association_tracker, additive: filtered_indexing)
55
+ sync_repository_associations(association_tracker, additive: additive)
55
56
  end
56
57
  end
57
58
 
@@ -30,8 +30,18 @@ module Katello
30
30
  consumable.organization.enabled_product_content_for(roots)
31
31
  end
32
32
 
33
- def self.wrap_with_overrides(product_contents:, overrides:)
34
- product_contents.map { |pc| ProductContentPresenter.new(pc, overrides) }
33
+ def self.wrap_with_overrides(product_contents:, overrides:, status: nil)
34
+ pc_with_overrides = product_contents.map { |pc| ProductContentPresenter.new(pc, overrides) }
35
+ if status
36
+ pc_with_overrides.keep_if do |pc|
37
+ if status == "overridden"
38
+ pc.status[:overridden]
39
+ else
40
+ pc.status[:status] == status
41
+ end
42
+ end
43
+ end
44
+ pc_with_overrides
35
45
  end
36
46
 
37
47
  def presenter_with_overrides(overrides)
@@ -0,0 +1,117 @@
1
+ require "pulpcore_client"
2
+ module Katello
3
+ module Pulp3
4
+ class AlternateContentSource
5
+ include Katello::Pulp3::ServiceCommon
6
+ attr_accessor :acs
7
+ attr_accessor :smart_proxy
8
+
9
+ def initialize(acs, smart_proxy)
10
+ @acs = acs
11
+ @smart_proxy = smart_proxy
12
+ end
13
+
14
+ def api
15
+ @api ||= ::Katello::Pulp3::Repository.api(smart_proxy, @acs.content_type)
16
+ end
17
+
18
+ def generate_backend_object_name
19
+ "#{acs.label}-#{smart_proxy.url}-#{rand(9999)}"
20
+ end
21
+
22
+ def smart_proxy_acs
23
+ ::Katello::SmartProxyAlternateContentSource.find_by(alternate_content_source_id: acs.id, smart_proxy_id: smart_proxy.id)
24
+ end
25
+
26
+ def remote_options
27
+ remote_options = {
28
+ tls_validation: acs.verify_ssl,
29
+ name: generate_backend_object_name,
30
+ url: acs.base_url,
31
+ policy: 'on_demand',
32
+ proxy_url: acs.http_proxy&.url,
33
+ proxy_username: acs.http_proxy&.username,
34
+ proxy_password: acs.http_proxy&.password,
35
+ total_timeout: Setting[:sync_connect_timeout]
36
+ }
37
+ if acs.content_type == ::Katello::Repository::FILE_TYPE && acs.subpaths.empty? && !remote_options[:url].end_with?('/PULP_MANIFEST')
38
+ remote_options[:url] = acs.base_url + '/PULP_MANIFEST'
39
+ end
40
+ remote_options.merge!(username: acs&.upstream_username, password: acs&.upstream_password)
41
+ remote_options.merge!(ssl_remote_options)
42
+ end
43
+
44
+ def ssl_remote_options
45
+ if acs.custom?
46
+ {
47
+ client_cert: acs.ssl_client_cert&.content,
48
+ client_key: acs.ssl_client_key&.content,
49
+ ca_cert: acs.ssl_ca_cert&.content
50
+ }
51
+ end
52
+ end
53
+
54
+ def create_remote
55
+ if smart_proxy_acs&.remote_href.nil?
56
+ response = super
57
+ smart_proxy_acs.update!(remote_href: response.pulp_href)
58
+ end
59
+ end
60
+
61
+ def get_remote(href = smart_proxy_acs.remote_href)
62
+ acs.base_url&.start_with?('uln') ? api.remotes_uln_api.read(href) : api.remotes_api.read(href)
63
+ end
64
+
65
+ def update_remote
66
+ api.remotes_api.partial_update(smart_proxy_acs.remote_href, remote_options)
67
+ end
68
+
69
+ def delete_remote(href = smart_proxy_acs.remote_href)
70
+ ignore_404_exception { remote_options[:url]&.start_with?('uln') ? api.remotes_uln_api.delete(href) : api.remotes_api.delete(href) } if href
71
+ end
72
+
73
+ def create
74
+ if smart_proxy_acs&.alternate_content_source_href.nil?
75
+ paths = acs.subpaths.deep_dup
76
+ if acs.content_type == ::Katello::Repository::FILE_TYPE && acs.subpaths.present?
77
+ paths = insert_pulp_manifest!(paths)
78
+ end
79
+ response = api.alternate_content_source_api.create(name: generate_backend_object_name, paths: paths,
80
+ remote: smart_proxy_acs.remote_href)
81
+ smart_proxy_acs.update!(alternate_content_source_href: response.pulp_href)
82
+ return response
83
+ end
84
+ end
85
+
86
+ def read(href = smart_proxy_acs.alternate_content_source_href)
87
+ api.alternate_content_source_api.read(href)
88
+ end
89
+
90
+ def update
91
+ href = smart_proxy_acs.alternate_content_source_href
92
+ paths = acs.subpaths.deep_dup
93
+ if acs.content_type == ::Katello::Repository::FILE_TYPE && acs.subpaths.present?
94
+ paths = insert_pulp_manifest!(paths)
95
+ end
96
+ api.alternate_content_source_api.update(href, name: generate_backend_object_name, paths: paths, remote: smart_proxy_acs.remote_href)
97
+ end
98
+
99
+ def delete_alternate_content_source
100
+ href = smart_proxy_acs.alternate_content_source_href
101
+ ignore_404_exception { api.alternate_content_source_api.delete(href) } if href
102
+ end
103
+
104
+ private
105
+
106
+ def insert_pulp_manifest!(subpaths)
107
+ subpaths.map! do |subpath|
108
+ if subpath.end_with?('/PULP_MANIFEST')
109
+ subpath
110
+ else
111
+ subpath + '/PULP_MANIFEST'
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -7,6 +7,14 @@ module Katello
7
7
  def self.add_remove_content_class
8
8
  PulpFileClient::RepositoryAddRemoveContent
9
9
  end
10
+
11
+ def self.alternate_content_source_class
12
+ PulpFileClient::FileFileAlternateContentSource
13
+ end
14
+
15
+ def alternate_content_source_api
16
+ PulpFileClient::AcsFileApi.new(api_client)
17
+ end
10
18
  end
11
19
  end
12
20
  end
@@ -20,6 +20,14 @@ module Katello
20
20
  PulpRpmClient::RepositoryAddRemoveContent
21
21
  end
22
22
 
23
+ def self.alternate_content_source_class
24
+ PulpRpmClient::RpmRpmAlternateContentSource
25
+ end
26
+
27
+ def alternate_content_source_api
28
+ PulpRpmClient::AcsRpmApi.new(api_client)
29
+ end
30
+
23
31
  def remotes_uln_api
24
32
  PulpRpmClient::RemotesUlnApi.new(api_client)
25
33
  end
@@ -46,7 +46,7 @@ module Katello
46
46
  end
47
47
 
48
48
  def create_exporter(export_base_dir: Setting['pulpcore_export_destination'])
49
- api.exporter_api.create(name: generate_id,
49
+ api.exporter_api.create(name: generate_id(content_view_version),
50
50
  path: "#{export_base_dir}/#{generate_exporter_path}",
51
51
  repositories: repository_hrefs)
52
52
  end
@@ -150,13 +150,35 @@ module Katello
150
150
  MetadataGenerator.new(export_service: self).generate!
151
151
  end
152
152
 
153
+ def self.find_generated_export_view(create_by_default: false,
154
+ destination_server:,
155
+ organization:,
156
+ name:,
157
+ generated_for:)
158
+ name += "-#{destination_server}" unless destination_server.blank?
159
+ select_method = create_by_default ? :first_or_create : :first
160
+ ::Katello::ContentView.where(name: name,
161
+ organization: organization,
162
+ generated_for: generated_for).send(select_method)
163
+ end
164
+
153
165
  def self.find_library_export_view(create_by_default: false,
154
166
  destination_server:,
155
167
  organization:)
156
- name = ::Katello::ContentView::EXPORT_LIBRARY
157
- name += "-#{destination_server}" unless destination_server.blank?
158
- select_method = create_by_default ? :first_or_create : :first
159
- ::Katello::ContentView.where(name: name, organization: organization).send(select_method)
168
+ find_generated_export_view(create_by_default: create_by_default,
169
+ destination_server: destination_server,
170
+ organization: organization,
171
+ name: ::Katello::ContentView::EXPORT_LIBRARY,
172
+ generated_for: :library_export)
173
+ end
174
+
175
+ def self.find_repository_export_view(create_by_default: false,
176
+ repository:)
177
+ find_generated_export_view(create_by_default: create_by_default,
178
+ destination_server: nil,
179
+ organization: repository.organization,
180
+ name: "Export-#{repository.label}-#{repository.library_instance_or_self.id}",
181
+ generated_for: :repository_export)
160
182
  end
161
183
 
162
184
  def self.generate_product_repo_strings(repositories:)
@@ -4,33 +4,23 @@ module Katello
4
4
  class Import
5
5
  include ImportExportCommon
6
6
 
7
- def initialize(smart_proxy:, content_view_version: nil, path: nil, metadata: nil)
7
+ attr_reader :content_view, :path, :metadata_map, :smart_proxy, :organization
8
+
9
+ def initialize(organization:, smart_proxy:, path:, metadata_map:)
10
+ @organization = organization
8
11
  @smart_proxy = smart_proxy
9
- @content_view_version = content_view_version
10
12
  @path = path
11
- @metadata = metadata
13
+ @metadata_map = metadata_map
14
+ @content_view = find_or_create_import_view
12
15
  end
13
16
 
14
- def repository_mapping
15
- mapping = {}
16
- @metadata[:repositories].each do |key, value|
17
- repo = @content_view_version.importable_repositories.joins(:root, :product).
18
- where("#{::Katello::Product.table_name}" => {:label => value[:product][:label]},
19
- "#{::Katello::RootRepository.table_name}" => {:label => value[:label]}).first
20
- next unless repo&.version_href
21
- repo_info = fetch_repository_info(repo.version_href)
22
- mapping[key] = repo_info.name
23
- end
24
- mapping
25
- end
26
-
27
- def create_importer
28
- api.importer_api.create(name: generate_id,
29
- repo_mapping: repository_mapping)
17
+ def create_importer(content_view_version)
18
+ api.importer_api.create(name: generate_id(content_view_version),
19
+ repo_mapping: repository_mapping(content_view_version))
30
20
  end
31
21
 
32
22
  def create_import(importer_href)
33
- [api.import_api.create(importer_href, toc: "#{@path}/#{@metadata[:toc]}")]
23
+ [api.import_api.create(importer_href, toc: "#{@path}/#{@metadata_map.toc}")]
34
24
  end
35
25
 
36
26
  def fetch_import(importer_href)
@@ -43,53 +33,29 @@ module Katello
43
33
  api.importer_api.delete(importer_href)
44
34
  end
45
35
 
46
- def self.check!(content_view:, metadata:, path:, smart_proxy:)
47
- ImportValidator.new(smart_proxy: smart_proxy,
48
- content_view: content_view,
49
- metadata: metadata,
50
- path: path).check!
51
- end
52
-
53
- def self.create_or_update_gpg!(organization:, params:)
54
- return if params.blank?
55
- gpg = organization.gpg_keys.find_by(:name => params[:name])
56
- if gpg
57
- gpg.update!(params.except(:name))
58
- else
59
- gpg = organization.gpg_keys.create!(params)
60
- end
61
- gpg
62
- end
63
-
64
- def self.metadata_map(metadata, product_only: false, custom_only: false, redhat_only: false)
65
- # Create a map that looks like -> {[product, repo]: {name: 'Foo Repo', label:.....}}
66
- # these values should be curated from the metadata.
67
- metadata_map = {}
68
- metadata[:repositories].values.each do |repo|
69
- next if (custom_only && repo[:redhat]) || (redhat_only && !repo[:redhat])
70
- if product_only
71
- metadata_map[repo[:product][:label]] = repo[:product]
72
- else
73
- metadata_map[[repo[:product][:label], repo[:label]]] = repo
74
- end
75
- end
76
- metadata_map
36
+ def check!
37
+ ImportValidator.new(import: self).check!
77
38
  end
78
39
 
79
- def self.intersecting_repos_library_and_metadata(organization:, metadata:)
40
+ def intersecting_repos_library_and_metadata
80
41
  # Returns repositories in library that are part of the metadata
81
42
  # In other words if metadata had repos {label:foo, product: bar}
82
43
  # this would match it to the repo with the label foo and product bar
83
44
  # in the library.
84
- queries = metadata_map(metadata).keys.map do |product_label, repo_label|
85
- repositories_in_library(organization).
86
- where("#{Katello::Product.table_name}.label": product_label,
87
- "#{Katello::RootRepository.table_name}.label": repo_label)
45
+
46
+ queries = metadata_map.repositories.map do |repo|
47
+ if repo.redhat && repo.product.cp_id
48
+ library_repositories.where("#{Katello::Product.table_name}.cp_id": repo.product.cp_id,
49
+ "#{Katello::RootRepository.table_name}.label": repo.label)
50
+ else
51
+ library_repositories.where("#{Katello::Product.table_name}.label": repo.product.label,
52
+ "#{Katello::RootRepository.table_name}.label": repo.label)
53
+ end
88
54
  end
89
55
  queries.inject(&:or)
90
56
  end
91
57
 
92
- def self.repositories_in_library(organization)
58
+ def library_repositories
93
59
  Katello::Repository.
94
60
  in_default_view.
95
61
  exportable.
@@ -98,7 +64,7 @@ module Katello
98
64
  where("#{::Katello::ContentView.table_name}.organization_id": organization)
99
65
  end
100
66
 
101
- def self.reset_content_view_repositories_from_metadata!(content_view:, metadata:)
67
+ def reset_content_view_repositories!
102
68
  # Given metadata from the dump and a content view
103
69
  # this method
104
70
  # 1) Fetches ids of the library repos whose product name, repo name amd redhat?
@@ -107,26 +73,86 @@ module Katello
107
73
  # 3) Adds the repositories matched from the dump
108
74
  # The main intent of this method is to assume that the user intends for the
109
75
  # content view to exaclty look like what is specified in metadata
110
- repo_ids = intersecting_repos_library_and_metadata(organization: content_view.organization,
111
- metadata: metadata).
112
- pluck("#{Katello::Repository.table_name}.id")
76
+ repo_ids = intersecting_repos_library_and_metadata.pluck("#{Katello::Repository.table_name}.id")
113
77
  content_view.update!(repository_ids: repo_ids)
114
78
  end
115
79
 
116
- def self.find_or_create_import_view(organization:, metadata:, library: false)
117
- if library
118
- metadata = { name: ::Katello::ContentView::IMPORT_LIBRARY,
119
- label: ::Katello::ContentView::IMPORT_LIBRARY,
120
- description: "Content View used for importing library"
121
- }
80
+ private
81
+
82
+ def repository_mapping(content_view_version)
83
+ mapping = {}
84
+ relation = content_view_version.importable_repositories.joins(:root, :product)
85
+
86
+ metadata_map.repositories.each do |metadata_repo|
87
+ if metadata_repo.redhat && metadata_repo.product.cp_id
88
+ repo = relation.where("#{::Katello::Product.table_name}" => {cp_id: metadata_repo.product.cp_id},
89
+ "#{::Katello::RootRepository.table_name}" => {label: metadata_repo.label}).first
90
+ else
91
+ repo = relation.where("#{::Katello::Product.table_name}" => {label: metadata_repo.product.label},
92
+ "#{::Katello::RootRepository.table_name}" => {label: metadata_repo.label}).first
93
+ end
94
+
95
+ next unless repo&.version_href
96
+ repo_info = fetch_repository_info(repo.version_href)
97
+ mapping[metadata_repo.pulp_name] = repo_info.name
98
+ end
99
+ mapping
100
+ end
101
+
102
+ def import_cv_name_from_export(name:, generated_for:)
103
+ if generated_for == :library_import
104
+ ::Katello::ContentView::IMPORT_LIBRARY
105
+ elsif generated_for == :repository_import
106
+ name.gsub(/^Export/, 'Import')
107
+ else
108
+ name
109
+ end
110
+ end
111
+
112
+ def import_content_view_params
113
+ generated_for = metadata_map.content_view.generated_for
114
+
115
+ if generated_for.blank?
116
+ generated_for = if metadata_map.content_view.label.start_with?(::Katello::ContentView::EXPORT_LIBRARY)
117
+ "library_export"
118
+ else
119
+ "none"
120
+ end
122
121
  end
123
122
 
124
- fail _("Content View label not provided.") if metadata[:label].blank?
123
+ generated_for = generated_for.to_sym
124
+
125
+ if generated_for == :none
126
+ return {
127
+ name: metadata_map.content_view.name,
128
+ label: metadata_map.content_view.label,
129
+ description: metadata_map.content_view.description,
130
+ generated_for: generated_for
131
+ }
132
+ end
133
+
134
+ if generated_for == :library_export
135
+ generated_for = :library_import
136
+ elsif generated_for == :repository_export
137
+ generated_for = :repository_import
138
+ end
139
+
140
+ {
141
+ name: import_cv_name_from_export(name: metadata_map.content_view.name, generated_for: generated_for),
142
+ label: import_cv_name_from_export(name: metadata_map.content_view.label, generated_for: generated_for),
143
+ description: "Content View used for importing into library",
144
+ generated_for: generated_for
145
+ }
146
+ end
147
+
148
+ def find_or_create_import_view
149
+ fail _("Content View label not provided.") if metadata_map.content_view.label.blank?
125
150
 
126
- cv = ::Katello::ContentView.find_by(label: metadata[:label],
151
+ params = import_content_view_params
152
+ cv = ::Katello::ContentView.find_by(label: params[:label],
127
153
  organization: organization)
128
154
  if cv.blank?
129
- ::Katello::ContentView.create!(metadata.merge(organization: organization, import_only: true))
155
+ ::Katello::ContentView.create!(params.merge(organization: organization, import_only: true))
130
156
  elsif !cv.import_only?
131
157
  msg = _("Unable to import in to Content View specified in the metadata - '%{name}'. "\
132
158
  "The 'import_only' attribute for the content view is set to false. "\
@@ -136,7 +162,7 @@ module Katello
136
162
  command = "foreman-rake katello:set_content_view_import_only ID=#{cv.id}"
137
163
  fail msg + "\n" + command
138
164
  else
139
- cv.update!(description: cv_metadata[:description]) if cv.description != metadata[:description]
165
+ cv.update!(description: params[:description]) if cv.description != params[:description]
140
166
  cv
141
167
  end
142
168
  end