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
@@ -7,6 +7,7 @@ import { translate as __ } from 'foremanReact/common/I18n';
7
7
  import { TableVariant, Tr, Th, Tbody, Td, Thead } from '@patternfly/react-table';
8
8
  import { TableType } from './CVVersionCompareConfig';
9
9
  import TableWrapper from '../../../../../components/Table/TableWrapper';
10
+ import { useTableSort } from '../../../../../components/Table/TableHooks';
10
11
 
11
12
  const CVVersionCompareTable = ({
12
13
  tableConfig: {
@@ -14,16 +15,30 @@ const CVVersionCompareTable = ({
14
15
  responseSelector,
15
16
  statusSelector,
16
17
  autocompleteEndpoint,
17
- fetchItems,
18
+ fetchItems: fetchItemsSorted,
18
19
  columnHeaders,
19
- disableSearch,
20
+ hideSearch,
21
+ sortConfig,
20
22
  }, versionOne, versionTwo, currentActiveKey, selectedViewBy,
21
23
  }) => {
22
24
  const [searchQuery, updateSearchQuery] = useState('');
25
+ const {
26
+ pfSortParams, apiSortParams,
27
+ activeSortColumn, activeSortDirection,
28
+ } = useTableSort({
29
+ allColumns: columnHeaders.map(header => header?.title),
30
+ columnsToSortParams: sortConfig,
31
+ initialSortColumnName: Object.keys(sortConfig)[0],
32
+ });
23
33
 
24
34
  const response = useSelector(responseSelector);
25
35
  const { results, ...metadata } = response;
26
36
  const status = useSelector(statusSelector);
37
+ const fetchItems = params =>
38
+ fetchItemsSorted({
39
+ ...apiSortParams,
40
+ ...params,
41
+ });
27
42
  return (
28
43
  <TableWrapper
29
44
  {...{
@@ -32,11 +47,13 @@ const CVVersionCompareTable = ({
32
47
  updateSearchQuery,
33
48
  status,
34
49
  autocompleteEndpoint,
35
- disableSearch,
50
+ hideSearch,
36
51
  }}
37
- ouiaId="content-view-version-comparison-table"
52
+ key={`cvv-comparison-table-${name}`}
53
+ ouiaId={`cvv-comparison-table-${name}`}
38
54
  fetchItems={fetchItems}
39
- additionalListeners={[versionOne, versionTwo, currentActiveKey, selectedViewBy]}
55
+ additionalListeners={[versionOne, versionTwo, currentActiveKey,
56
+ selectedViewBy, activeSortColumn, activeSortDirection]}
40
57
  emptySearchTitle={__(`Your search returned no matching ${name}.`)}
41
58
  emptySearchBody={__('Try changing your search criteria.')}
42
59
  emptyContentTitle={__(`No matching ${name} found.`)}
@@ -44,15 +61,22 @@ const CVVersionCompareTable = ({
44
61
  variant={TableVariant.compact}
45
62
  >
46
63
  <Thead>
47
- <Tr>
64
+ <Tr ouiaId="column-headers">
48
65
  {columnHeaders.map(({ title }) =>
49
- <Th key={`${title}-header`}>{title}</Th>)}
66
+ (
67
+ <Th
68
+ key={`${title}-header`}
69
+ sort={sortConfig[title] ? pfSortParams(title) : undefined}
70
+ >
71
+ {title}
72
+ </Th>
73
+ ))}
50
74
  </Tr>
51
75
  </Thead>
52
76
  <Tbody>
53
77
  {results?.map(result =>
54
78
  (
55
- <Tr key={`column-${result.id}`}>
79
+ <Tr key={`column-${result.id}`} ouiaId={`column-${result.id}`}>
56
80
  {columnHeaders.map(({ getProperty }, colIndex) =>
57
81
  // eslint-disable-next-line react/no-array-index-key
58
82
  <Td key={`cell-${colIndex}`}>{getProperty(result)} </Td>)}
@@ -10,6 +10,7 @@ import cvVersionsData from './contentViewVersions.fixtures.json';
10
10
  import cvDetailsData from './contentViewDetails.fixtures.json';
11
11
  import environmentPathsData from '../../../../Publish/__tests__/environmentPaths.fixtures.json';
12
12
  import CVVersionCompare from '../CVVersionCompare';
13
+ import cvCompareRepositoriesData from './cvCompareRepositories.fixtures.json';
13
14
  import cvVersionRPMPackagesCompareAllContentData from './RPMPackagesCompareAllContentData.fixtures.json';
14
15
  import cvVersionErrataCompareAllContentData from './ErrataCompareAllContentData.fixtures.json';
15
16
  import cvVersionPackageGroupsCompareAllContentData from './PackageGroupsCompareAllContentData.fixtures.json';
@@ -35,6 +36,7 @@ const versionDetails = versionId => api.getApiUrl(`/content_view_versions/${vers
35
36
  const autocompleteUrl = '/content_view_versions/auto_complete_search';
36
37
  const withCVRoute = component => <Route path="/content_views/:id">{component}</Route>;
37
38
  const environmentPathsPath = api.getApiUrl('/organizations/1/environments/paths');
39
+ const sortedRpmPackagesPath = api.getApiUrl('/packages/compare?content_view_version_ids[]=15&content_view_version_ids[]=17&restrict_comparison=all&sort_by=nvra&sort_order=desc&per_page=20&page=1');
38
40
  const renderOptions = {
39
41
  initialState: {
40
42
  API: {
@@ -88,6 +90,15 @@ afterEach(() => {
88
90
  });
89
91
 
90
92
  const testConfigAllContentTypes = [
93
+ {
94
+ name: 'Repositories',
95
+ autoCompleteUrl: '/repositories/auto_complete_search',
96
+ dataUrl: api.getApiUrl('/repositories/compare'),
97
+ data: cvCompareRepositoriesData,
98
+ textQuery: [
99
+ head(cvCompareRepositoriesData.results).name,
100
+ last(cvCompareRepositoriesData.results).name],
101
+ },
91
102
  {
92
103
  name: 'RPM packages',
93
104
  countKey: 'rpm_count',
@@ -181,6 +192,15 @@ const testConfigAllContentTypes = [
181
192
  ];
182
193
 
183
194
  const testConfigThreeContentTypes = [
195
+ {
196
+ name: 'Repositories',
197
+ autoCompleteUrl: '/repositories/auto_complete_search',
198
+ dataUrl: api.getApiUrl('/repositories/compare'),
199
+ data: cvCompareRepositoriesData,
200
+ textQuery: [
201
+ head(cvCompareRepositoriesData.results).name,
202
+ last(cvCompareRepositoriesData.results).name],
203
+ },
184
204
  {
185
205
  name: 'RPM packages',
186
206
  countKey: 'rpm_count',
@@ -215,6 +235,13 @@ const testConfigThreeContentTypes = [
215
235
  const emptyContentViewByText = contentType => `No matching ${contentType} found.`;
216
236
 
217
237
  const testConfigViewByDifferent = [
238
+ {
239
+ name: 'Repositories',
240
+ autoCompleteUrl: '/repositories/auto_complete_search',
241
+ dataUrl: api.getApiUrl('/repositories/compare'),
242
+ data: cvVersionEmptyContent,
243
+ textQuery: emptyContentViewByText('Repositories'),
244
+ },
218
245
  {
219
246
  name: 'RPM packages',
220
247
  countKey: 'rpm_count',
@@ -244,6 +271,15 @@ const testConfigViewByDifferent = [
244
271
  ];
245
272
 
246
273
  const testConfigViewBySame = [
274
+ {
275
+ name: 'Repositories',
276
+ autoCompleteUrl: '/repositories/auto_complete_search',
277
+ dataUrl: api.getApiUrl('/repositories/compare'),
278
+ data: cvCompareRepositoriesData,
279
+ textQuery: [
280
+ head(cvCompareRepositoriesData.results).name,
281
+ last(cvCompareRepositoriesData.results).name],
282
+ },
247
283
  {
248
284
  name: 'RPM packages',
249
285
  countKey: 'rpm_count',
@@ -274,7 +310,7 @@ const testConfigViewBySame = [
274
310
  },
275
311
  ];
276
312
 
277
- test('Can make an API call and show comparison of two versions with all content types', async (done) => {
313
+ test('Can make an API call and show comparison of two versions with all content types and sort tables', async (done) => {
278
314
  const autoCompleteContentTypesScope = testConfigAllContentTypes.map(({ autoCompleteUrl }) =>
279
315
  mockAutocomplete(nockInstance, autoCompleteUrl));
280
316
 
@@ -294,6 +330,10 @@ test('Can make an API call and show comparison of two versions with all content
294
330
  .get(versionDetails(17))
295
331
  .query(true)
296
332
  .reply(200, versionTwoDetailsData);
333
+ const sortedRpmTabScope = nockInstance
334
+ .get(sortedRpmPackagesPath)
335
+ .reply(200, cvCompareRepositoriesData);
336
+
297
337
  const { queryByText, queryAllByText, getAllByText } = renderWithRedux(
298
338
  withCVRoute(<CVVersionCompare
299
339
  cvId={4}
@@ -327,12 +367,20 @@ test('Can make an API call and show comparison of two versions with all content
327
367
  });
328
368
  });
329
369
 
370
+ // Can sort rendered table
371
+ const rpmTab = queryByText('RPM packages');
372
+ fireEvent.click(rpmTab);
373
+ await patientlyWaitFor(() => {
374
+ expect(queryByText('Name')).toBeTruthy();
375
+ });
376
+ fireEvent.click(queryByText('Name'));
330
377
 
331
378
  assertNockRequest(scopeCVDetails);
332
379
  assertNockRequest(scopeVersionOneDetails);
333
380
  assertNockRequest(scopeVersionTwoDetails);
334
381
  scopeContentTypes.map(cv => assertNockRequest(cv));
335
382
  autoCompleteContentTypesScope.map(cv => assertNockRequest(cv));
383
+ assertNockRequest(sortedRpmTabScope);
336
384
  assertNockRequest(searchDelayScope);
337
385
  assertNockRequest(autoSearchScope);
338
386
  act(done);
@@ -564,10 +612,15 @@ test('Can select viewing by "Different" in the dropdown and see the content in e
564
612
  testConfigViewByDifferent.forEach(({ name }) => {
565
613
  expect(queryByText(name)).toBeTruthy();
566
614
  });
567
- expect(getByText('No matching RPM packages found.')).toBeTruthy();
568
- (testConfigViewByDifferent.find(({ name }) => name === 'Files')).textQuery.forEach(query => expect(queryAllByText(query)).toBeTruthy());
615
+ expect(getByText('No matching Repositories found.')).toBeTruthy();
569
616
  });
570
617
 
618
+ (testConfigViewByDifferent.find(({ name }) => name === 'Files')).textQuery.forEach(query => expect(queryAllByText(query)).toBeTruthy());
619
+
620
+ fireEvent.click(getByText('RPM packages'));
621
+ await patientlyWaitFor(() => {
622
+ expect(getByText('No matching RPM packages found.')).toBeTruthy();
623
+ });
571
624
  fireEvent.click(getByText('Errata'));
572
625
  await patientlyWaitFor(() => {
573
626
  expect(getByText('No matching Errata found.')).toBeTruthy();
@@ -0,0 +1,175 @@
1
+ {
2
+ "total": 2,
3
+ "subtotal": 2,
4
+ "selectable": 2,
5
+ "page": "1",
6
+ "per_page": "20",
7
+ "error": null,
8
+ "search": null,
9
+ "sort": {
10
+ "by": "name",
11
+ "order": "asc"
12
+ },
13
+ "results": [
14
+ {
15
+ "backend_identifier": "51816595-8c1e-4726-b4d1-0bccc1cd377b",
16
+ "relative_path": "Default_Organization/Library/custom/prod/modular",
17
+ "container_repository_name": null,
18
+ "full_path": "https://centos8-katello-devel.sajha.example.com/pulp/content/Default_Organization/Library/custom/prod/modular/",
19
+ "library_instance_id": null,
20
+ "version_href": "/pulp/api/v3/repositories/rpm/rpm/1bb2b611-bf6e-442f-9b2b-2b2cd6f13e33/versions/1/",
21
+ "remote_href": "/pulp/api/v3/remotes/rpm/rpm/82bdbc37-bd6f-4a2d-9c28-3f15b52328de/",
22
+ "publication_href": "/pulp/api/v3/publications/rpm/rpm/4ea0da80-829b-4d49-9f92-a479e9e3682b/",
23
+ "content_counts": {
24
+ "rpm": 22,
25
+ "erratum": 7,
26
+ "package_group": 2,
27
+ "srpm": 0,
28
+ "module_stream": 14
29
+ },
30
+ "mirroring_policy": "mirror_content_only",
31
+ "id": 2,
32
+ "name": "modular",
33
+ "label": "modular",
34
+ "description": null,
35
+ "content_view_versions": [
36
+ {
37
+ "id": 2,
38
+ "version": "1.0",
39
+ "content_view_id": 2,
40
+ "content_view_name": "cv1"
41
+ },
42
+ {
43
+ "id": 3,
44
+ "version": "2.0",
45
+ "content_view_id": 2,
46
+ "content_view_name": "cv1"
47
+ }
48
+ ],
49
+ "last_sync": {
50
+ "id": "0ef7ac00-fc64-4661-afe2-1c5d31ef518a",
51
+ "username": "admin",
52
+ "started_at": "2022-10-05 14:41:35 -0400",
53
+ "ended_at": "2022-10-05 14:41:41 -0400",
54
+ "state": "stopped",
55
+ "result": "success",
56
+ "progress": 1
57
+ },
58
+ "content_view": {
59
+ "id": 1,
60
+ "name": "Default Organization View"
61
+ },
62
+ "content_view_version": {
63
+ "id": 1,
64
+ "name": "Default Organization View 1.0",
65
+ "content_view_id": 1
66
+ },
67
+ "kt_environment": {
68
+ "id": 1,
69
+ "name": "Library"
70
+ },
71
+ "content_type": "yum",
72
+ "url": "https://partha.fedorapeople.org/test-repos/pteradactyl/",
73
+ "arch": "noarch",
74
+ "os_versions": [],
75
+ "content_id": "1664981685026",
76
+ "generic_remote_options": null,
77
+ "major": null,
78
+ "minor": null,
79
+ "product": {
80
+ "id": 1,
81
+ "cp_id": "275319913074",
82
+ "name": "prod",
83
+ "orphaned": false,
84
+ "redhat": false,
85
+ "sync_plan": null
86
+ },
87
+ "content_label": "Default_Organization_prod_modular",
88
+ "last_sync_words": "2 days",
89
+ "comparison": [
90
+ 3,
91
+ 2
92
+ ]
93
+ },
94
+ {
95
+ "backend_identifier": "bbdf8206-e62d-4faa-a36f-0a060d059a64",
96
+ "relative_path": "Default_Organization/Library/custom/prod/needed_errata",
97
+ "container_repository_name": null,
98
+ "full_path": "https://centos8-katello-devel.sajha.example.com/pulp/content/Default_Organization/Library/custom/prod/needed_errata/",
99
+ "library_instance_id": null,
100
+ "version_href": "/pulp/api/v3/repositories/rpm/rpm/6159f08c-5c82-4e69-a31d-3215ccc56c2f/versions/2/",
101
+ "remote_href": "/pulp/api/v3/remotes/rpm/rpm/0f906008-ab61-4b05-a192-a42787d4b0a6/",
102
+ "publication_href": "/pulp/api/v3/publications/rpm/rpm/af8612cc-746b-49eb-bfd2-fcbecc79f3fa/",
103
+ "content_counts": {
104
+ "rpm": 33,
105
+ "erratum": 4,
106
+ "package_group": 0,
107
+ "srpm": 0,
108
+ "module_stream": 0
109
+ },
110
+ "mirroring_policy": "mirror_content_only",
111
+ "id": 1,
112
+ "name": "needed_errata",
113
+ "label": "needed_errata",
114
+ "description": null,
115
+ "content_view_versions": [
116
+ {
117
+ "id": 2,
118
+ "version": "1.0",
119
+ "content_view_id": 2,
120
+ "content_view_name": "cv1"
121
+ },
122
+ {
123
+ "id": 3,
124
+ "version": "2.0",
125
+ "content_view_id": 2,
126
+ "content_view_name": "cv1"
127
+ }
128
+ ],
129
+ "last_sync": {
130
+ "id": "14deabd5-a5a0-49dd-8091-fac74749ef66",
131
+ "username": "admin",
132
+ "started_at": "2022-10-05 10:54:15 -0400",
133
+ "ended_at": "2022-10-05 10:54:22 -0400",
134
+ "state": "stopped",
135
+ "result": "success",
136
+ "progress": 1
137
+ },
138
+ "content_view": {
139
+ "id": 1,
140
+ "name": "Default Organization View"
141
+ },
142
+ "content_view_version": {
143
+ "id": 1,
144
+ "name": "Default Organization View 1.0",
145
+ "content_view_id": 1
146
+ },
147
+ "kt_environment": {
148
+ "id": 1,
149
+ "name": "Library"
150
+ },
151
+ "content_type": "yum",
152
+ "url": "https://jlsherrill.fedorapeople.org/fake-repos/needed-errata/",
153
+ "arch": "noarch",
154
+ "os_versions": [],
155
+ "content_id": "1664981648561",
156
+ "generic_remote_options": null,
157
+ "major": null,
158
+ "minor": null,
159
+ "product": {
160
+ "id": 1,
161
+ "cp_id": "275319913074",
162
+ "name": "prod",
163
+ "orphaned": false,
164
+ "redhat": false,
165
+ "sync_plan": null
166
+ },
167
+ "content_label": "Default_Organization_prod_needed_errata",
168
+ "last_sync_words": "2 days",
169
+ "comparison": [
170
+ 3,
171
+ 2
172
+ ]
173
+ }
174
+ ]
175
+ }
@@ -141,6 +141,7 @@ const ContentViewVersions = ({ cvId, details }) => {
141
141
 
142
142
  return [
143
143
  <Checkbox
144
+ ouiaId={`select-version-${versionId}`}
144
145
  id={versionId}
145
146
  aria-label={`Select version ${versionId}`}
146
147
  isChecked={isSelected(versionId)}
@@ -271,6 +272,7 @@ const ContentViewVersions = ({ cvId, details }) => {
271
272
  <Grid>
272
273
  <GridItem md={8} sm={12}>
273
274
  <Button
275
+ ouiaId="compare"
274
276
  variant="primary"
275
277
  onClick={() => setHasTwoVersions(true)}
276
278
  isDisabled={selectedCount !== 2}
@@ -283,10 +285,12 @@ const ContentViewVersions = ({ cvId, details }) => {
283
285
  <Dropdown
284
286
  toggle={<KebabToggle aria-label="bulk_actions" onToggle={setKebabOpen} />}
285
287
  isOpen={kebabOpen}
288
+ ouiaId="cv-versions-bulk-actions"
286
289
  isPlain
287
290
  dropdownItems={[
288
291
  <DropdownItem
289
292
  aria-label="bulk_delete"
293
+ ouiaId="bulk_delete"
290
294
  key="bulk_delete"
291
295
  isDisabled={selectedCount < 1}
292
296
  component="button"
@@ -339,7 +343,7 @@ const ContentViewVersions = ({ cvId, details }) => {
339
343
  aria-label="remove_content_view_version_modal"
340
344
  />
341
345
  }
342
- <Tr key="version-header">
346
+ <Tr key="version-header" ouiaId="version-header">
343
347
  {columnHeaders.map((title, index) => {
344
348
  if (index === 0 && !hasActionPermissions) return undefined;
345
349
  return <Th key={`col-header-${title}`}>{title}</Th>;
@@ -351,7 +355,7 @@ const ContentViewVersions = ({ cvId, details }) => {
351
355
  const hasHistory = !!cvVersion?.active_history?.length;
352
356
  const cells = buildCells(cvVersion);
353
357
  return (
354
- <Tr key={`column-${cvVersion.id}`}>
358
+ <Tr key={`row-${cvVersion.id}`} ouiaId={`row-${cvVersion.id}`}>
355
359
  {cells.map((cell, index) => {
356
360
  if (index === 0 && !hasActionPermissions) return undefined;
357
361
  return (
@@ -76,9 +76,9 @@ const CVEnvironmentSelectionForm = () => {
76
76
  />
77
77
  </Alert>)}
78
78
  {(versionEnvironments.length !== 0) &&
79
- <TableComposable variant={TableVariant.compact}>
79
+ <TableComposable ouiaId="version-delete-env-table" variant={TableVariant.compact}>
80
80
  <Thead>
81
- <Tr>
81
+ <Tr ouiaId="version-delete-env-table-header">
82
82
  <Td
83
83
  select={{
84
84
  rowIndex: 0,
@@ -97,7 +97,7 @@ const CVEnvironmentSelectionForm = () => {
97
97
  host_count: hostCount,
98
98
  }, rowIndex) =>
99
99
  (
100
- <Tr key={`${name}_${id}`}>
100
+ <Tr ouiaId={`${name}_${id}`} key={`${name}_${id}`}>
101
101
  <Td
102
102
  key={`${name}__${id}_select`}
103
103
  select={{
@@ -102,6 +102,7 @@ const CVReassignActivationKeysForm = () => {
102
102
  id="selectCV"
103
103
  name="selectCV"
104
104
  aria-label="selectCV"
105
+ ouiaId="selectCV"
105
106
  placeholderText={(cvSelectOptions.length === 0) ? __('No content views available') : __('Select a content view')}
106
107
  >
107
108
  {cvSelectOptions}
@@ -99,6 +99,7 @@ const CVReassignHostsForm = () => {
99
99
  isDisabled={cvSelectOptions.length === 0}
100
100
  onToggle={isExpanded => setCVSelectOpen(isExpanded)}
101
101
  id="selectCV"
102
+ ouiaId="selectCV"
102
103
  name="selectCV"
103
104
  aria-label="selectCV"
104
105
  placeholderText={(cvSelectOptions.length === 0) ? __('No content views available') : __('Select a content view')}
@@ -59,14 +59,14 @@ const AffectedActivationKeys = ({
59
59
  variant={TableVariant.compact}
60
60
  >
61
61
  <Thead>
62
- <Tr>
62
+ <Tr ouiaId="affected-activation-keys-header">
63
63
  {columnHeaders.map(col =>
64
64
  <Th key={col}>{col}</Th>)}
65
65
  </Tr>
66
66
  </Thead>
67
67
  <Tbody>
68
68
  {results?.map(({ name, id, environment }) => (
69
- <Tr key={`${id}`}>
69
+ <Tr ouiaId={`${id}`} key={`${id}`}>
70
70
  <Td>
71
71
  <a rel="noreferrer" target="_blank" href={urlBuilder(`activation_keys/${id}`, '')}>{name}</a>
72
72
  </Td>
@@ -55,7 +55,7 @@ const AffectedHosts = ({
55
55
  variant={TableVariant.compact}
56
56
  >
57
57
  <Thead>
58
- <Tr>
58
+ <Tr ouiaId="affected-hosts-table-headers">
59
59
  {columnHeaders.map(col =>
60
60
  <Th key={col}>{col}</Th>)}
61
61
  </Tr>
@@ -66,7 +66,7 @@ const AffectedHosts = ({
66
66
  id,
67
67
  content_facet_attributes: { lifecycle_environment: environment },
68
68
  }) => (
69
- <Tr key={`${id}`}>
69
+ <Tr ouiaId={`${id}`} key={`${id}`}>
70
70
  <Td>
71
71
  <a rel="noreferrer" target="_blank" href={urlBuilder(`hosts/${id}`, '')}>{name}</a>
72
72
  </Td>
@@ -91,7 +91,7 @@ export default ({ cvId, versionId }) => [
91
91
  <LongDateTime date={item.updated_at} showRelativeTimeTooltip />,
92
92
  },
93
93
  ],
94
- disableSearch: true,
94
+ hideSearch: true,
95
95
  },
96
96
  {
97
97
  name: __('Repositories'),
@@ -109,7 +109,7 @@ export default ({ cvId, versionId }) => [
109
109
  {
110
110
  title: __('Name'),
111
111
  getProperty: item => (
112
- <a href={urlBuilder(`products/${item?.product?.id}/repositories/${item?.id}`, '')}>
112
+ <a href={urlBuilder(`products/${item?.product?.id}/repositories/${item?.library_instance_id ?? item?.id}`, '')}>
113
113
  {item?.name}
114
114
  </a>),
115
115
  },
@@ -70,6 +70,7 @@ const ContentViewVersionDetails = ({ cvId, details }) => {
70
70
  <div className="grid-with-top-border">
71
71
  <Tabs
72
72
  activeKey={getCurrentActiveKey}
73
+ ouiaId="cv-version-details-tabs"
73
74
  onSelect={onSelect}
74
75
  isVertical
75
76
  >
@@ -49,6 +49,7 @@ const ContentViewVersionDetailsHeader = ({
49
49
  const [bulkDeleteOpen, setBulkDeleteOpen] = useState(false);
50
50
  const dropDownItems = [
51
51
  <DropdownItem
52
+ ouiaId="remove"
52
53
  key="remove"
53
54
  onClick={() => {
54
55
  setRemovingFromEnv(true);
@@ -57,6 +58,7 @@ const ContentViewVersionDetailsHeader = ({
57
58
  {__('Remove from environment')}
58
59
  </DropdownItem>,
59
60
  <DropdownItem
61
+ ouiaId="delete"
60
62
  key="delete"
61
63
  onClick={() =>
62
64
  setBulkDeleteOpen(true)
@@ -70,7 +72,7 @@ const ContentViewVersionDetailsHeader = ({
70
72
  <Grid className="margin-0-24">
71
73
  <GridItem sm={6} >
72
74
  <TextContent>
73
- <Text component={TextVariants.h2}>{__('Version ')}{version}</Text>
75
+ <Text ouiaId="cv-version" component={TextVariants.h2}>{__('Version ')}{version}</Text>
74
76
  </TextContent>
75
77
  </GridItem>
76
78
  <GridItem sm={6} style={{ display: 'flex' }}>
@@ -85,6 +87,7 @@ const ContentViewVersionDetailsHeader = ({
85
87
  </Button>
86
88
  <Dropdown
87
89
  isPlain
90
+ ouiaId="cv-version-header-actions-dropdown"
88
91
  style={{ width: 'inherit' }}
89
92
  position={DropdownPosition.right}
90
93
  toggle={
@@ -34,7 +34,7 @@ const ContentViewVersionDetailsTable = ({
34
34
  autocompleteEndpoint,
35
35
  fetchItems,
36
36
  columnHeaders,
37
- disableSearch,
37
+ hideSearch,
38
38
  route,
39
39
  }, repositories,
40
40
  }) => {
@@ -77,7 +77,7 @@ const ContentViewVersionDetailsTable = ({
77
77
  updateSearchQuery,
78
78
  status,
79
79
  autocompleteEndpoint,
80
- disableSearch,
80
+ hideSearch,
81
81
  }}
82
82
  ouiaId={`content-view-version-details-${kebabCase(route)}-table`}
83
83
  additionalListeners={[selected]}
@@ -92,6 +92,7 @@ const ContentViewVersionDetailsTable = ({
92
92
  <Select
93
93
  onToggle={setOpen}
94
94
  isOpen={open}
95
+ ouiaId="repo-type-selector"
95
96
  variant={SelectVariant.single}
96
97
  onSelect={(_e, selection) => {
97
98
  const index = selectedList
@@ -108,14 +109,14 @@ const ContentViewVersionDetailsTable = ({
108
109
  }
109
110
  >
110
111
  <Thead>
111
- <Tr>
112
+ <Tr ouiaId="column-headers">
112
113
  {columnHeaders.map(({ title, width }) =>
113
114
  <Th width={width} key={`${title}-header`}>{title}</Th>)}
114
115
  </Tr>
115
116
  </Thead>
116
117
  <Tbody>
117
118
  {results?.map((result, index) => (
118
- <Tr key={`column-${index}`}>
119
+ <Tr key={`column-${index}`} ouiaId={`column-${index}`}>
119
120
  {columnHeaders.map(({ getProperty }, colIndex) =>
120
121
  <Td key={`cell-${colIndex}`}>{getProperty(result)} </Td>)}
121
122
  </Tr>
@@ -43,7 +43,9 @@ const CVPublishForm = ({
43
43
  </>}
44
44
  />
45
45
  <TextContent>
46
- <Text component={TextVariants.h3}>{__('Publish new version - ')}{nextVersion || '1.0'}</Text>
46
+ <Text ouiaId="next-version-text" component={TextVariants.h3}>
47
+ {__('Publish new version - ')}{nextVersion || '1.0'}
48
+ </Text>
47
49
  </TextContent>
48
50
  <Form>
49
51
  <FormGroup label={__('Description')} fieldId="description">
@@ -60,6 +62,7 @@ const CVPublishForm = ({
60
62
  <FormGroup label={__('Promote')} fieldId="promote">
61
63
  <Switch
62
64
  id="promote-switch"
65
+ ouiaId="promote-switch"
63
66
  aria-label="promote-switch"
64
67
  isChecked={promote}
65
68
  onChange={checkPromote}
@@ -68,6 +71,7 @@ const CVPublishForm = ({
68
71
  </Form>
69
72
  {!alertDismissed && promote && forcePromote.length > 0 && (
70
73
  <Alert
74
+ ouiaId="force-promotion-alert"
71
75
  variant="info"
72
76
  isInline
73
77
  title={__('Force promotion')}
@@ -42,16 +42,16 @@ const CVPublishReview = ({
42
42
  {__('Review your currently selected changes for ')}<b>{composite ? <RegistryIcon /> : <EnterpriseIcon />} {name}.</b>
43
43
  </>}
44
44
  />
45
- <TableComposable aria-label="Review Table">
45
+ <TableComposable ouiaId="cv-publish-review-table" aria-label="Review Table">
46
46
  <Thead>
47
- <Tr>
47
+ <Tr ouiaId="cv-publish-review-table-headers">
48
48
  <Th>{__('Content view name')}</Th>
49
49
  <Th>{__('Version')}</Th>
50
50
  <Th>{__('Environments')}</Th>
51
51
  </Tr>
52
52
  </Thead>
53
53
  <Tbody>
54
- <Tr>
54
+ <Tr ouiaId="cv-publish-review-table-row">
55
55
  <Td>
56
56
  <><ContentViewIcon composite={composite} description={name} /><InactiveText text={__('Newly published')} /></>
57
57
  </Td>