katello 4.3.0 → 4.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (337) 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 +3 -0
  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_controller.rb +17 -7
  11. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  12. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  13. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  14. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  15. data/app/helpers/katello/content_source_helper.rb +43 -0
  16. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  17. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  18. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  19. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  20. data/app/lib/actions/katello/repository/discover.rb +1 -14
  21. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  22. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  23. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  24. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  25. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  26. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  27. data/app/lib/katello/errors.rb +3 -3
  28. data/app/lib/katello/logging.rb +6 -1
  29. data/app/lib/katello/repo_discovery.rb +27 -19
  30. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  31. data/app/lib/katello/resources/cdn.rb +4 -2
  32. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  33. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  34. data/app/models/katello/cdn_configuration.rb +38 -6
  35. data/app/models/katello/concerns/host_managed_extensions.rb +23 -1
  36. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  37. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  38. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  39. data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
  40. data/app/models/katello/content_view.rb +4 -4
  41. data/app/models/katello/content_view_filter.rb +1 -1
  42. data/app/models/katello/content_view_history.rb +1 -1
  43. data/app/models/katello/content_view_version.rb +6 -2
  44. data/app/models/katello/content_view_version_export_history.rb +1 -1
  45. data/app/models/katello/deb.rb +1 -3
  46. data/app/models/katello/docker_meta_tag.rb +1 -1
  47. data/app/models/katello/erratum.rb +0 -15
  48. data/app/models/katello/glue/pulp/repos.rb +1 -1
  49. data/app/models/katello/host/content_facet.rb +2 -27
  50. data/app/models/katello/host/info_provider.rb +9 -0
  51. data/app/models/katello/host/subscription_facet.rb +2 -2
  52. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  53. data/app/models/katello/product.rb +1 -1
  54. data/app/models/katello/product_content.rb +2 -2
  55. data/app/models/katello/repository.rb +10 -9
  56. data/app/models/katello/root_repository.rb +24 -13
  57. data/app/models/katello/rpm.rb +8 -2
  58. data/app/models/setting/content.rb +6 -3
  59. data/app/services/cert/rhsm_client.rb +1 -5
  60. data/app/services/katello/content_unit_indexer.rb +166 -0
  61. data/app/services/katello/organization_creator.rb +12 -4
  62. data/app/services/katello/pulp/repository/docker.rb +1 -1
  63. data/app/services/katello/pulp/repository/yum.rb +0 -54
  64. data/app/services/katello/pulp/repository.rb +0 -6
  65. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  66. data/app/services/katello/pulp3/api/apt.rb +7 -0
  67. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  68. data/app/services/katello/pulp3/deb.rb +10 -9
  69. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  70. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  71. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  72. data/app/services/katello/pulp3/erratum.rb +51 -56
  73. data/app/services/katello/pulp3/file_unit.rb +9 -6
  74. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  75. data/app/services/katello/pulp3/module_stream.rb +76 -30
  76. data/app/services/katello/pulp3/package_group.rb +5 -5
  77. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  78. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  79. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  80. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  81. data/app/services/katello/pulp3/repository/yum.rb +10 -12
  82. data/app/services/katello/pulp3/repository.rb +26 -7
  83. data/app/services/katello/pulp3/repository_mirror.rb +18 -5
  84. data/app/services/katello/pulp3/rpm.rb +13 -13
  85. data/app/services/katello/pulp3/srpm.rb +10 -9
  86. data/app/services/katello/repository_type.rb +15 -4
  87. data/app/services/katello/repository_type_manager.rb +1 -1
  88. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  89. data/app/services/katello/upstream_connection_checker.rb +2 -2
  90. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  91. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  92. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  93. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  94. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  95. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  96. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -0
  97. data/app/views/katello/layouts/react.html.erb +0 -1
  98. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  99. data/config/initializers/monkeys.rb +0 -1
  100. data/config/routes/api/v2.rb +1 -0
  101. data/config/routes/overrides.rb +3 -0
  102. data/config/routes.rb +2 -0
  103. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  104. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  105. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  106. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  107. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  108. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  109. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  110. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  111. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  112. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  113. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  114. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  115. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  116. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +20 -8
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +34 -30
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +16 -2
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +35 -15
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  132. data/lib/katello/engine.rb +4 -0
  133. data/lib/katello/permission_creator.rb +1 -1
  134. data/lib/katello/permissions/host_permissions.rb +3 -1
  135. data/lib/katello/plugin.rb +4 -1
  136. data/lib/katello/repository_types/deb.rb +0 -1
  137. data/lib/katello/repository_types/docker.rb +4 -4
  138. data/lib/katello/repository_types/file.rb +0 -1
  139. data/lib/katello/repository_types/ostree.rb +4 -0
  140. data/lib/katello/repository_types/python.rb +5 -1
  141. data/lib/katello/repository_types/yum.rb +2 -9
  142. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  143. data/lib/katello/tasks/import_applicability.rake +1 -1
  144. data/lib/katello/tasks/jenkins.rake +0 -2
  145. data/lib/katello/tasks/repository.rake +4 -1
  146. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  147. data/lib/katello/version.rb +1 -1
  148. data/locale/action_names.rb +8 -7
  149. data/locale/bn/katello.po +1402 -650
  150. data/locale/cs/katello.po +1217 -96
  151. data/locale/de/katello.po +2359 -1347
  152. data/locale/en/katello.po +1216 -94
  153. data/locale/es/katello.po +2201 -1172
  154. data/locale/fr/katello.po +2601 -1615
  155. data/locale/gu/katello.po +1564 -814
  156. data/locale/hi/katello.po +1563 -810
  157. data/locale/it/katello.po +1311 -282
  158. data/locale/ja/katello.po +2534 -1518
  159. data/locale/katello.pot +3430 -1326
  160. data/locale/kn/katello.po +1564 -812
  161. data/locale/ko/katello.po +1441 -409
  162. data/locale/mr/katello.po +1564 -776
  163. data/locale/or/katello.po +1565 -813
  164. data/locale/pa/katello.po +1559 -792
  165. data/locale/pt/katello.po +1314 -277
  166. data/locale/pt_BR/katello.po +2226 -1181
  167. data/locale/ru/katello.po +1587 -563
  168. data/locale/ta/katello.po +1373 -619
  169. data/locale/te/katello.po +1564 -810
  170. data/locale/zh_CN/katello.po +2936 -1890
  171. data/locale/zh_TW/katello.po +1508 -606
  172. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  173. data/webpack/components/ActionableDetail.js +35 -21
  174. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  175. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  176. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  177. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  178. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  179. data/webpack/components/EditableSwitch.js +8 -2
  180. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  181. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  182. data/webpack/components/Errata/index.js +19 -11
  183. data/webpack/components/Packages/index.js +1 -1
  184. data/webpack/components/Search/Search.js +5 -2
  185. data/webpack/components/Search/__tests__/search.test.js +2 -3
  186. data/webpack/components/SelectOrg/SetOrganization.js +1 -1
  187. data/webpack/components/Table/PageControls.js +3 -6
  188. data/webpack/components/Table/TableHooks.js +46 -7
  189. data/webpack/components/Table/TableWrapper.js +14 -3
  190. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  191. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  192. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  193. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  194. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +3 -4
  195. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  196. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +18 -2
  197. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +12 -0
  198. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +1 -1
  199. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +30 -21
  200. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.scss → ErrataTab/ErrataTab.scss} +0 -0
  201. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +0 -0
  202. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  203. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  204. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  205. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  206. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  207. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  208. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +125 -8
  209. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +27 -4
  210. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +2 -1
  211. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +6 -3
  212. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  213. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  214. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  215. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  216. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  217. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +8 -5
  218. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.scss → TracesTab/TracesTab.scss} +0 -0
  219. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  220. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  221. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  222. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +58 -7
  223. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  224. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +4 -4
  225. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  226. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +12 -5
  227. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  228. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  229. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  230. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  231. data/webpack/components/pf3Table/components/Table.js +2 -3
  232. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  233. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  234. data/webpack/containers/Application/config.js +5 -0
  235. data/webpack/global_index.js +1 -1
  236. data/webpack/global_test_setup.js +1 -1
  237. data/webpack/index.js +7 -0
  238. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  239. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  240. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  241. data/webpack/scenes/Content/ContentConfig.js +55 -5
  242. data/webpack/scenes/Content/ContentPage.js +1 -1
  243. data/webpack/scenes/Content/Details/ContentDetails.js +1 -1
  244. data/webpack/scenes/Content/Details/ContentInfo.js +1 -1
  245. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  246. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  247. data/webpack/scenes/Content/Table/ContentTable.js +1 -1
  248. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  249. data/webpack/scenes/ContentViews/ContentViewsConstants.js +2 -1
  250. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  251. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  252. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +21 -27
  253. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  254. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +8 -3
  255. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +11 -16
  256. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  257. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +14 -8
  258. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  260. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  261. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  262. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  263. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  264. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  265. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +23 -2
  268. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  269. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +16 -17
  270. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  271. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  272. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +30 -34
  273. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  274. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +13 -15
  275. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +1 -1
  276. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +4 -4
  277. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  278. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  279. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +2 -2
  280. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  281. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  282. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  283. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  284. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  285. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  286. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  287. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  288. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  289. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  290. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  291. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  292. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  293. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  294. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  295. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  296. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  297. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  298. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  299. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  300. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  301. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  302. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  303. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  304. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  305. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  306. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  307. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  308. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +6 -1
  309. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  310. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  311. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  312. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  313. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  314. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  315. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  316. data/webpack/services/api/testHelpers.js +5 -3
  317. data/webpack/utils/helpers.js +6 -3
  318. metadata +81 -58
  319. data/app/services/katello/pulp/deb.rb +0 -55
  320. data/app/services/katello/pulp/distribution.rb +0 -7
  321. data/app/services/katello/pulp/docker_blob.rb +0 -7
  322. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  323. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  324. data/app/services/katello/pulp/docker_tag.rb +0 -14
  325. data/app/services/katello/pulp/erratum.rb +0 -129
  326. data/app/services/katello/pulp/file_unit.rb +0 -21
  327. data/app/services/katello/pulp/module_stream.rb +0 -39
  328. data/app/services/katello/pulp/package_category.rb +0 -7
  329. data/app/services/katello/pulp/package_group.rb +0 -20
  330. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  331. data/app/services/katello/pulp/rpm.rb +0 -57
  332. data/app/services/katello/pulp/srpm.rb +0 -29
  333. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  334. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  335. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  336. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  337. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -14,15 +14,24 @@ module Katello
