katello 4.2.2 → 4.3.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 (495) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/katello.common.js +0 -67
  3. data/app/assets/javascripts/katello/common/katello.js +0 -27
  4. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  5. data/app/assets/stylesheets/katello/katello.scss +0 -1
  6. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +10 -2
  7. data/app/controllers/katello/api/v2/api_controller.rb +35 -9
  8. data/app/controllers/katello/api/v2/capsule_content_controller.rb +16 -2
  9. data/app/controllers/katello/api/v2/content_view_components_controller.rb +22 -1
  10. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +65 -1
  11. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +5 -1
  12. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -6
  13. data/app/controllers/katello/api/v2/debs_controller.rb +74 -1
  14. data/app/controllers/katello/api/v2/errata_controller.rb +13 -10
  15. data/app/controllers/katello/api/v2/file_units_controller.rb +1 -0
  16. data/app/controllers/katello/api/v2/generic_content_units_controller.rb +1 -1
  17. data/app/controllers/katello/api/v2/host_errata_controller.rb +46 -5
  18. data/app/controllers/katello/api/v2/host_tracer_controller.rb +2 -1
  19. data/app/controllers/katello/api/v2/module_streams_controller.rb +4 -0
  20. data/app/controllers/katello/api/v2/organizations_controller.rb +22 -7
  21. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -1
  22. data/app/controllers/katello/api/v2/repositories_controller.rb +36 -19
  23. data/app/controllers/katello/api/v2/subscriptions_controller.rb +0 -8
  24. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +5 -1
  25. data/app/controllers/katello/concerns/api/v2/bulk_extensions.rb +40 -0
  26. data/app/controllers/katello/concerns/api/v2/host_errata_extensions.rb +4 -31
  27. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +1 -1
  28. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +1 -1
  29. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +2 -6
  30. data/app/helpers/katello/katello_url_helper.rb +1 -1
  31. data/app/lib/actions/candlepin/abstract_async_task.rb +6 -3
  32. data/app/lib/actions/candlepin/async_hypervisors.rb +12 -8
  33. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +10 -1
  34. data/app/lib/actions/katello/capsule_content/refresh_repos.rb +1 -1
  35. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +2 -2
  36. data/app/lib/actions/katello/cdn_configuration/update.rb +38 -0
  37. data/app/lib/actions/katello/content_view/remove.rb +18 -7
  38. data/app/lib/actions/katello/content_view_version/destroy.rb +2 -2
  39. data/app/lib/actions/katello/content_view_version/republish_repositories.rb +1 -1
  40. data/app/lib/actions/katello/repository/clone_contents.rb +1 -2
  41. data/app/lib/actions/katello/repository/destroy.rb +21 -5
  42. data/app/lib/actions/katello/repository/fetch_pxe_files.rb +1 -1
  43. data/app/lib/actions/katello/repository/index_content.rb +19 -6
  44. data/app/lib/actions/katello/repository/multi_clone_contents.rb +1 -1
  45. data/app/lib/actions/katello/repository/sync.rb +3 -5
  46. data/app/lib/actions/katello/repository_set/scan_cdn.rb +0 -4
  47. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +1 -1
  48. data/app/lib/actions/pulp/orphan_cleanup/remove_unneeded_repos.rb +1 -1
  49. data/app/lib/actions/pulp/repository/clear.rb +1 -1
  50. data/app/lib/actions/pulp3/abstract_async_task.rb +10 -1
  51. data/app/lib/actions/pulp3/capsule_content/generate_metadata.rb +4 -5
  52. data/app/lib/actions/pulp3/content_view_version/create_export_history.rb +1 -1
  53. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +25 -42
  54. data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +3 -3
  55. data/app/lib/actions/pulp3/repository/commit_upload.rb +1 -1
  56. data/app/lib/actions/pulp3/repository/import_upload.rb +8 -4
  57. data/app/lib/actions/pulp3/repository/multi_copy_content.rb +1 -1
  58. data/app/lib/actions/pulp3/repository/multi_copy_units.rb +1 -1
  59. data/app/lib/actions/pulp3/repository/presenters/abstract_sync_presenter.rb +18 -0
  60. data/app/lib/actions/pulp3/repository/presenters/content_unit_presenter.rb +7 -2
  61. data/app/lib/actions/pulp3/repository/presenters/repair_presenter.rb +6 -1
  62. data/app/lib/actions/pulp3/repository/save_artifact.rb +14 -4
  63. data/app/lib/katello/errors.rb +2 -0
  64. data/app/lib/katello/resources/candlepin/consumer.rb +0 -20
  65. data/app/lib/katello/resources/candlepin/proxy.rb +8 -2
  66. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +2 -0
  67. data/app/lib/katello/resources/cdn/katello_cdn.rb +68 -0
  68. data/app/lib/katello/resources/cdn.rb +61 -29
  69. data/app/lib/katello/resources/registry.rb +1 -1
  70. data/app/lib/katello/util/cdn_var_substitutor.rb +15 -9
  71. data/app/lib/katello/util/package.rb +22 -0
  72. data/app/lib/katello/util/path_with_substitutions.rb +12 -14
  73. data/app/models/katello/activation_key.rb +10 -0
  74. data/app/models/katello/ansible_collection.rb +1 -1
  75. data/app/models/katello/authorization/repository.rb +4 -4
  76. data/app/models/katello/candlepin/repository_mapper.rb +5 -1
  77. data/app/models/katello/cdn_configuration.rb +32 -0
  78. data/app/models/katello/concerns/content_facet_host_extensions.rb +40 -0
  79. data/app/models/katello/concerns/host_managed_extensions.rb +29 -3
  80. data/app/models/katello/concerns/hostgroup_extensions.rb +1 -1
  81. data/app/models/katello/concerns/organization_extensions.rb +3 -1
  82. data/app/models/katello/concerns/pulp_database_unit.rb +16 -6
  83. data/app/models/katello/concerns/remote_execution_provider_extensions.rb +9 -0
  84. data/app/models/katello/concerns/setting_extensions.rb +1 -1
  85. data/app/models/katello/concerns/smart_proxy_extensions.rb +9 -8
  86. data/app/models/katello/content_credential.rb +4 -0
  87. data/app/models/katello/content_facet_applicable_deb.rb +7 -0
  88. data/app/models/katello/content_view.rb +24 -1
  89. data/app/models/katello/content_view_component.rb +4 -0
  90. data/app/models/katello/content_view_erratum_filter.rb +2 -0
  91. data/app/models/katello/content_view_filter.rb +1 -1
  92. data/app/models/katello/content_view_package_filter_rule.rb +2 -1
  93. data/app/models/katello/content_view_version.rb +30 -1
  94. data/app/models/katello/deb.rb +71 -0
  95. data/app/models/katello/erratum.rb +13 -1
  96. data/app/models/katello/generic_content_unit.rb +3 -1
  97. data/app/models/katello/glue/pulp/repos.rb +2 -2
  98. data/app/models/katello/host/content_facet.rb +23 -2
  99. data/app/models/katello/host/subscription_facet.rb +1 -1
  100. data/app/models/katello/host_tracer.rb +21 -2
  101. data/app/models/katello/installed_deb.rb +1 -1
  102. data/app/models/katello/module_stream.rb +4 -0
  103. data/app/models/katello/ping.rb +20 -1
  104. data/app/models/katello/product.rb +7 -5
  105. data/app/models/katello/provider.rb +1 -24
  106. data/app/models/katello/repository.rb +33 -10
  107. data/app/models/katello/root_repository.rb +28 -14
  108. data/app/models/setting/content.rb +8 -13
  109. data/app/services/katello/applicability/applicable_content_helper.rb +20 -0
  110. data/app/services/katello/organization_creator.rb +12 -11
  111. data/app/services/katello/pulp3/api/ansible_collection.rb +0 -40
  112. data/app/services/katello/pulp3/api/apt.rb +0 -47
  113. data/app/services/katello/pulp3/api/content_guard.rb +1 -1
  114. data/app/services/katello/pulp3/api/core.rb +28 -23
  115. data/app/services/katello/pulp3/api/docker.rb +0 -50
  116. data/app/services/katello/pulp3/api/file.rb +0 -48
  117. data/app/services/katello/pulp3/api/generic.rb +1 -44
  118. data/app/services/katello/pulp3/api/yum.rb +4 -44
  119. data/app/services/katello/pulp3/erratum.rb +1 -9
  120. data/app/services/katello/pulp3/generic_content_unit.rb +8 -4
  121. data/app/services/katello/pulp3/repository/ansible_collection.rb +4 -0
  122. data/app/services/katello/pulp3/repository/apt.rb +3 -3
  123. data/app/services/katello/pulp3/repository/generic.rb +10 -65
  124. data/app/services/katello/pulp3/repository/yum.rb +10 -0
  125. data/app/services/katello/pulp3/repository.rb +51 -21
  126. data/app/services/katello/pulp3/repository_mirror.rb +18 -9
  127. data/app/services/katello/pulp3/rpm.rb +2 -32
  128. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +7 -8
  129. data/app/services/katello/pulp3/smart_proxy_repository.rb +1 -1
  130. data/app/services/katello/registration_manager.rb +2 -0
  131. data/app/services/katello/repository_type.rb +103 -15
  132. data/app/services/katello/repository_type_manager.rb +14 -8
  133. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  134. data/app/services/katello/upstream_connection_checker.rb +1 -0
  135. data/app/views/foreman/job_templates/resolve_traces.erb +25 -0
  136. data/app/views/foreman/job_templates/resolve_traces_-_katello_ansible_default.erb +28 -0
  137. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  138. data/app/views/katello/api/v2/common/_metadata.json.rabl +1 -0
  139. data/app/views/katello/api/v2/content_facet/base.json.rabl +3 -1
  140. data/app/views/katello/api/v2/content_facet/show.json.rabl +2 -1
  141. data/app/views/katello/api/v2/content_view_components/show.json.rabl +4 -0
  142. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +7 -0
  143. data/app/views/katello/api/v2/content_views/base.json.rabl +12 -8
  144. data/app/views/katello/api/v2/content_views/index.json.rabl +1 -0
  145. data/app/views/katello/api/v2/content_views/permissions.rabl +8 -0
  146. data/app/views/katello/api/v2/debs/base.json.rabl +5 -0
  147. data/app/views/katello/api/v2/errata/index.json.rabl +4 -0
  148. data/app/views/katello/api/v2/generic_content_units/base.json.rabl +2 -0
  149. data/app/views/katello/api/v2/generic_content_units/show.json.rabl +7 -0
  150. data/app/views/katello/api/v2/host_tracer/base.json.rabl +1 -0
  151. data/app/views/katello/api/v2/module_streams/index.json.rabl +4 -0
  152. data/app/views/katello/api/v2/organizations/cdn_configuration.rabl +1 -0
  153. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -0
  154. data/app/views/katello/api/v2/repositories/base.json.rabl +10 -17
  155. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +2 -6
  156. data/config/routes/api/v2.rb +13 -0
  157. data/config/routes/overrides.rb +2 -0
  158. data/config/routes.rb +14 -2
  159. data/db/migrate/20140110000001_update_environments_add_katello_id.rb +1 -3
  160. data/db/migrate/20140610154745_content_view_puppet_environment_id.rb +0 -35
  161. data/db/migrate/20190802112101_add_applicable_debs.rb +16 -0
  162. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +2 -2
  163. data/db/migrate/20210331180353_katello_pool_organization_id_not_nullable.rb +0 -2
  164. data/db/migrate/20210909140337_add_last_indexed_to_repos.rb +5 -0
  165. data/db/migrate/20210910190324_move_background_settings_to_immediate.rb +25 -0
  166. data/db/migrate/20211006161617_add_filename_to_katello_generic_content_units.rb +5 -0
  167. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +30 -0
  168. data/db/migrate/20211025181315_add_additional_metadata_to_katello_generic_content_units.rb +5 -0
  169. data/engines/bastion/README.md +15 -0
  170. data/engines/bastion/app/assets/javascripts/bastion/components/nutupane.factory.js +2 -2
  171. data/engines/bastion/config/routes.rb +2 -0
  172. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +3 -3
  173. data/engines/bastion/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +1 -1
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +3 -0
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/registration.html +1 -1
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-applicable.controller.js +44 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs.controller.js +1 -1
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-applicable.html +70 -0
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs.html +1 -1
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +10 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +5 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +25 -9
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +2 -2
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-versions.html +0 -9
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.controller.js +22 -2
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.routes.js +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb.controller.js +22 -2
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-content-views.html +1 -1
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +36 -4
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-repositories.html +1 -1
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb.html +4 -4
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/views/debs.html +31 -4
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.factory.js +21 -0
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.module.js +17 -0
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/package.controller.js +4 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +3 -3
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +6 -2
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +30 -2
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +1 -13
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +32 -9
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +15 -4
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +32 -19
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +28 -28
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-manage-generic-content.html +57 -0
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +46 -4
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +57 -27
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.module.js +1 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.routes.js +16 -7
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +30 -4
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository.factory.js +2 -1
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +8 -0
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/sync-plan-details-info.controller.js +6 -2
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/views/sync-plan-info.html +1 -1
  214. data/engines/bastion_katello/lib/bastion_katello/engine.rb +1 -1
  215. data/lib/katello/engine.rb +0 -1
  216. data/lib/katello/permission_creator.rb +4 -3
  217. data/lib/katello/permissions/host_permissions.rb +1 -0
  218. data/lib/katello/permissions/organization_permissions.rb +2 -1
  219. data/lib/katello/plugin.rb +15 -11
  220. data/lib/katello/repository_types/ansible_collection.rb +13 -1
  221. data/lib/katello/repository_types/deb.rb +13 -0
  222. data/lib/katello/repository_types/docker.rb +13 -1
  223. data/lib/katello/repository_types/file.rb +13 -0
  224. data/lib/katello/repository_types/ostree.rb +48 -4
  225. data/lib/katello/repository_types/python.rb +26 -12
  226. data/lib/katello/repository_types/yum.rb +16 -1
  227. data/lib/katello/tasks/repository.rake +3 -12
  228. data/lib/katello/tasks/reset.rake +4 -5
  229. data/lib/katello/version.rb +1 -1
  230. data/package.json +3 -2
  231. data/webpack/__mocks__/react-intl/index.js +4 -0
  232. data/webpack/components/ActionableDetail.js +23 -3
  233. data/webpack/components/AddedStatusLabel.js +1 -1
  234. data/webpack/components/Bookmark/AddBookmarkModal.js +96 -0
  235. data/webpack/components/Bookmark/Bookmark.scss +28 -0
  236. data/webpack/components/Bookmark/BookmarkActions.js +24 -0
  237. data/webpack/components/Bookmark/BookmarkConstants.js +3 -0
  238. data/webpack/components/Bookmark/BookmarkSelectors.js +15 -0
  239. data/webpack/components/Bookmark/index.js +94 -0
  240. data/webpack/components/EditableSwitch.js +6 -1
  241. data/webpack/components/EditableTextInput/EditableTextInput.js +41 -13
  242. data/webpack/components/Errata/index.js +69 -0
  243. data/webpack/components/ErratumTypeLabel.js +31 -0
  244. data/webpack/components/Loading.js +5 -2
  245. data/webpack/components/RoutedTabs/__tests__/RoutedTabs.test.js +5 -11
  246. data/webpack/components/RoutedTabs/index.js +77 -2
  247. data/webpack/components/Search/Search.js +67 -80
  248. data/webpack/components/Search/__tests__/search.test.js +8 -26
  249. data/webpack/components/SelectAllCheckbox/SelectAllCheckbox.scss +3 -0
  250. data/webpack/components/SelectAllCheckbox/index.js +126 -0
  251. data/webpack/components/SelectableDropdown/SelectableDropdown.js +7 -2
  252. data/webpack/components/Table/EmptyStateMessage.js +38 -17
  253. data/webpack/components/Table/MainTable.js +49 -10
  254. data/webpack/components/Table/MainTable.scss +11 -0
  255. data/webpack/components/Table/PageControls.js +45 -0
  256. data/webpack/components/Table/TableHooks.js +230 -0
  257. data/webpack/components/Table/TableWrapper.js +221 -50
  258. data/webpack/components/Table/helpers.js +17 -0
  259. data/webpack/components/TypeAhead/TypeAhead.js +74 -58
  260. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +25 -10
  261. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.scss +9 -8
  262. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -2
  263. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +32 -22
  264. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +101 -0
  265. data/webpack/components/extensions/HostDetails/Cards/__tests__/contentViewDetailsCard.test.js +53 -0
  266. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataActions.js +47 -0
  267. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataConstants.js +32 -0
  268. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataSelectors.js +16 -0
  269. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/EmptyPage.js +19 -0
  270. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +17 -0
  271. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +7 -0
  272. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/helpers.js +3 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +40 -0
  274. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerEmptyState.js +42 -0
  275. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerModal.js +118 -0
  276. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.js +347 -0
  277. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +16 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionContents.js +60 -0
  279. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionDetail.js +69 -0
  280. data/webpack/components/extensions/HostDetails/Tabs/HostTracesActions.js +19 -0
  281. data/webpack/components/extensions/HostDetails/Tabs/HostTracesConstants.js +2 -0
  282. data/webpack/components/extensions/HostDetails/Tabs/HostTracesSelectors.js +19 -0
  283. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +56 -0
  284. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +5 -0
  285. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.js +188 -0
  286. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +12 -0
  287. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errata.fixtures.json +67 -0
  288. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +785 -0
  289. data/webpack/components/extensions/HostDetails/Tabs/__tests__/resolveTraces.fixtures.json +35 -0
  290. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEmptyTraceResults.fixtures.json +7 -0
  291. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEnableJobInvocation.fixtures.json +35 -0
  292. data/webpack/components/extensions/HostDetails/Tabs/__tests__/traces.fixtures.json +44 -0
  293. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +386 -0
  294. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +20 -0
  295. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  296. data/webpack/components/extensions/RegistrationCommands/index.js +1 -1
  297. data/webpack/components/pf3Table/components/Table.js +1 -1
  298. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +3 -3
  299. data/webpack/containers/Application/Routes.js +3 -3
  300. data/webpack/containers/Application/config.js +21 -6
  301. data/webpack/containers/Application/overrides.scss +34 -3
  302. data/webpack/{fills_index.js → global_index.js} +11 -2
  303. data/webpack/global_test_setup.js +6 -1
  304. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -4
  305. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsTableSchema.js +1 -1
  306. data/webpack/scenes/Content/ContentActions.js +31 -0
  307. data/webpack/scenes/Content/ContentConfig.js +138 -0
  308. data/webpack/scenes/Content/ContentConstants.js +7 -0
  309. data/webpack/scenes/Content/ContentPage.js +89 -0
  310. data/webpack/scenes/Content/ContentSelectors.js +43 -0
  311. data/webpack/scenes/Content/Details/ContentCounts.js +42 -0
  312. data/webpack/scenes/Content/Details/ContentDetails.js +66 -0
  313. data/webpack/scenes/Content/Details/ContentInfo.js +60 -0
  314. data/webpack/scenes/Content/Details/ContentRepositories.js +78 -0
  315. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionDetails.fixtures.json +20 -0
  316. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionRepositoryDetails.fixtures.json +71 -0
  317. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +152 -0
  318. data/webpack/scenes/Content/Details/__tests__/pythonPackageDetails.fixtures.json +20 -0
  319. data/webpack/scenes/Content/Details/__tests__/pythonPackageRepositoryDetails.fixtures.json +71 -0
  320. data/webpack/scenes/Content/Details/index.js +4 -0
  321. data/webpack/scenes/Content/Table/ContentTable.js +90 -0
  322. data/webpack/scenes/Content/Table/index.js +3 -0
  323. data/webpack/scenes/Content/__tests__/ansibleCollections.fixtures.json +50 -0
  324. data/webpack/scenes/Content/__tests__/contentTable.test.js +89 -0
  325. data/webpack/scenes/Content/__tests__/contentTypes.fixtures.json +66 -0
  326. data/webpack/scenes/Content/__tests__/pythonPackages.fixtures.json +30 -0
  327. data/webpack/scenes/Content/index.js +4 -0
  328. data/webpack/scenes/ContentViews/ContentViewSelectors.js +5 -6
  329. data/webpack/scenes/ContentViews/ContentViewsActions.js +13 -8
  330. data/webpack/scenes/ContentViews/ContentViewsConstants.js +31 -4
  331. data/webpack/scenes/ContentViews/ContentViewsPage.js +4 -0
  332. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +19 -7
  333. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +7 -5
  334. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +1 -1
  335. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +7 -3
  336. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -2
  337. data/webpack/scenes/ContentViews/Delete/CVDeleteContext.js +4 -0
  338. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +170 -0
  339. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +108 -0
  340. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +69 -0
  341. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +121 -0
  342. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +120 -0
  343. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +62 -0
  344. data/webpack/scenes/ContentViews/Delete/Steps/CVEnvironmentSelectionForm.scss +4 -0
  345. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +259 -0
  346. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +155 -0
  347. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +241 -0
  348. data/webpack/scenes/ContentViews/Delete/__tests__/cvDetails.fixtures.json +248 -0
  349. data/webpack/scenes/ContentViews/Delete/__tests__/cvVersionsData.fixtures.json +865 -0
  350. data/webpack/scenes/ContentViews/Delete/__tests__/envPathData.fixtures.json +424 -0
  351. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +15 -7
  352. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +123 -0
  353. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentEnvironments.js +1 -1
  354. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +8 -5
  355. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +109 -51
  356. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.fixtures.json +21 -6
  357. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +80 -16
  358. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +248 -3
  359. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +141 -0
  360. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +36 -54
  361. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +20 -4
  362. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +63 -38
  363. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +3 -4
  364. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +65 -0
  365. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +260 -0
  366. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +54 -0
  367. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +202 -0
  368. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +291 -0
  369. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +441 -0
  370. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +62 -3
  371. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +302 -0
  372. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +186 -23
  373. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +144 -19
  374. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +2 -0
  375. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +44 -13
  376. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +81 -17
  377. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +43 -43
  378. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +96 -0
  379. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContent.fixtures.json +166 -0
  380. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +90 -0
  381. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentSearch.fixtures.json +33 -0
  382. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +91 -0
  383. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +237 -0
  384. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.fixtures.json +42 -0
  385. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +265 -0
  386. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +218 -11
  387. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +517 -0
  388. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterErrata.fixtures.json +122 -0
  389. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterModulesStreams.fixtures.json +60 -0
  390. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewErrataByDateDetails.fixtures.json +359 -0
  391. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetail.fixtures.json +88 -102
  392. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +34 -9
  393. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +148 -132
  394. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +25 -7
  395. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvAllRepos.fixtures.json +150 -0
  396. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +74 -0
  397. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +404 -0
  398. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErratumFilterDetails.fixtures.json +89 -0
  399. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailModuleAffectedRepos.fixtures.json +383 -0
  400. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailWithAffectedRepos.fixtures.json +375 -0
  401. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterFixutre.fixture.json +282 -0
  402. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +392 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilterDetails.fixtures.json +97 -0
  404. data/webpack/scenes/ContentViews/Details/Filters/index.js +26 -0
  405. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +68 -79
  406. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +1 -2
  407. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +163 -0
  408. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromoteSelectors.js +16 -0
  409. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +9 -1
  410. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +88 -74
  411. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +8 -9
  412. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.fixtures.json +3 -3
  413. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +30 -9
  414. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionEnvironments.js +1 -1
  415. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.js +9 -5
  416. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.scss +2 -2
  417. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +132 -14
  418. data/webpack/scenes/ContentViews/Details/Versions/Delete/DeleteContext.js +4 -0
  419. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +176 -0
  420. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +127 -0
  421. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +131 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +128 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +94 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +67 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedActivationKeys.fixture.json +53 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +153 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvDropDownOptionsResponse.fixture.json +192 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +313 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemoveResponse.fixture.json +74 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionRemoveEnvPaths.fixtures.json +352 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionsResponseData.fixtures.json +583 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +96 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +97 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +332 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +128 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +44 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +66 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +125 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +115 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionAnsibleCollections.fixtures.json +449 -0
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionComponent.fixtures.json +753 -0
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDebPackages.fixtures.json +58 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +158 -0
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +289 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsCounts.fixtures.json +73 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +44 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDockerTags.fixtures.json +3024 -0
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionErrata.fixtures.json +201 -0
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionFiles.fixtures.json +22 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionModuleStreams.fixtures.json +196 -0
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRepositories.fixtures.json +1000 -0
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackageGroups.fixtures.json +44 -0
  453. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackages.fixtures.json +394 -0
  454. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.fixtures.json +4 -4
  455. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +95 -26
  456. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersionsWithTask.fixtures.json +2 -2
  457. data/webpack/scenes/ContentViews/Details/Versions/index.js +25 -0
  458. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +20 -16
  459. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +3 -5
  460. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +106 -64
  461. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +25 -4
  462. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +1 -1
  463. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +4 -1
  464. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +29 -36
  465. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +10 -0
  466. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +117 -0
  467. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +59 -0
  468. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  469. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +30 -11
  470. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +1 -1
  471. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +38 -1
  472. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +79 -0
  473. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +107 -0
  474. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +59 -0
  475. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsResponse.fixtures.json +116 -0
  476. data/webpack/scenes/ContentViews/expansions/__tests__/relatedCompositeCvs.fixtures.json +4 -0
  477. data/webpack/scenes/ContentViews/helpers.js +1 -0
  478. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepository/RepositorySetRepository.js +1 -1
  479. data/webpack/scenes/RedHatRepositories/components/SearchBar.js +4 -3
  480. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +1 -1
  481. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +17 -9
  482. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +3 -3
  483. data/webpack/test-utils/nockWrapper.js +20 -3
  484. data/webpack/utils/helpers.js +16 -2
  485. data/webpack/utils/useDebounce.js +20 -0
  486. metadata +232 -54
  487. data/app/assets/javascripts/katello/widgets/tabs.js +0 -13
  488. data/app/assets/stylesheets/katello/widgets/tabs.scss +0 -69
  489. data/app/lib/actions/katello/provider/update.rb +0 -38
  490. data/webpack/components/RoutedTabs/RoutedTabs.js +0 -90
  491. data/webpack/components/Search/Search.test.js +0 -23
  492. data/webpack/components/Search/__snapshots__/Search.test.js.snap +0 -21
  493. data/webpack/components/extensions/HostDetails/Tabs/ContentTab.js +0 -42
  494. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +0 -145
  495. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionPackages.js +0 -0
