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
@@ -0,0 +1,33 @@
1
+ module Katello
2
+ module Authorization::AlternateContentSource
3
+ extend ActiveSupport::Concern
4
+
5
+ include Authorizable
6
+
7
+ def readable?
8
+ authorized?(:view_alternate_content_sources)
9
+ end
10
+
11
+ def editable?
12
+ authorized?(:edit_alternate_content_sources)
13
+ end
14
+
15
+ def deletable?
16
+ authorized?(:destroy_alternate_content_sources)
17
+ end
18
+
19
+ module ClassMethods
20
+ def readable
21
+ authorized(:view_alternate_content_sources)
22
+ end
23
+
24
+ def editable
25
+ authorized(:edit_alternate_content_sources)
26
+ end
27
+
28
+ def deletable
29
+ authorized(:destroy_alternate_content_sources)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -4,12 +4,12 @@ module Katello
4
4
 
5
5
  delegate :editable?, to: :product
6
6
 
7
- def deletable?(remove_from_content_view_versions = false)
8
- product.editable? && (remove_from_content_view_versions || !promoted?)
7
+ def deletable?(remove_from_content_view_versions = true)
8
+ product.editable? && (remove_from_content_view_versions || !promoted? || !self.content_views.generated_for_none.exists?)
9
9
  end
10
10
 
11
11
  def redhat_deletable?(remove_from_content_view_versions = false)
12
- (remove_from_content_view_versions || !self.promoted?) && self.product.editable?
12
+ (remove_from_content_view_versions || !self.promoted? || !self.content_views.generated_for_none.exists?) && self.product.editable?
13
13
  end
14
14
 
15
15
  def readable?
@@ -10,10 +10,17 @@ module Katello
10
10
  end
11
11
 
12
12
  def find_repository
13
- root = ::Katello::RootRepository.where(product_id: product.id,
14
- content_id: content.cp_content_id,
15
- minor: minor,
16
- arch: arch).first
13
+ if substitutions[:basearch]
14
+ root = ::Katello::RootRepository.where(product_id: product.id,
15
+ content_id: content.cp_content_id,
16
+ minor: minor,
17
+ arch: arch).first
18
+ else
19
+ root = ::Katello::RootRepository.where(product_id: product.id,
20
+ content_id: content.cp_content_id,
21
+ minor: minor).first
22
+ end
23
+
17
24
  if root
18
25
  Katello::Repository.where(root: root,
19
26
  environment_id: product.organization.library.id).first
@@ -44,7 +51,7 @@ module Katello
44
51
  end
45
52
 
46
53
  def validate!
47
- return if katello_content_type == Repository::OSTREE_TYPE || product.organization.cdn_configuration.airgapped?
54
+ return if katello_content_type == Repository::OSTREE_TYPE || product.organization.cdn_configuration.export_sync?
48
55
  substitutor.validate_substitutions(content, substitutions)
49
56
  end
50
57
 
@@ -74,7 +81,7 @@ module Katello
74
81
  end
75
82
 
76
83
  def feed_url
77
- return if product.organization.cdn_configuration.airgapped?
84
+ return if product.organization.cdn_configuration.export_sync?
78
85
  @feed_url ||= if product.cdn_resource&.respond_to?(:repository_url)
79
86
  product.cdn_resource.repository_url(content_label: content.label, arch: arch, major: version[:major], minor: version[:minor])
80
87
  else
@@ -3,24 +3,24 @@ module Katello
3
3
  include Encryptable
4
4
  self.inheritance_column = nil
5
5
  CDN_TYPE = 'redhat_cdn'.freeze
6
- UPSTREAM_SERVER_TYPE = 'upstream_server'.freeze
7
- AIRGAPPED_TYPE = 'airgapped'.freeze
6
+ NETWORK_SYNC = 'network_sync'.freeze
7
+ EXPORT_SYNC = 'export_sync'.freeze
8
8
 
9
- TYPES = [CDN_TYPE, UPSTREAM_SERVER_TYPE, AIRGAPPED_TYPE].freeze
9
+ TYPES = [CDN_TYPE, NETWORK_SYNC, EXPORT_SYNC].freeze
10
10
 