14
14
  repo_content_list.map { |content| content.try(:pulp_href) }
15
15
  end
16
16
 
17
- def update_model(model)
18
- custom_json = {}
19
- taggable = ::Katello::DockerManifest.find_by(:pulp_id => backend_data['tagged_manifest'])
17
+ def self.generate_model_row(unit)
18
+ row = {
19
+ pulp_id: unit[unit_identifier],
20
+ name: unit['name']
21
+ }
22
+
23
+ taggable = ::Katello::DockerManifest.find_by(:pulp_id => unit['tagged_manifest'])
24
+ taggable_type = ::Katello::DockerManifest.name
20
25
  if taggable.nil?
21
- taggable = ::Katello::DockerManifestList.find_by(:pulp_id => backend_data['tagged_manifest'])
26
+ taggable = ::Katello::DockerManifestList.find_by(:pulp_id => unit['tagged_manifest'])
27
+ taggable_type = ::Katello::DockerManifestList.name
28
+ end
29
+
30
+ if taggable
31
+ row[:docker_taggable_id] = taggable.id
32
+ row[:docker_taggable_type] = taggable_type
22
33
  end
23
- custom_json['docker_taggable'] = taggable
24
- custom_json['name'] = backend_data['name']
25
- model.update!(custom_json)
34
+ row
26
35
  end
