katello 4.3.0.rc4 → 4.4.0.rc2

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 (458) 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/api_controller.rb +13 -4
  4. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -1
  5. data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
  6. data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
  7. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
  8. data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
  9. data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
  10. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +10 -1
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +42 -14
  12. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  13. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  14. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  15. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  16. data/app/graphql/types/host_collection.rb +18 -0
  17. data/app/helpers/katello/content_source_helper.rb +43 -0
  18. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  19. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  20. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  21. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  22. data/app/lib/actions/katello/repository/discover.rb +1 -14
  23. data/app/lib/actions/katello/repository/errata_mail.rb +4 -5
  24. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  25. data/app/lib/actions/katello/repository/sync.rb +2 -2
  26. data/app/lib/actions/pulp3/abstract.rb +1 -1
  27. data/app/lib/actions/pulp3/abstract_async_task.rb +1 -1
  28. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +14 -4
  29. data/app/lib/actions/pulp3/content_view_version/create_import_history.rb +1 -2
  30. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  31. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  32. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  33. data/app/lib/actions/pulp3/repository/reclaim_space.rb +3 -10
  34. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  35. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  36. data/app/lib/katello/errors.rb +3 -3
  37. data/app/lib/katello/logging.rb +6 -1
  38. data/app/lib/katello/repo_discovery.rb +27 -19
  39. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  40. data/app/lib/katello/resources/cdn.rb +4 -2
  41. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  42. data/app/lib/katello/util/pulpcore_content_filters.rb +2 -1
  43. data/app/models/katello/candlepin/repository_mapper.rb +3 -2
  44. data/app/models/katello/cdn_configuration.rb +38 -6
  45. data/app/models/katello/concerns/audit_comment_extensions.rb +17 -0
  46. data/app/models/katello/concerns/host_managed_extensions.rb +34 -2
  47. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  48. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  49. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  50. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  51. data/app/models/katello/content_view.rb +4 -4
  52. data/app/models/katello/content_view_filter.rb +1 -1
  53. data/app/models/katello/content_view_history.rb +1 -1
  54. data/app/models/katello/content_view_version.rb +6 -2
  55. data/app/models/katello/content_view_version_export_history.rb +3 -2
  56. data/app/models/katello/content_view_version_import_history.rb +4 -4
  57. data/app/models/katello/deb.rb +1 -3
  58. data/app/models/katello/docker_meta_tag.rb +1 -1
  59. data/app/models/katello/erratum.rb +0 -15
  60. data/app/models/katello/glue/provider.rb +1 -1
  61. data/app/models/katello/glue/pulp/repos.rb +3 -1
  62. data/app/models/katello/host/content_facet.rb +2 -27
  63. data/app/models/katello/host/info_provider.rb +9 -0
  64. data/app/models/katello/host/subscription_facet.rb +2 -2
  65. data/app/models/katello/host_available_module_stream.rb +10 -0
  66. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  67. data/app/models/katello/installed_package.rb +1 -0
  68. data/app/models/katello/product.rb +1 -1
  69. data/app/models/katello/product_content.rb +2 -2
  70. data/app/models/katello/repository.rb +13 -12
  71. data/app/models/katello/root_repository.rb +65 -16
  72. data/app/models/katello/rpm.rb +8 -2
  73. data/app/models/setting/content.rb +15 -5
  74. data/app/services/cert/rhsm_client.rb +1 -5
  75. data/app/services/katello/component_view_presenter.rb +1 -1
  76. data/app/services/katello/content_unit_indexer.rb +166 -0
  77. data/app/services/katello/organization_creator.rb +23 -8
  78. data/app/services/katello/pulp/repository/docker.rb +1 -1
  79. data/app/services/katello/pulp/repository/yum.rb +0 -54
  80. data/app/services/katello/pulp/repository.rb +0 -6
  81. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  82. data/app/services/katello/pulp3/api/apt.rb +7 -0
  83. data/app/services/katello/pulp3/api/yum.rb +4 -0
  84. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  85. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -1
  86. data/app/services/katello/pulp3/deb.rb +10 -9
  87. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  88. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  89. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  90. data/app/services/katello/pulp3/erratum.rb +51 -56
  91. data/app/services/katello/pulp3/file_unit.rb +9 -6
  92. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  93. data/app/services/katello/pulp3/module_stream.rb +76 -30
  94. data/app/services/katello/pulp3/package_group.rb +5 -5
  95. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  96. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  97. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  98. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  99. data/app/services/katello/pulp3/repository/yum.rb +23 -16
  100. data/app/services/katello/pulp3/repository.rb +31 -10
  101. data/app/services/katello/pulp3/repository_mirror.rb +18 -4
  102. data/app/services/katello/pulp3/rpm.rb +13 -13
  103. data/app/services/katello/pulp3/srpm.rb +10 -9
  104. data/app/services/katello/registration_manager.rb +1 -1
  105. data/app/services/katello/repository_type.rb +15 -4
  106. data/app/services/katello/repository_type_manager.rb +1 -1
  107. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  108. data/app/services/katello/upstream_connection_checker.rb +2 -2
  109. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  110. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  111. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  112. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  113. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +19 -0
  114. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +19 -0
  115. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  116. data/app/views/katello/api/v2/content_views/base.json.rabl +8 -4
  117. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  118. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +1 -0
  119. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -0
  120. data/app/views/katello/api/v2/repositories/show.json.rabl +3 -1
  121. data/app/views/katello/layouts/react.html.erb +0 -1
  122. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  123. data/config/initializers/monkeys.rb +0 -1
  124. data/config/routes/api/v2.rb +1 -0
  125. data/config/routes/overrides.rb +3 -0
  126. data/config/routes.rb +2 -0
  127. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  128. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  129. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +2 -0
  130. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +11 -2
  131. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  132. data/db/migrate/20211202172358_add_repository_mirroring_policy.rb +26 -0
  133. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  134. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  135. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  136. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  137. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  138. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  139. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  140. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  141. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +23 -0
  142. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  143. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  144. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +10 -3
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  152. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  153. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +29 -10
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +49 -35
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +30 -0
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +29 -6
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +48 -23
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  162. data/lib/katello/engine.rb +4 -0
  163. data/lib/katello/permission_creator.rb +1 -1
  164. data/lib/katello/permissions/host_permissions.rb +3 -1
  165. data/lib/katello/plugin.rb +9 -1
  166. data/lib/katello/repository_types/deb.rb +0 -1
  167. data/lib/katello/repository_types/docker.rb +4 -4
  168. data/lib/katello/repository_types/file.rb +0 -1
  169. data/lib/katello/repository_types/ostree.rb +4 -6
  170. data/lib/katello/repository_types/python.rb +5 -1
  171. data/lib/katello/repository_types/yum.rb +2 -9
  172. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  173. data/lib/katello/tasks/import_applicability.rake +1 -1
  174. data/lib/katello/tasks/jenkins.rake +0 -2
  175. data/lib/katello/tasks/repository.rake +4 -1
  176. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  177. data/lib/katello/version.rb +1 -1
  178. data/locale/action_names.rb +8 -7
  179. data/locale/bn/katello.po +1402 -650
  180. data/locale/cs/katello.po +1217 -96
  181. data/locale/de/katello.po +2359 -1347
  182. data/locale/en/katello.po +1216 -94
  183. data/locale/es/katello.po +2201 -1172
  184. data/locale/fr/katello.po +2601 -1615
  185. data/locale/gu/katello.po +1564 -814
  186. data/locale/hi/katello.po +1563 -810
  187. data/locale/it/katello.po +1311 -282
  188. data/locale/ja/katello.po +2534 -1518
  189. data/locale/katello.pot +3430 -1326
  190. data/locale/kn/katello.po +1564 -812
  191. data/locale/ko/katello.po +1441 -409
  192. data/locale/mr/katello.po +1564 -776
  193. data/locale/or/katello.po +1565 -813
  194. data/locale/pa/katello.po +1559 -792
  195. data/locale/pt/katello.po +1314 -277
  196. data/locale/pt_BR/katello.po +2226 -1181
  197. data/locale/ru/katello.po +1587 -563
  198. data/locale/ta/katello.po +1373 -619
  199. data/locale/te/katello.po +1564 -810
  200. data/locale/zh_CN/katello.po +2936 -1890
  201. data/locale/zh_TW/katello.po +1508 -606
  202. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  203. data/webpack/components/ActionableDetail.js +35 -21
  204. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  205. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  206. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  207. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  208. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +1 -1
  209. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  210. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  211. data/webpack/components/EditableSwitch.js +8 -2
  212. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  213. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  214. data/webpack/components/Errata/index.js +95 -29
  215. data/webpack/components/ErratumTypeLabel.js +16 -16
  216. data/webpack/components/MultiSelect/index.js +2 -2
  217. data/webpack/components/Packages/index.js +1 -1
  218. data/webpack/components/RoutedTabs/index.js +2 -1
  219. data/webpack/components/Search/Search.js +5 -2
  220. data/webpack/components/Search/__tests__/search.test.js +2 -3
  221. data/webpack/components/Select/Select.js +1 -1
  222. data/webpack/components/SelectOrg/SelectOrgReducer.js +15 -15
  223. data/webpack/components/SelectOrg/SetOrganization.js +2 -2
  224. data/webpack/components/Table/PageControls.js +3 -6
  225. data/webpack/components/Table/TableHooks.js +47 -7
  226. data/webpack/components/Table/TableWrapper.js +25 -7
  227. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  228. data/webpack/components/TypeAhead/helpers/commonPropTypes.js +1 -1
  229. data/webpack/components/TypeAhead/helpers/helpers.js +14 -14
  230. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +1 -1
  231. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  232. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  233. data/webpack/components/WithOrganization/withOrganization.js +3 -3
  234. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  235. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +108 -0
  236. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +56 -0
  237. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  238. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +49 -2
  239. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +14 -1
  240. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +6 -4
  241. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +1 -0
  242. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  243. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +86 -75
  244. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.scss +11 -0
  245. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +3 -3
  246. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  247. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  248. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  249. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  250. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +16 -0
  251. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +3 -0
  252. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsSelectors.js +19 -0
  253. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +241 -0
  254. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +108 -0
  255. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +34 -0
  256. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  257. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  258. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +357 -64
  259. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.scss +3 -7
  260. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +103 -4
  261. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +6 -1
  262. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +45 -42
  263. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.scss +3 -3
  264. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  265. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  266. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  267. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  268. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  269. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +66 -61
  270. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.scss +11 -0
  271. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  272. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  274. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +312 -11
  275. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  276. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +26 -30
  277. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +25 -5
  279. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  280. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  281. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  282. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  283. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +4 -0
  284. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  285. data/webpack/components/extensions/RegistrationCommands/fields/LifecycleEnvironment.js +1 -1
  286. data/webpack/components/extensions/about/SystemStatuses.js +1 -1
  287. data/webpack/components/extensions/about/SystemStatusesReducer.js +10 -10
  288. data/webpack/components/pf3Table/components/Table.js +4 -5
  289. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  290. data/webpack/components/pf3Table/components/TableBody.js +2 -2
  291. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  292. data/webpack/containers/Application/config.js +6 -1
  293. data/webpack/containers/Application/overrides.scss +56 -7
  294. data/webpack/global_index.js +4 -1
  295. data/webpack/global_test_setup.js +1 -1
  296. data/webpack/index.js +7 -0
  297. data/webpack/redux/OrganizationProducts/OrganizationProductsReducer.js +15 -15
  298. data/webpack/redux/reducers/RedHatRepositories/enabled.js +43 -43
  299. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +43 -43
  300. data/webpack/redux/reducers/RedHatRepositories/sets.js +31 -31
  301. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsReducer.js +26 -26
  302. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsReducer.js +19 -19
  303. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  304. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  305. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  306. data/webpack/scenes/Content/ContentConfig.js +55 -5
  307. data/webpack/scenes/Content/ContentPage.js +5 -5
  308. data/webpack/scenes/Content/Details/ContentDetails.js +23 -21
  309. data/webpack/scenes/Content/Details/ContentInfo.js +2 -2
  310. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  311. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  312. data/webpack/scenes/Content/Table/ContentTable.js +2 -2
  313. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  314. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -4
  315. data/webpack/scenes/ContentViews/ContentViewsPage.js +17 -13
  316. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -1
  317. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +3 -2
  318. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +2 -2
  319. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  320. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +22 -11
  321. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +31 -18
  322. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +1 -1
  323. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  324. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +22 -28
  325. data/webpack/scenes/ContentViews/Details/ContentViewDetailReducer.js +8 -8
  326. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  327. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +32 -30
  328. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +9 -4
  329. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +14 -17
  330. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +3 -0
  331. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +1 -1
  332. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +8 -8
  333. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +4 -4
  334. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +6 -6
  335. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +16 -9
  336. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +46 -46
  337. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +17 -17
  338. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +17 -17
  339. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +4 -4
  340. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  341. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +17 -11
  342. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +1 -1
  343. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  344. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +17 -17
  345. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  346. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  347. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  348. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  349. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  350. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  351. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  352. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  353. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +24 -3
  354. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  355. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +28 -28
  356. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +18 -18
  358. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +3 -3
  359. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +3 -3
  360. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  361. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -1
  362. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -1
  363. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -35
  364. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  365. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +5 -2
  366. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +39 -40
  367. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +46 -34
  368. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +66 -49
  369. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +5 -5
  370. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  371. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  372. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +2 -2
  373. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +5 -5
  374. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +3 -3
  375. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  376. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  377. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +18 -18
  378. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -10
  379. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  380. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +8 -8
  381. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  382. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  383. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  384. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  385. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  386. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  387. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  388. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  389. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  390. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsReducer.js +18 -18
  391. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  392. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  393. data/webpack/scenes/ModuleStreams/ModuleStreamsReducer.js +26 -26
  394. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  395. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  396. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  397. data/webpack/scenes/Organizations/OrganizationReducer.js +8 -8
  398. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  399. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  400. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  401. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +4 -4
  402. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -1
  403. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  404. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  405. data/webpack/scenes/Settings/SettingsReducer.js +14 -14
  406. data/webpack/scenes/Settings/Tables/TableReducer.js +23 -23
  407. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailInfo.js +2 -2
  408. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProductContent.js +15 -15
  409. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProducts.js +1 -1
  410. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailReducer.js +34 -34
  411. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +13 -13
  412. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  413. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  414. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  415. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  416. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  417. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  418. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  419. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  420. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  421. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +11 -6
  422. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryReducer.js +16 -16
  423. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +149 -149
  424. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsReducer.js +41 -41
  425. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  426. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  427. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  428. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  429. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  430. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/DeleteDialog.js +6 -6
  431. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +12 -12
  432. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  433. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  434. data/webpack/services/api/testHelpers.js +5 -3
  435. data/webpack/services/index.js +36 -36
  436. data/webpack/utils/helpers.js +11 -8
  437. metadata +98 -60
  438. data/app/services/katello/pulp/deb.rb +0 -55
  439. data/app/services/katello/pulp/distribution.rb +0 -7
  440. data/app/services/katello/pulp/docker_blob.rb +0 -7
  441. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  442. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  443. data/app/services/katello/pulp/docker_tag.rb +0 -14
  444. data/app/services/katello/pulp/erratum.rb +0 -129
  445. data/app/services/katello/pulp/file_unit.rb +0 -21
  446. data/app/services/katello/pulp/module_stream.rb +0 -39
  447. data/app/services/katello/pulp/package_category.rb +0 -7
  448. data/app/services/katello/pulp/package_group.rb +0 -20
  449. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  450. data/app/services/katello/pulp/rpm.rb +0 -57
  451. data/app/services/katello/pulp/srpm.rb +0 -29
  452. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  453. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  454. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  455. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  456. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +0 -16
  457. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +0 -12
  458. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -4,23 +4,21 @@ module Actions
