katello 4.4.0.2 → 4.5.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -9,8 +9,18 @@ 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
+ jest.mock('../../hostDetailsHelpers', () => ({
18
+ ...jest.requireActual('../../hostDetailsHelpers'),
19
+ userPermissionsFromHostDetails: () => ({
20
+ create_job_invocations: true,
21
+ }),
22
+ }));
23
+
14
24
  const tracerInstalledResponse = {
15
25
  id: 1,
16
26
  name: 'client.example.com',
@@ -42,18 +52,20 @@ const renderOptions = isTracerInstalled => ({ // sets initial Redux state
42
52
 
43
53
  const actionMenuToTheRightOf = node => node.nextElementSibling.firstElementChild.firstElementChild;
44
54
 
45
- const hostTraces = foremanApi.getApiUrl('/hosts/1/traces?per_page=20&page=1');
55
+ const hostTraces = foremanApi.getApiUrl('/hosts/1/traces');
46
56
  const autocompleteUrl = '/hosts/1/traces/auto_complete_search';
47
57
  const jobInvocations = foremanApi.getApiUrl('/job_invocations');
48
58
 
49
59
  let firstTrace;
50
60
  let searchDelayScope;
51
61
  let autoSearchScope;
62
+ let bookmarkScope;
52
63
 
53
64
  describe('With tracer installed', () => {
54
65
  beforeEach(() => {
55
66
  const { results } = mockTraceData;
56
67
  [firstTrace] = results;
68
+ bookmarkScope = nockInstance.get(tracesBookmarks).reply(200, mockBookmarkData);
57
69
  searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
58
70
  autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
59
71
  });
@@ -61,6 +73,7 @@ describe('With tracer installed', () => {
61
73
  afterEach(() => {
62
74
  assertNockRequest(searchDelayScope);
63
75
  assertNockRequest(autoSearchScope);
76
+ assertNockRequest(bookmarkScope);
64
77
  nock.cleanAll();
65
78
  });
66
79
 
@@ -71,6 +84,7 @@ describe('With tracer installed', () => {
71
84
  // return tracedata results when we look for traces
72
85
  const scope = nockInstance
73
86
  .get(hostTraces)
87
+ .query(true)
74
88
  .reply(200, mockTraceData);
75
89
 
76
90
 
@@ -89,13 +103,14 @@ describe('With tracer installed', () => {
89
103
 
90
104
  const scope = nockInstance
91
105
  .get(hostTraces)
106
+ .query(true)
92
107
  .reply(200, emptyTraceResults);
93
108
 
94
109
 
95
110
  const { queryByText } = renderWithRedux(<TracesTab />, renderOptions(true));
96
111
 
97
112
  // Assert that there are not any traces showing on the screen.
98
- await patientlyWaitFor(() => expect(queryByText('This host currently does not have traces.')).toBeInTheDocument());
113
+ await patientlyWaitFor(() => expect(queryByText('No applications to restart')).toBeInTheDocument());
99
114
  // Assert request was made and completed, see helper function
100
115
  assertNockRequest(autocompleteScope);
101
116
  assertNockRequest(scope, done);
@@ -107,7 +122,7 @@ describe('With tracer installed', () => {
107
122
 
108
123
  const scope = nockInstance
109
124
  .get(hostTraces)
110
- .times(2)
125
+ .query(true)
111
126
  .reply(200, mockTraceData);
112
127
  const resolveTracesScope = nockInstance
113
128
  .post(jobInvocations)
@@ -130,7 +145,7 @@ describe('With tracer installed', () => {
130
145
  const restartAppButton = getByText('Restart app');
131
146
  // wait 50ms so that the button is enabled
132
147
  await waitFor(() => {
133
- expect(getByText('Restart app')).not.toBeDisabled();
148
+ expect(restartAppButton.parentElement).not.toHaveClass('pf-m-disabled');
134
149
  restartAppButton.click();
135
150
  });
136
151
 
@@ -146,7 +161,7 @@ describe('With tracer installed', () => {
146
161
 
147
162
  const scope = nockInstance
148
163
  .get(hostTraces)
149
- .times(2)
164
+ .query(true)
150
165
  .reply(200, mockTraceData);
151
166
  const resolveTracesScope = nockInstance
152
167
  .post(jobInvocations)
@@ -183,7 +198,7 @@ describe('With tracer installed', () => {
183
198
  const thirdTrace = mockTraceData.results[2];
184
199
  const scope = nockInstance
185
200
  .get(hostTraces)
186
- .times(2)
201
+ .query(true)
187
202
  .reply(200, mockTraceData);
188
203
  const jobInvocationBody = ({ job_invocation: { inputs } }) =>
189
204
  inputs[TRACES_SEARCH_QUERY] === `id !^ (${firstTrace.id},${thirdTrace.id})`;
@@ -225,6 +240,7 @@ describe('With tracer installed', () => {
225
240
 
226
241
  const scope = nockInstance
227
242
  .get(hostTraces)
243
+ .query(true)
228
244
  .reply(200, mockTraceData);
229
245
  const resolveTracesScope = nockInstance
230
246
  .post(jobInvocations)
@@ -260,6 +276,7 @@ describe('With tracer installed', () => {
260
276
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
261
277
  const scope = nockInstance
262
278
  .get(hostTraces)
279
+ .query(true)
263
280
  .reply(200, mockTraceData);
264
281
 
265
282
  const { getByText } = renderWithRedux(
@@ -294,6 +311,7 @@ describe('With tracer installed', () => {
294
311
  const feature = REX_FEATURES.KATELLO_HOST_TRACER_RESOLVE;
295
312
  const scope = nockInstance
296
313
  .get(hostTraces)
314
+ .query(true)
297
315
  .reply(200, mockTraceData);
298
316
 
299
317
  const { getByLabelText, queryByText } = renderWithRedux(
@@ -336,6 +354,7 @@ describe('With tracer installed', () => {
336
354
 
337
355
  const scope = nockInstance
338
356
  .get(hostTraces)
357
+ .query(true)
339
358
  .reply(200, mockTraceData);
340
359
 
341
360
  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
+ });
@@ -25,4 +25,22 @@ export const hostIsNotRegistered = ({ hostDetails }) => {
25
25
 
26
26
  export const hostIsRegistered = ({ hostDetails }) => !hostIsNotRegistered({ hostDetails });
27
27
 
28
+ export const userPermissionsFromHostDetails = ({ hostDetails }) => {
29
+ const {
30
+ permissions: hostPermissions,
31
+ content_facet_attributes: cfAttributes = {},
32
+ } = hostDetails;
33
+ return { ...hostPermissions, ...cfAttributes?.permissions };
34
+ };
35
+
36
+ // requiredPermissions is an array
37
+ // userPermissions is an object, e.g. { view_hosts: true }
38
+ export const hasRequiredPermissions = (requiredPermissions = [], userPermissions) => {
39
+ const permittedActions = Object.keys(userPermissions).filter(key => userPermissions[key]);
40
+ return requiredPermissions.every(permission => permittedActions.includes(permission));
41
+ };
42
+
43
+ export const missingRequiredPermissions = (requiredPermissions = [], userPermissions) =>
44
+ !hasRequiredPermissions(requiredPermissions, userPermissions);
45
+
28
46
  export default defaultRemoteActionMethod;
@@ -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
- import RepositorySetsTab from './components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab';
14
14
  import TracesTab from './components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js';
15
15
  import extendReducer from './components/extensions/reducers';
16
16
  import rootReducer from './redux/reducers';
17
+ import HostCollectionsCard from './components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard';
17
18
  import { hostIsNotRegistered } from './components/extensions/HostDetails/hostDetailsHelpers';
19
+ import SystemPropertiesCardExtensions from './components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions';
20
+ import HostActionsBar from './components/extensions/HostDetails/ActionsBar';
21
+ import RecentCommunicationCardExtensions from './components/extensions/HostDetails/DetailsTabCards/RecentCommunicationCardExtensions';
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
- addGlobalFill('host-details-page-tabs', 'Repository sets', <RepositorySetsTab key="repository-sets" />, 700, { title: __('Repository sets'), hideTab: hostIsNotRegistered });
29
32
 
33
+ // Overview tab cards
30
34
  addGlobalFill(
31
- 'details-cards',
32
- 'Content View Details',
35
+ 'host-overview-cards',
36
+ 'Content view details',
33
37
  <ContentViewDetailsCard key="content-view-details" />,
34
38
  2000,
35
39
  );
36
- addGlobalFill('details-cards', 'Installable errata', <ErrataOverviewCard key="errata-overview" />, 1900);
40
+ addGlobalFill(
41
+ 'host-overview-cards',
42
+ 'Host collections',
43
+ <HostCollectionsCard key="host-collections-details" />,
44
+ 700,
45
+ );
46
+ addGlobalFill('host-overview-cards', 'Installable errata', <ErrataOverviewCard key="errata-overview" />, 1900);
47
+ addGlobalFill('recent-communication-card-item', 'Recent communication', <RecentCommunicationCardExtensions key="recent-communication" />, 3000);
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,31 @@ 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-9-x86_64-rpms',
27
+ 'satellite-client-6-for-rhel-8-x86_64-rpms',
28
+ 'rhel-7-server-satellite-client-6-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',
38
+ 'rhel-7-server-satellite-maintenance-6.11-rpms',
39
+ 'rhel-7-server-satellite-utils-6.11-rpms',
40
+ 'satellite-maintenance-6.11-for-rhel-8-x86_64-rpms',
41
+ 'satellite-utils-6.11-for-rhel-8-x86_64-rpms',
37
42
  ];
38
43
 
39
44
  const recommendedRepositorySetLables = recommendedRepositoriesRHEL
@@ -0,0 +1,65 @@
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, { acsRefreshKey, CREATE_ACS_KEY, DELETE_ACS_KEY } from './ACSConstants';
5
+ import { getResponseErrorMsgs } from '../../utils/helpers';
6
+ import { renderTaskStartedToast } from '../Tasks/helpers';
7
+
8
+ const acsSuccessToast = (response) => {
9
+ const { data: { name } } = response;
10
+ return __(`Alternate content source ${name} created`);
11
+ };
12
+
13
+ export const acsErrorToast = (error) => {
14
+ const message = getResponseErrorMsgs(error.response);
15
+ return message;
16
+ };
17
+
18
+ export const createACSParams = (extraParams) => {
19
+ const getParams = {
20
+ organization_id: orgId(),
21
+ ...extraParams,
22
+ };
23
+ return getParams;
24
+ };
25
+
26
+ const getAlternateContentSources = (extraParams, id = '') => get({
27
+ type: API_OPERATIONS.GET,
28
+ key: ACS_KEY + id,
29
+ url: api.getApiUrl('/alternate_content_sources'),
30
+ params: createACSParams(extraParams),
31
+ });
32
+
33
+ export const createACS = params => post({
34
+ type: API_OPERATIONS.POST,
35
+ key: CREATE_ACS_KEY,
36
+ url: api.getApiUrl('/alternate_content_sources'),
37
+ params,
38
+ successToast: response => acsSuccessToast(response),
39
+ errorToast: error => acsErrorToast(error),
40
+ });
41
+
42
+ export const deleteACS = (acsId, handleSuccess) => APIActions.delete({
43
+ type: API_OPERATIONS.DELETE,
44
+ key: DELETE_ACS_KEY,
45
+ url: api.getApiUrl(`/alternate_content_sources/${acsId}`),
46
+ handleSuccess,
47
+ successToast: () => __('Alternate content source deleted'),
48
+ errorToast: error => __(`Something went wrong while deleting this alternate content source! ${getResponseErrorMsgs(error.response)}`),
49
+ });
50
+
51
+ export const refreshACS = (acsId, handleSuccess) => post({
52
+ type: API_OPERATIONS.POST,
53
+ key: acsRefreshKey(acsId),
54
+ url: api.getApiUrl(`/alternate_content_sources/${acsId}/refresh`),
55
+ params: { id: acsId },
56
+ handleSuccess: (response) => {
57
+ if (handleSuccess) handleSuccess();
58
+ return renderTaskStartedToast(response.data);
59
+ },
60
+ errorToast: error => __(`Something went wrong while refreshing this alternate content source! ${getResponseErrorMsgs(error.response)}`),
61
+ });
62
+ export default getAlternateContentSources;
63
+
64
+ // acs = Katello::AlternateContentSource.new
65
+ // (name:"acs", label:"acs", alternate_content_source_type:"custom", base_url:"abcdef")
@@ -0,0 +1,18 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+
3
+ const ACS_KEY = 'ACS';
4
+ export const CREATE_ACS_KEY = 'ACS_CREATE';
5
+ export const DELETE_ACS_KEY = 'ACS_DELETE';
6
+ export const SMART_PROXY_KEY = 'SMART_PROXY';
7
+ export const SSL_CERTS = 'SSL_CERTS';
8
+ export const acsRefreshKey = acsId => `${ACS_KEY}_REFRESH_${acsId}`;
9
+
10
+ export const YUM = __('Yum');
11
+ export const FILE = __('File');
12
+
13
+ export const ACS_TYPE_TRANSLATIONS_ENUM = {
14
+ [YUM]: 'yum',
15
+ [FILE]: 'file',
16
+ };
17
+
18
+ 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,24 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import ACS_KEY, { CREATE_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);
16
+
17
+ export const selectCreateACS = state =>
18
+ selectAPIResponse(state, CREATE_ACS_KEY) || {};
19
+
20
+ export const selectCreateACSStatus = state =>
21
+ selectAPIStatus(state, CREATE_ACS_KEY) || STATUS.PENDING;
22
+
23
+ export const selectCreateACSError = state =>
24
+ selectAPIError(state, CREATE_ACS_KEY);
@@ -0,0 +1,4 @@
1
+ import { createContext } from 'react';
2
+
3
+ const ACSCreateContext = createContext({});
4
+ export default ACSCreateContext;
@@ -0,0 +1,160 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { useDispatch } from 'react-redux';
3
+ import PropTypes from 'prop-types';
4
+ import { Wizard } from '@patternfly/react-core';
5
+ import { translate as __ } from 'foremanReact/common/I18n';
6
+ import ACSCreateContext from './ACSCreateContext';
7
+ import SelectSource from './Steps/SelectSource';
8
+ import NameACS from './Steps/NameACS';
9
+ import AcsUrlPaths from './Steps/AcsUrlPaths';
10
+ import ACSCredentials from './Steps/ACSCredentials';
11
+ import ACSSmartProxies from './Steps/ACSSmartProxies';
12
+ import ACSReview from './Steps/ACSReview';
13
+ import ACSCreateFinish from './Steps/ACSCreateFinish';
14
+ import { getContentCredentials } from '../../ContentCredentials/ContentCredentialActions';
15
+ import { getSmartProxies } from '../../SmartProxy/SmartProxyContentActions';
16
+ import { CONTENT_CREDENTIAL_CERT_TYPE } from '../../ContentCredentials/ContentCredentialConstants';
17
+
18
+ const ACSCreateWizard = ({ show, setIsOpen }) => {
19
+ const [acsType, setAcsType] = useState(null);
20
+ const [contentType, setContentType] = useState('yum');
21
+ const [name, setName] = useState('');
22
+ const [description, setDescription] = useState('');
23
+ const [smartProxies, setSmartProxies] = useState([]);
24
+ const [url, setUrl] = useState('');
25
+ const [subpaths, setSubpaths] = useState('');
26
+ const [verifySSL, setVerifySSL] = useState(false);
27
+ const [authentication, setAuthentication] = useState('');
28
+ const [sslCert, setSslCert] = useState('');
29
+ const [sslKey, setSslKey] = useState('');
30
+ const [sslCertName, setSslCertName] = useState('');
31
+ const [sslKeyName, setSslKeyName] = useState('');
32
+ const [username, setUsername] = useState('');
33
+ const [password, setPassword] = useState('');
34
+ const [caCert, setCACert] = useState('');
35
+ const [caCertName, setCACertName] = useState('');
36
+ const [currentStep, setCurrentStep] = useState(1);
37
+ const dispatch = useDispatch();
38
+
39
+ useEffect(
40
+ () => {
41
+ dispatch(getContentCredentials({ content_type: CONTENT_CREDENTIAL_CERT_TYPE }));
42
+ dispatch(getSmartProxies());
43
+ },
44
+ [dispatch],
45
+ );
46
+
47
+ const steps = [
48
+ {
49
+ id: 1,
50
+ name: __('Select source type'),
51
+ component: <SelectSource />,
52
+ enableNext: acsType && contentType,
53
+ },
54
+ {
55
+ id: 2,
56
+ name: __('Name source'),
57
+ component: <NameACS />,
58
+ enableNext: name !== '',
59
+ },
60
+ {
61
+ id: 3,
62
+ name: __('Select smart proxy'),
63
+ component: <ACSSmartProxies />,
64
+ enableNext: smartProxies.length,
65
+ },
66
+ {
67
+ id: 4,
68
+ name: __('URL and paths'),
69
+ component: <AcsUrlPaths />,
70
+ enableNext: url !== '' && subpaths !== '',
71
+ },
72
+ {
73
+ id: 5,
74
+ name: __('Credentials'),
75
+ component: <ACSCredentials />,
76
+ },
77
+ {
78
+ id: 6,
79
+ name: __('Review details'),
80
+ component: <ACSReview />,
81
+ nextButtonText: __('Add'),
82
+ },
83
+ {
84
+ id: 7,
85
+ name: __('Create ACS'),
86
+ component: <ACSCreateFinish />,
87
+ isFinishedStep: true,
88
+ },
89
+
90
+ ];
91
+
92
+ return (
93
+ <ACSCreateContext.Provider value={{
94
+ show,
95
+ setIsOpen,
96
+ currentStep,
97
+ setCurrentStep,
98
+ acsType,
99
+ setAcsType,
100
+ contentType,
101
+ setContentType,
102
+ name,
103
+ setName,
104
+ description,
105
+ setDescription,
106
+ smartProxies,
107
+ setSmartProxies,
108
+ url,
109
+ setUrl,
110
+ subpaths,
111
+ setSubpaths,
112
+ verifySSL,
113
+ setVerifySSL,
114
+ authentication,
115
+ setAuthentication,
116
+ sslCert,
117
+ setSslCert,
118
+ sslKey,
119
+ setSslKey,
120
+ sslCertName,
121
+ setSslCertName,
122
+ sslKeyName,
123
+ setSslKeyName,
124
+ username,
125
+ setUsername,
126
+ password,
127
+ setPassword,
128
+ caCert,
129
+ setCACert,
130
+ caCertName,
131
+ setCACertName,
132
+ }}
133
+ >
134
+ <Wizard
135
+ title={__('Add an alternate content source')}
136
+ steps={steps}
137
+ startAtStep={currentStep}
138
+ onGoToStep={({ id }) => setCurrentStep(id)}
139
+ onNext={({ id }) => setCurrentStep(id)}
140
+ onBack={({ id }) => setCurrentStep(id)}
141
+ onClose={() => {
142
+ setIsOpen(false);
143
+ }}
144
+ isOpen={show}
145
+ />
146
+ </ACSCreateContext.Provider>
147
+ );
148
+ };
149
+
150
+ ACSCreateWizard.propTypes = {
151
+ show: PropTypes.bool,
152
+ setIsOpen: PropTypes.func,
153
+ };
154
+
155
+ ACSCreateWizard.defaultProps = {
156
+ show: false,
157
+ setIsOpen: null,
158
+ };
159
+
160
+ export default ACSCreateWizard;