@@ -4,8 +4,6 @@ module Katello
4
4
  class Consumer < CandlepinResource
5
5
  extend ConsumerResource
6
6
 
7
- GET_PARAM_BATCH_SIZE = 75
8
-
9
7
  class << self
10
8
  def all_uuids
11
9
  cp_consumers = Organization.all.map do |org|
@@ -27,14 +25,6 @@ module Katello
27
25
  end
28
26
  end
29
27
 
30
- def get_all(uuids)
31
- consumers = []
32
- uuids.each_slice(GET_PARAM_BATCH_SIZE) do |slice|
33
- consumers += get(:uuid => slice)
34
- end
35
- consumers
36
- end
37
-
38
28
  # workaround for https://bugzilla.redhat.com/1647724
39
29
  def get_all_with_facts(uuids)
40
30
  consumers = []
@@ -139,16 +129,6 @@ module Katello
139
129
  self.delete(uri, self.default_headers).code.to_i
140
130
  end
141
131
 
142
- def remove_entitlements(uuid)
143
- uri = join_path(path(uuid), 'entitlements')
144
- self.delete(uri, self.default_headers).code.to_i
145
- end
146
-
147
- def remove_certificate(uuid, serial_id)
148
- uri = join_path(path(uuid), 'certificates') + "/#{serial_id}"
149
- self.delete(uri, self.default_headers).code.to_i
150
- end
151
-
152
132
  def virtual_guests(uuid)
