katello 4.2.1 → 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 (498) 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/sync_capsule.rb +3 -3
  35. data/app/lib/actions/katello/cdn_configuration/update.rb +38 -0
  36. data/app/lib/actions/katello/content_view/remove.rb +18 -7
  37. data/app/lib/actions/katello/content_view_version/destroy.rb +2 -2
  38. data/app/lib/actions/katello/content_view_version/republish_repositories.rb +1 -1
  39. data/app/lib/actions/katello/repository/clone_contents.rb +1 -2
  40. data/app/lib/actions/katello/repository/destroy.rb +21 -5
  41. data/app/lib/actions/katello/repository/fetch_pxe_files.rb +1 -1
  42. data/app/lib/actions/katello/repository/finish_upload.rb +1 -1
  43. data/app/lib/actions/katello/repository/import_upload.rb +1 -1
  44. data/app/lib/actions/katello/repository/index_content.rb +19 -6
  45. data/app/lib/actions/katello/repository/metadata_generate.rb +2 -0
  46. data/app/lib/actions/katello/repository/multi_clone_contents.rb +1 -1
  47. data/app/lib/actions/katello/repository/remove_content.rb +1 -1
  48. data/app/lib/actions/katello/repository/sync.rb +3 -7
  49. data/app/lib/actions/katello/repository_set/scan_cdn.rb +0 -4
  50. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +1 -1
  51. data/app/lib/actions/pulp/orphan_cleanup/remove_unneeded_repos.rb +1 -1
  52. data/app/lib/actions/pulp/repository/clear.rb +1 -1
  53. data/app/lib/actions/pulp3/abstract_async_task.rb +10 -1
  54. data/app/lib/actions/pulp3/capsule_content/generate_metadata.rb +13 -18
  55. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +1 -11
  56. data/app/lib/actions/pulp3/content_view_version/create_export_history.rb +1 -1
  57. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +3 -1
  58. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +25 -42
  59. data/app/lib/actions/pulp3/orchestration/repository/sync.rb +8 -1
  60. data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +3 -3
  61. data/app/lib/actions/pulp3/repository/commit_upload.rb +1 -1
  62. data/app/lib/actions/pulp3/repository/import_upload.rb +8 -4
  63. data/app/lib/actions/pulp3/repository/multi_copy_content.rb +1 -1
  64. data/app/lib/actions/pulp3/repository/multi_copy_units.rb +1 -1
  65. data/app/lib/actions/pulp3/repository/presenters/abstract_sync_presenter.rb +18 -0
  66. data/app/lib/actions/pulp3/repository/presenters/content_unit_presenter.rb +7 -2
  67. data/app/lib/actions/pulp3/repository/presenters/repair_presenter.rb +6 -1
  68. data/app/lib/actions/pulp3/repository/save_artifact.rb +14 -4
  69. data/app/lib/katello/errors.rb +2 -0
  70. data/app/lib/katello/resources/candlepin/consumer.rb +0 -20
  71. data/app/lib/katello/resources/candlepin/proxy.rb +8 -2
  72. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +2 -0
  73. data/app/lib/katello/resources/cdn/katello_cdn.rb +68 -0
  74. data/app/lib/katello/resources/cdn.rb +61 -29
  75. data/app/lib/katello/util/cdn_var_substitutor.rb +15 -9
  76. data/app/lib/katello/util/package.rb +22 -0
  77. data/app/lib/katello/util/path_with_substitutions.rb +12 -14
  78. data/app/models/katello/activation_key.rb +10 -0
  79. data/app/models/katello/ansible_collection.rb +1 -1
  80. data/app/models/katello/authorization/repository.rb +4 -4
  81. data/app/models/katello/candlepin/repository_mapper.rb +5 -1
  82. data/app/models/katello/cdn_configuration.rb +32 -0
  83. data/app/models/katello/concerns/content_facet_host_extensions.rb +40 -0
  84. data/app/models/katello/concerns/host_managed_extensions.rb +28 -2
  85. data/app/models/katello/concerns/hostgroup_extensions.rb +1 -1
  86. data/app/models/katello/concerns/organization_extensions.rb +3 -1
  87. data/app/models/katello/concerns/pulp_database_unit.rb +15 -5
  88. data/app/models/katello/concerns/remote_execution_provider_extensions.rb +9 -0
  89. data/app/models/katello/concerns/setting_extensions.rb +1 -1
  90. data/app/models/katello/concerns/smart_proxy_extensions.rb +4 -3
  91. data/app/models/katello/content_credential.rb +4 -0
  92. data/app/models/katello/content_facet_applicable_deb.rb +7 -0
  93. data/app/models/katello/content_view.rb +24 -1
  94. data/app/models/katello/content_view_component.rb +4 -0
  95. data/app/models/katello/content_view_erratum_filter.rb +2 -0
  96. data/app/models/katello/content_view_filter.rb +1 -1
  97. data/app/models/katello/content_view_package_filter_rule.rb +2 -1
  98. data/app/models/katello/content_view_version.rb +30 -1
  99. data/app/models/katello/deb.rb +71 -0
  100. data/app/models/katello/erratum.rb +13 -1
  101. data/app/models/katello/generic_content_unit.rb +3 -1
  102. data/app/models/katello/glue/pulp/repos.rb +2 -2
  103. data/app/models/katello/host/content_facet.rb +23 -2
  104. data/app/models/katello/host/subscription_facet.rb +1 -1
  105. data/app/models/katello/host_tracer.rb +21 -2
  106. data/app/models/katello/installed_deb.rb +1 -1
  107. data/app/models/katello/module_stream.rb +4 -0
  108. data/app/models/katello/ping.rb +20 -4
  109. data/app/models/katello/product.rb +7 -5
  110. data/app/models/katello/provider.rb +1 -24
  111. data/app/models/katello/repository.rb +37 -10
  112. data/app/models/katello/root_repository.rb +28 -14
  113. data/app/models/setting/content.rb +8 -13
  114. data/app/services/katello/applicability/applicable_content_helper.rb +20 -0
  115. data/app/services/katello/organization_creator.rb +8 -0
  116. data/app/services/katello/pulp3/api/ansible_collection.rb +0 -40
  117. data/app/services/katello/pulp3/api/apt.rb +0 -47
  118. data/app/services/katello/pulp3/api/content_guard.rb +1 -1
  119. data/app/services/katello/pulp3/api/core.rb +28 -23
  120. data/app/services/katello/pulp3/api/docker.rb +0 -50
  121. data/app/services/katello/pulp3/api/file.rb +0 -48
  122. data/app/services/katello/pulp3/api/generic.rb +1 -44
  123. data/app/services/katello/pulp3/api/yum.rb +4 -44
  124. data/app/services/katello/pulp3/generic_content_unit.rb +8 -4
  125. data/app/services/katello/pulp3/repository/ansible_collection.rb +4 -0
  126. data/app/services/katello/pulp3/repository/apt.rb +3 -3
  127. data/app/services/katello/pulp3/repository/generic.rb +10 -65
  128. data/app/services/katello/pulp3/repository/yum.rb +10 -0
  129. data/app/services/katello/pulp3/repository.rb +47 -21
  130. data/app/services/katello/pulp3/repository_mirror.rb +30 -11
  131. data/app/services/katello/pulp3/rpm.rb +2 -32
  132. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +7 -8
  133. data/app/services/katello/pulp3/smart_proxy_repository.rb +1 -1
  134. data/app/services/katello/registration_manager.rb +2 -0
  135. data/app/services/katello/repository_type.rb +103 -15
  136. data/app/services/katello/repository_type_manager.rb +14 -8
  137. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  138. data/app/services/katello/upstream_connection_checker.rb +1 -0
  139. data/app/views/foreman/job_templates/resolve_traces.erb +25 -0
  140. data/app/views/foreman/job_templates/resolve_traces_-_katello_ansible_default.erb +28 -0
  141. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  142. data/app/views/katello/api/v2/common/_metadata.json.rabl +1 -0
  143. data/app/views/katello/api/v2/content_facet/base.json.rabl +3 -1
  144. data/app/views/katello/api/v2/content_facet/show.json.rabl +2 -1
  145. data/app/views/katello/api/v2/content_view_components/show.json.rabl +4 -0
  146. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +7 -0
  147. data/app/views/katello/api/v2/content_views/base.json.rabl +12 -8
  148. data/app/views/katello/api/v2/content_views/index.json.rabl +1 -0
  149. data/app/views/katello/api/v2/content_views/permissions.rabl +8 -0
  150. data/app/views/katello/api/v2/debs/base.json.rabl +5 -0
  151. data/app/views/katello/api/v2/errata/index.json.rabl +4 -0
  152. data/app/views/katello/api/v2/generic_content_units/base.json.rabl +2 -0
  153. data/app/views/katello/api/v2/generic_content_units/show.json.rabl +7 -0
  154. data/app/views/katello/api/v2/host_tracer/base.json.rabl +1 -0
  155. data/app/views/katello/api/v2/module_streams/index.json.rabl +4 -0
  156. data/app/views/katello/api/v2/organizations/cdn_configuration.rabl +1 -0
  157. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -0
  158. data/app/views/katello/api/v2/repositories/base.json.rabl +10 -17
  159. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +2 -6
  160. data/config/routes/api/v2.rb +13 -0
  161. data/config/routes/overrides.rb +2 -0
  162. data/config/routes.rb +14 -2
  163. data/db/migrate/20140110000001_update_environments_add_katello_id.rb +1 -3
  164. data/db/migrate/20140610154745_content_view_puppet_environment_id.rb +0 -35
  165. data/db/migrate/20190802112101_add_applicable_debs.rb +16 -0
  166. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +2 -2
  167. data/db/migrate/20210909140337_add_last_indexed_to_repos.rb +5 -0
  168. data/db/migrate/20210910190324_move_background_settings_to_immediate.rb +25 -0
  169. data/db/migrate/20211006161617_add_filename_to_katello_generic_content_units.rb +5 -0
  170. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +30 -0
  171. data/db/migrate/20211025181315_add_additional_metadata_to_katello_generic_content_units.rb +5 -0
  172. data/engines/bastion/README.md +15 -0
  173. data/engines/bastion/app/assets/javascripts/bastion/components/nutupane.factory.js +2 -2
  174. data/engines/bastion/config/routes.rb +2 -0
  175. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +3 -3
  176. data/engines/bastion/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +3 -0
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/registration.html +1 -1
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-applicable.controller.js +44 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs.controller.js +1 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-applicable.html +70 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs.html +1 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +10 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +5 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +25 -9
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +2 -2
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-versions.html +0 -9
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.controller.js +22 -2
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.routes.js +1 -1
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb.controller.js +22 -2
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-content-views.html +1 -1
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +36 -4
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-repositories.html +1 -1
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb.html +4 -4
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/views/debs.html +31 -4
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.factory.js +21 -0
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.module.js +17 -0
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/package.controller.js +4 -0
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +3 -3
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +6 -2
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +30 -2
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +1 -13
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +32 -9
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +15 -4
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +32 -19
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +28 -28
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-manage-generic-content.html +57 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +46 -4
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +57 -27
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.module.js +1 -0
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.routes.js +16 -7
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +30 -4
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository.factory.js +2 -1
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +8 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/sync-plan-details-info.controller.js +6 -2
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/views/sync-plan-info.html +1 -1
  217. data/engines/bastion_katello/lib/bastion_katello/engine.rb +1 -1
  218. data/lib/katello/engine.rb +0 -1
  219. data/lib/katello/permission_creator.rb +4 -3
  220. data/lib/katello/permissions/host_permissions.rb +1 -0
  221. data/lib/katello/permissions/organization_permissions.rb +2 -1
  222. data/lib/katello/plugin.rb +15 -11
  223. data/lib/katello/repository_types/ansible_collection.rb +13 -1
  224. data/lib/katello/repository_types/deb.rb +13 -0
  225. data/lib/katello/repository_types/docker.rb +13 -1
  226. data/lib/katello/repository_types/file.rb +13 -0
  227. data/lib/katello/repository_types/ostree.rb +48 -4
  228. data/lib/katello/repository_types/python.rb +26 -12
  229. data/lib/katello/repository_types/yum.rb +16 -1
  230. data/lib/katello/tasks/repository.rake +3 -12
  231. data/lib/katello/tasks/reset.rake +4 -5
  232. data/lib/katello/version.rb +1 -1
  233. data/package.json +3 -2
  234. data/webpack/__mocks__/react-intl/index.js +4 -0
  235. data/webpack/components/ActionableDetail.js +23 -3
  236. data/webpack/components/AddedStatusLabel.js +1 -1
  237. data/webpack/components/Bookmark/AddBookmarkModal.js +96 -0
  238. data/webpack/components/Bookmark/Bookmark.scss +28 -0
  239. data/webpack/components/Bookmark/BookmarkActions.js +24 -0
  240. data/webpack/components/Bookmark/BookmarkConstants.js +3 -0
  241. data/webpack/components/Bookmark/BookmarkSelectors.js +15 -0
  242. data/webpack/components/Bookmark/index.js +94 -0
  243. data/webpack/components/EditableSwitch.js +6 -1
  244. data/webpack/components/EditableTextInput/EditableTextInput.js +41 -13
  245. data/webpack/components/Errata/index.js +69 -0
  246. data/webpack/components/ErratumTypeLabel.js +31 -0
  247. data/webpack/components/Loading.js +5 -2
  248. data/webpack/components/RoutedTabs/__tests__/RoutedTabs.test.js +5 -11
  249. data/webpack/components/RoutedTabs/index.js +77 -2
  250. data/webpack/components/Search/Search.js +67 -80
  251. data/webpack/components/Search/__tests__/search.test.js +8 -26
  252. data/webpack/components/SelectAllCheckbox/SelectAllCheckbox.scss +3 -0
  253. data/webpack/components/SelectAllCheckbox/index.js +126 -0
  254. data/webpack/components/SelectableDropdown/SelectableDropdown.js +7 -2
  255. data/webpack/components/Table/EmptyStateMessage.js +38 -17
  256. data/webpack/components/Table/MainTable.js +49 -10
  257. data/webpack/components/Table/MainTable.scss +11 -0
  258. data/webpack/components/Table/PageControls.js +45 -0
  259. data/webpack/components/Table/TableHooks.js +230 -0
  260. data/webpack/components/Table/TableWrapper.js +221 -50
  261. data/webpack/components/Table/helpers.js +17 -0
  262. data/webpack/components/TypeAhead/TypeAhead.js +74 -58
  263. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +25 -10
  264. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.scss +9 -8
  265. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -2
  266. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +32 -22
  267. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +101 -0
  268. data/webpack/components/extensions/HostDetails/Cards/__tests__/contentViewDetailsCard.test.js +53 -0
  269. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataActions.js +47 -0
  270. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataConstants.js +32 -0
  271. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataSelectors.js +16 -0
  272. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/EmptyPage.js +19 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +17 -0
  274. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +7 -0
  275. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/helpers.js +3 -0
  276. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +40 -0
  277. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerEmptyState.js +42 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerModal.js +118 -0
  279. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.js +347 -0
  280. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +16 -0
  281. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionContents.js +60 -0
  282. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionDetail.js +69 -0
  283. data/webpack/components/extensions/HostDetails/Tabs/HostTracesActions.js +19 -0
  284. data/webpack/components/extensions/HostDetails/Tabs/HostTracesConstants.js +2 -0
  285. data/webpack/components/extensions/HostDetails/Tabs/HostTracesSelectors.js +19 -0
  286. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +56 -0
  287. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +5 -0
  288. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.js +188 -0
  289. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +12 -0
  290. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errata.fixtures.json +67 -0
  291. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +785 -0
  292. data/webpack/components/extensions/HostDetails/Tabs/__tests__/resolveTraces.fixtures.json +35 -0
  293. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEmptyTraceResults.fixtures.json +7 -0
  294. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEnableJobInvocation.fixtures.json +35 -0
  295. data/webpack/components/extensions/HostDetails/Tabs/__tests__/traces.fixtures.json +44 -0
  296. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +386 -0
  297. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +20 -0
  298. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  299. data/webpack/components/extensions/RegistrationCommands/index.js +1 -1
  300. data/webpack/components/pf3Table/components/Table.js +1 -1
  301. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +3 -3
  302. data/webpack/containers/Application/Routes.js +3 -3
  303. data/webpack/containers/Application/config.js +21 -6
  304. data/webpack/containers/Application/overrides.scss +34 -3
  305. data/webpack/{fills_index.js → global_index.js} +11 -2
  306. data/webpack/global_test_setup.js +6 -1
  307. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -4
  308. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsTableSchema.js +1 -1
  309. data/webpack/scenes/Content/ContentActions.js +31 -0
  310. data/webpack/scenes/Content/ContentConfig.js +138 -0
  311. data/webpack/scenes/Content/ContentConstants.js +7 -0
  312. data/webpack/scenes/Content/ContentPage.js +89 -0
  313. data/webpack/scenes/Content/ContentSelectors.js +43 -0
  314. data/webpack/scenes/Content/Details/ContentCounts.js +42 -0
  315. data/webpack/scenes/Content/Details/ContentDetails.js +66 -0
  316. data/webpack/scenes/Content/Details/ContentInfo.js +60 -0
  317. data/webpack/scenes/Content/Details/ContentRepositories.js +78 -0
  318. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionDetails.fixtures.json +20 -0
  319. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionRepositoryDetails.fixtures.json +71 -0
  320. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +152 -0
  321. data/webpack/scenes/Content/Details/__tests__/pythonPackageDetails.fixtures.json +20 -0
  322. data/webpack/scenes/Content/Details/__tests__/pythonPackageRepositoryDetails.fixtures.json +71 -0
  323. data/webpack/scenes/Content/Details/index.js +4 -0
  324. data/webpack/scenes/Content/Table/ContentTable.js +90 -0
  325. data/webpack/scenes/Content/Table/index.js +3 -0
  326. data/webpack/scenes/Content/__tests__/ansibleCollections.fixtures.json +50 -0
  327. data/webpack/scenes/Content/__tests__/contentTable.test.js +89 -0
  328. data/webpack/scenes/Content/__tests__/contentTypes.fixtures.json +66 -0
  329. data/webpack/scenes/Content/__tests__/pythonPackages.fixtures.json +30 -0
  330. data/webpack/scenes/Content/index.js +4 -0
  331. data/webpack/scenes/ContentViews/ContentViewSelectors.js +5 -6
  332. data/webpack/scenes/ContentViews/ContentViewsActions.js +13 -8
  333. data/webpack/scenes/ContentViews/ContentViewsConstants.js +31 -4
  334. data/webpack/scenes/ContentViews/ContentViewsPage.js +4 -0
  335. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +19 -7
  336. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +7 -5
  337. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +1 -1
  338. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +7 -3
  339. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -2
  340. data/webpack/scenes/ContentViews/Delete/CVDeleteContext.js +4 -0
  341. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +170 -0
  342. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +108 -0
  343. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +69 -0
  344. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +121 -0
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +120 -0
  346. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +62 -0
  347. data/webpack/scenes/ContentViews/Delete/Steps/CVEnvironmentSelectionForm.scss +4 -0
  348. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +259 -0
  349. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +155 -0
  350. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +241 -0
  351. data/webpack/scenes/ContentViews/Delete/__tests__/cvDetails.fixtures.json +248 -0
  352. data/webpack/scenes/ContentViews/Delete/__tests__/cvVersionsData.fixtures.json +865 -0
  353. data/webpack/scenes/ContentViews/Delete/__tests__/envPathData.fixtures.json +424 -0
  354. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +15 -7
  355. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +123 -0
  356. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentEnvironments.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +8 -5
  358. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +109 -51
  359. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.fixtures.json +21 -6
  360. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +80 -16
  361. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +248 -3
  362. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +141 -0
  363. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +36 -54
  364. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +20 -4
  365. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +63 -38
  366. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +3 -4
  367. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +65 -0
  368. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +260 -0
  369. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +54 -0
  370. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +202 -0
  371. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +291 -0
  372. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +441 -0
  373. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +62 -3
  374. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +302 -0
  375. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +186 -23
  376. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +144 -19
  377. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +2 -0
  378. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +44 -13
  379. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +81 -17
  380. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +43 -43
  381. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +96 -0
  382. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContent.fixtures.json +166 -0
  383. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +90 -0
  384. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentSearch.fixtures.json +33 -0
  385. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +91 -0
  386. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +237 -0
  387. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.fixtures.json +42 -0
  388. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +265 -0
  389. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +218 -11
  390. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +517 -0
  391. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterErrata.fixtures.json +122 -0
  392. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterModulesStreams.fixtures.json +60 -0
  393. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewErrataByDateDetails.fixtures.json +359 -0
  394. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetail.fixtures.json +88 -102
  395. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +34 -9
  396. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +148 -132
  397. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +25 -7
  398. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvAllRepos.fixtures.json +150 -0
  399. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +74 -0
  400. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +404 -0
  401. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErratumFilterDetails.fixtures.json +89 -0
  402. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailModuleAffectedRepos.fixtures.json +383 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailWithAffectedRepos.fixtures.json +375 -0
  404. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterFixutre.fixture.json +282 -0
  405. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +392 -0
  406. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilterDetails.fixtures.json +97 -0
  407. data/webpack/scenes/ContentViews/Details/Filters/index.js +26 -0
  408. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +68 -79
  409. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +1 -2
  410. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +163 -0
  411. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromoteSelectors.js +16 -0
  412. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +9 -1
  413. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +88 -74
  414. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +8 -9
  415. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.fixtures.json +3 -3
  416. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +30 -9
  417. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionEnvironments.js +1 -1
  418. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.js +9 -5
  419. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.scss +2 -2
  420. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +132 -14
  421. data/webpack/scenes/ContentViews/Details/Versions/Delete/DeleteContext.js +4 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +176 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +127 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +131 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +128 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +94 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +67 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedActivationKeys.fixture.json +53 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +153 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvDropDownOptionsResponse.fixture.json +192 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +313 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemoveResponse.fixture.json +74 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionRemoveEnvPaths.fixtures.json +352 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionsResponseData.fixtures.json +583 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +96 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +97 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +332 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +128 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +44 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +66 -0
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +125 -0
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +115 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionAnsibleCollections.fixtures.json +449 -0
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionComponent.fixtures.json +753 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDebPackages.fixtures.json +58 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +158 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +289 -0
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsCounts.fixtures.json +73 -0
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +44 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDockerTags.fixtures.json +3024 -0
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionErrata.fixtures.json +201 -0
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionFiles.fixtures.json +22 -0
  453. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionModuleStreams.fixtures.json +196 -0
  454. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRepositories.fixtures.json +1000 -0
  455. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackageGroups.fixtures.json +44 -0
  456. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackages.fixtures.json +394 -0
  457. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.fixtures.json +4 -4
  458. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +95 -26
  459. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersionsWithTask.fixtures.json +2 -2
  460. data/webpack/scenes/ContentViews/Details/Versions/index.js +25 -0
  461. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +20 -16
  462. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +3 -5
  463. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +106 -64
  464. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +25 -4
  465. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +1 -1
  466. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +4 -1
  467. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +29 -36
  468. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +10 -0
  469. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +117 -0
  470. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +59 -0
  471. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  472. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +30 -11
  473. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +1 -1
  474. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +38 -1
  475. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +79 -0
  476. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +107 -0
  477. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +59 -0
  478. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsResponse.fixtures.json +116 -0
  479. data/webpack/scenes/ContentViews/expansions/__tests__/relatedCompositeCvs.fixtures.json +4 -0
  480. data/webpack/scenes/ContentViews/helpers.js +1 -0
  481. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepository/RepositorySetRepository.js +1 -1
  482. data/webpack/scenes/RedHatRepositories/components/SearchBar.js +4 -3
  483. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +1 -1
  484. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +17 -9
  485. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +3 -3
  486. data/webpack/test-utils/nockWrapper.js +20 -3
  487. data/webpack/utils/helpers.js +16 -2
  488. data/webpack/utils/useDebounce.js +20 -0
  489. metadata +232 -54
  490. data/app/assets/javascripts/katello/widgets/tabs.js +0 -13
  491. data/app/assets/stylesheets/katello/widgets/tabs.scss +0 -69
  492. data/app/lib/actions/katello/provider/update.rb +0 -38
  493. data/webpack/components/RoutedTabs/RoutedTabs.js +0 -90
  494. data/webpack/components/Search/Search.test.js +0 -23
  495. data/webpack/components/Search/__snapshots__/Search.test.js.snap +0 -21
  496. data/webpack/components/extensions/HostDetails/Tabs/ContentTab.js +0 -42
  497. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +0 -145
  498. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionPackages.js +0 -0