27
36
  end
28
37
  end
@@ -25,13 +25,13 @@ module Katello
25
25
  repo_content_list.map { |content| content.try(:pulp_href) }
26
26
  end
27
27
 
28
- # rubocop:disable Metrics/AbcSize
29
- def update_model(model)
30
- updated = false
28
+ def self.generate_model_row(unit)
31
29
  keys = %w(title id severity issued_date type description reboot_suggested solution updated_date summary)
32
- custom_json = backend_data.slice(*keys)
30
+ custom_json = unit.slice(*keys)
31
+ custom_json['pulp_id'] = custom_json['id']
33
32
  custom_json["issued"] = custom_json.delete("issued_date")
34
33
  custom_json["updated"] = custom_json.delete("updated_date")
34
+ custom_json['title'] = custom_json['title']&.truncate(255)
35
35
 
36
36
  # handle SUSE epoch dates
37
37
  custom_json["issued"] = convert_date_if_epoch(custom_json["issued"])
@@ -41,86 +41,81 @@ module Katello
41
41
  custom_json['errata_type'] = custom_json.delete('type')
42
42
  custom_json['issued'] = custom_json['issued'].to_datetime.strftime('%Y-%m-%d').to_datetime
43
43
  custom_json['updated'] = custom_json['updated'].blank? ? custom_json['issued'] : custom_json['updated'].to_datetime.strftime('%Y-%m-%d').to_datetime
44
+ custom_json
45
+ end
44
46
 
45
- if model.updated.blank? ||
46
- model.attributes.excluding(model.attributes.keys - custom_json.keys) != custom_json
47
- model.update!(custom_json)
48
- updated = true
49
-
50
- unless backend_data['references'].blank?
51
- update_bugzillas(model, backend_data['references'])
52
- update_cves(model, backend_data['references'])
53
- end
47
+ def self.insert_child_associations(units, pulp_id_to_id)
48
+ bugzillas = []
49
+ cves = []
50
+ packages = []
51
+ modules = []
52
+
53
+ units.each do |unit|
54
+ katello_id = pulp_id_to_id[unit['id']]
55
+ bugzillas += build_bugzillas(katello_id, unit['references'])
56
+ cves += build_cves(katello_id, unit['references'])
57
+ packages += build_packages(katello_id, unit['pkglist'])
58
+ modules += build_modules(katello_id, unit['pkglist'])
54
59
  end
55
- update_packages(model, backend_data['pkglist']) unless backend_data['pkglist'].blank?
56
- update_modules(model, backend_data['pkglist']) unless backend_data['pkglist'].blank?
57
60
 
58
- return model.id if updated
61
+ Katello::ErratumBugzilla.insert_all(bugzillas, unique_by: [:erratum_id, :bug_id, :href]) if bugzillas.any?
62
+ Katello::ErratumCve.insert_all(cves, unique_by: [:erratum_id, :cve_id, :href]) if cves.any?
63
+ Katello::ErratumPackage.insert_all(packages, unique_by: [:erratum_id, :nvrea, :name, :filename]) if packages.any?
64
+ ModuleStreamErratumPackage.insert_all(modules, unique_by: [:module_stream_id, :erratum_package_id]) if modules.any?
65
+ nil
59
66
  end
