katello 3.12.3 → 3.13.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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +22 -3
  3. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +2 -2
  4. data/app/controllers/katello/api/v2/activation_keys_controller.rb +32 -15
  5. data/app/controllers/katello/api/v2/ansible_collections_controller.rb +19 -0
  6. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +3 -0
  7. data/app/controllers/katello/api/v2/content_view_puppet_modules_controller.rb +1 -0
  8. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +1 -0
  9. data/app/controllers/katello/api/v2/content_views_controller.rb +1 -0
  10. data/app/controllers/katello/api/v2/environments_controller.rb +1 -0
  11. data/app/controllers/katello/api/v2/errata_controller.rb +2 -1
  12. data/app/controllers/katello/api/v2/gpg_keys_controller.rb +1 -0
  13. data/app/controllers/katello/api/v2/host_collections_controller.rb +1 -0
  14. data/app/controllers/katello/api/v2/host_debs_controller.rb +34 -0
  15. data/app/controllers/katello/api/v2/host_errata_controller.rb +51 -4
  16. data/app/controllers/katello/api/v2/host_packages_controller.rb +1 -0
  17. data/app/controllers/katello/api/v2/module_streams_controller.rb +1 -0
  18. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -3
  19. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +18 -0
  20. data/app/controllers/katello/api/v2/products_controller.rb +1 -0
  21. data/app/controllers/katello/api/v2/repositories_controller.rb +46 -11
  22. data/app/controllers/katello/api/v2/repository_sets_controller.rb +6 -5
  23. data/app/controllers/katello/api/v2/srpms_controller.rb +24 -0
  24. data/app/controllers/katello/api/v2/sync_plans_controller.rb +1 -0
  25. data/app/controllers/katello/application_controller.rb +1 -0
  26. data/app/controllers/katello/concerns/api/v2/bulk_hosts_extensions.rb +2 -2
  27. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +9 -0
  28. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +2 -0
  29. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +1 -1
  30. data/app/helpers/katello/concerns/dashboard_helper_extensions.rb +13 -10
  31. data/app/lib/actions/candlepin/activation_key/create.rb +7 -1
  32. data/app/lib/actions/candlepin/activation_key/update.rb +7 -1
  33. data/app/lib/actions/candlepin/owner/destroy.rb +1 -1
  34. data/app/lib/actions/candlepin/product/update.rb +17 -0
  35. data/app/lib/actions/helpers/output_propagator.rb +13 -0
  36. data/app/lib/actions/katello/activation_key/create.rb +4 -1
  37. data/app/lib/actions/katello/activation_key/update.rb +8 -2
  38. data/app/lib/actions/katello/content_view/publish.rb +22 -34
  39. data/app/lib/actions/katello/event_queue/poller_thread.rb +22 -9
  40. data/app/lib/actions/katello/host/update.rb +3 -1
  41. data/app/lib/actions/katello/host/upload_profiles.rb +16 -0
  42. data/app/lib/actions/katello/organization/destroy.rb +0 -11
  43. data/app/lib/actions/katello/product/update.rb +8 -0
  44. data/app/lib/actions/katello/product/update_http_proxy.rb +19 -0
  45. data/app/lib/actions/katello/provider/update.rb +6 -7
  46. data/app/lib/actions/katello/pulp_selector.rb +15 -5
  47. data/app/lib/actions/katello/repository/check_matching_content.rb +3 -1
  48. data/app/lib/actions/katello/repository/clone_contents.rb +19 -6
  49. data/app/lib/actions/katello/repository/clone_to_environment.rb +3 -5
  50. data/app/lib/actions/katello/repository/create.rb +3 -1
  51. data/app/lib/actions/katello/repository/destroy.rb +5 -4
  52. data/app/lib/actions/katello/repository/discover.rb +8 -8
  53. data/app/lib/actions/katello/repository/export.rb +1 -1
  54. data/app/lib/actions/katello/repository/filtered_index_content.rb +10 -5
  55. data/app/lib/actions/katello/repository/finish_upload.rb +8 -0
  56. data/app/lib/actions/katello/repository/import_upload.rb +5 -2
  57. data/app/lib/actions/katello/repository/index_content.rb +3 -2
  58. data/app/lib/actions/katello/repository/metadata_generate.rb +10 -4
  59. data/app/lib/actions/katello/repository/remove_content.rb +11 -3
  60. data/app/lib/actions/katello/repository/sync.rb +14 -7
  61. data/app/lib/actions/katello/repository/update.rb +11 -5
  62. data/app/lib/actions/katello/repository/update_http_proxy_details.rb +17 -0
  63. data/app/lib/actions/katello/repository/upload_files.rb +7 -3
  64. data/app/lib/actions/katello/subscription/update.rb +11 -0
  65. data/app/lib/actions/katello/upstream_subscriptions/remove_entitlement.rb +3 -0
  66. data/app/lib/actions/katello/upstream_subscriptions/remove_entitlements.rb +4 -1
  67. data/app/lib/actions/middleware/backend_services_check.rb +10 -2
  68. data/app/lib/actions/middleware/propagate_output.rb +15 -0
  69. data/app/lib/actions/middleware/pulp3_services_check.rb +9 -0
  70. data/app/lib/actions/pulp/abstract_async_task.rb +8 -1
  71. data/app/lib/actions/pulp/orchestration/repository/copy_all_units.rb +19 -0
  72. data/app/lib/actions/pulp/orchestration/repository/refresh.rb +14 -0
  73. data/app/lib/actions/pulp/orchestration/repository/refresh_if_needed.rb +13 -0
  74. data/app/lib/actions/pulp/orchestration/repository/remove_units.rb +14 -0
  75. data/app/lib/actions/pulp/orchestration/repository/sync.rb +17 -0
  76. data/app/lib/actions/pulp/repository/copy_all_units.rb +1 -1
  77. data/app/lib/actions/pulp/repository/create.rb +0 -1
  78. data/app/lib/actions/pulp/repository/refresh.rb +0 -5
  79. data/app/lib/actions/pulp/repository/remove_units.rb +1 -1
  80. data/app/lib/actions/pulp/repository/sync.rb +8 -14
  81. data/app/lib/actions/pulp3/abstract.rb +2 -1
  82. data/app/lib/actions/pulp3/abstract_async_task.rb +15 -6
  83. data/app/lib/actions/pulp3/orchestration/repository/copy_all_units.rb +55 -0
  84. data/app/lib/actions/pulp3/orchestration/repository/create.rb +1 -2
  85. data/app/lib/actions/pulp3/orchestration/repository/delete.rb +1 -2
  86. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +17 -2
  87. data/app/lib/actions/pulp3/orchestration/repository/remove_units.rb +18 -0
  88. data/app/lib/actions/pulp3/orchestration/repository/sync.rb +19 -0
  89. data/app/lib/actions/pulp3/orchestration/repository/update.rb +15 -0
  90. data/app/lib/actions/pulp3/repository/copy_content.rb +19 -0
  91. data/app/lib/actions/pulp3/repository/copy_version.rb +19 -0
  92. data/app/lib/actions/pulp3/repository/create_publication.rb +3 -2
  93. data/app/lib/actions/pulp3/repository/presenters/abstract_sync_presenter.rb +42 -0
  94. data/app/lib/actions/pulp3/repository/presenters/content_unit_presenter.rb +57 -0
  95. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +7 -3
  96. data/app/lib/actions/pulp3/repository/remove_units.rb +23 -0
  97. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +6 -4
  98. data/app/lib/actions/pulp3/repository/save_publication.rb +5 -4
  99. data/app/lib/actions/pulp3/repository/save_version.rb +8 -4
  100. data/app/lib/actions/pulp3/repository/sync.rb +55 -0
  101. data/app/lib/actions/pulp3/repository/{delete_publisher.rb → update_distributions.rb} +5 -5
  102. data/app/lib/actions/pulp3/repository/{create_publisher.rb → update_remote.rb} +2 -2
  103. data/app/lib/actions/pulp3/repository/update_repository.rb +16 -0
  104. data/app/lib/katello/errors.rb +9 -0
  105. data/app/lib/katello/resources/candlepin/activation_key.rb +5 -4
  106. data/app/lib/katello/resources/candlepin/product.rb +4 -0
  107. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +11 -0
  108. data/app/lib/katello/resources/candlepin/upstream_pool.rb +6 -2
  109. data/app/lib/katello/resources/cdn.rb +3 -16
  110. data/app/lib/katello/util/cdn_var_substitutor.rb +0 -3
  111. data/app/lib/katello/util/http_proxy.rb +9 -9
  112. data/app/lib/katello/validators/hostgroup_kickstart_repository_validator.rb +1 -1
  113. data/app/models/katello/activation_key.rb +14 -0
  114. data/app/models/katello/activation_key_purpose_addon.rb +6 -0
  115. data/app/models/katello/ansible_collection.rb +32 -0
  116. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  117. data/app/models/katello/concerns/host_managed_extensions.rb +3 -0
  118. data/app/models/katello/concerns/http_proxy_extensions.rb +60 -0
  119. data/app/models/katello/concerns/location_extensions.rb +8 -0
  120. data/app/models/katello/concerns/organization_extensions.rb +9 -0
  121. data/app/models/katello/concerns/pulp_database_unit.rb +56 -81
  122. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  123. data/app/models/katello/concerns/smart_proxy_extensions.rb +27 -11
  124. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +8 -1
  125. data/app/models/katello/content_view.rb +4 -0
  126. data/app/models/katello/content_view_filter.rb +4 -8
  127. data/app/models/katello/docker_tag.rb +11 -10
  128. data/app/models/katello/erratum.rb +22 -0
  129. data/app/models/katello/event.rb +2 -0
  130. data/app/models/katello/events/auto_publish_composite_view.rb +41 -0
  131. data/app/models/katello/glue/pulp/repo.rb +0 -15
  132. data/app/models/katello/host/content_facet.rb +35 -4
  133. data/app/models/katello/host/subscription_facet.rb +14 -16
  134. data/app/models/katello/host_installed_deb.rb +7 -0
  135. data/app/models/katello/installed_deb.rb +10 -0
  136. data/app/models/katello/ping.rb +45 -10
  137. data/app/models/katello/product_content.rb +1 -1
  138. data/app/models/katello/purpose_addon.rb +11 -0
  139. data/app/models/katello/repository.rb +52 -41
  140. data/app/models/katello/repository_ansible_collection.rb +6 -0
  141. data/app/models/katello/repository_content_view_filter.rb +7 -0
  142. data/app/models/katello/rhsm_fact_parser.rb +11 -1
  143. data/app/models/katello/root_repository.rb +46 -4
  144. data/app/models/katello/srpm.rb +4 -0
  145. data/app/models/katello/subscription_facet_purpose_addon.rb +6 -0
  146. data/app/models/katello/yum_metadata_file.rb +3 -3
  147. data/app/models/setting/content.rb +32 -7
  148. data/app/overrides/add_about_page.rb +0 -7
  149. data/app/services/cert/certs.rb +1 -1
  150. data/app/services/katello/candlepin/consumer.rb +4 -0
  151. data/app/services/katello/event_queue.rb +33 -3
  152. data/app/services/katello/pulp/content_counts_calculator.rb +6 -0
  153. data/app/services/katello/pulp/docker_manifest.rb +1 -2
  154. data/app/services/katello/pulp/docker_manifest_list.rb +0 -1
  155. data/app/services/katello/pulp/file_unit.rb +1 -1
  156. data/app/services/katello/pulp/pulp_content_unit.rb +43 -0
  157. data/app/services/katello/pulp/repository.rb +32 -5
  158. data/app/services/katello/pulp/repository/file.rb +6 -1
  159. data/app/services/katello/pulp/repository/yum.rb +6 -6
  160. data/app/services/katello/pulp/rpm.rb +1 -1
  161. data/app/services/katello/pulp/srpm.rb +1 -1
  162. data/app/services/katello/pulp3/ansible_collection.rb +31 -0
  163. data/app/services/katello/pulp3/docker_blob.rb +17 -0
  164. data/app/services/katello/pulp3/docker_manifest.rb +36 -0
  165. data/app/services/katello/pulp3/docker_manifest_list.rb +30 -0
  166. data/app/services/katello/pulp3/docker_tag.rb +28 -0
  167. data/app/services/katello/pulp3/file_unit.rb +25 -0
  168. data/app/services/katello/pulp3/pulp_content_unit.rb +75 -0
  169. data/app/services/katello/pulp3/repository.rb +160 -47
  170. data/app/services/katello/pulp3/repository/ansible_collection.rb +49 -0
  171. data/app/services/katello/pulp3/repository/docker.rb +55 -0
  172. data/app/services/katello/pulp3/repository/file.rb +35 -25
  173. data/app/services/katello/repository_type.rb +15 -5
  174. data/app/services/katello/repository_type_manager.rb +32 -1
  175. data/app/views/dashboard/_subscription_widget.html.erb +7 -7
  176. data/app/views/foreman/smart_proxies/_content_tab.html.erb +5 -1
  177. data/app/views/katello/api/v2/activation_keys/base.json.rabl +5 -1
  178. data/app/views/katello/api/v2/ansible_collections/base.json.rabl +7 -0
  179. data/app/views/katello/api/v2/ansible_collections/index.json.rabl +7 -0
  180. data/app/views/katello/api/v2/ansible_collections/show.json.rabl +3 -0
  181. data/app/views/katello/api/v2/host_debs/base.json.rabl +4 -0
  182. data/app/views/katello/api/v2/host_debs/index.json.rabl +7 -0
  183. data/app/views/katello/api/v2/ping/show.json.rabl +2 -1
  184. data/app/views/katello/api/v2/repositories/base.json.rabl +3 -2
  185. data/app/views/katello/api/v2/repositories/show.json.rabl +8 -1
  186. data/app/views/katello/api/v2/srpms/index.json.rabl +7 -0
  187. data/app/views/katello/api/v2/srpms/show.json.rabl +5 -0
  188. data/app/views/katello/api/v2/subscription_facet/base.json.rabl +5 -1
  189. data/config/katello.yaml.example +1 -0
  190. data/config/routes/api/rhsm.rb +1 -0
  191. data/config/routes/api/v2.rb +16 -0
  192. data/config/routes/overrides.rb +4 -0
  193. data/db/migrate/20180502155123_add_installed_deb.rb +23 -0
  194. data/db/migrate/20190513162209_drop_repository_reference_publisher_href.rb +5 -0
  195. data/db/migrate/20190605014649_add_purpose_addons.rb +29 -0
  196. data/db/migrate/20190617142328_create_katello_ansible_collections.rb +25 -0
  197. data/db/migrate/20190618034438_add_ansible_collection_whitelist_to_katello_root_repositories.rb +5 -0
  198. data/db/migrate/20190619192151_add_activation_key_system_purpose_attributes.rb +14 -0
  199. data/db/migrate/20190701174401_add_http_proxy_policy_to_repository_root.rb +12 -0
  200. data/db/migrate/20190701192616_add_http_proxy_to_repository_root.rb +6 -0
  201. data/db/migrate/20190702182118_add_metadata_process_after_to_katello_event.rb +6 -0
  202. data/db/migrate/20190708195809_remove_all_manifest_downloaded.rb +11 -0
  203. data/db/migrate/20190723171639_update_content_view_filters_repositories_join_table.rb +11 -0
  204. data/db/seeds.d/115-http_proxy.rb +25 -0
  205. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details-info.controller.js +15 -0
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +69 -4
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-info.html +39 -0
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion-katello-bootstrap.js +1 -0
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +3 -0
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-repository-sets-modal.controller.js +2 -1
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-errata-modal.html +1 -7
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +26 -0
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-actions.controller.js +14 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-installed.controller.js +77 -0
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs.controller.js +63 -0
  217. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-errata.controller.js +18 -21
  218. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-actions.html +62 -0
  219. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-installed.html +52 -0
  220. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs.html +9 -0
  221. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-errata.html +1 -1
  222. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +21 -1
  223. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -1
  224. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-publish.html +1 -2
  225. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/content-view-version-content.controller.js +1 -1
  226. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-yum.html +4 -4
  227. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host-debs.factory.js +20 -0
  228. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host.factory.js +9 -0
  229. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/http-proxies/http-proxies.module.js +14 -0
  230. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/http-proxies/http-proxy.factory.js +21 -0
  231. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/product-bulk-action.factory.js +2 -1
  232. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/products-bulk-http-proxy-modal.controller.js +77 -0
  233. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/views/products-bulk-http-proxy-modal.html +57 -0
  234. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +25 -3
  235. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +13 -1
  236. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +75 -29
  237. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/http-proxy-service.js +53 -0
  238. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +18 -2
  239. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +42 -16
  240. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +7 -0
  241. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +16 -0
  242. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/views/products.html +6 -0
  243. data/lib/katello.rb +0 -1
  244. data/lib/katello/engine.rb +2 -0
  245. data/lib/katello/permission_creator.rb +7 -2
  246. data/lib/katello/permissions/host_permissions.rb +3 -0
  247. data/lib/katello/plugin.rb +3 -2
  248. data/lib/katello/repository_types/ansible_collection.rb +8 -0
  249. data/lib/katello/repository_types/deb.rb +2 -1
  250. data/lib/katello/repository_types/docker.rb +23 -4
  251. data/lib/katello/repository_types/file.rb +7 -1
  252. data/lib/katello/repository_types/ostree.rb +2 -1
  253. data/lib/katello/repository_types/puppet.rb +2 -1
  254. data/lib/katello/repository_types/yum.rb +3 -2
  255. data/lib/katello/tasks/clean_published_repo_directories.rake +1 -1
  256. data/lib/katello/tasks/delete_orphaned_content.rake +16 -5
  257. data/lib/katello/tasks/jenkins.rake +2 -0
  258. data/lib/katello/tasks/update_content_default_http_proxy.rake +69 -0
  259. data/lib/katello/version.rb +1 -1
  260. data/package.json +10 -22
  261. data/webpack/{move_to_foreman/__mocks__ → __mocks__/foremanJS}/foreman_toast_notifications.js +0 -0
  262. data/webpack/__mocks__/foremanReact/common/helpers.js +3 -6
  263. data/webpack/__mocks__/foremanReact/common/keyCodes.js +8 -0
  264. data/webpack/__mocks__/foremanReact/common/urlHelpers.js +7 -0
  265. data/webpack/__mocks__/foremanReact/components/Settings/SettingsActions.js +4 -0
  266. data/webpack/__mocks__/foremanReact/components/Settings/SettingsConstants.js +2 -0
  267. data/webpack/__mocks__/foremanReact/components/common/Fill/GlobalFill.js +3 -0
  268. data/webpack/__mocks__/foremanReact/components/common/ModalProgressBar.js +8 -0
  269. data/webpack/components/SelectOrg/SetOrganization.js +11 -19
  270. data/webpack/components/WithOrganization/__snapshots__/withOrganization.test.js.snap +1 -3
  271. data/webpack/components/WithOrganization/withOrganization.js +2 -2
  272. data/webpack/components/WithOrganization/withOrganization.test.js +2 -2
  273. data/webpack/components/extensions/about/SystemStatuses.js +55 -0
  274. data/webpack/components/extensions/about/SystemStatusesActions.js +16 -0
  275. data/webpack/components/extensions/about/SystemStatusesConsts.js +3 -0
  276. data/webpack/components/extensions/about/SystemStatusesReducer.js +26 -0
  277. data/webpack/components/extensions/about/SystemStatusesSelectors.js +3 -0
  278. data/webpack/components/extensions/about/__tests__/SystemStatuses.fixtures.js +20 -0
  279. data/webpack/components/extensions/about/__tests__/SystemStatuses.test.js +14 -0
  280. data/webpack/components/extensions/about/__tests__/SystemStatusesReducer.test.js +32 -0
  281. data/webpack/components/extensions/about/__tests__/__snapshots__/SystemStatuses.test.js.snap +156 -0
  282. data/webpack/components/extensions/about/__tests__/__snapshots__/SystemStatusesReducer.test.js.snap +47 -0
  283. data/webpack/components/extensions/about/index.js +19 -0
  284. data/webpack/components/extensions/reducers.js +6 -0
  285. data/webpack/containers/Application/config.js +4 -10
  286. data/webpack/fills_index.js +10 -0
  287. data/webpack/move_to_foreman/common/helpers.js +0 -20
  288. data/webpack/move_to_foreman/components/common/table/components/TableSelectionCell.js +1 -0
  289. data/webpack/move_to_foreman/components/common/table/formatters/EntitlementsInlineEditFormatter.js +3 -3
  290. data/webpack/move_to_pf/LoadingState/LoadingState.js +1 -0
  291. data/webpack/move_to_pf/OptionTooltip/OptionTooltip.scss +2 -1
  292. data/webpack/move_to_pf/TypeAhead/TypeAhead.js +3 -4
  293. data/webpack/redux/actions/RedHatRepositories/helpers.js +6 -1
  294. data/webpack/redux/reducers/index.js +2 -0
  295. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailInfo.js +1 -0
  296. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +1 -0
  297. data/webpack/scenes/ModuleStreams/Details/Profiles/TableSchema.js +1 -0
  298. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ProfileRpmsCellFormatter.test.js +0 -2
  299. data/webpack/scenes/ModuleStreams/Details/Repositories/TableSchema.js +3 -2
  300. data/webpack/scenes/ModuleStreams/Details/index.js +1 -1
  301. data/webpack/scenes/ModuleStreams/ModuleStreamsPage.js +2 -0
  302. data/webpack/scenes/ModuleStreams/ModuleStreamsTable.js +2 -0
  303. data/webpack/scenes/ModuleStreams/ModuleStreamsTableSchema.js +3 -2
  304. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -1
  305. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -1
  306. data/webpack/scenes/ModuleStreams/index.js +1 -1
  307. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -3
  308. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +1 -0
  309. data/webpack/scenes/RedHatRepositories/components/RecommendedRepositorySetsToggler.js +1 -0
  310. data/webpack/scenes/RedHatRepositories/components/RecommendedRepositorySetsToggler.scss +1 -1
  311. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -0
  312. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepository/RepositorySetRepository.js +3 -4
  313. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepository/__test__/RepositorySetRepository.test.js +0 -2
  314. data/webpack/scenes/RedHatRepositories/components/SearchBar.js +1 -0
  315. data/webpack/scenes/RedHatRepositories/helpers.js +1 -1
  316. data/webpack/scenes/RedHatRepositories/index.js +3 -2
  317. data/webpack/scenes/RedHatRepositories/index.scss +1 -1
  318. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailAssociations.js +3 -3
  319. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProductContent.js +1 -0
  320. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProducts.js +1 -0
  321. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +1 -2
  322. data/webpack/scenes/Subscriptions/Details/__tests__/SubscriptionDetails.test.js +0 -1
  323. data/webpack/scenes/Subscriptions/Details/index.js +1 -1
  324. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +1 -0
  325. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManageManifestModal.test.js +1 -2
  326. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +1 -1
  327. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +3 -2
  328. data/webpack/scenes/Subscriptions/SubscriptionsPage.scss +1 -2
  329. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +9 -9
  330. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsTableSchema.js +2 -2
  331. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  332. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/index.js +1 -1
  333. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +1 -2
  334. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsReducer.test.js +2 -1
  335. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +2 -1
  336. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionTypeFormatter.js +3 -2
  337. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTable.js +1 -0
  338. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +3 -2
  339. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +1 -1
  340. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/DeleteDialog.js +1 -1
  341. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/InputsErrorsDialog.js +1 -0
  342. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/UnsavedChangesDialog.js +1 -0
  343. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/UpdateDialog.js +1 -1
  344. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +1 -0
  345. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +1 -0
  346. data/webpack/scenes/Subscriptions/index.js +1 -1
  347. data/webpack/scenes/Tasks/helpers.js +5 -6
  348. metadata +161 -20
  349. data/app/lib/actions/katello/repository/clear.rb +0 -11
  350. data/app/views/overrides/about/_system_status.html.erb +0 -19
  351. data/webpack/move_to_foreman/Settings/SettingsActions.js +0 -28
  352. data/webpack/move_to_foreman/Settings/SettingsConstants.js +0 -3
  353. data/webpack/move_to_foreman/Settings/__tests__/SettingsActions.test.js +0 -41
  354. data/webpack/move_to_foreman/Settings/__tests__/settings.fixtures.js +0 -34
  355. data/webpack/move_to_foreman/components/common/ModalProgressBar/ModalProgressBar.js +0 -48
  356. data/webpack/move_to_foreman/components/common/ModalProgressBar/ModalProgressBar.scss +0 -15
  357. data/webpack/move_to_foreman/components/common/ModalProgressBar/__tests__/ModalProgressBar.test.js +0 -22
  358. data/webpack/move_to_foreman/components/common/ModalProgressBar/__tests__/__snapshots__/ModalProgressBar.test.js.snap +0 -60
  359. data/webpack/move_to_foreman/components/common/ModalProgressBar/index.js +0 -4
  360. data/webpack/move_to_foreman/foreman_toast_notifications.js +0 -22
