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
@@ -0,0 +1,59 @@
1
+ require 'katello/content_migration_progress'
2
+
3
+ module Actions
4
+ module Pulp3
5
+ class ContentMigrationPresenter < Helpers::Presenter::Base
6
+ def initialize(migration_action)
7
+ @migration_action = migration_action
8
+ end
9
+
10
+ def humanized_output
11
+ if !@migration_action.done?
12
+ ContentMigrationTaskPresenter.new(@migration_action).humanized_output
13
+ else
14
+ task = ForemanTasks::Task.find_by(:external_id => @migration_action.execution_plan_id)
15
+ ::Katello::ContentMigrationProgress.find_by(:task_id => task.id)&.progress_message
16
+ end
17
+ end
18
+
19
+ class ContentMigrationTaskPresenter
20
+ def initialize(action)
21
+ @action = action
22
+ end
23
+
24
+ def task_progress_reports
25
+ if @action.pulp_tasks.empty?
26
+ []
27
+ else
28
+ @action.pulp_tasks[0].progress_reports
29
+ end
30
+ end
31
+
32
+ def task_group_progress_reports
33
+ if @action.task_groups.empty?
34
+ []
35
+ else
36
+ @action.task_groups[0].group_progress_reports
37
+ end
38
+ end
39
+
40
+ def humanized_output
41
+ report = task_progress_reports.find { |current| current['state'] == 'running' && current['total'] != 0 }
42
+ report ||= task_group_progress_reports.find { |current| current['total'] != 0 && current['done'] != current['total'] }
43
+
44
+ if !report.blank? && report['total'] != 0
45
+ "#{report['message']} #{report['done']}/#{report['total']}"
46
+ elsif report
47
+ report['message']
48
+ elsif task_progress_reports.empty?
49
+ "Content migration starting. "
50
+ else
51
+ "Initial Migration steps complete."
52
+ end
53
+ rescue
54
+ ""
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -14,7 +14,7 @@ module Actions
14
14
  content_view.repository_references.each do |repository_reference|
15
15
  repo = repository_reference.root_repository.library_instance
16
16
  #force pulp3 in case we've done migrations, but haven't switched over yet
17
- tasks << repo.backend_service(smart_proxy, true).delete(repository_reference.repository_href)
17
+ tasks << repo.backend_service(smart_proxy, true).delete_repository(repository_reference)
18
18
  end
19
19
  content_view.repository_references.destroy_all
20
20
 
@@ -4,6 +4,7 @@ module Actions
4
4
  class Export < Pulp3::AbstractAsyncTask
5
5
  input_format do
6
6
  param :content_view_version_id, Integer
7
+ param :from_content_view_version_id, Integer
7
8
  param :smart_proxy_id, Integer
8
9
  param :exporter_data, Hash
9
10
  param :chunk_size, Integer
@@ -11,8 +12,12 @@ module Actions
11
12
 
12
13
  def invoke_external_task
13
14
  cvv = ::Katello::ContentViewVersion.find(input[:content_view_version_id])
15
+ from_cvv = ::Katello::ContentViewVersion.find(input[:from_content_view_version_id]) unless input[:from_content_view_version_id].blank?
14
16
  ::Katello::Pulp3::ContentViewVersion::Export.new(smart_proxy: smart_proxy,
15
- content_view_version: cvv).create_export(input[:exporter_data][:pulp_href], input[:chunk_size])
17
+ content_view_version: cvv,
18
+ from_content_view_version: from_cvv)
19
+ .create_export(input[:exporter_data][:pulp_href],
20
+ chunk_size: input[:chunk_size])
16
21
  end
17
22
  end
18
23
  end
@@ -6,9 +6,14 @@ module Actions
6
6
  end
7
7
 
8
8
  def run
9
- migration_service = ::Katello::Pulp3::Migration.new(SmartProxy.pulp_primary)
9
+ task_id = ForemanTasks::Task.find_by(external_id: self.execution_plan_id)&.id
10
+ migration_service = ::Katello::Pulp3::Migration.new(SmartProxy.pulp_primary, input.merge(task_id: task_id))
10
11
  migration_service.import_pulp3_content
11
12
  end
13
+
14
+ def humanized_output
15
+ output[:status]
16
+ end
12
17
  end
13
18
  end
14
19
  end
