katello 3.18.0.rc2.1 → 4.0.0.rc2

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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/katello/katello.scss +0 -72
  3. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +0 -19
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -3
  5. data/app/controllers/katello/api/v2/api_controller.rb +1 -2
  6. data/app/controllers/katello/api/v2/capsule_content_controller.rb +2 -2
  7. data/app/controllers/katello/api/v2/content_credentials_controller.rb +24 -24
  8. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +98 -0
  9. data/app/controllers/katello/api/v2/content_exports_controller.rb +88 -0
  10. data/app/controllers/katello/api/v2/content_imports_controller.rb +59 -0
  11. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +56 -94
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +2 -2
  14. data/app/controllers/katello/api/v2/host_errata_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/host_packages_controller.rb +6 -6
  16. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -3
  17. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +3 -2
  18. data/app/controllers/katello/api/v2/repositories_controller.rb +5 -19
  19. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +34 -0
  20. data/app/controllers/katello/api/v2/subscriptions_controller.rb +1 -1
  21. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +8 -4
  22. data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +1 -1
  23. data/app/helpers/katello/sync_management_helper.rb +0 -2
  24. data/app/lib/actions/candlepin/environment/create.rb +1 -1
  25. data/app/lib/actions/candlepin/environment/set_content.rb +1 -1
  26. data/app/lib/actions/katello/activation_key/create.rb +9 -11
  27. data/app/lib/actions/katello/agent/dispatch_history_presenter.rb +64 -0
  28. data/app/lib/actions/katello/agent_action.rb +107 -0
  29. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +6 -2
  30. data/app/lib/actions/katello/bulk_agent_action.rb +21 -0
  31. data/app/lib/actions/katello/capsule_content/sync.rb +8 -8
  32. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +16 -2
  33. data/app/lib/actions/katello/check_matching_content.rb +17 -0
  34. data/app/lib/actions/katello/content_view/environment_create.rb +6 -8
  35. data/app/lib/actions/katello/content_view/promote_to_environment.rb +1 -1
  36. data/app/lib/actions/katello/content_view/publish.rb +2 -2
  37. data/app/lib/actions/katello/content_view_version/import.rb +2 -1
  38. data/app/lib/actions/katello/content_view_version/import_library.rb +17 -0
  39. data/app/lib/actions/katello/content_view_version/incremental_update.rb +30 -10
  40. data/app/lib/actions/katello/host/erratum/applicable_errata_install.rb +1 -1
  41. data/app/lib/actions/katello/host/erratum/install.rb +8 -26
  42. data/app/lib/actions/katello/host/hypervisors_update.rb +4 -4
  43. data/app/lib/actions/katello/host/package/install.rb +8 -21
  44. data/app/lib/actions/katello/host/package/remove.rb +8 -20
  45. data/app/lib/actions/katello/host/package/update.rb +9 -22
  46. data/app/lib/actions/katello/host/package_group/install.rb +8 -21
  47. data/app/lib/actions/katello/host/package_group/remove.rb +8 -20
  48. data/app/lib/actions/katello/host/update_system_purpose.rb +1 -1
  49. data/app/lib/actions/katello/organization/create.rb +3 -5
  50. data/app/lib/actions/katello/organization/destroy.rb +1 -1
  51. data/app/lib/actions/katello/organization/manifest_delete.rb +3 -5
  52. data/app/lib/actions/katello/organization/manifest_import.rb +1 -1
  53. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  54. data/app/lib/actions/katello/repository/check_matching_content.rb +3 -1
  55. data/app/lib/actions/katello/repository/clone_contents.rb +8 -11
  56. data/app/lib/actions/katello/repository/create.rb +0 -8
  57. data/app/lib/actions/katello/repository/filtered_index_content.rb +3 -0
  58. data/app/lib/actions/katello/repository/index_content.rb +1 -0
  59. data/app/lib/actions/katello/repository/multi_clone_contents.rb +9 -12
  60. data/app/lib/actions/katello/repository/update.rb +0 -8
  61. data/app/lib/actions/middleware/execute_if_contents_changed.rb +4 -1
  62. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +24 -4
  63. data/app/lib/actions/pulp/consumer.rb +0 -11
  64. data/app/lib/actions/pulp/orchestration/repository/refresh_repos.rb +0 -6
  65. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +3 -3
  66. data/app/lib/actions/pulp3/content_migration.rb +10 -0
  67. data/app/lib/actions/pulp3/content_migration_presenter.rb +59 -0
  68. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +1 -1
  69. data/app/lib/actions/pulp3/content_view_version/export.rb +3 -2
  70. data/app/lib/actions/pulp3/import_migration.rb +6 -1
  71. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +2 -1
  72. data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +17 -13
  73. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +60 -0
  74. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +0 -4
  75. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +16 -3
  76. data/app/lib/actions/pulp3/orchestration/repository/refresh_repos.rb +1 -6
  77. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  78. data/app/lib/actions/pulp3/repository/delete.rb +1 -1
  79. data/app/lib/actions/pulp3/repository/save_version.rb +1 -1
  80. data/app/lib/actions/pulp3/repository/upload_tag.rb +18 -0
  81. data/app/lib/katello/agent/base_message.rb +38 -0
  82. data/app/lib/katello/agent/client_message_handler.rb +60 -0
  83. data/app/lib/katello/agent/connection.rb +24 -0
  84. data/app/lib/katello/agent/install_errata_message.rb +25 -0
  85. data/app/lib/katello/agent/install_package_group_message.rb +25 -0
  86. data/app/lib/katello/agent/install_package_message.rb +28 -0
  87. data/app/lib/katello/agent/remove_package_group_message.rb +25 -0
  88. data/app/lib/katello/agent/remove_package_message.rb +28 -0
  89. data/app/lib/katello/agent/update_package_message.rb +25 -0
  90. data/app/lib/katello/concerns/base_template_scope_extensions.rb +8 -0
  91. data/app/lib/katello/event_daemon/monitor.rb +53 -0
  92. data/app/lib/katello/event_daemon/runner.rb +99 -0
  93. data/app/lib/katello/event_daemon/services/agent_event_receiver.rb +62 -0
  94. data/app/lib/katello/logging.rb +32 -0
  95. data/app/lib/katello/messaging/connection.rb +1 -7
  96. data/app/lib/katello/messaging/received_message.rb +1 -1
  97. data/app/lib/katello/qpid/connection.rb +130 -0
  98. data/app/lib/katello/validators/content_view_puppet_module_validator.rb +1 -1
  99. data/app/models/katello/activation_key.rb +2 -2
  100. data/app/models/katello/agent/dispatch_history.rb +17 -0
  101. data/app/models/katello/authorization/content_view_version.rb +25 -2
  102. data/app/models/katello/authorization/content_view_version_export_history.rb +1 -1
  103. data/app/models/katello/authorization/organization.rb +8 -0
  104. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  105. data/app/models/katello/concerns/host_managed_extensions.rb +3 -0
  106. data/app/models/katello/concerns/operatingsystem_extensions.rb +2 -0
  107. data/app/models/katello/concerns/organization_extensions.rb +2 -2
  108. data/app/models/katello/concerns/pulp_database_unit.rb +7 -0
  109. data/app/models/katello/concerns/redhat_extensions.rb +2 -2
  110. data/app/models/katello/concerns/smart_proxy_extensions.rb +31 -5
  111. data/app/models/katello/content_migration_progress.rb +4 -0
  112. data/app/models/katello/content_view.rb +10 -1
  113. data/app/models/katello/content_view_environment.rb +2 -2
  114. data/app/models/katello/content_view_history.rb +2 -1
  115. data/app/models/katello/content_view_package_filter.rb +1 -1
  116. data/app/models/katello/content_view_puppet_environment.rb +2 -2
  117. data/app/models/katello/content_view_version.rb +2 -1
  118. data/app/models/katello/content_view_version_export_history.rb +26 -1
  119. data/app/models/katello/erratum.rb +3 -1
  120. data/app/models/katello/events/delete_host_agent_queue.rb +19 -0
  121. data/app/models/katello/glue/candlepin/pool.rb +2 -0
  122. data/app/models/katello/glue/pulp/repo.rb +0 -6
  123. data/app/models/katello/glue/pulp/repos.rb +1 -22
  124. data/app/models/katello/host/subscription_facet.rb +4 -0
  125. data/app/models/katello/ping.rb +12 -4
  126. data/app/models/katello/pool.rb +5 -0
  127. data/app/models/katello/product.rb +3 -3
  128. data/app/models/katello/repository.rb +10 -3
  129. data/app/models/katello/subscription_status.rb +3 -2
  130. data/app/models/setting/content.rb +0 -2
  131. data/app/presenters/katello/host_subscription_presenter.rb +3 -4
  132. data/app/presenters/katello/host_subscriptions_presenter.rb +24 -0
  133. data/app/services/katello/agent/dispatcher.rb +66 -0
  134. data/app/services/katello/applicability/applicable_content_helper.rb +44 -15
  135. data/app/services/katello/candlepin_event_listener.rb +12 -19
  136. data/app/services/katello/event_monitor/poller_thread.rb +3 -11
  137. data/app/services/katello/pulp/smart_proxy_repository.rb +0 -15
  138. data/app/services/katello/pulp3/api/docker.rb +4 -0
  139. data/app/services/katello/pulp3/content_view_version/export.rb +63 -5
  140. data/app/services/katello/pulp3/content_view_version/import.rb +40 -0
  141. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +0 -16
  142. data/app/services/katello/pulp3/content_view_version/import_validator.rb +26 -49
  143. data/app/services/katello/pulp3/docker_manifest.rb +1 -0
  144. data/app/services/katello/pulp3/docker_tag.rb +1 -0
  145. data/app/services/katello/pulp3/migration.rb +44 -9
  146. data/app/services/katello/pulp3/repository.rb +13 -4
  147. data/app/services/katello/pulp3/repository/docker.rb +5 -0
  148. data/app/services/katello/pulp3/repository/yum.rb +15 -9
  149. data/app/services/katello/pulp3/task.rb +4 -0
  150. data/app/services/katello/pulp3/task_group.rb +4 -0
  151. data/app/services/katello/registration_manager.rb +10 -0
  152. data/app/services/katello/repository_type.rb +1 -1
  153. data/app/views/foreman/smart_proxies/_content_tab.html.erb +4 -47
  154. data/app/views/foreman/smart_proxies/show.html.erb +1 -1
  155. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +22 -25
  156. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +1 -0
  157. data/app/views/katello/api/v2/content_views/show.json.rabl +6 -0
  158. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -9
  159. data/app/views/katello/layouts/react.html.erb +3 -2
  160. data/app/views/katello/sync_management/_products.html.erb +1 -1
  161. data/app/views/overrides/activation_keys/_host_tab_pane.html.erb +1 -5
  162. data/app/views/overrides/organizations/_edit_override.html.erb +1 -4
  163. data/app/views/overrides/smart_proxies/_environment_tab.html.erb +1 -1
  164. data/app/views/overrides/smart_proxies/_environment_tab_pane.html.erb +1 -1
  165. data/config/katello.yaml.example +0 -3
  166. data/config/routes/api/v2.rb +31 -13
  167. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  168. data/db/migrate/20191204214919_add_content_view_version_counts.rb +0 -1
  169. data/db/migrate/20200514092553_move_katello_fields_from_hostgroups.katello.rb +5 -2
  170. data/db/migrate/20201119211133_pulp3_migration_progress.rb +9 -0
  171. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +56 -0
  172. data/db/migrate/20210122200618_create_katello_agent_dispatch_history.rb +11 -0
  173. data/db/migrate/20210125161911_delete_erratum_install_batch_size_setting.rb +5 -0
  174. data/db/migrate/20210128231228_add_type_and_from_cvv_to_cvv_export_history.rb +14 -0
  175. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +7 -0
  176. data/db/migrate/20210208213920_add_available_module_stream_context.rb +8 -0
  177. data/db/seeds.d/104-proxy.rb +1 -1
  178. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  179. data/engines/bastion/app/assets/javascripts/bastion/auth/authorization.service.js +1 -1
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +1 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/katello-agent-notice.html +1 -1
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-system-purpose-modal.html +35 -40
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-register-os-client.directive.js +17 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -2
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-client.html +12 -5
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-deb-client.html +38 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-oracle-client.html +5 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-sles-client.html +28 -0
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register.html +14 -11
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-activation-keys.controller.js +8 -3
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-content-hosts.controller.js +9 -3
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter-details.html +2 -2
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details.html +1 -1
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-publish.html +4 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +78 -7
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +17 -20
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +17 -24
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +1292 -1170
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +17 -20
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +858 -807
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +18 -19
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +17 -24
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +17 -18
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +986 -971
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +19 -20
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +9 -9
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +2 -2
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +1 -1
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/download-policy.service.js +0 -1
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +1 -1
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +2 -2
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscription-start-date.directive.js +21 -0
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscription-type.directive.js +16 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-start-date.html +2 -0
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-type.html +18 -0
  217. data/lib/katello/engine.rb +12 -6
  218. data/lib/katello/middleware/event_daemon.rb +1 -1
  219. data/lib/katello/permission_creator.rb +26 -5
  220. data/lib/katello/plugin.rb +3 -2
  221. data/lib/katello/tasks/delete_orphaned_content.rake +1 -3
  222. data/lib/katello/tasks/jenkins.rake +1 -1
  223. data/lib/katello/tasks/pulp3_content_switchover.rake +1 -1
  224. data/lib/katello/tasks/pulp3_migration.rake +18 -6
  225. data/lib/katello/tasks/pulp3_migration_abort.rake +7 -2
  226. data/lib/katello/tasks/pulp3_migration_stats.rake +28 -8
  227. data/lib/katello/tasks/pulp3_post_migration_check.rake +1 -3
  228. data/lib/katello/tasks/receptor/extract_orgs.rake +1 -1
  229. data/lib/katello/tasks/reimport.rake +1 -1
  230. data/lib/katello/tasks/repository.rake +3 -5
  231. data/lib/katello/tasks/reset.rake +0 -15
  232. data/lib/katello/tasks/upgrades/4.0/remove_ostree_puppet_content.rake +16 -0
  233. data/lib/katello/version.rb +1 -1
  234. data/lib/proxy_api/container_gateway.rb +21 -0
  235. data/locale/action_names.rb +51 -51
  236. data/locale/bn/katello.edit.po +8538 -0
  237. data/locale/bn/katello.po +136 -51
  238. data/locale/bn/katello.po.time_stamp +0 -0
  239. data/locale/cs/katello.edit.po +8440 -0
  240. data/locale/cs/katello.po +136 -49
  241. data/locale/cs/katello.po.time_stamp +0 -0
  242. data/locale/de/katello.edit.po +8344 -0
  243. data/locale/de/katello.po +136 -48
  244. data/locale/de/katello.po.time_stamp +0 -0
  245. data/locale/en/katello.edit.po +8161 -0
  246. data/locale/en/katello.po +136 -48
  247. data/locale/en/katello.po.time_stamp +0 -0
  248. data/locale/es/katello.edit.po +8306 -0
  249. data/locale/es/katello.po +136 -48
  250. data/locale/es/katello.po.time_stamp +0 -0
  251. data/locale/fr/katello.edit.po +8356 -0
  252. data/locale/fr/katello.po +136 -48
  253. data/locale/fr/katello.po.time_stamp +0 -0
  254. data/locale/gu/katello.edit.po +8540 -0
  255. data/locale/gu/katello.po +136 -51
  256. data/locale/gu/katello.po.time_stamp +0 -0
  257. data/locale/hi/katello.edit.po +8537 -0
  258. data/locale/hi/katello.po +136 -51
  259. data/locale/hi/katello.po.time_stamp +0 -0
  260. data/locale/it/katello.edit.po +8293 -0
  261. data/locale/it/katello.po +136 -48
  262. data/locale/it/katello.po.time_stamp +0 -0
  263. data/locale/ja/katello.edit.po +8322 -0
  264. data/locale/ja/katello.po +136 -48
  265. data/locale/ja/katello.po.time_stamp +0 -0
  266. data/locale/katello.pot +941 -767
  267. data/locale/kn/katello.edit.po +8538 -0
  268. data/locale/kn/katello.po +136 -51
  269. data/locale/kn/katello.po.time_stamp +0 -0
  270. data/locale/ko/katello.edit.po +8289 -0
  271. data/locale/ko/katello.po +136 -48
  272. data/locale/ko/katello.po.time_stamp +0 -0
  273. data/locale/mr/katello.edit.po +8502 -0
  274. data/locale/mr/katello.po +136 -51
  275. data/locale/mr/katello.po.time_stamp +0 -0
  276. data/locale/or/katello.edit.po +8538 -0
  277. data/locale/or/katello.po +136 -51
  278. data/locale/or/katello.po.time_stamp +0 -0
  279. data/locale/pa/katello.edit.po +8524 -0
  280. data/locale/pa/katello.po +136 -51
  281. data/locale/pa/katello.po.time_stamp +0 -0
  282. data/locale/pt/katello.edit.po +8255 -0
  283. data/locale/pt/katello.po +136 -51
  284. data/locale/pt/katello.po.time_stamp +0 -0
  285. data/locale/pt_BR/katello.edit.po +8289 -0
  286. data/locale/pt_BR/katello.po +136 -48
  287. data/locale/pt_BR/katello.po.time_stamp +0 -0
  288. data/locale/ru/katello.edit.po +8309 -0
  289. data/locale/ru/katello.po +136 -48
  290. data/locale/ru/katello.po.time_stamp +0 -0
  291. data/locale/ta/katello.edit.po +8536 -0
  292. data/locale/ta/katello.po +136 -51
  293. data/locale/ta/katello.po.time_stamp +0 -0
  294. data/locale/te/katello.edit.po +8536 -0
  295. data/locale/te/katello.po +136 -51
  296. data/locale/te/katello.po.time_stamp +0 -0
  297. data/locale/zh_CN/katello.edit.po +8288 -0
  298. data/locale/zh_CN/katello.po +136 -48
  299. data/locale/zh_CN/katello.po.time_stamp +0 -0
  300. data/locale/zh_TW/katello.edit.po +8420 -0
  301. data/locale/zh_TW/katello.po +136 -48
  302. data/locale/zh_TW/katello.po.time_stamp +0 -0
  303. data/package.json +1 -1
  304. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +0 -1
  305. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +2 -0
  306. data/webpack/__mocks__/foremanReact/components/common/dates/LongDateTime.js +5 -0
  307. data/webpack/{scenes/ContentViews/Details/Repositories → components/SelectableDropdown}/SelectableDropdown.js +20 -3
  308. data/webpack/components/SelectableDropdown/__tests__/SelectableDropdown.test.js +45 -0
  309. data/webpack/components/SelectableDropdown/index.js +3 -0
  310. data/webpack/components/Table/TableWrapper.js +2 -1
  311. data/webpack/components/Table/helpers.js +14 -0
  312. data/webpack/components/TypeAhead/TypeAhead.js +2 -1
  313. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +2 -1
  314. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +0 -1
  315. data/webpack/containers/Application/overrides.scss +6 -0
  316. data/webpack/index.js +6 -0
  317. data/webpack/redux/actions/RedHatRepositories/helpers.js +5 -5
  318. data/webpack/scenes/ContentViews/ContentViewsActions.js +31 -2
  319. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -1
  320. data/webpack/scenes/ContentViews/Copy/ContentViewCopySelectors.js +16 -0
  321. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +77 -0
  322. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +44 -0
  323. data/webpack/scenes/ContentViews/Copy/__tests__/contentViewCopyResult.fixtures.json +42 -0
  324. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +39 -0
  325. data/webpack/scenes/ContentViews/Copy/index.js +4 -0
  326. data/webpack/scenes/ContentViews/Create/ContentViewCreateSelectors.js +16 -0
  327. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +58 -0
  328. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +175 -0
  329. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +27 -0
  330. data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +42 -0
  331. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +92 -0
  332. data/webpack/scenes/ContentViews/Create/index.js +4 -0
  333. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +16 -0
  334. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +20 -1
  335. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +17 -7
  336. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +19 -13
  337. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +40 -0
  338. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +124 -0
  339. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +134 -0
  340. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +92 -0
  341. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +44 -25
  342. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +17 -7
  343. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +24 -0
  344. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +53 -3
  345. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +4 -3
  346. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +41 -0
  347. data/webpack/scenes/ContentViews/helpers.js +13 -0
  348. data/webpack/scenes/SmartProxy/Content.js +17 -0
  349. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +11 -0
  350. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +3 -0
  351. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +16 -0
  352. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +152 -0
  353. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentResult.fixtures.json +140 -0
  354. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +38 -0
  355. data/webpack/scenes/SmartProxy/index.js +4 -0
  356. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +3 -3
  357. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +2 -2
  358. data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +2 -2
  359. data/webpack/test-utils/react-testing-lib-wrapper.js +5 -2
  360. data/webpack/utils/helpers.js +3 -0
  361. metadata +160 -40
  362. data/app/controllers/katello/api/v2/gpg_keys_controller.rb +0 -114
  363. data/app/lib/actions/pulp/consumer/abstract_content_action.rb +0 -71
  364. data/app/lib/actions/pulp/consumer/content_install.rb +0 -43
  365. data/app/lib/actions/pulp/consumer/content_uninstall.rb +0 -26
  366. data/app/lib/actions/pulp/consumer/content_update.rb +0 -32
  367. data/app/overrides/disable_turbolinks_on_proxies_index.rb +0 -5
  368. data/app/services/katello/event_daemon.rb +0 -135
  369. data/app/services/katello/pulp/content_counts_calculator.rb +0 -60
  370. data/db/functions/empty_v01.sql +0 -7
  371. data/db/functions/evr_trigger_v01.sql +0 -9
  372. data/db/functions/isalpha_v01.sql +0 -11
  373. data/db/functions/isalphanum_v01.sql +0 -12
  374. data/db/functions/isdigit_v01.sql +0 -10
  375. data/db/functions/rpmver_array_v01.sql +0 -60
  376. data/lib/katello/tasks/common.rake +0 -7
  377. data/lib/katello/tasks/reports.rake +0 -4
  378. data/lib/katello/tasks/upgrades/3.10/update_gpg_key_urls.rake +0 -32
  379. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.scss +0 -5
  380. data/webpack/scenes/ContentViews/Table/actionResolver.js +0 -28
