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
@@ -1,62 +1,66 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import { useDispatch, useSelector } from 'react-redux';
3
- import useDeepCompareEffect from 'use-deep-compare-effect';
4
3
  import { InProgressIcon } from '@patternfly/react-icons';
5
4
  import PropTypes from 'prop-types';
6
- import { Progress,
5
+ import {
6
+ Progress,
7
7
  ProgressSize,
8
8
  ProgressMeasureLocation,
9
- ProgressVariant } from '@patternfly/react-core';
9
+ ProgressVariant,
10
+ } from '@patternfly/react-core';
10
11
  import { STATUS } from 'foremanReact/constants';
11
- import { stopPollingTask, toastTaskFinished } from '../../../Tasks/TaskActions';
12
+ import { startPollingTask, toastTaskFinished } from '../../../Tasks/TaskActions';
12
13
  import { selectTaskPoll, selectTaskPollStatus } from '../../Details/ContentViewDetailSelectors';
14
+ import { getContentViewVersions } from '../../Details/ContentViewDetailActions';
15
+ import { cvVersionTaskPollingKey } from '../../ContentViewsConstants';
16
+ import { selectIsPollingTask } from '../../../Tasks/TaskSelectors';
13
17
 
14
- const TaskPresenter = ({ activeHistory, setPollingFinished }) => {
18
+ const TaskPresenter = ({ activeHistory, cvId, allowCallback }) => {
15
19
  const { task } = activeHistory;
16
20
  const dispatch = useDispatch();
17
- const [polling, setPolling] = useState(true);
18
- const [taskErrored, setTaskErrored] = useState(task.result === 'error');
21
+ const [taskPausedOrErrored, setTaskPausedOrErrored] =
22
+ useState(task.result === 'error' || task.result === 'paused');
23
+ const [resolved, setResolved] = useState(false);
24
+ const POLLING_TASK_KEY = cvVersionTaskPollingKey(cvId);
25
+ const isTaskRunning = useSelector(state =>
26
+ selectIsPollingTask(state, POLLING_TASK_KEY));
27
+
19
28
  const pollResponse = useSelector(state =>
20
- selectTaskPoll(state, task.id));
29
+ selectTaskPoll(state, POLLING_TASK_KEY));
21
30
  const pollResponseStatus = useSelector(state =>
22
- selectTaskPollStatus(state, task.id));
23
- const loading = pollResponseStatus === STATUS.PENDING;
31
+ selectTaskPollStatus(state, POLLING_TASK_KEY));
24
32
 
25
- const progressCompleted = () => (
26
- pollResponse.progress ?
27
- pollResponse.progress * 100 :
28
- task.progress * 100
29
- );
30
33
 
31
34
  useEffect(() => {
32
- if (!polling) {
33
- const { id } = task;
34
- dispatch(stopPollingTask(id));
35
- dispatch(toastTaskFinished(pollResponse));
36
- setPollingFinished(true); // Use this boolean as activeListener in referring page table
35
+ if (allowCallback && !isTaskRunning && !taskPausedOrErrored) {
36
+ dispatch(startPollingTask(POLLING_TASK_KEY, task));
37
37
  }
38
- }, [polling, dispatch, setPollingFinished, pollResponse, task]);
38
+ }, [POLLING_TASK_KEY, allowCallback, dispatch, isTaskRunning, task, taskPausedOrErrored]);
39
39
 
40
- useDeepCompareEffect(() => {
41
- if (!loading && polling) {
42
- const { state, result } = pollResponse;
43
- if ((state === 'paused' || result === 'error') && !taskErrored) {
44
- setTaskErrored(true);
45
- setPolling(false);
46
- } else if (state === 'stopped' && result === 'success') {
47
- setPolling(false);
48
- }
49
- }
50
- }, [pollResponse, loading, taskErrored, setTaskErrored, polling, setPolling]);
40
+ const { state, result } = pollResponse;
41
+
42
+ if ((state === 'paused' || result === 'error' || pollResponseStatus === STATUS.ERROR)) {
43
+ setTaskPausedOrErrored(true);
44
+ }
45
+
46
+ if (allowCallback && !resolved && state === 'stopped' && result === 'success') {
47
+ setResolved(true);
48
+ dispatch(toastTaskFinished(pollResponse));
49
+ dispatch(getContentViewVersions(cvId));
50
+ }
51
+
52
+ const progressCompleted = pollResponse.progress ?
53
+ pollResponse.progress * 100 :
54
+ task.progress * 100;
51
55
 
