katello 4.6.2.1 → 4.7.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 (333) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  3. data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -0
  4. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +4 -4
  5. data/app/controllers/katello/api/v2/capsule_content_controller.rb +5 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +1 -0
  7. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  8. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -1
  9. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -0
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +78 -12
  12. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +1 -1
  13. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +7 -1
  14. data/app/controllers/katello/concerns/api/v2/smart_proxies_controller_extensions.rb +1 -0
  15. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +11 -9
  16. data/app/helpers/katello/content_source_helper.rb +9 -0
  17. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +31 -0
  18. data/app/lib/actions/katello/activation_key/destroy.rb +1 -0
  19. data/app/lib/actions/katello/agent_action.rb +1 -0
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +1 -1
  21. data/app/lib/actions/katello/alternate_content_source/update.rb +2 -2
  22. data/app/lib/actions/katello/capsule_content/sync.rb +10 -2
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +1 -1
  24. data/app/lib/actions/katello/content_view/promote.rb +1 -0
  25. data/app/lib/actions/katello/content_view/publish.rb +5 -2
  26. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +7 -3
  27. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +4 -2
  28. data/app/lib/actions/katello/content_view_version/import.rb +22 -10
  29. data/app/lib/actions/katello/product/destroy.rb +1 -1
  30. data/app/lib/actions/katello/repository/destroy.rb +3 -3
  31. data/app/lib/actions/katello/repository/errata_mail.rb +9 -6
  32. data/app/lib/actions/katello/repository/refresh_repository.rb +1 -1
  33. data/app/lib/actions/katello/repository/sync.rb +13 -6
  34. data/app/lib/actions/katello/repository_set/enable_repository.rb +6 -2
  35. data/app/lib/actions/pulp3/alternate_content_source/refresh_remote.rb +16 -0
  36. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +1 -0
  37. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +1 -1
  38. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +10 -2
  39. data/app/lib/katello/concerns/renderer_extensions.rb +2 -1
  40. data/app/lib/katello/errors.rb +2 -2
  41. data/app/lib/katello/resources/candlepin.rb +7 -1
  42. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -13
  43. data/app/lib/katello/resources/cdn.rb +14 -9
  44. data/app/lib/katello/util/candlepin_repository_checker.rb +73 -0
  45. data/app/models/katello/activation_key.rb +12 -1
  46. data/app/models/katello/alternate_content_source.rb +15 -4
  47. data/app/models/katello/alternate_content_source_product.rb +1 -1
  48. data/app/models/katello/authorization/repository.rb +2 -2
  49. data/app/models/katello/cdn_configuration.rb +12 -3
  50. data/app/models/katello/concerns/host_managed_extensions.rb +15 -2
  51. data/app/models/katello/concerns/http_proxy_extensions.rb +5 -10
  52. data/app/models/katello/concerns/smart_proxy_extensions.rb +30 -15
  53. data/app/models/katello/content.rb +15 -0
  54. data/app/models/katello/content_credential.rb +8 -9
  55. data/app/models/katello/content_view.rb +7 -3
  56. data/app/models/katello/content_view_component.rb +4 -0
  57. data/app/models/katello/content_view_version.rb +1 -1
  58. data/app/models/katello/erratum.rb +6 -2
  59. data/app/models/katello/host/content_facet.rb +13 -3
  60. data/app/models/katello/repository.rb +15 -1
  61. data/app/models/katello/root_repository.rb +0 -2
  62. data/app/overrides/add_smart_proxy_form.rb +5 -0
  63. data/app/presenters/katello/content_view_version_compare_presenter.rb +5 -0
  64. data/app/presenters/katello/host_package_presenter.rb +4 -4
  65. data/app/services/katello/pulp3/alternate_content_source.rb +23 -15
  66. data/app/services/katello/pulp3/ansible_collection.rb +7 -10
  67. data/app/services/katello/pulp3/content_view_version/export.rb +19 -6
  68. data/app/services/katello/pulp3/content_view_version/import.rb +2 -0
  69. data/app/services/katello/pulp3/content_view_version/import_validator.rb +21 -5
  70. data/app/services/katello/pulp3/content_view_version/importable_products.rb +11 -1
  71. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +38 -9
  72. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +12 -5
  73. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +13 -2
  74. data/app/services/katello/pulp3/content_view_version/syncable_format_export.rb +5 -1
  75. data/app/services/katello/pulp3/pulp_content_unit.rb +3 -0
  76. data/app/services/katello/pulp3/repository.rb +18 -6
  77. data/app/services/katello/pulp3/repository_mirror.rb +0 -1
  78. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +2 -2
  79. data/app/services/katello/pulp3/task_group.rb +18 -1
  80. data/app/services/katello/repository_type.rb +5 -2
  81. data/app/services/katello/repository_type_manager.rb +4 -3
  82. data/app/views/dashboard/_content_views_widget.html.erb +1 -1
  83. data/app/views/foreman/job_templates/change_content_source.erb +6 -0
  84. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +7 -1
  85. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +4 -4
  86. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +1 -0
  87. data/app/views/katello/api/v2/alternate_content_sources/permissions.rabl +11 -0
  88. data/app/views/katello/api/v2/content_credentials/show.json.rabl +12 -0
  89. data/app/views/katello/api/v2/content_views/permissions.rabl +1 -0
  90. data/app/views/katello/api/v2/host_packages/base.json.rabl +1 -1
  91. data/app/views/katello/api/v2/module_streams/show.json.rabl +7 -0
  92. data/app/views/katello/api/v2/repositories/compare.json.rabl +10 -0
  93. data/app/views/katello/api/v2/smart_proxies/pulp_info.json.rabl +1 -0
  94. data/app/views/katello/hosts/_errata_counts.html.erb +46 -0
  95. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +1 -0
  96. data/app/views/overrides/smart_proxies/_acs_http_proxy.html.erb +6 -0
  97. data/config/initializers/monkeys.rb +1 -0
  98. data/config/routes/api/v2.rb +2 -0
  99. data/config/routes.rb +3 -0
  100. data/db/migrate/20220730033504_update_custom_cdn.rb +13 -0
  101. data/db/migrate/20220920173656_add_http_proxy_to_smart_proxy.rb +7 -0
  102. data/db/migrate/20220920180858_remove_http_proxy_from_katello_alternate_content_sources.rb +6 -0
  103. data/engines/bastion/app/assets/javascripts/bastion/components/notification.service.js +1 -1
  104. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +5 -5
  105. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +1 -1
  106. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credential.factory.js +17 -0
  107. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.routes.js +10 -0
  108. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-acs.controller.js +36 -0
  109. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-details.controller.js +7 -1
  110. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-acs.html +38 -0
  111. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-details.html +3 -0
  112. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/views/content-credentials.html +7 -2
  113. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +4 -2
  114. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +1 -1
  115. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +4 -3
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +14 -1392
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/katello-features.run.js +1 -0
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +7 -0
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +1 -1
  120. data/lib/katello/permission_creator.rb +1 -0
  121. data/lib/katello/plugin.rb +34 -11
  122. data/lib/katello/repository_types/deb.rb +1 -1
  123. data/lib/katello/repository_types/docker.rb +1 -1
  124. data/lib/katello/repository_types/python.rb +3 -3
  125. data/lib/katello/tasks/check_candlepin_content.rake +16 -0
  126. data/lib/katello/tasks/reset.rake +1 -1
  127. data/lib/katello/version.rb +1 -1
  128. data/lib/monkeys/try_pulp_container_path.rb +35 -0
  129. data/locale/action_names.rb +7 -7
  130. data/locale/bn/katello.po +395 -63
  131. data/locale/cs/katello.po +396 -64
  132. data/locale/de/katello.po +399 -67
  133. data/locale/en/katello.po +395 -63
  134. data/locale/es/katello.po +399 -67
  135. data/locale/fr/katello.po +400 -68
  136. data/locale/gu/katello.po +395 -63
  137. data/locale/hi/katello.po +395 -63
  138. data/locale/it/katello.po +396 -64
  139. data/locale/ja/katello.po +400 -68
  140. data/locale/katello.pot +1916 -1213
  141. data/locale/kn/katello.po +395 -63
  142. data/locale/ko/katello.po +396 -64
  143. data/locale/mr/katello.po +395 -63
  144. data/locale/or/katello.po +395 -63
  145. data/locale/pa/katello.po +395 -63
  146. data/locale/pt/katello.po +395 -63
  147. data/locale/pt_BR/katello.po +399 -67
  148. data/locale/ru/katello.po +396 -64
  149. data/locale/ta/katello.po +395 -63
  150. data/locale/te/katello.po +395 -63
  151. data/locale/zh_CN/katello.po +400 -68
  152. data/locale/zh_TW/katello.po +396 -64
  153. data/webpack/components/Bookmark/index.js +5 -1
  154. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  155. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +6 -0
  156. data/webpack/components/EditableSwitch.js +1 -0
  157. data/webpack/components/EditableTextInput/EditableTextInput.js +3 -3
  158. data/webpack/components/Errata/errataHelpers.js +33 -0
  159. data/webpack/components/Errata/index.js +45 -12
  160. data/webpack/components/Loading.js +18 -8
  161. data/webpack/components/Packages/index.js +8 -24
  162. data/webpack/components/RoutedTabs/index.js +1 -0
  163. data/webpack/components/Search/Search.js +20 -2
  164. data/webpack/components/Search/__tests__/search.test.js +3 -3
  165. data/webpack/components/Table/EmptyStateMessage.js +1 -1
  166. data/webpack/components/Table/PageControls.js +1 -0
  167. data/webpack/components/Table/TableHooks.js +4 -0
  168. data/webpack/components/Table/TableWrapper.js +7 -7
  169. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +1 -0
  170. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -0
  171. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +1 -1
  172. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +3 -1
  173. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +2 -1
  174. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +124 -68
  175. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +5 -0
  176. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +30 -4
  177. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.scss +23 -0
  178. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +5 -4
  179. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +25 -10
  180. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +3 -3
  181. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +6 -0
  182. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +145 -32
  183. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +3 -1
  184. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -1
  185. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  186. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +78 -26
  187. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +23 -10
  188. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesConstants.js +1 -0
  189. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +9 -4
  190. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +141 -23
  191. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.scss +6 -1
  192. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +9 -8
  193. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +24 -3
  194. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +7 -2
  195. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +2 -1
  196. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +20 -4
  197. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +56 -38
  198. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +3 -3
  199. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +5 -4
  200. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +3 -3
  201. data/webpack/containers/Application/config.js +2 -2
  202. data/webpack/containers/Application/overrides.scss +12 -0
  203. data/webpack/global_test_setup.js +19 -1
  204. data/webpack/ouia_id_check.js +0 -2
  205. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -8
  206. data/webpack/scenes/AlternateContentSources/ACSActions.js +37 -6
  207. data/webpack/scenes/AlternateContentSources/ACSConstants.js +2 -0
  208. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +1 -1
  209. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +6 -6
  210. data/webpack/scenes/AlternateContentSources/Acs.scss +3 -0
  211. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +24 -3
  212. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +10 -8
  213. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +25 -4
  214. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +22 -11
  215. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +27 -2
  216. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +49 -17
  217. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +76 -23
  218. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +159 -11
  219. data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +83 -29
  220. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditCredentials.js +9 -8
  221. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +2 -2
  222. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditProducts.js +2 -2
  223. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditSmartProxies.js +39 -7
  224. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +27 -11
  225. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSEdits.test.js +58 -55
  226. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSExpandableDetails.test.js +35 -32
  227. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +323 -150
  228. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +5 -1
  229. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +10 -11
  230. data/webpack/scenes/AlternateContentSources/helpers.js +26 -0
  231. data/webpack/scenes/ContentViews/ContentViewsConstants.js +1 -0
  232. data/webpack/scenes/ContentViews/ContentViewsPage.js +1 -1
  233. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -0
  234. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +1 -0
  235. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -5
  236. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +30 -7
  237. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +1 -0
  238. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +21 -6
  239. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +3 -3
  240. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +1 -0
  241. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +1 -0
  242. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +2 -0
  243. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -0
  244. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -1
  245. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +1 -1
  246. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
  247. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +14 -0
  248. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +11 -1
  249. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +1 -1
  250. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +2 -0
  251. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +5 -0
  252. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +1 -0
  253. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +1 -0
  254. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +8 -2
  255. data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +5 -1
  256. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +22 -6
  257. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +19 -9
  258. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +9 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +9 -2
  260. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +8 -2
  261. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +1 -1
  262. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  263. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +3 -2
  264. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +1 -1
  265. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +1 -1
  268. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +1 -1
  269. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +2 -2
  270. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +2 -0
  271. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -1
  272. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +3 -3
  273. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.js +9 -1
  274. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +83 -0
  275. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +32 -8
  276. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionCompare.test.js +56 -3
  277. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/cvCompareRepositories.fixtures.json +175 -0
  278. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +6 -2
  279. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +3 -3
  280. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +1 -0
  281. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +1 -0
  282. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +2 -2
  283. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +2 -2
  284. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +2 -2
  285. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +1 -0
  286. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +4 -1
  287. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +5 -4
  288. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +5 -1
  289. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -3
  290. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +10 -5
  291. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +2 -0
  292. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +1 -0
  293. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +81 -19
  294. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  295. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +1 -0
  296. data/webpack/scenes/ContentViews/components/InactiveText.js +9 -1
  297. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +4 -2
  298. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +3 -2
  299. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +18 -11
  300. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +15 -8
  301. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +3 -4
  302. data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +55 -0
  303. data/webpack/scenes/Hosts/ChangeContentSource/components/HostsModal.js +59 -0
  304. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +1 -0
  305. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +2 -5
  306. data/webpack/scenes/Hosts/ChangeContentSource/index.js +46 -41
  307. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +5 -5
  308. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +10 -1
  309. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +1 -1
  310. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +97 -2
  311. data/webpack/scenes/Organizations/OrganizationSelectors.js +1 -0
  312. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +2 -1
  313. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +10 -25
  314. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CustomCdnTypeForm.js +154 -0
  315. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/ExportSyncForm.js +4 -4
  316. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/NetworkSyncForm.js +59 -44
  317. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +3 -28
  318. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CustomCdnTypeForm.test.js +97 -0
  319. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/ExportSyncForm.test.js +1 -1
  320. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/NetworkSyncForm.test.js +4 -4
  321. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +23 -10
  322. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +1 -1
  323. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +2 -1
  324. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +5 -5
  325. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +3 -3
  326. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/__snapshots__/UpstreamSubscriptionsPage.test.js.snap +2 -2
  327. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +3 -3
  328. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +3 -3
  329. data/webpack/scenes/Tasks/helpers.js +14 -7
  330. metadata +54 -35
  331. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh_remote.rb +0 -18
  332. data/db/migrate/20221206170122_update_ignore_srpm_to_false_for_mirror_complete.rb +0 -5
  333. data/vendor/assets/javascripts/katello/jquery.trunk8.js +0 -203
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
2
  import {
3
3
  Card,
4
4
  CardHeader,
@@ -7,24 +7,29 @@ import {
7
7
  Flex,
8
8
  FlexItem,
9
9
  GridItem,
10
+ ToggleGroup,
10
11
  } from '@patternfly/react-core';
12
+ import { ExclamationTriangleIcon } from '@patternfly/react-icons';
11
13
  import { translate as __ } from 'foremanReact/common/I18n';
12
14
  import { propsToCamelCase } from 'foremanReact/common/helpers';
13
15
  import PropTypes from 'prop-types';
14
16
  import { ChartPie } from '@patternfly/react-charts';
15
- import { ErrataMapper } from '../../../../components/Errata';
17
+ import { ErrataMapper, ErrataToggleGroupItem } from '../../../../components/Errata';
16
18
  import { hostIsRegistered } from '../hostDetailsHelpers';
17
19
  import { TranslatedAnchor } from '../../../Table/components/TranslatedPlural';
18
20
  import EmptyStateMessage from '../../../Table/EmptyStateMessage';
19
21
  import './ErrataOverviewCard.scss';
22
+ import { errataStatusContemplation } from '../../../Errata/errataHelpers';
20
23
 
21
24
  function HostInstallableErrata({
22
- id, errataCounts, errataStatus,
25
+ id, errataCounts, errataStatus, errataCategory, errataStatusLabel,
23
26
  }) {
24
- const errataTotal = errataCounts.total;
25
- const errataSecurity = errataCounts.security;
26
- const errataBug = errataCounts.bugfix;
27
- const errataEnhance = errataCounts.enhancement;
27
+ const counts = errataCategory === 'applicable' ? errataCounts.applicable : errataCounts;
28
+ const errataTotal = counts.total;
29
+ const errataSecurity = counts.security;
30
+ const errataBug = counts.bugfix;
31
+ const errataEnhance = counts.enhancement;
32
+ const { neededErrata, allUpToDate, otherErrataStatus } = errataStatusContemplation(errataStatus);
28
33
  const chartData = [{
29
34
  w: 'security advisories', x: 'security', y: errataSecurity, z: errataTotal,
30
35
  }, {
@@ -33,74 +38,115 @@ function HostInstallableErrata({
33
38
  w: 'enhancements', x: 'enhancement', y: errataEnhance, z: errataTotal,
34
39
  }];
35
40
  return (
36
- <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
37
- <Card isHoverable>
38
- <CardHeader>
39
- <CardTitle>{__('Installable errata')}</CardTitle>
40
- </CardHeader>
41
- <CardBody>
42
- {errataStatus === 0 &&
43
- <EmptyStateMessage
44
- title={__('All errata up-to-date')}
45
- body={__('No action required')}
46
- happy
41
+ <CardBody>
42
+ {allUpToDate &&
43
+ <EmptyStateMessage
44
+ title={__('All errata up-to-date')}
45
+ body={__('No action required')}
46
+ happy
47
+ />
48
+ }
49
+ {otherErrataStatus &&
50
+ <EmptyStateMessage
51
+ title={null}
52
+ body={errataStatusLabel}
53
+ customIcon={ExclamationTriangleIcon}
54
+ secondaryActionTitle={__('Enable repository sets')}
55
+ secondaryActionLink="#/Content/Repository%20sets?show=all"
56
+ showSecondaryAction
57
+ />
58
+ }
59
+ {neededErrata &&
60
+ <Flex direction="column">
61
+ <FlexItem>
62
+ <TranslatedAnchor
63
+ id="errata-card-total-count"
64
+ href={`#/Content/errata?show=${errataCategory}`}
65
+ count={errataTotal}
66
+ plural="errata"
67
+ singular="erratum"
68
+ ariaLabel={`${errataTotal} total errata`}
47
69
  />
48
- }
49
- {errataStatus !== 0 &&
50
- <Flex direction="column">
51
- <FlexItem>
52
- <TranslatedAnchor
53
- id="errata-card-total-count"
54
- href="#/Content/errata"
55
- count={errataTotal}
56
- plural="errata"
57
- singular="erratum"
58
- ariaLabel={`${errataTotal} total errata`}
70
+ </FlexItem>
71
+ <Flex flexWrap={{ xl: 'nowrap' }} direction="row" alignItems={{ default: 'alignItemsCenter' }}>
72
+ <div className="piechart-overflow" style={{ overflow: 'visible', minWidth: '140px', maxHeight: '155px' }}>
73
+ <div className="erratachart" style={{ minWidth: '300px', minHeight: '300px' }}>
74
+ <ChartPie
75
+ ariaDesc="errataChart"
76
+ data={chartData}
77
+ constrainToVisibleArea
78
+ labels={({ datum }) => `${datum.y} ${datum.w}`}
79
+ padding={{
80
+ bottom: 20,
81
+ left: 20,
82
+ right: 140,
83
+ top: 20,
84
+ }}
85
+ width={250}
86
+ height={130}
59
87
  />
88
+ </div>
89
+ </div>
90
+ <div className="erratalegend" style={{ minWidth: '140px' }}>
91
+ <FlexItem>
92
+ <ErrataMapper data={chartData} id={id} errataCategory={errataCategory} />
60
93
  </FlexItem>
61
- <Flex flexWrap={{ xl: 'nowrap' }} direction="row" alignItems={{ default: 'alignItemsCenter' }}>
62
- <div className="piechart-overflow" style={{ overflow: 'visible', minWidth: '140px', maxHeight: '155px' }}>
63
- <div className="erratachart" style={{ minWidth: '300px', minHeight: '300px' }}>
64
- <ChartPie
65
- ariaDesc="errataChart"
66
- data={chartData}
67
- constrainToVisibleArea
68
- labels={({ datum }) => `${datum.y} ${datum.w}`}
69
- padding={{
70
- bottom: 20,
71
- left: 20,
72
- right: 140,
73
- top: 20,
74
- }}
75
- width={250}
76
- height={130}
77
- />
78
- </div>
79
- </div>
80
- <div className="erratalegend" style={{ minWidth: '140px' }}>
81
- <FlexItem>
82
- <ErrataMapper data={chartData} id={id} />
83
- </FlexItem>
84
- </div>
85
- </Flex>
86
- </Flex>
87
- }
88
- </CardBody>
89
- </Card>
90
- </GridItem>
94
+ </div>
95
+ </Flex>
96
+ </Flex>
97
+ }
98
+ </CardBody>
91
99
  );
92
100
  }
93
101
 
94
102
  const ErrataOverviewCard = ({ hostDetails }) => {
95
- if (hostIsRegistered({ hostDetails }) && hostDetails.content_facet_attributes) {
96
- const { id: hostId, errata_status: errataStatus } = hostDetails;
97
- return (<HostInstallableErrata
98
- {...propsToCamelCase(hostDetails.content_facet_attributes)}
99
- id={hostId}
100
- errataStatus={errataStatus}
101
- />);
102
- }
103
- return null;
103
+ const hostPopulated = (hostIsRegistered({ hostDetails }) &&
104
+ !!hostDetails.content_facet_attributes);
105
+
106
+ const [errataCategory, setErrataCategory] = useState('applicable');
107
+ if (!hostPopulated) return null;
108
+ const {
109
+ id: hostId,
110
+ errata_status: errataStatus,
111
+ errata_status_label: errataStatusLabel,
112
+ } = hostDetails;
113
+ const { neededErrata } = errataStatusContemplation(errataStatus);
114
+ return (
115
+ <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
116
+ <Card ouiaId="errata-card">
117
+ <CardHeader>
118
+ <Flex spaceItems={{ default: 'spaceItemsXl' }}>
119
+ <CardTitle>{__('Errata')}</CardTitle>
120
+ {neededErrata &&
121
+ <ToggleGroup isCompact>
122
+ <ErrataToggleGroupItem
123
+ text={__('Applicable')}
124
+ aria-label="Show applicable errata chart"
125
+ tooltipText={__('Applicable errata apply to at least one package installed on the host.')}
126
+ isSelected={errataCategory === 'applicable'}
127
+ onChange={selected => selected && setErrataCategory('applicable')}
128
+ />
129
+ <ErrataToggleGroupItem
130
+ text={__('Installable')}
131
+ aria-label="Show installable errata chart"
132
+ tooltipText={__('Installable errata are applicable errata that are available in the host\'s content view and lifecycle environment.')}
133
+ isSelected={errataCategory === 'installable'}
134
+ onChange={selected => selected && setErrataCategory('installable')}
135
+ />
136
+ </ToggleGroup>
137
+ }
138
+ </Flex>
139
+ </CardHeader>
140
+ <HostInstallableErrata
141
+ {...propsToCamelCase(hostDetails.content_facet_attributes)}
142
+ id={hostId}
143
+ errataCategory={errataCategory}
144
+ errataStatus={errataStatus}
145
+ errataStatusLabel={errataStatusLabel}
146
+ />
147
+ </Card>
148
+ </GridItem>
149
+ );
104
150
  };
105
151
 
106
152
  HostInstallableErrata.propTypes = {
@@ -110,12 +156,21 @@ HostInstallableErrata.propTypes = {
110
156
  enhancement: PropTypes.number,
111
157
  security: PropTypes.number,
112
158
  total: PropTypes.number,
159
+ applicable: PropTypes.shape({
160
+ bugfix: PropTypes.number,
161
+ enhancement: PropTypes.number,
162
+ security: PropTypes.number,
163
+ }),
113
164
  }).isRequired,
114
165
  errataStatus: PropTypes.number,
166
+ errataStatusLabel: PropTypes.string,
167
+ errataCategory: PropTypes.string,
115
168
  };
116
169
 
117
170
  HostInstallableErrata.defaultProps = {
118
171
  errataStatus: undefined,
172
+ errataStatusLabel: __('Unknown errata status'),
173
+ errataCategory: 'applicable',
119
174
  };
120
175
 
121
176
  ErrataOverviewCard.propTypes = {
@@ -123,6 +178,7 @@ ErrataOverviewCard.propTypes = {
123
178
  content_facet_attributes: PropTypes.shape({}),
124
179
  id: PropTypes.number,
125
180
  errata_status: PropTypes.number,
181
+ errata_status_label: PropTypes.string,
126
182
  }),
127
183
  };
128
184
 
@@ -1,3 +1,8 @@
1
1
  .pf-c-empty-state {
2
2
  margin-top: 0;
3
+ }
4
+ .piechart-overflow {
5
+ margin-right: -20px;
6
+ position: relative;
7
+ left: -30px;
3
8
  }
@@ -1,6 +1,7 @@
1
1
  import React, { useState } from 'react';
2
2
  import {
3
3
  Badge,
4
+ Button,
4
5
  Card,
5
6
  CardHeader,
6
7
  CardTitle,
@@ -13,12 +14,15 @@ import {
13
14
  GridItem,
14
15
  DropdownItem,
15
16
  } from '@patternfly/react-core';
17
+ import { PlusCircleIcon } from '@patternfly/react-icons';
16
18
  import { translate as __ } from 'foremanReact/common/I18n';
17
19
  import { propsToCamelCase } from 'foremanReact/common/helpers';
18
20
  import PropTypes from 'prop-types';
19
21
  import { useSet } from '../../../../Table/TableHooks';
20
22
  import { HostCollectionsAddModal, HostCollectionsRemoveModal } from './HostCollectionsModal';
21
23
  import { hasRequiredPermissions, hostIsRegistered, userPermissionsFromHostDetails } from '../../hostDetailsHelpers';
24
+ import EmptyStateMessage from '../../../../Table/EmptyStateMessage';
25
+ import './HostCollectionsCard.scss';
22
26
 
23
27
  const requiredPermissions = ['edit_hosts', 'view_host_collections'];
24
28
 
@@ -49,6 +53,7 @@ const HostCollectionsDetails = ({
49
53
  const dropdownItems = [
50
54
  <DropdownItem
51
55
  aria-label="add_host_to_collections"
56
+ ouiaId="add_host_to_collections"
52
57
  key="add_host_to_collections"
53
58
  component="button"
54
59
  onClick={openAddHostCollectionsModal}
@@ -57,6 +62,7 @@ const HostCollectionsDetails = ({
57
62
  </DropdownItem>,
58
63
  <DropdownItem
59
64
  aria-label="remove_host_from_collections"
65
+ ouiaId="remove_host_from_collections"
60
66
  key="remove_host_from_collections"
61
67
  component="button"
62
68
  isDisabled={!hostCollections.length}
@@ -66,9 +72,19 @@ const HostCollectionsDetails = ({
66
72
  </DropdownItem>,
67
73
  ];
68
74
 
75
+ const primaryActionButton =
76
+ (
77
+ <Button
78
+ ouiaId="add-to-a-host-collection-button"
79
+ onClick={openAddHostCollectionsModal}
80
+ variant="secondary"
81
+ aria-label="add_to_a_host_collection"
82
+ > {__('Add to a host collection')}
83
+ </Button>);
84
+
69
85
  return (
70
86
  <GridItem rowSpan={1} md={6} lg={4} xl2={3}>
71
- <Card isHoverable>
87
+ <Card ouiaId="host-collections-card">
72
88
  <CardHeader>
73
89
  <Flex
74
90
  alignItems={{ default: 'alignItemsCenter' }}
@@ -88,10 +104,11 @@ const HostCollectionsDetails = ({
88
104
  </FlexItem>
89
105
  </Flex>
90
106
  </FlexItem>
91
- {showKebab && (
107
+ {showKebab && hostCollections?.length > 0 && (
92
108
  <FlexItem>
93
109
  <Dropdown
94
110
  toggle={<KebabToggle aria-label="host_collections_bulk_actions" onToggle={toggleBulkAction} />}
111
+ ouiaId="host-collections-bulk-actions-dropdown"
95
112
  isOpen={isDropdownOpen}
96
113
  isPlain
97
114
  position="right"
@@ -101,7 +118,16 @@ const HostCollectionsDetails = ({
101
118
  }
102
119
  </Flex>
103
120
  </CardHeader>
104
- <CardBody>
121
+ <CardBody className={`host-collection-card-body${hostCollections?.length === 0 ? ' empty' : ''}`}>
122
+ {hostCollections?.length === 0 &&
123
+ <EmptyStateMessage
124
+ title={__('No host collections yet')}
125
+ body={__('To get started, add this host to a host collection.')}
126
+ customIcon={PlusCircleIcon}
127
+ showPrimaryAction
128
+ primaryActionButton={primaryActionButton}
129
+ />
130
+ }
105
131
  {hostCollections?.map((hostCollection) => {
106
132
  const {
107
133
  id, name, description, maxHosts, unlimitedHosts, totalHosts,
@@ -130,7 +156,7 @@ const HostCollectionsDetails = ({
130
156
  </div>
131
157
  </ExpandableSection>
132
158
  </FlexItem>
133
- <FlexItem component="span">
159
+ <FlexItem component="span" spacer={{ default: 'spacerXl' }}>
134
160
  {totalHosts}/{unlimitedHosts ? 'unlimited' : maxHosts}
135
161
  </FlexItem>
136
162
  </Flex>
@@ -0,0 +1,23 @@
1
+ .host-collection-card-body {
2
+ .pf-l-bullseye {
3
+ position: relative;
4
+ top: -20px;
5
+ }
6
+ .pf-c-empty-state__icon {
7
+ font-size: 2em;
8
+ }
9
+ .pf-m-lg {
10
+ margin: -20px;
11
+ }
12
+ .pf-c-empty-state__body {
13
+ font-size: smaller;
14
+ margin-top: 1.4em;
15
+ margin-bottom: 1em;
16
+ }
17
+ .pf-m-secondary {
18
+ margin-top: 5px;
19
+ }
20
+ }
21
+ .host-collection-card-body.empty {
22
+ padding-bottom: 0;
23
+ }
@@ -120,10 +120,10 @@ export const HostCollectionsModal = ({
120
120
  };
121
121
 
122
122
  const modalActions = ([
123
- <Button key="add" variant="primary" onClick={handleModalAction} isDisabled={!selectedCount}>
123
+ <Button key="add" ouiaId="add-button" variant="primary" onClick={handleModalAction} isDisabled={!selectedCount}>
124
124
  {adding ? __('Add') : __('Remove')}
125
125
  </Button>,
126
- <Button key="cancel" variant="link" onClick={handleModalCancel}>
126
+ <Button key="cancel" ouiaId="cancel-button" variant="link" onClick={handleModalCancel}>
127
127
  {__('Cancel')}
128
128
  </Button>,
129
129
  ]);
@@ -136,6 +136,7 @@ export const HostCollectionsModal = ({
136
136
  position="top"
137
137
  actions={modalActions}
138
138
  id={adding ? 'add-host-to-host-collections-modal' : 'remove-host-from-host-collections-modal'}
139
+ ouiaId="host-collections-modal"
139
140
  >
140
141
  <FormattedMessage
141
142
  className="host-collections-modal-blurb"
@@ -175,7 +176,7 @@ export const HostCollectionsModal = ({
175
176
  requestKey={adding ? AVAILABLE_HOST_COLLECTIONS_KEY : REMOVABLE_HOST_COLLECTIONS_KEY}
176
177
  >
177
178
  <Thead>
178
- <Tr>
179
+ <Tr ouiaId="row-header">
179
180
  {columnHeaders.map(col =>
180
181
  <Th key={col}>{col}</Th>)}
181
182
  <Th />
@@ -188,7 +189,7 @@ export const HostCollectionsModal = ({
188
189
  } = propsToCamelCase(hostCollection);
189
190
  const isDisabled = (adding && hostLimitExceeded(hostCollection));
190
191
  return (
191
- <Tr key={id}>
192
+ <Tr key={id} ouiaId={`row-${id}`}>
192
193
  <Td
193
194
  select={{
194
195
  disable: isDisabled,
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { render, fireEvent } from 'react-testing-lib-wrapper';
2
+ import { render, fireEvent, renderWithRedux } from 'react-testing-lib-wrapper';
3
+
3
4
  import HostCollectionsCard from '../HostCollectionsCard';
4
5
 
5
6
  const hostDetails = {
@@ -41,6 +42,17 @@ const emptyHostDetails = {
41
42
  },
42
43
  };
43
44
 
45
+ const renderOptions = {
46
+ initialState: {
47
+ // This is the API state that your tests depend on for their data
48
+ // You can cross reference the needed useSelectors from your tested components
49
+ // with the data found within the redux chrome add-on to help determine this fixture data.
50
+ katello: {
51
+ hostDetails: {},
52
+ },
53
+ },
54
+ };
55
+
44
56
  jest.mock('../../../hostDetailsHelpers', () => ({
45
57
  ...jest.requireActual('../../../hostDetailsHelpers'),
46
58
  userPermissionsFromHostDetails: () => ({
@@ -59,9 +71,15 @@ test('shows host collections and host limits when present', () => {
59
71
  });
60
72
 
61
73
  test('shows empty card when no host collections present', () => {
62
- const { queryByText } = render(<HostCollectionsCard hostDetails={emptyHostDetails} />);
74
+ const {
75
+ queryByText,
76
+ getByText,
77
+ queryByLabelText,
78
+ } = renderWithRedux(<HostCollectionsCard hostDetails={emptyHostDetails} />, renderOptions);
63
79
  expect(queryByText('Host collections')).toBeInTheDocument();
64
80
  expect(queryByText('Jturel hosts')).not.toBeInTheDocument();
81
+ expect(getByText('No host collections yet')).toBeInTheDocument();
82
+ expect(queryByLabelText('add_to_a_host_collection')).toBeInTheDocument();
65
83
  });
66
84
 
67
85
  test('expands to show description', () => {
@@ -98,15 +116,12 @@ test('shows add and remove options in kebab', () => {
98
116
  expect(remove).toHaveAttribute('aria-disabled', 'false');
99
117
  });
100
118
 
101
- test('remove is disabled when no host collections present', () => {
102
- const { queryByLabelText } = render(<HostCollectionsCard hostDetails={emptyHostDetails} />);
119
+ test('kebab is not displayed when no host collections present', () => {
120
+ const {
121
+ queryByLabelText,
122
+ } = renderWithRedux(<HostCollectionsCard hostDetails={emptyHostDetails} />, renderOptions);
103
123
  const kebab = queryByLabelText('host_collections_bulk_actions');
104
- expect(kebab).toBeInTheDocument();
105
- fireEvent.click(kebab);
106
-
107
- const remove = queryByLabelText('remove_host_from_collections');
108
- expect(remove).toBeInTheDocument();
109
- expect(remove).toHaveAttribute('aria-disabled', 'true');
124
+ expect(kebab).not.toBeInTheDocument();
110
125
  });
111
126
 
112
127
  test('does not show card when host not registered', () => {
@@ -50,7 +50,7 @@ const SystemPurposeCard = ({ hostDetails }) => {
50
50
  if (!hostDetails?.id) {
51
51
  return (
52
52
  <GridItem rowSpan={1} md={6} lg={4} xl2={3}>
53
- <Card isHoverable ouiaId="system-purpose-card">
53
+ <Card ouiaId="system-purpose-card">
54
54
  <Skeleton />
55
55
  </Card>
56
56
  </GridItem>
@@ -61,7 +61,7 @@ const SystemPurposeCard = ({ hostDetails }) => {
61
61
 
62
62
  return (
63
63
  <GridItem rowSpan={1} md={6} lg={4} xl2={3}>
64
- <Card isHoverable ouiaId="system-purpose-card">
64
+ <Card ouiaId="system-purpose-card">
65
65
  <CardHeader>
66
66
  <Flex
67
67
  alignItems={{ default: 'alignItemsCenter' }}
@@ -78,7 +78,7 @@ const SystemPurposeCard = ({ hostDetails }) => {
78
78
  </FlexItem>
79
79
  <FlexItem>
80
80
  <Tooltip
81
- content={__('System purpose allows you to set the system\'s intended use on your network and improves the reporting of usage in Subscription Watch.')}
81
+ content={__('System purpose enables you to set the system\'s intended use on your network and improves reporting accuracy in the Subscriptions service of the Red Hat Hybrid Cloud Console.')}
82
82
  position="top"
83
83
  enableFlip
84
84
  isContentLeftAligned
@@ -175,6 +175,7 @@ const SystemPurposeEditModal = ({
175
175
  position="top"
176
176
  actions={modalActions}
177
177
  id="syspurpose-edit-modal"
178
+ ouiaId="syspurpose-edit-modal"
178
179
  >
179
180
  <FormattedMessage
180
181
  className="syspurpose-edit-modal-blurb"
@@ -189,6 +190,7 @@ const SystemPurposeEditModal = ({
189
190
  <FormSelect
190
191
  id="role"
191
192
  name="role"
193
+ ouiaId="role-select"
192
194
  value={selectedRole}
193
195
  onChange={setSelectedRole}
194
196
  >
@@ -205,6 +207,7 @@ const SystemPurposeEditModal = ({
205
207
  <FormSelect
206
208
  id="serviceLevel"
207
209
  name="serviceLevel"
210
+ ouiaId="service-level-select"
208
211
  value={selectedServiceLevel}
209
212
  onChange={setSelectedServiceLevel}
210
213
  >
@@ -221,6 +224,7 @@ const SystemPurposeEditModal = ({
221
224
  <FormSelect
222
225
  id="usage"
223
226
  name="usage"
227
+ ouiaId="usage-select"
224
228
  value={selectedUsage}
225
229
  onChange={setSelectedUsage}
226
230
  >
@@ -237,6 +241,7 @@ const SystemPurposeEditModal = ({
237
241
  <FormSelect
238
242
  id="release_version"
239
243
  name="release_version"
244
+ ouiaId="release-version-select"
240
245
  value={selectedReleaseVersion}
241
246
  onChange={setSelectedReleaseVersion}
242
247
  >
@@ -256,6 +261,7 @@ const SystemPurposeEditModal = ({
256
261
  <Select
257
262
  variant={SelectVariant.typeaheadMulti}
258
263
  aria-label="syspurpose-addons"
264
+ ouiaId="syspurpose-addons-select"
259
265
  onToggle={toggleAddonSelect}
260
266
  onSelect={onAddonSelect}
261
267
  selections={selectedAddons}