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
@@ -4,6 +4,8 @@ module Katello
4
4
  audited :except => [:content_id]
5
5
  serialize :ignorable_content
6
6
  serialize :docker_tags_whitelist
7
+ serialize :include_tags
8
+ serialize :exclude_tags
7
9
  serialize :os_versions
8
10
 
9
11
  include Ext::LabelFromName
@@ -21,7 +23,7 @@ module Katello
21
23
  SUBSCRIBABLE_TYPES = [Repository::YUM_TYPE, Repository::OSTREE_TYPE, Repository::DEB_TYPE].freeze
22
24
 
23
25
  CONTENT_ATTRIBUTE_RESTRICTIONS = {
24
- :download_policy => [Repository::YUM_TYPE, Repository::DEB_TYPE]
26
+ :download_policy => [Repository::YUM_TYPE, Repository::DEB_TYPE, Repository::DOCKER_TYPE]
25
27
  }.freeze
26
28
 
27
29
  NO_DEFAULT_HTTP_PROXY = 'none'.freeze
@@ -54,7 +56,7 @@ module Katello
54
56
  has_many :repositories, :class_name => "Katello::Repository", :foreign_key => :root_id,
55
57
  :inverse_of => :root, :dependent => :destroy
56
58
 
57
- has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference', :foreign_key => :root_repository_id,
59
+ has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference',
58
60
  :dependent => :destroy, :inverse_of => :root_repository
59
61
 
60
62
  validates_lengths_from_database :except => [:label]
@@ -72,7 +74,8 @@ module Katello
72
74
  validate :ensure_valid_collection_attributes, :if => :ansible_collection?
73
75
  validate :ensure_valid_auth_url_token, :if => :ansible_collection?
74
76
  validate :ensure_valid_ignorable_content
75
- validate :ensure_valid_docker_tags_whitelist
77
+ validate :ensure_valid_include_tags
78
+ validate :ensure_valid_exclude_tags
76
79
  validate :ensure_valid_os_versions
77
80
  validate :ensure_content_attribute_restrictions
78
81
  validate :ensure_valid_upstream_authorization
@@ -223,10 +226,17 @@ module Katello
223
226
  end
224
227
  end
225
228
 
226
- def ensure_valid_docker_tags_whitelist
227
- return if docker_tags_whitelist.blank?
228
- unless docker_tags_whitelist.is_a?(Array)
229
- errors.add(:docker_tags_whitelist, N_("Invalid value specified for Container Image repositories."))
229
+ def ensure_valid_include_tags
230
+ return if include_tags.blank?
231
+ unless include_tags.is_a?(Array)
232
+ errors.add(:include_tags, N_("Invalid value specified for Container Image repositories."))
233
+ end
234
+ end
235
+
236
+ def ensure_valid_exclude_tags
237
+ return if exclude_tags.blank?
238
+ unless exclude_tags.is_a?(Array)
239
+ errors.add(:exclude_tags, N_("Invalid value specified for Container Image repositories."))
230
240
  end
231
241
  end
232
242
 
@@ -315,6 +325,11 @@ module Katello
315
325
  Katello::Content.find_by(:cp_content_id => self.content_id, :organization_id => self.product.organization_id)
316
326
  end
317
327
 
328
+ # For API support during deprecation period.
329
+ def docker_tags_whitelist
330
+ include_tags
331
+ end
332
+
318
333
  def docker?
319
334
  self.content_type == Repository::DOCKER_TYPE
320
335
  end
@@ -359,7 +374,7 @@ module Katello
359
374
  changeable_attributes = %w(url unprotected checksum_type docker_upstream_name download_policy mirroring_policy verify_ssl_on_sync
360
375
  upstream_username upstream_password ignorable_content
361
376
  ssl_ca_cert_id ssl_client_cert_id ssl_client_key_id http_proxy_policy http_proxy_id download_concurrency)
362
- changeable_attributes += %w(name container_repository_name docker_tags_whitelist) if docker?
377
+ changeable_attributes += %w(name container_repository_name include_tags exclude_tags) if docker?
363
378
  changeable_attributes += %w(deb_releases deb_components deb_architectures gpg_key_id) if deb?
364
379
  changeable_attributes += %w(ansible_collection_requirements ansible_collection_auth_url ansible_collection_auth_token) if ansible_collection?
365
380
  changeable_attributes.any? { |key| previous_changes.key?(key) }