4
4
  class Update < Actions::EntryAction
5
5
  def plan(cdn_configuration, options)
6
6
  cdn_configuration.update!(options)
7
+ return if cdn_configuration.airgapped?
7
8
 
8
- if cdn_configuration.redhat?
9
- cdn_configuration.ssl_cert = nil
10
- cdn_configuration.ssl_key = nil
11
- else
9
+ if cdn_configuration.upstream_server?
12
10
  resource = ::Katello::Resources::CDN::CdnResource.create(cdn_configuration: cdn_configuration)
13
11
  keypair = resource.debug_certificate
14
12
  cdn_configuration.ssl_cert = OpenSSL::X509::Certificate.new(keypair)
15
13
  cdn_configuration.ssl_key = OpenSSL::PKey::RSA.new(keypair)
16
- end
17
14
 
18
- cdn_configuration.save!
15
+ cdn_configuration.save!
16
+ end
19
17
 
20
18
  org = cdn_configuration.organization
21
19
  roots = ::Katello::RootRepository.redhat.in_organization(org)
22
20
  roots.each do |root|
23
- full_path = if cdn_configuration.redhat?
21
+ full_path = if cdn_configuration.redhat_cdn?
24
22
  root.product.repo_url(root.library_instance.generate_content_path)
25
23
  else
