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
@@ -355,13 +355,34 @@ const RepositorySetsTab = () => {
355
355
  cannot(createBookmarks, userPermissionsFromHostDetails({ hostDetails }));
356
356
 
357
357
  const dropdownItems = [
358
- <DropdownItem aria-label="bulk_enable" key="bulk_enable" ouiaId="bulk_enable" component="button" onClick={enableRepoSets} isDisabled={selectedCount === 0}>
358
+ <DropdownItem
359
+ aria-label="bulk_enable"
360
+ key="bulk_enable"
361
+ ouiaId="bulk_enable"
362
+ component="button"
363
+ onClick={enableRepoSets}
364
+ isDisabled={selectedCount === 0}
365
+ >
359
366
  {__('Override to enabled')}
360
367
  </DropdownItem>,
361
- <DropdownItem aria-label="bulk_disable" key="bulk_disable" ouiaId="bulk_disable" component="button" onClick={disableRepoSets} isDisabled={selectedCount === 0}>
368
+ <DropdownItem
369
+ aria-label="bulk_disable"
370
+ key="bulk_disable"
371
+ ouiaId="bulk_disable"
372
+ component="button"
373
+ onClick={disableRepoSets}
374
+ isDisabled={selectedCount === 0}
375
+ >
362
376
  {__('Override to disabled')}
363
377
  </DropdownItem>,
364
- <DropdownItem aria-label="bulk_reset_default" key="bulk_reset_default" ouiaId="bulk_reset_default" component="button" onClick={resetToDefaultRepoSets} isDisabled={selectedCount === 0}>
378
+ <DropdownItem
379
+ aria-label="bulk_reset_default"
380
+ key="bulk_reset_default"
381
+ ouiaId="bulk_reset_default"
382
+ component="button"
383
+ onClick={resetToDefaultRepoSets}
384
+ isDisabled={selectedCount === 0}
385
+ >
365
386
  {__('Reset to default')}
366
387
  </DropdownItem>,
367
388
  ];
@@ -43,7 +43,7 @@ const EnableTracerModal = ({ isOpen, setIsOpen, triggerJobStart }) => {
43
43
  };
44
44
 
45
45
  const dropdownItems = dropdownOptions.map(text => (
46
- <DropdownItem key={`option_${text}`} onClick={() => setSelectedOption(text)}>{text}</DropdownItem>
46
+ <DropdownItem key={`option_${text}`} ouiaId={`option_${text}`} onClick={() => setSelectedOption(text)}>{text}</DropdownItem>
47
47
  ));
48
48
 
49
49
  const customizedRexUrl = katelloPackageInstallUrl({ hostname, packages: KATELLO_TRACER_PACKAGE });
@@ -54,6 +54,7 @@ const EnableTracerModal = ({ isOpen, setIsOpen, triggerJobStart }) => {
54
54
  return (
55
55
  <Button
56
56
  key="enable_button"
57
+ ouiaId="enable-button-via-rex"
57
58
  type="submit"
58
59
  variant="primary"
59
60
  isLoading={buttonLoading}
@@ -67,6 +68,7 @@ const EnableTracerModal = ({ isOpen, setIsOpen, triggerJobStart }) => {
67
68
  return (
68
69
  <Button
69
70
  key="enable_button"
71
+ ouiaId="enable-button-via-customized-rex"
70
72
  component="a"
71
73
  isLoading={buttonLoading}
72
74
  isDisabled={buttonLoading}
@@ -83,12 +85,13 @@ const EnableTracerModal = ({ isOpen, setIsOpen, triggerJobStart }) => {
83
85
  <Modal
84
86
  variant={ModalVariant.small}
85
87
  title={title}
88
+ ouiaId="enable-tracer-modal"
86
89
  width="28em"
87
90
  isOpen={isOpen}
88
91
  onClose={handleClose}
89
92
  actions={[
90
93
  getEnableTracerButton(),
91
- <Button key="cancel_button" variant="link" onClick={() => setIsOpen(false)}>{__('Cancel')}</Button>,
94
+ <Button key="cancel_button" ouiaId="cancel-button" variant="link" onClick={() => setIsOpen(false)}>{__('Cancel')}</Button>,
92
95
  ]}
93
96
  >
94
97
  <Flex direction={{ default: 'column' }}>
@@ -96,9 +99,11 @@ const EnableTracerModal = ({ isOpen, setIsOpen, triggerJobStart }) => {
96
99
  <FlexItem><div>{__('Select a provider to install katello-host-tools-tracer')}</div></FlexItem>
97
100
  <FlexItem>
98
101
  <Dropdown
102
+ ouiaId="enable-tracer-modal-dropdown"
99
103
  toggle={
100
104
  <DropdownToggle
101
105
  id="toggle-enable-tracer-modal-dropdown"
106
+ ouiaId="enable-tracer-modal-dropdown-toggle"
102
107
  onToggle={toggleDropdownOpen}
103
108
  toggleIndicator={CaretDownIcon}
104
109
  isDisabled={buttonLoading}
@@ -23,6 +23,7 @@ const EnableTracerButton = ({ setEnableTracerModalOpen, pollingStarted }) => (
23
23
  <Button
24
24
  onClick={() => setEnableTracerModalOpen(true)}
25
25
  isDisabled={pollingStarted}
26
+ ouiaId="enable-traces-button"
26
27
  >
27
28
  {__('Enable Traces')}
28
29
  </Button>
@@ -70,7 +71,7 @@ const TracesEnabler = ({ hostname }) => {
70
71
  <Spinner /> :
71
72
  <EmptyStateIcon icon={WrenchIcon} />
72
73
  }
73
- <Title headingLevel="h2" size="lg">
74
+ <Title ouiaId="enable-tracer-title" headingLevel="h2" size="lg">
74
75
  {pollingStarted ? enablingTitle : title}
75
76
  </Title>
76
77
  <EmptyStateBody>
@@ -125,10 +125,24 @@ const TracesTab = () => {
125
125
  cannot(createBookmarks, userPermissionsFromHostDetails({ hostDetails }));
126
126
 
127
127
  const dropdownItems = [
128
- <DropdownItem isDisabled={selectedCount === 0} aria-label="bulk_rex" key="bulk_rex" component="button" onClick={onBulkRestartApp}>
128
+ <DropdownItem
129
+ isDisabled={selectedCount === 0}
130
+ aria-label="bulk_rex"
131
+ ouiaId="bulk_rex"
132
+ key="bulk_rex"
133
+ component="button"
134
+ onClick={onBulkRestartApp}
135
+ >
129
136
  {__('Restart via remote execution')}
130
137
  </DropdownItem>,
131
- <DropdownItem isDisabled={selectedCount === 0} aria-label="bulk_rex_customized" key="bulk_rex_customized" component="a" href={bulkCustomizedRexUrl()}>
138
+ <DropdownItem
139
+ isDisabled={selectedCount === 0}
140
+ aria-label="bulk_rex_customized"
141
+ ouiaId="bulk_rex_customized"
142
+ key="bulk_rex_customized"
143
+ component="a"
144
+ href={bulkCustomizedRexUrl()}
145
+ >
132
146
  {__('Restart via customized remote execution')}
133
147
  </DropdownItem>,
134
148
  ];
@@ -140,9 +154,11 @@ const TracesTab = () => {
140
154
  <ActionListItem>
141
155
  <Dropdown
142
156
  aria-label="bulk_actions_dropdown"
157
+ ouiaId="bulk_actions_dropdown"
143
158
  toggle={
144
159
  <DropdownToggle
145
160
  aria-label="bulk_actions"
161
+ ouiaId="bulk_actions"
146
162
  splitButtonItems={[
147
163
  <DropdownToggleAction key="action" onClick={onBulkRestartApp}>
148
164
  {__('Restart app')}
@@ -205,7 +221,7 @@ const TracesTab = () => {
205
221
  requestKey={HOST_TRACES_KEY}
206
222
  >
207
223
  <Thead>
208
- <Tr>
224
+ <Tr ouiaId="row-header">
209
225
  <Th key="select_checkbox" />
210
226
  <SortableColumnHeaders
211
227
  columnHeaders={columnHeaders}
@@ -239,7 +255,7 @@ const TracesTab = () => {
239
255
  ];
240
256
  }
241
257
  return (
242
- <Tr key={id} >
258
+ <Tr key={id} ouiaId={`row-${id}`} >
243
259
  {showActions ? (
244
260
  <Td
245
261
  select={{
@@ -23,7 +23,20 @@ const contentFacetAttributes = {
23
23
  uuid: 'e5761ea3-4117-4ecf-83d0-b694f99b389e',
24
24
  content_view_default: false,
25
25
  lifecycle_environment_library: false,
26
+ errata_counts: {
27
+ total: 3,
28
+ },
26
29
  };
30
+
31
+ const cfWithErrataTotal = total => ({
32
+ ...contentFacetAttributes,
33
+ errata_counts: {
34
+ total,
35
+ },
36
+ });
37
+
38
+ const cfNoErrata = cfWithErrataTotal(0);
39
+
27
40
  const hostName = 'foo.example.com';
28
41
 
29
42
  const errataBookmarks = foremanApi.getApiUrl('/bookmarks?search=controller%3Dkatello_errata');
@@ -36,6 +49,8 @@ const renderOptions = (facetAttributes = contentFacetAttributes) => ({
36
49
  response: {
37
50
  id: 1,
38
51
  name: hostName,
52
+ errata_status_label: 'Security errata applicable',
53
+ errata_status: 2,
39
54
  content_facet_attributes: { ...facetAttributes },
40
55
  },
41
56
  status: 'RESOLVED',
@@ -145,7 +160,7 @@ test('Can handle no errata being present', async (done) => {
145
160
  .query(defaultQuery)
146
161
  .reply(200, noResults);
147
162
 
148
- const { queryByText } = renderWithRedux(<ErrataTab />, renderOptions());
163
+ const { queryByText } = renderWithRedux(<ErrataTab />, renderOptions(cfNoErrata));
149
164
 
150
165
  // Assert that there are not any errata showing on the screen.
151
166
  await patientlyWaitFor(() => expect(queryByText('This host has errata that are applicable, but not installable.')).toBeInTheDocument());
@@ -252,7 +267,7 @@ test('Can select all errata across pages through checkbox', async (done) => {
252
267
  getAllByText,
253
268
  getByLabelText,
254
269
  getAllByLabelText,
255
- } = renderWithRedux(<ErrataTab />, renderOptions());
270
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
256
271
 
257
272
  // Assert that the errata are now showing on the screen, but wait for them to appear.
258
273
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -293,7 +308,7 @@ test('Can deselect all errata across pages through checkbox', async (done) => {
293
308
  getAllByText,
294
309
  getByLabelText,
295
310
  getAllByLabelText,
296
- } = renderWithRedux(<ErrataTab />, renderOptions());
311
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
297
312
 
298
313
  // Assert that the errata are now showing on the screen, but wait for them to appear.
299
314
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -337,7 +352,7 @@ test('Can select & deselect errata across pages', async (done) => {
337
352
  getAllByText,
338
353
  getByLabelText,
339
354
  getAllByLabelText,
340
- } = renderWithRedux(<ErrataTab />, renderOptions());
355
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(100)));
341
356
 
342
357
  // Assert that the errata are now showing on the screen, but wait for them to appear.
343
358
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -373,7 +388,7 @@ test('Can select & de-select all errata through selectDropDown', async (done) =>
373
388
  queryByText,
374
389
  getAllByText,
375
390
  getByLabelText,
376
- } = renderWithRedux(<ErrataTab />, renderOptions());
391
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
377
392
 
378
393
  // Assert that the errata are now showing on the screen, but wait for them to appear.
379
394
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -425,7 +440,7 @@ test('Can de-select items in select all mode across pages', async (done) => {
425
440
  getAllByText,
426
441
  getByLabelText,
427
442
  getAllByLabelText,
428
- } = renderWithRedux(<ErrataTab />, renderOptions());
443
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
429
444
 
430
445
  // Assert that the errata are now showing on the screen, but wait for them to appear.
431
446
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -482,7 +497,7 @@ test('Can select page and select only items on the page', async (done) => {
482
497
  queryByText,
483
498
  getAllByText,
484
499
  getByLabelText,
485
- } = renderWithRedux(<ErrataTab />, renderOptions());
500
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
486
501
 
487
502
  // Assert that the errata are now showing on the screen, but wait for them to appear.
488
503
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -516,7 +531,7 @@ test('Select all is disabled if all rows are selected', async (done) => {
516
531
  queryByText,
517
532
  getAllByText,
518
533
  getByLabelText,
519
- } = renderWithRedux(<ErrataTab />, renderOptions());
534
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
520
535
 
521
536
  // Assert that the errata are now showing on the screen, but wait for them to appear.
522
537
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -568,7 +583,7 @@ test('Toggle Group shows if it\'s not the default content view or library enviro
568
583
  const {
569
584
  queryByLabelText,
570
585
  getAllByText,
571
- } = renderWithRedux(<ErrataTab />, renderOptions());
586
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
572
587
 
573
588
  // Assert that the errata are now showing on the screen, but wait for them to appear.
574
589
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -578,13 +593,13 @@ test('Toggle Group shows if it\'s not the default content view or library enviro
578
593
  });
579
594
 
580
595
  test('Toggle Group shows if it\'s the default content view but non-library environment', async (done) => {
581
- const options = renderOptions({
582
- ...contentFacetAttributes,
583
- content_view_default: true,
584
- });
585
596
  // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
586
597
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
587
598
  const mockErrata = makeMockErrata({});
599
+ const options = renderOptions({
600
+ ...cfWithErrataTotal(mockErrata.total),
601
+ content_view_default: true,
602
+ });
588
603
  // return errata data results when we look for errata
589
604
  const scope = nockInstance
590
605
  .get(hostErrata)
@@ -604,13 +619,14 @@ test('Toggle Group shows if it\'s the default content view but non-library envir
604
619
  });
605
620
 
606
621
  test('Toggle Group shows if it\'s the library environment but non-default content view', async (done) => {
607
- const options = renderOptions({
608
- ...contentFacetAttributes,
609
- lifecycle_environment_library: true,
610
- });
611
622
  // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
612
623
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
613
624
  const mockErrata = makeMockErrata({});
625
+ const options = renderOptions({
626
+ ...cfWithErrataTotal(mockErrata.total),
627
+ lifecycle_environment_library: true,
628
+ });
629
+
614
630
  // return errata data results when we look for errata
615
631
  const scope = nockInstance
616
632
  .get(hostErrata)
@@ -630,14 +646,14 @@ test('Toggle Group shows if it\'s the library environment but non-default conten
630
646
  });
631
647
 
632
648
  test('Toggle Group does not show if it\'s the default content view and library environment', async (done) => {
649
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
650
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
651
+ const mockErrata = makeMockErrata({});
633
652
  const options = renderOptions({
634
- ...contentFacetAttributes,
653
+ ...cfWithErrataTotal(mockErrata.total),
635
654
  content_view_default: true,
636
655
  lifecycle_environment_library: true,
637
656
  });
638
- // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
639
- const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
640
- const mockErrata = makeMockErrata({});
641
657
  // return errata data results when we look for errata
642
658
  const scope = nockInstance
643
659
  .get(hostErrata)
@@ -669,7 +685,7 @@ test('Selection is disabled for errata which are applicable but not installable'
669
685
  const {
670
686
  getAllByText,
671
687
  getByLabelText,
672
- } = renderWithRedux(<ErrataTab />, renderOptions());
688
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(3)));
673
689
 
674
690
  // Assert that the errata are now showing on the screen, but wait for them to appear.
675
691
  await patientlyWaitFor(() => expect(getAllByText(firstErrata.severity)[0]).toBeInTheDocument());
@@ -705,7 +721,7 @@ test('Can select only installable errata across pages through checkbox', async (
705
721
  getAllByText,
706
722
  getByLabelText,
707
723
  getAllByLabelText,
708
- } = renderWithRedux(<ErrataTab />, renderOptions());
724
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
709
725
 
710
726
  // Assert that the errata are now showing on the screen, but wait for them to appear.
711
727
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -736,14 +752,16 @@ test('Can toggle with the Toggle Group ', async (done) => {
736
752
 
737
753
  const {
738
754
  queryByLabelText,
755
+ getByText,
739
756
  getAllByText,
740
- } = renderWithRedux(<ErrataTab />, renderOptions());
757
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(mockErrata.total)));
741
758
 
742
759
  // Assert that the errata are now showing on the screen, but wait for them to appear.
743
760
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
744
761
  expect(queryByLabelText('Installable Errata')).toBeInTheDocument();
745
- expect(queryByLabelText('Show Installable')).toHaveAttribute('aria-pressed', 'true');
746
- expect(queryByLabelText('Show All')).toHaveAttribute('aria-pressed', 'false');
762
+ expect(getByText('Applicable')).toBeInTheDocument();
763
+ expect(getByText('Applicable').parentElement).toHaveAttribute('aria-pressed', 'false');
764
+ expect(getAllByText('Installable')[0].parentElement).toHaveAttribute('aria-pressed', 'true');
747
765
  assertNockRequest(autocompleteScope);
748
766
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
749
767
  });
@@ -766,7 +784,7 @@ test('Can filter by errata type', async (done) => {
766
784
  getByRole,
767
785
  getAllByText,
768
786
  getByText,
769
- } = renderWithRedux(<ErrataTab />, renderOptions());
787
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(3)));
770
788
 
771
789
  // Assert that the errata are now showing on the screen, but wait for them to appear.
772
790
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -810,7 +828,7 @@ test('Can filter by severity', async (done) => {
810
828
  queryByLabelText,
811
829
  getAllByText,
812
830
  getByText,
813
- } = renderWithRedux(<ErrataTab />, renderOptions());
831
+ } = renderWithRedux(<ErrataTab />, renderOptions(cfWithErrataTotal(3)));
814
832
 
815
833
  // Assert that the errata are now showing on the screen, but wait for them to appear.
816
834
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -844,7 +862,7 @@ test('apply button chooses katello agent if enabled', async (done) => {
844
862
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
845
863
  const mockErrata = makeMockErrata({});
846
864
  const options = renderOptions({
847
- ...contentFacetAttributes,
865
+ ...cfWithErrataTotal(mockErrata.total),
848
866
  katelloAgentInstalled: true,
849
867
  katelloAgentEnabled: true,
850
868
  });
@@ -882,7 +900,7 @@ test('Can bulk apply via katello agent', async (done) => {
882
900
  const mockErrata = makeMockErrata({});
883
901
  const { results } = mockErrata;
884
902
  const options = renderOptions({
885
- ...contentFacetAttributes,
903
+ ...cfWithErrataTotal(mockErrata.total),
886
904
  katelloAgentInstalled: true,
887
905
  katelloAgentEnabled: true,
888
906
  });
@@ -928,7 +946,7 @@ test('Can select all, exclude and bulk apply via katello agent', async (done) =>
928
946
  const mockErrata = makeMockErrata({});
929
947
  const { results } = mockErrata;
930
948
  const options = renderOptions({
931
- ...contentFacetAttributes,
949
+ ...cfWithErrataTotal(mockErrata.total),
932
950
  katelloAgentInstalled: true,
933
951
  katelloAgentEnabled: true,
934
952
  });
@@ -973,7 +991,7 @@ test('Apply button chooses remote execution', async (done) => {
973
991
  const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
974
992
  const mockErrata = makeMockErrata({});
975
993
  const options = renderOptions({
976
- ...contentFacetAttributes,
994
+ ...cfWithErrataTotal(mockErrata.total),
977
995
  katelloAgentInstalled: true,
978
996
  katelloAgentEnabled: true,
979
997
  remoteExecutionByDefault: true,
@@ -1029,7 +1047,7 @@ test('Can bulk apply via remote execution', async (done) => {
1029
1047
 
1030
1048
  const { getAllByText, getByLabelText, queryByText } = renderWithRedux(
1031
1049
  <ErrataTab />,
1032
- renderOptions(),
1050
+ renderOptions(cfWithErrataTotal(mockErrata.total)),
1033
1051
  );
1034
1052
  // Assert that the errata are now showing on the screen, but wait for them to appear.
1035
1053
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -1068,7 +1086,7 @@ test('Can select all, exclude and bulk apply via remote execution', async (done)
1068
1086
 
1069
1087
  const { getAllByText, getByLabelText, queryByText } = renderWithRedux(
1070
1088
  <ErrataTab />,
1071
- renderOptions(),
1089
+ renderOptions(cfWithErrataTotal(mockErrata.total)),
1072
1090
  );
1073
1091
  // Assert that the errata are now showing on the screen, but wait for them to appear.
1074
1092
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -1099,7 +1117,7 @@ test('Can apply errata in bulk via customized remote execution', async (done) =>
1099
1117
 
1100
1118
  const { getAllByText, getByLabelText, queryByText } = renderWithRedux(
1101
1119
  <ErrataTab />,
1102
- renderOptions(),
1120
+ renderOptions(cfWithErrataTotal(mockErrata.total)),
1103
1121
  );
1104
1122
 
1105
1123
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
@@ -1127,7 +1145,7 @@ test('Can apply a single erratum to the host via katello agent', async (done) =>
1127
1145
  const mockErrata = makeMockErrata({});
1128
1146
  const { results } = mockErrata;
1129
1147
  const options = renderOptions({
1130
- ...contentFacetAttributes,
1148
+ ...cfWithErrataTotal(mockErrata.total),
1131
1149
  katelloAgentInstalled: true,
1132
1150
  katelloAgentEnabled: true,
1133
1151
  });
@@ -1183,7 +1201,7 @@ test('Can apply a single erratum to the host via remote execution', async (done)
1183
1201
 
1184
1202
  const { getByText, getAllByText, getByLabelText } = renderWithRedux(
1185
1203
  <ErrataTab />,
1186
- renderOptions(),
1204
+ renderOptions(cfWithErrataTotal(mockErrata.total)),
1187
1205
  );
1188
1206
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
1189
1207
  const erratumActionMenu = within(getByLabelText('Select row 0').closest('tr')).getByLabelText('Actions');
@@ -1215,7 +1233,7 @@ test('Can apply a single erratum to the host via customized remote execution', a
1215
1233
 
1216
1234
  const { getByText, getAllByText, getByLabelText } = renderWithRedux(
1217
1235
  <ErrataTab />,
1218
- renderOptions(),
1236
+ renderOptions(cfWithErrataTotal(mockErrata.total)),
1219
1237
  );
1220
1238
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
1221
1239
  const erratumActionMenu = within(getByLabelText('Select row 0').closest('tr')).getByLabelText('Actions');
@@ -10,19 +10,19 @@
10
10
  "id": 738,
11
11
  "name": "coreutils",
12
12
  "nvra": "coreutils-8.30-6.el8.x86_64",
13
- "upgradable_version": "coreutils-9.0-1.el8.x86_64"
13
+ "upgradable_versions": ["coreutils-9.0-1.el8.x86_64"]
14
14
  },
15
15
  {
16
16
  "id": 646,
17
17
  "name": "chrony",
18
18
  "nvra": "chrony-3.3-3.el8.x86_64",
19
- "upgradable_version": "chrony-4.0-1.el8.x86_64"
19
+ "upgradable_versions": ["chrony-4.0-1.el8.x86_64"]
20
20
  },
21
21
  {
22
22
  "id": 676,
23
23
  "name": "acl",
24
24
  "nvra": "acl-2.2.53-1.el8.x86_64",
25
- "upgradable_version": null
25
+ "upgradable_versions": null
26
26
  }
27
27
  ]
28
28
  }
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
3
3
  import { nockInstance, assertNockRequest, mockForemanAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
4
4
  import { foremanApi } from '../../../../../services/api';
5
- import { HOST_PACKAGES_KEY, PACKAGES_SEARCH_QUERY } from '../PackagesTab/HostPackagesConstants';
5
+ import { HOST_PACKAGES_KEY, PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from '../PackagesTab/HostPackagesConstants';
6
6
  import { PackagesTab } from '../PackagesTab/PackagesTab.js';
7
7
  import mockPackagesData from './packages.fixtures.json';
8
8
  import { REX_FEATURES } from '../RemoteExecutionConstants';
@@ -181,7 +181,7 @@ test('Can upgrade a package via remote execution', async (done) => {
181
181
  .post(jobInvocations, {
182
182
  job_invocation: {
183
183
  inputs: {
184
- package: firstPackage.upgradable_version,
184
+ package: firstPackage.upgradable_versions[0],
185
185
  },
186
186
  search_query: `name ^ (${hostname})`,
187
187
  feature: REX_FEATURES.KATELLO_PACKAGE_UPDATE,
@@ -256,7 +256,7 @@ test('Can upgrade a package via customized remote execution', async (done) => {
256
256
 
257
257
  const rexAction = getByText('Upgrade via customized remote execution');
258
258
  const feature = REX_FEATURES.KATELLO_PACKAGE_UPDATE;
259
- const packageName = firstPackage.upgradable_version;
259
+ const packageName = firstPackage.upgradable_versions[0];
260
260
 
261
261
  expect(rexAction).toBeInTheDocument();
262
262
  expect(rexAction).toHaveAttribute(
@@ -284,6 +284,7 @@ test('Can bulk upgrade via remote execution', async (done) => {
284
284
  job_invocation: {
285
285
  inputs: {
286
286
  [PACKAGES_SEARCH_QUERY]: `id ^ (${firstPackage.id},${secondPackage.id})`,
287
+ [SELECTED_UPDATE_VERSIONS]: JSON.stringify([]),
287
288
  },
288
289
  search_query: `name ^ (${hostname})`,
289
290
  feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
@@ -337,7 +338,7 @@ test('Can bulk upgrade via customized remote execution', async (done) => {
337
338
  const feature = REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH;
338
339
  const packages = `${firstPackage.id},${secondPackage.id}`;
339
340
  const job =
340
- `/job_invocations/new?feature=${feature}&host_ids=name%20%5E%20(${hostname})&inputs%5BPackages%20search%20query%5D=id%20%5E%20(${packages})`;
341
+ `/job_invocations/new?feature=${feature}&host_ids=name%20%5E%20(${hostname})&inputs%5BPackages%20search%20query%5D=id%20%5E%20(${packages})&inputs%5BSelected%20update%20versions%5D=%5B%5D`;
341
342
 
342
343
  getByRole('checkbox', { name: 'Select row 0' }).click();
343
344
  expect(getByLabelText('Select row 0').checked).toEqual(true);
@@ -2,7 +2,7 @@ import { REX_FEATURES } from './RemoteExecutionConstants';
2
2
  import { TRACES_SEARCH_QUERY } from './TracesTab/HostTracesConstants';
3
3
  import { ERRATA_SEARCH_QUERY } from './ErrataTab/HostErrataConstants';
4
4
  import { PACKAGE_SEARCH_QUERY } from './PackagesTab/YumInstallablePackagesConstants';
5
- import { PACKAGES_SEARCH_QUERY } from './PackagesTab/HostPackagesConstants';
5
+ import { PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from './PackagesTab/HostPackagesConstants';
6
6
 
7
7
  export const createJob = ({
8
8
  hostname, feature, inputs,
@@ -35,10 +35,10 @@ export const katelloPackageUpdateUrl = ({ hostname, packageName }) => createJob(
35
35
  inputs: { package: packageName },
36
36
  });
37
37
 
38
- export const packagesUpdateUrl = ({ hostname, search }) => createJob({
38
+ export const packagesUpdateUrl = ({ hostname, search, versions }) => createJob({
39
39
  hostname,
40
40
  feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
41
- inputs: { [PACKAGES_SEARCH_QUERY]: search },
41
+ inputs: { [PACKAGES_SEARCH_QUERY]: search, [SELECTED_UPDATE_VERSIONS]: versions },
42
42
  });
43
43
 
44
44
  export const resolveTraceUrl = ({ hostname, search }) => createJob({
@@ -72,11 +72,11 @@ export const links = [
72
72
  component: WithOrganization(withHeader(ChangeContentSource, { title: __('Change host content source') })),
73
73
  },
74
74
  {
75
- path: 'labs/alternate_content_sources',
75
+ path: 'alternate_content_sources',
76
76
  component: WithOrganization(withHeader(AlternateContentSource, { title: __('Alternate Content Sources') })),
77
77
  },
78
78
  {
79
- path: 'labs/alternate_content_sources/:id([0-9]+)',
79
+ path: 'alternate_content_sources/:id([0-9]+)',
80
80
  component: WithOrganization(withHeader(AlternateContentSource, { title: __('Alternate Content Sources') })),
81
81
  exact: false,
82
82
  },
@@ -164,4 +164,16 @@ html .pagination-pf-pagesize.btn-group {
164
164
  animation-duration: 2s;
165
165
  animation-iteration-count: 1;
166
166
  animation-fill-mode: forwards;
167
+ }
168
+
169
+ .primary-detail-border {
170
+ border-top: 0.2px;
171
+ border-top-color: var(--pf-c-table--BorderColor);
172
+ border-top-style: inset;
173
+ }
174
+
175
+ .primary-detail-stack-items-border {
176
+ border-bottom: 0.2px;
177
+ border-bottom-color: var(--pf-c-table--BorderColor);
178
+ border-bottom-style: inset;
167
179
  }
@@ -6,9 +6,27 @@ import nock from 'nock';
6
6
  // output and traceback for actual error.
7
7
  const originalConsoleError = global.console.error;
8
8
  global.console.error = (error, stack) => {
9
- originalConsoleError(error); // ensure error is printed to console
9
+ originalConsoleError(error); // ensure error is printed to console, comment
10
+ // in case of ouia-id check
11
+
12
+ /* Uncomment block below to filter out PF4 ouiaId errors */
13
+ // const ignore = ['in ForwardRef (created by Tabs)',
14
+ // 'in Button (created by Label)', 'created by _default',
15
+ // 'created by PaginationOptionsMenu', 'created by TypeAheadItems',
16
+ // 'The prop `ouiaId` is marked as required in `Modal`, but its value is `undefined`',
17
+ // 'created by WizardHeader', 'created by Navigation',
18
+ // 'created by ActionsColumn', 'created by InactiveText', 'created by Select',
19
+ // 'created by Context.Consumer'];
20
+
10
21
  /* eslint-disable-next-line no-console */
11
22
  if (stack) console.log(stack); // Prints out original stack trace
23
+
24
+ /* Uncomment block below to filter out PF4 ouiaId errors */
25
+ // if (error && !ignore.some(e => error.includes(e))) {
26
+ // originalConsoleError(error); // ensure error is printed to console
27
+ // console.log(stack); // Prints out original stack trace
28
+ // }
29
+
12
30
  throw new Error(error); // comment this and uncomment the next line when checking for ouia ids
13
31
  // if (!error.includes('Failed prop type')) throw new Error(error);
14
32
  };
@@ -34,7 +34,6 @@ import {
34
34
  Toolbar,
35
35
  } from '@patternfly/react-core';
36
36
  import {
37
- RowWrapper,
38
37
  Table,
39
38
  TableComposable,
40
39
  Tr,
@@ -74,7 +73,6 @@ const checkForOuiaIds = () => {
74
73
  TextInput,
75
74
  Title,
76
75
  Toolbar,
77
- RowWrapper,
78
76
  Table,
79
77
  TableComposable,
80
78
  Tr,
@@ -22,6 +22,7 @@ const recommendedRepositoriesRHEL = [
22
22
  'rhel-7-server-optional-rpms',
23
23
  'rhel-7-server-extras-rpms',
24
24
  'rhel-7-server-kickstart',
25
+ 'rhel-6-server-els-rpms',
25
26
  ];
26
27
 
27
28
  const recommendedRepositoriesSatTools = [
@@ -32,15 +33,10 @@ const recommendedRepositoriesSatTools = [
32
33
  ];
33
34
 
34
35
  const recommendedRepositoriesMisc = [
35
- 'rhel-server-rhscl-7-rpms',
36
- 'rhel-7-server-satellite-capsule-6.11-rpms',
37
- 'satellite-capsule-6.11-for-rhel-8-x86_64-rpms',
38
- 'rhel-7-server-ansible-2.9-rpms',
36
+ 'satellite-capsule-6.12-for-rhel-8-x86_64-rpms',
39
37
  'ansible-2-for-rhel-8-x86_64-rpms',
40
- 'rhel-7-server-satellite-maintenance-6.11-rpms',
41
- 'rhel-7-server-satellite-utils-6.11-rpms',
42
- 'satellite-maintenance-6.11-for-rhel-8-x86_64-rpms',
43
- 'satellite-utils-6.11-for-rhel-8-x86_64-rpms',
38
+ 'satellite-maintenance-6.12-for-rhel-8-x86_64-rpms',
39
+ 'satellite-utils-6.12-for-rhel-8-x86_64-rpms',
44
40
  ];
45
41
 
46
42
  const recommendedRepositorySetLables = recommendedRepositoriesRHEL