katello 4.3.0.rc1 → 4.3.0.rc4

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 (299) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/v2/api_controller.rb +4 -0
  3. data/app/controllers/katello/api/v2/capsule_content_controller.rb +11 -3
  4. data/app/controllers/katello/api/v2/content_uploads_controller.rb +1 -1
  5. data/app/controllers/katello/api/v2/generic_content_units_controller.rb +10 -4
  6. data/app/controllers/katello/api/v2/host_errata_controller.rb +5 -0
  7. data/app/controllers/katello/api/v2/host_packages_controller.rb +2 -0
  8. data/app/controllers/katello/api/v2/host_tracer_controller.rb +4 -0
  9. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +8 -0
  10. data/app/controllers/katello/api/v2/repositories_controller.rb +35 -3
  11. data/app/controllers/katello/api/v2/repository_sets_controller.rb +2 -2
  12. data/app/controllers/katello/api/v2/root_controller.rb +10 -19
  13. data/app/controllers/katello/concerns/api/v2/bulk_extensions.rb +3 -13
  14. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +1 -9
  15. data/app/controllers/katello/remote_execution_controller.rb +1 -1
  16. data/app/lib/actions/katello/capsule_content/refresh_repos.rb +1 -1
  17. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +7 -5
  18. data/app/lib/actions/katello/repository/destroy.rb +3 -3
  19. data/app/lib/actions/katello/repository/import_upload.rb +12 -2
  20. data/app/lib/actions/pulp/repository/sync.rb +0 -2
  21. data/app/lib/actions/pulp3/abstract_async_task.rb +16 -4
  22. data/app/lib/actions/pulp3/capsule_content/generate_metadata.rb +5 -4
  23. data/app/lib/actions/pulp3/capsule_content/reclaim_space.rb +25 -0
  24. data/app/lib/actions/pulp3/orchestration/repository/import_repository_upload.rb +36 -0
  25. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +1 -1
  26. data/app/lib/actions/pulp3/repository/commit_upload.rb +3 -1
  27. data/app/lib/actions/pulp3/repository/import_upload.rb +4 -2
  28. data/app/lib/actions/pulp3/repository/reclaim_space.rb +25 -0
  29. data/app/lib/actions/pulp3/repository/save_artifact.rb +12 -8
  30. data/app/lib/katello/resources/cdn.rb +10 -1
  31. data/app/lib/katello/resources/registry.rb +1 -1
  32. data/app/models/katello/concerns/host_managed_extensions.rb +7 -4
  33. data/app/models/katello/concerns/smart_proxy_extensions.rb +21 -9
  34. data/app/models/katello/content_view_version.rb +1 -6
  35. data/app/models/katello/glue/pulp/repo.rb +1 -2
  36. data/app/models/katello/host_tracer.rb +2 -0
  37. data/app/models/katello/pulp3/repository_reference.rb +7 -0
  38. data/app/models/katello/repository.rb +2 -30
  39. data/app/models/katello/root_repository.rb +3 -44
  40. data/app/models/setting/content.rb +2 -8
  41. data/app/presenters/katello/host_package_presenter.rb +21 -0
  42. data/app/services/katello/bulk_items_helper.rb +35 -0
  43. data/app/services/katello/pulp3/api/core.rb +16 -2
  44. data/app/services/katello/pulp3/content.rb +4 -2
  45. data/app/services/katello/pulp3/pulp_content_unit.rb +9 -3
  46. data/app/services/katello/pulp3/repository.rb +9 -4
  47. data/app/services/katello/pulp3/repository_mirror.rb +1 -1
  48. data/app/services/katello/repository_type.rb +2 -1
  49. data/app/services/katello/smart_proxy_helper.rb +10 -1
  50. data/app/views/foreman/job_templates/change_content_source.erb +42 -0
  51. data/app/views/foreman/job_templates/install_errata.erb +8 -6
  52. data/app/views/foreman/job_templates/resolve_traces.erb +4 -5
  53. data/app/views/foreman/job_templates/resolve_traces_-_katello_ansible_default.erb +3 -5
  54. data/app/views/foreman/smart_proxies/_content_sync.html.erb +17 -4
  55. data/app/views/foreman/smart_proxies/_reclaim_space.html.erb +12 -0
  56. data/app/views/foreman/smart_proxies/show.html.erb +4 -2
  57. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +6 -0
  58. data/app/views/katello/api/v2/{organizations/cdn_configuration.rabl → cdn_configurations/show.json.rabl} +4 -0
  59. data/app/views/katello/api/v2/content_facet/show.json.rabl +8 -0
  60. data/app/views/katello/api/v2/content_view_filters/show.json.rabl +0 -1
  61. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -1
  62. data/app/views/katello/api/v2/host_packages/base.json.rabl +2 -0
  63. data/app/views/katello/api/v2/organizations/show.json.rabl +1 -1
  64. data/app/views/katello/api/v2/repositories/show.json.rabl +0 -3
  65. data/config/routes/api/v2.rb +5 -10
  66. data/db/migrate/20210331180353_katello_pool_organization_id_not_nullable.rb +2 -0
  67. data/db/migrate/20211115215210_drop_ostree_branches.rb +13 -0
  68. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +5 -0
  69. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion-katello-bootstrap.js +1 -2
  70. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +3 -3
  71. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +21 -1
  72. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.factory.js +2 -1
  73. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/sync-state.service.js +2 -0
  74. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +0 -10
  75. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-versions.html +0 -3
  76. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/content-view-version-content.controller.js +0 -10
  77. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/content-view-versions.module.js +0 -1
  78. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version.html +0 -7
  79. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +0 -5
  80. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.module.js +0 -1
  81. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +0 -11
  82. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/organizations/fenced-pages.service.js +1 -2
  83. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +14 -2
  84. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +2 -4
  85. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +0 -10
  86. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-reclaim-space-modal.controller.js +36 -0
  87. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +16 -2
  88. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details-reclaim-space-modal.html +18 -0
  89. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +13 -0
  90. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +1 -1
  91. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +3 -6
  92. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +4 -1
  93. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/os-versions.service.js +1 -0
  94. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/product-repositories-reclaim-space-modal.controller.js +35 -0
  95. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.routes.js +0 -9
  96. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository.factory.js +3 -1
  97. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories-reclaim-space-modal.html +18 -0
  98. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +7 -8
  99. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/pulp-primary/pulp-primary.controller.js +35 -0
  100. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/pulp-primary/pulp-primary.factory.js +18 -0
  101. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/pulp-primary/pulp-primary.module.js +14 -0
  102. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/pulp-primary/pulp-primary.routes.js +16 -0
  103. data/engines/bastion_katello/lib/bastion_katello/engine.rb +0 -1
  104. data/lib/katello/permission_creator.rb +3 -4
  105. data/lib/katello/plugin.rb +4 -10
  106. data/lib/katello/repository_types/ostree.rb +3 -1
  107. data/lib/katello/tasks/reset.rake +2 -2
  108. data/lib/katello/tasks/upgrades/4.3/fix_url_auth.rake +25 -0
  109. data/lib/katello/version.rb +1 -1
  110. data/package.json +1 -0
  111. data/webpack/components/AddedStatusLabel.js +2 -1
  112. data/webpack/components/EditableTextInput/EditableTextInput.js +76 -17
  113. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +82 -0
  114. data/webpack/components/EditableTextInput/editableTextInput.scss +4 -0
  115. data/webpack/components/Packages/index.js +63 -0
  116. data/webpack/components/RoutedTabs/index.js +3 -1
  117. data/webpack/components/Search/Search.js +7 -1
  118. data/webpack/components/SelectAllCheckbox/index.js +2 -2
  119. data/webpack/components/Table/EmptyStateMessage.js +4 -2
  120. data/webpack/components/Table/MainTable.scss +7 -1
  121. data/webpack/components/Table/TableHooks.js +10 -19
  122. data/webpack/components/Table/TableWrapper.js +3 -3
  123. data/webpack/components/WithOrganization/__snapshots__/withOrganization.test.js.snap +3 -3
  124. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +24 -30
  125. data/webpack/components/extensions/HostDetails/HostDetailsConstants.js +1 -0
  126. data/webpack/components/extensions/HostDetails/HostDetailsSelectors.js +16 -0
  127. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataConstants.js +2 -0
  128. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +11 -0
  129. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +2 -0
  130. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesSelectors.js +16 -0
  131. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +4 -0
  132. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +1 -0
  133. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.js +119 -25
  134. data/webpack/components/extensions/HostDetails/Tabs/HostTracesConstants.js +1 -0
  135. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +127 -0
  136. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.scss +11 -0
  137. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +30 -4
  138. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  139. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +73 -0
  140. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +2 -0
  141. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsSelectors.js +16 -0
  142. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +347 -0
  143. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.scss +7 -0
  144. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.js +38 -31
  145. data/webpack/components/extensions/HostDetails/Tabs/__tests__/bookmarks.fixtures.json +12 -0
  146. data/webpack/components/extensions/HostDetails/Tabs/__tests__/contentOverrides.fixtures.json +227 -0
  147. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +423 -2
  148. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +28 -0
  149. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +91 -0
  150. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +120 -0
  151. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +307 -0
  152. data/webpack/components/extensions/HostDetails/Tabs/__tests__/resolveErrata.fixtures.json +35 -0
  153. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +55 -9
  154. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +28 -14
  155. data/webpack/containers/Application/overrides.scss +31 -9
  156. data/webpack/global_index.js +11 -4
  157. data/webpack/redux/reducers/RedHatRepositories/enabled.fixtures.js +0 -2
  158. data/webpack/scenes/Content/ContentConfig.js +23 -7
  159. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +2 -0
  160. data/webpack/scenes/ContentCredentials/ContentCredentialActions.js +18 -0
  161. data/webpack/scenes/ContentCredentials/ContentCredentialConstants.js +2 -0
  162. data/webpack/scenes/ContentCredentials/ContentCredentialSelectors.js +12 -0
  163. data/webpack/scenes/ContentCredentials/__tests__/contentCredentials.fixtures.js +73 -0
  164. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +8 -12
  165. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +1 -1
  166. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +1 -1
  167. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +3 -3
  168. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +7 -2
  169. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.scss +7 -0
  170. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +9 -9
  171. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +6 -6
  172. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +39 -37
  173. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +10 -4
  174. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +35 -33
  175. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +12 -7
  176. data/webpack/scenes/ContentViews/Delete/__tests__/cvVersionsData.fixtures.json +2 -6
  177. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentEnvironments.js +13 -14
  178. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +36 -31
  179. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +8 -8
  180. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +108 -41
  181. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +3 -2
  182. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -2
  183. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterCreateResult.fixtures.json +1 -2
  184. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +1 -4
  185. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -6
  186. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +11 -5
  187. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +6 -9
  188. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +5 -8
  189. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +40 -43
  190. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +2 -2
  191. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +4 -4
  192. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +6 -8
  193. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +6 -1
  194. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +1 -1
  195. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +16 -22
  196. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +8 -8
  197. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +3 -5
  198. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewErrataByDateDetails.fixtures.json +1 -8
  199. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetail.fixtures.json +1 -2
  200. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +5 -9
  201. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvAllRepos.fixtures.json +0 -2
  202. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +1 -9
  203. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -4
  204. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErratumFilterDetails.fixtures.json +1 -2
  205. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailModuleAffectedRepos.fixtures.json +1 -8
  206. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailWithAffectedRepos.fixtures.json +1 -8
  207. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -4
  208. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilterDetails.fixtures.json +1 -2
  209. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvPackageFilterDetail.fixtures.json +1 -3
  210. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +61 -32
  211. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +6 -1
  212. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +5 -8
  213. data/webpack/scenes/ContentViews/Details/Repositories/LastSync.js +55 -9
  214. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +2 -0
  215. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.fixtures.json +0 -2
  216. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +48 -29
  217. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionEnvironments.js +2 -2
  218. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.js +9 -7
  219. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.scss +5 -2
  220. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +38 -9
  221. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +4 -1
  222. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +59 -53
  223. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +14 -3
  224. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +24 -17
  225. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +3 -3
  226. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionsResponseData.fixtures.json +1 -4
  227. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +4 -2
  228. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +134 -32
  229. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +8 -3
  230. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionComponent.fixtures.json +1 -4
  231. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +1 -2
  232. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +21 -1
  233. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsCounts.fixtures.json +1 -2
  234. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +22 -1
  235. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRepositories.fixtures.json +1 -18
  236. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.fixtures.json +5 -5
  237. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +2 -0
  238. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersionsWithTask.fixtures.json +1 -3
  239. data/webpack/scenes/ContentViews/Details/contentViewInfo.scss +0 -4
  240. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +66 -53
  241. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +40 -28
  242. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +3 -3
  243. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +14 -14
  244. data/webpack/scenes/ContentViews/Publish/cvPublishForm.scss +6 -0
  245. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +53 -12
  246. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +12 -6
  247. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +6 -6
  248. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +12 -7
  249. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +2 -2
  250. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +26 -27
  251. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +18 -6
  252. data/webpack/scenes/ContentViews/components/WizardHeader.js +44 -0
  253. data/webpack/scenes/ContentViews/components/contentViewIcon.scss +13 -2
  254. data/webpack/scenes/Organizations/OrganizationActions.js +22 -24
  255. data/webpack/scenes/Organizations/OrganizationConstants.js +1 -3
  256. data/webpack/scenes/Organizations/OrganizationReducer.js +0 -7
  257. data/webpack/scenes/Organizations/OrganizationSelectors.js +16 -0
  258. data/webpack/scenes/Organizations/__tests__/OrganizationActions.test.js +1 -21
  259. data/webpack/scenes/Organizations/__tests__/OrganizationReducer.test.js +0 -20
  260. data/webpack/scenes/Organizations/__tests__/organizations.fixtures.js +34 -23
  261. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +185 -0
  262. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.scss +3 -0
  263. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +112 -146
  264. data/webpack/scenes/Subscriptions/Manifest/__tests__/CdnConfigurationForm.test.js +114 -0
  265. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManageManifestModal.test.js +121 -31
  266. data/webpack/scenes/Subscriptions/Manifest/index.js +14 -3
  267. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +1 -0
  268. data/webpack/scenes/Tasks/TaskActions.js +4 -3
  269. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +1 -0
  270. data/webpack/utils/helpers.js +2 -2
  271. metadata +62 -43
  272. data/app/controllers/katello/api/v2/ostree_branches_controller.rb +0 -16
  273. data/app/lib/actions/pulp/repository/presenters/ostree_presenter.rb +0 -91
  274. data/app/models/katello/ostree_branch.rb +0 -12
  275. data/app/models/katello/repository_ostree_branch.rb +0 -7
  276. data/app/services/katello/pulp/ostree_branch.rb +0 -14
  277. data/app/services/katello/pulp/repository/ostree.rb +0 -48
  278. data/app/views/katello/api/v2/ostree_branches/compare.json.rabl +0 -10
  279. data/app/views/katello/api/v2/ostree_branches/index.json.rabl +0 -7
  280. data/app/views/katello/api/v2/ostree_branches/show.json.rabl +0 -5
  281. data/app/views/katello/api/v2/root/resource_list.json.rabl +0 -3
  282. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-ostree-branches.html +0 -26
  283. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-ostree.html +0 -27
  284. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/details/ostree-branch-repositories.controller.js +0 -77
  285. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/details/ostree-branch.controller.js +0 -31
  286. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/details/views/ostree-branch-info.html +0 -15
  287. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/details/views/ostree-branch-repositories.html +0 -72
  288. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/details/views/ostree-branch.html +0 -30
  289. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/ostree-branch.factory.js +0 -27
  290. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/ostree-branches.controller.js +0 -67
  291. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/ostree-branches.module.js +0 -15
  292. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/ostree-branches.routes.js +0 -50
  293. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/ostree-branches/views/ostree-branches.html +0 -40
  294. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-manage-ostree-branches.html +0 -40
  295. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/ostree-upstream-sync-policy.service.js +0 -26
  296. data/webpack/components/extensions/HostDetails/Tabs/SubscriptionTab.js +0 -12
  297. data/webpack/scenes/Content/Details/ContentCounts.js +0 -42
  298. data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +0 -108
  299. data/webpack/scenes/Subscriptions/Manifest/__tests__/__snapshots__/ManageManifestModal.test.js.snap +0 -158
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import HOST_DETAILS_KEY from './HostDetailsConstants';
8
+
9
+ export const selectHostDetails = state =>
10
+ selectAPIResponse(state, HOST_DETAILS_KEY) || {};
11
+
12
+ export const selectHostDetailsStatus = state =>
13
+ selectAPIStatus(state, HOST_DETAILS_KEY) || STATUS.PENDING;
14
+
15
+ export const selectHostDetailsError = state =>
16
+ selectAPIError(state, HOST_DETAILS_KEY);
@@ -30,3 +30,5 @@ export const SEVERITIES_TO_PARAM = {
30
30
  };