26
24
  resource.repository_url(content_label: root.content.label)
@@ -200,6 +200,11 @@ module Actions
200
200
  plan_action(Katello::Repository::IndexContent, id: id, full_index: true)
201
201
  end
202
202
  end
203
+ concurrence do
204
+ version.importable_repositories.each do |repo|
205
+ plan_action(::Actions::Katello::Repository::MetadataGenerate, repo)
206
+ end
207
+ end
203
208
  plan_action(::Actions::Pulp3::Orchestration::ContentViewVersion::CopyVersionUnitsToLibrary, version)
204
209
  end
205
210
  end
@@ -72,6 +72,18 @@ module Actions
72
72
 
73
73
  unless extended_repo_mapping.empty? || unit_map.values.flatten.empty?
74
74
  sequence do
75
+ # Pre-copy content if dest_repo is a soft copy of its library instance.
76
+ # Don't use extended_repo_mapping because the source repositories are library instances.
77
+ # We want the old CV snapshot repositories here so as to not pull in excess new content.
78
+ separated_repo_map[:pulp3_yum_multicopy].each do |source_repos, dest_repo|
79
+ if dest_repo.soft_copy_of_library?
80
+ source_repos.each do |source_repo|
81
+ # remove_all flag is set to cover the case of incrementally updating more than once with different content.
82
+ # Without it, content from the previous incremental update will be copied as well due to how Pulp repo versions work.
83
+ plan_action(Pulp3::Repository::CopyContent, source_repo, SmartProxy.pulp_primary, dest_repo, copy_all: true, remove_all: true)
84
+ end
85
+ end
86
+ end
75
87
  copy_action_outputs << plan_action(Pulp3::Repository::MultiCopyUnits, extended_repo_mapping, unit_map,
76
88
  dependency_solving: dep_solve).output