@@ -18,7 +18,6 @@ module Katello
18
18
  CDN_DOCKER_CONTAINER_LISTING = "CONTAINER_REGISTRY_LISTING".freeze
19
19
 
20
20
  attr_reader :url, :product, :options
21
- attr_accessor :proxy_host, :proxy_port, :proxy_user, :proxy_password
22
21
 
23
22
  def substitutor(logger = nil)
24
23
  @logger = logger
@@ -39,7 +38,6 @@ module Katello
39
38
  options.reverse_merge!(:cert_store => store)
40
39
  end
41
40
 
42
- load_proxy_settings
43
41
  @product = options[:product]
44
42
 
45
43
  @url = url
@@ -137,25 +135,14 @@ module Katello
137
135
  end
138
136
 
139
137
  def net_http_class
140
- if proxy_host
141
- Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_password)
138
+ if (proxy = ::HttpProxy.default_global_content_proxy)
139
+ uri = URI(proxy.url) #Net::HTTP::Proxy ignores port as part of the url
140
+ Net::HTTP::Proxy("#{uri.host}#{uri.path}", uri.port, proxy.username, proxy.password)
142
141
  else
143
142
  Net::HTTP
144
143
  end
145
144
  end
146
145
 
147
- def load_proxy_settings
148
- if SETTINGS[:katello][:cdn_proxy] && SETTINGS[:katello][:cdn_proxy][:host]
149
- self.proxy_host = parse_host(SETTINGS[:katello][:cdn_proxy][:host])
150
- self.proxy_port = SETTINGS[:katello][:cdn_proxy][:port]
151
- self.proxy_user = SETTINGS[:katello][:cdn_proxy][:user]
152
- self.proxy_password = SETTINGS[:katello][:cdn_proxy][:password]
153
- end
154
- rescue URI::Error => e
155
- Rails.logger.error "Could not parse cdn_proxy:"
156
- Rails.logger.error e.to_s
157
- end
158
-
159
146
  def parse_host(host_or_url)