11
11
  belongs_to :organization, :inverse_of => :cdn_configuration
12
12
 
13
13
  belongs_to :ssl_ca_credential, :class_name => "Katello::ContentCredential", :inverse_of => :ssl_ca_cdn_configurations
14
14
 
15
15
  encrypts :password
16
- validates :password, presence: true, if: :upstream_server?
17
- validates :username, presence: true, if: :upstream_server?
18
- validates :upstream_organization_label, presence: true, if: :upstream_server?
16
+ validates :password, presence: true, if: :network_sync?
17
+ validates :username, presence: true, if: :network_sync?
18
+ validates :upstream_organization_label, presence: true, if: :network_sync?
19
19
 
20
- validates :url, presence: true, unless: :airgapped?
21
- validates_with Validators::KatelloUrlFormatValidator, attributes: :url, unless: :airgapped?
20
+ validates :url, presence: true, unless: :export_sync?
21
+ validates_with Validators::KatelloUrlFormatValidator, attributes: :url, unless: :export_sync?
22
22
  validates_with Validators::KatelloLabelFormatValidator, attributes: :upstream_organization_label, if: proc { upstream_organization_label.present? }
23
- validate :non_redhat_configuration, if: :upstream_server?
23
+ validate :non_redhat_configuration, if: :network_sync?
24
24
 
25
25
  before_validation :reset_fields
26
26
 
@@ -32,20 +32,20 @@ module Katello
32
32
  type == CDN_TYPE
33
33
  end
34
34
 
35
- def airgapped?
36
- type == AIRGAPPED_TYPE
35
+ def export_sync?
36
+ type == EXPORT_SYNC
37
37
  end
38
38
 
39
- def upstream_server?
40
- type == UPSTREAM_SERVER_TYPE
39
+ def network_sync?
40
+ type == NETWORK_SYNC
41
41
  end
42
42
 
43
43
  private
44
44
 
45
45
  def reset_fields
46
- return if upstream_server?
46
+ return if network_sync?
47
47
 
48
- self.url = nil if airgapped?
48
+ self.url = nil if export_sync?
49
49
  self.url ||= SETTINGS[:katello][:redhat_repository_url] if redhat_cdn?
50
50
  self.username = nil
51
51
  self.password = nil
@@ -33,6 +33,9 @@ module Katello
33
33
  has_many :applicable_debs, :through => :content_facet
34
34
  has_many :applicable_rpms, :through => :content_facet
35
35
  has_many :applicable_module_streams, :through => :content_facet
36
+ has_many :bound_repositories, :through => :content_facet
37
+ has_many :bound_root_repositories, :through => :content_facet
38
+ has_many :bound_content, :through => :content_facet
36
39
 
37
40
  scoped_search :relation => :content_view, :on => :name, :complete_value => true, :rename => :content_view
38
41
  scoped_search :relation => :content_facet, :on => :content_view_id, :rename => :content_view_id, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
@@ -46,6 +49,8 @@ module Katello
46
49
  scoped_search :relation => :applicable_rpms, :on => :nvra, :rename => :applicable_rpms, :complete_value => true, :ext_method => :find_by_applicable_rpms, :only_explicit => true
47
50
  scoped_search :relation => :applicable_rpms, :on => :nvra, :rename => :upgradable_rpms, :complete_value => true, :ext_method => :find_by_installable_rpms, :only_explicit => true
48
51
  scoped_search :relation => :content_source, :on => :name, :complete_value => true, :rename => :content_source
52
+ scoped_search :relation => :bound_root_repositories, :on => :name, :rename => :repository, :complete_value => true, :ext_method => :find_by_repository_name, :only_explicit => true
53
+ scoped_search :relation => :bound_content, :on => :label, :rename => :repository_content_label, :complete_value => true, :ext_method => :find_by_repository_content_label, :only_explicit => true
49
54
 
50
55
  # preserve options set by facets framework, but add new :reject_if statement