77
89
  repos_to_clone.each do |source_repos|
@@ -125,10 +137,12 @@ module Actions
125
137
  source_library_repo = source_repos.first.library_instance? ? source_repos.first : source_repos.first.library_instance
126
138
 
127
139
  source_repos = [source_library_repo]
128
- if old_version_repo.version_href
129
- base_version = old_version_repo.version_href.split("/")[-1].to_i
130
- else
140
+ if old_version_repo.version_href.nil?
131
141
  base_version = 0
142
+ elsif old_version_repo.soft_copy_of_library?
143
+ base_version = nil
144
+ else
145
+ base_version = old_version_repo.version_href.split("/")[-1].to_i
132
146
  end
133
147
 
134
148
  pulp3_repo_mapping[source_repos.map(&:id)] = { dest_repo: dest_repo.id, base_version: base_version }
@@ -33,7 +33,7 @@ module Actions
33
33
  password = decrypt_field(input[:upstream_password])
34
34
  repo_discovery = ::Katello::RepoDiscovery.new(input[:url], input[:content_type],
35
35
  input[:upstream_username], password,
36
- input[:search], proxy,
36
+ input[:search],
37
37
  output[:crawled], output[:repo_urls], output[:to_follow])
38
38
 
39
39
  repo_discovery.run(output[:to_follow].shift)
@@ -49,19 +49,6 @@ module Actions
49
49
  def task_output
50
50
  output[:repo_urls] || []
51
51
  end
52
-
53
- def proxy
54
- proxy_details = {}
55
- if (proxy = ::HttpProxy.default_global_content_proxy)
56
- uri = URI(proxy.url)
57
- proxy_details[:proxy_host] = "#{uri.scheme}://#{uri.host}#{uri.path}"
58
- proxy_details[:proxy_port] = uri.port
59
- proxy_details[:proxy_user] = proxy.username
60
- proxy_details[:proxy_password] = proxy.password
61
- end
62
-
63
- proxy_details
64
- end
65
52
  end
66
53
  end
67
54
  end
@@ -4,17 +4,16 @@ module Actions
4
4
  class ErrataMail < Actions::EntryAction
5
5
  middleware.use Actions::Middleware::ExecuteIfContentsChanged
6
6
 
7
- def plan(repo, last_updated = nil, contents_changed = nil)
8
- last_updated ||= repo.repository_errata.order('updated_at ASC').last.try(:updated_at) || Time.now
9
- plan_self(:repo => repo.id, :last_updated => last_updated.to_s, :contents_changed => contents_changed)
7
+ def plan(repo, contents_changed = nil)
8
+ plan_self(:repo => repo.id, :contents_changed => contents_changed)
10
9
  end
11
10
 
12
11
  def run
13
12
  ::User.current = ::User.anonymous_admin
14
-
15
13
  repo = ::Katello::Repository.find(input[:repo])
14
+ last_updated = repo.repository_errata.order('updated_at ASC').last.try(:updated_at) || Time.now
16
15
  users = ::User.select { |user| user.receives?(:sync_errata) && user.organization_ids.include?(repo.organization.id) && user.can?(:view_products, repo.product) }.compact
17
- errata = ::Katello::Erratum.where(:id => repo.repository_errata.where('katello_repository_errata.updated_at > ?', input[:last_updated].to_datetime).pluck(:erratum_id))
16
+ errata = ::Katello::Erratum.where(:id => repo.repository_errata.where('katello_repository_errata.updated_at > ?', last_updated).pluck(:erratum_id))
18
17
 
19
18
  begin
20
19
  MailNotification[:sync_errata].deliver(:users => users, :repo => repo, :errata => errata) unless (users.blank? || errata.blank?)
@@ -24,7 +24,7 @@ module Actions
24
24
  ::Katello::FileUnit.import_for_repository(repo)
25
25
  elsif repo.generic?
26
26
  repo.repository_type.content_types_to_index.each do |type|
27
- type.model_class.import_for_repository(repo, generic_content_type: type.content_type)
27
+ type.model_class.import_for_repository(repo, content_type: type.content_type)
28
28
  end
29
29
  elsif repo.deb?
30
30
  if input[:import_upload_task] && input[:import_upload_task][:content_unit_href]
@@ -51,11 +51,11 @@ module Actions
51
51
  plan_action(Katello::Repository::FetchPxeFiles, :id => repo.id)