@@ -9,7 +9,8 @@ module Actions
9
9
  sequence do
10
10
  copy_action = plan_action(Actions::Pulp3::Repository::CopyContent, repo, SmartProxy.pulp_primary!,
11
11
  repo.library_instance,
12
- copy_all: true)
12
+ copy_all: true,
13
+ mirror: content_view_version.content_view.library_import?)
13
14
  plan_action(Actions::Pulp3::Repository::SaveVersion, repo.library_instance,
14
15
  tasks: copy_action.output[:pulp_tasks])
15
16
  plan_action(Katello::Repository::IndexContent, id: repo.library_instance_id)
@@ -6,6 +6,7 @@ module Actions
6
6
  input_format do
7
7
  param :smart_proxy_id, Integer
8
8
  param :content_view_version_id, Integer
9
+ param :from_content_view_version_id, Integer
9
10
  param :export_history_id, Integer
10
11
  param :exporter_data, Hash
11
12
  param :destination_server, String
@@ -16,7 +17,11 @@ module Actions
16
17
  param :export_path, String
17
18
  end
18
19
 
19
- def plan(content_view_version, destination_server:, chunk_size: nil)
20
+ # rubocop:disable Metrics/MethodLength
21
+ def plan(content_view_version:, destination_server: nil,
22
+ chunk_size: nil, from_history: nil,
23
+ validate_incremental: true,
24
+ fail_on_missing_content: false)
20
25
  action_subject(content_view_version)
21
26
  unless File.directory?(Setting['pulpcore_export_destination'])
22
27
  fail ::Foreman::Exception, N_("Unable to export. 'pulpcore_export_destination' setting is not set to a valid directory.")
@@ -24,6 +29,15 @@ module Actions
24
29
 
25
30
  sequence do
26
31
  smart_proxy = SmartProxy.pulp_primary!
32
+ from_content_view_version = from_history&.content_view_version
33
+ export_service = ::Katello::Pulp3::ContentViewVersion::Export.new(
34
+ smart_proxy: smart_proxy,
35
+ content_view_version: content_view_version,
36
+ destination_server: destination_server,
37
+ from_content_view_version: from_content_view_version)
38
+ export_service.validate!(fail_on_missing_content: fail_on_missing_content,
39
+ validate_incremental: validate_incremental)
40
+
27
41
  action_output = plan_action(::Actions::Pulp3::ContentViewVersion::CreateExporter,
28
42
  content_view_version_id: content_view_version.id,
29
43
  smart_proxy_id: smart_proxy.id,
@@ -33,12 +47,13 @@ module Actions
33
47
  content_view_version_id: content_view_version.id,
34
48
  smart_proxy_id: smart_proxy.id,
35
49
  exporter_data: action_output[:exporter_data],
36
- chunk_size: chunk_size
37
- )
50
+ chunk_size: chunk_size,
51
+ from_content_view_version_id: from_content_view_version&.id)
38
52
 
39
53
  plan_self(exporter_data: action_output[:exporter_data], smart_proxy_id: smart_proxy.id,
40
54
  destination_server: destination_server,
41
- content_view_version_id: content_view_version.id)
55
+ content_view_version_id: content_view_version.id,
56
+ from_content_view_version_id: from_content_view_version&.id)
42
57
 