31
31
 
32
32
  export default HOST_ERRATA_KEY;
33
+
34
+ export const ERRATA_SEARCH_QUERY = 'Errata search query';
@@ -0,0 +1,11 @@
1
+ import { API_OPERATIONS, get } from 'foremanReact/redux/API';
2
+ import { foremanApi } from '../../../../services/api';
3
+ import { HOST_PACKAGES_KEY } from './HostPackagesConstants';
4
+
5
+ export const getInstalledPackagesWithLatest = (hostId, params) => get({
6
+ type: API_OPERATIONS.GET,
7
+ key: HOST_PACKAGES_KEY,
8
+ url: foremanApi.getApiUrl(`/hosts/${hostId}/packages?include_latest_upgradable=true`),
9
+ params,
10
+ });
11
+ export default getInstalledPackagesWithLatest;
@@ -0,0 +1,2 @@
1
+ export const HOST_PACKAGES_KEY = 'HOST_PACKAGES';
2
+ export default HOST_PACKAGES_KEY;
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { HOST_PACKAGES_KEY } from './HostPackagesConstants';
8
+
9
+ export const selectHostPackages = state =>
10
+ selectAPIResponse(state, HOST_PACKAGES_KEY) || {};
11
+
12
+ export const selectHostPackagesStatus = state =>
13
+ selectAPIStatus(state, HOST_PACKAGES_KEY) || STATUS.PENDING;
14
+
15
+ export const selectHostPackagesError = state =>
16
+ selectAPIError(state, HOST_PACKAGES_KEY);
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Route, Switch, Redirect } from 'react-router-dom';
3
+ import { PackagesTab } from '../PackagesTab';
3
4
  import { ErrataTab } from '../ErrataTab';
