katello 4.3.0.rc4 → 4.4.0.rc2

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

Potentially problematic release.


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

Files changed (458) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  3. data/app/controllers/katello/api/v2/api_controller.rb +13 -4
  4. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -1
  5. data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
  6. data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
  7. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
  8. data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
  9. data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
  10. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +10 -1
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +42 -14
  12. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  13. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  14. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  15. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  16. data/app/graphql/types/host_collection.rb +18 -0
  17. data/app/helpers/katello/content_source_helper.rb +43 -0
  18. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  19. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  20. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  21. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  22. data/app/lib/actions/katello/repository/discover.rb +1 -14
  23. data/app/lib/actions/katello/repository/errata_mail.rb +4 -5
  24. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  25. data/app/lib/actions/katello/repository/sync.rb +2 -2
  26. data/app/lib/actions/pulp3/abstract.rb +1 -1
  27. data/app/lib/actions/pulp3/abstract_async_task.rb +1 -1
  28. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +14 -4
  29. data/app/lib/actions/pulp3/content_view_version/create_import_history.rb +1 -2
  30. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  31. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  32. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  33. data/app/lib/actions/pulp3/repository/reclaim_space.rb +3 -10
  34. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  35. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  36. data/app/lib/katello/errors.rb +3 -3
  37. data/app/lib/katello/logging.rb +6 -1
  38. data/app/lib/katello/repo_discovery.rb +27 -19
  39. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  40. data/app/lib/katello/resources/cdn.rb +4 -2
  41. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  42. data/app/lib/katello/util/pulpcore_content_filters.rb +2 -1
  43. data/app/models/katello/candlepin/repository_mapper.rb +3 -2
  44. data/app/models/katello/cdn_configuration.rb +38 -6
  45. data/app/models/katello/concerns/audit_comment_extensions.rb +17 -0
  46. data/app/models/katello/concerns/host_managed_extensions.rb +34 -2
  47. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  48. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  49. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  50. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  51. data/app/models/katello/content_view.rb +4 -4
  52. data/app/models/katello/content_view_filter.rb +1 -1
  53. data/app/models/katello/content_view_history.rb +1 -1
  54. data/app/models/katello/content_view_version.rb +6 -2
  55. data/app/models/katello/content_view_version_export_history.rb +3 -2
  56. data/app/models/katello/content_view_version_import_history.rb +4 -4
  57. data/app/models/katello/deb.rb +1 -3
  58. data/app/models/katello/docker_meta_tag.rb +1 -1
  59. data/app/models/katello/erratum.rb +0 -15
  60. data/app/models/katello/glue/provider.rb +1 -1
  61. data/app/models/katello/glue/pulp/repos.rb +3 -1
  62. data/app/models/katello/host/content_facet.rb +2 -27
  63. data/app/models/katello/host/info_provider.rb +9 -0
  64. data/app/models/katello/host/subscription_facet.rb +2 -2
  65. data/app/models/katello/host_available_module_stream.rb +10 -0
  66. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  67. data/app/models/katello/installed_package.rb +1 -0
  68. data/app/models/katello/product.rb +1 -1
  69. data/app/models/katello/product_content.rb +2 -2
  70. data/app/models/katello/repository.rb +13 -12
  71. data/app/models/katello/root_repository.rb +65 -16
  72. data/app/models/katello/rpm.rb +8 -2
  73. data/app/models/setting/content.rb +15 -5
  74. data/app/services/cert/rhsm_client.rb +1 -5
  75. data/app/services/katello/component_view_presenter.rb +1 -1
  76. data/app/services/katello/content_unit_indexer.rb +166 -0
  77. data/app/services/katello/organization_creator.rb +23 -8
  78. data/app/services/katello/pulp/repository/docker.rb +1 -1
  79. data/app/services/katello/pulp/repository/yum.rb +0 -54
  80. data/app/services/katello/pulp/repository.rb +0 -6
  81. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  82. data/app/services/katello/pulp3/api/apt.rb +7 -0
  83. data/app/services/katello/pulp3/api/yum.rb +4 -0
  84. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  85. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -1
  86. data/app/services/katello/pulp3/deb.rb +10 -9
  87. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  88. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  89. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  90. data/app/services/katello/pulp3/erratum.rb +51 -56
  91. data/app/services/katello/pulp3/file_unit.rb +9 -6
  92. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  93. data/app/services/katello/pulp3/module_stream.rb +76 -30
  94. data/app/services/katello/pulp3/package_group.rb +5 -5
  95. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  96. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  97. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  98. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  99. data/app/services/katello/pulp3/repository/yum.rb +23 -16
  100. data/app/services/katello/pulp3/repository.rb +31 -10
  101. data/app/services/katello/pulp3/repository_mirror.rb +18 -4
  102. data/app/services/katello/pulp3/rpm.rb +13 -13
  103. data/app/services/katello/pulp3/srpm.rb +10 -9
  104. data/app/services/katello/registration_manager.rb +1 -1
  105. data/app/services/katello/repository_type.rb +15 -4
  106. data/app/services/katello/repository_type_manager.rb +1 -1
  107. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  108. data/app/services/katello/upstream_connection_checker.rb +2 -2
  109. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  110. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  111. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  112. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  113. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +19 -0
  114. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +19 -0
  115. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  116. data/app/views/katello/api/v2/content_views/base.json.rabl +8 -4
  117. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  118. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +1 -0
  119. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -0
  120. data/app/views/katello/api/v2/repositories/show.json.rabl +3 -1
  121. data/app/views/katello/layouts/react.html.erb +0 -1
  122. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  123. data/config/initializers/monkeys.rb +0 -1
  124. data/config/routes/api/v2.rb +1 -0
  125. data/config/routes/overrides.rb +3 -0
  126. data/config/routes.rb +2 -0
  127. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  128. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  129. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +2 -0
  130. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +11 -2
  131. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  132. data/db/migrate/20211202172358_add_repository_mirroring_policy.rb +26 -0
  133. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  134. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  135. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  136. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  137. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  138. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  139. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  140. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  141. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +23 -0
  142. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  143. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  144. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +10 -3
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  152. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  153. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +29 -10
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +49 -35
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +30 -0
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +29 -6
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +48 -23
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  162. data/lib/katello/engine.rb +4 -0
  163. data/lib/katello/permission_creator.rb +1 -1
  164. data/lib/katello/permissions/host_permissions.rb +3 -1
  165. data/lib/katello/plugin.rb +9 -1
  166. data/lib/katello/repository_types/deb.rb +0 -1
  167. data/lib/katello/repository_types/docker.rb +4 -4
  168. data/lib/katello/repository_types/file.rb +0 -1
  169. data/lib/katello/repository_types/ostree.rb +4 -6
  170. data/lib/katello/repository_types/python.rb +5 -1
  171. data/lib/katello/repository_types/yum.rb +2 -9
  172. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  173. data/lib/katello/tasks/import_applicability.rake +1 -1
  174. data/lib/katello/tasks/jenkins.rake +0 -2
  175. data/lib/katello/tasks/repository.rake +4 -1
  176. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  177. data/lib/katello/version.rb +1 -1
  178. data/locale/action_names.rb +8 -7
  179. data/locale/bn/katello.po +1402 -650
  180. data/locale/cs/katello.po +1217 -96
  181. data/locale/de/katello.po +2359 -1347
  182. data/locale/en/katello.po +1216 -94
  183. data/locale/es/katello.po +2201 -1172
  184. data/locale/fr/katello.po +2601 -1615
  185. data/locale/gu/katello.po +1564 -814
  186. data/locale/hi/katello.po +1563 -810
  187. data/locale/it/katello.po +1311 -282
  188. data/locale/ja/katello.po +2534 -1518
  189. data/locale/katello.pot +3430 -1326
  190. data/locale/kn/katello.po +1564 -812
  191. data/locale/ko/katello.po +1441 -409
  192. data/locale/mr/katello.po +1564 -776
  193. data/locale/or/katello.po +1565 -813
  194. data/locale/pa/katello.po +1559 -792
  195. data/locale/pt/katello.po +1314 -277
  196. data/locale/pt_BR/katello.po +2226 -1181
  197. data/locale/ru/katello.po +1587 -563
  198. data/locale/ta/katello.po +1373 -619
  199. data/locale/te/katello.po +1564 -810
  200. data/locale/zh_CN/katello.po +2936 -1890
  201. data/locale/zh_TW/katello.po +1508 -606
  202. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  203. data/webpack/components/ActionableDetail.js +35 -21
  204. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  205. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  206. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  207. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  208. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +1 -1
  209. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  210. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  211. data/webpack/components/EditableSwitch.js +8 -2
  212. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  213. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  214. data/webpack/components/Errata/index.js +95 -29
  215. data/webpack/components/ErratumTypeLabel.js +16 -16
  216. data/webpack/components/MultiSelect/index.js +2 -2
  217. data/webpack/components/Packages/index.js +1 -1
  218. data/webpack/components/RoutedTabs/index.js +2 -1
  219. data/webpack/components/Search/Search.js +5 -2
  220. data/webpack/components/Search/__tests__/search.test.js +2 -3
  221. data/webpack/components/Select/Select.js +1 -1
  222. data/webpack/components/SelectOrg/SelectOrgReducer.js +15 -15
  223. data/webpack/components/SelectOrg/SetOrganization.js +2 -2
  224. data/webpack/components/Table/PageControls.js +3 -6
  225. data/webpack/components/Table/TableHooks.js +47 -7
  226. data/webpack/components/Table/TableWrapper.js +25 -7
  227. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  228. data/webpack/components/TypeAhead/helpers/commonPropTypes.js +1 -1
  229. data/webpack/components/TypeAhead/helpers/helpers.js +14 -14
  230. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +1 -1
  231. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  232. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  233. data/webpack/components/WithOrganization/withOrganization.js +3 -3
  234. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  235. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +108 -0
  236. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +56 -0
  237. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  238. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +49 -2
  239. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +14 -1
  240. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +6 -4
  241. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +1 -0
  242. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  243. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +86 -75
  244. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.scss +11 -0
  245. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +3 -3
  246. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  247. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  248. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  249. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  250. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +16 -0
  251. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +3 -0
  252. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsSelectors.js +19 -0
  253. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +241 -0
  254. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +108 -0
  255. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +34 -0
  256. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  257. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  258. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +357 -64
  259. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.scss +3 -7
  260. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +103 -4
  261. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +6 -1
  262. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +45 -42
  263. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.scss +3 -3
  264. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  265. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  266. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  267. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  268. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  269. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +66 -61
  270. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.scss +11 -0
  271. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  272. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  274. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +312 -11
  275. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  276. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +26 -30
  277. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +25 -5
  279. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  280. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  281. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  282. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  283. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +4 -0
  284. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  285. data/webpack/components/extensions/RegistrationCommands/fields/LifecycleEnvironment.js +1 -1
  286. data/webpack/components/extensions/about/SystemStatuses.js +1 -1
  287. data/webpack/components/extensions/about/SystemStatusesReducer.js +10 -10
  288. data/webpack/components/pf3Table/components/Table.js +4 -5
  289. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  290. data/webpack/components/pf3Table/components/TableBody.js +2 -2
  291. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  292. data/webpack/containers/Application/config.js +6 -1
  293. data/webpack/containers/Application/overrides.scss +56 -7
  294. data/webpack/global_index.js +4 -1
  295. data/webpack/global_test_setup.js +1 -1
  296. data/webpack/index.js +7 -0
  297. data/webpack/redux/OrganizationProducts/OrganizationProductsReducer.js +15 -15
  298. data/webpack/redux/reducers/RedHatRepositories/enabled.js +43 -43
  299. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +43 -43
  300. data/webpack/redux/reducers/RedHatRepositories/sets.js +31 -31
  301. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsReducer.js +26 -26
  302. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsReducer.js +19 -19
  303. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  304. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  305. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  306. data/webpack/scenes/Content/ContentConfig.js +55 -5
  307. data/webpack/scenes/Content/ContentPage.js +5 -5
  308. data/webpack/scenes/Content/Details/ContentDetails.js +23 -21
  309. data/webpack/scenes/Content/Details/ContentInfo.js +2 -2
  310. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  311. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  312. data/webpack/scenes/Content/Table/ContentTable.js +2 -2
  313. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  314. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -4
  315. data/webpack/scenes/ContentViews/ContentViewsPage.js +17 -13
  316. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -1
  317. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +3 -2
  318. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +2 -2
  319. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  320. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +22 -11
  321. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +31 -18
  322. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +1 -1
  323. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  324. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +22 -28
  325. data/webpack/scenes/ContentViews/Details/ContentViewDetailReducer.js +8 -8
  326. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  327. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +32 -30
  328. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +9 -4
  329. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +14 -17
  330. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +3 -0
  331. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +1 -1
  332. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +8 -8
  333. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +4 -4
  334. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +6 -6
  335. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +16 -9
  336. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +46 -46
  337. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +17 -17
  338. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +17 -17
  339. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +4 -4
  340. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  341. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +17 -11
  342. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +1 -1
  343. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  344. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +17 -17
  345. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  346. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  347. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  348. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  349. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  350. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  351. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  352. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  353. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +24 -3
  354. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  355. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +28 -28
  356. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +18 -18
  358. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +3 -3
  359. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +3 -3
  360. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  361. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -1
  362. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -1
  363. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -35
  364. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  365. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +5 -2
  366. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +39 -40
  367. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +46 -34
  368. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +66 -49
  369. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +5 -5
  370. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  371. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  372. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +2 -2
  373. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +5 -5
  374. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +3 -3
  375. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  376. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  377. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +18 -18
  378. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -10
  379. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  380. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +8 -8
  381. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  382. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  383. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  384. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  385. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  386. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  387. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  388. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  389. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  390. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsReducer.js +18 -18
  391. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  392. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  393. data/webpack/scenes/ModuleStreams/ModuleStreamsReducer.js +26 -26
  394. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  395. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  396. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  397. data/webpack/scenes/Organizations/OrganizationReducer.js +8 -8
  398. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  399. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  400. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  401. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +4 -4
  402. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -1
  403. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  404. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  405. data/webpack/scenes/Settings/SettingsReducer.js +14 -14
  406. data/webpack/scenes/Settings/Tables/TableReducer.js +23 -23
  407. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailInfo.js +2 -2
  408. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProductContent.js +15 -15
  409. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProducts.js +1 -1
  410. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailReducer.js +34 -34
  411. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +13 -13
  412. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  413. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  414. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  415. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  416. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  417. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  418. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  419. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  420. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  421. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +11 -6
  422. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryReducer.js +16 -16
  423. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +149 -149
  424. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsReducer.js +41 -41
  425. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  426. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  427. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  428. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  429. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  430. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/DeleteDialog.js +6 -6
  431. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +12 -12
  432. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  433. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  434. data/webpack/services/api/testHelpers.js +5 -3
  435. data/webpack/services/index.js +36 -36
  436. data/webpack/utils/helpers.js +11 -8
  437. metadata +98 -60
  438. data/app/services/katello/pulp/deb.rb +0 -55
  439. data/app/services/katello/pulp/distribution.rb +0 -7
  440. data/app/services/katello/pulp/docker_blob.rb +0 -7
  441. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  442. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  443. data/app/services/katello/pulp/docker_tag.rb +0 -14
  444. data/app/services/katello/pulp/erratum.rb +0 -129
  445. data/app/services/katello/pulp/file_unit.rb +0 -21
  446. data/app/services/katello/pulp/module_stream.rb +0 -39
  447. data/app/services/katello/pulp/package_category.rb +0 -7
  448. data/app/services/katello/pulp/package_group.rb +0 -20
  449. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  450. data/app/services/katello/pulp/rpm.rb +0 -57
  451. data/app/services/katello/pulp/srpm.rb +0 -29
  452. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  453. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  454. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  455. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  456. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +0 -16
  457. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +0 -12
  458. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -8,8 +8,9 @@ module Katello