51
56
  accepts_nested_attributes_for(
@@ -129,6 +134,26 @@ module Katello
129
134
  end
130
135
  end
131
136
 
137
+ def find_by_repository_content_label(_key, operator, value)
138
+ conditions = sanitize_sql_for_conditions(["#{Katello::Content.table_name}.label #{operator} ?", value_to_sql(operator, value)])
139
+ facets = Katello::Host::ContentFacet.joins_repositories.where(conditions)
140
+ if facets.empty?
141
+ { :conditions => "1=0" }
142
+ else
143
+ { :conditions => "#{::Host::Managed.table_name}.id IN (#{facets.pluck(:host_id).join(',')})" }
144
+ end
145
+ end
146
+
147
+ def find_by_repository_name(_key, operator, value)
148
+ conditions = sanitize_sql_for_conditions(["#{Katello::RootRepository.table_name}.name #{operator} ?", value_to_sql(operator, value)])
149
+ facets = Katello::Host::ContentFacet.joins_repositories.where(conditions)
150
+ if facets.empty?
151
+ { :conditions => "1=0" }
152
+ else
153
+ { :conditions => "#{::Host::Managed.table_name}.id IN (#{facets.pluck(:host_id).join(',')})" }
154
+ end
155
+ end
156
+
132
157
  def in_content_view_environment(content_view: nil, lifecycle_environment: nil)
133
158
  relation = self.joins(:content_facet)
134
159
  relation = relation.where("#{::Katello::Host::ContentFacet.table_name}.content_view_id" => content_view) if content_view
@@ -45,7 +45,7 @@ module Katello
45
45
  prepend ::ForemanRemoteExecution::HostExtensions if ::Katello.with_remote_execution?
46
46
  prepend Overrides
47
47
 
48
- delegate :content_source_id, :content_view_id, :lifecycle_environment_id, :kickstart_repository_id, to: :content_facet, allow_nil: true
48
+ delegate :content_source_id, :content_view_id, :lifecycle_environment_id, :kickstart_repository_id, :bound_repositories, to: :content_facet, allow_nil: true
49
49
 
50
50
  has_many :dispatch_histories, :class_name => "::Katello::Agent::DispatchHistory", :foreign_key => :host_id, :dependent => :delete_all
51
51
 
@@ -424,9 +424,10 @@ module Katello
424
424
  ::Katello::Erratum.installable_for_hosts([self]).search_for(search).pluck(:errata_id)
425
425
  end
426
426
 
427
- def valid_content_override_label?(content_label)
428
- available_content = subscription_facet.candlepin_consumer.available_product_content
429
- available_content.map(&:content).any? { |content| content.label == content_label }
427
+ def filtered_entitlement_quantity_consumed(pool)
428
+ entitlements = subscription_facet.candlepin_consumer.filter_entitlements(pool.cp_id)
429
+ return nil if entitlements.empty?
430
+ entitlements.sum { |e| e[:quantity] }
430
431
  end
431
432
 
432
433
  protected
@@ -446,7 +447,8 @@ end
446
447
  class ::Host::Managed::Jail < Safemode::Jail
447
448
  allow :content_source, :subscription_manager_configuration_url, :rhsm_organization_label,
448
449
  :host_collections, :pools, :hypervisor_host, :lifecycle_environment, :content_view,
449
- :installed_packages, :traces_helpers, :advisory_ids, :package_names_for_job_template
450
+ :installed_packages, :traces_helpers, :advisory_ids, :package_names_for_job_template,
451
+ :filtered_entitlement_quantity_consumed, :bound_repositories
450
452
  end
451
453
 
452
454
  class ActiveRecord::Associations::CollectionProxy::Jail < Safemode::Jail
@@ -6,6 +6,8 @@ module Katello
6
6
  included do
7
7
  has_many :root_repositories, :class_name => "::Katello::RootRepository", :foreign_key => :http_proxy_id,
8
8
  :inverse_of => :http_proxy, :dependent => :nullify
9
+ has_many :alternate_content_sources, :class_name => "::Katello::AlternateContentSource", :foreign_key => :http_proxy_id,
10
+ :inverse_of => :http_proxy, :dependent => :nullify
9
11
  after_update :update_default_proxy_setting
10
12
  after_commit :update_repository_proxy_details
11
13
  before_destroy :remove_references_to_proxy
@@ -29,6 +31,7 @@ module Katello
29
31
 
30
32
  def remove_references_to_proxy
31
33
  root_repos = repositories_with_proxy(nil).uniq.sort
34
+ acss = ::Katello::AlternateContentSource.where(http_proxy_id: id)
32
35
 
33
36
  setting = Setting.find_by(name: 'content_default_http_proxy')
34
37
  if setting&.value && setting.value == self.name
@@ -43,6 +46,17 @@ module Katello
43
46
  http_proxy_policy: Katello::RootRepository::GLOBAL_DEFAULT_HTTP_PROXY,
44
47
  http_proxy_id: nil)