@@ -396,11 +411,7 @@ module Katello
396
411
 
397
412
  def format_arches
398
413
  if content_type == ::Katello::Repository::DEB_TYPE
399
- # FIXME: This should be set to self.deb_architectures but it needs to have the
400
- # subscription-manager PR https://github.com/candlepin/subscription-manager/pull/2213
401
- # merged. Otherwise subscription-manager returns _NO_ debian repository as described in
402
- # https://community.theforeman.org/t/katello-3-16-1-1-el7-subscription-manager-doesnt-create-rhsm-repos-for-ubuntu/20928/38
403
- nil
414
+ self.deb_architectures
404
415
  else
405
416
  self.arch == "noarch" ? nil : self.arch
406
417
  end
@@ -8,6 +8,7 @@ module Katello
8
8
  has_many :content_facets, :through => :content_facet_applicable_rpms, :class_name => "Katello::Host::ContentFacet"
9
9
  has_many :module_stream_rpms, class_name: "Katello::ModuleStreamRpm", inverse_of: :rpm, dependent: :destroy
10
10
  has_many :module_streams, :through => :module_stream_rpms
11
+ scoped_search :on => :id, :complete_value => true
11
12
  scoped_search :on => :name, :complete_value => true
12
13
  scoped_search :on => :version, :complete_value => true, :ext_method => :scoped_search_version
13
14
  scoped_search :on => :release, :complete_value => true, :ext_method => :scoped_search_release
@@ -19,8 +20,6 @@ module Katello
19
20
  scoped_search :on => :modular, :complete_value => true, :only_explicit => true
20
21
  scoped_search :on => :checksum
21
22
 
22
- before_save lambda { |rpm| rpm.summary = rpm.summary.truncate(255) unless rpm.summary.blank? }
23
-
24
23
  scope :modular, -> { where(modular: true) }
25
24
  scope :non_modular, -> { where(modular: false) }
26
25
 
@@ -215,6 +214,13 @@ module Katello
215
214
  where("#{Katello::Host::ContentFacet.table_name}.host_id" => hosts).distinct
216
215
  end
217
216
 
217
+ # Return RPMs that are not installed on a host, but could be installed
218
+ # the word 'installable' has a different meaning here than elsewhere
219
+ def self.yum_installable_for_host(host)
220
+ repos = host.content_facet.bound_repositories.pluck(:id)
221
+ Katello::Rpm.in_repositories(repos).where.not(name: host.installed_packages.pluck(:name)).order(:name)
222
+ end
223
+
218
224
  def self.latest(relation)
219
225
  # There are several different ways to implement this:
220
226
 
@@ -75,8 +75,8 @@ class Setting::Content < Setting
75
75
  20, N_('Accept action timeout')),
76
76
  self.set('content_action_finish_timeout', N_("Time in seconds to wait for a Host to finish a remote action"),
77
77
  3600, N_('Finish action timeout')),
78
- self.set('content_disconnected', N_("A server operating in disconnected mode does not communicate with the Red Hat CDN."),
79
- false, N_('Disconnected mode')),
78
+ self.set('subscription_connection_enabled', N_("Can communicate with the Red Hat Portal for subscriptions."),
79
+ true, N_('Subscription connection enabled')),
80
80
  self.set('errata_status_installable', N_("Calculate errata host status based only on errata in a Host's Content View and Lifecycle Environment"),
81
81
  false, N_('Installable errata from Content View')),
82
82
  self.set('restrict_composite_view', N_("If this is enabled, a composite content view may not be published or "\
@@ -88,6 +88,7 @@ class Setting::Content < Setting
88
88
  100, N_('Batch size to sync repositories in.')),
89
89
  self.set('foreman_proxy_content_auto_sync', N_("Whether or not to auto sync the Smart Proxies after a Content View promotion."),
90
90
  true, N_('Sync Smart Proxies after Content View promotion')),
91
+ self.set('download_rate_limit', N_("Maximum download rate when syncing a repository (requests per second). Use 0 for no limit."), 0, N_("Download rate limit")),
91
92
  self.set('default_download_policy', N_("Default download policy for custom repositories (either 'immediate' or 'on_demand')"), "immediate",
92
93
  N_('Default Custom Repository download policy'), nil, :collection => download_policies),
93
94
  self.set('default_redhat_download_policy', N_("Default download policy for enabled Red Hat repositories (either 'immediate' or 'on_demand')"), "on_demand",
@@ -148,7 +149,9 @@ class Setting::Content < Setting
148
149
  N_('Pulp bulk load size')),
149
150
  self.set('upload_profiles_without_dynflow', N_('Allow Katello to update host installed packages, enabled repos, and module inventory directly instead of wrapped in Dynflow tasks (try turning off if Puma processes are using too much memory)'), true,
150
151
  N_('Upload profiles without Dynflow')),
151
- self.set('orphan_protection_time', N_('Time in minutes to consider orphan content as orphaned.'), 1440, N_('Orphaned Content Protection Time'))
152
+ self.set('orphan_protection_time', N_('Time in minutes to consider orphan content as orphaned.'), 1440, N_('Orphaned Content Protection Time')),
153
+ self.set('remote_execution_prefer_registered_through_proxy', N_('Prefer using a proxy to which a host is registered when using remote execution'), false,
154
+ N_('Prefer registered through proxy for remote execution'))
152
155
  ]