43
58
  plan_action(::Actions::Pulp3::ContentViewVersion::DestroyExporter,
44
59
  smart_proxy_id: smart_proxy.id,
@@ -55,17 +70,23 @@ module Actions
55
70
  path = File.dirname(file_name.to_s)
56
71
  output[:export_path] = path
57
72
  cvv = ::Katello::ContentViewVersion.find(input[:content_view_version_id])
73
+ from_cvv = ::Katello::ContentViewVersion.find(input[:from_content_view_version_id]) unless input[:from_content_view_version_id].blank?
74
+
75
+ export_metadata = ::Katello::Pulp3::ContentViewVersion::Export.new(
76
+ content_view_version: cvv,
77
+ smart_proxy: smart_proxy,
78
+ from_content_view_version: from_cvv).generate_metadata
79
+
80
+ toc_path_info = output[:exported_file_checksum].find { |item| item.first.end_with?("toc.json") }
81
+ export_metadata[:toc] = File.basename(toc_path_info.first)
58
82
 
59
- export_metadata = ::Katello::Pulp3::ContentViewVersion::Export.new(:content_view_version => cvv,
60
- :smart_proxy => smart_proxy).generate_metadata
61
- toc = Dir.glob("#{path}/*toc.json").first
62
- export_metadata[:toc] = File.basename(toc) if toc
63
- ::Katello::ContentViewVersionExportHistory.create!(
83
+ history = ::Katello::ContentViewVersionExportHistory.create!(
64
84
  content_view_version_id: input[:content_view_version_id],
65
85
  destination_server: input[:destination_server],
66
86
  path: path,
67
87
  metadata: export_metadata
68
88
  )
89
+ output[:export_history_id] = history.id
69
90
  end
70
91
 
71
92
  def humanized_name
@@ -0,0 +1,60 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module ContentViewVersion
5
+ class ExportLibrary < Actions::EntryAction
6
+ def plan(organization, destination_server: nil,
7
+ chunk_size: nil,
8
+ from_history: nil,
9
+ fail_on_missing_content: false)
10
+ action_subject(organization)
11
+ validate_repositories_immediate!(organization) if fail_on_missing_content
12
+
13
+ content_view = ::Katello::Pulp3::ContentViewVersion::Export.find_library_export_view(destination_server: destination_server,
14
+ organization: organization,
15
+ create_by_default: true)
16
+ repo_ids_in_library = organization.default_content_view_version.repositories.yum_type.immediate.pluck(:id)
17
+ content_view.update!(repository_ids: repo_ids_in_library)
18
+
19
+ sequence do
20
+ publish_action = plan_action(::Actions::Katello::ContentView::Publish, content_view, '')
21
+ export_action = plan_action(::Actions::Pulp3::Orchestration::ContentViewVersion::Export,
22
+ content_view_version: publish_action.version,
23
+ destination_server: destination_server,
24
+ chunk_size: chunk_size,
25
+ from_history: from_history,
26
+ validate_incremental: false,
27
+ fail_on_missing_content: fail_on_missing_content)
28
+ plan_self(export_action_output: export_action.output)
29
+ end
30
+ end
31
+
32
+ def run
33
+ output[:export_history_id] = input[:export_action_output][:export_history_id]
34
+ end
35
+
36
+ def humanized_name
37
+ _("Export Library")
38
+ end
39
+
40
+ def rescue_strategy
41
+ Dynflow::Action::Rescue::Skip
42
+ end
43
+
44
+ def validate_repositories_immediate!(organization)
45
+ non_immediate_repos = organization.default_content_view_version.repositories.yum_type.non_immediate
46
+ if non_immediate_repos.any?
47
+ fail _("NOTE: Unable to fully export '%{organization}' organization's library because"\
48
+ " it contains repositories without the 'immediate' download policy."\
49
+ " Update the download policy and sync affected repositories to include them in the export."\
50
+ " \n %{repos}" %
51
+ { organization: organization.name,
52
+ repos: ::Katello::Pulp3::ContentViewVersion::Export
53
+ .generate_product_repo_strings(repositories: non_immediate_repos)})
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -36,10 +36,6 @@ module Actions
36
36
  def humanized_name
37
37
  _("Import")
38
38
  end
39
-
40
- def rescue_strategy
41
- Dynflow::Action::Rescue::Skip
42
- end
43
39
  end
44
40
  end
45
41
  end
@@ -8,7 +8,7 @@ module Actions
8
8
  publication_content_type = !::Katello::RepositoryTypeManager.find(repository.content_type).pulp3_skip_publication
9
9
  sequence do
10
10
  if options[:source_repository] && publication_content_type
11
- plan_self(source_repository_id: options[:source_repository].id, target_repository_id: repository.id)
11
+ plan_self(source_repository_id: options[:source_repository].id, target_repository_id: repository.id, smart_proxy_id: smart_proxy.id)
12
12
  elsif publication_content_type
13
13
  plan_action(Actions::Pulp3::Repository::CreatePublication, repository, smart_proxy, options)
14
14
  end
@@ -21,6 +21,9 @@ module Actions
21
21
  #we don't have to actually generate a publication, we can reuse the old one
22
22
  target_repo = ::Katello::Repository.find(input[:target_repository_id])
23
23
  source_repo = ::Katello::Repository.find(input[:source_repository_id])
24
+ if (target_repo.publication_href != source_repo.publication_href && smart_proxy.pulp_primary?)
25
+ target_repo.clear_smart_proxy_sync_histories
26
+ end
24
27
  target_repo.update!(publication_href: source_repo.publication_href)
25
28
  end
26
29
  end
@@ -1,3 +1,4 @@
1
+ # rubocop:disable Metrics/MethodLength
1
2
  module Actions
2
3
  module Pulp3
3
4
  module Orchestration
@@ -6,9 +7,19 @@ module Actions
6
7
  def plan(repository, smart_proxy, args)
7
8
  file = {:filename => args.dig(:unit_key, :name)}
8
9
  content_unit_href = args.dig(:unit_key, :content_unit_id)
10
+ docker_tag = (args.dig(:unit_type_id) == "docker_tag")
9
11
  sequence do
10
12
  if content_unit_href
11
13
  plan_self(:commit_output => [], :content_unit_href => content_unit_href)
14
+ action_output = plan_action(Pulp3::Repository::ImportUpload, content_unit_href, repository, smart_proxy).output
15
+ plan_action(Pulp3::Repository::SaveVersion, repository, tasks: action_output[:pulp_tasks]).output
16
+ elsif docker_tag
17
+ tag_manifest_output = plan_action(Pulp3::Repository::UploadTag,
18
+ repository,
19
+ smart_proxy,
20
+ args).output
21
+ plan_self(:commit_output => tag_manifest_output[:pulp_tasks])
22
+ plan_action(Pulp3::Repository::SaveVersion, repository, {force_fetch_version: true, tasks: tag_manifest_output[:pulp_tasks]})
12
23
  else
13
24
  commit_output = plan_action(Pulp3::Repository::CommitUpload,
14
25
  repository,
@@ -24,9 +35,9 @@ module Actions
24
35
  args.dig(:unit_type_id)).output
25
36
  content_unit_href = artifact_output[:pulp_tasks]
26
37
  plan_self(:commit_output => commit_output[:pulp_tasks], :artifact_output => artifact_output[:pulp_tasks])
38
+ action_output = plan_action(Pulp3::Repository::ImportUpload, content_unit_href, repository, smart_proxy).output
39
+ plan_action(Pulp3::Repository::SaveVersion, repository, tasks: action_output[:pulp_tasks]).output
27
40
  end
28
- action_output = plan_action(Pulp3::Repository::ImportUpload, content_unit_href, repository, smart_proxy).output
29
- plan_action(Pulp3::Repository::SaveVersion, repository, tasks: action_output[:pulp_tasks]).output
30
41
  end
31
42
  end
32
43
 
@@ -34,8 +45,10 @@ module Actions
34
45
  output[:pulp_tasks] = input[:commit_output]
35
46
  if input[:content_unit_href]
36
47
  output[:content_unit_href] = input[:content_unit_href]
37
- else
48
+ elsif input[:artifact_output]
38
49
  output[:content_unit_href] = input[:artifact_output].last[:created_resources].first
50
+ else
51
+ output[:content_unit_href] = nil
39
52
  end
40
53
  end
41
54
  end
@@ -4,12 +4,7 @@ module Actions
4
4
  module Repository
5
5
  class RefreshRepos < Pulp3::AbstractAsyncTask
6
6
  include ::Actions::Katello::CapsuleContent::RefreshRepos
7
- input_format do
8
- param :smart_proxy_id
9
- param :environment_id
10
- param :content_view_id
11
- param :repository_id
12
- end
7
+
13
8
  def fetch_proxy_service(smart_proxy)
14
9
  ::Katello::Pulp3::SmartProxyRepository.instance_for_type(smart_proxy)
15
10
  end
@@ -13,7 +13,7 @@ module Actions
13
13
  target = ::Katello::Repository.find(input[:target_repository_id] || input[:target_repository])
14
14
  service = target.backend_service(smart_proxy)
15
15
  output[:pulp_tasks] = if input[:copy_all]
16
- service.copy_all(source)
16
+ service.copy_all(source, mirror: input[:mirror] || false)
17
17
  else
18
18
  service.copy_content_for_source(source, input)
19
19
  end
@@ -8,7 +8,7 @@ module Actions
8
8
 
9
9
  def invoke_external_task
10
10
  repo = ::Katello::Repository.find(input[:repository_id])
11
- output[:response] = repo.backend_service(smart_proxy).delete
11
+ output[:response] = repo.backend_service(smart_proxy).delete_repository
12
12
  end
13
13
  end
14
14
  end
@@ -2,7 +2,7 @@ module Actions
2
2
  module Pulp3
3
3
  module Repository
4
4
  class SaveVersion < Pulp3::Abstract
5
- def plan(repository, options)
5
+ def plan(repository, options = {})
6
6
  fail "Cannot accept tasks and repository_details into Save Version." if options[:tasks].present? && options[:repository_details].present?
7
7
  plan_self(:repository_id => repository.id, :tasks => options[:tasks], :repository_details => options[:repository_details], :force_fetch_version => options.fetch(:force_fetch_version, false))
8
8
  end
@@ -0,0 +1,18 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Repository
4
+ class UploadTag < Pulp3::AbstractAsyncTask
5
+ def plan(repository, smart_proxy, args)
6
+ plan_self(:repository_id => repository.id, :smart_proxy_id => smart_proxy.id, :args => args)
7
+ end
8
+
9
+ def invoke_external_task
10
+ repo = ::Katello::Repository.find(input[:repository_id])
11
+ tag_name = input[:args].dig(:unit_key, :name)
12
+ manifest_digest = input[:args].dig(:unit_key, :digest)
13
+ output[:pulp_tasks] = [repo.backend_service(smart_proxy).tag_manifest(tag_name, manifest_digest)]
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -19,6 +19,11 @@ module Katello
19
19
  host.subscriptions.redhat.pluck(:name)
20
20
  end
21
21
 
22
+ def host_redhat_subscriptions_consumed(host)
23
+ presenter = ::Katello::HostSubscriptionsPresenter.new(host)
24
+ presenter.subscriptions.select(&:redhat?).sum(&:quantity_consumed)
25
+ end
26
+
22
27
  def host_content_facet(host)
23
28
  host.content_facet
24
29
  end
@@ -87,6 +92,9 @@ module Katello
87
92
  end
88
93
 
89
94
  # rubocop:disable Metrics/MethodLength
95
+ # rubocop:disable Metrics/AbcSize
96
+ # rubocop:disable Metrics/CyclomaticComplexity
97
+ # rubocop:disable Metrics/PerceivedComplexity
90
98
  def load_errata_applications(filter_errata_type: nil, include_last_reboot: 'yes', since: nil, up_to: nil, status: nil, host_filter: nil)
91
99
  result = []
92
100
 
@@ -0,0 +1,53 @@
1
+ module Katello
2
+ module EventDaemon
3
+ class Monitor
4
+ def initialize(services)
5
+ @services = services
6
+ @service_statuses = {}
7
+ @services.keys.each do |service_name|
8
+ @service_statuses[service_name] = { running: 'starting' }
9
+ end
10
+ end
11
+
12
+ def start
13
+ write_statuses_to_cache
14
+ loop do
15
+ Rails.application.executor.wrap do
16
+ check_services
17
+ end
18
+ sleep 15
19
+ end
20
+ end
21
+
22
+ def write_statuses_to_cache
23
+ Rails.cache.write(
24
+ Katello::EventDaemon::Runner::STATUS_CACHE_KEY,
25
+ @service_statuses
26
+ )
27
+ end
28
+
29
+ def check_services
30
+ @services.each do |service_name, service_class|
31
+ @service_statuses[service_name] = service_class.status
32
+ rescue => error
33
+ Rails.logger.error("Error occurred while pinging #{service_class}")
34
+ Rails.logger.error(error.message)
35
+ Rails.logger.error(error.backtrace.join("\n"))
36
+ ensure
37
+ if error || !@service_statuses.dig(service_name, :running)
38
+ begin
39
+ service_class.close
40
+ service_class.run
41
+ @service_statuses[service_name] = service_class.status
42
+ rescue => error
43
+ Rails.logger.error("Error occurred while starting #{service_class}")
44
+ Rails.logger.error(error.message)
45
+ Rails.logger.error(error.backtrace.join("\n"))
46
+ end
47
+ end
48
+ end
49
+ write_statuses_to_cache
50
+ end
51
+ end
52
+ end
53
+ end