45
48
  end
49
+
50
+ unless acss.empty?
51
+ acss.each do |acs|
52
+ ForemanTasks.async_task(
53
+ ::Actions::Katello::AlternateContentSource::Update,
54
+ acs,
55
+ acs.smart_proxies,
56
+ http_proxy_id: nil
57
+ )
58
+ end
59
+ end
46
60
  end
47
61
 
48
62
  def update_default_proxy_setting
@@ -90,8 +90,10 @@ module Katello
90
90
  self.providers.anonymous.first
91
91
  end
92
92
 
93
- def manifest_imported?
94
- owner_details['upstreamConsumer'].present?
93
+ def manifest_imported?(cached: false)
94
+ Rails.cache.fetch("#{self.label}_manifest_imported?", expires_in: 1.minute, force: !cached) do
95
+ owner_details['upstreamConsumer'].present?
96
+ end
95
97
  end
96
98
 
97
99
  def manifest_expired?
@@ -6,8 +6,11 @@ module Katello
6
6
  included do
7
7
  validates :value, inclusion: { in: ::Katello::RootRepository::DOWNLOAD_POLICIES },
8
8
  if: ->(setting) { setting.name == 'default_download_policy' }
9
+ validates_with ::Katello::Validators::ContentDefaultHttpProxySettingValidator,
10
+ if: proc { |s| s.name == 'content_default_http_proxy' && HttpProxy.table_exists? }
9
11
 
10
12
  after_save :recalculate_errata_status
13
+ after_save :add_organizations_and_locations_if_global_http_proxy
11
14
  after_commit :update_global_proxies
12
15
  end
13
16
 
@@ -27,6 +30,17 @@ module Katello
27
30
  end
28
31
  end
29
32
  end
33
+
34
+ def add_organizations_and_locations_if_global_http_proxy
35
+ if name == 'content_default_http_proxy' && (::HttpProxy.table_exists? rescue(false))
36
+ proxy = HttpProxy.where(name: value).first
37
+
38
+ if proxy
39
+ proxy.update_attribute(:organizations, Organization.unscoped.all)
40
+ proxy.update_attribute(:locations, Location.unscoped.all)
41
+ end
42
+ end
43
+ end
30
44
  end
31
45
  end
32
46
  end
@@ -22,7 +22,8 @@ module Katello
22
22
  CONTAINER_GATEWAY_FEATURE = "Container_Gateway".freeze
23
23
 
24
24
  DOWNLOAD_INHERIT = 'inherit'.freeze
25
- DOWNLOAD_POLICIES = [::Katello::RootRepository::DOWNLOAD_ON_DEMAND, ::Katello::RootRepository::DOWNLOAD_IMMEDIATE, DOWNLOAD_INHERIT].freeze
25
+ DOWNLOAD_STREAMED = 'streamed'.freeze
26
+ DOWNLOAD_POLICIES = [::Katello::RootRepository::DOWNLOAD_ON_DEMAND, ::Katello::RootRepository::DOWNLOAD_IMMEDIATE, DOWNLOAD_INHERIT, DOWNLOAD_STREAMED].freeze
26
27
 