@@ -1,8 +1,8 @@
1
1
  module Katello
2
2
  module EventMonitor
3
+ # TODO: Move this class to app/lib/katello/event_daemon/services with other service definitions
3
4
  class PollerThread
4
5
  SLEEP_INTERVAL = 3
5
- STATUS_CACHE_KEY = 'katello_events_status'.freeze
6
6
 
7
7
  cattr_accessor :instance
8
8
 
@@ -15,7 +15,6 @@ module Katello
15
15
  self.instance.close
16
16
  self.instance = nil
17
17
  end
18
- reset_status
19
18
  end
20
19
 
21
20
  def self.run
@@ -24,14 +23,8 @@ module Katello
24
23
  instance.poll_for_events
25
24
  end
26
25
 
27
- def self.status(refresh: true)
28
- Rails.cache.fetch(STATUS_CACHE_KEY, force: refresh) do
29
- instance&.status
30
- end
31
- end
32
-
33
- def self.reset_status
34
- Rails.cache.delete(STATUS_CACHE_KEY)
26
+ def self.status
27
+ instance&.status
35
28
  end
36
29
 
37
30
  def initialize(logger = nil)
@@ -85,7 +78,6 @@ module Katello
85
78
  end
86
79
 
87
80
  def poll_for_events
88
- @thread&.kill
89
81
  @thread = Thread.new do
