katello 3.18.0.rc1 → 4.0.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 (345) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +0 -19
  3. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -3
  4. data/app/controllers/katello/api/v2/api_controller.rb +1 -2
  5. data/app/controllers/katello/api/v2/capsule_content_controller.rb +2 -2
  6. data/app/controllers/katello/api/v2/content_credentials_controller.rb +24 -24
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +98 -0
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +88 -0
  9. data/app/controllers/katello/api/v2/content_imports_controller.rb +59 -0
  10. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +16 -7
  11. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +57 -92
  12. data/app/controllers/katello/api/v2/content_views_controller.rb +12 -3
  13. data/app/controllers/katello/api/v2/host_debs_controller.rb +1 -0
  14. data/app/controllers/katello/api/v2/host_errata_controller.rb +2 -2
  15. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -3
  16. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +20 -7
  17. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -1
  18. data/app/controllers/katello/api/v2/products_controller.rb +9 -9
  19. data/app/controllers/katello/api/v2/repositories_controller.rb +5 -19
  20. data/app/controllers/katello/api/v2/repository_sets_controller.rb +24 -14
  21. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +34 -0
  22. data/app/controllers/katello/api/v2/subscriptions_controller.rb +1 -1
  23. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +8 -4
  24. data/app/controllers/katello/concerns/api/v2/authorization.rb +10 -0
  25. data/app/controllers/katello/concerns/api/v2/bulk_hosts_extensions.rb +22 -18
  26. data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +1 -1
  27. data/app/controllers/katello/concerns/registration_controller_extensions.rb +16 -0
  28. data/app/helpers/katello/sync_management_helper.rb +0 -2
  29. data/app/lib/actions/candlepin/environment/create.rb +1 -1
  30. data/app/lib/actions/candlepin/environment/set_content.rb +1 -1
  31. data/app/lib/actions/helpers/smart_proxy_sync_history_helper.rb +24 -0
  32. data/app/lib/actions/katello/activation_key/create.rb +9 -11
  33. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +6 -2
  34. data/app/lib/actions/katello/capsule_content/sync.rb +8 -8
  35. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +31 -8
  36. data/app/lib/actions/katello/check_matching_content.rb +17 -0
  37. data/app/lib/actions/katello/content_view/environment_create.rb +6 -8
  38. data/app/lib/actions/katello/content_view/promote_to_environment.rb +1 -1
  39. data/app/lib/actions/katello/content_view/publish.rb +6 -5
  40. data/app/lib/actions/katello/content_view_version/import.rb +5 -11
  41. data/app/lib/actions/katello/content_view_version/import_library.rb +17 -0
  42. data/app/lib/actions/katello/content_view_version/incremental_update.rb +30 -10
  43. data/app/lib/actions/katello/host/hypervisors_update.rb +4 -4
  44. data/app/lib/actions/katello/host/update_system_purpose.rb +1 -1
  45. data/app/lib/actions/katello/host/upload_package_profile.rb +3 -1
  46. data/app/lib/actions/katello/host/upload_profiles.rb +8 -6
  47. data/app/lib/actions/katello/organization/create.rb +3 -5
  48. data/app/lib/actions/katello/organization/destroy.rb +1 -1
  49. data/app/lib/actions/katello/organization/manifest_delete.rb +3 -5
  50. data/app/lib/actions/katello/organization/manifest_import.rb +1 -1
  51. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  52. data/app/lib/actions/katello/repository/check_matching_content.rb +3 -1
  53. data/app/lib/actions/katello/repository/clone_contents.rb +8 -11
  54. data/app/lib/actions/katello/repository/create.rb +0 -8
  55. data/app/lib/actions/katello/repository/filtered_index_content.rb +3 -0
  56. data/app/lib/actions/katello/repository/import_upload.rb +2 -0
  57. data/app/lib/actions/katello/repository/index_content.rb +1 -0
  58. data/app/lib/actions/katello/repository/multi_clone_contents.rb +9 -12
  59. data/app/lib/actions/katello/repository/remove_content.rb +1 -1
  60. data/app/lib/actions/katello/repository/sync.rb +3 -1
  61. data/app/lib/actions/katello/repository/update.rb +1 -8
  62. data/app/lib/actions/katello/repository/upload_files.rb +1 -0
  63. data/app/lib/actions/middleware/execute_if_contents_changed.rb +4 -1
  64. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +35 -0
  65. data/app/lib/actions/pulp/consumer/sync_capsule.rb +4 -2
  66. data/app/lib/actions/pulp/orchestration/repository/refresh_repos.rb +0 -6
  67. data/app/lib/actions/pulp/repository/distributor_publish.rb +1 -1
  68. data/app/lib/actions/pulp3/abstract_async_task.rb +1 -0
  69. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +3 -3
  70. data/app/lib/actions/pulp3/capsule_content/sync.rb +1 -0
  71. data/app/lib/actions/pulp3/content_migration.rb +10 -0
  72. data/app/lib/actions/pulp3/content_migration_presenter.rb +59 -0
  73. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +1 -1
  74. data/app/lib/actions/pulp3/content_view_version/export.rb +6 -1
  75. data/app/lib/actions/pulp3/import_migration.rb +6 -1
  76. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +2 -1
  77. data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +30 -9
  78. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +60 -0
  79. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +0 -4
  80. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +4 -1
  81. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +16 -3
  82. data/app/lib/actions/pulp3/orchestration/repository/refresh_repos.rb +1 -6
  83. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  84. data/app/lib/actions/pulp3/repository/delete.rb +1 -1
  85. data/app/lib/actions/pulp3/repository/save_version.rb +1 -1
  86. data/app/lib/actions/pulp3/repository/upload_tag.rb +18 -0
  87. data/app/lib/katello/concerns/base_template_scope_extensions.rb +8 -0
  88. data/app/lib/katello/event_daemon/monitor.rb +53 -0
  89. data/app/lib/katello/event_daemon/runner.rb +99 -0
  90. data/app/lib/katello/logging.rb +32 -0
  91. data/app/lib/katello/messaging/connection.rb +1 -7
  92. data/app/lib/katello/validators/content_view_puppet_module_validator.rb +1 -1
  93. data/app/models/katello/activation_key.rb +2 -2
  94. data/app/models/katello/authorization/content_view_filter.rb +15 -0
  95. data/app/models/katello/authorization/content_view_version.rb +25 -2
  96. data/app/models/katello/authorization/content_view_version_export_history.rb +1 -1
  97. data/app/models/katello/authorization/organization.rb +8 -0
  98. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  99. data/app/models/katello/concerns/operatingsystem_extensions.rb +2 -0
  100. data/app/models/katello/concerns/organization_extensions.rb +2 -2
  101. data/app/models/katello/concerns/pulp_database_unit.rb +7 -0
  102. data/app/models/katello/concerns/redhat_extensions.rb +2 -2
  103. data/app/models/katello/concerns/smart_proxy_extensions.rb +33 -5
  104. data/app/models/katello/content_migration_progress.rb +4 -0
  105. data/app/models/katello/content_view.rb +35 -5
  106. data/app/models/katello/content_view_environment.rb +2 -2
  107. data/app/models/katello/content_view_filter.rb +5 -0
  108. data/app/models/katello/content_view_history.rb +2 -1
  109. data/app/models/katello/content_view_package_filter.rb +1 -1
  110. data/app/models/katello/content_view_puppet_environment.rb +2 -2
  111. data/app/models/katello/content_view_puppet_module.rb +8 -0
  112. data/app/models/katello/content_view_repository.rb +13 -1
  113. data/app/models/katello/content_view_version.rb +2 -1
  114. data/app/models/katello/content_view_version_export_history.rb +26 -1
  115. data/app/models/katello/erratum.rb +3 -1
  116. data/app/models/katello/glue/candlepin/pool.rb +2 -0
  117. data/app/models/katello/glue/pulp/repo.rb +0 -6
  118. data/app/models/katello/glue/pulp/repos.rb +1 -22
  119. data/app/models/katello/host/subscription_facet.rb +4 -0
  120. data/app/models/katello/ping.rb +11 -6
  121. data/app/models/katello/pool.rb +5 -0
  122. data/app/models/katello/product.rb +3 -3
  123. data/app/models/katello/repository.rb +36 -3
  124. data/app/models/katello/smart_proxy_sync_history.rb +8 -0
  125. data/app/models/katello/subscription_status.rb +3 -2
  126. data/app/presenters/katello/host_subscription_presenter.rb +3 -4
  127. data/app/presenters/katello/host_subscriptions_presenter.rb +24 -0
  128. data/app/services/katello/applicability/applicable_content_helper.rb +44 -15
  129. data/app/services/katello/candlepin_event_listener.rb +11 -19
  130. data/app/services/katello/event_monitor/poller_thread.rb +2 -11
  131. data/app/services/katello/pulp/smart_proxy_repository.rb +0 -15
  132. data/app/services/katello/pulp3/api/docker.rb +4 -0
  133. data/app/services/katello/pulp3/content_view_version/export.rb +122 -6
  134. data/app/services/katello/pulp3/content_view_version/import.rb +37 -22
  135. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +6 -16
  136. data/app/services/katello/pulp3/content_view_version/import_validator.rb +84 -0
  137. data/app/services/katello/pulp3/docker_manifest.rb +1 -0
  138. data/app/services/katello/pulp3/docker_tag.rb +1 -0
  139. data/app/services/katello/pulp3/migration.rb +51 -10
  140. data/app/services/katello/pulp3/repository.rb +13 -4
  141. data/app/services/katello/pulp3/repository/docker.rb +5 -0
  142. data/app/services/katello/pulp3/repository/yum.rb +15 -10
  143. data/app/services/katello/pulp3/task.rb +7 -3
  144. data/app/services/katello/pulp3/task_group.rb +10 -0
  145. data/app/services/katello/repository_type.rb +3 -2
  146. data/app/services/katello/smart_proxy_helper.rb +9 -0
  147. data/app/views/foreman/hosts/_registration.html.erb +12 -0
  148. data/app/views/foreman/smart_proxies/_content_tab.html.erb +4 -47
  149. data/app/views/foreman/smart_proxies/show.html.erb +1 -1
  150. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +22 -25
  151. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +1 -0
  152. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  153. data/app/views/katello/api/v2/content_views/show.json.rabl +6 -0
  154. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -9
  155. data/app/views/katello/layouts/react.html.erb +3 -2
  156. data/app/views/overrides/activation_keys/_host_tab_pane.html.erb +1 -5
  157. data/app/views/overrides/organizations/_edit_override.html.erb +1 -4
  158. data/app/views/overrides/smart_proxies/_environment_tab.html.erb +1 -1
  159. data/app/views/overrides/smart_proxies/_environment_tab_pane.html.erb +1 -1
  160. data/config/katello.yaml.example +0 -3
  161. data/config/routes/api/v2.rb +31 -13
  162. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  163. data/db/migrate/20191204214919_add_content_view_version_counts.rb +0 -1
  164. data/db/migrate/20200514092553_move_katello_fields_from_hostgroups.katello.rb +5 -2
  165. data/db/migrate/20200929200357_create_katello_smart_proxy_sync_history.rb +13 -0
  166. data/db/migrate/20201021150008_add_import_only_to_katello_content_view.rb +5 -0
  167. data/db/migrate/20201119211133_pulp3_migration_progress.rb +9 -0
  168. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +56 -0
  169. data/db/migrate/20210128231228_add_type_and_from_cvv_to_cvv_export_history.rb +14 -0
  170. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +7 -0
  171. data/db/seeds.d/104-proxy.rb +1 -1
  172. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +1 -1
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/katello-agent-notice.html +1 -1
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-system-purpose-modal.html +35 -40
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-register-os-client.directive.js +17 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -2
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-client.html +12 -5
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-deb-client.html +38 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-oracle-client.html +5 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-sles-client.html +28 -0
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register.html +14 -11
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.controller.js +6 -2
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-activation-keys.controller.js +8 -3
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-content-hosts.controller.js +9 -3
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-details.controller.js +12 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter-details.html +2 -2
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details.html +7 -7
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-info.html +7 -1
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-publish.html +4 -0
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/new/content-view-new.controller.js +17 -3
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/new/views/content-view-new.html +16 -2
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/views/content-views.html +5 -0
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +78 -7
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +17 -20
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +17 -24
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +1292 -1170
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +17 -20
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +858 -807
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +18 -19
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +17 -24
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +17 -18
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +986 -971
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +19 -20
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +9 -9
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +2 -2
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +1 -1
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/download-policy.service.js +0 -1
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +1 -1
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +8 -1
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +2 -2
  213. data/lib/katello/engine.rb +6 -6
  214. data/lib/katello/middleware/event_daemon.rb +1 -1
  215. data/lib/katello/permission_creator.rb +35 -14
  216. data/lib/katello/plugin.rb +8 -3
  217. data/lib/katello/tasks/delete_orphaned_content.rake +1 -3
  218. data/lib/katello/tasks/jenkins.rake +1 -1
  219. data/lib/katello/tasks/pulp3_content_switchover.rake +1 -1
  220. data/lib/katello/tasks/pulp3_migration.rake +18 -6
  221. data/lib/katello/tasks/pulp3_migration_abort.rake +22 -0
  222. data/lib/katello/tasks/pulp3_migration_stats.rake +28 -8
  223. data/lib/katello/tasks/pulp3_post_migration_check.rake +1 -3
  224. data/lib/katello/tasks/receptor/extract_orgs.rake +1 -1
  225. data/lib/katello/tasks/reimport.rake +1 -1
  226. data/lib/katello/tasks/repository.rake +3 -5
  227. data/lib/katello/tasks/upgrades/4.0/remove_ostree_puppet_content.rake +16 -0
  228. data/lib/katello/version.rb +1 -1
  229. data/lib/proxy_api/container_gateway.rb +21 -0
  230. data/locale/action_names.rb +51 -51
  231. data/locale/bn/katello.edit.po +0 -0
  232. data/locale/bn/katello.po +136 -51
  233. data/locale/cs/katello.edit.po +0 -0
  234. data/locale/cs/katello.po +136 -49
  235. data/locale/de/katello.edit.po +0 -0
  236. data/locale/de/katello.po +136 -48
  237. data/locale/en/katello.edit.po +0 -0
  238. data/locale/en/katello.po +136 -48
  239. data/locale/es/katello.edit.po +0 -0
  240. data/locale/es/katello.po +136 -48
  241. data/locale/fr/katello.edit.po +0 -0
  242. data/locale/fr/katello.po +136 -48
  243. data/locale/gu/katello.edit.po +0 -0
  244. data/locale/gu/katello.po +136 -51
  245. data/locale/hi/katello.edit.po +0 -0
  246. data/locale/hi/katello.po +136 -51
  247. data/locale/it/katello.edit.po +0 -0
  248. data/locale/it/katello.po +136 -48
  249. data/locale/ja/katello.edit.po +0 -0
  250. data/locale/ja/katello.po +136 -48
  251. data/locale/katello.pot +941 -767
  252. data/locale/kn/katello.edit.po +0 -0
  253. data/locale/kn/katello.po +136 -51
  254. data/locale/ko/katello.edit.po +0 -0
  255. data/locale/ko/katello.po +136 -48
  256. data/locale/mr/katello.edit.po +0 -0
  257. data/locale/mr/katello.po +136 -51
  258. data/locale/or/katello.edit.po +0 -0
  259. data/locale/or/katello.po +136 -51
  260. data/locale/pa/katello.edit.po +0 -0
  261. data/locale/pa/katello.po +136 -51
  262. data/locale/pt/katello.edit.po +0 -0
  263. data/locale/pt/katello.po +136 -51
  264. data/locale/pt_BR/katello.edit.po +0 -0
  265. data/locale/pt_BR/katello.po +136 -48
  266. data/locale/ru/katello.edit.po +0 -0
  267. data/locale/ru/katello.po +136 -48
  268. data/locale/ta/katello.edit.po +0 -0
  269. data/locale/ta/katello.po +136 -51
  270. data/locale/te/katello.edit.po +0 -0
  271. data/locale/te/katello.po +136 -51
  272. data/locale/zh_CN/katello.edit.po +0 -0
  273. data/locale/zh_CN/katello.po +136 -48
  274. data/locale/zh_TW/katello.edit.po +0 -0
  275. data/locale/zh_TW/katello.po +136 -48
  276. data/package.json +1 -1
  277. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +0 -1
  278. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +2 -0
  279. data/webpack/__mocks__/foremanReact/components/common/dates/LongDateTime.js +5 -0
  280. data/webpack/{scenes/ContentViews/Details/Repositories → components/SelectableDropdown}/SelectableDropdown.js +20 -3
  281. data/webpack/components/SelectableDropdown/__tests__/SelectableDropdown.test.js +45 -0
  282. data/webpack/components/SelectableDropdown/index.js +3 -0
  283. data/webpack/components/Table/TableWrapper.js +2 -1
  284. data/webpack/components/Table/helpers.js +14 -0
  285. data/webpack/components/TypeAhead/TypeAhead.js +2 -1
  286. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +2 -1
  287. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +0 -1
  288. data/webpack/containers/Application/overrides.scss +6 -0
  289. data/webpack/index.js +6 -0
  290. data/webpack/redux/actions/RedHatRepositories/helpers.js +5 -5
  291. data/webpack/scenes/ContentViews/ContentViewsActions.js +31 -2
  292. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -1
  293. data/webpack/scenes/ContentViews/Copy/ContentViewCopySelectors.js +16 -0
  294. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +77 -0
  295. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +44 -0
  296. data/webpack/scenes/ContentViews/Copy/__tests__/contentViewCopyResult.fixtures.json +42 -0
  297. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +39 -0
  298. data/webpack/scenes/ContentViews/Copy/index.js +4 -0
  299. data/webpack/scenes/ContentViews/Create/ContentViewCreateSelectors.js +16 -0
  300. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +58 -0
  301. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +175 -0
  302. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +27 -0
  303. data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +42 -0
  304. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +92 -0
  305. data/webpack/scenes/ContentViews/Create/index.js +4 -0
  306. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +16 -0
  307. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +20 -1
  308. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +17 -7
  309. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +19 -13
  310. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +40 -0
  311. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +124 -0
  312. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +134 -0
  313. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +92 -0
  314. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +44 -25
  315. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +17 -7
  316. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +24 -0
  317. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +53 -3
  318. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +4 -3
  319. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +41 -0
  320. data/webpack/scenes/ContentViews/helpers.js +13 -0
  321. data/webpack/scenes/SmartProxy/Content.js +17 -0
  322. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +11 -0
  323. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +3 -0
  324. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +16 -0
  325. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +152 -0
  326. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentResult.fixtures.json +140 -0
  327. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +38 -0
  328. data/webpack/scenes/SmartProxy/index.js +4 -0
  329. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +13 -11
  330. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +3 -3
  331. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +2 -2
  332. data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +2 -2
  333. data/webpack/test-utils/react-testing-lib-wrapper.js +8 -2
  334. data/webpack/utils/helpers.js +3 -0
  335. metadata +110 -31
  336. data/app/controllers/katello/api/v2/gpg_keys_controller.rb +0 -114
  337. data/app/overrides/disable_turbolinks_on_proxies_index.rb +0 -5
  338. data/app/services/katello/event_daemon.rb +0 -135
  339. data/app/services/katello/pulp/content_counts_calculator.rb +0 -60
  340. data/lib/katello/tasks/common.rake +0 -7
  341. data/lib/katello/tasks/reports.rake +0 -4
  342. data/lib/katello/tasks/upgrades/3.10/update_gpg_key_urls.rake +0 -32
  343. data/webpack/__mocks__/foremanReact/components/common/Fill/GlobalFill.js +0 -3
  344. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.scss +0 -5
  345. data/webpack/scenes/ContentViews/Table/actionResolver.js +0 -28