27
28
  included do
28
29
  include ForemanTasks::Concerns::ActionSubject
@@ -10,6 +10,7 @@ module Katello
10
10
  scoped_search :on => :label, :complete_value => true
11
11
  scoped_search :relation => :products, :on => :name, :rename => :product_name, :complete_value => true
12
12
  scoped_search :on => :label, :rename => :content_label, :complete_value => true
13
+ scoped_search :on => :cp_content_id, :complete_value => true
13
14
 
14
15
  after_update :update_repository_names, :if => :propagate_name_change?
15
16
 
@@ -29,6 +29,12 @@ module Katello
29
29
  :inverse_of => :ssl_client_cert, :dependent => :nullify
30
30
  has_many :ssl_key_root_repos, :class_name => "Katello::RootRepository", :foreign_key => "ssl_client_key_id",
31
31
  :inverse_of => :ssl_client_key, :dependent => :nullify
32
+ has_many :ssl_ca_alternate_content_sources, :class_name => "Katello::AlternateContentSource", :foreign_key => "ssl_ca_cert_id",
33
+ :inverse_of => :ssl_ca_cert, :dependent => :nullify
34
+ has_many :ssl_client_alternate_content_sources, :class_name => "Katello::AlternateContentSource", :foreign_key => "ssl_client_cert_id",
35
+ :inverse_of => :ssl_client_cert, :dependent => :nullify
36
+ has_many :ssl_key_alternate_content_sources, :class_name => "Katello::AlternateContentSource", :foreign_key => "ssl_client_key_id",
37
+ :inverse_of => :ssl_client_key, :dependent => :nullify
32
38
  belongs_to :organization, :inverse_of => :gpg_keys
33
39
 
34
40
  validates_lengths_from_database
@@ -43,9 +43,13 @@ module Katello
43
43
  end
44
44
 
45
45
  def ==(other)
46
- self.content_label == other.content_label &&
47
- self.name == other.name &&
48
- self.value == other.value
46
+ if self.class == other.class
47
+ self.content_label == other.content_label &&
48
+ self.name == other.name &&
49
+ self.value == other.value
50
+ else
51
+ super
52
+ end
49
53
  end
50
54
 
51
55
  def to_hash
@@ -11,7 +11,6 @@ module Katello
11
11
  CONTENT_DIR = "content_views".freeze
12
12
  IMPORT_LIBRARY = "Import-Library".freeze
13
13
  EXPORT_LIBRARY = "Export-Library".freeze
14
-
15
14
  belongs_to :organization, :inverse_of => :content_views, :class_name => "::Organization"
16
15
 
17
16
  has_many :content_view_environments, :class_name => "Katello::ContentViewEnvironment", :dependent => :destroy
@@ -19,7 +18,6 @@ module Katello
19
18
 
20
19
  has_many :content_view_versions, :class_name => "Katello::ContentViewVersion", :dependent => :destroy
21
20
  alias_method :versions, :content_view_versions
22
-
23
21
  # Note the difference between content_view_components and component_composites both refer to
24
22
  # ContentViewComponent but mean different things.
25
23
  # content_view_components -> Topdown, given I am a composite CV get the associated components belonging to me
@@ -73,6 +71,12 @@ module Katello
73
71
  inclusion: { in: [false], message: "Import-only Content Views can not solve dependencies"},
74
72
  if: :solve_dependencies
75
73
  validate :import_only_immutable
74
+ validates :generated_for,
75
+ exclusion: { in: [:none], message: "Generated Content Views can not be Composite"},
76
+ if: :composite
77
+ validates :generated_for,
78
+ exclusion: { in: [:none], message: "Generated Content Views can not solve dependencies"},
79
+ if: :solve_dependencies
76
80
 
77
81
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
78
82
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
@@ -81,11 +85,26 @@ module Katello
81
85
  scope :non_default, -> { where(:default => false) }
82
86
  scope :composite, -> { where(:composite => true) }
83
87
  scope :non_composite, -> { where(:composite => [nil, false]) }