153
133
  response = Candlepin::CandlepinResource.get(join_path(path(uuid), 'guests'), self.default_headers).body
154
134
  ::Katello::Util::Data.array_with_indifferent_access JSON.parse(response)
@@ -20,10 +20,12 @@ module Katello
20
20
  client.delete({:accept => :json, :content_type => :json}.merge(User.cp_oauth_header))
21
21
  end
22
22
 
23
- def self.get(path)
23
+ def self.get(path, extra_headers = {})
24
24
  logger.debug "Sending GET request to Candlepin: #{path}"
25
25
  client = CandlepinResource.rest_client(Net::HTTP::Get, :get, path_with_cp_prefix(path))
26
- client.get({:accept => :json}.merge(User.cp_oauth_header))
26
+ client.get(extra_headers.merge!(default_request_headers))
27
+ rescue RestClient::NotModified => e
28
+ e.response
27
29
  end
28
30
 
29
31
  def self.put(path, body)
@@ -35,6 +37,10 @@ module Katello
35
37
  def self.path_with_cp_prefix(path)
36
38
  CandlepinResource.prefix + path
37
39
  end
40
+
41
+ def self.default_request_headers
42
+ @default_request_headers ||= User.cp_oauth_header.merge(accept: :json)
43
+ end
38
44
  end