@@ -19,25 +19,15 @@ module Katello
19
19
  repo_api.read(version_href_to_repository_href(version_href))
20
20
  end
21
21
 
22
- def repository_hrefs
23
- version_hrefs.map { |href| version_href_to_repository_href(href) }.uniq
24
- end
25
-
26
- def version_hrefs
27
- repositories.pluck(:version_href).compact
28
- end
29
-
30
- def repositories
31
- if @content_view_version.default?
32
- @content_view_version.repositories.yum_type
33
- else
34
- @content_view_version.archived_repos.yum_type
35
- end
36
- end
37
-
38
22
  def version_href_to_repository_href(version_href)
39
23
  version_href.split("/")[0..-3].join("/") + "/"
40
24
  end
25
+
26
+ def zero_version_href(repository_href)
27
+ # /pulp/api/v3/repositories/rpm/rpm/e59c4334-81d2-4d6b-a1a1-b61fa55ed664/versions/0/
28
+ repository_href += "/" unless repository_href.ends_with?('/')
29
+ "#{repository_href}versions/0/"
30
+ end
41
31
  end
42
32
  end
43
33
  end
@@ -0,0 +1,84 @@
1
+ module Katello
2
+ module Pulp3
3
+ module ContentViewVersion
4
+ class ImportValidator
5
+ attr_accessor :metadata, :path, :content_view
6
+ def initialize(content_view:, path:, metadata:)
7
+ self.content_view = content_view
8
+ self.path = path
9
+ self.metadata = metadata
10
+ end
11
+
12
+ def check!
13
+ unless content_view.default?
14
+ ensure_importing_cvv_does_not_exist!
15
+ ensure_from_cvv_exists!
16
+ end
17
+ ensure_repositories_metadata_are_in_the_library!
18
+ end
19
+
20
+ def ensure_importing_cvv_does_not_exist!
21
+ major = metadata[:content_view_version][:major]
22
+ minor = metadata[:content_view_version][:minor]
23
+
24
+ if ::Katello::ContentViewVersion.where(major: major, minor: minor, content_view: content_view).exists?
25
+ fail _("Content View Version specified in the metadata - '%{name}' already exists. "\
26
+ "If you wish to replace the existing version, delete %{name} and try again. " % { name: "#{content_view.name} #{major}.#{minor}" })
27
+ end
28
+ end
29
+
30
+ def ensure_from_cvv_exists!
31
+ major = metadata[:content_view_version][:major]
32
+ minor = metadata[:content_view_version][:minor]
33
+
34
+ if metadata[:from_content_view_version].present?
35
+ from_major = metadata[:from_content_view_version][:major]
36
+ from_minor = metadata[:from_content_view_version][:minor]
37
+
38
+ unless ::Katello::ContentViewVersion.where(major: from_major, minor: from_minor, content_view: content_view).exists?
39
+ fail _("Prior Content View Version specified in the metadata - '%{name}' does not exist. "\
40
+ "Please import the metadata for '%{name}' before importing '%{current}' " % { name: "#{content_view.name} #{from_major}.#{from_minor}",
41
+ current: "#{content_view.name} #{major}.#{minor}"})
42
+ end
43
+ end
44
+ end
45
+
46
+ def ensure_repositories_metadata_are_in_the_library!
47
+ repos_in_library = Katello::Repository.
48
+ in_default_view.
49
+ yum_type.
50
+ joins(:product => :provider, :content_view_version => :content_view).
51
+ joins(:root).
52
+ where("#{::Katello::ContentView.table_name}.organization_id" => content_view.organization_id).
53
+ pluck("#{::Katello::Product.table_name}.name",
54
+ "#{::Katello::RootRepository.table_name}.name",
55
+ "#{::Katello::Provider.table_name}.provider_type"
56
+ )
57
+
58
+ # repos_in_library look like [["prod1", "repo1", "Anonymous"], ["prod2", "repo2", "Red Hat"]]
59
+ product_repos_in_library = repos_in_library.map { |product, repo, provider| [product, repo, provider == ::Katello::Provider::REDHAT] }
60
+ product_repos_in_metadata = metadata[:repository_mapping].values.map { |repo| [repo[:product], repo[:repository], repo[:redhat]] }
61
+ # product_repos_in_library & product_repos_in_metadata look like [["prod1", "repo1", false], ["prod2", "repo2", false]]
62
+ product_repos_not_in_library = product_repos_in_metadata - product_repos_in_library
63
+ unless product_repos_not_in_library.blank?
64
+ repos_in_import = generate_product_repo_i18n_string(product_repos_not_in_library)
65
+ fail _("The following repositories provided in the import metadata are either not available in the Library or are of incorrect Respository Type. "\
66
+ "Please add or enable the repositories before importing\n "\
67
+ "%{repos}" % { content_view: content_view.name, repos: repos_in_import.join("")}
68
+ )
69
+ end
70
+ end
71
+
72
+ def generate_product_repo_i18n_string(product_repos)
73
+ # product_repos look like [["prod1", "repo1", false], ["prod2", "repo2", false]]
74
+ product_repos.map do |product, repo, redhat|
75
+ repo_type = redhat ? _("Red Hat") : _("Custom")
76
+ _("\n* Product = '%{product}', Repository = '%{repository}', Repository Type = '%{repo_type}'" % { product: product,
77
+ repository: repo,
78
+ repo_type: repo_type})
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -2,6 +2,7 @@ module Katello
2
2
  module Pulp3
