katello 4.4.0.2 → 4.5.0.rc2

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 (502) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/activation_key_edit.js +9 -2
  3. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +3 -0
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  5. data/app/controllers/katello/api/v2/alternate_content_sources_bulk_actions_controller.rb +44 -0
  6. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +121 -0
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  9. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  10. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  11. data/app/controllers/katello/api/v2/content_view_repositories_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  14. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/errata_controller.rb +3 -1
  16. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  17. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  18. data/app/controllers/katello/api/v2/module_streams_controller.rb +3 -1
  19. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  20. data/app/controllers/katello/api/v2/package_groups_controller.rb +3 -1
  21. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  22. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  23. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  24. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  25. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  26. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  27. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  28. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  29. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  30. data/app/lib/actions/katello/alternate_content_source/refresh.rb +27 -0
  31. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  32. data/app/lib/actions/katello/cdn_configuration/update.rb +3 -3
  33. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  34. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  35. data/app/lib/actions/katello/content_view/publish.rb +8 -10
  36. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  37. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  38. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  39. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  40. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  41. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  42. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  43. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  44. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  45. data/app/lib/actions/katello/product/content_create.rb +10 -8
  46. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  47. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  48. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  49. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  50. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  51. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  52. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +23 -0
  53. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  54. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  55. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  56. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  57. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  58. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +16 -0
  59. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  60. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +15 -0
  61. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +16 -0
  62. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  63. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  64. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  65. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +1 -4
  66. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -1
  67. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +0 -2
  68. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  69. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  70. data/app/lib/katello/util/errata.rb +2 -3
  71. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  72. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  73. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  74. data/app/models/katello/alternate_content_source.rb +71 -0
  75. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  76. data/app/models/katello/authorization/repository.rb +3 -3
  77. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  78. data/app/models/katello/cdn_configuration.rb +15 -15
  79. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  80. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  81. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  82. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  83. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  84. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  85. data/app/models/katello/content.rb +1 -0
  86. data/app/models/katello/content_credential.rb +6 -0
  87. data/app/models/katello/content_override.rb +7 -3
  88. data/app/models/katello/content_view.rb +33 -2
  89. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  90. data/app/models/katello/content_view_filter.rb +4 -0
  91. data/app/models/katello/content_view_version.rb +12 -0
  92. data/app/models/katello/content_view_version_export_history.rb +3 -1
  93. data/app/models/katello/erratum.rb +9 -5
  94. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  95. data/app/models/katello/host/content_facet.rb +14 -0
  96. data/app/models/katello/host_available_module_stream.rb +12 -0
  97. data/app/models/katello/product_content.rb +1 -0
  98. data/app/models/katello/purpose_sla_status.rb +1 -1
  99. data/app/models/katello/purpose_status.rb +2 -2
  100. data/app/models/katello/repository.rb +7 -4
  101. data/app/models/katello/root_repository.rb +1 -1
  102. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  103. data/app/models/katello/sync_plan.rb +1 -1
  104. data/app/presenters/katello/product_content_presenter.rb +15 -0
  105. data/app/services/katello/applicable_host_queue.rb +1 -1
  106. data/app/services/katello/product_content_finder.rb +12 -2
  107. data/app/services/katello/pulp3/alternate_content_source.rb +123 -0
  108. data/app/services/katello/pulp3/api/file.rb +8 -0
  109. data/app/services/katello/pulp3/api/yum.rb +8 -0
  110. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  111. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  112. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  113. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  114. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  115. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  116. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  117. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  118. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  119. data/app/services/katello/pulp3/erratum.rb +1 -1
  120. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  121. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  122. data/app/services/katello/pulp3/repository.rb +35 -63
  123. data/app/services/katello/pulp3/service_common.rb +66 -0
  124. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  125. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  126. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  127. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  128. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  129. data/app/views/foreman/job_templates/install_group.erb +4 -4
  130. data/app/views/foreman/job_templates/install_package.erb +4 -4
  131. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  132. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  133. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  134. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  135. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  136. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  137. data/app/views/foreman/job_templates/update_group.erb +4 -4
  138. data/app/views/foreman/job_templates/update_package.erb +4 -4
  139. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  140. data/app/views/foreman/smart_proxies/show.html.erb +2 -0
  141. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +24 -0
  142. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  143. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  144. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  145. data/app/views/katello/api/v2/content_facet/show.json.rabl +12 -0
  146. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  147. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  148. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  149. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  150. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  151. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  152. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  153. data/app/views/katello/api/v2/module_streams/show.json.rabl +0 -7
  154. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  155. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  156. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  157. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  158. data/config/routes/api/v2.rb +19 -0
  159. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  160. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  161. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  162. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  163. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  164. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +1 -1
  165. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  166. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  167. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  168. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  169. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  170. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  171. data/db/migrate/20220303160220_remove_duplicate_errata.rb +37 -2
  172. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  173. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  174. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  175. data/db/migrate/20220428203334_add_last_refreshed_to_katello_alternate_content_sources.rb +5 -0
  176. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  177. data/db/seeds.d/150-module_job_templates.rb +1 -1
  178. data/engines/bastion/README.md +1 -0
  179. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  180. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +11 -6
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +1 -1
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  209. data/lib/katello/engine.rb +1 -5
  210. data/lib/katello/permission_creator.rb +34 -4
  211. data/lib/katello/plugin.rb +377 -3
  212. data/lib/katello/tasks/refresh_alternate_content_sources.rake +10 -0
  213. data/lib/katello/tasks/reset.rake.bak +67 -0
  214. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  215. data/lib/katello/version.rb +1 -1
  216. data/locale/action_names.rb +47 -41
  217. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/bn/katello.po +820 -106
  219. data/locale/bn/katello.po.time_stamp +0 -0
  220. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/cs/katello.po +818 -104
  222. data/locale/cs/katello.po.time_stamp +0 -0
  223. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/de/katello.po +893 -179
  225. data/locale/de/katello.po.time_stamp +0 -0
  226. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  227. data/locale/en/katello.po +817 -103
  228. data/locale/en/katello.po.time_stamp +0 -0
  229. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  230. data/locale/es/katello.po +882 -168
  231. data/locale/es/katello.po.time_stamp +0 -0
  232. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  233. data/locale/fr/katello.po +1219 -505
  234. data/locale/fr/katello.po.time_stamp +0 -0
  235. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  236. data/locale/gu/katello.po +826 -112
  237. data/locale/gu/katello.po.time_stamp +0 -0
  238. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  239. data/locale/hi/katello.po +826 -112
  240. data/locale/hi/katello.po.time_stamp +0 -0
  241. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/it/katello.po +863 -148
  243. data/locale/it/katello.po.time_stamp +0 -0
  244. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  245. data/locale/ja/katello.po +1216 -499
  246. data/locale/ja/katello.po.time_stamp +0 -0
  247. data/locale/katello.pot +3847 -2507
  248. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/kn/katello.po +826 -112
  250. data/locale/kn/katello.po.time_stamp +0 -0
  251. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ko/katello.po +912 -198
  253. data/locale/ko/katello.po.time_stamp +0 -0
  254. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/mr/katello.po +826 -112
  256. data/locale/mr/katello.po.time_stamp +0 -0
  257. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/or/katello.po +826 -112
  259. data/locale/or/katello.po.time_stamp +0 -0
  260. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/pa/katello.po +826 -112
  262. data/locale/pa/katello.po.time_stamp +0 -0
  263. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  264. data/locale/pt/katello.po +817 -103
  265. data/locale/pt/katello.po.time_stamp +0 -0
  266. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/pt_BR/katello.po +879 -165
  268. data/locale/pt_BR/katello.po.time_stamp +0 -0
  269. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  270. data/locale/ru/katello.po +927 -213
  271. data/locale/ru/katello.po.time_stamp +0 -0
  272. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  273. data/locale/ta/katello.po +820 -106
  274. data/locale/ta/katello.po.time_stamp +0 -0
  275. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  276. data/locale/te/katello.po +826 -112
  277. data/locale/te/katello.po.time_stamp +0 -0
  278. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  279. data/locale/zh_CN/katello.po +1202 -486
  280. data/locale/zh_CN/katello.po.time_stamp +0 -0
  281. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  282. data/locale/zh_TW/katello.po +856 -142
  283. data/locale/zh_TW/katello.po.time_stamp +0 -0
  284. data/webpack/components/Bookmark/index.js +22 -14
  285. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  286. data/webpack/components/Errata/index.js +38 -8
  287. data/webpack/components/Packages/index.js +1 -4
  288. data/webpack/components/Search/Search.js +22 -3
  289. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  290. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  291. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  292. data/webpack/components/Table/MainTable.js +29 -4
  293. data/webpack/components/Table/MainTable.scss +5 -1
  294. data/webpack/components/Table/TableHooks.js +65 -20
  295. data/webpack/components/Table/TableWrapper.js +9 -3
  296. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  297. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  298. data/webpack/components/TypeAhead/TypeAhead.js +12 -0
  299. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  300. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +7 -2
  301. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  302. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +250 -0
  303. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +232 -0
  304. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  305. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  306. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  307. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  308. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  309. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  310. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  311. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  312. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  313. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +206 -0
  314. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  315. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  316. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  317. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  318. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +118 -0
  319. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  320. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  321. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  322. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  323. data/webpack/components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions.js +37 -0
  324. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  325. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  326. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +11 -0
  327. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  328. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -0
  329. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +6 -1
  330. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +176 -72
  331. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  332. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  333. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  334. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +522 -118
  335. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  336. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +6 -4
  337. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +164 -58
  338. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +59 -49
  339. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  340. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +85 -0
  341. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  342. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  343. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +298 -107
  344. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +14 -7
  345. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/HostTracesActions.js +2 -1
  346. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +104 -0
  347. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +134 -57
  348. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +37 -32
  349. data/webpack/components/extensions/HostDetails/Tabs/{ModuleStreamsTab/__tests__/modules.fixtures.json → __tests__/moduleStreams.fixtures.json} +6 -3
  350. data/webpack/components/extensions/HostDetails/Tabs/__tests__/moduleStreamsTab.test.js +261 -0
  351. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +21 -15
  352. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +44 -1
  353. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +4 -1
  354. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +105 -6
  355. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -6
  356. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  357. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +18 -0
  358. data/webpack/containers/Application/config.js +5 -0
  359. data/webpack/global_index.js +32 -9
  360. data/webpack/global_test_setup.js +13 -0
  361. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  362. data/webpack/redux/actions/RedHatRepositories/helpers.js +13 -8
  363. data/webpack/scenes/AlternateContentSources/ACSActions.js +65 -0
  364. data/webpack/scenes/AlternateContentSources/ACSConstants.js +18 -0
  365. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  366. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +24 -0
  367. data/webpack/scenes/AlternateContentSources/Create/ACSCreateContext.js +4 -0
  368. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +160 -0
  369. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +79 -0
  370. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +199 -0
  371. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +104 -0
  372. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +41 -0
  373. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +71 -0
  374. data/webpack/scenes/AlternateContentSources/Create/Steps/NameACS.js +57 -0
  375. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +77 -0
  376. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +149 -0
  377. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreateData.fixtures.json +3 -0
  378. data/webpack/scenes/AlternateContentSources/Create/__tests__/contentCredentials.fixtures.json +69 -0
  379. data/webpack/scenes/AlternateContentSources/Create/__tests__/smartProxy.fixtures.json +65 -0
  380. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +162 -0
  381. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  382. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  383. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  384. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  385. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  386. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +4 -1
  387. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  388. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  389. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  390. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  391. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  392. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  393. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  394. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  395. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  396. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  397. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  398. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  399. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  400. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  401. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  402. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  403. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  404. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  405. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  406. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  407. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  408. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  409. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  410. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  411. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  412. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  413. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  414. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  415. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  416. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  417. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  418. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  419. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  420. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  421. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  422. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  440. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  441. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  442. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  443. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  444. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  453. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  454. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  455. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  456. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  457. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  458. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  459. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  460. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  461. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  462. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  463. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  464. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -6
  465. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  466. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  467. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  468. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  469. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  470. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  471. data/webpack/scenes/ContentViews/helpers.js +3 -0
  472. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  473. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +1 -10
  474. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +13 -14
  475. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +17 -100
  476. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  477. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  478. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  479. data/webpack/scenes/RedHatRepositories/components/Search.js +4 -4
  480. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +9 -2
  481. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -1
  482. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +10 -1
  483. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  484. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  485. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  486. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  487. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  488. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  489. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  490. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  491. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  492. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  493. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  494. data/webpack/scenes/Tasks/helpers.js +60 -5
  495. data/webpack/utils/helpers.js +2 -0
  496. metadata +186 -41
  497. data/app/models/setting/content.rb +0 -201
  498. data/db/seeds.d/107-enable_dynflow.rb +0 -8
  499. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  500. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +0 -108
  501. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerEmptyState.js +0 -42
  502. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e2cbec78c4d297f09f1517b095e566c055bd14e2b3d4a534a5f904f8e9d43bc