60
- # rubocop:enable Metrics/AbcSize
61
67
 
62
- def update_bugzillas(model, ref_list)
63
- ref_list.select { |r| r[:type] == "bugzilla" }.each do |bugzilla|
64
- Katello::Util::Support.active_record_retry do
65
- model.bugzillas.where(bug_id: bugzilla[:id]).first_or_create!(bug_id: bugzilla[:id], href: bugzilla[:href], erratum_id: model.id)
66
- end
68
+ def self.build_bugzillas(katello_id, ref_list)
69
+ ref_list.select { |r| r[:type] == "bugzilla" }.map do |bugzilla|
70
+ {
71
+ bug_id: bugzilla[:id],
72
+ href: bugzilla[:href],
73
+ erratum_id: katello_id
74
+ }
67
75
  end
68
76
  end
69
77
 
70
- def update_cves(model, ref_list)
71
- ref_list.select { |r| r[:type] == "cve" }.each do |cve|
72
- Katello::Util::Support.active_record_retry do
73
- model.cves.where(cve_id: cve[:id]).first_or_create!(cve_id: cve[:id], href: cve[:href], erratum_id: model.id)
74
- end
78
+ def self.build_cves(katello_id, ref_list)
79
+ ref_list.select { |r| r[:type] == "cve" }.map do |cve|
80
+ {
81
+ cve_id: cve[:id],
82
+ href: cve[:href],
83
+ erratum_id: katello_id
84
+ }
75
85
  end
76
86
  end
77
87
 
78
- def update_packages(model, package_list)
79
- package_list.each do |json|
88
+ def self.build_packages(katello_id, pkg_list)
89
+ list = pkg_list.map do |json|
80
90
  package_hashes = json[:packages]
81
- package_attributes = package_hashes.map do |hash|
91
+ package_hashes.map do |hash|
82
92
  nvrea = Util::Package.build_nvra(hash)
83
- {'name' => hash[:name], 'nvrea' => nvrea, 'filename' => hash[:filename]}
84
- end
85
- existing_nvreas = model.packages.pluck(:nvrea)
86
- package_attributes.delete_if { |pkg| existing_nvreas.include?(pkg['nvrea']) }
87
- package_attributes.uniq.each do |package|
88
- Katello::Util::Support.active_record_retry do
89
- model.packages.where(filename: package["filename"]).first_or_create!(package)
90
- end
93
+ {'name' => hash[:name], 'nvrea' => nvrea, 'filename' => hash[:filename], :erratum_id => katello_id}
91
94
  end
92
95
  end
96
+ list.flatten
93
97
  end
94
98
 
95
- def update_modules(model, module_stream_list)
99
+ def self.build_modules(katello_id, module_stream_list)
96
100
  module_stream_attributes = []
97
101
  module_stream_list.each do |package_item|
98
102
  if package_item[:module]
99
103
  module_stream = ::Katello::ModuleStream.where(package_item[:module]).first
100
104
  next if module_stream.blank?
101
105
  nvreas = package_item[:packages].map { |hash| Util::Package.build_nvra(hash) }
102
- module_stream_id_column = "#{ModuleStreamErratumPackage.table_name}.module_stream_id"
103
- existing = ErratumPackage.joins(:module_streams).
104
- where(module_stream_id_column => module_stream.id,
105
- :nvrea => nvreas).pluck(:nvrea)
106
-
107
- (nvreas - existing).each do |nvrea|
108
- package = model.packages.find_by(:nvrea => nvrea)
109
- module_stream_attributes << { :module_stream_id => module_stream.id,
110
- :erratum_package_id => package.id }
111
- end
112
- end
113
- end
114
- module_stream_attributes.uniq.each do |module_stream|
115
- Katello::Util::Support.active_record_retry do
116
- if model.module_streams.empty? || !model.module_streams.pluck(:module_stream_id).include?(module_stream[:module_stream_id])
117
- ModuleStreamErratumPackage.create!(module_stream)
106
+ package_ids = Katello::ErratumPackage.where(:erratum_id => katello_id, :nvrea => nvreas).pluck(:id)
107
+
108
+ module_stream_attributes += package_ids.map do |pkg_id|
109
+ { :module_stream_id => module_stream.id,
110
+ :erratum_package_id => pkg_id }
118
111
  end
112
+
119
113
  end
120
114
  end
115
+ module_stream_attributes.uniq
121
116
  end
122
117
 
123
- def convert_date_if_epoch(date)
118
+ def self.convert_date_if_epoch(date)
124
119
  date.to_i.to_s == date ? epoch_to_date(date) : date
125
120
  end
126
121
 
@@ -19,12 +19,15 @@ module Katello
19
19
  repo_content_list.map { |content| content.try(:pulp_href) }
20
20
  end
21
21
 