90
82
  @logger.info("Polling Katello Event Queue")
91
83
  loop do
@@ -42,21 +42,6 @@ module Katello
42
42
  puppet_repos.where(:pulp_id => pulp_repos.map { |pulp_repo| pulp_repo['id'] })
43
43
  end
44
44
 
45
- def current_repositories_data(environment = nil, content_view = nil)
46
- @pulp_repositories ||= smart_proxy.pulp_repositories
47
-
48
- repos = Katello::Repository
49
- repos = repos.in_environment(environment) if environment
50
- repos = repos.in_content_views([content_view]) if content_view
51
- puppet_envs = Katello::ContentViewPuppetEnvironment
52
- puppet_envs = puppet_envs.in_environment(environment) if environment
53
- puppet_envs = puppet_envs.in_content_view(content_view) if content_view
54
-
55
- repo_ids = repos.pluck(:pulp_id) + puppet_envs.pluck(:pulp_id)
56
-
57
- @pulp_repositories.select { |r| repo_ids.include?(r['id']) }
58
- end
59
-
60
45
  def orphaned_repos
61
46
  @smart_proxy.pulp_repositories.map { |x| x["id"] } - repos_available_to_capsule.map { |x| x.pulp_id }
62
47
  end
@@ -32,6 +32,10 @@ module Katello
32
32
  PulpContainerClient::RecursiveManage