3
3
  class DockerManifest < PulpContentUnit
4
4
  include LazyAccessor
5
+ CONTENT_TYPE = "docker_manifest".freeze
5
6
 
6
7
  def self.content_api
7
8
  PulpContainerClient::ContentManifestsApi.new(Katello::Pulp3::Api::Docker.new(SmartProxy.pulp_primary!).api_client)
@@ -2,6 +2,7 @@ module Katello
2
2
  module Pulp3
3
3
  class DockerTag < PulpContentUnit
4
4
  include LazyAccessor
5
+ CONTENT_TYPE = "docker_tag".freeze
5
6
 
6
7
  def self.content_api
7
8
  PulpContainerClient::ContentTagsApi.new(Katello::Pulp3::Api::Docker.new(SmartProxy.pulp_primary!).api_client)
@@ -3,7 +3,7 @@ require 'pulp_2to3_migration_client'
3
3
  module Katello
4
4
  module Pulp3
5
5
  class Migration
6
- attr_accessor :smart_proxy, :reimport_all
6
+ attr_accessor :smart_proxy, :reimport_all, :task_id
7
7
  GET_QUERY_ID_LENGTH = 90
8
8
 
9
9
  MUTABLE_CONTENT_TYPES = [
@@ -21,8 +21,10 @@ module Katello
21
21
  overridden.select { |type| SmartProxy.pulp_primary.pulp3_repository_type_support?(type.to_s, false) }.map { |t| t.to_s }
22
22
  end
23
23
 
24
- def initialize(smart_proxy, repository_types = Migration.repository_types_for_migration, options = {})
25
- self.reimport_all = options.fetch(:reimport, false)
24
+ def initialize(smart_proxy, options = {})
25
+ self.task_id = options.fetch(:task_id, nil)
26
+ self.reimport_all = options.fetch(:reimport_all, false)
27
+ repository_types = options.fetch(:repository_types, Migration.repository_types_for_migration)
26
28
 
27
29
  if (repository_types - smart_proxy.supported_pulp_types[:pulp3][:overriden_to_pulp2]).any?
28
30
  fail ::Katello::Errors::Pulp3MigrationError, _("Pulp 3 migration cannot run. Types %s have already been migrated.") %
@@ -62,6 +64,15 @@ module Katello
62
64
  [YumMetadataFile]
63
65
  end
64
66
 
67
+ def last_successful_migration_time
68
+ task = ForemanTasks::Task.where(:label => Actions::Pulp3::ContentMigration.to_s, :result => 'success').order("started_at desc").first
69
+ if reimport_all || task.nil?
70
+ 0
71
+ else
72
+ task.started_at.to_i
73
+ end
74
+ end
75
+
65
76
  def content_types_for_migration
66
77
  content_types = @repository_types.collect do |repository_type_label|
67
78
  Katello::RepositoryTypeManager.repository_types[repository_type_label].content_types_to_index
@@ -70,7 +81,20 @@ module Katello
70
81
  content_types.flatten - Migration.ignorable_content_types
71
82
  end
72
83
 
84
+ def update_import_status(message, index = nil)
85
+ #reduce output updating, only update every 20 items
86
+ if (index.nil? || index % 20 == 0) && self.task_id
87
+ progress = Katello::ContentMigrationProgress.find_or_create_by(:task_id => self.task_id)
88
+ progress.update(:progress_message => message)
89
+ progress.save!
90
+
91
+ fail Katello::Errors::Pulp3MigrationError, "Cancelled by user." if progress.canceled?
92
+ end
93
+ end
94
+
73
95
  def import_pulp3_content
96
+ update_import_status("Starting katello import phase.")
97
+
74
98
  Katello::Logging.time("CONTENT_MIGRATION - Total Import Process") do
75
99
  @repository_types.each do |repository_type_label|
76
100
  Katello::Logging.time("CONTENT_MIGRATION - Importing Repository", data: {type: repository_type_label}) do
@@ -78,7 +102,7 @@ module Katello
78
102
  end
79
103
 
80
104
  Katello::RepositoryTypeManager.repository_types[repository_type_label].content_types_to_index.each do |content_type|
81
- Katello::Logging.time("CONTENT_MIGRATION - Importing Content", data: {type: content_type}) do
105
+ Katello::Logging.time("CONTENT_MIGRATION - Importing Content", data: {type: content_type.label}) do
82
106
  import_content_type(content_type)
83
107
  end
84
108
  end
@@ -114,7 +138,9 @@ module Katello
114
138
  if repository_type_label == 'yum'
115
139
  import_yum_repos(imported, katello_repos)
116
140
  else
117
- katello_repos.each do |repo|
141
+ repo_count = katello_repos.count
142
+ katello_repos.each_with_index do |repo, index|
143
+ update_import_status("Importing migrated content units #{repository_type_label}: #{index + 1}/#{repo_count}", index)
118
144
  found = imported.find { |migrated_repo| migrated_repo.pulp2_repo_id == repo.pulp_id }
119
145
  import_repo(repo, found) if found
120
146
  end
@@ -122,7 +148,9 @@ module Katello
122
148
  end
123
149
 
124
150
  def import_yum_repos(migrated_repo_items, repos)
125
- repos.each do |yum_repo|
151
+ repo_count = repos.count
152
+ repos.each_with_index do |yum_repo, index|
153
+ update_import_status("Importing migrated yum repositories: #{index + 1}/#{repo_count}", index)
126
154
  to_find = nil
127
155
  if yum_repo.content_view.composite?
128
156
  if yum_repo.link?
@@ -165,10 +193,16 @@ module Katello
165
193
  process_distributions(pulp3_api, migrated_repo.pulp3_distribution_hrefs)
166
194
  end
167
195
 
196
+ def distribution_path_from_cache(href, pulp3_api)
197
+ @distribution_cache ||= {}
198
+ @distribution_cache[href] ||= pulp3_api.distributions_api.read(href).base_path
199
+ @distribution_cache[href]
200
+ end
201
+
168
202
  def process_distributions(pulp3_api, dist_hrefs_list)
169
203
  #distribution_path_hash(pulp3_api, dist_hrefs_list).each do |relative_path, href|
170
204
  dist_hrefs_list.each do |href|
171
- relative_path = pulp3_api.distributions_api.read(href).base_path
205
+ relative_path = distribution_path_from_cache(href, pulp3_api)
172
206
 
173
207
  dist_ref = Katello::Pulp3::DistributionReference.find_or_initialize_by(:path => relative_path)
174
208
  if (distribution_repo = Katello::Repository.find_by(:relative_path => relative_path) || Katello::Repository.find_by(:container_repository_name => relative_path))
@@ -189,14 +223,16 @@ module Katello
189
223
  end
190
224
 
191
225
  def operate_on_errata
226
+ last_migration_time = last_successful_migration_time
192
227
  offset = 0
193
- limit = 300
194
- response = pulp2_content_api.list(pulp2_content_type_id: 'erratum', offset: offset, limit: limit)
228
+ limit = SETTINGS[:katello][:pulp][:bulk_load_size]
229
+ response = pulp2_content_api.list(pulp2_content_type_id: 'erratum', offset: offset, limit: limit, pulp2_last_updated__gt: last_migration_time)
195
230
  total_count = response.count
196
231
  yield(response.results)
197
232
  until (offset + limit > total_count)
198
233
  offset += limit
199
- response = pulp2_content_api.list(pulp2_content_type_id: 'erratum', offset: offset, limit: limit)
234
+ response = pulp2_content_api.list(pulp2_content_type_id: 'erratum', offset: offset, limit: limit, pulp2_last_updated__gt: last_migration_time)
235
+ update_import_status("Importing migrated content type erratum: #{offset + limit}/#{total_count}")
200
236
  yield(response.results)
201
237
  end
202
238
  end
@@ -236,7 +272,12 @@ module Katello
236
272
  unmigrated_units = unmigrated_units.where(:migrated_pulp3_href => nil)
237
273
  end
238
274
 
275
+ total_count = unmigrated_units.count
276
+ current_count = 0
277
+
239
278
  unmigrated_units.select(:id, :pulp_id).find_in_batches(batch_size: GET_QUERY_ID_LENGTH) do |needing_hrefs|
279
+ current_count += needing_hrefs.count
280
+ update_import_status("Importing migrated content type #{content_type.label}: #{current_count}/#{total_count}")
240
281
  migrated_units = pulp2_content_api.list(pulp2_id__in: needing_hrefs.map { |unit| unit.pulp_id }.join(','))
241
282
  migrated_units.results.each do |migrated_unit|
242
283
  matching_record = needing_hrefs.find { |db_unit| db_unit.pulp_id == migrated_unit.pulp2_id }
@@ -1,5 +1,5 @@
1
+ # rubocop:disable Metrics/ClassLength
1
2
  require "pulpcore_client"
2
-
3
3
  module Katello
4
4
  module Pulp3
5
5
  class Repository
@@ -48,6 +48,10 @@ module Katello
48
48
  nil
49
49
  end
50
50
 
51
+ def published?
52
+ !repo.publication_href.nil?
53
+ end
54
+
51
55
  def skip_types
52
56
  nil
53
57
  end
@@ -188,8 +192,9 @@ module Katello
188
192
  api.repositories_api.read(repository_reference.try(:repository_href))
189
193
  end
190
194
 
191
- def delete(href = repository_reference.try(:repository_href))
192
- repository_reference.try(:destroy)
195
+ def delete_repository(repo_reference = repository_reference)
196
+ href = repo_reference.try(:repository_href)
197
+ repo_reference.try(:destroy)
193
198
  ignore_404_exception { api.repositories_api.delete(href) } if href
194
199
  end
195
200
 
@@ -257,8 +262,12 @@ module Katello
257
262
  create_version(:base_version => from_repository.version_href)
258
263
  end
259
264
 
265
+ def version_zero?
266
+ repo.version_href.ends_with?('/versions/0/')
267
+ end
268
+
260
269
  def delete_version
261
- ignore_404_exception { api.repository_versions_api.delete(repo.version_href) }
270
+ ignore_404_exception { api.repository_versions_api.delete(repo.version_href) } unless version_zero?
262
271
  end
263
272
 
264
273
  def create_version(options = {})
@@ -52,6 +52,11 @@ module Katello
52
52
  api.class.recursive_manage_class.new(content_units: options[:remove_content_units]))