160
147
  uri = URI.parse(host_or_url)
161
148
  return uri.host || uri.path
@@ -68,9 +68,6 @@ module Katello
68
68
  futures.each do |future|
69
69
  begin
70
70
  resolved << future.value
71
- rescue StandardError => e
72
- Rails.logger.error("Error Recieved: #{e.to_s}")
73
- Rails.logger.error("Error Recieved: #{e.backtrace.join("\n")}")
74
71
  end
75
72
  end
76
73
 
@@ -6,34 +6,34 @@ module Katello
6
6
  def proxy_uri
7
7
  #Reset the scheme to proxy(s) based on http or https to handle cgi unescaping in rest-client
8
8
  # this relies on katello/util/proxy_uri
9
- if proxy_host
9
+ if proxy
10
10
  scheme = 'proxy' if proxy_scheme == 'http'
11
11
  scheme = 'proxys' if proxy_scheme == 'https'
12
12
 
13
13
  uri = URI("#{scheme}://#{proxy_host}:#{proxy_port}")
14
- if proxy_config && proxy_config[:user]
15
- uri.user = CGI.escape(proxy_config[:user])
16
- uri.password = CGI.escape(proxy_config[:password])
14
+ if proxy && proxy.username.present?
15
+ uri.user = CGI.escape(proxy.username)
16
+ uri.password = CGI.escape(proxy.password)
17
17
  end