33
33
  end
34
34
 
35
+ def self.tag_image_class
36
+ PulpContainerClient::TagImage
37
+ end
38
+
35
39
  def api_client
36
40
  PulpContainerClient::ApiClient.new(smart_proxy.pulp3_configuration(PulpContainerClient::Configuration))
37
41
  end
@@ -4,13 +4,37 @@ module Katello
4
4
  class Export
5
5
  include ImportExportCommon
6
6
 
7
- def initialize(smart_proxy:, content_view_version: nil, destination_server: nil, from_content_view_version: nil)
7
+ def initialize(smart_proxy:,
8
+ content_view_version: nil,
9
+ destination_server: nil,
10
+ from_content_view_version: nil)
8
11
  @smart_proxy = smart_proxy
9
12
  @content_view_version = content_view_version
10
13
  @destination_server = destination_server
11
14
  @from_content_view_version = from_content_view_version
12
15
  end
13
16
 
17
+ def repository_hrefs
18
+ version_hrefs.map { |href| version_href_to_repository_href(href) }.uniq
19
+ end
20
+
21
+ def version_hrefs
22
+ repositories.pluck(:version_href).compact
23
+ end
24
+
25
+ def repositories(fetch_all: false)
26
+ repos = if @content_view_version.default?
27
+ @content_view_version.repositories.yum_type
28
+ else
29
+ @content_view_version.archived_repos.yum_type
30
+ end
31
+ if fetch_all
32
+ repos
33
+ else
34
+ repos.immediate
35
+ end
36
+ end
37
+
14
38
  def generate_exporter_path