153
156
  end
154
157
 
@@ -10,7 +10,7 @@ module Cert
10
10
  end
11
11
 
12
12
  def uuid
13
- drop_cn_prefix_from_subject(@cert.subject.to_s)
13
+ @uuid ||= @cert.subject.to_a.detect { |name, _, _| name == 'CN' }&.second
14
14
  end
15
15
 
16
16
  private
@@ -26,10 +26,6 @@ module Cert
26
26
  end
27
27
  end
28
28
 
29
- def drop_cn_prefix_from_subject(subject_string)
30
- subject_string.sub(/\/CN=/i, '')
31
- end
32
-
33
29
  def strip_cert(cert)
34
30
  cert = cert.to_s.gsub("-----BEGIN CERTIFICATE-----", "").gsub("-----END CERTIFICATE-----", "")
35
31
  cert.delete!(' ')
@@ -0,0 +1,166 @@
1
+ module Katello
2
+ class ContentUnitIndexer
3
+ def initialize(content_type:, repository: nil, pulp_content_ids: nil, optimized: true)
4
+ @content_type = content_type
5
+ @model_class = content_type.model_class
6
+ @service_class = SmartProxy.pulp_primary!.content_service(content_type)
7
+ @repository = repository
8
+ @content_type = content_type
9
+ @pulp_content_ids = pulp_content_ids
10
+ @optimized = optimized
11
+ end
12
+
13
+ def remove_duplicates(unit)
14
+ #when we are uploading units, we need to remove any duplicates from our indexed data
15
+ if @content_type.label == 'rpm' && @repository && @pulp_content_ids
16
+ rpms_to_disassociate = ::Katello::Rpm.where(name: unit[:name], version: unit[:version], release: unit[:release],
17
+ epoch: unit[:epoch], arch: unit[:arch]).select(:id)
18
+ if rpms_to_disassociate.any?
19
+ ::Katello::RepositoryRpm.where(rpm_id: rpms_to_disassociate, repository_id: @repository.id).destroy_all
20
+ end
21
+ end
22
+ end
23
+
24
+ def import_all
25
+ association_tracker = RepoAssociationTracker.new(@content_type, @service_class, @repository)
26
+
27
+ units_from_pulp.each do |units|
28
+ units.each do |unit|
29
+ association_tracker.push(unit)
30
+ remove_duplicates(unit)
31
+ end
32
+
33
+ unless fetch_only_ids
34
+ to_insert = units.map do |unit|
35
+ if @content_type.generic?
36
+ @service_class.generate_model_row(unit, @content_type)
37
+ else
38
+ @service_class.generate_model_row(unit)
39
+ end
40
+ end
41
+
42
+ next if to_insert.empty?
43
+ insert_timestamps(to_insert)
44
+ if @content_type.mutable
45
+ @model_class.upsert_all(to_insert, unique_by: :pulp_id)
46
+ else
47
+ @model_class.insert_all(to_insert, unique_by: :pulp_id)
48
+ end
49
+ end
50
+
51
+ import_associations(units) if @repository
52
+ end
53
+
54
+ if @model_class.many_repository_associations && @repository
55
+ sync_repository_associations(association_tracker)
56
+ end
57
+ end
58
+
59
+ def import_associations(units)
60
+ pulp_id_to_id = self.class.pulp_id_to_id_map(@content_type, units.map { |unit| unit[@service_class.unit_identifier] })
61
+ @service_class.insert_child_associations(units, pulp_id_to_id) if @service_class.respond_to?(:insert_child_associations)
62
+ end
63
+
64
+ def units_from_pulp(&block)
65
+ if @pulp_content_ids
66
+ @service_class.pulp_units_batch_all(@pulp_content_ids, &block)
67
+ elsif @repository
68
+ @service_class.pulp_units_batch_for_repo(@repository, fetch_identifiers: fetch_only_ids, content_type: @content_type, &block)
69
+ end
70
+ end
71
+
72
+ def self.pulp_id_to_id_map(content_type, pulp_ids)
73
+ map = {}
74
+ content_type.model_class.with_pulp_id(pulp_ids).select(:id, :pulp_id).each do |model|
75
+ map[model.pulp_id] = model.id
76
+ end
77
+ map
78
+ end
79
+
80
+ class RepoAssociationTracker
81
+ def initialize(content_type, service_class, repository)
82
+ @values = {}
83
+ @content_type = content_type
84
+ @repository = repository
85
+ @service_class = service_class
86
+ end
87
+
88
+ def unit_ids
89
+ db_values.map { |row| row[@content_type.model_class.unit_id_field] }
90
+ end
91
+
92
+ #pulp_href is only provided if we're storing a different 'pulp_id' on the repo association
93
+ def push(unit)
94
+ if @service_class.backend_unit_identifier
95
+ pulp_href = unit.dig(@service_class.backend_unit_identifier)
96
+ else
97
+ pulp_href = nil
98
+ end
99
+ unit_id = unit[@service_class.unit_identifier]
100
+ @values[unit_id] = pulp_href
101
+ end
102
+
103
+ def db_values
104
+ return @final_values if @final_values
105
+ @final_value = []
106
+
107
+ @final_values = ::Katello::ContentUnitIndexer.pulp_id_to_id_map(@content_type, @values.keys).map do |pulp_id, katello_id|
108
+ #:repository_id => X, :erratum_id => y
109
+ row = {:repository_id => @repository.id, @content_type.model_class.unit_id_field => katello_id}
110
+ row[pulp_href_association_name] = @values[pulp_id] if pulp_href_association_name
111
+ row
112
+ end
113
+ ContentUnitIndexer.insert_timestamps(@content_type.model_class, @final_values)
114
+ @final_values
115
+ end
116
+
117
+ def pulp_href_association_name
118
+ 'erratum_pulp3_href' if @content_type.label == 'erratum'
119
+ end
120
+ end
121
+
122
+ def insert_timestamps(units)
123
+ self.class.insert_timestamps(@model_class, units)
124
+ end
125
+
126
+ def self.insert_timestamps(model_class, units)
127
+ dates = model_class.columns.map(&:name).include?("created_at")
128
+ return units unless dates
129
+ units.each do |row|
130
+ row[:created_at] = DateTime.now
131
+ row[:updated_at] = DateTime.now
132
+ end
133
+ units
134
+ end
135
+
136
+ def fetch_only_ids
137
+ @optimized && @repository &&
138
+ !@repository.content_view.default? &&
139
+ !@repository.repository_type.unique_content_per_repo &&
140
+ @service_class.supports_id_fetch?
141
+ end
142
+
143
+ def sync_repository_associations(assocication_tracker, additive: false)
144
+ unless additive
145
+ ActiveRecord::Base.connection.uncached do
146
+ @model_class.repository_association_class.where(repository_id: @repository.id).where.
147
+ not(@model_class.unit_id_field => assocication_tracker.unit_ids).delete_all
148
+ end
149
+ end
150
+ return if assocication_tracker.db_values.empty?
151
+ @model_class.repository_association_class.upsert_all(assocication_tracker.db_values, :unique_by => association_class_uniqiness_attributes)
152
+ end
153
+
154
+ def association_class_uniqiness_attributes
155
+ columns = [@model_class.unit_id_field, 'repository_id']
156
+ found = ActiveRecord::Base.connection.indexes(@model_class.repository_association_class.table_name).find do |index|
157
+ index.columns.sort == columns.sort
158
+ end
159
+ if found
160
+ found.columns
161
+ else
162
+ fail "Unable to find unique index for #{columns} on table #{self.repository_association_class.table_name}"
163
+ end
164
+ end
165
+ end
166
+ end
@@ -1,5 +1,11 @@
1
1
  module Katello