@@ -4,15 +4,19 @@ module Actions
4
4
  module Pulp3
5
5
  module Repository
6
6
  class ImportUpload < Pulp3::AbstractAsyncTask
7
- def plan(content_unit, repository, smart_proxy)
8
- plan_self(:content_unit => content_unit,
7
+ def plan(save_artifact_output, repository, smart_proxy)
8
+ plan_self(:save_artifact_output => save_artifact_output,
9
9
  :repository_id => repository.id,
10
10
  :smart_proxy_id => smart_proxy.id)
11
11
  end
12
12
 
13
13
  def invoke_external_task
14
- content_unit = input[:content_unit]
15
- content_unit_href = content_unit.is_a?(String) ? content_unit : content_unit.last[:created_resources].first
14
+ if input[:save_artifact_output][:pulp_tasks]&.any?
15
+ content_unit_href = input[:save_artifact_output][:pulp_tasks].last[:created_resources].first
16
+ else
17
+ content_unit_href = input[:save_artifact_output][:content_unit_href]
18
+ end
19
+
16
20
  repo = ::Katello::Repository.find(input[:repository_id])
17
21
  repo_backend_service = repo.backend_service(smart_proxy)
18
22
  output[:content_unit_href] = content_unit_href
@@ -17,7 +17,7 @@ module Actions
17
17
  repo_id_map = {}
18
18
 
19
19
  input[:repo_id_map].each do |source_repo_ids, dest_repo_map|
20
- repo_id_map[JSON.parse(source_repo_ids)] = dest_repo_map.deep_dup
20
+ repo_id_map[source_repo_ids] = dest_repo_map.deep_dup
21
21
  end
22
22
 
23
23
  output[:pulp_tasks] = ::Katello::Repository.find(repo_id_map.values.first[:dest_repo]).backend_service(smart_proxy).copy_content_from_mapping(repo_id_map, input)
@@ -25,7 +25,7 @@ module Actions
25
25
  repo_map = {}
26
26
 
27
27
  input[:repo_map].each do |source_repo_ids, dest_repo_map|
28
- repo_map[JSON.parse(source_repo_ids)] = dest_repo_map
28
+ repo_map[source_repo_ids] = dest_repo_map
29
29
  end
30
30
 
31
31
  if input[:unit_map][:errata].any?
@@ -15,6 +15,24 @@ module Actions
15
15
  fail NotImplementedError
16
16
  end
17
17
 
18
+ def index_action
19
+ plan = action.execution_plan
20
+ index_step = plan.run_steps.find { |s| s.action_class == Actions::Katello::Repository::IndexContent }
21
+ index_step&.action(plan)
22
+ end
23
+
24
+ def added_content_message
25
+ if (content_added = index_action&.output&.[](:new_content))
26
+ content_added = content_added.select { |_type, number| number > 0 }
27
+ if content_added&.any?
28
+ count_messages = content_added.map { |type, number| "#{type.to_s.humanize.pluralize}: #{number}" }
29
+ _("Added %s") % count_messages.join(', ')
30
+ else
31
+ _("No content added.")
32
+ end
33
+ end
34
+ end
35
+
18
36
  def sync_task
19
37
  tasks = action.external_task.select do |task|
20
38
  if task.key? 'name'
@@ -12,7 +12,12 @@ module Actions
12
12
  def humanized_details
13
13
  ret = []
14
14
  ret << _("Cancelled.") if cancelled?
15
- ret << _("Total steps: ") + "#{finished_units}/#{total_units}"
15
+ ret << added_content_message
16
+ if total_units == 0
17
+ ret << _("Waiting to start.")
18
+ else
19
+ ret << _("Total steps: ") + "#{finished_units}/#{total_units}"
20
+ end
16
21
  ret << "--------------------------------"
17
22
  progress_reports = sync_task.try(:[], 'progress_reports') || []
18
23
  progress_reports = progress_reports.sort_by { |pr| pr.try(:[], 'message') }
@@ -24,7 +29,7 @@ module Actions
24
29
  end
25
30
  end
26
31
 
27
- ret.join("\n")
32
+ ret.compact.join("\n")
28
33
  end
29
34
 
30
35
  def total_units
@@ -39,7 +39,12 @@ module Actions
39
39
  def humanized_details
40
40
  ret = []
41
41
  ret << _("Cancelled.") if cancelled?
42
- ret << _("Total steps: ") + "#{finished_units}/#{total_units}"
42
+ if total_units == 0
43
+ ret << _("Waiting to start.")
44
+ else
45
+ ret << _("Total steps: ") + "#{finished_units}/#{total_units}"
46
+ end
47
+
43
48
  ret << "--------------------------------"
44
49
  progress_reports = repair_task.try(:[], 'progress_reports') || []
45
50
  progress_reports = progress_reports.sort_by { |pr| pr.try(:[], 'message') }
@@ -9,14 +9,24 @@ module Actions
9
9
  end
10
10
 
11
11
  def invoke_external_task
12
+ repository = ::Katello::Repository.find(input[:repository_id])
12
13
  artifact_href = input[:options][:artifact_href] || fetch_artifact_href
13
14
  fail _("Content not uploaded to pulp") unless artifact_href
14
15
  content_type = input[:unit_type_id]
15
16
  content_backend_service = SmartProxy.pulp_primary.content_service(content_type)
16
- output[:pulp_tasks] = [content_backend_service.content_api_create(relative_path: input[:options][:file_name],
17
- artifact: artifact_href,
18
- repository_id: input[:repository_id],
19
- content_type: content_type)]
17
+
18
+ existing_content = ::Katello::Pulp3::PulpContentUnit.find_duplicate_unit(repository, input['unit_type_id'], {filename: input[:options][:file_name]}, input[:options][:sha256])
19
+ existing_content_href = existing_content&.results&.first&.pulp_href
20
+
21
+ if existing_content_href
22
+ output[:content_unit_href] = existing_content_href
23
+ []
24
+ else
25
+ output[:pulp_tasks] = [content_backend_service.content_api_create(relative_path: input[:options][:file_name],
26
+ artifact: artifact_href,
27
+ repository_id: input[:repository_id],
28
+ content_type: content_type)]
29
+ end
20
30
  end
21
31
 
22
32
  def fetch_artifact_href
@@ -135,6 +135,8 @@ module Katello
135
135
  end
136
136
  end
137
137
 
138
+ class UpstreamConsumerNotFound < StandardError; end
139
+
138
140
  class UpstreamEntitlementGone < StandardError; end
139
141
 
140
142
  class ContainerRegistryNotConfigured < StandardError
@@ -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
@@ -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