22
- def update_model(model)
23
- custom_json = {}
24
- custom_json['checksum'] = backend_data['sha256']
25
- custom_json['path'] = backend_data['relative_path']
26
- custom_json['name'] = File.basename(backend_data['relative_path'].try(:split, '/').try(:[], -1))
27
- model.update!(custom_json)
22
+ def self.generate_model_row(unit)
23
+ filename = File.basename(unit['relative_path'].try(:split, '/').try(:[], -1))
24
+
25
+ {
26
+ pulp_id: unit[unit_identifier],
27
+ name: filename,
28
+ path: unit['relative_path'],
29
+ checksum: unit['sha256']
30
+ }
28
31
  end
29
32
  end
30
33
  end
@@ -13,20 +13,19 @@ module Katello
13
13
  end
14
14
 
15
15
  def self.content_api(repository_type, content_type)
16
- repository_type.content_types.find { |type| type.content_type == content_type }.pulp3_api.new(repository_type.pulp3_api_class.new(SmartProxy.pulp_primary!, repository_type).api_client)
16
+ label = content_type.is_a?(String) ? content_type : content_type.label
17
+ repository_type.content_types.find { |type| type.content_type == label }.pulp3_api.new(repository_type.pulp3_api_class.new(SmartProxy.pulp_primary!, repository_type).api_client)
17
18
  end
18
19
 
19
- def update_model(model, content_type)
20
- content_type = ::Katello::RepositoryTypeManager.find_content_type(content_type)
21
-
22
- custom_json = {}
23
- custom_json['pulp_id'] = backend_data['pulp_href']
24
- custom_json['name'] = content_type&.model_name&.call(backend_data)
25
- custom_json['version'] = content_type&.model_version&.call(backend_data)
26
- custom_json['filename'] = content_type&.model_filename&.call(backend_data)
27
- custom_json['additional_metadata'] = content_type&.model_additional_metadata&.call(backend_data)
28
- custom_json['content_type'] = content_type&.label
29
- model.update!(custom_json)
20
+ def self.generate_model_row(unit, content_type)
21
+ {
22
+ pulp_id: unit['pulp_href'],
23
+ name: content_type&.model_name&.call(unit),
24
+ version: content_type&.model_version&.call(unit),
25
+ filename: content_type&.model_filename&.call(unit),
26
+ additional_metadata: content_type&.model_additional_metadata&.call(unit),
27
+ content_type: content_type&.label
28
+ }
30
29
  end
31
30
  end
32
31
  end
@@ -13,44 +13,90 @@ module Katello
13
13
  repo_content_list.map { |content| content.try(:pulp_href) }
14
14
  end
15
15
 
16
- def create_stream_rpms(model, packages)
17
- packages_found = Katello::Rpm.where(:pulp_id => packages)
18
- existing_rpms = model.rpms
19
- new_packages = packages_found - existing_rpms
20
- packages_to_delete = existing_rpms - packages_found
21
- model.rpms.delete(packages_to_delete)
22
- model.rpms << new_packages
23
- end
24
-
25
- def create_stream_artifacts(model, artifacts_json)
26
- artifacts_json.each do |name|
27
- Katello::Util::Support.active_record_retry do
28
- model.artifacts.where(name: name).first_or_create!
29
- end
16
+ def self.build_stream_rpms(katello_id, package_hrefs)
17
+ package_ids = Katello::Rpm.where(:pulp_id => package_hrefs).pluck(:id)
18
+ rpms = package_ids.map do |package_id|
19
+ {
20
+ module_stream_id: katello_id,
21
+ rpm_id: package_id
22
+ }
30
23
  end
24
+ add_timestamps(rpms)
31
25
  end
32
26
 
33
- def create_profiles(model, profiles_json)
34
- profiles_json.each do |profile, rpms|
35
- Katello::Util::Support.active_record_retry do
36
- profile = model.profiles.where(name: profile).first_or_create!
37
- end
38
- rpms.each do |rpm|
39
- Katello::Util::Support.active_record_retry do
40
- profile.rpms.where(name: rpm).first_or_create!
41
- end
27
+ def self.build_artifacts(katello_id, artifacts_json)
28
+ return [] if artifacts_json.nil?
29
+ artifacts = artifacts_json.map do |name|
30
+ {name: name,
31
+ module_stream_id: katello_id}
32
+ end
33
+ add_timestamps(artifacts)
34
+ end
35
+
36
+ def self.build_profiles(katello_id, profiles_json)
37
+ return [] if profiles_json.nil?
38
+ profiles = profiles_json.map do |profile, _rpms|
39
+ {
40
+ module_stream_id: katello_id,
41
+ name: profile
42
+ }
43
+ end
44
+ add_timestamps(profiles)
45
+ end
46
+
47
+ def self.build_profile_rpms(katello_id, profiles_json)
48
+ return [] if profiles_json.nil?
49
+ profile_rpms = profiles_json.map do |profile, rpms|
50
+ profile_id = Katello::ModuleProfile.find_by(module_stream_id: katello_id, name: profile).id
51
+ rpms.map do |rpm|
52
+ {
53
+ module_profile_id: profile_id,
54
+ name: rpm
55
+ }
42
56
  end
