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
@@ -9,8 +9,12 @@ import mockTraceData from './traces.fixtures.json';
9
9
  import mockResolveTraceTask from './resolveTraces.fixtures.json';
10
10
  import emptyTraceResults from './tracerEmptyTraceResults.fixtures.json';
11
11
  import mockJobInvocationStatus from './tracerEnableJobInvocation.fixtures.json';
12
+ import mockBookmarkData from './bookmarks.fixtures.json';
12
13
 
13
14
  const hostName = 'client.example.com';
15
+ const tracesBookmarks = foremanApi.getApiUrl('/bookmarks?search=controller%3Dkatello_host_tracers');
16
+
17
+
14
18
  const tracerInstalledResponse = {
15
19
  id: 1,
16
20
  name: 'client.example.com',
@@ -42,18 +46,20 @@ const renderOptions = isTracerInstalled => ({ // sets initial Redux state
42
46
 
43
47
  const actionMenuToTheRightOf = node => node.nextElementSibling.firstElementChild.firstElementChild;
44
48
 
45
- const hostTraces = foremanApi.getApiUrl('/hosts/1/traces?per_page=20&page=1');
49
+ const hostTraces = foremanApi.getApiUrl('/hosts/1/traces');
46
50
  const autocompleteUrl = '/hosts/1/traces/auto_complete_search';
47
51
  const jobInvocations = foremanApi.getApiUrl('/job_invocations');
48
52
 
49
53
  let firstTrace;
50
54
  let searchDelayScope;
51
55
  let autoSearchScope;
56
+ let bookmarkScope;
52
57
 
53
58
  describe('With tracer installed', () => {
54
59
  beforeEach(() => {
55
60
  const { results } = mockTraceData;
56
61
  [firstTrace] = results;
62
+ bookmarkScope = nockInstance.get(tracesBookmarks).reply(200, mockBookmarkData);
57
63
  searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
58
64
  autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
59
65
  });
@@ -61,6 +67,7 @@ describe('With tracer installed', () => {
61
67
  afterEach(() => {
62
68
  assertNockRequest(searchDelayScope);
63
69
  assertNockRequest(autoSearchScope);
70
+ assertNockRequest(bookmarkScope);
64
71
  nock.cleanAll();
65
72
  });
66
73
 
@@ -71,6 +78,7 @@ describe('With tracer installed', () => {
71
78
  // return tracedata results when we look for traces
72
79
  const scope = nockInstance
73
80
  .get(hostTraces)
81
+ .query(true)
74
82
  .reply(200, mockTraceData);
75
83
 
76
84
 
@@ -89,13 +97,14 @@ describe('With tracer installed', () => {
89
97
 
90
98
  const scope = nockInstance
91
99
  .get(hostTraces)
100
+ .query(true)
92
101
  .reply(200, emptyTraceResults);
93
102
 
94
103
 
95
104
  const { queryByText } = renderWithRedux(<TracesTab />, renderOptions(true));
96
105
 
97
106
  // Assert that there are not any traces showing on the screen.
98
- await patientlyWaitFor(() => expect(queryByText('This host currently does not have traces.')).toBeInTheDocument());
107
+ await patientlyWaitFor(() => expect(queryByText('No applications to restart')).toBeInTheDocument());
99
108
  // Assert request was made and completed, see helper function
100
109
  assertNockRequest(autocompleteScope);
101
110
  assertNockRequest(scope, done);
@@ -107,6 +116,7 @@ describe('With tracer installed', () => {
107
116
 
108
117
  const scope = nockInstance
109
118
  .get(hostTraces)
119
+ .query(true)
110
120
  .times(2)
111
121
  .reply(200, mockTraceData);
112
122
  const resolveTracesScope = nockInstance
@@ -146,6 +156,7 @@ describe('With tracer installed', () => {
146
156
 
147
157
  const scope = nockInstance
148
158
  .get(hostTraces)
159
+ .query(true)
149
160
  .times(2)
150
161
  .reply(200, mockTraceData);
151
162
  const resolveTracesScope = nockInstance
@@ -183,6 +194,7 @@ describe('With tracer installed', () => {
183
194
  const thirdTrace = mockTraceData.results[2];
184
195
  const scope = nockInstance
185
196
  .get(hostTraces)
197
+ .query(true)
186
198
  .times(2)
187
199
  .reply(200, mockTraceData);
188
200
  const jobInvocationBody = ({ job_invocation: { inputs } }) =>
@@ -225,6 +237,7 @@ describe('With tracer installed', () => {
225
237
 
226
238
  const scope = nockInstance
227
239
  .get(hostTraces)
240
+ .query(true)
228
241
  .reply(200, mockTraceData);
229
242
  const resolveTracesScope = nockInstance
230
243
  .post(jobInvocations)
@@ -260,6 +273,7 @@ describe('With tracer installed', () => {
260
273
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
261
274
  const scope = nockInstance
262
275
  .get(hostTraces)
276
+ .query(true)
263
277
  .reply(200, mockTraceData);
264
278
 
265
279
  const { getByText } = renderWithRedux(
@@ -294,6 +308,7 @@ describe('With tracer installed', () => {
294
308
  const feature = REX_FEATURES.KATELLO_HOST_TRACER_RESOLVE;
295
309
  const scope = nockInstance
296
310
  .get(hostTraces)
311
+ .query(true)
297
312
  .reply(200, mockTraceData);
298
313
 
299
314
  const { getByLabelText, queryByText } = renderWithRedux(
@@ -336,6 +351,7 @@ describe('With tracer installed', () => {
336
351
 
337
352
  const scope = nockInstance
338
353
  .get(hostTraces)
354
+ .query(true)
339
355
  .reply(200, mockTraceData);
340
356
 
341
357
  const { getByLabelText } = renderWithRedux(
@@ -52,3 +52,9 @@ export const errataInstallUrl = ({ hostname, search }) => createJob({
52
52
  feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH,
53
53
  inputs: { [ERRATA_SEARCH_QUERY]: search },
54
54
  });
55
+
56
+ export const katelloModuleStreamActionUrl = ({ hostname, action, moduleSpec }) => createJob({
57
+ hostname,
58
+ feature: REX_FEATURES.KATELLO_HOST_MODULE_STREAM_ACTION,
59
+ inputs: { action, module_spec: moduleSpec },
60
+ });
@@ -15,6 +15,7 @@ import Content from '../../scenes/Content';
15
15
  import ContentDetails from '../../scenes/Content/Details';
16
16
  import withHeader from './withHeaders';
17
17
  import ChangeContentSource from '../../scenes/Hosts/ChangeContentSource';
18
+ import AlternateContentSource from '../../scenes/AlternateContentSources';
18
19
 
19
20
  // eslint-disable-next-line import/prefer-default-export
20
21
  export const links = [
@@ -80,4 +81,8 @@ export const links = [
80
81
  path: 'change_host_content_source',
81
82
  component: WithOrganization(withHeader(ChangeContentSource, { title: __('Change host content source') })),
82
83
  },
84
+ {
85
+ path: 'labs/alternate_content_sources',
86
+ component: WithOrganization(withHeader(AlternateContentSource, { title: __('Alternate Content Sources') })),
87
+ },
83
88
  ];
@@ -6,31 +6,54 @@ import { translate as __ } from 'foremanReact/common/I18n';
6
6
  import SystemStatuses from './components/extensions/about';
7
7
  import RegistrationCommands from './components/extensions/RegistrationCommands';
8
8
  import ContentTab from './components/extensions/HostDetails/Tabs/ContentTab';
9
- import ContentViewDetailsCard from './components/extensions/HostDetails/Cards/ContentViewDetailsCard';
9
+ import ContentViewDetailsCard from './components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard';
10
10
  import ErrataOverviewCard from './components/extensions/HostDetails/Cards/ErrataOverviewCard';
11
+ import InstalledProductsCard from './components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard';
12
+ import RegistrationCard from './components/extensions/HostDetails/DetailsTabCards/RegistrationCard';
11
13
 
12
- // import SubscriptionTab from './components/extensions/HostDetails/Tabs/SubscriptionTab';
13
14
  import RepositorySetsTab from './components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab';
14
15
  import TracesTab from './components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js';
15
16
  import extendReducer from './components/extensions/reducers';
16
17
  import rootReducer from './redux/reducers';
18
+ import HostCollectionsCard from './components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard';
17
19
  import { hostIsNotRegistered } from './components/extensions/HostDetails/hostDetailsHelpers';
20
+ import SystemPropertiesCardExtensions from './components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions';
21
+ import HostActionsBar from './components/extensions/HostDetails/ActionsBar';
18
22
 
19
23
  registerReducer('katelloExtends', extendReducer);
20
24
  registerReducer('katello', rootReducer);
21
25
 
22
26
  addGlobalFill('aboutFooterSlot', '[katello]AboutSystemStatuses', <SystemStatuses key="katello-system-statuses" />, 100);
23
27
  addGlobalFill('registrationAdvanced', '[katello]RegistrationCommands', <RegistrationCommands key="katello-reg" />, 100);
28
+
29
+ // Host details page tabs
24
30
  addGlobalFill('host-details-page-tabs', 'Content', <ContentTab key="content" />, 900, { title: __('Content'), hideTab: hostIsNotRegistered });
25
- /* eslint-disable max-len */
26
- // addGlobalFill('host-details-page-tabs', 'Subscription', <SubscriptionTab key="subscription" />, 100, { title: __('Subscription') });
27
31
  addGlobalFill('host-details-page-tabs', 'Traces', <TracesTab key="traces" />, 800, { title: __('Traces'), hideTab: hostIsNotRegistered });
28
32
  addGlobalFill('host-details-page-tabs', 'Repository sets', <RepositorySetsTab key="repository-sets" />, 700, { title: __('Repository sets'), hideTab: hostIsNotRegistered });
29
33
 
34
+ // Overview tab cards
30
35
  addGlobalFill(
31
- 'details-cards',
32
- 'Content View Details',
36
+ 'host-overview-cards',
37
+ 'Content view details',
33
38
  <ContentViewDetailsCard key="content-view-details" />,
34
39
  2000,
35
40
  );
36
- addGlobalFill('details-cards', 'Installable errata', <ErrataOverviewCard key="errata-overview" />, 1900);
41
+ addGlobalFill(
42
+ 'host-overview-cards',
43
+ 'Host collections',
44
+ <HostCollectionsCard key="host-collections-details" />,
45
+ 700,
46
+ );
47
+ addGlobalFill('host-overview-cards', 'Installable errata', <ErrataOverviewCard key="errata-overview" />, 1900);
48
+
49
+ // Details tab cards & card extensions
50
+ addGlobalFill('host-tab-details-cards', 'Installed products', <InstalledProductsCard key="installed-products" />, 100);
51
+ addGlobalFill('host-tab-details-cards', 'Registration details', <RegistrationCard key="registration-details" />, 200);
52
+ addGlobalFill('host-details-tab-properties-1', 'Subscription UUID', <SystemPropertiesCardExtensions key="subscription-uuid" />);
53
+
54
+ addGlobalFill(
55
+ 'host-details-kebab',
56
+ 'katello-host-details-kebab',
57
+ <HostActionsBar key="katello-host-details-kebab" />,
58
+ 100,
59
+ );
@@ -1,7 +1,11 @@
1
+ import nock from 'nock';
2
+
1
3
  // runs before each test to make sure console.error output will
2
4
  // fail a test (i.e. default PropType missing). Check the error
3
5
  // output and traceback for actual error.
6
+ const originalConsoleError = global.console.error;
4
7
  global.console.error = (error, stack) => {
8
+ originalConsoleError(error); // ensure error is printed to console
5
9
  /* eslint-disable-next-line no-console */
6
10
  if (stack) console.log(stack); // Prints out original stack trace
7
11
  throw new Error(error);
@@ -14,3 +18,12 @@ afterAll(() => {
14
18
  jest.resetModules();
15
19
  if (global.gc) global.gc();
16
20
  });
21
+
22
+ beforeEach(() => {
23
+ if (!nock.isActive()) { nock.activate(); }
24
+ });
25
+
26
+ afterEach(() => {
27
+ nock.restore();
28
+ });
29
+
@@ -44,7 +44,7 @@ export const createEnabledRepoParams = (extendedParams = {}) => {
44
44
 
45
45
  export const disableRepository = repository => async (dispatch) => {
46
46
  const {
47
- productId, contentId, arch, releasever,
47
+ productId, contentId, arch, releasever, id,
48
48
  } = repository;
49
49
 
50
50
  const repoData = {
@@ -52,6 +52,7 @@ export const disableRepository = repository => async (dispatch) => {
52
52
  product_id: productId,
53
53
  basearch: arch,
54
54
  releasever,
55
+ repository_id: id,
55
56
  };
56
57
  dispatch({ type: DISABLE_REPOSITORY_REQUEST, repository });
57
58
  const url = `/products/${productId}/repository_sets/${contentId}/disable`;
@@ -14,26 +14,27 @@ const recommendedRepositoriesRHEL = [
14
14
  'rhel-8-for-x86_64-baseos-kickstart',
15
15
  'rhel-8-for-x86_64-appstream-rpms',
16
16
  'rhel-8-for-x86_64-appstream-kickstart',
17
+ 'rhel-8-for-x86_64-baseos-eus-rpms',
18
+ 'rhel-8-for-x86_64-appstream-eus-rpms',
17
19
  'rhel-7-server-rpms',
18
20
  'rhel-7-server-optional-rpms',
19
21
  'rhel-7-server-extras-rpms',
20
- 'rhel-7-server-eus-rpms',
21
22
  'rhel-7-server-kickstart',
22
- 'rhel-6-server-els-rpms',
23
- 'rhel-6-server-kickstart',
24
23
  ];
25
24
 
26
25
  const recommendedRepositoriesSatTools = [
27
- 'satellite-tools-6.10-for-rhel-8-x86_64-rpms',
28
- 'rhel-7-server-satellite-tools-6.10-rpms',
29
- 'rhel-6-server-els-satellite-tools-6.10-rpms',
30
- 'rhel-7-server-satellite-maintenance-6-rpms',
26
+ 'satellite-client-6-for-rhel-8-x86_64-rpms',
27
+ 'rhel-7-server-satellite-client-6-rpms',
28
+ 'rhel-7-server-satellite-maintenance-6.11-rpms',
29
+ 'rhel-6-server-els-satellite-client-6-rpms',
31
30
  ];
32
31
 
33
32
  const recommendedRepositoriesMisc = [
34
33
  'rhel-server-rhscl-7-rpms',
35
- 'rhel-7-server-satellite-capsule-6.10-rpms',
34
+ 'rhel-7-server-satellite-capsule-6.11-rpms',
35
+ 'satellite-capsule-6.11-for-rhel-8-x86_64-rpms',
36
36
  'rhel-7-server-ansible-2.9-rpms',
37
+ 'ansible-2-for-rhel-8-x86_64-rpms',
37
38
  ];
38
39
 
39
40
  const recommendedRepositorySetLables = recommendedRepositoriesRHEL
@@ -0,0 +1,53 @@
1
+ import { API_OPERATIONS, APIActions, get, post } from 'foremanReact/redux/API';
2
+ import { translate as __ } from 'foremanReact/common/I18n';
3
+ import api, { orgId } from '../../services/api';
4
+ import ACS_KEY, { CREATE_ACS_KEY, DELETE_ACS_KEY } from './ACSConstants';
5
+ import { getResponseErrorMsgs } from '../../utils/helpers';
6
+
7
+ const acsSuccessToast = (response) => {
8
+ const { data: { name } } = response;
9
+ return __(`Alternate content source ${name} created`);
10
+ };
11
+
12
+ export const acsErrorToast = (error) => {
13
+ const message = getResponseErrorMsgs(error.response);
14
+ return message;
15
+ };
16
+
17
+ export const createACSParams = (extraParams) => {
18
+ const getParams = {
19
+ organization_id: orgId(),
20
+ ...extraParams,
21
+ };
22
+ return getParams;
23
+ };
24
+
25
+ const getAlternateContentSources = (extraParams, id = '') => get({
26
+ type: API_OPERATIONS.GET,
27
+ key: ACS_KEY + id,
28
+ url: api.getApiUrl('/alternate_content_sources'),
29
+ params: createACSParams(extraParams),
30
+ });
31
+
32
+ export const createACS = params => post({
33
+ type: API_OPERATIONS.POST,
34
+ key: CREATE_ACS_KEY,
35
+ url: api.getApiUrl('/alternate_content_sources'),
36
+ params,
37
+ successToast: response => acsSuccessToast(response),
38
+ errorToast: error => acsErrorToast(error),
39
+ });
40
+
41
+ export const deleteACS = (acsId, handleSuccess) => APIActions.delete({
42
+ type: API_OPERATIONS.DELETE,
43
+ key: DELETE_ACS_KEY,
44
+ url: api.getApiUrl(`/alternate_content_sources/${acsId}`),
45
+ handleSuccess,
46
+ successToast: () => __('Alternate content source deleted'),
47
+ errorToast: error => __(`Something went wrong while deleting this alternate content source! ${getResponseErrorMsgs(error.response)}`),
48
+ });
49
+
50
+ export default getAlternateContentSources;
51
+
52
+ // acs = Katello::AlternateContentSource.new
53
+ // (name:"acs", label:"acs", alternate_content_source_type:"custom", base_url:"abcdef")
@@ -0,0 +1,4 @@
1
+ const ACS_KEY = 'ACS';
2
+ export const CREATE_ACS_KEY = 'ACS_CREATE';
3
+ export const DELETE_ACS_KEY = 'ACS_DELETE';
4
+ export default ACS_KEY;
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { translate as __ } from 'foremanReact/common/I18n';
3
+ import { Grid, GridItem, TextContent, Text, TextVariants } from '@patternfly/react-core';
4
+ import ACSTable from './MainTable/ACSTable';
5
+
6
+ const ACSIndexPage = () => (
7
+ <>
8
+ <Grid className="margin-24">
9
+ <GridItem span={12}>
10
+ <TextContent>
11
+ <Text component={TextVariants.h1}>{__('Alternate content sources')}</Text>
12
+ </TextContent>
13
+ </GridItem>
14
+ </Grid>
15
+ <Grid>
16
+ <GridItem span={12}>
17
+ <ACSTable />
18
+ </GridItem>
19
+ </Grid>
20
+ </>
21
+ );
22
+
23
+ export default ACSIndexPage;
@@ -0,0 +1,15 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import ACS_KEY from './ACSConstants';
8
+
9
+ export const selectAlternateContentSources = (state, index = '') => selectAPIResponse(state, ACS_KEY + index) || {};
10
+
11
+ export const selectAlternateContentSourcesStatus = (state, index = '') =>
12
+ selectAPIStatus(state, ACS_KEY + index) || STATUS.PENDING;
13
+
14
+ export const selectAlternateContentSourcesError = (state, index = '') =>
15
+ selectAPIError(state, ACS_KEY + index);
@@ -0,0 +1,152 @@
1
+ import React, { useState, useCallback } from 'react';
2
+ import { useSelector, useDispatch } from 'react-redux';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import { Button } from '@patternfly/react-core';
5
+ import { TableVariant, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table';
6
+ import TableWrapper from '../../../components/Table/TableWrapper';
7
+ import {
8
+ selectAlternateContentSources, selectAlternateContentSourcesError,
9
+ selectAlternateContentSourcesStatus,
10
+ } from '../ACSSelectors';
11
+ import { useTableSort } from '../../../components/Table/TableHooks';
12
+ import getAlternateContentSources, { deleteACS } from '../ACSActions';
13
+
14
+ const ACSTable = () => {
15
+ const response = useSelector(selectAlternateContentSources);
16
+ const status = useSelector(selectAlternateContentSourcesStatus);
17
+ const error = useSelector(selectAlternateContentSourcesError);
18
+ const [searchQuery, updateSearchQuery] = useState('');
19
+ const dispatch = useDispatch();
20
+ const { results, ...metadata } = response;
21
+ const columnHeaders = [
22
+ __('Name'),
23
+ __('Type'),
24
+ __('Id'),
25
+ ];
26
+
27
+ const COLUMNS_TO_SORT_PARAMS = {
28
+ [columnHeaders[0]]: 'name',
29
+ [columnHeaders[1]]: 'alternate_content_source_type',
30
+ };
31
+
32
+ const {
33
+ pfSortParams, apiSortParams,
34
+ activeSortColumn, activeSortDirection,
35
+ } = useTableSort({
36
+ allColumns: columnHeaders,
37
+ columnsToSortParams: COLUMNS_TO_SORT_PARAMS,
38
+ initialSortColumnName: 'Name',
39
+ });
40
+
41
+ const fetchItems = useCallback(
42
+ params =>
43
+ getAlternateContentSources({
44
+ ...apiSortParams,
45
+ ...params,
46
+ }),
47
+ [apiSortParams],
48
+ );
49
+
50
+ // const createButtonOnclick = () => {
51
+ // let params = {
52
+ // name: `test_acs-${Math.random()}`,
53
+ // label: `test_acs-${Math.random()}`,
54
+ // base_url: "https://fixtures.pulpproject.org/",
55
+ // subpaths: ["file/", "package/"],
56
+ // smart_proxy_ids:[1],
57
+ // content_type:"yum",
58
+ // alternate_content_source_type:"custom"
59
+ // };
60
+ // dispatch(createACS(params));
61
+ // };
62
+
63
+ const onDelete = (id) => {
64
+ dispatch(deleteACS(id, () =>
65
+ dispatch(getAlternateContentSources())));
66
+ };
67
+
68
+ const createButtonOnclick = () => {
69
+ /* eslint-disable-next-line no-console */
70
+ console.log('Dispatch create!');
71
+ };
72
+
73
+ const rowDropdownItems = ({ id }) => [
74
+ {
75
+ title: 'Delete',
76
+ ouiaId: `remove-acs-${id}`,
77
+ onClick: () => {
78
+ onDelete(id);
79
+ },
80
+ },
81
+ ];
82
+
83
+ const emptyContentTitle = __("You currently don't have any alternate content sources.");
84
+ const emptyContentBody = __('An alternate content source can be added by using the "Add source" button above.');
85
+ const emptySearchTitle = __('No matching alternate content sources found');
86
+ const emptySearchBody = __('Try changing your search settings.');
87
+ /* eslint-disable react/no-array-index-key */
88
+ return (
89
+ <TableWrapper
90
+ {...{
91
+ metadata,
92
+ emptyContentTitle,
93
+ emptyContentBody,
94
+ emptySearchTitle,
95
+ emptySearchBody,
96
+ searchQuery,
97
+ updateSearchQuery,
98
+ error,
99
+ status,
100
+ fetchItems,
101
+ }}
102
+ ouiaId="alternate-content-sources-table"
103
+ variant={TableVariant.compact}
104
+ additionalListeners={[activeSortColumn, activeSortDirection]}
105
+ autocompleteEndpoint="/alternate_content_sources/auto_complete_search"
106
+ actionButtons={
107
+ <Button ouiaId="create-acs" onClick={createButtonOnclick} variant="primary" aria-label="create_acs">
108
+ {__('Add source')}
109
+ </Button>
110
+ }
111
+ >
112
+ <Thead>
113
+ <Tr>
114
+ {columnHeaders.map(col => (
115
+ <Th
116
+ key={col}
117
+ sort={COLUMNS_TO_SORT_PARAMS[col] ? pfSortParams(col) : undefined}
118
+ >
119
+ {col}
120
+ </Th>
121
+ ))}
122
+ </Tr>
123
+ </Thead>
124
+ <Tbody>
125
+ {results?.map((acs, index) => {
126
+ const {
127
+ id,
128
+ name,
129
+ alternate_content_source_type: acsType,
130
+ } = acs;
131
+ return (
132
+ <Tr key={index}>
133
+ <Td>{name}</Td>
134
+ <Td>{acsType}</Td>
135
+ <Td>{id}</Td>
136
+ <Td
137
+ actions={{
138
+ items: rowDropdownItems(acs),
139
+ }}
140
+ />
141
+ </Tr>
142
+ );
143
+ })
144
+ }
145
+ </Tbody>
146
+ </TableWrapper>
147
+ );
148
+ /* eslint-enable react/no-array-index-key */
149
+ };
150
+
151
+ export default ACSTable;
152
+
@@ -0,0 +1,91 @@
1
+ {
2
+ "total": 3,
3
+ "subtotal": 3,
4
+ "selectable": 3,
5
+ "page": "1",
6
+ "per_page": "20",
7
+ "error": null,
8
+ "search": null,
9
+ "sort": {
10
+ "by": "name",
11
+ "order": "asc"
12
+ },
13
+ "results": [
14
+ {
15
+ "name": "test_acs_file_1",
16
+ "base_url": "https://fixtures.pulpproject.org/",
17
+ "subpaths": [
18
+ "file/"
19
+ ],
20
+ "content_type": "file",
21
+ "alternate_content_source_type": "custom",
22
+ "smart_proxies": [
23
+ {
24
+ "id": 1,
25
+ "name": "centos7-katello-devel-stable.example.com",
26
+ "url": "https://centos7-katello-devel-stable.example.com:9090",
27
+ "created_at": "2022-05-02T10:17:57.044-04:00",
28
+ "updated_at": "2022-05-02T10:24:21.666-04:00",
29
+ "pubkey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3bzUlVINCZqDFEcBmWI3d3rytod1XtlGNrTp4JXeLVmT74/gbpeUkM221RZxfNDrU6BPHxwbuzeAF3/DU4nT6w9WkRSemeNxzLSZPqNiJuqjDwIkI2KTmTkyOF+jYObC+0ir7pCD7IdCVdf2RxJIJjPB8GnLYAzBjPRwtUFuDZfzpBGf4iTlmMd8oSfSnUOSrdI30ag2DkvoqGII+z+QVIGRj/bKL55DW4C/5ykH5B7kpZSFfRcmYzA6f1bNHuWuOkopkT3CcpotEb7kx3qeh16skJsgPABYBTm41klUPIFJS609dF8jJwbF+ZhNkIv96OYT/7nZR+Kcf/S2qBbXP foreman-proxy@centos7-katello-devel-stable.example.com",
30
+ "expired_logs": "0",
31
+ "puppet_path": null,
32
+ "download_policy": "on_demand"
33
+ }
34
+ ],
35
+ "upstream_username": null,
36
+ "id": 3,
37
+ "label": "test_acs_file_1",
38
+ "description": null
39
+ },
40
+ {
41
+ "name": "test_acs_file_2",
42
+ "base_url": "https://fixtures.pulpproject.org/",
43
+ "subpaths": [
44
+ "file/"
45
+ ],
46
+ "content_type": "file",
47
+ "alternate_content_source_type": "custom",
48
+ "smart_proxies": [
49
+ {
50
+ "id": 1,
51
+ "name": "centos7-katello-devel-stable.example.com",
52
+ "url": "https://centos7-katello-devel-stable.example.com:9090",
53
+ "created_at": "2022-05-02T10:17:57.044-04:00",
54
+ "updated_at": "2022-05-02T10:24:21.666-04:00",
55
+ "pubkey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3bzUlVINCZqDFEcBmWI3d3rytod1XtlGNrTp4JXeLVmT74/gbpeUkM221RZxfNDrU6BPHxwbuzeAF3/DU4nT6w9WkRSemeNxzLSZPqNiJuqjDwIkI2KTmTkyOF+jYObC+0ir7pCD7IdCVdf2RxJIJjPB8GnLYAzBjPRwtUFuDZfzpBGf4iTlmMd8oSfSnUOSrdI30ag2DkvoqGII+z+QVIGRj/bKL55DW4C/5ykH5B7kpZSFfRcmYzA6f1bNHuWuOkopkT3CcpotEb7kx3qeh16skJsgPABYBTm41klUPIFJS609dF8jJwbF+ZhNkIv96OYT/7nZR+Kcf/S2qBbXP foreman-proxy@centos7-katello-devel-stable.example.com",
56
+ "expired_logs": "0",
57
+ "puppet_path": null,
58
+ "download_policy": "on_demand"
59
+ }
60
+ ],
61
+ "upstream_username": null,
62
+ "id": 1,
63
+ "label": "test_acs_file_2",
64
+ "description": null
65
+ },
66
+ {
67
+ "name": "test_acs_yum_1",
68
+ "base_url": "https://fixtures.pulpproject.org/",
69
+ "subpaths": ["file/", "package/"],
70
+ "content_type": "yum",
71
+ "alternate_content_source_type": "custom",
72
+ "smart_proxies": [
73
+ {
74
+ "id": 1,
75
+ "name": "centos7-katello-devel-stable.example.com",
76
+ "url": "https://centos7-katello-devel-stable.example.com:9090",
77
+ "created_at": "2022-05-02T10:17:57.044-04:00",
78
+ "updated_at": "2022-05-02T10:24:21.666-04:00",
79
+ "pubkey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3bzUlVINCZqDFEcBmWI3d3rytod1XtlGNrTp4JXeLVmT74/gbpeUkM221RZxfNDrU6BPHxwbuzeAF3/DU4nT6w9WkRSemeNxzLSZPqNiJuqjDwIkI2KTmTkyOF+jYObC+0ir7pCD7IdCVdf2RxJIJjPB8GnLYAzBjPRwtUFuDZfzpBGf4iTlmMd8oSfSnUOSrdI30ag2DkvoqGII+z+QVIGRj/bKL55DW4C/5ykH5B7kpZSFfRcmYzA6f1bNHuWuOkopkT3CcpotEb7kx3qeh16skJsgPABYBTm41klUPIFJS609dF8jJwbF+ZhNkIv96OYT/7nZR+Kcf/S2qBbXP foreman-proxy@centos7-katello-devel-stable.example.com",
80
+ "expired_logs": "0",
81
+ "puppet_path": null,
82
+ "download_policy": "on_demand"
83
+ }
84
+ ],
85
+ "upstream_username": null,
86
+ "id": 4,
87
+ "label": "test_acs_yum_1",
88
+ "description": null
89
+ }
90
+ ]
91
+ }