15
39
  export_path = "#{@content_view_version.content_view}/#{@content_view_version.version}/#{@destination_server}/#{date_dir}".gsub(/\s/, '_')
16
40
  "#{@content_view_version.organization.label}/#{export_path}"
@@ -66,12 +90,29 @@ module Katello
66
90
  api.exporter_api.delete(exporter_href)
67
91
  end
68
92
 
93
+ def validate!(fail_on_missing_content: true, validate_incremental: true)
94
+ validate_repositories_immediate! if fail_on_missing_content
95
+ validate_incremental_export! if validate_incremental && !@from_content_view_version.blank?
96
+ end
97
+
98
+ def validate_repositories_immediate!
99
+ non_immediate_repos = repositories(fetch_all: true).non_immediate
100
+ if non_immediate_repos.any?
101
+ fail _("NOTE: Unable to fully export Content View Version '%{content_view} %{current}'"\
102
+ " it contains repositories without the 'immediate' download policy."\
103
+ " Update the download policy and sync affected repositories. Once synced republish the content view"\
104
+ " and export the generated version. \n %{repos}" %
105
+ { content_view: @content_view_version.content_view.name,
106
+ current: @content_view_version.version,
107
+ repos: self.class.generate_product_repo_strings(repositories: non_immediate_repos)})
108
+ end
109
+ end
110
+
69
111
  def validate_incremental_export!