18
18
 
19
19
  uri.to_s
20
20
  end
21
21
  end
22
22
 
23
- def proxy_config
24
- SETTINGS[:katello][:cdn_proxy]
23
+ def proxy
24
+ ::HttpProxy.default_global_content_proxy
25
25
  end
26
26
 
27
27
  def proxy_host
28
- proxy_config && URI.parse(proxy_config[:host]).host
28
+ URI(proxy.url).host
29
29
  end
30
30
 
31
31
  def proxy_scheme
32
- proxy_config && URI.parse(proxy_config[:host]).scheme
32
+ URI(proxy.url).scheme
33
33
  end
34
34
 
35
35
  def proxy_port
36
- proxy_config && proxy_config[:port]
36
+ URI(proxy.url).port
37
37
  end
38
38
  end # HttpProxy
39
39
  end # Util
@@ -11,7 +11,7 @@ module Katello
11
11
  return unless hostgroup.kickstart_repository_id
12
12
 
13
13
  msg = if hostgroup.content_source.blank?
14
- hostgroup.errors.add(:base, _("Please select a content source before assigning a kickstart repository"))
14
+ _("Please select a content source before assigning a kickstart repository")
15
15
  elsif hostgroup.operatingsystem.blank?
16
16
  _("Please select an operating system before assigning a kickstart repository")