2
2
  class OrganizationCreator
3
+ DEFAULT_CONTENT_VIEW_NAME = 'Default Organization View'.freeze
4
+ DEFAULT_CONTENT_VIEW_LABEL = 'Default_Organization_View'.freeze
5
+
6
+ DEFAULT_LIFECYCLE_ENV_NAME = 'Library'.freeze
7
+ DEFAULT_LIFECYCLE_ENV_LABEL = 'Library'.freeze
8
+
3
9
  attr_reader :library_view, :library_environment, :library_cvv, :content_view_environment, :anonymous_provider, :redhat_provider
4
10
 
5
11
  def self.seed_all_organizations!
@@ -87,8 +93,8 @@ module Katello
87
93
 
88
94
  def create_library_environment
89
95
  @library_environment = Katello::KTEnvironment.where(
90
- :name => "Library",
91
- :label => "Library",
96
+ :name => DEFAULT_LIFECYCLE_ENV_NAME,
97
+ :label => DEFAULT_LIFECYCLE_ENV_LABEL,
92
98
  :library => true,
93
99
  :organization => @organization
94
100
  ).first_or_create!
@@ -97,7 +103,8 @@ module Katello
97
103
  def create_library_view
98
104
  @library_view = Katello::ContentView.where(
99
105
  default: true,
100
- name: 'Default Organization View',
106
+ name: DEFAULT_CONTENT_VIEW_NAME,
107
+ label: DEFAULT_CONTENT_VIEW_LABEL,
101
108
  organization: @organization
102
109
  ).first_or_create!