70
- return if @from_content_view_version.blank?
71
112
  from_exporter = Export.new(smart_proxy: @smart_proxy, content_view_version: @from_content_view_version)
72
113
 
73
- from_exporter_repos = generate_repo_mapping(from_exporter.repositories)
74
- to_exporter_repos = generate_repo_mapping(repositories)
114
+ from_exporter_repos = generate_repo_mapping(from_exporter.repositories(fetch_all: true))
115
+ to_exporter_repos = generate_repo_mapping(repositories(fetch_all: true))
75
116
 
76
117
  invalid_repos_exist = (from_exporter_repos.keys & to_exporter_repos.keys).any? do |repo_id|
77
118
  from_exporter_repos[repo_id] != to_exporter_repos[repo_id]
@@ -99,7 +140,8 @@ module Katello
99
140
  ret = { organization: @content_view_version.organization.name,
100
141
  repository_mapping: {},
101
142
  content_view: @content_view_version.content_view.name,
102
- content_view_version: @content_view_version.slice(:major, :minor)
143
+ content_view_version: @content_view_version.slice(:major, :minor),
144
+ incremental: @from_content_view_version.present?
103
145
  }
104
146
 
105
147
  unless @from_content_view_version.blank?
@@ -120,6 +162,22 @@ module Katello
120
162
  end