17
17
  elsif !hostgroup.operatingsystem.is_a?(Redhat)
@@ -22,10 +22,15 @@ module Katello
22
22
  has_many :subscription_facet_activation_keys, :class_name => "Katello::SubscriptionFacetActivationKey", :dependent => :destroy
23
23
  has_many :subscription_facets, :through => :subscription_facet_activation_keys
24
24
 
25
+ has_many :activation_key_purpose_addons, :class_name => "Katello::ActivationKeyPurposeAddon", :dependent => :destroy, :inverse_of => :activation_key
26
+ has_many :purpose_addons, :class_name => "Katello::PurposeAddon", :through => :activation_key_purpose_addons
27
+
25
28
  alias_method :lifecycle_environment, :environment
26
29
 
27
30
  before_validation :set_default_content_view, :unless => :persisted?
28
31
 
32
+ accepts_nested_attributes_for :purpose_addons
33
+
29
34
  validates_lengths_from_database
30
35
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
31
36
  validates :name, :presence => true
@@ -61,6 +66,9 @@ module Katello
61
66
  scoped_search :on => :name, :relation => :subscriptions, :rename => :subscription_name, :complete_value => true, :ext_method => :find_by_subscription_name
62
67
  scoped_search :on => :id, :relation => :subscriptions, :rename => :subscription_id, :complete_value => true,