43
57
  end
58
+ add_timestamps(profile_rpms.flatten)
44
59
  end
45
60
 
46
- def update_model(model)
47
- shared_attributes = backend_data.keys & model.class.column_names
48
- shared_json = backend_data.select { |key, _v| shared_attributes.include?(key) }
49
- model.update!(shared_json)
61
+ def self.generate_model_row(unit)
62
+ shared_attributes = unit.keys & Katello::ModuleStream.column_names
63
+ to_return = unit.select { |key, _v| shared_attributes.include?(key) }
64
+ to_return['pulp_id'] = unit['pulp_href']
65
+ to_return[:created_at] = DateTime.now
66
+ to_return[:updated_at] = DateTime.now
67
+ to_return
68
+ end
69
+
70
+ def self.add_timestamps(rows)
71
+ rows.each do |row|
72
+ row[:created_at] = DateTime.now
73
+ row[:updated_at] = DateTime.now
74
+ end
75
+ rows
76
+ end
50
77
 
51
- create_stream_artifacts(model, backend_data['artifacts']) if backend_data.key?('artifacts')
52
- create_profiles(model, backend_data['profiles']) if backend_data.key?('profiles')
53
- create_stream_rpms(model, backend_data['packages']) if backend_data.key?('packages')
78
+ def self.insert_child_associations(units, pulp_id_to_id)
79
+ artifacts = []
80
+ profiles = []
81
+ stream_rpms = []
82
+ units.each do |unit|
83
+ katello_id = pulp_id_to_id[unit[unit_identifier]]
84
+ artifacts += build_artifacts(katello_id, unit['artifacts'])
85
+ profiles += build_profiles(katello_id, unit['profiles'])
86
+ stream_rpms += build_stream_rpms(katello_id, unit['packages'])
87
+ end
88
+
89
+ Katello::ModuleStreamArtifact.insert_all(artifacts, unique_by: [:module_stream_id, :name]) if artifacts.any?
90
+ Katello::ModuleProfile.insert_all(profiles, unique_by: [:module_stream_id, :name]) if profiles.any?
91
+ Katello::ModuleStreamRpm.insert_all(stream_rpms, unique_by: [:module_stream_id, :rpm_id]) if stream_rpms.any?
92
+
93
+ #have to import profile_rpms after profiles
94
+ profile_rpms = []
95
+ units.each do |unit|
96
+ katello_id = pulp_id_to_id[unit[unit_identifier]]
97
+ profile_rpms += build_profile_rpms(katello_id, unit['profiles'])
98
+ end
99
+ Katello::ModuleProfileRpm.insert_all(profile_rpms, unique_by: [:module_profile_id, :name]) if profile_rpms.any?
54
100
  end
55
101
  end
56
102
  end
@@ -54,12 +54,12 @@ module Katello
54
54
  repo_content_list.map { |content| content.try(:pulp_href) }
55
55
  end
56
56
 
57
- def update_model(model)
57
+ def self.generate_model_row(unit)
58
58
  custom_json = {}
59
- custom_json['pulp_id'] = backend_data['pulp_href']
60
- custom_json['name'] = backend_data['name']
61
- custom_json['description'] = backend_data['description']
62
- model.update!(custom_json)
59
+ custom_json['pulp_id'] = unit['pulp_href']
60
+ custom_json['name'] = unit['name']
61
+ custom_json['description'] = unit['description']
62
+ custom_json
63
63
  end
64
64
  end
65
65
  end
@@ -34,10 +34,6 @@ module Katello
34
34
  true
35
35
  end
36
36
 
37
- def update_model
38
- fail NotImplementedError
39
- end
40
-
41
37
  attr_accessor :uuid
42
38
  attr_writer :backend_data
43
39
 
@@ -57,6 +53,20 @@ module Katello
57
53
  self::CONTENT_TYPE
58
54
  end
59
55
 
56
+ def self.pulp_units_for_ids(content_unit_hrefs)
57
+ Enumerator.new do |yielder|
58
+ yielder.yield content_unit_hrefs.collect { |href| pulp_data(href).with_indifferent_access }
59
+ end
60
+ end
61
+
62
+ def self.add_timestamps(rows)
63
+ rows.each do |row|
64
+ row[:created_at] = DateTime.now
65
+ row[:updated_at] = DateTime.now
66
+ end
67
+ rows
68
+ end
69
+
60
70
  def self.pulp_units_batch_all(content_unit_hrefs)
61
71
  Enumerator.new do |yielder|
62
72
  yielder.yield content_unit_hrefs.collect { |href| pulp_data(href) }
@@ -116,30 +126,28 @@ module Katello
116
126
  content_unit_list page_opts
117
127
  end
118
128
 
119
- # rubocop:disable Lint/UselessAssignment
120
129
  def self.find_duplicate_unit(repository, unit_type_id, file, checksum)
121
- filter_label = 'sha256'
130
+ filter_label = :sha256
122
131
  if unit_type_id == 'ostree_ref'