103
110
  end
@@ -128,7 +135,8 @@ module Katello
128
135
  def create_cdn_configuration
129
136
  @cdn_configuration = Katello::CdnConfiguration.where(
130
137
  organization: @organization,
131
- url: ::Katello::Resources::CDN::CdnResource.redhat_cdn_url
138
+ url: ::Katello::Resources::CDN::CdnResource.redhat_cdn_url,
139
+ type: ::Katello::CdnConfiguration::CDN_TYPE
132
140
  ).first_or_create!
133
141
  end
134
142
  end
@@ -18,7 +18,7 @@ module Katello
18
18
  config = {
19
19
  feed: root.url,
20
20
  upstream_name: root.docker_upstream_name,
21
- tags: root.docker_tags_whitelist,
21
+ tags: root.include_tags,
22
22
  enable_v1: false
23
23
  }
24
24
  importer_class.new(config.merge(primary_importer_connection_options))
@@ -105,37 +105,6 @@ module Katello
105
105
  config
106
106
  end
107
107
 
108
- def copy_contents(destination_repo, filters: nil,
109
- solve_dependencies: false,
110
- rpm_filenames: [])
111
- rpm_copy_clauses, rpm_remove_clauses = generate_copy_clauses(filters&.yum(false), rpm_filenames)
112
- tasks = []
113
- if rpm_copy_clauses
114
- override_config = build_override_config(destination_repo,
115
- filters: filters,
116
- solve_dependencies: solve_dependencies)
117
-
118
- tasks << smart_proxy.pulp_api.extensions.rpm.copy(repo.pulp_id, destination_repo.pulp_id,
119
- rpm_copy_clauses.merge(:override_config => override_config))
120
- end
121
-
122
- if rpm_remove_clauses
123
- tasks << smart_proxy.pulp_api.extensions.repository.unassociate_units(destination_repo.pulp_id,
124
- type_ids: [::Katello::Pulp::Rpm::CONTENT_TYPE],
125
- filters: {unit: rpm_remove_clauses})
126
- end
127
-
128
- tasks.concat(copy_module_contents(destination_repo,
129
- filters: filters,
130
- solve_dependencies: solve_dependencies))
131
-
132
- [:srpm, :errata, :package_group, :package_environment,
133
- :yum_repo_metadata_file, :distribution, :module_default, :drpm].each do |type|
134
- tasks << smart_proxy.pulp_api.extensions.send(type).copy(repo.pulp_id, destination_repo.pulp_id)
135
- end
136
- tasks
137
- end
138
-
139
108
  def import_distribution_data
140
109
  distribution = smart_proxy.pulp_api.extensions.repository.distributions(repo.pulp_id).first
141
110
  if distribution
@@ -230,29 +199,6 @@ module Katello
230
199
  end
231
200
  [copy_clauses, remove_clauses]
232
201
  end