53
53
  end
54
54
 
55
+ def tag_manifest(name, digest)
56
+ api.repositories_api.tag(repository_reference.repository_href,
57
+ api.class.tag_image_class.new(tag: name, digest: digest))
58
+ end
59
+
55
60
  def add_content(content_unit_href)
56
61
  content_unit_href = [content_unit_href] unless content_unit_href.is_a?(Array)
57
62
  api.repositories_api.add(repository_reference.repository_href, content_units: content_unit_href)
@@ -159,8 +159,7 @@ module Katello
159
159
 
160
160
  data_dup.config[i][:content] = leftover_units.pop(copy_amount)
161
161
  unit_copy_counter += copy_amount
162
- # Do copy call if limit is reached or if we're under the limit but on the last repo config.
163
- if unit_copy_counter >= UNIT_LIMIT || (i == data_dup.config.size - 1 && leftover_units.empty?)
162
+ if unit_copy_counter != 0
164
163
  tasks << api.copy_api.copy_content(data_dup)
165
164
  unit_copy_counter = 0
166
165
  end
@@ -208,14 +207,20 @@ module Katello
208
207
  tasks
209
208
  end
210
209
 
211
- def copy_all(source_repository)
212
- data = PulpRpmClient::Copy.new
213
- data.config = [{
214
- source_repo_version: source_repository.version_href,
215
- dest_repo: repository_reference.repository_href
216
- }]
210
+ def copy_all(source_repository, mirror: false)
211
+ if mirror
212
+ data = PulpRpmClient::RepositoryAddRemoveContent.new(
213
+ base_version: source_repository.version_href)
217
214
 