63
68
  :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER, :ext_method => :find_by_subscription_id
69
+ scoped_search :on => :purpose_usage, :rename => :usage, :complete_value => true
70
+ scoped_search :on => :purpose_role, :rename => :role, :complete_value => true
71
+ scoped_search :on => :name, :rename => :addon, :relation => :purpose_addon, :complete_value => true, :ext_method => :find_by_purpose_addons
64
72
 
65
73
  def environment_exists
66
74
  if environment_id && environment.nil?
@@ -162,6 +170,12 @@ module Katello
162
170
  end
163
171
  end
164
172
 
173
+ def self.find_by_purpose_addons(_key, operator, value)
174
+ conditions = sanitize_sql_for_conditions(["#{Katello::PurposeAddon.table_name}.name #{operator} ?", value_to_sql(operator, value)])
175
+ activation_keys = ::Katello::ActivationKey.joins(:purpose_addons).where(conditions)
176
+ return_activation_keys_by_id(activation_keys.pluck(:id))
177
+ end
178
+
165
179
  private
166
180
 
167
181
  def set_default_content_view
@@ -0,0 +1,6 @@
1
+ module Katello
2
+ class ActivationKeyPurposeAddon < Katello::Model
3
+ belongs_to :activation_key, inverse_of: :activation_key_purpose_addons, class_name: 'Katello::ActivationKey'
4
+ belongs_to :purpose_addon, inverse_of: :activation_key_purpose_addons, class_name: 'Katello::PurposeAddon'
5
+ end
6
+ end
@@ -0,0 +1,32 @@
1
+ module Katello
2
+ class AnsibleCollection < ApplicationRecord
3
+ include Concerns::PulpDatabaseUnit
4
+
5
+ self.table_name = 'katello_ansible_collections'
6
+
7
+ CONTENT_TYPE = 'ansible collection'.freeze
8
+
9
+ has_many :repository_ansible_collections, :class_name => "Katello::RepositoryAnsibleCollection", :dependent => :destroy, :inverse_of => :ansible_collection, :foreign_key => :ansible_collection_id
10
+ has_many :repositories, :through => :repository_ansible_collections, :class_name => "Katello::Repository"
11
+
12
+ scoped_search :on => :name, :complete_value => true
13
+ scoped_search :on => :namespace, :complete_value => true
14
+ scoped_search :on => :version, :complete_value => true
15
+
16
+ def self.default_sort
17
+ order(:name)
18
+ end
19
+
20
+ def self.repository_association_class
21
+ RepositoryAnsibleCollection
22
+ end
23
+
24
+ def self.unit_id_field
25
+ 'ansible_collection_id'
26
+ end
27
+
28
+ def self.total_for_repositories(repos)
29
+ self.in_repositories(repos).count
30
+ end
31
+ end
32
+ end
@@ -123,7 +123,7 @@ module Katello
123
123
 
124
124
  def download_policy
125
125
  if katello_content_type == Repository::YUM_TYPE
126
- Setting[:default_download_policy]
126
+ Setting[:default_redhat_download_policy]
127
127
  else
128
128
  ""
129
129
  end
@@ -39,6 +39,8 @@ module Katello
39
39
  has_many :host_available_module_streams, :class_name => "::Katello::HostAvailableModuleStream", :foreign_key => :host_id, :dependent => :delete_all
40
40
  has_many :available_module_streams, :class_name => "::Katello::AvailableModuleStream", :through => :host_available_module_streams
41
41
 
42
+ has_many :host_installed_debs, :class_name => "::Katello::HostInstalledDeb", :foreign_key => :host_id, :dependent => :delete_all
43
+ has_many :installed_debs, :class_name => "::Katello::InstalledDeb", :through => :host_installed_debs
42
44
  has_many :host_traces, :class_name => "::Katello::HostTracer", :foreign_key => :host_id, :dependent => :destroy
43
45
 
44
46
  has_many :host_collection_hosts, :class_name => "::Katello::HostCollectionHosts", :foreign_key => :host_id, :dependent => :destroy
@@ -55,6 +57,7 @@ module Katello
55
57
  scoped_search :relation => :installed_packages, :on => :name, :complete_value => true, :rename => :installed_package_name, :only_explicit => true
56
58
  scoped_search :relation => :available_module_streams, :on => :name, :complete_value => true, :rename => :available_module_stream_name, :only_explicit => true
57
59
  scoped_search :relation => :available_module_streams, :on => :stream, :complete_value => true, :rename => :available_module_stream_stream, :only_explicit => true
60
+ scoped_search :relation => :installed_debs, :on => :name, :complete_value => true, :rename => :installed_package_name, :only_explicit => true
58
61
  scoped_search :relation => :host_traces, :on => :application, :complete_value => true, :rename => :trace_app, :only_explicit => true
59
62
  scoped_search :relation => :host_traces, :on => :app_type, :complete_value => true, :rename => :trace_app_type, :only_explicit => true
60
63
  scoped_search :relation => :host_traces, :on => :helper, :complete_value => true, :rename => :trace_helper, :only_explicit => true