123
- filter_label = 'checksum'
132
+ filter_label = :checksum
124
133
  end
125
134
  content_backend_service = SmartProxy.pulp_primary.content_service(unit_type_id)
126
135
  duplicates_allowed = ::Katello::RepositoryTypeManager.find_content_type(unit_type_id).try(:duplicates_allowed)
127
136
  if repository.generic? && duplicates_allowed
128
137
  filename_key = ::Katello::RepositoryTypeManager.find_content_type(unit_type_id).filename_key
129
138
  duplicate_sha_path_content_list = content_backend_service.content_api(repository.repository_type, unit_type_id).list(
130
- filter_label: checksum,
139
+ filter_label => checksum,
131
140
  filename_key => file[:filename])
132
141
  elsif repository.generic?
133
142
  duplicate_sha_path_content_list = content_backend_service.content_api(repository.repository_type, unit_type_id).list(
134
- filter_label: checksum)
143
+ filter_label => checksum)
135
144
  else
136
145
  duplicate_sha_path_content_list = content_backend_service.content_api.list(
137
- filter_label: checksum,
146
+ filter_label => checksum,
138
147
  "relative_path": file[:filename])
139
148
  end
140
149
  duplicate_sha_path_content_list
141
150
  end
142
- # rubocop:enable Lint/UselessAssignment
143
151
  end
144
152
  end
145
153
  end
@@ -24,9 +24,11 @@ module Katello
24
24
  end
25
25
 
26
26
  def mirror_remote_options
27
- {
28
- distributions: repo.deb_releases + "#{' default' unless repo.deb_releases.include? 'default'}"
29
- }
27
+ super.merge(
28
+ {
29
+ distributions: repo.deb_releases + "#{' default' unless repo.deb_releases.include? 'default'}"
30
+ }
31
+ )
30
32
  end
31
33
 
32
34
  def publication_options(repository_version)
@@ -13,12 +13,17 @@ module Katello
13
13
  end
14
14
 
15
15
  def remote_options
16
- options = {url: root.url, upstream_name: root.docker_upstream_name}
17
- if root.docker_tags_whitelist&.any?
18
- options[:include_tags] = root.docker_tags_whitelist
16
+ options = {url: root.url, upstream_name: root.docker_upstream_name, policy: root.download_policy}
17
+ if root.include_tags&.any?
18
+ options[:include_tags] = root.include_tags
19
19
  else
20
20
  options[:include_tags] = nil
21
21
  end
22
+ if root.exclude_tags&.any?
23
+ options[:exclude_tags] = root.exclude_tags
24
+ else
25
+ options[:exclude_tags] = nil
26
+ end
22
27
  common_remote_options.merge(options)
23
28
  end
24
29
 
@@ -31,10 +36,12 @@ module Katello
31
36
  end
32
37
 
33
38
  def mirror_remote_options
34
- {
35
- url: "https://#{SmartProxy.pulp_primary.pulp3_host!.downcase}",
36
- upstream_name: repo.container_repository_name
37
- }
39
+ super.merge(
40
+ {
41
+ url: "https://#{SmartProxy.pulp_primary.pulp3_host!.downcase}",
42
+ upstream_name: repo.container_repository_name
43
+ }
44
+ )
38
45
  end
39
46
 
40
47
  def distribution_options(path)
@@ -24,7 +24,7 @@ module Katello
24
24
  def remote_options
25
25
  generic_remote_options = JSON.parse(root.generic_remote_options)
26
26
  if generic_remote_options.any?
27
- common_remote_options.merge(generic_remote_options.select { |_, v| !v.nil? }).symbolize_keys
27
+ common_remote_options.merge(generic_remote_options).symbolize_keys
28
28
  else
29
29
  common_remote_options
30
30
  end
@@ -49,16 +49,6 @@ module Katello
49
49
  }
50
50
  end
51
51
 
52
- def mirror_remote_options
53
- policy = smart_proxy.download_policy
54
-
55
- if smart_proxy.download_policy == SmartProxy::DOWNLOAD_INHERIT
56
- policy = repo.root.download_policy
57
- end
58
-
59
- { policy: policy }
60
- end
61
-
62
52
  def import_distribution_data
63
53
  distribution = ::Katello::Pulp3::Distribution.fetch_content_list(repository_version: repo.version_href)
64
54
  if distribution.results.present?
@@ -95,6 +85,7 @@ module Katello
95
85
  "/pulp/content/#{repo.relative_path}/".sub('//', '/')
96
86
  end
97
87
 
88
+ # rubocop:disable Metrics/MethodLength
98
89
  def multi_copy_units(repo_id_map, dependency_solving)
99
90
  tasks = []
100
91
 
@@ -107,14 +98,20 @@ module Katello
107
98
  dest_repo_href = ::Katello::Pulp3::Repository::Yum.new(dest_repo, SmartProxy.pulp_primary).repository_reference.repository_href
108
99
  content_unit_hrefs = dest_repo_id_map[:content_unit_hrefs]
109
100
  # Not needed during incremental update due to dest_base_version