88
+ scope :generated, -> { where.not(:generated_for => :none) }
89
+ scope :generated_for_repository, -> { where(:generated_for => [:repository_export, :repository_import]) }
90
+ scope :not_generated_for_repository, -> { where.not(id: generated_for_repository) }
91
+
92
+ scope :generated_for_library, -> { where(:generated_for => [:library_export, :library_import]) }
84
93
 
85
94
  scoped_search :on => :name, :complete_value => true
86
95
  scoped_search :on => :organization_id, :complete_value => true, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
87
96
  scoped_search :on => :label, :complete_value => true
88
97
  scoped_search :on => :composite, :complete_value => true
98
+ scoped_search :on => :generated_for, :complete_value => true
99
+ scoped_search :on => :default # just for ordering
100
+
101
+ enum generated_for: {
102
+ none: 0,
103
+ library_export: 1,
104
+ repository_export: 2,
105
+ library_import: 3,
106
+ repository_import: 4
107
+ }, _prefix: true
89
108
 
90
109
  set_crud_hooks :content_view
91
110
 
@@ -123,6 +142,14 @@ module Katello
123
142
  name.start_with? EXPORT_LIBRARY
124
143
  end
125
144
 
145
+ def generated_for_repository?
146
+ generated_for_repository_export? || generated_for_repository_import?
147
+ end
148
+
149
+ def generated_for_library?
150
+ generated_for_library_export? || generated_for_library_import?
151
+ end
152
+
126
153
  def content_host_count
127
154
  hosts.count
128
155
  end
@@ -211,6 +238,10 @@ module Katello
211
238
  self.environments.many?
212
239
  end
213
240
 
241
+ def generated?
242
+ !generated_for_none?
243
+ end
244
+
214
245
  #NOTE: this function will most likely become obsolete once we drop api v1
215
246
  def as_json(options = {})
216
247
  result = self.attributes
@@ -26,21 +26,33 @@ module Katello
26
26
  end
27
27
  end
28
28
 
29
- def content_unit_pulp_ids(repo)
29
+ def content_unit_pulp_ids(repo, additional_included_errata = [])
30
30
  return [] if erratum_rules.blank?
31
31
 
32
32
  if filter_by_id?
33
33
  errata_ids = erratum_rules.map(&:errata_id)
34
- errata_pulp_ids = errata_package_pulp_ids_from_errata_ids(repo, errata_ids)
35
- errata_pulp_ids += errata_module_stream_pulp_ids_from_errata_ids(errata_ids)
34
+ # additional_included_errata and inclusion filters don't work together (since it only applies when excluding)
35
+ if self.inclusion?
36
+ errata_pulp_ids = errata_package_pulp_ids_from_errata_ids(repo, errata_ids, [])
37
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_errata_ids(errata_ids, [])
38
+ else
39
+ errata_pulp_ids = errata_package_pulp_ids_from_errata_ids(repo, errata_ids, additional_included_errata)
40
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_errata_ids(errata_ids, additional_included_errata)
41
+ end
36
42
  else
37
43
  clauses = []
38
44
  clauses << errata_from
39
45
  clauses << errata_to
40
46
  clauses << types_clause
41
- package_filenames = Erratum.list_filenames_by_clauses(repo, clauses.compact)
42
- errata_pulp_ids = errata_package_pulp_ids_from_package_filenames(repo, package_filenames)
43
- errata_pulp_ids += errata_module_stream_pulp_ids_from_clauses(repo, clauses.compact)
47
+ if self.inclusion?
48
+ package_filenames = Erratum.list_filenames_by_clauses(repo, clauses.compact, [])
49
+ errata_pulp_ids = errata_package_pulp_ids_from_package_filenames(repo, package_filenames)
50
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_clauses(repo, clauses.compact, [])
51
+ else
52
+ package_filenames = Erratum.list_filenames_by_clauses(repo, clauses.compact, additional_included_errata)
53
+ errata_pulp_ids = errata_package_pulp_ids_from_package_filenames(repo, package_filenames)
54
+ errata_pulp_ids += errata_module_stream_pulp_ids_from_clauses(repo, clauses.compact, additional_included_errata)
55
+ end
44
56
  end