218
- [api.copy_api.copy_content(data)]
215
+ [api.repositories_api.modify(repository_reference.repository_href, data)]
216
+ else
217
+ data = PulpRpmClient::Copy.new
218
+ data.config = [{
219
+ source_repo_version: source_repository.version_href,
220
+ dest_repo: repository_reference.repository_href
221
+ }]
222
+ [api.copy_api.copy_content(data)]
223
+ end
219
224
  end
220
225
 
221
226
  def remove_all_content_from_repo(repo_href)
@@ -335,7 +340,7 @@ module Katello
335
340
  multi_copy_units(repo_id_map, dependency_solving)
336
341
  end
337
342
 
338
- def copy_content_for_source(source_repository, options = {})
343
+ def copy_content_for_source(source_repository, options = {}) # rubocop:disable Metrics/CyclomaticComplexity
339
344
  filters = [ContentViewErratumFilter, ContentViewPackageGroupFilter, ContentViewPackageFilter].collect do |filter_class|
340
345
  filter_class.where(:id => options[:filter_ids])
341
346
  end
@@ -68,6 +68,10 @@ module Katello
68
68
  task_data[:finish_time] || FINISHED_STATES.include?(task_data[:state])
69
69
  end
70
70
 
71
+ def progress_reports
72
+ task_data['progress_reports']
73
+ end
74
+
71
75
  def poll