52
52
  plan_action(Katello::Repository::CorrectChecksum, repo)
53
53
  concurrence do
54
- plan_action(Katello::Repository::ErrataMail, repo, nil, contents_changed)
54
+ plan_action(Katello::Repository::ErrataMail, repo, output[:contents_changed])
55
55
  plan_action(Actions::Katello::Applicability::Repository::Regenerate, :repo_ids => [repo.id]) if generate_applicability
56
56
  end
57
57
  plan_self(:id => repo.id, :sync_result => output, :skip_metadata_check => skip_metadata_check, :validate_contents => validate_contents,
58
- :contents_changed => contents_changed)
58
+ :contents_changed => output[:contents_changed])
59
59
  plan_action(Katello::Repository::SyncHook, :id => repo.id)
60
60
  end
61
61
  end
@@ -1,6 +1,6 @@
1
1
  module Actions
2
2
  module Pulp3
3
- class Abstract < Actions::Base
3
+ class Abstract < Actions::EntryAction
4
4
  middleware.use ::Actions::Middleware::RemoteAction
5
5
  middleware.use Actions::Middleware::Pulp3ServicesCheck
6
6
 
@@ -113,7 +113,7 @@ module Actions
113
113
  def overwrite_pulp_error(message)
114
114
  case message
115
115
  when 'This repository uses features which are incompatible with \'mirror\' sync. Please sync without mirroring enabled.'
116
- 'Please disable \'mirror on sync\' because the upstream repository refers to external resources.'
116
+ 'The "Complete Mirroring" mirroring policy is not compatible with this repository. You may want to update it to use "Content Only"'
117
117
  else
118
118
  message
119
119
  end
@@ -11,15 +11,25 @@ module Actions
11
11
  def invoke_external_task
12
12
  tasks = []
13
13
  content_view = ::Katello::ContentView.find(input[:content_view_id])
14
- content_view.repository_references.each do |repository_reference|
14
+ to_delete = content_view.repository_references.select do |repository_reference|
15
15
  repo = repository_reference.root_repository.library_instance
16
- #force pulp3 in case we've done migrations, but haven't switched over yet
17
- tasks << repo.backend_service(smart_proxy, true).delete_repository(repository_reference)
16
+ if delete_href?(repository_reference.repository_href, content_view)
17
+ #force pulp3 in case we've done migrations, but haven't switched over yet
18
+ tasks << repo.backend_service(smart_proxy, true).delete_repository(repository_reference)
19
+ true
20
+ else
21
+ false
22
+ end
18
23
  end
19
- content_view.repository_references.destroy_all
24
+ to_delete.each(&:destroy)
20
25
 
21
26
  output[:pulp_tasks] = tasks
22
27
  end
28
+
29
+ #migrated composites may have the same RepositoryReference as their component
30
+ def delete_href?(href, content_view)
31
+ ::Katello::Pulp3::RepositoryReference.where(:repository_href => href).where.not(:content_view_id => content_view.id).empty?
32
+ end
23
33
  end
24
34
  end
25
35
  end
@@ -18,8 +18,7 @@ module Actions
18
18
  content_view_version_id: input[:content_view_version_id],
19
19
  path: input[:path],
20
20
  metadata: input[:metadata],
21
- audit_comment: ::Katello::ContentViewVersionImportHistory.generate_audit_comment(path: input[:path],
22
- user: User.current,
21
+ audit_comment: ::Katello::ContentViewVersionImportHistory.generate_audit_comment(user: User.current,
23
22
  content_view_name: input[:content_view_name])
24
23
  )
25
24
  output[:import_history_id] = history.id
@@ -19,6 +19,13 @@ module Actions
19
19
  metadata: input[:metadata]
20
20
  ).create_import(input[:importer_data][:pulp_href])
21
21
  end
22
+
23
+ def rescue_strategy_for_self
24
+ # There are various reasons the importing fails, not all of them are
25
+ # fatal: when fail on import, we continue with the task ending up
26
+ # in the warning state, but not locking further imports
27
+ Dynflow::Action::Rescue::Skip
28
+ end
22
29
  end
23
30
  end
24
31
  end
@@ -15,17 +15,19 @@ module Actions
15
15
  metadata: metadata
16
16
  ).output
17
17
 