45
57
 
46
58
  errata_pulp_ids
@@ -53,8 +65,8 @@ module Katello
53
65
  repo.rpms.where("filename ILIKE ANY ( array[?] )", query_params)
54
66
  end
55
67
 
56
- def errata_module_stream_pulp_ids_from_clauses(repo, clauses)
57
- module_streams = Erratum.list_modular_streams_by_clauses(repo, clauses)
68
+ def errata_module_stream_pulp_ids_from_clauses(repo, clauses, additional_included_errata)
69
+ module_streams = Erratum.list_modular_streams_by_clauses(repo, clauses, additional_included_errata)
58
70
  module_streams.pluck(:pulp_id)
59
71
  end
60
72
 
@@ -62,13 +74,15 @@ module Katello
62
74
  rpms_by_filename(repo, package_filenames).pluck(:pulp_id)
63
75
  end
64
76
 
65
- def errata_module_stream_pulp_ids_from_errata_ids(errata_ids)
66
- module_streams = Katello::Erratum.where(:errata_id => errata_ids).map(&:module_streams).compact.flatten
77
+ def errata_module_stream_pulp_ids_from_errata_ids(errata_ids, additional_included_errata)
78
+ module_streams = Katello::Erratum.where(:errata_id => errata_ids).map(&:module_streams).compact.flatten -
79
+ Katello::Erratum.where(:errata_id => additional_included_errata.pluck(:errata_id)).map(&:module_streams).compact.flatten
67
80
  module_streams.pluck(:pulp_id)
68
81
  end
69
82
 
70
- def errata_package_pulp_ids_from_errata_ids(repo, errata_ids)
71
- package_filenames = Katello::ErratumPackage.joins(:erratum).where("#{Erratum.table_name}.errata_id" => errata_ids).pluck(:filename)
83
+ def errata_package_pulp_ids_from_errata_ids(repo, errata_ids, additional_included_errata)
84
+ package_filenames = Katello::ErratumPackage.joins(:erratum).where("#{Erratum.table_name}.errata_id" => errata_ids).pluck(:filename) -
85
+ Katello::ErratumPackage.joins(:erratum).where("#{Erratum.table_name}.errata_id" => additional_included_errata.pluck(:errata_id)).pluck(:filename)
72
86
  rpms_by_filename(repo, package_filenames).pluck(:pulp_id)
73
87
  end
74
88
 
@@ -162,6 +162,10 @@ module Katello
162
162
  if self.content_view.import_only?
163
163
  errors.add(:base, _("cannot add filter to import-only view"))
164
164
  end
165
+
166
+ if self.content_view.generated?
167
+ errors.add(:base, _("cannot add filter to generated content views"))
168
+ end
165
169
  end
166
170
 
167
171
  def validate_filter_repos(errors, content_view)
@@ -344,6 +344,18 @@ module Katello
344
344
  save!
345
345
  end
346
346
 
347
+ def auto_publish_composites!
348
+ metadata = {
349
+ description: _("Auto Publish - Triggered by '%s'") % self.name,
350
+ triggered_by: self.id
351
+ }
352
+ self.content_view.auto_publish_components.pluck(:composite_content_view_id).each do |composite_id|
353
+ ::Katello::EventQueue.push_event(::Katello::Events::AutoPublishCompositeView::EVENT_TYPE, composite_id) do |attrs|
354
+ attrs[:metadata] = metadata
355
+ end
356
+ end
357
+ end
358
+
347
359
  def repository_type_counts_map
348
360
  counts = {}
349
361
  Katello::RepositoryTypeManager.enabled_repository_types.keys.each do |repo_type|
@@ -53,8 +53,10 @@ module Katello
53
53
 
54
54
  def self.generate_audit_comment(user:, content_view_version:, from_version: nil, metadata:)
55
55
  export_type = export_type_from_metadata(metadata)