52
56
  if (pollResponse) {
53
57
  return (
54
58
  <a href={`/foreman_tasks/tasks/${task.id}`} target="_blank" rel="noreferrer">
55
59
  <Progress
56
60
  aria-label="task_presenter"
57
- value={progressCompleted()}
61
+ value={progressCompleted}
58
62
  measureLocation={ProgressMeasureLocation.inside}
59
- variant={taskErrored ? ProgressVariant.danger : ProgressVariant.default}
63
+ variant={taskPausedOrErrored ? ProgressVariant.danger : ProgressVariant.default}
60
64
  size={ProgressSize.sm}
61
65
  />
62
66
  </a>
@@ -78,7 +82,8 @@ TaskPresenter.propTypes = {
78
82
  progress: PropTypes.number.isRequired,
79
83
  }).isRequired,
80
84
  }).isRequired,
81
- setPollingFinished: PropTypes.func.isRequired,
85
+ cvId: PropTypes.number.isRequired,
86
+ allowCallback: PropTypes.bool.isRequired,
82
87
  };
83
88
 
84
89
 
@@ -14,14 +14,14 @@ const DetailsExpansion = ({
14
14
  if (cvComposite) {
15
15
  return (
16
16
  <>
17
- {__('Related content views: ')}
17
+ {__('Related component cvs: ')}
18
18
  <RelatedContentViewComponentsModal key="cvId" {...{ cvName, cvId, relatedCVCount }} />
19
19
  </>
20
20
  );
21
21
  }
22
22
  return (
23
23
  <>
24
- {__('Related composite content views: ')}
24
+ {__('Related composite cvs: ')}
25
25
  <RelatedCompositeContentViewsModal
26
26
  key={cvId}
27
27
  {...{
@@ -30,7 +30,7 @@ const RelatedCompositeContentViewsModal = ({
30
30
  const columns = ['Name'];
31
31
  return (
32
32
  <>
33
- <Button aria-label={`button_${cvId}`} variant="link" isInline onClick={handleModalToggle}>
33
+ <Button ouiaId="related-cv-count" aria-label={`button_${cvId}`} variant="link" isInline onClick={handleModalToggle}>
34
34
  {relatedCVCount}
35
35
  </Button>
36
36
  <Modal
@@ -29,7 +29,7 @@ const RelatedContentViewsModal = ({ cvName, cvId, relatedCVCount }) => {
29
29
  <FlexItem>
30
30
  <RegistryIcon />
31
31
  <b>{` ${cvName}`}</b>
32
- {__(' content view is used in listed content views. For more information, ')}
32
+ {__(' content view is used in listed component content views. For more information, ')}
33
33
  <Link to={urlBuilder(`content_views/${cvId}#/contentviews`, '')}>
34
34
  {__('view content view tabs.')}
35
35
  </Link>
@@ -43,13 +43,13 @@ const RelatedContentViewsModal = ({ cvName, cvId, relatedCVCount }) => {
43
43
 
44
44
  return (
45
45
  <>
46
- <Button aria-label={`button_${cvId}`} variant="link" isInline onClick={handleModalToggle}>
46
+ <Button ouiaId="related-cv-count" aria-label={`button_${cvId}`} variant="link" isInline onClick={handleModalToggle}>
47
47
  {relatedCVCount}
48
48
  </Button>
49
49
  <Grid>
50
50
  <GridItem span={12}>
51
51
  <Modal
52
- title={__('Related content views')}
52
+ title={__('Related component content views')}
53
53
  variant={ModalVariant.medium}
54
54
  isOpen={isOpen}
55
55
  description={description()}
@@ -58,7 +58,6 @@ const RelatedContentViewsModal = ({ cvName, cvId, relatedCVCount }) => {
58
58
  }}
59
59
  appendTo={document.body}
60
60
  >
61
-
62
61
  <TableWrapper
63
62
  {...{
64
63
  metadata,
@@ -67,6 +66,7 @@ const RelatedContentViewsModal = ({ cvName, cvId, relatedCVCount }) => {
67
66
  error,
68
67
  status,
69
68
  }}
69
+ ouiaId="related-content-view-components-table"
70
70
  fetchItems={useCallback(params => getContentViewComponents(cvId, params, 'Added'), [cvId])}
71
71
  variant={TableVariant.compact}
72
72
  autocompleteEndpoint="/content_views/auto_complete_search"
@@ -30,7 +30,7 @@ test('Can call API and show Related Content Views Components Modal', async (done
30
30
 
31
31
  await patientlyWaitFor(() => expect(getByLabelText(`button_${cvId}`)).toBeInTheDocument());
32
32
  fireEvent.click(getByLabelText(`button_${cvId}`));
33
- await patientlyWaitFor(() => expect(getByText('Related content views')).toBeInTheDocument());
33
+ await patientlyWaitFor(() => expect(getByText('Related component content views')).toBeInTheDocument());
34
34
 
35
35
  assertNockRequest(scope, done);
36
36
  });
@@ -11,4 +11,7 @@ export const autoPublishHelpText = __('Automatically publish a new version of th
11
11
  export const importOnlyHelpText = __('Designate whether this content view is for importing from an upstream server. ' +
12
12
  'Import-only content views cannot be published directly.');
13
13
 
14
+ export const generatedContentViewHelpText = __('This content view is generated for importing or exporting content view versions. ' +
15
+ 'Generated content views cannot be published directly and can only be updated via import/export process.');
16
+
14
17
  export const hasPermission = (permissions, perm) => permissions && permissions[perm];
@@ -1,6 +1,11 @@
1
1
  import { STATUS } from 'foremanReact/constants';
2
2
 
3
3
  export const getHostIds = () => {
4
+ const url = new URL(window.location);
5
+ const hostId = url.searchParams.get('host_id');
6
+
7
+ if (hostId) return [hostId];
8
+
4
9
  const cookie = document.cookie.split('; ')
5
10
  .find(row => row.startsWith('_ForemanSelectedhosts'));
6
11
  const params = new URLSearchParams(cookie);
@@ -16,7 +16,7 @@ import SearchBar from './components/SearchBar';
16
16
  import RecommendedRepositorySetsToggler from './components/RecommendedRepositorySetsToggler';
17
17
  import { getSetsComponent, getEnabledComponent } from './helpers';
18
18
  import api from '../../services/api';
19
- import { AIRGAPPED } from '../Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants';
19
+ import { EXPORT_SYNC } from '../Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants';
20
20
 
21
21
  class RedHatRepositoriesPage extends Component {
22
22
  componentDidMount() {
@@ -42,7 +42,7 @@ class RedHatRepositoriesPage extends Component {
42
42
  if (!(organization?.cdn_configuration)) {
43
43
  return <Skeleton />;
44
44
  }
45
- if (organization.cdn_configuration.type === AIRGAPPED) {
45
+ if (organization.cdn_configuration.type === EXPORT_SYNC) {
46
46
  return (
47
47
  <Grid id="redhatRepositoriesPage" bsClass="container-fluid">
48
48
  <h1>{__('Red Hat Repositories')}</h1>
@@ -52,7 +52,7 @@ class RedHatRepositoriesPage extends Component {
52
52
  variant="info"
53
53
  className="repo-sets-alert"
54
54
  isInline
55
- title={__('CDN configuration is set to Air-gapped (disconnected). Repository enablement/disablement is not permitted on this page.')}
55
+ title={__('CDN configuration is set to Export Sync (disconnected). Repository enablement/disablement is not permitted on this page.')}
56
56
  />
57
57
  </Col>
58
58
  </Row>
@@ -19,10 +19,11 @@ class EnabledRepository extends Component {
19
19
 
20
20
  repoForAction = () => {
21
21
  const {
22
- productId, contentId, arch, releasever, name, type,
22
+ id, productId, contentId, arch, releasever, name, type,
23
23
  } = this.props;
24
24
 
25
25
  return {
26
+ id,
26
27
  contentId,
27
28
  productId,
28
29
  name,
@@ -60,6 +60,7 @@ describe('Enabled Repositories Component', () => {
60
60
  type: 'foo',
61
61
  arch: 'foo',
62
62
  releasever: '1.1.1',
63
+ id: 1,
63
64
  };
64
65
  expect(instance.repoForAction()).toEqual(expected);
65
66
  });
@@ -109,6 +110,7 @@ describe('Enabled Repositories Component', () => {
109
110
  type: 'foo',
110
111
  arch: 'foo',
111
112
  releasever: '1.1.1',
113
+ id: 1,
112
114
  };
113
115
  instance.reloadAndNotify = jest.fn();
114
116
  await instance.disableRepository();
@@ -2,11 +2,11 @@ import { translate as __ } from 'foremanReact/common/I18n';
2
2
 
3
3
  export const CDN_URL = 'https://cdn.redhat.com';
4
4
 
5
- export const [CDN, UPSTREAM_SERVER, AIRGAPPED] = ['redhat_cdn', 'upstream_server', 'airgapped'];
5
+ export const [CDN, NETWORK_SYNC, EXPORT_SYNC] = ['redhat_cdn', 'network_sync', 'export_sync'];
6
6
  export const CDN_CONFIGURATION_TYPES = {
7
7
  redhat_cdn: __('Red Hat CDN'),
8
- upstream_server: __('Upstream Foreman server'),
9
- airgapped: __('Air-gapped'),
8
+ network_sync: __('Network Sync'),
9
+ export_sync: __('Export Sync'),
10
10
  };
11
11
 
12
12
  export const DEFAULT_ORGANIZATION_LABEL = 'Default_Organization';
@@ -68,6 +68,7 @@ const CdnTypeForm = ({ showUpdate, onUpdate, url }) => {
68
68
  </div>
69
69
  <FormGroup label={__('URL')} isRequired>
70
70
  <TextInput
71
+ ouiaId="cdn-configuration-url-input"
71
72
  aria-label="cdn-url"
72
73
  type="text"
73
74
  value={cdnUrl}
@@ -78,6 +79,7 @@ const CdnTypeForm = ({ showUpdate, onUpdate, url }) => {
78
79
 
79
80
  <ActionGroup>
80
81
  <Button
82
+ ouiaId="cdn-configuration-update-button"
81
83
  aria-label="update-cdn-configuration"
82
84
  variant="secondary"
83
85
  onClick={performUpdate}
@@ -10,7 +10,7 @@ import {
10
10
  import { translate as __ } from 'foremanReact/common/I18n';
11
11
  import { noop } from 'foremanReact/common/helpers';
12
12
 
13
- import { AIRGAPPED } from './CdnConfigurationConstants';
13
+ import { EXPORT_SYNC } from './CdnConfigurationConstants';
14
14
  import { updateCdnConfiguration } from '../../../Organizations/OrganizationActions';
15
15
  import {
16
16
  selectUpdatingCdnConfiguration,
@@ -18,14 +18,14 @@ import {
18
18
 
19
19
  import './CdnConfigurationForm.scss';
20
20
 
21
- const AirGappedTypeForm = ({ showUpdate, onUpdate }) => {
21
+ const ExportSyncForm = ({ showUpdate, onUpdate }) => {
22
22
  const [updateEnabled, setUpdateEnabled] = useState(showUpdate);
23
23
  const updatingCdnConfiguration = useSelector(state => selectUpdatingCdnConfiguration(state));
24
24
  const dispatch = useDispatch();
25
25
  const performUpdate = () => {
26
26
  setUpdateEnabled(false);
27
27
  dispatch(updateCdnConfiguration({
28
- type: AIRGAPPED,
28
+ type: EXPORT_SYNC,
29
29
  }, onUpdate));
30
30
  };
31
31
 
@@ -55,6 +55,7 @@ const AirGappedTypeForm = ({ showUpdate, onUpdate }) => {
55
55
 
56
56
  <ActionGroup>
57
57
  <Button
58
+ ouiaId="export-sync-configuration-update-button"
58
59
  aria-label="update-airgapped-configuration"
59
60
  variant="secondary"
60
61
  onClick={performUpdate}
@@ -69,13 +70,13 @@ const AirGappedTypeForm = ({ showUpdate, onUpdate }) => {
69
70
  };
70
71
 
71
72
 
72
- AirGappedTypeForm.propTypes = {
73
+ ExportSyncForm.propTypes = {
73
74
  showUpdate: PropTypes.bool.isRequired,
74
75
  onUpdate: PropTypes.func,
75
76
  };
76
77
 
77
- AirGappedTypeForm.defaultProps = {
78
+ ExportSyncForm.defaultProps = {
78
79
  onUpdate: noop,
79
80
  };
80
81
 
81
- export default AirGappedTypeForm;
82
+ export default ExportSyncForm;
@@ -18,7 +18,7 @@ import {
18
18
  import { translate as __ } from 'foremanReact/common/I18n';
19
19
  import { noop } from 'foremanReact/common/helpers';
20
20
 
21
- import { UPSTREAM_SERVER, DEFAULT_CONTENT_VIEW_LABEL, DEFAULT_LIFECYCLE_ENVIRONMENT_LABEL, DEFAULT_ORGANIZATION_LABEL } from './CdnConfigurationConstants';
21
+ import { NETWORK_SYNC, DEFAULT_CONTENT_VIEW_LABEL, DEFAULT_LIFECYCLE_ENVIRONMENT_LABEL, DEFAULT_ORGANIZATION_LABEL } from './CdnConfigurationConstants';
22
22
  import EditableTextInput from '../../../../components/EditableTextInput';
23
23
 
24
24
  import {
@@ -28,11 +28,11 @@ import {
28
28
  import { updateCdnConfiguration } from '../../../Organizations/OrganizationActions';
29
29
  import './CdnConfigurationForm.scss';
30
30
 
31
- const UpstreamServerTypeForm = ({
31
+ const NetworkSyncForm = ({
32
32
  showUpdate, contentCredentials, cdnConfiguration, onUpdate,
33
33
  }) => {
34
34
  const dispatch = useDispatch();
35
- const urlValue = cdnConfiguration.type === UPSTREAM_SERVER ? cdnConfiguration.url : '';
35
+ const urlValue = cdnConfiguration.type === NETWORK_SYNC ? cdnConfiguration.url : '';
36
36
  const [url, setUrl] = useState(urlValue);
37
37
  const [username, setUsername] = useState(cdnConfiguration.username);
38
38
  const [password, setPassword] = useState(null);
@@ -92,7 +92,7 @@ const UpstreamServerTypeForm = ({
92
92
  upstream_content_view_label: contentViewLabel || DEFAULT_CONTENT_VIEW_LABEL,
93
93
  upstream_lifecycle_environment_label: lifecycleEnvironmentLabel ||
94
94
  DEFAULT_LIFECYCLE_ENVIRONMENT_LABEL,
95
- type: UPSTREAM_SERVER,
95
+ type: NETWORK_SYNC,
96
96
  }, onUpdate, onError));
97
97
  };
98
98
 
@@ -136,6 +136,7 @@ const UpstreamServerTypeForm = ({
136
136
  isRequired
137
137
  >
138
138
  <TextInput
139
+ ouiaId="network-sync-url-input"
139
140
  aria-label="cdn-url"
140
141
  type="text"
141
142
  value={url || ''}
@@ -148,6 +149,7 @@ const UpstreamServerTypeForm = ({
148
149
  isRequired
149
150
  >
150
151
  <TextInput
152
+ ouiaId="network-sync-username-input"
151
153
  aria-label="cdn-username"
152
154
  type="text"
153
155
  value={username || ''}
@@ -160,6 +162,7 @@ const UpstreamServerTypeForm = ({
160
162
  isRequired
161
163
  >
162
164
  <EditableTextInput
165
+ ouiaId="network-sync-password-input"
163
166
  attribute="cdn-password"
164
167
  value={password}
165
168
  isPassword
@@ -173,6 +176,7 @@ const UpstreamServerTypeForm = ({
173
176
  isRequired
174
177
  >
175
178
  <TextInput
179
+ ouiaId="network-sync-organization-input"
176
180
  aria-label="cdn-organization-label"
177
181
  type="text"
178
182
  value={organizationLabel || ''}
@@ -184,6 +188,7 @@ const UpstreamServerTypeForm = ({
184
188
  label={__('Lifecycle Environment Label')}
185
189
  >
186
190
  <TextInput
191
+ ouiaId="network-sync-lifecycle-environment-input"
187
192
  aria-label="cdn-lifecycle-environment-label"
188
193
  type="text"
189
194
  value={lifecycleEnvironmentLabel || ''}
@@ -195,6 +200,7 @@ const UpstreamServerTypeForm = ({
195
200
  label={__('Content view label')}
196
201
  >
197
202
  <TextInput
203
+ ouiaId="network-sync-content-view-input"
198
204
  aria-label="cdn-content-view-label"
199
205
  type="text"
200
206
  value={contentViewLabel || ''}
@@ -207,6 +213,7 @@ const UpstreamServerTypeForm = ({
207
213
  isRequired
208
214
  >
209
215
  <FormSelect
216
+ ouiaId="network-sync-ca-content-credential-input"
210
217
  aria-label="cdn-ssl-ca-content-credential"
211
218
  value={sslCaCredentialId || ''}
212
219
  isDisabled={updatingCdnConfiguration}
@@ -220,6 +227,7 @@ const UpstreamServerTypeForm = ({
220
227
 
221
228
  <ActionGroup>
222
229
  <Button
230
+ ouiaId="network-sync-configuration-update-button"
223
231
  aria-label="update-upstream-configuration"
224
232
  variant="secondary"
225
233
  onClick={performUpdate}
@@ -234,7 +242,7 @@ const UpstreamServerTypeForm = ({
234
242
  );
235
243
  };
236
244
 
237
- UpstreamServerTypeForm.propTypes = {
245
+ NetworkSyncForm.propTypes = {
238
246
  showUpdate: PropTypes.bool.isRequired,
239
247
  contentCredentials: PropTypes.arrayOf(PropTypes.shape({
240
248
  id: PropTypes.number,
@@ -253,10 +261,10 @@ UpstreamServerTypeForm.propTypes = {
253
261
  onUpdate: PropTypes.func,
254
262
  };
255
263
 
256
- UpstreamServerTypeForm.defaultProps = {
264
+ NetworkSyncForm.defaultProps = {
257
265
  contentCredentials: [],
258
266
  cdnConfiguration: {},
259
267
  onUpdate: noop,
260
268
  };
261
269
 
262
- export default UpstreamServerTypeForm;
270
+ export default NetworkSyncForm;
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import { cleanup } from '@testing-library/react';
3
3
  import { renderWithRedux, fireEvent } from 'react-testing-lib-wrapper';
4
- import AirGappedTypeForm from '../AirGappedTypeForm';
4
+ import ExportSyncForm from '../ExportSyncForm';
5
5
  import { nockInstance, assertNockRequest } from '../../../../../test-utils/nockWrapper';
6
6
  import { updateCdnConfigurationSuccessResponse } from '../../../../Organizations/__tests__/organizations.fixtures';
7
- import { AIRGAPPED } from '../CdnConfigurationConstants';
7
+ import { EXPORT_SYNC } from '../CdnConfigurationConstants';
8
8
 
9
9
  import api from '../../../../../services/api';
10
10
 
@@ -25,13 +25,13 @@ const initialState = {
25
25
 
26
26
 
27
27
  test('Can update to Airgapped type', async (done) => {
28
- const { getByLabelText } = renderWithRedux(<AirGappedTypeForm
28
+ const { getByLabelText } = renderWithRedux(<ExportSyncForm
29
29
  showUpdate
30
30
  />, { initialState });
31
31
 
32
32
  const updateCdnConfigurationRequest = nockInstance
33
33
  .put(updateCdnConfigurationPath, {
34
- type: AIRGAPPED,
34
+ type: EXPORT_SYNC,
35
35
  })
36
36
  .reply(200, updateCdnConfigurationSuccessResponse);
37
37
 
@@ -2,10 +2,10 @@ import React from 'react';
2
2
  import { cleanup } from '@testing-library/react';
3
3
  import { renderWithRedux, fireEvent, patientlyWaitFor } from 'react-testing-lib-wrapper';
4
4
  import userEvent from '@testing-library/user-event';
5
- import UpstreamServerTypeForm from '../UpstreamServerTypeForm';
5
+ import NetworkSyncForm from '../NetworkSyncForm';
6
6
  import { nockInstance, assertNockRequest } from '../../../../../test-utils/nockWrapper';
7
7
  import { updateCdnConfigurationSuccessResponse } from '../../../../Organizations/__tests__/organizations.fixtures';
8
- import { UPSTREAM_SERVER } from '../CdnConfigurationConstants';
8
+ import { NETWORK_SYNC } from '../CdnConfigurationConstants';
9
9
 
10
10
  import api from '../../../../../services/api';
11
11
 
@@ -20,7 +20,7 @@ const cdnConfiguration = {
20
20
  password_exists: false,
21
21
  upstream_organization_label: 'CurrentOrg',
22
22
  ssl_ca_credential_id: 2,
23
- type: UPSTREAM_SERVER,
23
+ type: NETWORK_SYNC,
24
24
  upstream_lifecycle_environment_label: 'Library',
25
25
  upstream_content_view_label: 'CV',
26
26
  };
@@ -47,7 +47,7 @@ const contentCredentials = [
47
47
  ];
48
48
 
49
49
  test('Can update the upstream server configuration', async (done) => {
50
- const { getByLabelText } = renderWithRedux(<UpstreamServerTypeForm
50
+ const { getByLabelText } = renderWithRedux(<NetworkSyncForm
51
51
  showUpdate
52
52
  cdnConfiguration={cdnConfiguration}
53
53
  contentCredentials={contentCredentials}
@@ -60,7 +60,7 @@ test('Can update the upstream server configuration', async (done) => {
60
60
  password: 'changeme',
61
61
  upstream_organization_label: 'Default_Organization',
62
62
  ssl_ca_credential_id: '1',
63
- type: UPSTREAM_SERVER,
63
+ type: NETWORK_SYNC,
64
64
  upstream_lifecycle_environment_label: 'Library',
65
65
  upstream_content_view_label: 'CV',
66
66
  })
@@ -92,7 +92,7 @@ test('Can update the upstream server configuration', async (done) => {
92
92
  });
93
93
 
94
94
  test('the form shall reflect the given cdnConfiguration', () => {
95
- const { getAllByTestId, getByLabelText } = renderWithRedux(<UpstreamServerTypeForm
95
+ const { getAllByTestId, getByLabelText } = renderWithRedux(<NetworkSyncForm
96
96
  showUpdate
97
97
  cdnConfiguration={cdnConfiguration}
98
98
  contentCredentials={contentCredentials}
@@ -109,7 +109,7 @@ test('the form shall reflect the given cdnConfiguration', () => {
109
109
  });
110
110
 
111
111
  test('resetting the password enables/disables appropriately', async (done) => {
112
- const { getByLabelText } = renderWithRedux(<UpstreamServerTypeForm
112
+ const { getByLabelText } = renderWithRedux(<NetworkSyncForm
113
113
  showUpdate
114
114
  cdnConfiguration={{ ...cdnConfiguration, password_exists: true }}
115
115
  />, { initialState });
@@ -130,7 +130,7 @@ test('resetting the password enables/disables appropriately', async (done) => {
130
130
  });
131
131
 
132
132
  test('update button disabled on incomplete information', async (done) => {
133
- const { getByLabelText } = renderWithRedux(<UpstreamServerTypeForm
133
+ const { getByLabelText } = renderWithRedux(<NetworkSyncForm
134
134
  showUpdate
135
135
  cdnConfiguration={{ ...cdnConfiguration, password_exists: true }}
136
136
  contentCredentials={contentCredentials}
@@ -7,11 +7,11 @@ import {
7
7
  } from '@patternfly/react-core';
8
8
  import { noop } from 'foremanReact/common/helpers';
9
9
  import CdnTypeForm from './CdnTypeForm';
10
- import AirGappedTypeForm from './AirGappedTypeForm';
11
- import UpstreamServerTypeForm from './UpstreamServerTypeForm';
10
+ import ExportSyncForm from './ExportSyncForm';
11
+ import NetworkSyncForm from './NetworkSyncForm';
12
12
 
13
13
  import './CdnConfigurationForm.scss';
14
- import { CDN_URL, CDN, AIRGAPPED, UPSTREAM_SERVER, CDN_CONFIGURATION_TYPES } from './CdnConfigurationConstants';
14
+ import { CDN_URL, CDN, EXPORT_SYNC, NETWORK_SYNC, CDN_CONFIGURATION_TYPES } from './CdnConfigurationConstants';
15
15
 
16
16
  const CdnConfigurationForm = (props) => {
17
17
  const {
@@ -35,17 +35,17 @@ const CdnConfigurationForm = (props) => {
35
35
  <ToggleGroup aria-label="Default with multiple selectable">
36
36
  <ToggleGroupItem text={CDN_CONFIGURATION_TYPES[CDN]} key={0} buttonId="cdn" isSelected={type === CDN} onChange={() => updateType(CDN)} />
37
37
  <ToggleGroupItem
38
- text={CDN_CONFIGURATION_TYPES[UPSTREAM_SERVER]}
38
+ text={CDN_CONFIGURATION_TYPES[NETWORK_SYNC]}
39
39
  key={1}
40
40
  buttonId="usptream_server"
41
- isSelected={type === UPSTREAM_SERVER}
42
- onChange={() => updateType(UPSTREAM_SERVER)}
41
+ isSelected={type === NETWORK_SYNC}
42
+ onChange={() => updateType(NETWORK_SYNC)}
43
43
  />
44
- <ToggleGroupItem text={CDN_CONFIGURATION_TYPES[AIRGAPPED]} key={2} buttonId="airgapped" isSelected={type === AIRGAPPED} onChange={() => updateType(AIRGAPPED)} />
44
+ <ToggleGroupItem text={CDN_CONFIGURATION_TYPES[EXPORT_SYNC]} key={2} buttonId="airgapped" isSelected={type === EXPORT_SYNC} onChange={() => updateType(EXPORT_SYNC)} />
45
45
  </ToggleGroup>
46
46
 
47
- { type === UPSTREAM_SERVER &&
48
- <UpstreamServerTypeForm
47
+ { type === NETWORK_SYNC &&
48
+ <NetworkSyncForm
49
49
  cdnConfiguration={cdnConfiguration}
50
50
  contentCredentials={contentCredentials}
51
51
  onUpdate={onUpdate}
@@ -60,8 +60,8 @@ const CdnConfigurationForm = (props) => {
60
60
  url={cdnUrl}
61
61
  />
62
62
  }
63
- { type === AIRGAPPED &&
64
- <AirGappedTypeForm
63
+ { type === EXPORT_SYNC &&
64
+ <ExportSyncForm
65
65
  showUpdate={type !== cdnConfiguration.type}
66
66
  onUpdate={onUpdate}
67
67
  />
@@ -38,6 +38,7 @@ export const SUBSCRIPTIONS_DISABLE_DELETE_BUTTON = 'SUBSCRIPTIONS_DISABLE_DELETE
38
38
  export const SUBSCRIPTIONS_ENABLE_DELETE_BUTTON = 'SUBSCRIPTIONS_ENABLE_DELETE_BUTTON';
39
39
 
40
40
  export const SUBSCRIPTION_WATCH_URL = 'https://access.redhat.com/articles/subscription-watch';
41
+ export const SCA_URL = 'https://access.redhat.com/articles/simple-content-access';
41
42
 
42
43
  export const MANIFEST_DELETE_TASK_LABEL = 'Actions::Katello::Organization::ManifestDelete';
43
44