@@ -0,0 +1,60 @@
1
+ module Katello
2
+ module Concerns
3
+ module HttpProxyExtensions
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_many :root_repositories, :class_name => "::Katello::RootRepository", :foreign_key => :http_proxy_id,
8
+ :inverse_of => :http_proxy, :dependent => :nullify
9
+ after_update :update_default_proxy_setting
10
+ after_commit :update_repository_proxy_details
11
+
12
+ def self.default_global_content_proxy
13
+ if Setting[:content_default_http_proxy]
14
+ HttpProxy.unscoped.find_by(name: Setting[:content_default_http_proxy])
15
+ end
16
+ end
17
+ end
18
+
19
+ def update_default_proxy_setting
20
+ changes = self.previous_changes
21
+ if changes.key?(:name)
22
+ previous_name = changes[:name].first
23
+ setting = Setting.find_by(name: 'content_default_http_proxy')
24
+
25
+ if setting && setting.value == previous_name && !previous_name.blank?
26
+ setting.update_attribute(:value, self.name)
27
+ end
28
+ end
29
+ end
30
+
31
+ def update_repository_proxy_details
32
+ changes = self.previous_changes
33
+ if changes.key?(:url) || changes.key?(:username) || changes.key?(:password)
34
+
35
+ root_repos = RootRepository.with_selected_proxy(id)
36
+
37
+ if self == HttpProxy.default_global_content_proxy
38
+ root_repos += RootRepository.with_global_proxy
39
+ end
40
+
41
+ repos = root_repos.uniq.collect(&:library_instance)
42
+
43
+ unless repos.empty?
44
+ ForemanTasks.async_task(
45
+ ::Actions::BulkAction,
46
+ ::Actions::Katello::Repository::UpdateHttpProxyDetails,
47
+ repos.sort_by(&:pulp_id))
48
+ end
49
+ end
50
+ end
51
+
52
+ def name_and_url
53
+ uri = URI(url)
54
+ uri.password = nil
55
+ uri.user = nil
56
+ "#{name} (#{uri})"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -7,6 +7,7 @@ module Katello
7
7
  after_initialize :set_default_overrides, :if => :new_record?
8
8
  after_save :reset_settings
9
9
  before_destroy :assert_deletable
10
+ after_create :associate_default_http_proxy
10
11
  end
11
12
 
12
13
  def set_default_overrides
@@ -58,6 +59,13 @@ module Katello
58
59
  end
59
60
  end
60
61
 
62
+ def associate_default_http_proxy
63
+ if (default_proxy = ::HttpProxy.default_global_content_proxy)
64
+ default_proxy.locations << self
65
+ default_proxy.save
66
+ end
67
+ end
68
+
61
69
  module ClassMethods
62
70
  def default_puppet_content_location
63
71
  ::Location.unscoped.find_by_title(::Setting[:default_location_puppet_content]) if ::Setting[:default_location_puppet_content].present?
@@ -41,6 +41,8 @@ module Katello
41
41
  scoped_search :on => :label, :complete_value => :true
42
42
 
43
43
  after_create :associate_default_capsule
44
+ after_create :associate_default_http_proxy
45
+
44
46
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
45
47
  validates :label, :uniqueness => true
46
48
 
@@ -96,6 +98,13 @@ module Katello
96
98
  smart_proxy.organizations << self if smart_proxy
97
99
  end
98
100
 
101
+ def associate_default_http_proxy
102
+ if (default_proxy = ::HttpProxy.default_global_content_proxy)
103
+ default_proxy.organizations << self
104
+ default_proxy.save
105
+ end
106
+ end
107
+
99
108
  def create_anonymous_provider
100
109
  self.providers << Katello::Provider.new(:name => Katello::Provider::ANONYMOUS, :provider_type => Katello::Provider::ANONYMOUS)
101
110
  end
@@ -24,7 +24,7 @@ module Katello
24
24
  "::Katello::Pulp::#{self.name.demodulize}".constantize
25
25
  end
26
26
 
27
- def manage_repository_association
27
+ def many_repository_associations
28
28
  true
29
29
  end
30
30
 
@@ -44,7 +44,7 @@ module Katello
44
44
  end
45
45
 
46
46
  def in_repositories(repos)
47
- if manage_repository_association
47
+ if many_repository_associations
48
48
  where(:id => repository_association_class.where(:repository_id => repos).select(unit_id_field))
49
49
  else
50
50
  where(:repository_id => repos)
@@ -55,85 +55,55 @@ module Katello
55
55
  content_unit_class.new(pulp_id)
56
56
  end
57
57
 
58
- # Import all units of a single type and refresh their repository associations
59
- def import_all(pulp_ids = nil, options = {})
60
- index_repository_association = options.fetch(:index_repository_association, true) && self.manage_repository_association
61
- service_class = SmartProxy.pulp_master!.content_service(content_type)
58
+ def unit_id_field
59
+ "#{self.name.demodulize.underscore}_id"
60
+ end
62
61
 
63
- process_block = lambda do |units|
62
+ def import_all(pulp_ids = nil, repository = nil)
63
+ ids_to_associate = []
64
+ service_class = SmartProxy.pulp_master!.content_service(content_type)
65
+ service_class.pulp_units_batch_all(pulp_ids).each do |units|
64
66
  units.each do |unit|
65
67
  unit = unit.with_indifferent_access
66
68
  model = Katello::Util::Support.active_record_retry do
67
- self.where(:pulp_id => unit['_id']).first_or_create
69
+ self.where(:pulp_id => unit[service_class.unit_identifier]).first_or_create
68
70
  end
69
-
70
71
  service = service_class.new(model.pulp_id)
71
72
  service.backend_data = unit
72
73
  service.update_model(model)
74
+ ids_to_associate << model.pulp_id
73
75
  end
74
- if index_repository_association
75
- units.map { |unit| unit.slice('_id', 'repository_memberships') }
76
- else
77
- units.count
78
- end
79
- end
80
-
81
- if pulp_ids
82
- results = content_unit_class.fetch_by_uuids(pulp_ids, &process_block).flatten
83
- update_repository_associations(results, true) if index_repository_association
84
- else
85
- results = content_unit_class.fetch_all(&process_block).flatten
86
- update_repository_associations(results) if index_repository_association
87
- end
88
- end
89
-
90
- def import_for_repository(repository, force = false)
91
- ids = content_unit_class.ids_for_repository(repository.pulp_id)
92
- # Rpms cannot change in Pulp so we do not index them if they are already present
93
- # in our database. Errata and Package Groups can change in Pulp, so we index
94
- # all of them in the repository on each sync.
95
- if immutable_unit_types.include?(self) && !force
96
- ids_to_import = ids - repository.rpms.map(&:pulp_id)
97
- else
98
- ids_to_import = ids
99
76
  end
100
- self.import_all(ids_to_import, :index_repository_association => false) if repository.content_view.default? || force
101
- self.sync_repository_associations(repository, :pulp_ids => ids) if self.manage_repository_association
102
- end
103
-
104
- def unit_id_field
105
- "#{self.name.demodulize.underscore}_id"
77
+ sync_repository_associations(repository, :pulp_ids => ids_to_associate, :additive => true) if self.many_repository_associations && repository && ids_to_associate.present?
106
78
  end