18
- import_output = plan_action(
18
+ plan_action(
19
19
  ::Actions::Pulp3::ContentViewVersion::Import,
20
20
  content_view_version_id: content_view_version.id,
21
21
  smart_proxy_id: smart_proxy.id,
22
22
  importer_data: importer_output[:importer_data],
23
23
  path: path,
24
24
  metadata: metadata
25
- ).output
26
-
27
- plan_action(Actions::Pulp3::Repository::SaveVersions, content_view_version.importable_repositories.pluck(:id),
28
- tasks: import_output[:pulp_tasks])
25
+ )
26
+ concurrence do
27
+ content_view_version.importable_repositories.each do |repo|
28
+ plan_action(Actions::Pulp3::Repository::SaveVersion, repo)
29
+ end
30
+ end
29
31
  plan_action(
30
32
  ::Actions::Pulp3::ContentViewVersion::CreateImportHistory,
31
33
  content_view_version_id: content_view_version.id,
@@ -13,7 +13,7 @@ module Actions
13
13
  target = ::Katello::Repository.find(input[:target_repository_id] || input[:target_repository])
14
14
  service = target.backend_service(smart_proxy)
15
15
  output[:pulp_tasks] = if input[:copy_all]
16
- service.copy_all(source, mirror: input[:mirror] || false)
16
+ service.copy_all(source, input)
17
17
  else
18
18
  service.copy_content_for_source(source, input)
19
19
  end
@@ -2,16 +2,9 @@ module Actions
2
2
  module Pulp3
3
3
  module Repository
4
4
  class ReclaimSpace < Pulp3::AbstractAsyncTask
5
- def plan(repositories, smart_proxy = SmartProxy.pulp_primary)
6
- repositories = [repositories] if repositories.is_a?(::Katello::Repository)
7
- if repositories.empty?
8
- fail _("No repositories selected.")
9
- end
10
- repositories = repositories.select { |repo| repo.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_DEMAND }
11
- if repositories.empty?
12
- fail _("Only On Demand repositories may have space reclaimed.")
13
- end
14
- repository_hrefs = ::Katello::Pulp3::RepositoryReference.default_cv_repository_hrefs(repositories, Organization.current)
5
+ def plan(repo, smart_proxy = SmartProxy.pulp_primary)
6
+ action_subject(repo)
7
+ repository_hrefs = ::Katello::Pulp3::RepositoryReference.default_cv_repository_hrefs([repo], Organization.current || repositories.first.organization)
15
8
  plan_self(repository_hrefs: repository_hrefs, smart_proxy_id: smart_proxy.id)
16
9
  end
17
10
 
@@ -27,6 +27,7 @@ module Actions
27
27
  []
28
28
  else
29
29
  output[:pulp_tasks] = [content_backend_service.content_api_create(relative_path: input[:options][:file_name],
30
+ repository_id: repository.id,
30
31
  artifact: artifact_href,
31
32
  content_type: content_type)]
32
33
  end
@@ -288,6 +288,17 @@ module Katello
288
288
  Katello.with_katello_agent?
289
289
  end
290
290
 
291
+ include Katello::ContentSourceHelper
292
+
293
+ apipie :method, "Generate script to change a host's content source" do
294
+ returns String
295
+ end
296
+ def change_content_source(host, ca_cert)
297
+ return missing_content_source(host) unless host.content_source
298
+
299
+ prepare_ssl_cert(ca_cert) + configure_subman(host.content_source)
300
+ end
301
+
291
302
  private
292
303
 
293
304
  def host_subscription_facet(host)
@@ -145,10 +145,10 @@ module Katello
145
145
  end
146
146
  end
147
147
 
148
- class DisconnectedMode < StandardError
148
+ class SubscriptionConnectionNotEnabled < StandardError
149
149
  def message
150
- _("You are currently operating in disconnected mode where access to Red Hat Subcription Management " \
151
- "is prohibited. If you would like to change this, please update the content setting 'Disconnected mode'.")
150
+ _("Access to Red Hat Subscription Management " \
151
+ "is prohibited. If you would like to change this, please update the content setting 'Subscription connection enabled'.")
152
152
  end
153
153
  end
154
154
 
@@ -19,9 +19,9 @@ module Katello
19
19
  class Timer
20
20
  def initialize(key = "default")
21
21
  @key = key
22
- @start_time = Time.now
23
22
  Thread.current[:timers] ||= {}
24
23
  Thread.current[:timers][key] = self
24
+ self.start
25
25
  end
26
26
 
27
27
  def start
@@ -38,6 +38,11 @@ module Katello
38
38
  Rails.logger.info "Timer #{@key} stopping at #{Time.now}: #{duration} sec"
39
39
  end
40
40
 
41
+ def log(msg = nil)
42
+ duration = (Time.now - @start_time).truncate(2)
43
+ Rails.logger.info ["Timer #{@key} running at #{Time.now}", msg, "#{duration} sec"].compact.join(': ')
44
+ end
45
+
41
46
  def self.find_by_key(key)
42
47
  if Thread.current&.[](:timers)&.[](key)
43
48
  Thread.current[:timers][key]
@@ -1,10 +1,12 @@
1
1
  module Katello
2
2
  class RepoDiscovery
3
+ include Katello::Util::HttpProxy
4
+
3
5
  attr_reader :found, :crawled, :to_follow
4
6
 
5
7
  # rubocop:disable Metrics/ParameterLists
6
8
  def initialize(url, content_type = 'yum', upstream_username = nil,
7
- upstream_password = nil, search = '*', proxy = {}, crawled = [],
9
+ upstream_password = nil, search = '*', crawled = [],
8
10
  found = [], to_follow = [])
9
11
  @uri = uri(url)
10
12
  @content_type = content_type
@@ -14,7 +16,6 @@ module Katello
14
16
  @found = found
15
17
  @crawled = crawled
16
18
  @to_follow = to_follow
17
- @proxy = proxy
18
19
  end
19
20
  # rubocop:enable Metrics/ParameterLists
20
21
 
@@ -42,42 +43,49 @@ module Katello
42
43
  private
43
44
 
44
45
  def docker_search
45
- params = {
46
- :accept => :json
46
+ request_params = {
47
+ method: :get,
48
+ headers: { accept: :json },
49
+ url: "#{@uri}v1/search?q=#{@search}"
47
50
  }
48
- params[:user] = @upstream_username unless @upstream_username.empty?
49
- params[:password] = @upstream_password unless @upstream_password.empty?
50
-
51
- RestClient.proxy = nil
52
51
 
53
- if @proxy && @proxy[:proxy_host]
54
- proxy_uri = URI(@proxy[:proxy_host])
55
- proxy_uri.user = @proxy[:proxy_user] if @proxy[:proxy_user]
56
- proxy_uri.password = @proxy[:proxy_password] if @proxy[:proxy_password]
57
- proxy_uri.port = @proxy[:proxy_port] if @proxy[:proxy_port]
58
-
59
- RestClient.proxy = proxy_uri.to_s
60
- end
52
+ request_params[:headers][:user] = @upstream_username unless @upstream_username.empty?
53
+ request_params[:headers][:password] = @upstream_password unless @upstream_password.empty?
54
+ request_params[:proxy] = proxy_uri if proxy
61
55
 
62
56
  begin
63
- results = RestClient.get(@uri.to_s + "v1/search?q=#{@search}", params)
57
+ results = RestClient::Request.execute(request_params)
64
58
  JSON.parse(results)['results'].each do |result|
65
59
  @found << result['name']
66
60
  end
67
61
  rescue
68
62
  # Note: v2 endpoint does not support search
69
- results = RestClient.get(@uri.to_s + "v2/_catalog", params)
63
+ request_params[:url] = "#{@uri}v2/_catalog"
64
+ results = RestClient::Request.execute(request_params)
70
65
  @found = JSON.parse(results)['repositories']
71
66
  end
72
67
  @found.sort!
73
68
  end
74
69
 
70
+ def anemone_proxy_details
71
+ details = {}
72
+
73
+ if proxy
74
+ details[:proxy_host] = proxy_host
75
+ details[:proxy_port] = proxy_port
76
+ details[:proxy_user] = proxy.username
77
+ details[:proxy_password] = proxy.password
78
+ end
79
+
80
+ details
81
+ end
82
+
75
83
  def http_crawl(resume_point)
76
84
  resume_point_uri = URI(resume_point)
77
85
  resume_point_uri.user = @upstream_username if @upstream_username
78
86
  resume_point_uri.password = @upstream_password if @upstream_password
79
87
 
80
- Anemone.crawl(resume_point_uri, @proxy) do |anemone|
88
+ Anemone.crawl(resume_point_uri, anemone_proxy_details) do |anemone|
81
89
  anemone.focus_crawl do |page|
82
90
  @crawled << page.url.path
83
91
 
@@ -4,6 +4,8 @@ module Katello
4
4
  class KatelloCdn < CdnResource
5
5
  def initialize(url, options)
6
6
  @organization_label = options.delete(:organization_label)
7
+ @content_view_label = options.delete(:content_view_label)
8
+ @lifecycle_environment_label = options.delete(:lifecycle_environment_label)
7
9
  fail ArgumentError, "No upstream organization was specified" if @organization_label.nil?
8
10
 
9
11
  super
@@ -38,14 +40,50 @@ module Katello
38
40
  get("/katello/api/v2/organizations/#{organization['id']}/download_debug_certificate")
39
41
  end
40
42
 
43
+ def content_view_id
44
+ rs = get("/katello/api/v2/organizations/#{organization['id']}/content_views?name=#{CGI.escape(@content_view_label)}")
45
+ content_view = JSON.parse(rs)['results']&.first
46
+ if content_view.blank?
47
+ fail _("Upstream organization %{org_label} does not have a content view with the label %{cv_label}") % { org_label: @organization_label,
48
+ cv_label: @content_view_label }
49
+ end
50
+ content_view["id"]
51
+ end
52
+
53
+ def lifecycle_environment_id
54
+ rs = get("/katello/api/v2/organizations/#{organization['id']}/environments")
55
+ env = JSON.parse(rs)['results'].find { |lce| lce['label'] == @lifecycle_environment_label }
56
+
57
+ if env.blank?
58
+ fail _("Upstream organization %{org_label} does not have a lifecycle environment with the label %{lce_label}") % { org_label: @organization_label,
59
+ lce_label: @lifecycle_environment_label }
60
+ end
61
+ env["id"]
62
+ end
63
+
41
64
  def repository_url(content_label:)
42
- response = get("/katello/api/v2/organizations/#{organization['id']}/repositories?search=#{CGI.escape("content_label = #{content_label}")}")
65
+ params = {
66
+ search: CGI.escape("content_label = #{content_label}")
67
+ }
68
+
69
+ params[:content_view_id] = content_view_id if @content_view_label
70
+ params[:environment_id] = lifecycle_environment_id if @lifecycle_environment_label
71
+
72
+ query_params = params.map { |key, value| "#{key}=#{value}" }
73
+ url = "/katello/api/v2/organizations/#{organization['id']}/repositories?#{query_params.join('&')}"
74
+ response = get(url)
43
75
  repository = JSON.parse(response)['results'].first
44
76
 
45
77
  if repository.nil?
46
- fail _("Repository with content label %{content_label} was not found in upstream organization %{org_label}") % { content_label: content_label, org_label: @organization_label }
47
- end
78
+ msg_params = { content_label: content_label,
79
+ org_label: @organization_label,
80
+ cv_label: @content_view_label || Katello::OrganizationCreator::DEFAULT_CONTENT_VIEW_LABEL,
81
+ env_label: @lifecycle_environment_label || Katello::OrganizationCreator::DEFAULT_LIFECYCLE_ENV_LABEL
82
+ }
48
83
 
84
+ fail _("Repository with content label %{content_label} was not found in upstream organization %{org_label},"\
85
+ " content view %{cv_label} and lifecycle environment %{env_label} ") % msg_params
86
+ end
49
87
  repository['full_path']
50
88
  end
51
89
 
@@ -58,7 +58,7 @@ module Katello
58
58
 
59
59
  def self.create(product: nil, cdn_configuration:)
60
60
  options = {}
61
- if cdn_configuration.redhat?
61
+ if cdn_configuration.redhat_cdn?
62
62
  options[:ssl_client_cert] = OpenSSL::X509::Certificate.new(product.certificate)
63
63
  options[:ssl_client_key] = OpenSSL::PKey::RSA.new(product.key)
64
64
  options[:ssl_ca_file] = self.ca_file
@@ -67,6 +67,8 @@ module Katello
67
67
  options[:username] = cdn_configuration.username
68
68
  options[:password] = cdn_configuration.password
69
69
  options[:organization_label] = cdn_configuration.upstream_organization_label
70
+ options[:content_view_label] = cdn_configuration.upstream_content_view_label
71
+ options[:lifecycle_environment_label] = cdn_configuration.upstream_lifecycle_environment_label
70
72
  options[:ssl_ca_cert] = cdn_configuration.ssl_ca
71
73
  CDN::KatelloCdn.new(cdn_configuration.url, options)
72
74
  end
@@ -184,7 +186,7 @@ module Katello
184
186
  def net_http_class
185
187
  if proxy
186
188
  uri = URI(proxy.url) #Net::HTTP::Proxy ignores port as part of the url
187
- Net::HTTP::Proxy("#{uri.host}#{uri.path}", uri.port, proxy.username, proxy.password)
189
+ Net::HTTP::Proxy("#{uri.host}", uri.port, proxy.username, proxy.password)
188
190
  else
189
191
  Net::HTTP
190
192
  end
@@ -0,0 +1,105 @@
1
+ module Katello
2
+ module Util
3
+ class DeduplicationMigrator # used in db/migrate/20211201154845_add_unique_indexes.rb
4
+ include ActionView::Helpers::TextHelper
5
+
6
+ def models_to_clean
7
+ [
8
+ {
9
+ :model => ::Katello::CapsuleLifecycleEnvironment,
10
+ :fields => [:lifecycle_environment_id, :capsule_id]
11
+ },
12
+ {
13
+ :model => ::Katello::ContentViewErratumFilterRule,
14
+ :fields => [:errata_id, :content_view_filter_id]
15
+ },
16
+ {
17
+ :model => ::Katello::ContentViewModuleStreamFilterRule,
18
+ :fields => [:module_stream_id, :content_view_filter_id]
19
+ },
20
+ {
21
+ :model => ::Katello::ContentViewPackageGroupFilterRule,
22
+ :fields => [:uuid, :content_view_filter_id]
23
+ },
24
+ {
25
+ :model =>
26
+ ::Katello::ContentViewRepository,
27
+ :fields => [:content_view_id, :repository_id]
28
+ }
29
+ ]
30
+ end
31
+
32
+ def models_to_rename
33
+ [
34
+ {
35
+ :model => ::Katello::ContentView,
36
+ :fields => [:name, :organization_id]
37
+ }
38
+ ]
39
+ end
40
+
41
+ # example ---- (IDs 1/7 and 6/8 are duplicates ) ::Katello::CapsuleLifecycleEnvironment.all
42
+ # => [#<Katello::CapsuleLifecycleEnvironment:0x0000000017e11060 id: 1, capsule_id: 1, lifecycle_environment_id: 1>,
43
+ # #<Katello::CapsuleLifecycleEnvironment:0x0000000017e10f98 id: 2, capsule_id: 1, lifecycle_environment_id: 2>,
44
+ # #<Katello::CapsuleLifecycleEnvironment:0x0000000017e10ed0 id: 3, capsule_id: 1, lifecycle_environment_id: 3>,
45
+ # ...
46
+ # #<Katello::CapsuleLifecycleEnvironment:0x0000000017e10c78 id: 6, capsule_id: 1, lifecycle_environment_id: 6>,
47
+ # #<Katello::CapsuleLifecycleEnvironment:0x0000000017e10bb0 id: 7, capsule_id: 1, lifecycle_environment_id: 1>,
48
+ # #<Katello::CapsuleLifecycleEnvironment:0x0000000017e10ac0 id: 8, capsule_id: 1, lifecycle_environment_id: 6>]
49
+ def execute!
50
+ models_to_clean.each do |model_to_clean|
51
+ rows_deleted = 0
52
+ model = model_to_clean[:model]
53
+ cleaning_queries(model_to_clean).each { |query| rows_deleted += clean_duplicates(query, model) }
54
+ if rows_deleted > 0
55
+ Rails.logger.info("Deleted #{pluralize(rows_deleted, 'duplicate table row')} from #{model.table_name}")
56
+ end
57
+ end
58
+ Rails.logger.info("Finished cleaning duplicate table rows")
59
+
60
+ models_to_rename.each do |model_to_rename|
61
+ rows_renamed = 0
62
+ model = model_to_rename[:model]
63
+ cleaning_queries(model_to_rename).each { |query| rows_renamed += rename_duplicates(query, model) }
64
+ if rows_renamed > 0
65
+ Rails.logger.info("Renamed #{pluralize(rows_renamed, 'duplicate table row')} from #{model.table_name}")
66
+ end
67
+ end
68
+ Rails.logger.info("Finished renaming duplicate table rows")
69
+ end
70
+
71
+ def cleaning_queries(model_to_clean)
72
+ model = model_to_clean[:model]
73
+ fields = model_to_clean[:fields]
74
+ dup_query = model.group(fields).having("count(*) > 1")
75
+ duplicate_entries = dup_query.count.try(:keys) # [[1, 1], [6, 1]] - the set of duplicate combinations
76
+ return [] if duplicate_entries.blank?
77
+ min_ids = dup_query.pluck('min(id)') # [1, 6] - the ids of the duplicate entries with the lowest id, in the same order as duplicate_entries
78
+ duplicate_entries.map.with_index do |entry, idx|
79
+ # [{:lifecycle_environment_id=>1, :capsule_id=>1, :min_id=>1},
80
+ # {:lifecycle_environment_id=>6, :capsule_id=>1, :min_id=>6}]
81
+ Hash[fields.zip(entry)].merge({ min_id: min_ids[idx] })
82
+ end
83
+ end
84
+
85
+ def clean_duplicates(query, model)
86
+ min_id = query.delete(:min_id)
87
+ model.where(query).where.not(id: min_id).delete_all # returns quantity deleted
88
+ end
89
+
90
+ def rename_duplicates(query, model)
91
+ min_id = query.delete(:min_id)
92
+ counter = 0
93
+ model.where(query).where.not(id: min_id).each do |duplicate|
94
+ counter += 1
95
+ old_name = duplicate.name
96
+ new_name = "#{duplicate.name}_#{duplicate.id}"
97
+ duplicate.name = new_name
98
+ duplicate.save(validate: false) # skip validation since migrations should never fail
99
+ Rails.logger.info("Content view #{old_name} (id #{duplicate.id}) renamed to #{new_name}")
100
+ end
101
+ counter
102
+ end
103
+ end
104
+ end
105
+ end