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
@@ -8,11 +8,25 @@ module Katello
8
8
  if: ->(setting) { setting.name == 'default_download_policy' }
9
9
 
10
10
  after_save :recalculate_errata_status
11
+ after_commit :update_global_proxies
11
12
  end
12
13
 
13
14
  def recalculate_errata_status
14
15
  ForemanTasks.async_task(Actions::Katello::Host::RecalculateErrataStatus) if saved_change_to_attribute?(:value) && name == 'errata_status_installable'
15
16
  end
17
+
18
+ def update_global_proxies
19
+ if saved_change_to_attribute?(:value) && name == 'content_default_http_proxy'
20
+ repos = RootRepository.with_global_proxy.collect(&:library_instance).uniq
21
+
22
+ unless repos.empty?
23
+ ForemanTasks.async_task(
24
+ ::Actions::BulkAction,
25
+ ::Actions::Katello::Repository::UpdateHttpProxyDetails,
26
+ repos.sort_by(&:pulp_id))
27
+ end
28
+ end
29
+ end
16
30
  end
17
31
  end
18
32
  end
@@ -1,6 +1,7 @@
1
1
  require 'proxy_api'
2
2
  require 'proxy_api/pulp'
3
3
  require 'proxy_api/pulp_node'
4
+
4
5
  module Katello
5
6
  module Concerns
6
7
  module SmartProxyExtensions
@@ -14,6 +15,7 @@ module Katello
14
15
  end
15
16
  end
16
17
 
18
+ PULP3_FEATURE = "Pulp3".freeze
17
19
  PULP_FEATURE = "Pulp".freeze
18
20
  PULP_NODE_FEATURE = "Pulp Node".freeze
19
21
 
@@ -113,16 +115,15 @@ module Katello
113
115
  @pulp_api ||= Katello::Pulp::Server.config(pulp_url, User.remote_user)
114
116
  end
115
117
 
116
- def pulp3_api
117
- config = Zest::Configuration.new
118
- config.host = pulp3_host!
119
- config.username = 'admin'
120
- config.password = 'password'
121
- config.debugging = true
122
- config.logger = ::Foreman::Logging.logger('katello/pulp_rest')
123
- client = Zest::PulpApi.new
124
- client.api_client.config = config
125
- client
118
+ def pulp3_configuration(config_class)
119
+ config_class.new do |config|
120
+ config.host = pulp3_host!
121
+ config.scheme = 'https'
122
+ config.username = 'admin'
123
+ config.password = 'password'
124
+ config.debugging = true
125
+ config.logger = ::Foreman::Logging.logger('katello/pulp_rest')
126
+ end
126
127
  end
127
128
 
128
129
  def backend_service_type(repository)
@@ -133,17 +134,32 @@ module Katello
133
134
  end
134
135
  end
135
136
 
137
+ def pulp3_enabled?
138
+ self.has_feature? PULP3_FEATURE
139
+ end
140
+
136
141
  def pulp3_support?(repository)
137
142
  type = Katello::RepositoryTypeManager.repository_types[repository.content_type]
138
143
  type.pulp3_plugin && self.capabilities('Pulp3').try(:include?, type.pulp3_plugin)
139
144
  end
140
145
 
146
+ def content_pulp3_support?(content_type)
147
+ content_type = content_type.is_a?(String) ? content_type : content_type.model_class::CONTENT_TYPE
148
+ type = Katello::RepositoryTypeManager.find_repository_type content_type
149
+ type.pulp3_plugin && SmartProxy.pulp_master!.capabilities('Pulp3').try(:include?, type.pulp3_plugin)
150
+ end
151
+
141
152
  def pulp3_host!
142
153
  url = self.setting('Pulp3', 'pulp_url')
143
154
  fail "Cannot determine pulp3 url, check smart proxy configuration" unless url
144
155
  URI.parse(url).host
145
156
  end
146
157
 
158
+ def pulp3_url(path = nil)
159
+ pulp_url = self.setting('Pulp3', 'pulp_url')
160
+ path.blank? ? pulp_url : "#{pulp_url.sub(%r|/$|, '')}/#{path.sub(%r|^/|, '')}"
161
+ end
162
+
147
163
  def pulp_mirror?
148
164
  self.has_feature? PULP_NODE_FEATURE
149
165
  end
@@ -177,7 +193,7 @@ module Katello
177
193
  end
178
194
 
179
195
  #this will rely on smart proxy capabilities when available