72
76
  task_data(true)
73
77
  self
@@ -79,7 +83,7 @@ module Katello
79
83
 
80
84
  def error
81
85
  if task_data[:state] == CANCELED
82
- self.new(_("Task canceled"))
86
+ _("Task canceled")
83
87
  elsif task_data[:state] == FAILED
84
88
  if task_data[:error][:description].blank?
85
89
  _("Pulp task error")
@@ -90,8 +94,8 @@ module Katello
90
94
  end
91
95
 
92
96
  def cancel
93
- data = PulpcoreClient::Task.new(state: 'canceled')
94
- tasks_api.tasks_cancel(pulp_task['pulp_href'], data)
97
+ data = PulpcoreClient::TaskResponse.new(state: 'canceled')
98
+ tasks_api.tasks_cancel(task_data['pulp_href'], data)
95
99
  #the main task may have completed, so cancel spawned tasks too
96
100
  task_data['spawned_tasks']&.each { |spawned| tasks_api.tasks_cancel(spawned['pulp_href'], data) }
97
101
  end
@@ -53,6 +53,10 @@ module Katello
53
53
  task_group_data['all_tasks_dispatched'] == true && IN_PROGRESS_STATES.all? { |state| task_group_data[state] == 0 }
54
54
  end
55
55
 