56
- if content_view_version.content_view.library_export?
56
+ if content_view_version.content_view.generated_for_library?
57
57
  export_descriptor = "library export"
58
+ elsif content_view_version.content_view.generated_for_repository?
59
+ export_descriptor = "repository export"
58
60
  else
59
61
  export_descriptor = "export of content view '#{content_view_version.content_view.name}' version #{content_view_version.version}"
60
62
  export_descriptor += " from #{from_version.name}" if from_version
@@ -108,25 +108,29 @@ module Katello
108
108
  installable_for_hosts(hosts).select(:id)
109
109
  end
110
110
 
111
- def self.list_filenames_by_clauses(repo, clauses)
111
+ def self.list_filenames_by_clauses(repo, clauses, additional_included_errata)
112
112
  query_clauses = clauses.map do |clause|
113
113
  "(#{clause.to_sql})"
114
114
  end
115
115
  statement = query_clauses.join(" AND ")
116
116
 
117
117
  Katello::ErratumPackage.joins(:erratum => :repository_errata).
118
- where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
119
- where(statement).pluck(:filename)
118
+ where("#{RepositoryErratum.table_name}.repository_id" => repo.id).where(statement).pluck(:filename) -
119
+ Katello::ErratumPackage.joins(:erratum => :repository_errata).where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
120
+ where("#{Erratum.table_name}.errata_id" => additional_included_errata.pluck(:errata_id)).pluck(:filename)
120
121
  end
121
122
 
122
- def self.list_modular_streams_by_clauses(repo, clauses)
123
+ def self.list_modular_streams_by_clauses(repo, clauses, additional_included_errata)
123
124
  query_clauses = clauses.map do |clause|
124
125
  "(#{clause.to_sql})"
125
126
  end
126
127
  statement = query_clauses.join(" AND ")
127
128
  ModuleStream.where(:id => ModuleStreamErratumPackage.joins(:erratum_package => {:erratum => :repository_errata}).
128
129
  where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
129
- where(statement).select("#{ModuleStreamErratumPackage.table_name}.module_stream_id"))
130
+ where(statement).select("#{ModuleStreamErratumPackage.table_name}.module_stream_id")) -
131
+ ModuleStream.where(:id => ModuleStreamErratumPackage.joins(:erratum_package => {:erratum => :repository_errata}).
132
+ where("#{RepositoryErratum.table_name}.repository_id" => repo.id).
133
+ where(statement).where("#{Erratum.table_name}.errata_id" => additional_included_errata.pluck(:errata_id)).select("#{ModuleStreamErratumPackage.table_name}.module_stream_id"))
130
134
  end
131
135
 
132
136
  def module_streams
@@ -0,0 +1,40 @@
1
+ module Katello
2
+ module Events
3
+ class DeleteLatestContentViewVersion
4
+ EVENT_TYPE = 'delete_latest_content_view_version'.freeze
5
+
6
+ attr_reader :content_view
7
+ attr_accessor :metadata, :retry
8
+
9
+ def self.retry_seconds
10
+ 18
11
+ end
12
+
13
+ def initialize(content_view_id)
14
+ @content_view = ::Katello::ContentView.find_by_id(content_view_id)
15
+ Rails.logger.warn "Content View not found for ID #{object_id}" if @content_view.nil?
16
+ yield(self) if block_given?
17
+ end
18
+
19
+ def run
20
+ return unless content_view
21
+
22
+ begin
23
+ ForemanTasks.async_task(::Actions::Katello::ContentView::Remove, content_view,
24
+ content_view_versions: [content_view.latest_version_object],
25
+ content_view_environments: content_view.latest_version_object.content_view_environments)
26
+ rescue => e
27
+ self.retry = true if e.is_a?(ForemanTasks::Lock::LockConflict)
28
+ deliver_failure_notification
29
+ raise e
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def deliver_failure_notification
36
+ ::Katello::UINotifications::ContentView::DelelteLatestVersionFailure.deliver!(content_view)
37
+ end
38
+ end
39
+ end
40
+ end