180
- content_type.pulp2_service_class
196
+ content_pulp3_support?(content_type) ? content_type.pulp3_service_class : content_type.pulp2_service_class
181
197
  end
182
198
 
183
199
  def set_default_download_policy
@@ -34,6 +34,7 @@ module Katello
34
34
 
35
35
  has_many :activation_keys, :through => :subscription_facet
36
36
  has_many :pools, :through => :subscription_facet
37
+ has_many :purpose_addons, :through => :subscription_facet
37
38
  has_many :subscriptions, :through => :pools
38
39
  has_one :subscription_status_object, :class_name => 'Katello::SubscriptionStatus', :foreign_key => 'host_id', :dependent => :destroy
39
40
  has_one :purpose_sla_status_object, :class_name => 'Katello::PurposeSlaStatus', :foreign_key => 'host_id', :dependent => :destroy
@@ -68,7 +69,7 @@ module Katello
68
69
  scoped_search :on => :id, :relation => :pools, :rename => :subscription_id, :complete_value => true, :ext_method => :find_by_subscription_id, :only_explicit => true
69
70
  scoped_search :on => :purpose_role, :rename => :role, :relation => :subscription_facet, :complete_value => true
70
71
  scoped_search :on => :purpose_usage, :rename => :usage, :relation => :subscription_facet, :complete_value => true
71
- scoped_search :on => :purpose_addons, :rename => :addon, :relation => :subscription_facet, :complete_value => true
72
+ scoped_search :on => :name, :rename => :addon, :relation => :purpose_addons, :complete_value => true, :ext_method => :find_by_purpose_addon
72
73
  end
73
74
 
74
75
  module ClassMethods
@@ -76,6 +77,12 @@ module Katello
76
77
  ::Katello::PurposeStatus.status_map
77
78
  end
78
79
 
80
+ def find_by_purpose_addon(_key, operator, value)
81
+ conditions = sanitize_sql_for_conditions(["#{Katello::PurposeAddon.table_name}.name #{operator} ?", value_to_sql(operator, value)])
82
+ hosts = ::Host::Managed.joins(:purpose_addons).where(conditions)
83
+ return_hosts(hosts)
84
+ end
85
+
79
86
  def find_by_activation_key(_key, operator, value)
80
87
  conditions = sanitize_sql_for_conditions(["#{Katello::ActivationKey.table_name}.name #{operator} ?", value_to_sql(operator, value)])
81
88
  hosts = ::Host::Managed.joins(:activation_keys).where(conditions)
@@ -318,6 +318,10 @@ module Katello
318
318
  components.select { |component| component.repositories.where(:library_instance => library_instance).any? }
319
319
  end
320
320
 
321
+ def auto_publish_components
322
+ component_composites.where(latest: true).joins(:composite_content_view).where(self.class.table_name => {auto_publish: true})
323
+ end
324
+
321
325
  def publish_repositories
322
326
  repositories = composite? ? repositories_to_publish_by_library_instance.values : repositories_to_publish
323
327
  repositories.each do |repos|
@@ -13,12 +13,8 @@ module Katello
13
13
  :class_name => "Katello::ContentView",
14
14
  :inverse_of => :filters
15
15
 
16
- # rubocop:disable HasAndBelongsToMany
17
- # TODO: change these into has_many :through associations
18
- has_and_belongs_to_many :repositories,
19
- :uniq => true,
20
- :class_name => "Katello::Repository",
21
- :join_table => :katello_content_view_filters_repositories
16
+ has_many :repository_content_view_filters, :class_name => "Katello::RepositoryContentViewFilter", :dependent => :delete_all, :inverse_of => :filter, :foreign_key => :content_view_filter_id
17
+ has_many :repositories, :through => :repository_content_view_filters, :class_name => "Katello::Repository"
22
18
 
23
19
  validates_lengths_from_database
24
20
  validate :validate_content_view
@@ -124,8 +120,8 @@ module Katello
124
120
  end
125
121
 
126
122
  def self.applicable(repo)