8
8
  def filter_package_groups_by_pulp_href(package_groups, package_pulp_hrefs)
9
9
  rpms = Katello::Rpm.where(:pulp_id => package_pulp_hrefs)
10
10
  package_groups.reject do |package_group|
11
+ #copy the package group as long as we have 1 package from the group
11
12
  package_group.package_names.empty? ||
12
- (package_group.package_names - rpms.pluck(:name)).any?
13
+ (package_group.package_names & rpms.pluck(:name)).empty?
13
14
  end
14
15
  end
15
16
 
@@ -34,7 +34,7 @@ module Katello
34
34
  :content_type => katello_content_type,
35
35
  :unprotected => unprotected?,
36
36
  :download_policy => download_policy,
37
- :mirror_on_sync => true
37
+ :mirroring_policy => Katello::RootRepository::MIRRORING_POLICY_COMPLETE
38
38
  )
39
39
 
40
40
  Repository.new(:root => root,
@@ -44,7 +44,7 @@ module Katello
44
44
  end
45
45
 
46
46
  def validate!
47
- return if katello_content_type == Repository::OSTREE_TYPE || Setting[:content_disconnected]
47
+ return if katello_content_type == Repository::OSTREE_TYPE || product.organization.cdn_configuration.airgapped?
48
48
  substitutor.validate_substitutions(content, substitutions)
49
49
  end
50
50
 
@@ -74,6 +74,7 @@ module Katello
74
74
  end
75
75
 
76
76
  def feed_url
77
+ return if product.organization.cdn_configuration.airgapped?
77
78
  @feed_url ||= if product.cdn_resource&.respond_to?(:repository_url)
78
79
  product.cdn_resource.repository_url(content_label: content.label)
79
80
  else
@@ -1,31 +1,63 @@
1
1
  module Katello
2
2
  class CdnConfiguration < Katello::Model
3
3
  include Encryptable
4
+ self.inheritance_column = nil
5
+ CDN_TYPE = 'redhat_cdn'.freeze
6
+ UPSTREAM_SERVER_TYPE = 'upstream_server'.freeze
7
+ AIRGAPPED_TYPE = 'airgapped'.freeze
8
+
9
+ TYPES = [CDN_TYPE, UPSTREAM_SERVER_TYPE, AIRGAPPED_TYPE].freeze
4
10
 
5
11
  belongs_to :organization, :inverse_of => :cdn_configuration
6
12
 
7
13
  belongs_to :ssl_ca_credential, :class_name => "Katello::ContentCredential", :inverse_of => :ssl_ca_cdn_configurations
8
14
 
9
15
  encrypts :password
16
+ validates :password, presence: true, if: :upstream_server?
17
+ validates :username, presence: true, if: :upstream_server?
18
+ validates :upstream_organization_label, presence: true, if: :upstream_server?
10
19
 
11
- validates :url, presence: true
12
- validates_with Validators::KatelloUrlFormatValidator, attributes: :url
20
+ validates :url, presence: true, unless: :airgapped?
21
+ validates_with Validators::KatelloUrlFormatValidator, attributes: :url, unless: :airgapped?
13
22
  validates_with Validators::KatelloLabelFormatValidator, attributes: :upstream_organization_label, if: proc { upstream_organization_label.present? }
14
- validate :non_redhat_configuration, unless: :redhat?
23
+ validate :non_redhat_configuration, if: :upstream_server?
24
+
25
+ before_validation :reset_fields
15
26
 
16
27
  def ssl_ca
17
28
  ssl_ca_credential&.content
18
29
  end
19
30
 
20
- def redhat?
21
- username.blank? && password.blank? && upstream_organization_label.blank? && ssl_ca_credential_id.blank?
31
+ def redhat_cdn?
32
+ type == CDN_TYPE
33
+ end
34
+
35
+ def airgapped?
36
+ type == AIRGAPPED_TYPE
37
+ end
38
+
39
+ def upstream_server?
40
+ type == UPSTREAM_SERVER_TYPE
22
41
  end
23
42
 
24
43
  private
25
44
 
45
+ def reset_fields
46
+ return if upstream_server?
47
+
48
+ self.url = nil if airgapped?
49
+ self.url ||= SETTINGS[:katello][:redhat_repository_url] if redhat_cdn?
50
+ self.username = nil
51
+ self.password = nil
52
+ self.upstream_organization_label = nil
53
+ self.ssl_ca_credential_id = nil
54
+ self.upstream_content_view_label = nil
55
+ self.upstream_lifecycle_environment_label = nil
56
+ end
57
+
26
58
  def non_redhat_configuration
27
59
  if username.blank? || password.blank? || upstream_organization_label.blank? || ssl_ca_credential_id.blank?
28
- errors.add(:base, _("Username, Password, Upstream Organization Label, and SSL CA Credential are required when using a non-Red Hat CDN."))
60
+ errors.add(:base, _("Username, Password, Upstream Organization Label, and SSL CA Credential are required when using an upstream Foreman server."))
29
61
  end
30
62
  end
31
63
  end
@@ -0,0 +1,17 @@
1
+ module Katello
2
+ module Concerns::AuditCommentExtensions
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ # to prevent PG::StringDataRightTruncation: ERROR: value too long for type character varying(255)
7
+ def truncate_audit_comment(long_comment)
8
+ if long_comment.length > 255
9
+ Rails.logger.info "Truncating audit comment: #{long_comment}"
10
+ "#{long_comment[0..250]}..."
11
+ else
12
+ long_comment
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -28,9 +28,21 @@ module Katello
28
28
  content_facet.kickstart_repository_id = valid_repos.first
29
29
  end
30
30
  end
31
+
32
+ def remote_execution_proxies(provider, *_rest)
33
+ proxies = super
34
+ if (name = subscription_facet&.registered_through)
35
+ registered_through = SmartProxy.with_features(provider)
36
+ .authorized
37
+ .where(name: name)
38
+ end
39
+ proxies[:registered_through] = registered_through || []
40
+ proxies
41
+ end
31
42
  end
32
43
 
33
44
  included do
45
+ prepend ::ForemanRemoteExecution::HostExtensions if ::Katello.with_remote_execution?
34
46
  prepend Overrides
35
47
 
36
48
  delegate :content_source_id, :content_view_id, :lifecycle_environment_id, :kickstart_repository_id, to: :content_facet, allow_nil: true
@@ -109,7 +121,7 @@ module Katello
109
121
  self.host_statuses.where(type: ::Katello::HostStatusManager::STATUSES.map(&:name)).each do |status|
110
122
  status.refresh!
111
123
  end
112
- refresh_global_status!
124
+ refresh_global_status
113
125
  end
114
126
 
115
127
  def queue_refresh_content_host_status
@@ -388,6 +400,26 @@ module Katello
388
400
  ::Katello::HostTracer.helpers_for(traces)
389
401
  end
390
402
 
403
+ def package_names_for_job_template(action:, search:)
404
+ actions = %w(install remove update).freeze
405
+ case action
406
+ when 'install'
407
+ ::Katello::Rpm.yum_installable_for_host(self).search_for(search).distinct.pluck(:name)
408
+ when 'remove'
409
+ return [] if search.empty?
410
+
411
+ installed_packages.search_for(search).distinct.pluck(:name)
412
+ when 'update'
413
+ return [] if search.empty?
414
+
415
+ pkg_names = installed_packages.search_for(search).distinct.pluck(:name)
416
+ upgrades = ::Katello::Rpm.installable_for_hosts([self]).select(:id, :name, :nvra, :evr).order(evr: :desc).group_by(&:name)
417
+ pkg_names.map { |p| upgrades[p]&.first&.nvra }.compact
418
+ else
419
+ fail ::Foreman::Exception.new(N_("package_names_for_job_template: Action must be one of %s"), actions.join(', '))
420
+ end
421
+ end
422
+
391
423
  def advisory_ids(search:)
392
424
  ::Katello::Erratum.installable_for_hosts([self]).search_for(search).pluck(:errata_id)
393
425
  end
@@ -414,7 +446,7 @@ end
414
446
  class ::Host::Managed::Jail < Safemode::Jail
415
447
  allow :content_source, :subscription_manager_configuration_url, :rhsm_organization_label,
416
448
  :host_collections, :pools, :hypervisor_host, :lifecycle_environment, :content_view,
417
- :installed_packages, :traces_helpers, :advisory_ids
449
+ :installed_packages, :traces_helpers, :advisory_ids, :package_names_for_job_template
418
450
  end
419
451
 
420
452
  class ActiveRecord::Associations::CollectionProxy::Jail < Safemode::Jail
@@ -55,6 +55,10 @@ module Katello
55
55
  # so that it will execute after :dependent => :destroy
56
56
  before_destroy :destroy_taxable_taxonomies
57
57
 
58
+ def self.non_audited_columns
59
+ super | [:created_in_katello]
60
+ end
61
+
58
62
  def default_content_view
59
63
  ContentView.default.where(:organization_id => self.id).first
60
64
  end
@@ -193,7 +197,7 @@ module Katello
193
197
 
194
198
  def latest_repo_discovery
195
199
  ForemanTasks::Task::DynflowTask.for_action(::Actions::Katello::Repository::Discover)
196
- .for_resource(::User.current).order("started_at").last
200
+ .where(user: ::User.current).order("started_at").last
197
201
  end
198
202
 
199
203
  def cancel_repo_discovery
@@ -74,6 +74,61 @@ module Katello
74
74
  self.name.demodulize.pluralize.underscore.to_sym
75
75
  end
76
76
 
77
+ def import_for_repository(repo, options = {})
78
+ content_type = options[:content_type] || self.content_type
79
+ Katello::ContentUnitIndexer.new(content_type: Katello::RepositoryTypeManager.find_content_type(content_type), repository: repo).import_all
80
+ end
81
+
82
+ def import_all(unit_ids, repository = nil, options = {})
83
+ content_type = options[:content_type] || self.content_type
84
+ Katello::ContentUnitIndexer.new(content_type: Katello::RepositoryTypeManager.find_content_type(content_type), repository: repository, pulp_content_ids: unit_ids).import_all
85
+ end
86
+
87
+ def copy_repository_associations(source_repo, dest_repo)
88
+ if many_repository_associations
89
+ delete_query = "delete from #{repository_association_class.table_name} where repository_id = #{dest_repo.id} and
90
+ #{unit_id_field} not in (select #{unit_id_field} from #{repository_association_class.table_name} where repository_id = #{source_repo.id})"
91
+ ActiveRecord::Base.transaction do
92
+ ActiveRecord::Base.connection.execute(delete_query)
93
+ self.repository_association_class.import(db_columns_copy, db_values_copy(source_repo, dest_repo), validate: false)
94
+ end
95
+ else
96
+ columns = column_names - ["id", "pulp_id", "created_at", "updated_at", "repository_id"]
97
+ queries = []
98
+ queries << "delete from #{self.table_name} where repository_id = #{dest_repo.id} and
99
+ pulp_id not in (select pulp_id from #{self.table_name} where repository_id = #{source_repo.id})"
100
+ queries << "insert into #{self.table_name} (repository_id, pulp_id, #{columns.join(',')})
101
+ select #{dest_repo.id} as repository_id, pulp_id, #{columns.join(',')} from #{self.table_name}
102
+ where repository_id = #{source_repo.id} and pulp_id not in (select pulp_id
103
+ from #{self.table_name} where repository_id = #{dest_repo.id})"
104
+ ActiveRecord::Base.transaction do
105
+ queries.each do |query|
106
+ ActiveRecord::Base.connection.execute(query)
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ def db_columns_copy
113
+ [unit_id_field, backend_identifier_field, :repository_id].compact
114
+ end
115
+
116
+ def db_values_copy(source_repo, dest_repo)
117
+ db_values = []
118
+ existing_unit_ids = self.repository_association_class.where(repository: dest_repo).pluck(unit_id_field)
119
+ if existing_unit_ids.empty?
120
+ new_units = self.repository_association_class.where(repository: source_repo)
121
+ else
122
+ new_units = self.repository_association_class.where(repository: source_repo).where.not("#{unit_id_field} in (?) ", existing_unit_ids)
123
+ end
124
+ unit_backend_identifier_field = backend_identifier_field
125
+ unit_identifier_filed = unit_id_field
126
+ new_units.each do |unit|
127
+ db_values << [unit[unit_identifier_filed], unit[unit_backend_identifier_field], dest_repo.id].compact
128
+ end
129
+ db_values
130
+ end
131
+
77
132
  def installable_for_content_facet(facet, env = nil, content_view = nil)
78
133
  repos = if env && content_view
79
134
  Katello::Repository.in_environment(env).in_content_views([content_view])
@@ -95,8 +150,8 @@ module Katello
95
150
 
96
151
  if hosts
97
152
  hosts = ::Host.where(id: hosts) if hosts.is_a?(Array)
98
- facet_repos = facet_repos.merge(hosts).reorder(nil)
99
- facet_content_units = facet_content_units.merge(hosts).reorder(nil)
153
+ facet_repos = facet_repos.where(hosts: { id: hosts }).reorder(nil)
154
+ facet_content_units = facet_content_units.where(hosts: { id: hosts }).reorder(nil)
100
155
  end
101
156
 
102
157
  self.joins(repository_association_units).
@@ -123,181 +178,12 @@ module Katello
123
178
  content_unit_class.new(pulp_id)
124
179
  end
125
180
 
126
- def unit_id_field
127
- "#{self.name.demodulize.underscore}_id"
128
- end
129
-
130
- def import_all(pulp_ids = nil, repository = nil, generic_content_type = nil)
131
- ids_to_associate = []
132
- if generic_content_type
133
- service_class = SmartProxy.pulp_primary!.content_service(generic_content_type)
134
- else
135
- service_class = SmartProxy.pulp_primary!.content_service(content_type)
136
- end
137
- service_class.pulp_units_batch_all(pulp_ids).each do |units|
138
- units.each do |unit|
139
- unit = unit.with_indifferent_access
140
- if content_type == 'rpm' && repository
141
- rpms_to_disassociate = ::Katello::Rpm.where(name: unit[:name], version: unit[:version], release: unit[:release],
142
- epoch: unit[:epoch], arch: unit[:arch]).select(:id)
143
- if rpms_to_disassociate.any?
144
- ::Katello::RepositoryRpm.where(rpm_id: rpms_to_disassociate, repository_id: repository.id).destroy_all
145
- end
146
- end
147
- model = Katello::Util::Support.active_record_retry do
148
- self.where(:pulp_id => unit[service_class.unit_identifier]).first_or_create
149
- end
150
- service = service_class.new(model.pulp_id)
151
- service.backend_data = unit
152
- if repository&.generic?
153
- service.update_model(model, generic_content_type)
154
- end
155
- service.update_model(model)
156
- ids_to_associate << model.pulp_id
157
- end
158
- end
159
- sync_repository_associations(repository, :pulp_ids => ids_to_associate, :additive => true) if self.many_repository_associations && repository && ids_to_associate.present?
160
- end
161
-
162
- # rubocop:disable Metrics/MethodLength
163
- def import_for_repository(repository, generic_content_type: nil, full_index: false)
164
- pulp_id_href_map = {}
165
- if generic_content_type
166
- service_class = SmartProxy.pulp_primary!.content_service(generic_content_type)
167
- else
168
- service_class = SmartProxy.pulp_primary!.content_service(content_type)
169
- end
170
- fetch_only_ids = !full_index &&
171
- !repository.content_view.default? &&
172
- !repository.repository_type.unique_content_per_repo &&
173
- service_class.supports_id_fetch?
174
-
175
- erratum_updated_ids = []
176
- service_class.pulp_units_batch_for_repo(repository, fetch_identifiers: fetch_only_ids, content_type: generic_content_type).each do |units|
177
- units.each do |unit|
178
- unit = unit.with_indifferent_access
179
- pulp_id = unit[service_class.unit_identifier]
180
- backend_identifier = unit.dig(service_class.backend_unit_identifier)
181
- unless fetch_only_ids
182
- model = Katello::Util::Support.active_record_retry do
183
- self.where(:pulp_id => pulp_id).first_or_create
184
- end
185
- service = service_class.new(model.pulp_id)
186
- service.backend_data = unit
187
- model.repository_id = repository.id unless many_repository_associations
188
-
189
- if repository.generic?
190
- service.update_model(model, generic_content_type)
191
- elsif self == ::Katello::Erratum
192
- # Errata will change pulp_hrefs if the upstream repo updates them
193
- erratum_updated_ids << service.update_model(model)
194
- else
195
- service.update_model(model)
196
- end
197
- end
198
- pulp_id_href_map[pulp_id] = backend_identifier
199
- end
200
- end
201
- sync_repository_associations(repository, :pulp_id_href_map => pulp_id_href_map, generic_content_type: generic_content_type, erratum_updated_ids: erratum_updated_ids.uniq) if self.many_repository_associations
202
- end
203
-
204
- def sync_repository_associations(repository, options = {})
205
- additive = options.fetch(:additive, false)
206
- generic_content_type = options.fetch(:generic_content_type, nil)
207
- pulp_id_href_map = options.dig(:pulp_id_href_map) || {}
208
- pulp_ids = options.dig(:pulp_ids) || pulp_id_href_map.try(:keys)
209
- ids_for_repository = with_pulp_id(pulp_ids).pluck(:id, :pulp_id)
210
- associated_ids = ids_for_repository.map(&:first)
211
- id_href_map_for_repository = {}
212
- ids_for_repository.each { |id_href| id_href_map_for_repository[id_href[0]] = id_href[1] }
213
- id_href_map_for_repository.each_pair { |k, v| id_href_map_for_repository[k] = pulp_id_href_map[v] }
214
- erratum_updated_ids = options.fetch(:erratum_updated_ids, []).flatten.compact
215
-
216
- existing_ids = self.repository_association_class.uncached do
217
- repo_assoc_units = self.repository_association_class.where(:repository_id => repository)
218
-
219
- if generic_content_type
220
- generic_unit_ids = Katello::GenericContentUnit
221
- .where(id: repo_assoc_units.pluck(unit_id_field))
222
- .where(content_type: generic_content_type).pluck(:id)
223
- repo_assoc_units = repo_assoc_units.where(generic_content_unit_id: generic_unit_ids)
224
- end
225
-
226
- repo_assoc_units.pluck(unit_id_field)
227
- end
228
-
229
- new_ids = associated_ids - existing_ids
230
- ActiveRecord::Base.transaction do
231
- if !additive && (delete_ids = existing_ids - associated_ids).any?
232
- query = "DELETE FROM #{self.repository_association_class.table_name} WHERE repository_id=#{repository.id} AND #{unit_id_field} IN (#{delete_ids.join(', ')})"
233
- ActiveRecord::Base.connection.execute(query)
234
- end
235
- if self == ::Katello::Erratum
236
- self.update_repo_association_records(new_ids, erratum_updated_ids, id_href_map_for_repository, repository)
237
- else
238
- unless new_ids.empty?
239
- self.repository_association_class.import(db_columns_sync, db_values(new_ids, id_href_map_for_repository, repository), validate: false)
240
- end
241
- end
242
- end
243
- end
244
- # rubocop:enable Metrics/MethodLength
245
-
246
- def copy_repository_associations(source_repo, dest_repo)
247
- if many_repository_associations
248
- delete_query = "delete from #{repository_association_class.table_name} where repository_id = #{dest_repo.id} and
249
- #{unit_id_field} not in (select #{unit_id_field} from #{repository_association_class.table_name} where repository_id = #{source_repo.id})"
250
- ActiveRecord::Base.transaction do
251
- ActiveRecord::Base.connection.execute(delete_query)
252
- self.repository_association_class.import(db_columns_copy, db_values_copy(source_repo, dest_repo), validate: false)
253
- end
254
- else
255
- columns = column_names - ["id", "pulp_id", "created_at", "updated_at", "repository_id"]
256
- queries = []
257
- queries << "delete from #{self.table_name} where repository_id = #{dest_repo.id} and
258
- pulp_id not in (select pulp_id from #{self.table_name} where repository_id = #{source_repo.id})"
259
- queries << "insert into #{self.table_name} (repository_id, pulp_id, #{columns.join(',')})
260
- select #{dest_repo.id} as repository_id, pulp_id, #{columns.join(',')} from #{self.table_name}
261
- where repository_id = #{source_repo.id} and pulp_id not in (select pulp_id
262
- from #{self.table_name} where repository_id = #{dest_repo.id})"
263
- ActiveRecord::Base.transaction do
264
- queries.each do |query|
265
- ActiveRecord::Base.connection.execute(query)
266
- end
267
- end
268
- end
269
- end
270
-
271
181
  def with_pulp_id(unit_pulp_ids)
272
182
  where('pulp_id in (?)', unit_pulp_ids)
273
183
  end
274
184
 
275
- def db_columns_sync
276
- [unit_id_field, backend_identifier_field, :repository_id, :created_at, :updated_at].compact
277
- end
278
-
279
- def db_columns_copy
280
- [unit_id_field, backend_identifier_field, :repository_id].compact
281
- end
282
-
283
- def db_values_copy(source_repo, dest_repo)
284
- db_values = []
285
- existing_unit_ids = self.repository_association_class.where(repository: dest_repo).pluck(unit_id_field)
286
- if existing_unit_ids.empty?
287
- new_units = self.repository_association_class.where(repository: source_repo)
288
- else
289
- new_units = self.repository_association_class.where(repository: source_repo).where.not("#{unit_id_field} in (?) ", existing_unit_ids)
290
- end
291
- unit_backend_identifier_field = backend_identifier_field
292
- unit_identifier_filed = unit_id_field
293
- new_units.each do |unit|
294
- db_values << [unit[unit_identifier_filed], unit[unit_backend_identifier_field], dest_repo.id].compact
295
- end
296
- db_values
297
- end
298
-
299
- def db_values(new_ids, pulp_id_href_map, repository)
300
- new_ids.map { |unit_id| [unit_id.to_i, pulp_id_href_map.dig(unit_id), repository.id.to_i, Time.now.utc.to_s(:db), Time.now.utc.to_s(:db)].compact }
185
+ def unit_id_field
186
+ "#{self.name.demodulize.underscore}_id"
301
187
  end
302
188
  end
303
189
  end
@@ -0,0 +1,11 @@
1
+ module Katello
2
+ module Concerns
3
+ module RemoteExecutionProxySelectorExtensions
4
+ def strategies
5
+ order = [super, [:registered_through]]
6
+ order = order.reverse if Setting[:remote_execution_prefer_registered_through_proxy]
7
+ order.reduce(:+)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -179,6 +179,7 @@ module Katello
179
179
  config.scheme = uri.scheme
180
180
  pulp3_ssl_configuration(config)
181
181
  config.debugging = false
182
+ config.timeout = SETTINGS[:katello][:rest_client_timeout]
182
183
  config.logger = ::Foreman::Logging.logger('katello/pulp_rest')
183
184
  config.username = self.setting(PULP3_FEATURE, 'username')
184
185
  config.password = self.setting(PULP3_FEATURE, 'password')
@@ -345,7 +346,7 @@ module Katello
345
346
  fail _("Content type %{content_type_string} does not belong to an enabled repo type.") %
346
347
  { content_type_string: content_type_string }
347
348
  end
348
- pulp3_content_support?(content_type_obj) ? content_type_obj.pulp3_service_class : content_type_obj.pulp2_service_class
349
+ content_type_obj.pulp3_service_class
349
350
  end
350
351
 
351
352
  def set_default_download_policy
@@ -30,7 +30,7 @@ module Katello
30
30
  :inverse_of => :composite_content_view, :foreign_key => :composite_content_view_id, autosave: true
31
31
 
32
32
  has_many :component_composites, :class_name => "Katello::ContentViewComponent",
33
- :dependent => :destroy, :inverse_of => :content_view, :foreign_key => :content_view_id
33
+ :dependent => :destroy, :inverse_of => :content_view
34
34
 
35
35
  has_many :content_view_repositories, :class_name => 'Katello::ContentViewRepository',
36
36
  :dependent => :destroy, :inverse_of => :content_view
@@ -41,16 +41,16 @@ module Katello
41
41
 
42
42
  has_many :activation_keys, :class_name => "Katello::ActivationKey", :dependent => :restrict_with_exception
43
43
 
44
- has_many :content_facets, :class_name => "Katello::Host::ContentFacet", :foreign_key => :content_view_id,
44
+ has_many :content_facets, :class_name => "Katello::Host::ContentFacet",
45
45
  :inverse_of => :content_view, :dependent => :restrict_with_exception
46
46
  has_many :hosts, :class_name => "::Host::Managed", :through => :content_facets,
47
47
  :inverse_of => :content_view
48
- has_many :hostgroup_content_facets, :class_name => "Katello::Hostgroup::ContentFacet", :foreign_key => :content_view_id,
48
+ has_many :hostgroup_content_facets, :class_name => "Katello::Hostgroup::ContentFacet",
49
49
  :inverse_of => :content_view, :dependent => :nullify
50
50
  has_many :hostgroups, :class_name => "::Hostgroup", :through => :hostgroup_content_facets,
51
51
  :inverse_of => :content_view
52
52
 
53
- has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference', :foreign_key => :content_view_id,
53
+ has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference',
54
54
  :dependent => :destroy, :inverse_of => :content_view
55
55
 
56
56
  validates_lengths_from_database :except => [:label]
@@ -15,7 +15,7 @@ module Katello
15
15
  :class_name => "Katello::ContentView",
16
16
  :inverse_of => :filters
17
17
 
18
- has_many :repository_content_view_filters, :class_name => "Katello::RepositoryContentViewFilter", :dependent => :delete_all, :inverse_of => :filter, :foreign_key => :content_view_filter_id
18
+ has_many :repository_content_view_filters, :class_name => "Katello::RepositoryContentViewFilter", :dependent => :delete_all, :inverse_of => :filter
19
19
  has_many :repositories, :through => :repository_content_view_filters, :class_name => "Katello::Repository"
20
20
 
21
21
  validates_lengths_from_database
@@ -8,7 +8,7 @@ module Katello
8
8
 
9
9
  belongs_to :triggered_by, :class_name => "Katello::ContentViewVersion", :inverse_of => :triggered_histories
10
10
 
11
- belongs_to :task, :class_name => "ForemanTasks::Task::DynflowTask", :foreign_key => :task_id
11
+ belongs_to :task, :class_name => "ForemanTasks::Task::DynflowTask"
12
12
 
13
13
  IN_PROGRESS = 'in progress'.freeze
14
14
  FAILED = 'failed'.freeze
@@ -24,9 +24,9 @@ module Katello
24
24
  :inverse_of => :triggered_by, :foreign_key => :triggered_by_id
25
25
 
26
26
  has_many :export_histories, :class_name => "::Katello::ContentViewVersionExportHistory", :dependent => :destroy,
27
- :inverse_of => :content_view_version, :foreign_key => :content_view_version_id
27
+ :inverse_of => :content_view_version
28
28
  has_many :import_histories, :class_name => "::Katello::ContentViewVersionImportHistory", :dependent => :destroy,
29
- :inverse_of => :content_view_version, :foreign_key => :content_view_version_id
29
+ :inverse_of => :content_view_version
30
30
  has_many :repositories, :class_name => "::Katello::Repository", :dependent => :destroy
31
31
  has_one :task_status, :class_name => "Katello::TaskStatus", :as => :task_owner, :dependent => :destroy
32
32
 
@@ -239,6 +239,10 @@ module Katello
239
239
  Rpm.in_repositories(archived_repos)
240
240
  end
241
241
 
242
+ def generic_content_units(content_type)
243
+ GenericContentUnit.in_repositories(archived_repos).where(content_type: content_type)
244
+ end
245
+
242
246
  def library_packages
243
247
  Rpm.in_repositories(library_repos)
244
248
  end
@@ -1,6 +1,7 @@
1
1
  module Katello
2
2
  class ContentViewVersionExportHistory < Katello::Model
3
3
  include Authorization::ContentViewVersionExportHistory
4
+ include Concerns::AuditCommentExtensions
4
5
  audited except: :metadata
5
6
  delegate :organization, to: :content_view_version
6
7
  delegate :id, to: :organization, prefix: true
@@ -9,7 +10,7 @@ module Katello
9
10
  INCREMENTAL = "incremental".freeze
10
11
  EXPORT_TYPES = [COMPLETE, INCREMENTAL].freeze
11
12
 
12
- belongs_to :content_view_version, :class_name => "::Katello::ContentViewVersion", :inverse_of => :export_histories, foreign_key: 'content_view_version_id'
13
+ belongs_to :content_view_version, :class_name => "::Katello::ContentViewVersion", :inverse_of => :export_histories
13
14
  validates_lengths_from_database
14
15
 
15
16
  validates :content_view_version_id, :presence => true
@@ -58,7 +59,7 @@ module Katello
58
59
  export_descriptor = "export of content view '#{content_view_version.content_view.name}' version #{content_view_version.version}"
59
60
  export_descriptor += " from #{from_version.name}" if from_version
60
61
  end
61
- "#{export_type&.capitalize} #{export_descriptor} created by #{user.to_label}"
62
+ truncate_audit_comment("#{export_type&.capitalize} #{export_descriptor} created by #{user.to_label}")
62
63
  end
63
64
  end
64
65
  end
@@ -1,6 +1,7 @@
1
1
  module Katello
2
2
  class ContentViewVersionImportHistory < Katello::Model
3
3
  include Authorization::ContentViewVersionImportHistory
4
+ include Concerns::AuditCommentExtensions
4
5
 
5
6
  audited except: :metadata
6
7
  delegate :organization, to: :content_view_version
@@ -31,12 +32,11 @@ module Katello
31
32
  scoped_search :on => :id, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
32
33
  scoped_search :on => :import_type, :rename => :type, :complete_value => ContentViewVersionExportHistory::EXPORT_TYPES
33
34
 
34
- def self.generate_audit_comment(user:, path:, content_view_name:)
35
- _("Content imported from %{path} into content view '%{name}' by %{user}") % {
36
- path: path,
35
+ def self.generate_audit_comment(user:, content_view_name:)
36
+ truncate_audit_comment(_("Content imported by %{user} into content view '%{name}'") % {
37
37
  user: user.to_label,
38
38
  name: content_view_name
39
- }
39
+ })
40
40
  end
41
41
  end
42
42
  end
@@ -2,7 +2,7 @@ module Katello
2
2
  class Deb < Katello::Model
3
3
  include Concerns::PulpDatabaseUnit
4
4
 
5
- CONTENT_TYPE = Pulp::Deb::CONTENT_TYPE
5
+ CONTENT_TYPE = 'deb'.freeze
6
6
 
7
7
  has_many :repository_debs, :class_name => "Katello::RepositoryDeb", :dependent => :destroy, :inverse_of => :deb
8
8
  has_many :repositories, :through => :repository_debs, :class_name => "Katello::Repository"
@@ -16,8 +16,6 @@ module Katello
16
16
  scoped_search :on => :filename, :complete_value => true
17
17
  scoped_search :on => :checksum
18
18
 
19
- before_save lambda { |deb| deb.description = deb.description.truncate(255) unless deb.description.blank? }
20
-
21
19
  def self.default_sort
22
20
  order(:name).order(:version).order(:architecture)
23
21
  end
@@ -153,7 +153,7 @@ module Katello
153
153
  end
154
154
 
155
155
  unless params_to_query_for_delete.empty?
156
- RepositoryDockerMetaTag.where(:docker_meta_tag => DockerMetaTag.where(params_to_query_for_delete.join(" OR "))).delete_all
156
+ RepositoryDockerMetaTag.where(:repository_id => repo.id).where(:docker_meta_tag => DockerMetaTag.where(params_to_query_for_delete.join(" OR "))).delete_all
157
157
  end
158
158
 
159
159
  metatags = []