101
+ # -> Unless incrementally updating a CV repo that is a soft copy of its library instance.
102
+ # -> I.e. no filters and not an incremental version.
110
103
  unless dest_repo_id_map[:base_version]
111
104
  source_repo_for_package_envs = ::Katello::Repository.find(source_repo_ids.first)
112
105
  unless source_repo_for_package_envs.library_instance?
113
106
  source_repo_for_package_envs = source_repo_for_package_envs.library_instance
114
107
  end
115
108
  package_env_hrefs = packageenvironments({ :repository_version => source_repo_for_package_envs.version_href }).map(&:pulp_href).sort
116
- tasks << remove_all_content_from_repo(dest_repo_href)
117
- tasks << add_content_for_repo(dest_repo_href, package_env_hrefs) unless package_env_hrefs.empty?
109
+ # Don't perform extra content actions if the repo is a soft copy of its library instance.
110
+ # Taken care of by the IncrementalUpdate action.
111
+ unless dest_repo.soft_copy_of_library?
112
+ tasks << remove_all_content_from_repo(dest_repo_href)
113
+ tasks << add_content_for_repo(dest_repo_href, package_env_hrefs) unless package_env_hrefs.empty?
114
+ end
118
115
  end
119
116
  source_repo_ids.each do |source_repo_id|
120
117
  source_repo_version = ::Katello::Repository.find(source_repo_id).version_href
@@ -129,6 +126,7 @@ module Katello
129
126
  end
130
127
  tasks.flatten
131
128
  end
129
+ # rubocop:enable Metrics/MethodLength
132
130
 
133
131
  def copy_api_data_dup(data)
134
132
  data_dup = PulpRpmClient::Copy.new
@@ -330,19 +330,26 @@ module Katello
330
330
  tasks
331
331
  end
332
332
 
333
- def copy_all(source_repository, mirror: false)
334
- if mirror
333
+ def copy_all(source_repository, options = {})
334
+ tasks = []
335
+ if options[:remove_all]
336
+ tasks << api.repositories_api.modify(repository_reference.repository_href, remove_content_units: ['*'])
337
+ end
338
+
339
+ if options[:mirror]
335
340
  data = api.class.add_remove_content_class.new(
336
341
  base_version: source_repository.version_href)
337
342
 
338
- [api.repositories_api.modify(repository_reference.repository_href, data)]
343
+ tasks << api.repositories_api.modify(repository_reference.repository_href, data)
344
+ tasks
339
345
  elsif api.respond_to? :copy_api
340
346
  data = api.class.copy_class.new
341
347
  data.config = [{
342
348
  source_repo_version: source_repository.version_href,
343
349
  dest_repo: repository_reference.repository_href
344
350
  }]
345
- [api.copy_api.copy_content(data)]
351
+ tasks << api.copy_api.copy_content(data)
352
+ tasks
346
353
  else
347
354
  copy_content_for_source(source_repository)
348
355
  end
@@ -399,7 +406,8 @@ module Katello
399
406
  proxy_url: root.http_proxy&.url,
400
407
  proxy_username: root.http_proxy&.username,
401
408
  proxy_password: root.http_proxy&.password,
402
- total_timeout: Setting[:sync_connect_timeout]
409
+ total_timeout: Setting[:sync_connect_timeout],
410
+ rate_limit: Setting[:download_rate_limit]
403
411
  }
404
412
  remote_options[:url] = root.url unless root.url.blank?
405
413
  remote_options[:download_concurrency] = root.download_concurrency unless root.download_concurrency.blank?
@@ -410,6 +418,17 @@ module Katello
410
418
  remote_options.merge!(ssl_remote_options)
411
419
  end
412
420
 
421
+ def mirror_remote_options
422
+ options = {}
423
+ if Katello::RootRepository::CONTENT_ATTRIBUTE_RESTRICTIONS[:download_policy].include?(repo.content_type)
424
+ options[:policy] = smart_proxy.download_policy
425
+ if smart_proxy.download_policy == SmartProxy::DOWNLOAD_INHERIT
426
+ options[:policy] = repo.root.download_policy
427
+ end
428
+ end
429
+ options
430
+ end
431
+
413
432
  def create_options
414
433
  { name: generate_backend_object_name }.merge!(specific_create_options)
415
434
  end
@@ -429,13 +448,13 @@ module Katello
429
448
  end
430
449
 
431
450
  def ssl_remote_options
432
- if root.redhat? && root.cdn_configuration.redhat?
451
+ if root.redhat? && root.cdn_configuration.redhat_cdn?
433
452
  {
434
453
  client_cert: root.product.certificate,
435
454
  client_key: root.product.key,
436
455
  ca_cert: Katello::Repository.feed_ca_cert(root.url)
437
456
  }
438
- elsif root.redhat? && !root.cdn_configuration.redhat?
457
+ elsif root.redhat? && root.cdn_configuration.upstream_server?
439
458
  {
440
459
  client_cert: root.cdn_configuration.ssl_cert,
441
460
  client_key: root.cdn_configuration.ssl_key,