233
-
234
- def generate_copy_clauses(filters, rpm_filenames)
235
- if rpm_filenames&.any?
236
- copy_clauses = {filters: {unit: { 'filename' => { '$in' => rpm_filenames } }}}
237
- remove_clauses = nil
238
- elsif filters&.any?
239
- clause_gen = ::Katello::Util::PackageClauseGenerator.new(repo, filters.yum(false))
240
- clause_gen.generate
241
-
242
- copy = clause_gen.copy_clause
243
- copy_clauses = {filters: {unit: copy }} if copy
244
-
245
- remove = clause_gen.remove_clause
246
- remove_clauses = {filters: {unit: remove}} if remove
247
- else
248
- non_modular_rpms = ::Katello::Rpm.in_repositories(repo).non_modular.pluck(:filename)
249
- copy_clauses = non_modular_rpms.blank? ? nil : {filters: {unit: ContentViewPackageFilter.generate_rpm_clauses(non_modular_rpms)}}
250
- remove_clauses = nil
251
- end
252
-
253
- copy_clauses&.merge!(fields: ::Katello::Pulp::Rpm::PULP_SELECT_FIELDS)
254
- [copy_clauses, remove_clauses]
255
- end
256
202
  end
257
203
  end
258
204
  end
@@ -278,12 +278,6 @@ module Katello
278
278
  Katello::RepositoryTypeManager.find(repo.content_type)
279
279
  end
280
280
 
281
- def index_content_units
282
- content_unit_types.each do |content_type|
283
- content_type.pulp2_service_class
284
- end
285
- end
286
-
287
281
  def proxy_options
288
282
  if repo.root.http_proxy_policy == RootRepository::NO_DEFAULT_HTTP_PROXY
289
283
  return { proxy_host: '' }
@@ -18,17 +18,33 @@ module Katello
18
18
  fail NotImplementedError
19
19
  end
20
20
 
21
- def update_model(model)
22
- custom_json = {}
23
- custom_json['checksum'] = backend_data['sha256']
24
- custom_json['namespace'] = backend_data['namespace']
25
- custom_json['version'] = backend_data['version']
26
- custom_json['name'] = backend_data['name']
27
- custom_json['description'] = backend_data['description']
28
- model.update!(custom_json)
21
+ def self.generate_model_row(unit)
22
+ {
23
+ pulp_id: unit['pulp_href'],
24
+ checksum: unit['sha256'],
25
+ namespace: unit['namespace'],
26
+ version: unit['version'],
27
+ name: unit['name'],
28
+ description: unit['description']
29
+ }
30
+ end
31
+
32
+ def self.insert_child_associations(units, pulp_id_to_id)
33
+ tag_names = units.map { |unit| unit['tags'].map { |tag| tag[:name] } }.flatten
34
+ tag_rows = tag_names.map { |name| {name: name } }
35
+ Katello::AnsibleTag.insert_all(tag_rows, unique_by: [:name]) if tag_rows.any?
36
+
37
+ collection_tag_rows = []
38
+ units.each do |unit|
39
+ katello_id = pulp_id_to_id[unit['pulp_href']]
40
+ #delete old tags
41
+ unit_tags = unit['tags'].map { |tag| tag[:name] }
42
+ Katello::AnsibleCollectionTag.where(:ansible_collection_id => katello_id).where.not(:ansible_tag_id => Katello::AnsibleTag.where(:name => unit_tags)).delete_all
43
+ collection_tag_rows += Katello::AnsibleTag.where(:name => unit_tags).pluck(:id).map { |tag_id| {ansible_collection_id: katello_id, ansible_tag_id: tag_id} }
44
+ end
29
45
 
30
- tags = backend_data['tags'].map { |tag| Katello::AnsibleTag.find_or_create_by(name: tag['name']) }
31
- model.tags = tags
46
+ collection_tag_rows.flatten!
47
+ Katello::AnsibleCollectionTag.insert_all(collection_tag_rows, unique_by: [:ansible_collection_id, :ansible_tag_id])
32
48
  end
33
49
  end
34
50
  end
@@ -4,6 +4,13 @@ module Katello
4
4
  module Pulp3
5
5
  module Api
6
6
  class Apt < Core
7
+ def publication_verbatim_class
8
+ PulpDebClient::DebVerbatimPublication
9
+ end
10
+
11
+ def publications_verbatim_api
12
+ PulpDebClient::PublicationsVerbatimApi.new(api_client)
13
+ end
7
14
  end