39
45
  end
40
46
  end
@@ -13,6 +13,8 @@ module Katello
13
13
  resource.head
14
14
  rescue RestClient::Unauthorized, RestClient::Gone
15
15
  raise ::Katello::Errors::UpstreamConsumerGone
16
+ rescue RestClient::NotFound
17
+ raise ::Katello::Errors::UpstreamConsumerNotFound
16
18
  end
17
19
 
18
20
  # Overrides the HttpResource get method to check if the upstream
@@ -0,0 +1,68 @@
1
+ module Katello
2
+ module Resources
3
+ module CDN
4
+ class KatelloCdn < CdnResource
5
+ def initialize(url, options)
6
+ @organization_label = options.delete(:organization_label)
7
+ fail ArgumentError, "No upstream organization was specified" if @organization_label.nil?
8
+
9
+ super
10
+ end
11
+
12
+ def fetch_paths(content_path)
13
+ url = "/katello/api/v2/repository_sets?organization_id=#{organization['id']}&search=#{CGI.escape("path = #{content_path}")}"
14
+ response = get(url)
15
+ repo_set = JSON.parse(response)['results'].first
16
+
17
+ fail _("Upstream organization %s does not provide this content path") % @organization_label if repo_set.nil?
18
+
19
+ # now get available repositories when we know the upstream repo set ID
20
+ url = "/katello/api/v2/repository_sets/#{repo_set['id']}/available_repositories?organization_id=#{organization['id']}"
21
+ response = get(url)
22
+ json_body = JSON.parse(response)
23
+ results = json_body['results']
24
+
25
+ results.map do |r|
26
+ {
27
+ path: r['path'],
28
+ substitutions: r['substitutions']
29
+ }
30
+ end
31
+ end
32
+
33
+ def valid_path?(_path, _postfix)
34
+ true
35
+ end
36
+
37
+ def debug_certificate
38
+ get("/katello/api/v2/organizations/#{organization['id']}/download_debug_certificate")
39
+ end
40
+
41
+ def repository_url(content_label:)
42
+ response = get("/katello/api/v2/organizations/#{organization['id']}/repositories?search=#{CGI.escape("content_label = #{content_label}")}")
43
+ repository = JSON.parse(response)['results'].first
44
+
45
+ if repository.nil?
46
+ fail _("Repository with content label %{content_label} was not found in upstream organization %{org_label}") % { content_label: content_label, org_label: @organization_label }
47
+ end
48
+
49
+ repository['full_path']
50
+ end
51
+
52
+ private
53
+
54
+ def organization
55
+ @organization ||= find_organization(@organization_label)
56
+ end
57
+
58
+ def find_organization(label)
59
+ response = get("/api/v2/organizations?search=#{CGI.escape("label = #{label}")}")
60
+ JSON.parse(response)['results'].first
61
+ rescue => e
62
+ Rails.logger.error("Couldn't load upstream organization with label=#{label} error=#{e.message}")
63
+ raise e
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -2,6 +2,7 @@ module Katello
2
2
  module Resources
3
3
  module CDN
4
4
  SUPPORTED_SSL_VERSIONS = ['SSLv23', 'TLSv1'].freeze
5
+
5
6
  class Utils
6
7
  # takes releasever from contentUrl (e.g. 6Server, 6.0, 6.1)
7
8
  # returns hash e.g. {:major => 6, :minor => "6.1"}
@@ -18,53 +19,75 @@ module Katello
18
19
  class CdnResource
19
20
  CDN_DOCKER_CONTAINER_LISTING = "CONTAINER_REGISTRY_LISTING".freeze
20
21
 
21
- attr_reader :url, :product, :options, :proxy
22
-
23
- def substitutor(logger = nil)
24
- @logger = logger
25
- Util::CdnVarSubstitutor.new(self)
22
+ def substitutor
23
+ @substitutor ||= Util::CdnVarSubstitutor.new(self)
26
24
  end
27
25
 
28
26
  def initialize(url, options = {})
29
- @proxy = ::HttpProxy.default_global_content_proxy
30
27
  @ssl_version = Setting[:cdn_ssl_version]
31
28
  if @ssl_version && !SUPPORTED_SSL_VERSIONS.include?(@ssl_version)
32
29
  fail("Invalid SSL version specified. Check the 'CDN SSL Version' setting")
33
30
  end
31
+
34
32
  options.reverse_merge!(:verify_ssl => 9)
35
- options.assert_valid_keys(:ssl_client_key, :ssl_client_cert, :ssl_ca_file, :verify_ssl,
36
- :product)
37
-
38
- ca = Katello::Repository.feed_ca_file(url)
39
- if ca && URI(url).scheme == 'https'
40
- options.reverse_merge!(:ssl_ca_file => ca)
41
- elsif URI(url).scheme == 'https'
42
- store = OpenSSL::X509::Store.new
43
- store.set_default_paths
44
- options.reverse_merge!(:cert_store => store)
33
+ options.assert_valid_keys(:ssl_client_key,
34
+ :ssl_client_cert,
35
+ :ssl_ca_file,
36
+ :ssl_ca_cert,
37
+ :verify_ssl,
38
+ :username,
39
+ :password,
40
+ :organization_label,
41
+ :ssl_ca_cert)
42
+
43
+ if options[:ssl_ca_cert].present?
44
+ ca_cert = OpenSSL::X509::Certificate.new(options[:ssl_ca_cert])
45
+ @cert_store = OpenSSL::X509::Store.new
46
+ @cert_store.add_cert(ca_cert)
45
47
  end
46
48
 
47
- @product = options[:product]
48
-
49
49
  @url = url
50
50
  @uri = URI.parse(url)
51
51
  @options = options
52
52
  end
53
53
 
54
+ def self.create(product: nil, cdn_configuration:)
55
+ options = {}
56
+ if cdn_configuration.redhat?
57
+ options[:ssl_client_cert] = OpenSSL::X509::Certificate.new(product.certificate)
58
+ options[:ssl_client_key] = OpenSSL::PKey::RSA.new(product.key)
59
+ options[:ssl_ca_file] = self.ca_file
60
+ self.new(cdn_configuration.url, options)
61
+ else
62
+ options[:username] = cdn_configuration.username
63
+ options[:password] = cdn_configuration.password
64
+ options[:organization_label] = cdn_configuration.upstream_organization_label
65
+ options[:ssl_ca_cert] = cdn_configuration.ssl_ca
66
+ CDN::KatelloCdn.new(cdn_configuration.url, options)
67
+ end
68
+ end
69
+
70
+ def self.redhat_cdn_url
71
+ SETTINGS[:katello][:redhat_repository_url]
72
+ end
73
+
54
74
  def self.redhat_cdn?(url)
55
- url.include?(SETTINGS[:katello][:redhat_repository_url])
75
+ url.include?(redhat_cdn_url)
76
+ end
77
+
78
+ def proxy
79
+ ::HttpProxy.default_global_content_proxy
56
80
  end
57
81
 
58
82
  def http_downloader
59
83
  net = net_http_class.new(@uri.host, @uri.port)
60
84
  net.use_ssl = @uri.is_a?(URI::HTTPS)
61
85
 
62
- if CdnResource.redhat_cdn?(@uri.to_s)
86
+ if @uri.is_a?(URI::HTTPS)
63
87
  net.cert = @options[:ssl_client_cert]
64
88
  net.key = @options[:ssl_client_key]
65
- net.ca_file = @options[:ssl_ca_file] if @options[:ssl_ca_file]
66
- else
67
- net.cert_store = @options[:cert_store]
89
+ net.ca_file = @options[:ssl_ca_file]
90
+ net.cert_store = @cert_store
68
91
  end
69
92
 
70
93
  # NOTE: This was added because some proxies dont support SSLv23 and do not handle TLS 1.2
@@ -93,8 +116,13 @@ module Katello
93
116
  net = http_downloader
94
117
  path = File.join(@uri.request_uri, path)
95
118
  used_url = File.join("#{@uri.scheme}://#{@uri.host}:#{@uri.port}", path)
96
- Rails.logger.debug "CDN: Requesting path #{used_url}"
119
+ Rails.logger.info "CDN: Requesting path #{used_url}"
97
120
  req = Net::HTTP::Get.new(path)
121
+
122
+ if @options[:username] && @options[:password]
123
+ req.basic_auth(@options[:username], @options[:password])
124
+ end
125
+
98
126
  begin
99
127
  net.start do |http|
100
128
  res = http.request(req, nil) { |http_response| http_response.read_body }
@@ -125,6 +153,14 @@ module Katello
125
153
  end
126
154
  end
127
155
 
156
+ def valid_path?(path, postfix)
157
+ get(File.join(path, postfix)).present?
158
+ rescue RestClient::MovedPermanently
159
+ return true
160
+ rescue Errors::NotFound
161
+ return false
162
+ end
163
+
128
164
  def fetch_substitutions(base_path)
129
165
  get(File.join(base_path, "listing")).split("\n")
130
166
  rescue Errors::NotFound => e # some of listing file points to not existing content
@@ -136,12 +172,8 @@ module Katello
136
172
  "#{Katello::Engine.root}/ca/redhat-uep.pem"
137
173
  end
138
174
 
139
- def self.ca_file_contents
140
- File.read(ca_file)
141
- end
142
-
143
175
  def net_http_class
144
- if self.proxy
176
+ if proxy
145
177
  uri = URI(proxy.url) #Net::HTTP::Proxy ignores port as part of the url
146
178
  Net::HTTP::Proxy("#{uri.host}#{uri.path}", uri.port, proxy.username, proxy.password)
147
179
  else
@@ -32,7 +32,7 @@ module Katello
32
32
  self.prefix = "/pulpcore_registry/"
33
33
  self.site = "#{uri.scheme}://#{uri.host}:#{uri.port}"
34
34
  self.ca_cert_file = Setting[:ssl_ca_file]
35
- pulp_primary.pulp3_ssl_configuration(self, :net_http)
35
+ pulp_primary.pulp3_ssl_configuration(self)
36
36
 
37
37
  self
38
38
  end
@@ -48,7 +48,7 @@ module Katello
48
48
  end
49
49
 
50
50
  def any_valid_metadata_file?(repo_path)
51
- ['repodata/repomd.xml', 'PULP_MANIFEST', '.treeinfo', 'treeinfo'].any? { |filename| valid_path?(repo_path, filename) }
51
+ ['repodata/repomd.xml', 'PULP_MANIFEST', '.treeinfo', 'treeinfo'].any? { |filename| @resource.valid_path?(repo_path, filename) }
52
52
  end
53
53
 
54
54
  protected
@@ -59,10 +59,10 @@ module Katello
59
59
 
60
60
  return resolved if to_resolve.empty?
61
61
 
62
- to_resolve.in_groups_of(8) do |group|
62
+ to_resolve.in_groups_of(8, false) do |group|
63
63
  futures = group.map do |path_with_substitution|
64
64
  Concurrent::Promises.future do
65
- path_with_substitution.resolve_substitutions(@resource)
65
+ resolve_path(path_with_substitution)
66
66
  end
67
67
  end
68
68
 
@@ -75,12 +75,18 @@ module Katello
75
75
  find_substitutions(resolved.compact.flatten)
76
76
  end
77
77
 
78
- def valid_path?(path, postfix)
79
- @resource.get(File.join(path, postfix)).present?
80
- rescue RestClient::MovedPermanently
81
- return true
82
- rescue Errors::NotFound
83
- return false
78
+ def resolve_path(path_with_substitutions)
79
+ if @resource.respond_to?(:fetch_paths)
80
+ @resource.fetch_paths(path_with_substitutions.path).compact.map do |element|
81
+ PathWithSubstitutions.new(element[:path], element[:substitutions])
82
+ end
83
+ elsif @resource.respond_to?(:fetch_substitutions)
84
+ @resource.fetch_substitutions(path_with_substitutions.base_path).compact.map do |value|
85
+ path_with_substitutions.resolve_token(value)
86
+ end
87
+ else
88
+ fail _("Unsupported CDN resource")
89
+ end
84
90
  end
85
91
  end
86
92
  end
@@ -170,6 +170,28 @@ module Katello
170
170
  end
171
171
  pieces.join(".")
172
172
  end
173
+
174
+ def self.parse_dependencies(dependencies)
175
+ # dependencies is either 'requires' or 'provides' metadata attribute of rpm package in pulp
176
+ results = []
177
+ flags = {'GT' => '>', 'LT' => '<', 'EQ' => '=', 'GE' => '>=', 'LE' => '<='}
178
+
179
+ dependencies&.each do |dependency|
180
+ dependencies_str = ""
181
+ if dependency.count < 3
182
+ dependencies_str = dependency.first
183
+ results << dependencies_str
184
+ else
185
+ dependency[1] = flags[dependency[1]]
186
+ dependency[0...2].each { |dependency_piece| dependencies_str += "#{dependency_piece} " }
187
+ dependencies_str += "#{dependency[2]}:" unless dependency[2] == "0" # epoch
188
+ dependencies_str += "#{dependency[3]}-" # version
189
+ dependency[4...-1].each { |dependency_piece| dependencies_str += "#{dependency_piece}." }
190
+ results << dependencies_str[0...-1]
191
+ end
192
+ end
193
+ results.uniq
194
+ end
173
195
  end
174
196
  end
175
197
  end
@@ -3,15 +3,19 @@ module Katello
3
3
  class PathWithSubstitutions
4
4
  include Comparable
5
5
 
6
- attr_accessor :substitutions
7
- attr_accessor :path
6
+ attr_reader :base_path, :path, :substitutions
7
+
8
+ SUBSTITUTABLE_REGEX = /^(.*?)\$([^\/]*)/.freeze
8
9
 
9
10
  #path /content/rhel/server/$arch/$releasever/os
10
11
  #substitutions {$arch => 'x86_64'}
11
12
  def initialize(path, substitutions)
12
13
  @substitutions = substitutions
13
14
  @path = path
14
- @resolved = []
15
+
16
+ if @path =~ SUBSTITUTABLE_REGEX
17
+ @base_path, @token = Regexp.last_match[1], Regexp.last_match[2]
18
+ end
15
19
  end
16
20
 
17
21
  def split_path
@@ -25,19 +29,13 @@ module Katello
25
29
  end
26
30
 
27
31
  def substitutable?
28
- path =~ /^(.*?)\$([^\/]*)/
32
+ @token.present?
29
33
  end
30
34
 
31
- def resolve_substitutions(cdn_resource)
32
- if @resolved.empty? && path =~ /^(.*?)\$([^\/]*)/
33
- base_path, var = Regexp.last_match[1], Regexp.last_match[2]
34
- cdn_resource.fetch_substitutions(base_path).compact.map do |value|
35
- new_substitutions = substitutions.merge(var => value)
36
- new_path = path.sub("$#{var}", value)
37
- @resolved << PathWithSubstitutions.new(new_path, new_substitutions)
38
- end
39
- end
40
- @resolved
35
+ def resolve_token(value)
36
+ new_substitutions = substitutions.merge(@token => value)
37
+ new_path = path.sub("$#{@token}", value)
38
+ PathWithSubstitutions.new(new_path, new_substitutions)
41
39
  end
42
40
 
43
41
  def unused_substitutions
@@ -184,5 +184,15 @@ module Katello
184
184
  self.content_view = self.environment.try(:default_content_view)
185
185
  end
186
186
  end
187
+
188
+ apipie :class, desc: "A class representing #{model_name.human} object" do
189
+ name 'Activation Key'
190
+ refs 'ActivationKey'
191
+ sections only: %w[all additional]
192
+ property :name, String, desc: 'Returns the name of the Activation Key.'
193
+ end
194
+ class Jail < ::Safemode::Jail
195
+ allow :name
196
+ end
187
197
  end
188
198
  end
@@ -3,7 +3,7 @@ module Katello
3
3
  include Concerns::PulpDatabaseUnit
4
4
 
5
5
  self.table_name = 'katello_ansible_collections'
6
- CONTENT_TYPE = 'ansible collection'.freeze
6
+ CONTENT_TYPE = 'ansible_collection'.freeze
7
7
 
8
8
  has_many :ansible_collection_tags, :class_name => "Katello::AnsibleCollectionTag", :dependent => :delete_all
9
9
  has_many :tags, :through => :ansible_collection_tags
@@ -4,12 +4,12 @@ module Katello
4
4
 
5
5
  delegate :editable?, to: :product
6
6
 
7
- def deletable?
8
- product.editable? && !promoted?
7
+ def deletable?(remove_from_content_view_versions = false)
8
+ product.editable? && (remove_from_content_view_versions || !promoted?)
9
9
  end
10
10
 
11
- def redhat_deletable?
12
- !self.promoted? && self.product.editable?
11
+ def redhat_deletable?(remove_from_content_view_versions = false)
12
+ (remove_from_content_view_versions || !self.promoted?) && self.product.editable?
13
13
  end
14
14
 
15
15
  def readable?
@@ -74,7 +74,11 @@ module Katello
74
74
  end
75
75
 
76
76
  def feed_url
77
- product.repo_url(path)
77
+ @feed_url ||= if product.cdn_resource&.respond_to?(:repository_url)
78
+ product.cdn_resource.repository_url(content_label: content.label)
79
+ else
80
+ product.repo_url(path)
81
+ end
78
82
  end
79
83
 
80
84
  def arch
@@ -0,0 +1,32 @@
1
+ module Katello
2
+ class CdnConfiguration < Katello::Model
3
+ include Encryptable
4
+
5
+ belongs_to :organization, :inverse_of => :cdn_configuration
6
+
7
+ belongs_to :ssl_ca_credential, :class_name => "Katello::ContentCredential", :inverse_of => :ssl_ca_cdn_configurations
8
+
9
+ encrypts :password
10
+
11
+ validates :url, presence: true
12
+ validates_with Validators::KatelloUrlFormatValidator, attributes: :url
13
+ validates_with Validators::KatelloLabelFormatValidator, attributes: :upstream_organization_label, if: proc { upstream_organization_label.present? }
14
+ validate :non_redhat_configuration, unless: :redhat?
15
+
16
+ def ssl_ca
17
+ ssl_ca_credential&.content
18
+ end
19
+
20
+ def redhat?
21
+ username.blank? && password.blank? && upstream_organization_label.blank? && ssl_ca_credential_id.blank?
22
+ end
23
+
24
+ private
25
+
26
+ def non_redhat_configuration
27
+ if username.blank? || password.blank? || upstream_organization_label.blank? || ssl_ca_credential_id.blank?
28
+ errors.add(:base, _("Username, Password, Upstream Organization Label, and SSL CA Credential are required when using a non-Red Hat CDN."))
29
+ end
30
+ end
31
+ end
32
+ end
@@ -30,6 +30,7 @@ module Katello
30
30
  has_one :content_source, :through => :content_facet
31
31
  has_many :content_facet_errata, :through => :content_facet, :class_name => 'Katello::ContentFacetErratum'
32
32
  has_many :applicable_errata, :through => :content_facet_errata, :source => :erratum
33
+ has_many :applicable_debs, :through => :content_facet
33
34
  has_many :applicable_rpms, :through => :content_facet
34
35
  has_many :applicable_module_streams, :through => :content_facet
35
36
 
@@ -40,6 +41,8 @@ module Katello
40
41
  scoped_search :relation => :applicable_errata, :on => :errata_id, :rename => :applicable_errata, :complete_value => true, :ext_method => :find_by_applicable_errata, :only_explicit => true
41
42
  scoped_search :relation => :applicable_errata, :on => :errata_id, :rename => :installable_errata, :complete_value => true, :ext_method => :find_by_installable_errata, :only_explicit => true
42
43
  scoped_search :relation => :applicable_errata, :on => :issued, :rename => :applicable_errata_issued, :complete_value => true, :only_explicit => true
44
+ scoped_search :relation => :applicable_debs, :on => :nav, :rename => :applicable_debs, :complete_value => true, :ext_method => :find_by_applicable_debs, :only_explicit => true, :operators => ['=']
45
+ scoped_search :relation => :applicable_debs, :on => :nav, :rename => :upgradable_debs, :complete_value => true, :ext_method => :find_by_installable_debs, :only_explicit => true, :operators => ['=']
43
46
  scoped_search :relation => :applicable_rpms, :on => :nvra, :rename => :applicable_rpms, :complete_value => true, :ext_method => :find_by_applicable_rpms, :only_explicit => true
44
47
  scoped_search :relation => :applicable_rpms, :on => :nvra, :rename => :upgradable_rpms, :complete_value => true, :ext_method => :find_by_installable_rpms, :only_explicit => true
45
48
  scoped_search :relation => :content_source, :on => :name, :complete_value => true, :rename => :content_source
@@ -88,6 +91,24 @@ module Katello
88
91
  end
89
92
  end
90
93
 
94
+ def find_by_applicable_debs(_key, operator, value)
95
+ hosts = find_by_debs(::Host::Managed.joins(:applicable_debs), operator, value)
96
+ if hosts.empty?
97
+ { :conditions => "1=0" }
98
+ else
99
+ { :conditions => "#{::Host::Managed.table_name}.id IN (#{hosts.pluck(:id).join(',')})" }
100
+ end
101
+ end
102
+
103
+ def find_by_installable_debs(_key, operator, value)
104
+ facets = find_by_debs(Katello::Host::ContentFacet.joins_installable_debs, operator, value)
105
+ if facets.empty?
106
+ { :conditions => "1=0" }
107
+ else
108
+ { :conditions => "#{::Host::Managed.table_name}.id IN (#{facets.pluck(:host_id).join(',')})" }
109
+ end
110
+ end
111
+
91
112
  def find_by_applicable_rpms(_key, operator, value)
92
113
  conditions = sanitize_sql_for_conditions(["#{Katello::Rpm.table_name}.nvra #{operator} ?", value_to_sql(operator, value)])
93
114
  hosts = ::Host::Managed.joins(:applicable_rpms).where(conditions)
@@ -118,6 +139,25 @@ module Katello
118
139
  def in_environment(lifecycle_environment)
119
140
  in_content_view_environment(:lifecycle_environment => lifecycle_environment)
120
141
  end
142
+
143
+ private
144
+
145
+ def find_by_debs(base, operator, value)
146
+ table = Katello::Deb.table_name
147
+
148
+ name, architecture, version = Katello::Deb.split_nav(value)
149
+ if name.nil?
150
+ return []
151
+ end
152
+
153
+ res = base.where(sanitize_sql_for_conditions(["#{table}.name #{operator} ?", value_to_sql(operator, name)]))
154
+
155
+ res = res.where(sanitize_sql_for_conditions(["#{table}.architecture #{operator} ?", value_to_sql(operator, architecture)])) unless architecture.nil?
156
+
157
+ res = res.where(sanitize_sql_for_conditions(["#{table}.version #{operator} ?", value_to_sql(operator, version)])) unless version.nil?
158
+
159
+ res
160
+ end
121
161
  end
122
162
  end
123
163
  end
@@ -67,9 +67,10 @@ module Katello
67
67
  scoped_search :relation => :host_collections, :on => :name, :complete_value => true, :rename => :host_collection
68
68
  scoped_search :relation => :installed_packages, :on => :nvra, :complete_value => true, :rename => :installed_package, :only_explicit => true
69
69
  scoped_search :relation => :installed_packages, :on => :name, :complete_value => true, :rename => :installed_package_name, :only_explicit => true
70
+ scoped_search :relation => :installed_debs, :on => :name, :rename => :installed_deb, :only_explicit => true, :ext_method => :find_by_installed_debs, operators: ['=']
71
+ scoped_search :relation => :installed_debs, :on => :name, :complete_value => true, :rename => :installed_package_name, :only_explicit => true
70
72
  scoped_search :relation => :available_module_streams, :on => :name, :complete_value => true, :rename => :available_module_stream_name, :only_explicit => true
71
73
  scoped_search :relation => :available_module_streams, :on => :stream, :complete_value => true, :rename => :available_module_stream_stream, :only_explicit => true
72
- scoped_search :relation => :installed_debs, :on => :name, :complete_value => true, :rename => :installed_package_name, :only_explicit => true
73
74
  scoped_search :relation => :host_traces, :on => :application, :complete_value => true, :rename => :trace_app, :only_explicit => true
74
75
  scoped_search :relation => :host_traces, :on => :app_type, :complete_value => true, :rename => :trace_app_type, :only_explicit => true
75
76
  scoped_search :relation => :host_traces, :on => :helper, :complete_value => true, :rename => :trace_helper, :only_explicit => true
@@ -108,7 +109,7 @@ module Katello
108
109
  self.host_statuses.where(type: ::Katello::HostStatusManager::STATUSES.map(&:name)).each do |status|
109
110
  status.refresh!
110
111
  end
111
- refresh_global_status
112
+ refresh_global_status!
112
113
  end
113
114
 
114
115
  def queue_refresh_content_host_status
@@ -141,6 +142,25 @@ module Katello
141
142
  !new_record? && build && self.changes.key?('build')
142
143
  end
143
144
 
145
+ module ClassMethods
146
+ def find_by_installed_debs(_key, _operator, value)
147
+ name, architecture, version = Katello::Deb.split_nav(value)
148
+ debs = Katello::InstalledDeb.where(:name => name)
149
+ debs = debs.where(:architecture => architecture) unless architecture.nil?
150
+ debs = debs.where(:version => version) unless version.nil?
151
+ hosts = debs.joins(:host_installed_debs).select("#{Katello::HostInstalledDeb.table_name}.host_id as host_id").pluck(:host_id)
152
+ if hosts.empty?
153
+ {
154
+ :conditions => "1=0"
155
+ }
156
+ else
157
+ {
158
+ :conditions => "#{::Host::Managed.table_name}.id IN (#{hosts.join(',')})"
159
+ }
160
+ end
161
+ end
162
+ end
163
+
144
164
  def correct_kickstart_repository
145
165
  return unless content_facet
146
166
 
@@ -363,6 +383,12 @@ module Katello
363
383
  @traces_status_label ||= get_status(::Katello::TraceStatus).to_label(options)
364
384
  end
365
385
 
386
+ def traces_helpers(ids = nil)
387
+ traces = host_traces
388
+ traces = host_traces.where(id: ids) if ids.present?
389
+ ::Katello::HostTracer.helpers_for(traces)
390
+ end
391
+
366
392
  def valid_content_override_label?(content_label)
367
393
  available_content = subscription_facet.candlepin_consumer.available_product_content
368
394
  available_content.map(&:content).any? { |content| content.label == content_label }
@@ -385,7 +411,7 @@ end
385
411
  class ::Host::Managed::Jail < Safemode::Jail
386
412
  allow :content_source, :subscription_manager_configuration_url, :rhsm_organization_label,
387
413
  :host_collections, :pools, :hypervisor_host, :lifecycle_environment, :content_view,
388
- :installed_packages
414
+ :installed_packages, :traces_helpers
389
415
  end
390
416
 
391
417
  class ActiveRecord::Associations::CollectionProxy::Jail < Safemode::Jail
@@ -59,7 +59,7 @@ module Katello
59
59
  # instead of calling nested_attribute_for(:content_source_id) in Foreman, define the methods explictedly
60
60
  def content_source
61
61
  return super if ancestry.nil? || self.content_source_id.present?
62
- SmartProxy.find_by(:id => inherited_content_source_id)
62
+ SmartProxy.unscoped.find_by(:id => inherited_content_source_id)
63
63
  end
64
64
 
65
65
  def inherited_content_source_id