56
+ def group_progress_reports
57
+ task_group_data['group_progress_reports']
58
+ end
59
+
56
60
  def poll
57
61
  clear_task_group_data
58
62
  task_group_data
@@ -73,6 +77,12 @@ module Katello
73
77
  end
74
78
 
75
79
  def cancel
80
+ tasks_api = ::Katello::Pulp3::Api::Core.new(@smart_proxy).tasks_api
81
+ tasks_response = tasks_api.list(task_group: task_group_data['pulp_href'])
82
+ data = PulpcoreClient::TaskResponse.new(state: 'canceled')
83
+ tasks_response.results.collect do |result|
84
+ tasks_api.tasks_cancel(result.pulp_href, data)
85
+ end
76
86
  end
77
87
  end
78
88
  end
@@ -33,7 +33,7 @@ module Katello
33
33
  end
34
34
 
35
35
  def content_types_to_index
36
- if SmartProxy.pulp_primary.pulp3_repository_type_support?(self)
36
+ if SmartProxy.pulp_primary&.pulp3_repository_type_support?(self)
37
37
  # type.index being false supersedes type.index_on_pulp3 being true
38
38
  @content_types.select { |type| type.index && type.index_on_pulp3 }
39
39
  else
@@ -70,7 +70,8 @@ module Katello
70
70
  {
71
71
  :name => self.id.to_s,
72
72
  :id => self.id,
73
- :creatable => @allow_creation_by_user
73
+ :creatable => @allow_creation_by_user,
74
+ :pulp3_support => SmartProxy.pulp_primary.pulp3_repository_type_support?(self)
74
75
  }
75
76
  end
76
77