121
163
  ret
122
164
  end
165
+
166
+ def self.find_library_export_view(create_by_default: false,
167
+ destination_server:,
168
+ organization:)
169
+ name = "Export-Library"
170
+ name += "-#{destination_server}" unless destination_server.blank?
171
+ select_method = create_by_default ? :first_or_create : :first
172
+ ::Katello::ContentView.where(name: name, organization: organization).send(select_method)
173
+ end
174
+
175
+ def self.generate_product_repo_strings(repositories:)
176
+ repositories.map do |repo|
177
+ _("Product: '%{product}', Repository: '%{repository}'" % { product: repo.product.name,
178
+ repository: repo.name})
179
+ end
180
+ end
123
181
  end
124
182
  end
125
183
  end
@@ -46,6 +46,46 @@ module Katello
46
46
  def self.check!(content_view:, metadata:, path:)
47
47
  ImportValidator.new(content_view: content_view, metadata: metadata, path: path).check!
48
48
  end
49
+
50
+ def self.reset_content_view_repositories_from_metadata!(content_view:, metadata:)
51
+ # Given metadata from the dump and a content view
52
+ # this method
53
+ # 1) Fetches ids of the library repos whose product name, repo name amd redhat?
54
+ # => match values provided in the metadata's repository mapping
55
+ # 2) Removes all the repositories associated to this content view
56
+ # 3) Adds the repositories matched from the dump
57
+ # The main intent of this method is to assume that the user intends for the
58
+ # content view to exaclty look like what is specified in metadata
59
+
60
+ repos_in_library = Katello::Repository.
61
+ in_default_view.
62
+ yum_type.
63
+ joins(:product => :provider, :content_view_version => :content_view).
64
+ joins(:root).
65
+ where("#{::Katello::ContentView.table_name}.organization_id" => content_view.organization_id).
66
+ pluck("#{::Katello::Repository.table_name}.id",
67
+ "#{::Katello::RootRepository.table_name}.name",
68
+ "#{::Katello::Product.table_name}.name",
69
+ "#{::Katello::Provider.table_name}.provider_type"
70
+ )
71
+ repos_in_library_map = {}
72
+ # repos_in_library_map is going to look like {['repo1', 'product1', false] => 100, ['repo1', 'product1', true] => 200 }
73
+ repos_in_library.each do |id, repo, product, provider_type|
74
+ repos_in_library_map[[repo, product, provider_type == Katello::Provider::REDHAT]] = id
75
+ end
76
+
77
+ repo_ids = metadata[:repository_mapping].values.map do |repo|
78
+ repos_in_library_map[[repo[:repository], repo[:product], repo[:redhat]]]
79
+ end
80
+ content_view.update!(repository_ids: repo_ids)
81
+ end
82
+
83
+ def self.find_or_create_library_import_view(organization)
84
+ name = ::Katello::ContentView::IMPORT_LIBRARY
85
+ ::Katello::ContentView.where(name: name,
86
+ organization: organization,
87
+ import_only: true).first_or_create
88
+ end
49
89
  end
50
90
  end
51
91
  end
@@ -19,22 +19,6 @@ 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
@@ -2,7 +2,6 @@ module Katello
2
2
  module Pulp3
3
3
  module ContentViewVersion
4
4
  class ImportValidator