8
15
  end
9
16
  end
@@ -121,11 +121,20 @@ module Katello
121
121
  }
122
122
  end
123
123
 
124
+ fail _("Content View label not provided.") if metadata[:label].blank?
125
+
124
126
  cv = ::Katello::ContentView.find_by(label: metadata[:label],
125
- organization: organization,
126
- import_only: true)
127
+ organization: organization)
127
128
  if cv.blank?
128
129
  ::Katello::ContentView.create!(metadata.merge(organization: organization, import_only: true))
130
+ elsif !cv.import_only?
131
+ msg = _("Unable to import in to Content View specified in the metadata - '%{name}'. "\
132
+ "The 'import_only' attribute for the content view is set to false. "\
133
+ "To mark this Content View as importable, have your system administrator"\
134
+ " run the following command on the server. "\
135
+ % { name: cv.name })
136
+ command = "foreman-rake katello:set_content_view_import_only ID=#{cv.id}"
137
+ fail msg + "\n" + command
129
138
  else
130
139
  cv.update!(description: cv_metadata[:description]) if cv.description != metadata[:description]
131
140
  cv
@@ -23,15 +23,16 @@ module Katello
23
23
  repo_content_list.map { |content| content.try(:pulp_href) }
24
24
  end
25
25
 
26
- def update_model(model)
27
- custom_json = {}
28
- custom_json['checksum'] = backend_data['sha256']
29
- custom_json['filename'] = backend_data['relative_path']
30
- custom_json['name'] = backend_data['package']
31
- custom_json['version'] = backend_data['version']
32
- custom_json['description'] = backend_data['description']
33
- custom_json['architecture'] = backend_data['architecture']
34
- model.update!(custom_json)
26
+ def self.generate_model_row(unit)
27
+ {
28
+ pulp_id: unit[unit_identifier],
29
+ checksum: unit[:sha256],
30
+ filename: unit[:relative_path],
31
+ name: unit[:package],
32
+ version: unit[:version],
33
+ description: unit[:description]&.truncate(255),
34
+ architecture: unit[:architecture]
35
+ }
35
36
  end
36
37
  end
37
38
  end
@@ -20,11 +20,12 @@ module Katello
20
20
  self.content_api.list(page_opts)
21
21
  end
22
22
 
23
- def update_model(model)
24
- custom_json = {}
25
- custom_json['schema_version'], = backend_data['schema_version']
26
- custom_json['digest'], = backend_data['digest']
27
- model.update!(custom_json)
23
+ def self.generate_model_row(unit)
24
+ {
25
+ schema_version: unit['schema_version'],
26
+ digest: unit['digest'],
27
+ pulp_id: unit[unit_identifier]
28
+ }
28
29
  end
29
30
  end
30
31
  end
@@ -18,12 +18,29 @@ module Katello
18
18
  self.content_api.list(page_opts)
19
19
  end
20
20
 
21
- def update_model(model)
22
- custom_json = {}
23
- custom_json['schema_version'], = backend_data['schema_version']
24
- custom_json['digest'], = backend_data['digest']
25
- custom_json['docker_manifests'] = ::Katello::DockerManifest.where(:pulp_id => backend_data[:listed_manifests])
26
- model.update!(custom_json)
21
+ def self.generate_model_row(unit)
22
+ {
23
+ schema_version: unit['schema_version'],
24
+ digest: unit['digest'],
25
+ pulp_id: unit[unit_identifier]
26
+ }
27
+ end
28
+
29
+ def self.insert_child_associations(units, pulp_id_to_id)
30
+ manifest_list_manifests = []
31
+ units.each do |unit|
32
+ katello_id = pulp_id_to_id[unit[unit_identifier]]
33
+ manifest_ids = ::Katello::DockerManifest.where(:pulp_id => unit[:listed_manifests]).pluck(:id)
34
+ manifest_list_manifests += manifest_ids.map do |manifest_id|
35
+ {
36
+ docker_manifest_list_id: katello_id,
37
+ docker_manifest_id: manifest_id
38
+ }
39
+ end
40
+ end
41
+
42
+ manifest_list_manifests.flatten!
43
+ Katello::DockerManifestListManifest.insert_all(manifest_list_manifests, unique_by: [:docker_manifest_list_id, :docker_manifest_id]) if manifest_list_manifests.any?
27
44
  end
28
45
  end
29
46
  end