4
5
  import { route } from './helpers';
5
6
 
@@ -8,6 +9,9 @@ const SecondaryTabRoutes = () => (
8
9
  <Route exact path="/Content">
9
10
  <Redirect to={route('errata')} />
10
11
  </Route>
12
+ <Route path={route('packages')}>
13
+ <PackagesTab />
14
+ </Route>
11
15
  <Route path={route('errata')}>
12
16
  <ErrataTab />
13
17
  </Route>
@@ -1,6 +1,7 @@
1
1
  import { translate as __ } from 'foremanReact/common/I18n';
2
2
 
3
3
  const SECONDARY_TABS = [
4
+ { key: 'packages', title: __('Packages') },
4
5
  { key: 'errata', title: __('Errata') },
5
6
  ];
6
7
 
@@ -18,7 +18,6 @@ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
18
18
  import IsoDate from 'foremanReact/components/common/dates/IsoDate';
19
19
  import { urlBuilder } from 'foremanReact/common/urlHelpers';
20
20
  import { propsToCamelCase } from 'foremanReact/common/helpers';
21
- import { isEmpty } from 'lodash';
22
21
  import SelectableDropdown from '../../../SelectableDropdown';
23
22
  import { useSet, useBulkSelect } from '../../../../components/Table/TableHooks';
24
23
  import TableWrapper from '../../../../components/Table/TableWrapper';
@@ -28,12 +27,15 @@ import ErratumExpansionDetail from './ErratumExpansionDetail';
28
27
  import ErratumExpansionContents from './ErratumExpansionContents';
29
28
  import { selectHostErrataStatus } from '../HostErrata/HostErrataSelectors';
30
29
  import { HOST_ERRATA_KEY, ERRATA_TYPES, ERRATA_SEVERITIES, TYPES_TO_PARAM, SEVERITIES_TO_PARAM } from '../HostErrata/HostErrataConstants';
30
+ import { installErrata } from './RemoteExecutionActions';
31
+ import { errataInstallUrl } from './customizedRexUrlHelpers';
31
32
  import './ErrataTab.scss';
32
33
 
33
34
  export const ErrataTab = () => {
34
35
  const hostDetails = useSelector(state => selectAPIResponse(state, 'HOST_DETAILS'));
35
36
  const {
36
37
  id: hostId,
38
+ name: hostname,
37
39
  content_facet_attributes: contentFacetAttributes,
38
40
  } = hostDetails;
39
41
  const contentFacet = propsToCamelCase(contentFacetAttributes ?? {});
@@ -91,7 +93,7 @@ export const ErrataTab = () => {
91
93
  const response = useSelector(state => selectAPIResponse(state, HOST_ERRATA_KEY));
92
94
  const { results, ...metadata } = response;
93
95
  const status = useSelector(state => selectHostErrataStatus(state));
94
-
96
+ const errataSearchQuery = id => `errata_id = ${id}`;
95
97
  const {
96
98
  selectOne, isSelected, searchQuery, selectedCount, isSelectable,
97
99
  updateSearchQuery, selectNone, fetchBulkParams, ...selectAll
@@ -104,38 +106,99 @@ export const ErrataTab = () => {
104
106
 
105
107
  if (!hostId) return <Skeleton />;
106
108
 
107
- const rowActions = [
108
- {
109
- title: __('Apply via Katello agent'), disabled: true,
110
- },
111
- {
112
- title: __('Apply via remote execution'), disabled: true,
113
- },
114
- {
115
- title: __('Apply via customized remote execution'), disabled: true,
116
- },
117
- ];
109
+ const applyErratumViaRemoteExecution = id => dispatch(installErrata({
110
+ hostname,
111
+ search: errataSearchQuery(id),
112
+ }));
113
+
114
+ const applyViaRemoteExecution = () => {
115
+ dispatch(installErrata({
116
+ hostname, search: fetchBulkParams(),
117
+ }));
118
+
119
+ const params = { page: metadata.page, per_page: metadata.per_page, search: metadata.search };
120
+ dispatch(getInstallableErrata(
121
+ hostId,
122
+ { ...params, include_applicable: toggleGroupState === ALL },
123
+ ));
124
+ };
125
+
126
+ const bulkCustomizedRexUrl = () => errataInstallUrl({
127
+ hostname, search: (selectedCount > 0) ? fetchBulkParams() : '',
128
+ });
118
129
 
119
130
  const recalculateErrata = () => {
120
131
  setIsBulkActionOpen(false);
121
132
  dispatch(regenerateApplicability(hostId));
122
133
  };
123
134
 
135
+ const applyByKatelloAgent = () => {
136
+ const selected = fetchBulkParams();
137
+ setIsBulkActionOpen(false);
138
+ selectNone();
139
+ dispatch(applyViaKatelloAgent(hostId, { search: selected }));
140
+ };
141
+
142
+ const applyErratumViaKatelloAgent = id => dispatch(applyViaKatelloAgent(
143
+ hostId,
144
+ { errata_ids: [id] },
145
+ ));
146
+
147
+ const katelloAgentAvailable = (contentFacet.katelloAgentInstalled &&
148
+ contentFacet.katelloAgentEnabled);
149
+ const apply = () => {
150
+ if (contentFacet.remoteExecutionByDefault || !katelloAgentAvailable) {
151
+ applyViaRemoteExecution();
152
+ } else {
153
+ applyByKatelloAgent();
154
+ }
155
+ };
156
+
124
157
  const dropdownItems = [
125
- <DropdownItem aria-label="bulk_add" key="bulk_add" component="button" onClick={recalculateErrata}>
158
+ <DropdownItem
159
+ aria-label="bulk_add"
160
+ key="bulk_add"
161
+ component="button"
162
+ onClick={recalculateErrata}
163
+ >
126
164
  {__('Recalculate')}
127
165
  </DropdownItem>,
128
166
  ];
129
167
 
130
- const applyByKatelloAgent = () => {
131
- const selected = fetchBulkParams();
132
- if (!isEmpty(selected)) {
133
- const parameters = { bulk_errata_ids: JSON.stringify(selected) };
134
- setIsBulkActionOpen(false);
135
- selectNone();
136
- dispatch(applyViaKatelloAgent(hostId, parameters));
137
- }
138
- };
168
+ if (katelloAgentAvailable) {
169
+ dropdownItems.push((
170
+ <DropdownItem
171
+ aria-label="apply_via_katello_agent"
172
+ key="apply_via_katello_agent"
173
+ component="button"
174
+ onClick={applyByKatelloAgent}
175
+ isDisabled={selectedCount === 0}
176
+ >
177
+ {__('Apply via Katello agent')}
178
+ </DropdownItem>));
179
+ }
180
+
181
+ dropdownItems.push((
182
+ <DropdownItem
183
+ aria-label="apply_via_remote_execution"
184
+ key="apply_via_remote_execution"
185
+ component="button"
186
+ onClick={applyViaRemoteExecution}
187
+ isDisabled={selectedCount === 0}
188
+ >
189
+ {__('Apply via remote execution')}
190
+ </DropdownItem>));
191
+
192
+ dropdownItems.push((
193
+ <DropdownItem
194
+ aria-label="apply_via_customized_remote_execution"
195
+ key="apply_via_customized_remote_execution"
196
+ component="a"
197
+ href={bulkCustomizedRexUrl()}
198
+ isDisabled={selectedCount === 0}
199
+ >
200
+ {__('Apply via customized remote execution')}
201
+ </DropdownItem>));
139
202
 
140
203
  const handleErrataTypeSelected = newType => setErrataTypeSelected((prevType) => {
141
204
  if (prevType === newType) {
@@ -157,7 +220,7 @@ export const ErrataTab = () => {
157
220
  <SplitItem>
158
221
  <ActionList isIconList>
159
222
  <ActionListItem>
160
- <Button isDisabled={selectedCount === 0} onClick={applyByKatelloAgent}> {__('Apply')} </Button>
223
+ <Button isDisabled={selectedCount === 0} onClick={apply}> {__('Apply')} </Button>
161
224
  </ActionListItem>
162
225
  <ActionListItem>
163
226
  <Dropdown
@@ -259,7 +322,7 @@ export const ErrataTab = () => {
259
322
  <Th key="select-all" />
260
323
  {columnHeaders.map(col =>
261
324
  <Th key={col}>{col}</Th>)}
262
- <Th />
325
+ <Th key="action-menu" />
263
326
  </Tr>
264
327
  </Thead>
265
328
  <>
@@ -273,6 +336,36 @@ export const ErrataTab = () => {
273
336
  installable: isInstallable,
274
337
  } = erratum;
275
338
  const isExpanded = erratumIsExpanded(id);
339
+ let rowActions;
340
+ if (isInstallable) {
341
+ rowActions = [
342
+ {
343
+ title: __('Apply via remote execution'),
344
+ onClick: () => applyErratumViaRemoteExecution(errataId),
345
+ },
346
+ {
347
+ title: __('Apply via customized remote execution'),
348
+ component: 'a',
349
+ href: errataInstallUrl({ hostname, search: errataSearchQuery(errataId) }),
350
+ },
351
+ ];
352
+
353
+ if (contentFacet.katelloAgentInstalled && contentFacet.katelloAgentEnabled) {
354
+ rowActions.unshift({
355
+ title: __('Apply via Katello agent'),
356
+ onClick: () => applyErratumViaKatelloAgent(errataId),
357
+ });
358
+ }
359
+ } else {
360
+ rowActions = [
361
+ {
362
+ title: __('Apply Erratum'),
363
+ component: 'a',
364
+ href: urlBuilder(`errata/${id}/content-hosts`, ''),
365
+ },
366
+ ];
367
+ }
368
+
276
369
  return (
277
370
  <Tbody isExpanded={isExpanded} key={`${id}_${createdAt}`}>
278
371
  <Tr>
@@ -319,6 +412,7 @@ export const ErrataTab = () => {
319
412
  actions={{
320
413
  items: rowActions,
321
414
  }}
415
+
322
416
  />
323
417
  </Tr>
324
418
  <Tr key="child_row" isExpanded={isExpanded}>
@@ -1,2 +1,3 @@
1
1
  export const HOST_TRACES_KEY = 'HOST_TRACES';
2
2
  export const KATELLO_TRACER_PACKAGE = 'katello-host-tools-tracer';
3
+ export const TRACES_SEARCH_QUERY = 'Traces search query';
@@ -0,0 +1,127 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import { useSelector } from 'react-redux';
3
+ import { Button, Hint, HintBody } from '@patternfly/react-core';
4
+ import { TableVariant, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table';
5
+ import { translate as __ } from 'foremanReact/common/I18n';
6
+ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
7
+
8
+ import { urlBuilder } from 'foremanReact/common/urlHelpers';
9
+ import TableWrapper from '../../../../components/Table/TableWrapper';
10
+ import { PackagesStatus, PackagesLatestVersion } from '../../../../components/Packages';
11
+ import { getInstalledPackagesWithLatest } from '../HostPackages/HostPackagesActions';
12
+ import { selectHostPackagesStatus } from '../HostPackages/HostPackagesSelectors';
13
+ import { HOST_PACKAGES_KEY } from '../HostPackages/HostPackagesConstants';
14
+ import './PackagesTab.scss';
15
+
16
+ export const PackagesTab = () => {
17
+ const hostDetails = useSelector(state => selectAPIResponse(state, 'HOST_DETAILS'));
18
+ const { id: hostId } = hostDetails;
19
+ const actionButtons = <Button isDisabled> {__('Upgrade')} </Button>;
20
+
21
+ const [searchQuery, updateSearchQuery] = useState('');
22
+
23
+ const emptyContentTitle = __('This host does not have any packages.');
24
+ const emptyContentBody = __('Packages will appear here when available.');
25
+ const emptySearchTitle = __('No matching packages found');
26
+ const emptySearchBody = __('Try changing your search settings.');
27
+ const columnHeaders = [
28
+ __('Package'),
29
+ __('Status'),
30
+ __('Installed Version'),
31
+ __('Upgradable To'),
32
+ ];
33
+
34
+ const fetchItems = useCallback(
35
+ params => (hostId ? getInstalledPackagesWithLatest(hostId, params) : null),
36
+ [hostId],
37
+ );
38
+
39
+ const response = useSelector(state => selectAPIResponse(state, HOST_PACKAGES_KEY));
40
+ const { results, ...metadata } = response;
41
+ const status = useSelector(state => selectHostPackagesStatus(state));
42
+ const rowActions = [
43
+ {
44
+ title: __('Upgrade via remote execution'), disabled: true,
45
+ },
46
+ {
47
+ title: __('Upgrade via customized remote execution'), disabled: true,
48
+ },
49
+ ];
50
+
51
+ return (
52
+ <div>
53
+ <div id="packages-hint">
54
+ <Hint>
55
+ <HintBody>
56
+ {__('Packages management functionality on this page is incomplete')}.
57
+ <br />
58
+ <Button component="a" variant="link" isInline href={urlBuilder(`content_hosts/${hostId}/packages/installed`, '')}>
59
+ {__('Visit the previous Packages page')}.
60
+ </Button>
61
+ </HintBody>
62
+ </Hint>
63
+ </div>
64
+ <div id="packages-tab">
65
+ <TableWrapper
66
+ {...{
67
+ metadata,
68
+ emptyContentTitle,
69
+ emptyContentBody,
70
+ emptySearchTitle,
71
+ emptySearchBody,
72
+ status,
73
+ actionButtons,
74
+ searchQuery,
75
+ updateSearchQuery,
76
+ }
77
+ }
78
+ additionalListeners={[hostId]}
79
+ fetchItems={fetchItems}
80
+ autocompleteEndpoint={`/hosts/${hostId}/packages/auto_complete_search`}
81
+ foremanApiAutoComplete
82
+ variant={TableVariant.compact}
83
+ >
84
+ <Thead>
85
+ <Tr>
86
+ {columnHeaders.map(col =>
87
+ <Th key={col}>{col}</Th>)}
88
+ <Th />
89
+ </Tr>
90
+ </Thead>
91
+ <Tbody>
92
+ {results?.map((packages) => {
93
+ const {
94
+ id,
95
+ name: packageName,
96
+ nvra: installedVersion,
97
+ rpm_id: rpmId,
98
+ } = packages;
99
+ return (
100
+ <Tr key={`${id}`}>
101
+ <Td>
102
+ {rpmId
103
+ ? <a href={urlBuilder(`packages/${rpmId}`, '')}>{packageName}</a>
104
+ : packageName
105
+ }
106
+ </Td>
107
+ <Td><PackagesStatus {...packages} /></Td>
108
+ <Td>{installedVersion.replace(`${packageName}-`, '')}</Td>
109
+ <Td><PackagesLatestVersion {...packages} /></Td>
110
+ <Td
111
+ key={`rowActions-${id}`}
112
+ actions={{
113
+ items: rowActions,
114
+ }}
115
+ />
116
+ </Tr>
117
+ );
118
+ })
119
+ }
120
+ </Tbody>
121
+ </TableWrapper>
122
+ </div>
123
+ </div>
124
+ );
125
+ };
126
+
127
+ export default PackagesTab;
@@ -0,0 +1,11 @@
1
+ #packages-tab {
2
+ margin: 0 20px;
3
+ margin-bottom: 2em;
4
+ margin-top: 2em;
5
+ }
6
+
7
+ #packages-alert {
8
+ margin: 0 20px;
9
+ margin-bottom: 2em;
10
+ margin-top: 2em;
11
+ }
@@ -3,6 +3,8 @@ import { REX_JOB_INVOCATIONS_KEY, REX_FEATURES } from './RemoteExecutionConstant
3
3
  import { foremanApi } from '../../../../services/api';
4
4
  import { getResponseErrorMsgs } from '../../../../utils/helpers';
5
5
  import { renderTaskStartedToast } from '../../../../scenes/Tasks/helpers';
6
+ import { ERRATA_SEARCH_QUERY } from '../HostErrata/HostErrataConstants';
7
+ import { TRACES_SEARCH_QUERY } from './HostTracesConstants';
6
8
 
7
9
  const errorToast = (error) => {
8
10
  const message = getResponseErrorMsgs(error.response);
@@ -24,13 +26,21 @@ const katelloPackageInstallParams = ({ hostname, packageName }) =>
24
26
  feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL,
25
27
  });
26
28
 
27
- const katelloTracerResolveParams = ({ hostname, ids }) =>
29
+ const katelloTracerResolveParams = ({ hostname, search }) =>
28
30
  baseParams({
29
31
  hostname,
30
- inputs: { ids },
32
+ inputs: { [TRACES_SEARCH_QUERY]: search },
31
33
  feature: REX_FEATURES.KATELLO_HOST_TRACER_RESOLVE,
32
34
  });
33
35
 
36
+ const katelloHostErrataInstallParams = ({
37
+ hostname, search,
38
+ }) => baseParams({
39
+ hostname,
40
+ inputs: { [ERRATA_SEARCH_QUERY]: search },
41
+ feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL,
42
+ });
43
+
34
44
  export const installPackage = ({ hostname, packageName }) => post({
35
45
  type: API_OPERATIONS.POST,
36
46
  key: REX_JOB_INVOCATIONS_KEY,
@@ -43,14 +53,30 @@ export const installPackage = ({ hostname, packageName }) => post({
43
53
  errorToast: error => errorToast(error),
44
54
  });
45
55
 
46
- export const resolveTraces = ({ hostname, ids }) => post({
56
+ export const resolveTraces = ({ hostname, search }) => post({
47
57
  type: API_OPERATIONS.POST,
48
58
  key: REX_JOB_INVOCATIONS_KEY,
49
59
  url: foremanApi.getApiUrl('/job_invocations'),
50
- params: katelloTracerResolveParams({ hostname, ids }),
60
+ params: katelloTracerResolveParams({ hostname, search }),
51
61
  handleSuccess: response => renderTaskStartedToast({
52
62
  humanized: { action: `Resolve traces on ${hostname}` },
53
63
  id: response?.data?.dynflow_task?.id,
54
64
  }),
55
65
  errorToast: error => errorToast(error),
56
66
  });
67
+
68
+ export const installErrata = ({
69
+ hostname, search,
70
+ }) => post({
71
+ type: API_OPERATIONS.POST,
72
+ key: REX_JOB_INVOCATIONS_KEY,
73
+ url: foremanApi.getApiUrl('/job_invocations'),
74
+ params: katelloHostErrataInstallParams({
75
+ hostname, search,
76
+ }),
77
+ handleSuccess: response => renderTaskStartedToast({
78
+ humanized: { action: `Install Errata on ${hostname}` },
79
+ id: response?.data?.dynflow_task?.id,
80
+ }),
81
+ errorToast: error => errorToast(error),
82
+ });
@@ -2,4 +2,5 @@ export const REX_JOB_INVOCATIONS_KEY = 'REX_JOB_INVOCATIONS';
2
2
  export const REX_FEATURES = {
3
3
  KATELLO_PACKAGE_INSTALL: 'katello_package_install',
4
4
  KATELLO_HOST_TRACER_RESOLVE: 'katello_host_tracer_resolve',
5
+ KATELLO_HOST_ERRATA_INSTALL: 'katello_errata_install',
5
6
  };
@@ -0,0 +1,73 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { API_OPERATIONS, get, put } from 'foremanReact/redux/API';
3
+ import katelloApi, { foremanApi } from '../../../../../services/api';
4
+ import { REPOSITORY_SETS_KEY, CONTENT_OVERRIDES_KEY } from './RepositorySetsConstants';
5
+ import { getResponseErrorMsgs } from '../../../../../utils/helpers';
6
+
7
+ const errorToast = (error) => {
8
+ const message = getResponseErrorMsgs(error.response);
9
+ return message;
10
+ };
11
+
12
+ export const getHostRepositorySets = params => get({
13
+ type: API_OPERATIONS.GET,
14
+ key: REPOSITORY_SETS_KEY,
15
+ url: katelloApi.getApiUrl('/repository_sets'),
16
+ errorToast: error => errorToast(error),
17
+ params,
18
+ });
19
+
20
+ export const enableRepoSetRepo = ({ hostId, labels, updateResults }) => put({
21
+ type: API_OPERATIONS.PUT,
22
+ key: CONTENT_OVERRIDES_KEY,
23
+ url: foremanApi.getApiUrl(`/hosts/${hostId}/subscriptions/content_override`),
24
+ params: {
25
+ content_overrides: labels.map(label => ({
26
+ content_label: label,
27
+ name: 'enabled',
28
+ value: true,
29
+ })),
30
+ },
31
+ updateData: () => {
32
+ updateResults({ labels, enabled: true });
33
+ },
34
+ successToast: () => (labels.length === 1 ? __('Repository set enabled') : __('Repository sets enabled')),
35
+ errorToast: error => errorToast(error),
36
+ });
37
+
38
+ export const disableRepoSetRepo = ({ hostId, labels, updateResults }) => put({
39
+ type: API_OPERATIONS.PUT,
40
+ key: CONTENT_OVERRIDES_KEY,
41
+ url: foremanApi.getApiUrl(`/hosts/${hostId}/subscriptions/content_override`),
42
+ params: {
43
+ content_overrides: labels.map(label => ({
44
+ content_label: label,
45
+ name: 'enabled',
46
+ value: false,
47
+ })),
48
+ },
49
+ updateData: () => {
50
+ updateResults({ labels, enabled: false });
51
+ },
52
+ successToast: () => (labels.length === 1 ? __('Repository set disabled') : __('Repository sets disabled')),
53
+ errorToast: error => errorToast(error),
54
+ });
55
+
56
+ export const resetRepoSetRepo = ({ hostId, labels, updateResults }) => put({
57
+ type: API_OPERATIONS.PUT,
58
+ key: CONTENT_OVERRIDES_KEY,
59
+ url: foremanApi.getApiUrl(`/hosts/${hostId}/subscriptions/content_override`),
60
+ params: {
61
+ content_overrides: labels.map(label => ({
62
+ content_label: label,
63
+ name: 'enabled',
64
+ value: false,
65
+ remove: true,
66
+ })),
67
+ },
68
+ updateData: (_, resp) => {
69
+ updateResults({ labels, enabled: null, newResponse: resp });
70
+ },
71
+ successToast: () => (labels.length === 1 ? __('Repository set reset to default') : __('Repository sets reset to default')),
72
+ errorToast: error => errorToast(error),
73
+ });
@@ -0,0 +1,2 @@
1
+ export const REPOSITORY_SETS_KEY = 'HOST_DETAIL_REPOSITORY_SETS';
2
+ export const CONTENT_OVERRIDES_KEY = 'HOST_DETAIL_CONTENT_OVERRIDES';
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { REPOSITORY_SETS_KEY } from './RepositorySetsConstants';
8
+
9
+ export const selectRepositorySets = state =>
10
+ selectAPIResponse(state, REPOSITORY_SETS_KEY) || {};
11
+
12
+ export const selectRepositorySetsStatus = state =>
13
+ selectAPIStatus(state, REPOSITORY_SETS_KEY) || STATUS.PENDING;
14
+
15
+ export const selectRepositorySetsError = state =>
16
+ selectAPIError(state, REPOSITORY_SETS_KEY);