107
79
 
108
- def copy_repository_associations(source_repo, dest_repo)
109
- if manage_repository_association
110
- delete_query = "delete from #{repository_association_class.table_name} where repository_id = #{dest_repo.id} and
111
- #{unit_id_field} not in (select #{unit_id_field} from #{repository_association_class.table_name} where repository_id = #{source_repo.id})"
112
-
113
- insert_query = "insert into #{repository_association_class.table_name} (repository_id, #{unit_id_field})
114
- select #{dest_repo.id} as repository_id, #{unit_id_field} from #{repository_association_class.table_name}
115
- where repository_id = #{source_repo.id} and #{unit_id_field} not in (select #{unit_id_field}
116
- from #{repository_association_class.table_name} where repository_id = #{dest_repo.id})"
117
- else
118
- columns = column_names - ["id", "pulp_id", "created_at", "updated_at", "repository_id"]
119
-
120
- delete_query = "delete from #{self.table_name} where repository_id = #{dest_repo.id} and
121
- pulp_id not in (select pulp_id from #{self.table_name} where repository_id = #{source_repo.id})"
122
- insert_query = "insert into #{self.table_name} (repository_id, pulp_id, #{columns.join(',')})
123
- select #{dest_repo.id} as repository_id, pulp_id, #{columns.join(',')} from #{self.table_name}
124
- where repository_id = #{source_repo.id} and pulp_id not in (select pulp_id
125
- from #{self.table_name} where repository_id = #{dest_repo.id})"
80
+ def import_for_repository(repository)
81
+ pulp_ids = []
82
+ service_class = SmartProxy.pulp_master!.content_service(content_type)
83
+ fetch_only_ids = !repository.content_view.default?
126
84
 
85
+ service_class.pulp_units_batch_for_repo(repository, fetch_identifiers: fetch_only_ids).each do |units|
86
+ units.each do |unit|
87
+ unit = unit.with_indifferent_access
88
+ pulp_id = unit[service_class.unit_identifier]
89
+ unless fetch_only_ids
90
+ model = Katello::Util::Support.active_record_retry do
91
+ self.where(:pulp_id => pulp_id).first_or_create
92
+ end
93
+ service = service_class.new(model.pulp_id)
94
+ service.backend_data = unit
95
+ model.repository_id = repository.id unless many_repository_associations
96
+ service.update_model(model)
97
+ end
98
+ pulp_ids << pulp_id
99
+ end
127
100
  end
128
- ActiveRecord::Base.connection.execute(delete_query)
129
- ActiveRecord::Base.connection.execute(insert_query)
101
+ sync_repository_associations(repository, :pulp_ids => pulp_ids) if self.many_repository_associations
130
102
  end
131
103
 
132
104
  def sync_repository_associations(repository, options = {})
133
105
  additive = options.fetch(:additive, false)
134
- associated_ids = options.fetch(:ids, nil)
135
- pulp_ids = options.fetch(:pulp_ids) if associated_ids.nil?
136
-
106
+ pulp_ids = options.fetch(:pulp_ids)
137
107
  associated_ids = with_pulp_id(pulp_ids).pluck(:id) if pulp_ids
138
108
 
139
109
  table_name = self.repository_association_class.table_name
@@ -163,27 +133,32 @@ module Katello
163
133
  end
164
134
  end
165
135
 
166
- def with_pulp_id(unit_pulp_ids)
167
- where(:pulp_id => unit_pulp_ids)
168
- end
136
+ def copy_repository_associations(source_repo, dest_repo)
137
+ if many_repository_associations
138
+ delete_query = "delete from #{repository_association_class.table_name} where repository_id = #{dest_repo.id} and
139
+ #{unit_id_field} not in (select #{unit_id_field} from #{repository_association_class.table_name} where repository_id = #{source_repo.id})"
169
140
 
170
- def update_repository_associations(units_json, additive = false)
171
- ActiveRecord::Base.transaction do
172
- repo_unit_id = {}
173
- repo_cache = {}
174
- units_json.each do |unit_json|
175
- unit_json['repository_memberships'].each do |repo_pulp_id|
176
- if (repo_cache[repo_pulp_id] ||= Repository.exists?(:pulp_id => repo_pulp_id))
177
- repo_unit_id[repo_pulp_id] ||= []
178
- repo_unit_id[repo_pulp_id] << unit_json['_id']
179
- end
180
- end
181
- end
141
+ insert_query = "insert into #{repository_association_class.table_name} (repository_id, #{unit_id_field})
142
+ select #{dest_repo.id} as repository_id, #{unit_id_field} from #{repository_association_class.table_name}
143
+ where repository_id = #{source_repo.id} and #{unit_id_field} not in (select #{unit_id_field}
144
+ from #{repository_association_class.table_name} where repository_id = #{dest_repo.id})"
145
+ else
146
+ columns = column_names - ["id", "pulp_id", "created_at", "updated_at", "repository_id"]
147
+
148
+ delete_query = "delete from #{self.table_name} where repository_id = #{dest_repo.id} and
149
+ pulp_id not in (select pulp_id from #{self.table_name} where repository_id = #{source_repo.id})"
150
+ insert_query = "insert into #{self.table_name} (repository_id, pulp_id, #{columns.join(',')})
151
+ select #{dest_repo.id} as repository_id, pulp_id, #{columns.join(',')} from #{self.table_name}
152
+ where repository_id = #{source_repo.id} and pulp_id not in (select pulp_id
153
+ from #{self.table_name} where repository_id = #{dest_repo.id})"
182
154
 
183
- repo_unit_id.each do |repo_pulp_id, unit_pulp_ids|
184
- sync_repository_associations(Repository.find_by(:pulp_id => repo_pulp_id), :pulp_ids => unit_pulp_ids, :additive => additive)
185
- end
186
155
  end
156
+ ActiveRecord::Base.connection.execute(delete_query)
157
+ ActiveRecord::Base.connection.execute(insert_query)
158
+ end
159
+
160
+ def with_pulp_id(unit_pulp_ids)
161
+ where('pulp_id in (?)', unit_pulp_ids)
187
162
  end
188
163
  end
189
164
  end