5
- BASEDIR = '/var/lib/pulp'.freeze
6
5
  attr_accessor :metadata, :path, :content_view
7
6
  def initialize(content_view:, path:, metadata:)
8
7
  self.content_view = content_view
@@ -11,10 +10,11 @@ module Katello
11
10
  end
12
11
 
13
12
  def check!
14
- check_permissions!
15
- ensure_importing_cvv_does_not_exist!
16
- ensure_from_cvv_exists!
17
- ensure_repositories_metadata_and_content_view_match!
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
18
  end
19
19
 
20
20
  def ensure_importing_cvv_does_not_exist!
@@ -43,55 +43,32 @@ module Katello
43
43
  end
44
44
  end
45
45
 
46
- def ensure_repositories_metadata_and_content_view_match!
47
- product_repos_in_content_view = content_view.repositories.yum_type.map { |repo| [repo.product.name, repo.name, repo.redhat?] }
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] }
48
60
  product_repos_in_metadata = metadata[:repository_mapping].values.map { |repo| [repo[:product], repo[:repository], repo[:redhat]] }
49
-
50
- product_repos_in_content_view.sort!
51
- product_repos_in_metadata.sort!
52
- # product_repos_in_content_view & product_repos_in_metadata look like [["prod1", "repo1", false], ["prod2", "repo2", false]]
53
-
54
- if product_repos_in_content_view != product_repos_in_metadata
55
- repos_in_content_view = generate_product_repo_i18n_string(product_repos_in_content_view)
56
- repos_in_import = generate_product_repo_i18n_string(product_repos_in_metadata)
57
-
58
- fail _("Repositories in the importing content view do not match the repositories provided in the import metadata.\n "\
59
- "Repositories in Content View '%{content_view}': %{repos_in_content_view}\n "\
60
- "Repositories in the Import Metadata: %{repos_in_import}" % { content_view: content_view.name,
61
- repos_in_content_view: repos_in_content_view.join(""),
62
- repos_in_import: repos_in_import.join("")}
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("")}
63
68
  )
64
69
  end
65
70
  end
66
71
 
67
- def check_permissions!
68
- fail _("Invalid path specified.") if path.blank? || !File.directory?(path)
69
- fail _("The import path must be in a subdirectory under '%s'." % BASEDIR) unless path.starts_with?(BASEDIR)
70
- fail _("Pulp user or group unable to read content in '%s'." % path) unless pulp_user_accessible?(path)
71
-
72
- Dir.glob("#{path}/*").each do |file|
73
- fail _("Pulp user or group unable to read '%s'." % file) unless pulp_user_accessible?(file)
74
- end
75
- toc_path = "#{path}/#{metadata[:toc]}"
76
- fail _("The TOC file specified in the metadata does not exist. %s " % toc_path) unless File.exist?(toc_path)
77
- end
78
-
79
- def pulp_user_accessible?(path)
80
- pulp_info = fetch_pulp_user_info
81
- return false if pulp_info.blank?
82
-
83
- stat = File.stat(path)
84
- stat.gid.to_s == pulp_info.gid ||
85
- stat.uid.to_s == pulp_info.uid ||
86
- stat.mode.to_s(8)[-1].to_i >= 4
87
- end
88
-
89
- def fetch_pulp_user_info
90
- pulp_user = nil
91
- Etc.passwd { |u| pulp_user = u if u.name == 'pulp' }
92
- pulp_user
93
- end
94
-
95
72
  def generate_product_repo_i18n_string(product_repos)
96
73
  # product_repos look like [["prod1", "repo1", false], ["prod2", "repo2", false]]
97
74
  product_repos.map do |product, repo, redhat|
@@ -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?
@@ -195,14 +223,16 @@ module Katello
195
223
  end
196
224
 
197
225
  def operate_on_errata
226
+ last_migration_time = last_successful_migration_time
198
227
  offset = 0
199
- limit = 300
200
- 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)
201
230
  total_count = response.count
202
231
  yield(response.results)
203
232
  until (offset + limit > total_count)
204
233
  offset += limit
205
- 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}")
206
236
  yield(response.results)
207
237
  end
208
238
  end
@@ -242,7 +272,12 @@ module Katello
242
272
  unmigrated_units = unmigrated_units.where(:migrated_pulp3_href => nil)
243
273
  end
244
274
 
275
+ total_count = unmigrated_units.count
276
+ current_count = 0
277
+
245
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}")
246
281
  migrated_units = pulp2_content_api.list(pulp2_id__in: needing_hrefs.map { |unit| unit.pulp_id }.join(','))
247
282
  migrated_units.results.each do |migrated_unit|
248
283
  matching_record = needing_hrefs.find { |db_unit| db_unit.pulp_id == migrated_unit.pulp2_id }