127
- query = %{ (katello_content_view_filters.id in (select content_view_filter_id from katello_content_view_filters_repositories where repository_id = #{repo.id})) or
128
- (katello_content_view_filters.id not in (select content_view_filter_id from katello_content_view_filters_repositories))
123
+ query = %{ (katello_content_view_filters.id in (select content_view_filter_id from katello_repository_content_view_filters where repository_id = #{repo.id})) or
124
+ (katello_content_view_filters.id not in (select content_view_filter_id from katello_repository_content_view_filters))
129
125
  }
130
126
  where(query).select("DISTINCT katello_content_view_filters.id")
131
127
  end
@@ -48,10 +48,16 @@ module Katello
48
48
  where(:id => ids)
49
49
  end
50
50
 
51
- def self.import_all(pulp_ids = nil, options = {})
52
- ::Katello::DockerTag.destroy_all if pulp_ids.blank?
53
- super
54
- ::Katello::DockerTag.where(:repository_id => nil).destroy_all
51
+ def self.import_for_repository(repository)
52
+ self.where(:repository_id => repository).destroy_all
53
+ super(repository)
54
+ pulp_ids = self.where(:repository_id => repository.id).pluck(:pulp_id)
55
+ import_all(pulp_ids) unless pulp_ids.blank?
56
+ end
57
+
58
+ def self.import_all(pulp_ids = nil)
59
+ self.destroy_all if pulp_ids.blank?
60
+ self.where(:repository_id => nil).destroy_all
55
61
  if pulp_ids
56
62
  repos = ::Katello::Repository.joins(:docker_tags).where("katello_docker_tags.pulp_id" => pulp_ids).distinct
57
63
  ::Katello::DockerMetaTag.import_meta_tags(repos)
@@ -60,12 +66,7 @@ module Katello
60
66
  end
61
67
  end
62
68
 
63
- def self.import_for_repository(repository, _force)
64
- ::Katello::DockerTag.where(:repository_id => repository).destroy_all
65
- super(repository, true)
66
- end
67
-
68
- def self.manage_repository_association
69
+ def self.many_repository_associations
69
70
  false
70
71
  end
71
72
 
@@ -34,6 +34,14 @@ module Katello
34
34
  scoped_search :relation => :packages, :on => :nvrea, :rename => :package, :complete_value => true, :only_explicit => true
35
35
  scoped_search :relation => :packages, :on => :name, :rename => :package_name, :complete_value => true, :only_explicit => true
36
36
 
37
+ scoped_search :on => :modular,
38
+ :only_explicit => true,
39
+ :ext_method => :find_by_modular,
40
+ :complete_value => {:true => 0, :false => 1},
41
+ :special_values => ['true', 'false'],
42
+ :validator => ->(value) { ['true', 'false'].include?(value.downcase) },
43
+ :operators => ["="]
44
+
37
45
  before_save lambda { |erratum| erratum.title = erratum.title.truncate(255) unless erratum.title.blank? }
38
46
 
39
47
  def self.of_type(type)
@@ -43,6 +51,8 @@ module Katello
43
51
  scope :security, -> { of_type(Erratum::SECURITY) }
44
52
  scope :bugfix, -> { of_type(Erratum::BUGZILLA) }
45
53
  scope :enhancement, -> { of_type(Erratum::ENHANCEMENT) }
54
+ scope :modular, -> { where(:id => Erratum.joins(:packages => :module_stream_errata_packages)) }
55
+ scope :non_modular, -> { where.not(:id => modular) }
46
56
 
47
57
  def self.repository_association_class
48
58
  RepositoryErratum
@@ -132,6 +142,18 @@ module Katello
132
142
  return streams.flatten.uniq
133
143
  end
134
144
 
145
+ def self.find_by_modular(_key, operator, value)
146
+ conditions = ""
147
+ if operator == '='
148
+ query = value.downcase == "true" ? modular : non_modular
149
+ conditions = "#{table_name}.id in (#{query.select(:id).to_sql})"
150
+ else
151
+ #failure condition. No such value so must return 0
152
+ conditions = "1=0"
153
+ end
154
+ { :conditions => conditions }
155
+ end
156
+
135
157
  class Jail < ::Safemode::Jail
136
158
  allow :errata_id, :errata_type, :issued, :created_at, :severity, :package_names, :cves, :reboot_suggested
137
159
  end
@@ -4,6 +4,8 @@ module Katello
4
4
  # Note: Do not use active record call backs or dependent references on this class
5
5
  # Direct deletes are made in EventQueue#clear_events (instead of destroys).
6
6
 
7
+ serialize :metadata, Hash
8
+
7
9
  def validate_event_type
8
10
  unless EventQueue.supported_event_types.include?(self.event_type)
9
11
  errors.add(:event_type, _("Unsupported event type %{type}. Supported: %{types}") %
@@ -0,0 +1,41 @@
1
+ module Katello
2
+ module Events
3
+ class AutoPublishCompositeView
4
+ EVENT_TYPE = 'auto_publish_composite_view'.freeze
5
+
6
+ attr_reader :composite_view
7
+ attr_accessor :metadata, :retry
8
+
9
+ def self.retry_seconds
10
+ 180
11
+ end
12
+
13
+ def initialize(composite_view_id)
14
+ @composite_view = ::Katello::ContentView.find_by_id(composite_view_id)
15
+ Rails.logger.warn "Content View not found for ID #{object_id}" if @composite_view.nil?
16
+ yield(self) if block_given?
17
+ end
18
+
19
+ def run
20
+ return unless composite_view
21
+
22
+ begin
23
+ ForemanTasks.async_task(::Actions::Katello::ContentView::Publish,
24
+ composite_view,
25
+ metadata[:description],
26
+ triggered_by: metadata[:version_id])
27
+ rescue => e
28
+ self.retry = true if e.is_a?(ForemanTasks::Lock::LockConflict)
29
+ deliver_failure_notification
30
+ raise e
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def deliver_failure_notification
37
+ ::Katello::UINotifications::ContentView::AutoPublishFailure.deliver!(composite_view)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -137,21 +137,6 @@ module Katello
137
137
  content_unit_counts
138
138
  end
139
139
 
140
- def sync(options = {})
141
- sync_options = {}
142
- sync_options[:max_speed] ||= SETTINGS[:katello][:pulp][:sync_KBlimit] if SETTINGS[:katello][:pulp][:sync_KBlimit] # set bandwidth limit
143
- sync_options[:num_threads] ||= SETTINGS[:katello][:pulp][:sync_threads] if SETTINGS[:katello][:pulp][:sync_threads] # set threads per sync
144
- pulp_tasks = Katello.pulp_server.extensions.repository.sync(self.pulp_id, :override_config => sync_options)
145
-
146
- task = PulpSyncStatus.using_pulp_task(pulp_tasks) do |t|
147
- t.organization = organization
148
- t.parameters ||= {}
149
- t.parameters[:options] = options
150
- end
151
- task.save!
152
- return [task]
153
- end
154
-
155
140
  def clone_file_metadata(to_repo)
156
141
  Katello.pulp_server.extensions.yum_repo_metadata_file.copy(self.pulp_id, to_repo.pulp_id)
157
142
  end
@@ -28,12 +28,43 @@ module Katello
28
28
  validates :host, :presence => true, :allow_blank => false
29
29
  validates_with Validators::ContentViewEnvironmentValidator
30
30
 
31
+ def bindable_types
32
+ [
33
+ {
34
+ type: Repository::DEB_TYPE,
35
+ matcher: '/pulp/deb/',
36
+ paths: []
37
+ },
38
+ {
39
+ type: Repository::YUM_TYPE,
40
+ matcher: '/pulp/repos/',
41
+ paths: []
42
+ }
43
+ ]
44
+ end
45
+
31
46
  def update_repositories_by_paths(paths)
32
- paths = paths.map { |path| path.gsub('/pulp/repos/', '') }
33
- repos = Repository.where(:relative_path => paths)
47
+ bindable_paths = bindable_types
48
+ relative_paths = []
49
+
50
+ paths.each do |path|
51
+ bindable_paths.each do |supported|
52
+ relative_path = path.gsub(supported[:matcher], '')
53
+ relative_paths << relative_path
54
+ if path.starts_with?(supported[:matcher])
55
+ supported[:paths] << relative_path
56
+ break
57
+ end
58
+ end
59
+ end
60
+
61
+ repos = bindable_paths.flat_map do |supported|
62
+ repos = Repository.joins(:root).where(RootRepository.table_name => {content_type: supported[:type]}, relative_path: supported[:paths])
63
+ relative_paths -= repos.pluck(:relative_path)
64
+ repos
65
+ end
34
66
 
35
- missing = paths - repos.pluck(:relative_path)
36
- missing.each do |repo_path|
67
+ relative_paths.each do |repo_path|
37
68
  Rails.logger.warn("System #{self.host.name} (#{self.host.id}) requested binding to unknown repo #{repo_path}")
38
69
  end
39
70
 
@@ -4,6 +4,7 @@ module Katello
4
4
  audited :associated_with => :host, :associations => [:pools], :except => [:last_checkin]
5
5
  self.table_name = 'katello_subscription_facets'
6
6
  include Facets::Base
7
+ include DirtyAssociations
7
8
 
8
9
  belongs_to :user, :inverse_of => :subscription_facets, :class_name => "::User"
9
10
  belongs_to :hypervisor_host, :class_name => "::Host::Managed", :foreign_key => "hypervisor_host_id"
@@ -11,6 +12,9 @@ module Katello
11
12
  has_many :subscription_facet_activation_keys, :class_name => "Katello::SubscriptionFacetActivationKey", :dependent => :destroy, :inverse_of => :subscription_facet
12
13
  has_many :activation_keys, :through => :subscription_facet_activation_keys, :class_name => "Katello::ActivationKey"
13
14
 
15
+ has_many :subscription_facet_purpose_addons, :class_name => "Katello::SubscriptionFacetPurposeAddon", :dependent => :destroy, :inverse_of => :subscription_facet
16
+ has_many :purpose_addons, :class_name => "Katello::PurposeAddon", :through => :subscription_facet_purpose_addons
17
+
14
18
  has_many :subscription_facet_pools, :class_name => "Katello::SubscriptionFacetPool", :dependent => :delete_all, :inverse_of => :subscription_facet
15
19
  has_many :pools, :through => :subscription_facet_pools, :class_name => "Katello::Pool"
16
20
 
@@ -19,13 +23,13 @@ module Katello
19
23
 
20
24
  has_many :compliance_reasons, :class_name => "Katello::ComplianceReason", :dependent => :destroy, :inverse_of => :subscription_facet
21
25
 
22
- serialize :purpose_addons, Array
23
-
24
26
  validates :host, :presence => true, :allow_blank => false
25
27
 
26
28
  DEFAULT_TYPE = 'system'.freeze
27
29
 
28
- accepts_nested_attributes_for :installed_products
30
+ accepts_nested_attributes_for :installed_products, :purpose_addons
31
+
32
+ dirty_has_many_associations :purpose_addons
29
33
 
30
34
  attr_accessor :facts
31
35
 
@@ -53,7 +57,9 @@ module Katello
53
57
  self.update_installed_products(consumer_params['installedProducts']) if consumer_params.key?('installedProducts')
54
58
  self.purpose_role = consumer_params['role'] unless consumer_params['role'].nil?
55
59
  self.purpose_usage = consumer_params['usage'] unless consumer_params['usage'].nil?
56
- self.purpose_addons = consumer_params['addOns'] unless consumer_params['addOns'].nil?
60
+ unless consumer_params['addOns'].nil?
61
+ self.purpose_addon_ids = consumer_params['addOns'].map { |addon_name| ::Katello::PurposeAddon.find_or_create_by(name: addon_name).id }
62
+ end
57
63
 
58
64
  unless consumer_params['releaseVer'].blank?
59
65
  release = consumer_params['releaseVer']
@@ -127,7 +133,7 @@ module Katello
127
133
  :autoheal => autoheal,
128
134
  :usage => purpose_usage,
129
135
  :role => purpose_role,
130
- :addOns => purpose_addons,
136
+ :addOns => purpose_addons.pluck(:name),
131
137
  :serviceLevel => service_level,
132
138
  :releaseVer => release_version,
133
139
  :environment => {:id => self.candlepin_environment_id},
@@ -266,17 +272,9 @@ module Katello
266
272
 
267
273
  if hosts_size == 1
268
274
  host = hosts.first
275
+ found_uuid = host.fact_values.find { |fv| fv.fact_name_id == uuid_fact_id }
269
276
 
270
- if host.name == host_name
271
- unless host.build
272
- found_uuid = host.fact_values.where(fact_name_id: uuid_fact_id).first
273
- if found_uuid && found_uuid.value != host_uuid
274
- fail Katello::Errors::RegistrationError, _("This host is reporting a DMI UUID that differs from the existing registration.")
275
- end
276
- end
277
-
278
- return host
279
- end
277
+ return host if host.name == host_name && (host.build || found_uuid&.value == host_uuid)
280
278
  end
281
279
 
282
280
  hostnames = hosts.pluck(:name).sort.join(', ')
@@ -292,7 +290,7 @@ module Katello
292
290
  end
293
291
 
294
292
  def backend_update_needed?
295
- %w(release_version service_level autoheal purpose_role purpose_usage purpose_addons).each do |method|
293
+ %w(release_version service_level autoheal purpose_role purpose_usage purpose_addon_ids).each do |method|
296
294
  return true if self.send("#{method}_changed?")
297
295
  end
298
296
  if self.host.content_facet