4
- data.tar.gz: 5f96a7ce828a6ac081883643f8f79d55088ded4a5a06d86c4bfc69fababc315e
3
+ metadata.gz: 5922047abc1b1bd8649e30bbaaf5eaf2e09f09bc9abb5e1b61920c0b84b1b57b
4
+ data.tar.gz: 8105c45f9d16ca034430e89224f9bb81fa95c02d38ca638268864e34a9d57e2b
5
5
  SHA512:
6
- metadata.gz: c109e2ed4481c10d8bc475b706aa00498f3cfce65fb2f9ec6cf589be8da2a47344561b31d45a5721aaab9743ccdbf751ec665663b858c26eb433803db59bbc6c
7
- data.tar.gz: 87d9b9ced044f3b34df8045a1ca1a02ca5ba695e4048999290fc0594f21186065c63036b93d4b1beef09162ddf9bb60c06dbd7cde7057df8a456a5701b8e9e3d
6
+ metadata.gz: '069335f24169763ce80081693498c668a115893acb4e9c7b2a1486d54d5394f53b9d21cb6442acd6cba990f07d58e6b75f7ec0d9e32515165226fb833874a311'
7
+ data.tar.gz: 22cda386e45a6d989daff56fe3897d07a75205282b2aa1e901bf7c333fd38d72869ab3dd808641a5535d8f72063c2961aa575c2420dfa51c2f98a3ab4152b28c
@@ -75,8 +75,15 @@ function ktSetParam(name, value) {
75
75
  var paramContainer = ktFindParamContainer(name);
76
76
  if(value) {
77
77
  if(! paramContainer) { // we create the param for kt_activation_keys
78
- $("div#parameters a[target~='#global_parameters_table']").click();
79
- paramContainer = $("div#parameters .fields").last();
78
+ var addParameterButton = $('#parameters').find('.btn-primary');
79
+ addParameterButton.click();
80
+ var directionOfAddedItems = addParameterButton.attr('direction');
81
+ var paramContainer = $('#parameters').find('.fields');
82
+ if(directionOfAddedItems === 'append'){
83
+ paramContainer = paramContainer.last();
84
+ } else {
85
+ paramContainer = paramContainer.first();
86
+ }
80
87
  paramContainer.find("input[name*='name']").val(name);
81
88
  }
82
89
  paramContainer.find("textarea").val(value);
@@ -177,6 +177,9 @@ module Katello
177
177
  end
178
178
  end
179
179
  response.headers['Content-Type'] = media_type
180
+ length = manifest_response.try(:body).try(:size)
181
+ length ||= 0
182
+ response.header['Content-Length'] = "#{length}"
180
183
  render json: manifest_response
181
184
  end
182
185
  end
@@ -406,7 +406,11 @@ module Katello
406
406
  where("#{Organization.table_name}.id = ?", organization.id)
407
407
  environments = environments.where("#{Katello::ContentViewEnvironment.table_name}.label = ?", label) if label
408
408
 
409
- environments.reject { |env| (env.content_view.default && !env.environment.readable?) || !env.content_view.readable? }
409
+ environments.reject do |env|
410
+ (env.content_view.default && !env.environment.readable?) ||
411
+ !env.content_view.readable? ||
412
+ env.content_view.generated_for_repository?
413
+ end
410
414
  end
411
415
 
412
416
  def rhsm_params
@@ -0,0 +1,44 @@
1
+ module Katello
2
+ class Api::V2::AlternateContentSourcesBulkActionsController < Api::V2::ApiController
3
+ before_action :find_alternate_content_sources
4
+
5
+ api :PUT, '/alternate_content_sources/bulk/destroy', N_('Destroy one or more alternate content sources')
6
+ param :ids, Array, desc: N_('List of alternate content source IDs'), required: true
7
+ def destroy_alternate_content_sources
8
+ deletable_alternate_content_sources = @alternate_content_sources.deletable
9
+
10
+ if deletable_alternate_content_sources.empty?
11
+ msg = _("Unable to delete any alternate content source. You either do not have the permission to"\
12
+ " delete, or none of the alternate content sources exist.")
13
+ fail HttpErrors::UnprocessableEntity, msg
14
+ end
15
+ task = async_task(::Actions::BulkAction,
16
+ ::Actions::Katello::AlternateContentSource::Destroy,
17
+ deletable_alternate_content_sources)
18
+ respond_for_async :resource => task
19
+ end
20
+
21
+ api :POST, '/alternate_content_sources/bulk/refresh', N_('Refresh alternate content sources')
22
+ param :ids, Array, desc: N_('List of alternate content source IDs'), required: true
23
+ def refresh_alternate_content_sources
24
+ refreshable_alternate_content_sources = @alternate_content_sources.editable
25
+ if refreshable_alternate_content_sources.empty?
26
+ msg = _("Unable to refresh any alternate content source. You either do not have the permission to"\
27
+ " refresh, or none of the alternate content sources exist.")
28
+ fail HttpErrors::UnprocessableEntity, msg
29
+ else
30
+ task = async_task(::Actions::BulkAction,
31
+ ::Actions::Katello::AlternateContentSource::Refresh,
32
+ refreshable_alternate_content_sources)
33
+ respond_for_async resource: task
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def find_alternate_content_sources
40
+ params.require(:ids)
41
+ @alternate_content_sources = AlternateContentSource.readable.where(id: params[:ids])
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,121 @@
1
+ module Katello
2
+ class Api::V2::AlternateContentSourcesController < Api::V2::ApiController
3
+ include Katello::Concerns::FilteredAutoCompleteSearch
4
+
5
+ acs_wrap_params = AlternateContentSource.attribute_names + [:smart_proxy_ids, :smart_proxy_names]
6
+ wrap_parameters :alternate_content_source, include: acs_wrap_params
7
+
8
+ before_action :find_authorized_katello_resource, only: [:show, :update, :destroy, :refresh]
9
+
10
+ def_param_group :acs do
11
+ param :name, String, desc: N_("Name of the alternate content source")
12
+ param :description, String, desc: N_("Description for the alternate content source"), required: false
13
+ param :base_url, String, desc: N_('Base URL for finding alternate content'), required: false
14
+ param :subpaths, Array, desc: N_('Path suffixes for finding alternate content'), required: false
15
+ param :smart_proxy_ids, Array, desc: N_("Ids of smart proxies to associate"), required: false
16
+ param :smart_proxy_names, Array, desc: N_("Names of smart proxies to associate"), required: false
17
+ param :content_type, RepositoryTypeManager.defined_repository_types.keys & AlternateContentSource::CONTENT_TYPES, desc: N_("The content type for the Alternate Content Source"), required: false
18
+ param :alternate_content_source_type, AlternateContentSource::ACS_TYPES, desc: N_("The Alternate Content Source type")
19
+ param :upstream_username, String, desc: N_("Basic authentication username"), required: false
20
+ param :upstream_password, String, desc: N_("Basic authentication password"), required: false
21
+ param :ssl_ca_cert_id, :number, desc: N_("Identifier of the content credential containing the SSL CA Cert"), required: false
22
+ param :ssl_client_cert_id, :number, desc: N_("Identifier of the content credential containing the SSL Client Cert"), required: false
23
+ param :ssl_client_key_id, :number, desc: N_("Identifier of the content credential containing the SSL Client Key"), required: false
24
+ param :http_proxy_id, :number, desc: N_("ID of a HTTP Proxy"), required: false
25
+ param :verify_ssl, :bool, desc: N_("If SSL should be verified for the upstream URL"), required: false
26
+ end
27
+
28
+ api :GET, "/alternate_content_sources", N_("List of alternate_content_sources")
29
+ param_group :search, Api::V2::ApiController
30
+ add_scoped_search_description_for(AlternateContentSource)
31
+ def index
32
+ respond_to do |format|
33
+ format.csv do
34
+ options[:csv] = true
35
+ alternate_content_sources = scoped_search(index_relation, :name, :asc)
36
+ csv_response(alternate_content_sources,
37
+ [:id, :name, :description, :label, :base_url, :subpaths, :content_type, :alternate_content_source_type],
38
+ ['Id', 'Name', 'Description', 'label', 'Base URL', 'Subpaths', 'Content Type', 'Alternate Content Source Type'])
39
+ end
40
+ format.any do
41
+ alternate_content_sources = scoped_search(index_relation, :name, :asc)
42
+ respond(collection: alternate_content_sources)
43
+ end
44
+ end
45
+ end
46
+
47
+ def index_relation
48
+ AlternateContentSource.readable.distinct
49
+ end
50
+
51
+ api :GET, '/alternate_content_sources/:id', N_('Show an alternate content source')
52
+ param :id, :number, :required => true, :desc => N_("Alternate content source ID")
53
+ def show
54
+ respond_for_show(:resource => @alternate_content_source)
55
+ end
56
+
57
+ api :POST, '/alternate_content_sources', N_('Create an ACS')
58
+ param_group :acs
59
+ def create
60
+ find_smart_proxies
61
+ @alternate_content_source = ::Katello::AlternateContentSource.new(acs_params.except(:smart_proxy_ids, :smart_proxy_names))
62
+ sync_task(::Actions::Katello::AlternateContentSource::Create, @alternate_content_source, @smart_proxies)
63
+ @alternate_content_source.reload
64
+ respond_for_create(resource: @alternate_content_source)
65
+ end
66
+
67
+ api :PUT, '/alternate_content_sources/:id', N_('Update an alternate content source')
68
+ param_group :acs
69
+ param :id, :number, :required => true, :desc => N_("Alternate content source ID")
70
+ def update
71
+ # If a user doesn't include smart proxies in the update call, don't accidentally remove all of them.
72
+ if params[:smart_proxy_ids].nil?
73
+ @smart_proxies = @alternate_content_source.smart_proxies
74
+ elsif params[:smart_proxy_ids].empty?
75
+ @smart_proxies = []
76
+ else
77
+ find_smart_proxies
78
+ end
79
+ sync_task(::Actions::Katello::AlternateContentSource::Update, @alternate_content_source, @smart_proxies, acs_params.except(:smart_proxy_ids))
80
+ respond_for_show(:resource => @alternate_content_source)
81
+ end
82
+
83
+ api :DELETE, '/alternate_content_sources/:id', N_('Destroy an alternate content source')
84
+ param :id, :number, :required => true, :desc => N_("Alternate content source ID")
85
+ def destroy
86
+ sync_task(::Actions::Katello::AlternateContentSource::Destroy, @alternate_content_source)
87
+ respond_for_destroy
88
+ end
89
+
90
+ api :POST, '/alternate_content_sources/:id/refresh', N_('Refresh an alternate content source')
91
+ param :id, :number, :required => true, :desc => N_("Alternate content source ID")
92
+ def refresh
93
+ task = async_task(::Actions::Katello::AlternateContentSource::Refresh, @alternate_content_source)
94
+ respond_for_async :resource => task
95
+ end
96
+
97
+ protected
98
+
99
+ def acs_params
100
+ keys = [:name, :label, :base_url, {subpaths: []}, {smart_proxy_ids: []}, {smart_proxy_names: []}, :content_type, :alternate_content_source_type,
101
+ :upstream_username, :upstream_password, :ssl_ca_cert_id, :ssl_client_cert_id, :ssl_client_key_id,
102
+ :http_proxy_id, :verify_ssl]
103
+ params.require(:alternate_content_source).permit(*keys).to_h.with_indifferent_access
104
+ end
105
+
106
+ def find_smart_proxies
107
+ if params[:smart_proxy_ids]
108
+ @smart_proxies = ::SmartProxy.where(id: params[:smart_proxy_ids])
109
+ elsif params[:smart_proxy_names]
110
+ @smart_proxies = ::SmartProxy.where(name: params[:smart_proxy_names])
111
+ end
112
+ if params[:smart_proxy_ids] && @smart_proxies.length < params[:smart_proxy_ids].length
113
+ missing_smart_proxies = params[:smart_proxy_ids] - @smart_proxies.pluck(:id)
114
+ fail HttpErrors::NotFound, _("Couldn't find smart proxies with id '%s'") % missing_smart_proxies.to_sentence
115
+ elsif params[:smart_proxy_names] && @smart_proxies.length < params[:smart_proxy_names].length
116
+ missing_smart_proxies = params[:smart_proxy_names] - @smart_proxies.pluck(:name)
117
+ fail HttpErrors::NotFound, _("Couldn't find smart proxies with name '%s'") % missing_smart_proxies.to_sentence
118
+ end
119
+ end
120
+ end
121
+ end
@@ -2,8 +2,10 @@ module Katello
2
2
  class Api::V2::ContentExportIncrementalsController < Api::V2::ApiController
3
3
  before_action :find_exportable_organization, :only => [:library]
4
4
  before_action :find_exportable_content_view_version, :only => [:version]
5
+ before_action :find_exportable_repository, :only => [:repository]
5
6
  before_action :find_library_export_view, :only => [:library]
6
- before_action :find_history, :only => [:version, :library]
7
+ before_action :find_repository_export_view, :only => [:repository]
8
+ before_action :find_history, :only => [:version, :library, :repository]
7
9
 
8
10
  api :POST, "/content_export_incrementals/version", N_("Performs an incremental-export of a content view version.")
9
11
  param :id, :number, :desc => N_("Content view version identifier"), :required => true
@@ -44,6 +46,20 @@ module Katello
44
46
  respond_for_async :resource => tasks
45
47
  end
46
48
 
49
+ api :POST, "/content_export_incrementals/repository", N_("Performs a incremental-export of the repository in library.")
50
+ param :id, :number, :desc => N_("Repository identifier"), :required => true
51
+ param :chunk_size_gb, :number, :desc => N_("Split the exported content into archives "\
52
+ "no greater than the specified size in gigabytes."), :required => false
53
+ param :from_history_id, :number, :desc => N_("Export history identifier used for incremental export. "\
54
+ "If not provided the most recent export history will be used."), :required => false
55
+ def repository
56
+ tasks = async_task(::Actions::Pulp3::Orchestration::ContentViewVersion::ExportRepository,
57
+ @repository,
58
+ chunk_size: params[:chunk_size_gb],
59
+ from_history: @history)
60
+ respond_for_async :resource => tasks
61
+ end
62
+
47
63
  private
48
64
 
49
65
  def find_exportable_content_view_version
@@ -63,6 +79,16 @@ module Katello
63
79
  end
64
80
  end
65
81
 
82
+ def find_repository_export_view
83
+ @view = ::Katello::Pulp3::ContentViewVersion::Export.find_repository_export_view(
84
+ repository: @repository,
85
+ create_by_default: false)
86
+ if @view.blank?
87
+ msg = _("Unable to incrementally export. Do a Full Export on the repository content.")
88
+ fail HttpErrors::BadRequest, msg
89
+ end
90
+ end
91
+
66
92
  def find_history
67
93
  if params[:from_history_id].present?
68
94
  @history = ::Katello::ContentViewVersionExportHistory.find(params[:from_history_id])
@@ -72,8 +98,7 @@ module Katello
72
98
  end
73
99
  else
74
100
  @history = ::Katello::ContentViewVersionExportHistory.
75
- latest(@view,
76
- destination_server: params[:destination_server])
101
+ latest(@view, destination_server: params[:destination_server])
77
102
  if @history.blank?
78
103
  msg = _("No existing export history was found to perform an incremental export. A full export must be performed")
79
104
  fail HttpErrors::NotFound, msg
@@ -87,5 +112,16 @@ module Katello
87
112
  throw_resource_not_found(name: 'organization', id: params[:organization_id])
88
113
  end
89
114
  end
115
+
116
+ def find_exportable_repository
117
+ @repository = Repository.find_by_id(params[:id])
118
+ if @repository.blank?
119
+ throw_resource_not_found(name: 'repository', id: params[:id])
120
+ end
121
+
122
+ unless @repository.organization.can_export_content?
123
+ throw_resource_not_found(name: 'organization', id: @repository.organization.id)
124
+ end
125
+ end
90
126
  end
91
127
  end
@@ -2,6 +2,7 @@ module Katello
2
2
  class Api::V2::ContentExportsController < Api::V2::ApiController
3
3
  before_action :find_exportable_organization, :only => [:library]
4
4
  before_action :find_exportable_content_view_version, :only => [:version]
5
+ before_action :find_exportable_repository, :only => [:repository]
5
6
 
6
7
  api :GET, "/content_exports", N_("List export histories")
7
8
  param :content_view_version_id, :number, :desc => N_("Content view version identifier"), :required => false
@@ -58,8 +59,26 @@ module Katello
58
59
  respond_for_async :resource => tasks
59
60
  end
60
61
 
62
+ api :POST, "/content_exports/repository", N_("Performs a full-export of the repository in library.")
63
+ param :id, :number, :desc => N_("Repository identifier"), :required => true
64
+ param :chunk_size_gb, :number, :desc => N_("Split the exported content into archives "\
65
+ "no greater than the specified size in gigabytes."), :required => false
66
+ def repository
67
+ tasks = async_task(::Actions::Pulp3::Orchestration::ContentViewVersion::ExportRepository,
68
+ @repository,
69
+ chunk_size: params[:chunk_size_gb])
70
+ respond_for_async :resource => tasks
71
+ end
72
+
61
73
  private
62
74
 
75
+ def find_exportable_repository
76
+ @repository = Repository.find_by_id(params[:id])
77
+ if @repository.blank? || !@repository.organization.can_export_content?
78
+ throw_resource_not_found(name: 'repository', id: params[:id])
79
+ end
80
+ end
81
+
63
82
  def find_exportable_content_view_version
64
83
  @version = ContentViewVersion.exportable.find_by_id(params[:id])
65
84
  throw_resource_not_found(name: 'content view version', id: params[:id]) if @version.blank?
@@ -1,10 +1,7 @@
1
1
  module Katello
2
2
  class Api::V2::ContentImportsController < Api::V2::ApiController
3
- before_action :find_organization, :only => [:version]
4
- before_action :check_authorized, :only => [:version]
5
-
6
- before_action :find_importable_organization, :only => [:library]
7
- before_action :find_default_content_view, :only => [:library]
3
+ before_action :find_organization, :only => [:version, :repository, :library]
4
+ before_action :check_authorized, :only => [:version, :repository, :library]
8
5
 
9
6
  api :GET, "/content_imports", N_("List import histories")
10
7
  param :content_view_version_id, :number, :desc => N_("Content view version identifier"), :required => false
@@ -46,22 +43,21 @@ module Katello
46
43
  respond_for_async :resource => task
47
44
  end
48
45
 
46
+ api :POST, "/content_imports/repository", N_("Import a repository")
47
+ param :organization_id, :number, :desc => N_("Organization identifier"), :required => true
48
+ param :path, String, :desc => N_("Directory containing the exported Content View Version"), :required => true
49
+ param :metadata, Hash, :desc => N_("Metadata taken from the upstream export history for this Content View Version"), :required => true
50
+ def repository
51
+ task = async_task(::Actions::Katello::ContentViewVersion::ImportRepository, @organization, path: params[:path], metadata: metadata_params.to_h)
52
+ respond_for_async :resource => task
53
+ end
54
+
49
55
  private
50
56
 
51
57
  def check_authorized
52
58
  fail HttpErrors::Forbidden, _("Action unauthorized to be performed in this organization.") unless @organization.can_import_content?
53
59
  end
54
60
 
55
- def find_default_content_view
56
- @view = @organization&.default_content_view
57
- throw_resource_not_found(name: 'organization', id: params[:organization_id]) if @view.blank?
58
- end
59
-
60
- def find_importable_organization
61
- find_organization
62
- throw_resource_not_found(name: 'organization', id: params[:organization_id]) unless @organization.can_import_content?
63
- end
64
-
65
61
  def metadata_params
66
62
  params.require(:metadata).permit(
67
63
  :organization,
@@ -69,8 +65,9 @@ module Katello
69
65
  :products,
70
66
  :toc,
71
67
  :incremental,
68
+ :destination_server,
72
69
  gpg_keys: {},
73
- content_view: [:name, :label, :description],
70
+ content_view: [:name, :label, :description, :generated_for],
74
71
  content_view_version: [:major, :minor, :description],
75
72
  from_content_view_version: [:major, :minor]
76
73
  ).tap do |nested|
@@ -57,7 +57,7 @@ module Katello
57
57
  else
58
58
  query
59
59
  end
60
- custom_sort = ->(sort_query) { sort_query.joins(join_query).order(order_query) }
60
+ custom_sort = ->(sort_query) { sort_query.joins(join_query).order(Arel.sql(order_query)) }
61
61
  options = { resource_class: Katello::ContentView, custom_sort: custom_sort }
62
62
  collection = scoped_search(query, nil, nil, options)
63
63
  collection[:results] = ComponentViewPresenter.component_presenter(@view, params[:status], views: collection[:results])
@@ -28,7 +28,7 @@ module Katello
28
28
  query = query.with_type(params[:content_type]) if params[:content_type]
29
29
  # Use custom sort to perform the join and order since we need to order by specific content_view
30
30
  # and the ORDER BY query needs access to the katello_content_view_repositories table
31
- custom_sort = ->(sort_query) { sort_query.joins(:root).joins(join_query).order(order_query) }
31
+ custom_sort = ->(sort_query) { sort_query.joins(:root).joins(join_query).order(Arel.sql(order_query)) }
32
32
  options = { resource_class: Katello::Repository, custom_sort: custom_sort }
33
33
  repos = scoped_search(query, nil, nil, options)
34
34
 
@@ -274,17 +274,5 @@ module Katello
274
274
  return deny_access unless @content_view_version.content_view.deletable?
275
275
  true
276
276
  end
277
-
278
- def metadata_params
279
- params.require(:metadata).permit(
280
- :organization,
281
- :content_view,
282
- :repository_mapping,
283
- :toc,
284
- content_view_version: [:major, :minor]
285
- ).tap do |nested|
286
- nested[:repository_mapping] = params[:metadata].require(:repository_mapping).permit!
287
- end
288
- end
289
277
  end
290
278
  end
@@ -5,6 +5,7 @@ module Katello
5
5
  include Katello::Concerns::Api::V2::BulkExtensions
6
6
 
7
7
  before_action :find_authorized_katello_resource, :except => [:index, :create, :copy, :auto_complete_search]
8
+ before_action :ensure_non_generated, only: [:publish]
8
9
  before_action :ensure_non_default, :except => [:index, :create, :copy, :auto_complete_search]
9
10
  before_action :find_organization, :only => [:create]
10
11
  before_action :find_optional_organization, :only => [:index, :auto_complete_search]
@@ -54,6 +55,7 @@ module Katello
54
55
  param :without, Array, :desc => N_("Do not include this array of content views")
55
56
  param :name, String, :desc => N_("Name of the content view"), :required => false
56
57
  param :label, String, :desc => N_("Label of the content view"), :required => false
58
+ param :include_generated, :bool, :desc => N_("Include content views generated by imports/exports. Defaults to false")
57
59
  param_group :search, Api::V2::ApiController
58
60
  add_scoped_search_description_for(ContentView)
59
61
  def index
@@ -64,6 +66,7 @@ module Katello
64
66
 
65
67
  def index_relation
66
68
  content_views = ContentView.readable
69
+ content_views = content_views.not_generated_for_repository unless Foreman::Cast.to_bool(params[:include_generated])
67
70
  content_views = content_views.where(:organization_id => @organization.id) if @organization
68
71
  content_views = content_views.in_environment(@environment) if @environment
69
72
  content_views = ::Foreman::Cast.to_bool(params[:nondefault]) ? content_views.non_default : content_views.default if params[:nondefault]
@@ -257,6 +260,16 @@ module Katello
257
260
  end
258
261
  end
259
262
 
263
+ def ensure_non_generated
264
+ if @content_view.import_only?
265
+ fail HttpErrors::BadRequest, _("Import only Content Views cannot be directly publsihed. Content can only be updated by importing into the view.")
266
+ end
267
+
268
+ if @content_view.generated?
269
+ fail HttpErrors::BadRequest, _("Generated content views cannot be directly published. They can updated only via export.")
270
+ end
271
+ end
272
+
260
273
  def view_params
261
274
  attrs = [:name, :description, :auto_publish, :solve_dependencies, :import_only,
262
275
  :default, :created_at, :updated_at, :next_version, {:component_ids => []}]
@@ -107,7 +107,7 @@ module Katello
107
107
  fail HttpErrors::BadRequest, _("Can't update the '%s' environment") % "Library" if @environment.library? && update_params.empty?
108
108
  update_params[:name] = params[:environment][:new_name] if params[:environment][:new_name]
109
109
  @environment.update!(update_params)
110
- if update_params[:registry_name_pattern]
110
+ if update_params[:registry_name_pattern] || update_params[:registry_unauthenticated_pull]
111
111
  task = send(async ? :async_task : :sync_task, ::Actions::Katello::Environment::PublishRepositories,
112
112
  @environment, content_type: Katello::Repository::DOCKER_TYPE)
113
113
  end
@@ -35,7 +35,9 @@ module Katello
35
35
  end
36
36
 
37
37
  def all_for_content_view_filter(filter, _collection)
38
- Erratum.joins(:repositories).merge(filter.applicable_repos)
38
+ available_ids = Erratum.joins(:repositories).merge(filter.applicable_repos)&.pluck(:errata_id) || []
39
+ added_ids = filter&.erratum_rules&.pluck(:errata_id) || []
40
+ Erratum.where(errata_id: available_ids + added_ids)
39
41
  end
40
42
 
41
43
  def custom_index_relation(collection)
@@ -12,6 +12,7 @@ module Katello
12
12
  api :GET, "/hosts/:host_id/module_streams", N_("List module streams available to the host")
13
13
  param :host_id, :number, :required => true, :desc => N_("ID of the host")
14
14
  param :status, ::Katello::HostAvailableModuleStream::API_STATES.keys, :desc => N_("Streams based on the host based on their status")
15
+ param :install_status, String, :desc => N_("Streams based on the host based on the installation status"), :required => false
15
16
  param_group :search, Api::V2::ApiController
16
17
  def index
17
18
  collection = scoped_search(index_relation, :name, :asc, :resource_class => ::Katello::HostAvailableModuleStream)
@@ -22,8 +23,13 @@ module Katello
22
23
  return HostAvailableModuleStream.upgradable([@host]) if params[:status] == HostAvailableModuleStream::UPGRADABLE
23
24
 
24
25
  rel = @host.host_available_module_streams
25
- return rel if params[:status].blank?
26
- rel.send(::Katello::HostAvailableModuleStream::API_STATES[params[:status]])
26
+ if params[:sort_by] == 'installed_profiles'
27
+ rel = rel.order([:installed_profiles, :status])
28
+ end
29
+ return rel if (params[:status].blank? && params[:install_status].blank?)
30
+ rel = rel.send(::Katello::HostAvailableModuleStream::API_STATES[params[:status]]) unless params[:status].blank?
31
+ rel = rel.installed_status(params[:install_status], @host) unless params[:install_status].blank?
32
+ rel
27
33
  end
28
34
 
29
35
  def resource_class
@@ -5,6 +5,7 @@ module Katello
5
5
  before_action :check_subscriptions, :only => [:add_subscriptions, :remove_subscriptions]
6
6
  before_action :find_content_view_environment, :only => :create
7
7
  before_action :check_registration_services, :only => [:destroy, :create]
8
+ before_action :find_content_overrides, :only => [:content_override]
8
9
 
9
10
  def_param_group :installed_products do
10
11
  param :product_id, String, :desc => N_("Product id as listed from a host's installed products, \
@@ -165,12 +166,16 @@ module Katello
165
166
  param :name, String, :desc => N_("Override key or name. Note if name is not provided the default name will be 'enabled'"), :required => false
166
167
  param :remove, :bool, :desc => N_("Set true to remove an override and reset it to 'default'"), :required => false
167
168
  end
169
+ param :content_overrides_search, Hash, :desc => N_("Content override search parameters") do
170
+ param_group :search, Api::V2::ApiController
171
+ param :enabled, :bool, :desc => N_("Set true to override to enabled; Set false to override to disabled.'"), :required => false
172
+ param :remove, :bool, :desc => N_("Set true to remove an override and reset it to 'default'"), :required => false
173
+ end
168
174
  def content_override
169
- content_overrides = params[:content_overrides] || []
170
-
171
- content_override_values = content_overrides.map do |override_params|
175
+ content_override_values = @content_overrides.map do |override_params|
172
176
  validate_content_overrides_enabled(override_params)
173
177
  end
178
+
174
179
  sync_task(::Actions::Katello::Host::UpdateContentOverrides, @host, content_override_values, false)
175
180
  fetch_product_content
176
181
  end
@@ -217,5 +222,22 @@ module Katello
217
222
  fail ::Foreman::Exception.new(N_("unknown permission for %s"), "#{params[:controller]}##{params[:action]}")
218
223
  end
219
224
  end
225
+
226
+ def find_content_overrides
227
+ if params[:content_overrides_search]
228
+ content_labels = ::Katello::Content.joins(:product_contents)
229
+ .where("#{Katello::ProductContent.table_name}.product_id": @host.organization.products.subscribable.enabled)
230
+ .search_for(params[:content_overrides_search][:search])
231
+ .pluck(:label)
232
+ @content_overrides = content_labels.map do |label|
233
+ { content_label: label,
234
+ value: Foreman::Cast.to_bool(params[:content_overrides_search][:enabled]),
235
+ remove: Foreman::Cast.to_bool(params[:content_overrides_search][:remove])
236
+ }
237
+ end
238
+ else
239
+ @content_overrides = params[:content_overrides] || []
240
+ end
241
+ end
220
242
  end
221
243
  end
@@ -36,7 +36,9 @@ module Katello
36
36
  end
37
37
 
38
38
  def all_for_content_view_filter(filter, _collection)
39
- ModuleStream.joins(:repositories).merge(filter.applicable_repos)
39
+ available_ids = ModuleStream.joins(:repositories).merge(filter.applicable_repos)&.pluck(:id) || []
40
+ added_ids = filter&.module_stream_rules&.pluck(:module_stream_id) || []
41
+ ModuleStream.where(id: available_ids + added_ids)
40
42
  end
41
43
 
42
44
  def available_for_content_view_filter(filter, _collection)
@@ -29,7 +29,6 @@ module Katello
29
29
  param :hostgroup_ids, Array, N_("Host group IDs"), :required => false
30
30
  param :environment_ids, Array, N_("Environment IDs"), :required => false
31
31
  param :subnet_ids, Array, N_("Subnet IDs"), :required => false
32
- param :label, String, :required => false
33
32
  param :location_ids, Array, N_("Associated location IDs"), :required => false
34
33
  end
35
34
  end
@@ -66,6 +65,9 @@ module Katello
66
65
 
67
66
  api :POST, '/organizations', N_('Create organization')
68
67
  param_group :resource
68
+ param :organization, Hash do
69
+ param :label, String, :required => false
70
+ end
69
71
  def create
70
72
  @organization = Organization.new(resource_params)
71
73
  creator = ::Katello::OrganizationCreator.new(@organization)
@@ -134,7 +136,7 @@ module Katello
134
136
 
135
137
  api :PUT, "/organizations/:id/cdn_configuration", N_("Update the CDN configuration")
136
138
  param :id, String, :desc => N_("ID of the Organization"), :required => true
137
- param :type, String, :desc => N_("CDN configuration type. One of %s.") % CdnConfiguration::TYPES, :required => true
139
+ param :type, String, :desc => N_("CDN configuration type. One of %s.") % CdnConfiguration::TYPES.join(", "), :required => true
138
140
  param :url, String, :desc => N_("Upstream foreman server to sync CDN content from. Relevant only for 'upstream_server' type.")
139
141
  param :username, String, :desc => N_("Username for authentication. Relevant only for 'upstream_server' type.")
140
142
  param :password, String, :desc => N_("Password for authentication. Relevant only for 'upstream_server' type.")
@@ -67,7 +67,9 @@ module Katello
67
67
  end
68
68
 
69
69
  def all_for_content_view_filter(filter, _collection)
70
- PackageGroup.joins(:repositories).merge(filter.applicable_repos)
70
+ available_ids = PackageGroup.joins(:repositories).merge(filter.applicable_repos)&.pluck(:pulp_id) || []
71
+ added_ids = filter&.package_group_rules&.pluck(:uuid) || []
72
+ PackageGroup.where(pulp_id: available_ids + added_ids)
71
73
  end
72
74
 
73
75
  def default_sort
@@ -6,7 +6,7 @@ module Katello
6
6
  param :ids, Array, :desc => N_("List of repository ids"), :required => true
7
7
  def destroy_repositories
8
8
  deletion_authorized_repositories = @repositories.deletable
9
- unpromoted_repos = deletion_authorized_repositories.reject { |repo| repo.promoted? }
9
+ unpromoted_repos = deletion_authorized_repositories.reject { |repo| repo.promoted? && repo.content_views.generated_for_none.exists? }
10
10
 
11
11
  messages1 = format_bulk_action_messages(
12
12
  :success => "",
@@ -7,7 +7,7 @@ module Katello
7
7
  generic_repo_wrap_params << option.name
8
8
  end
9
9
 
10
- repo_wrap_params = RootRepository.attribute_names.concat([:ignore_global_proxy, :mirror_on_sync]) + generic_repo_wrap_params
10
+ repo_wrap_params = RootRepository.attribute_names + [:mirror_on_sync] + generic_repo_wrap_params
11
11
 
12
12
  wrap_parameters :repository, :include => repo_wrap_params
13
13