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
@@ -2,8 +2,8 @@ module Katello
2
2
  class ContentViewEnvironment < Katello::Model
3
3
  audited :associated_with => :content_view
4
4
  include ForemanTasks::Concerns::ActionSubject
5
- include Glue::Candlepin::Environment if SETTINGS[:katello][:use_cp]
6
- include Glue if SETTINGS[:katello][:use_cp]
5
+ include Glue::Candlepin::Environment
6
+ include Glue
7
7
  include Authorization::ContentViewEnvironment
8
8
 
9
9
  belongs_to :content_view, :class_name => "Katello::ContentView", :inverse_of => :content_view_environments
@@ -1,5 +1,6 @@
1
1
  module Katello
2
2
  class ContentViewFilter < Katello::Model
3
+ include Authorization::ContentViewFilter
3
4
  audited :associations => [:repositories]
4
5
  DOCKER = 'docker'.freeze
5
6
  RPM = Rpm::CONTENT_TYPE
@@ -157,6 +158,10 @@ module Katello
157
158
  if self.content_view.composite?
158
159
  errors.add(:base, _("cannot contain filters if composite view"))
159
160
  end
161
+
162
+ if self.content_view.import_only?
163
+ errors.add(:base, _("cannot add filter to import-only view"))
164
+ end
160
165
  end
161
166
 
162
167
  def validate_filter_repos(errors, content_view)
@@ -32,7 +32,8 @@ module Katello
32
32
  publish: 1,
33
33
  promotion: 2,
34
34
  removal: 3,
35
- export: 4
35
+ export: 4,
36
+ importing: 5
36
37
  }
37
38
 
38
39
  def content_view
@@ -43,7 +43,7 @@ module Katello
43
43
  end
44
44
 
45
45
  def self.generate_rpm_clauses(package_filenames = [])
46
- { 'filename' => { "$in" => package_filenames } } unless package_filenames.empty?
46
+ { 'filename' => { "$in" => package_filenames.sort } } unless package_filenames.empty?
47
47
  end
48
48
 
49
49
  def applicable_rpms
@@ -1,8 +1,8 @@
1
1
  module Katello
2
2
  class ContentViewPuppetEnvironment < Katello::Model
3
3
  include ForemanTasks::Concerns::ActionSubject
4
- include Glue::Pulp::Repo if SETTINGS[:katello][:use_pulp]
5
- include Glue if SETTINGS[:katello][:use_pulp]
4
+ include Glue::Pulp::Repo
5
+ include Glue
6
6
 
7
7
  belongs_to :environment, :class_name => "Katello::KTEnvironment",
8
8
  :inverse_of => :content_view_puppet_environments
@@ -17,6 +17,8 @@ module Katello
17
17
 
18
18
  before_validation :set_attributes
19
19
 
20
+ validate :import_only_content_view
21
+
20
22
  def puppet_module
21
23
  PuppetModule.find_by(:pulp_id => self.uuid)
22
24
  end
@@ -42,6 +44,12 @@ module Katello
42
44
 
43
45
  private
44
46
 
47
+ def import_only_content_view
48
+ if self.content_view.import_only?
49
+ errors.add(:base, "Cannot add puppet modules to an import-only content view.")
50
+ end
51
+ end
52
+
45
53
  def set_attributes
46
54
  if self.uuid.present?
47
55
  puppet_module = PuppetModule.with_identifiers(self.uuid).first
@@ -7,6 +7,10 @@ module Katello
7
7
  Repository::DEB_TYPE
8
8
  ].freeze
9
9
 
10
+ ALLOWED_IMPORT_REPOSITORY_TYPES = [
11
+ Repository::YUM_TYPE
12
+ ].freeze
13
+
10
14
  belongs_to :content_view, :inverse_of => :content_view_repositories,
11
15
  :class_name => "Katello::ContentView"
12
16
  belongs_to :repository, :inverse_of => :content_view_repositories,
@@ -27,7 +31,7 @@ module Katello
27
31
  end
28
32
 
29
33
  def ensure_repository_type
30
- unless ALLOWED_REPOSITORY_TYPES.include?(repository.content_type)
34
+ unless allowed_repository_types.include?(repository.content_type)
31
35
  errors.add(:base, _("Cannot add %s repositories to a content view.") % repository.content_type)
32
36
  end
33
37
  end
@@ -41,5 +45,13 @@ module Katello
41
45
  errors.add(:base, _("Repositories from published Content Views are not allowed."))
42
46
  end
43
47
  end
48
+
49
+ def allowed_repository_types
50
+ if self.content_view.import_only?
51
+ ALLOWED_IMPORT_REPOSITORY_TYPES
52
+ else
53
+ ALLOWED_REPOSITORY_TYPES
54
+ end
55
+ end
44
56
  end
45
57
  end
@@ -322,7 +322,8 @@ module Katello
322
322
  end
323
323
 
324
324
  def content_counts_map
325
- return {} if content_counts.blank?
325
+ # if its empty, calculate it on demand
326
+ update_content_counts! if content_counts.blank?
326
327
  counts = Hash[content_counts.map { |key, value| ["#{key}_count", value] }]
327
328
  counts.merge("module_stream_count" => counts["modulemd_count"],
328
329
  "package_count" => counts["rpm_count"],
@@ -2,13 +2,24 @@ module Katello
2
2
  class ContentViewVersionExportHistory < Katello::Model
3
3
  include Authorization::ContentViewVersionExportHistory
4
4
 
5
+ COMPLETE = "complete".freeze
6
+ INCREMENTAL = "incremental".freeze
7
+ EXPORT_TYPES = [COMPLETE, INCREMENTAL].freeze
8
+
5
9
  belongs_to :content_view_version, :class_name => "Katello::ContentViewVersion", :inverse_of => :export_histories
6
10
  validates_lengths_from_database
7
11
  validates :content_view_version_id, :presence => true
8
- validates :destination_server, :presence => true, :uniqueness => { :scope => [:content_view_version_id, :destination_server, :path] }
12
+ validates :destination_server, :uniqueness => { :scope => [:content_view_version_id, :destination_server, :path] }
13
+ validates :export_type, :inclusion => { :in => EXPORT_TYPES,
14
+ :allow_blank => false,
15
+ :message => _("Invalid export_type from one of the following: %s" % EXPORT_TYPES.join(', '))
16
+ }
17
+
9
18
  validates :metadata, :presence => true
10
19
  serialize :metadata, Hash
11
20
 
21
+ before_validation :set_export_type, :if => -> { export_type.blank? }
22
+
12
23
  scope :with_organization_id, ->(organization_id) do
13
24
  where(:content_view_version_id => ContentViewVersion.with_organization_id(organization_id))
14
25
  end
@@ -20,5 +31,19 @@ module Katello
20
31
  scoped_search :on => :content_view_id, :relation => :content_view_version, :validator => ScopedSearch::Validators::INTEGER, :only_explicit => true
21
32
  scoped_search :on => :content_view_version_id, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
22
33
  scoped_search :on => :id, :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
34
+ scoped_search :on => :export_type, :rename => :type, :complete_value => EXPORT_TYPES
35
+
36
+ def self.latest(content_view, destination_server: nil)
37
+ where(content_view_version: content_view.versions,
38
+ destination_server: destination_server).order(:created_at).last
39
+ end
40
+
41
+ def export_type_from_metadata
42
+ cvve.metadata[:incremental] ? INCREMENTAL : COMPLETE
43
+ end
44
+
45
+ def set_export_type
46
+ self.export_type = export_type_from_metadata
47
+ end
23
48
  end
24
49
  end
@@ -173,9 +173,11 @@ module Katello
173
173
  property :package_names, array_of: String, desc: 'Returns names of packages the errata can be applied to'
174
174
  property :cves, array_of: 'ErratumCve', desc: 'Returns CVEs associated with the errata'
175
175
  property :reboot_suggested, one_of: [true, false], desc: 'Returns true if reboot is suggested after errata applying, false otherwise'
176
+ property :title, String, desc: 'Returns the errata title, e.g. "Important: net-snmp security update"'
177
+ property :summary, String, desc: 'Returns the errata summary, the length can very, it is usually in range of 60 to 1000 characters. It can include empty line characters.'
176
178
  end
177
179
  class Jail < ::Safemode::Jail
178
- allow :errata_id, :errata_type, :issued, :created_at, :severity, :package_names, :cves, :reboot_suggested
180
+ allow :errata_id, :errata_type, :issued, :created_at, :severity, :package_names, :cves, :reboot_suggested, :title, :summary
179
181
  end
180
182
  end
181
183
  end
@@ -92,6 +92,8 @@ module Katello
92
92
  end
93
93
 
94
94
  # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
95
+ # rubocop:disable Metrics/CyclomaticComplexity
96
+ # rubocop:disable Metrics/PerceivedComplexity
95
97
  def import_data(index_hosts_and_activation_keys = false)
96
98
  pool_attributes = {}.with_indifferent_access
97
99
  pool_json = self.backend_data
@@ -113,12 +113,6 @@ module Katello
113
113
  backend_service(capsule).generate_distributors
114
114
  end
115
115
 
116
- def populate_from(repos_map)
117
- found = repos_map[self.pulp_id]
118
- prepopulate(found) if found
119
- !found.nil?
120
- end
121
-
122
116
  def package_group_count
123
117
  content_unit_counts = 0
124
118
  if self.pulp_repo_facts
@@ -12,27 +12,6 @@ module Katello
12
12
  "#{path_prefix}/#{path}"
13
13
  end
14
14
 
15
- def self.prepopulate!(products, environment, repos = [], content_view = nil)
16
- if content_view.nil?
17
- if environment.library?
18
- content_view = environment.default_content_view
19
- else
20
- fail "No content view specified for a Non library environment #{environment.inspect}"
21
- end
22
- end
23
-
24
- items = Katello.pulp_server.extensions.repository.search_by_repository_ids(Repository.in_environment(environment).pluck(:pulp_id))
25
- full_repos = {}
26
- items.each { |item| full_repos[item["id"]] = item }
27
-
28
- products.each do |prod|
29
- prod.repos(environment, content_view).each do |repo|
30
- repo.populate_from(full_repos)
31
- end
32
- end
33
- repos.each { |repo| repo.populate_from(full_repos) }
34
- end
35
-
36
15
  module InstanceMethods
37
16
  def distributions(env)
38
17
  to_ret = []
@@ -125,7 +104,7 @@ module Katello
125
104
  AND inner_select.resource_id = locks_foreman_tasks_tasks.resource_id")
126
105
  .distinct
127
106
 
128
- max_per_repoid.map { |x| [x.resource_id, x] }.to_h
107
+ max_per_repoid.index_by { |x| [x.resource_id, x] }
129
108
  end
130
109
 
131
110
  def sync_state_aggregated
@@ -282,6 +282,10 @@ module Katello
282
282
  name.gsub('_', '-').chomp('.').downcase
283
283
  end
284
284
 
285
+ def unsubscribed_hypervisor?
286
+ self.hypervisor && !self.candlepin_consumer.entitlements?
287
+ end
288
+
285
289
  def candlepin_consumer
286
290
  @candlepin_consumer ||= Katello::Candlepin::Consumer.new(self.uuid, self.host.organization.label)
287
291
  end
@@ -5,10 +5,17 @@ module Katello
5
5
  PACKAGES = %w(katello candlepin pulp qpid foreman tfm hammer).freeze
6
6
 
7
7
  class << self
8
+ def pulpcore_enabled # for downstream 6.9, remove in 6.10
9
+ SETTINGS[:katello][:use_pulp_2_for_content_type].nil? || (!SETTINGS[:katello][:use_pulp_2_for_content_type][:yum] &&
10
+ !SETTINGS[:katello][:use_pulp_2_for_content_type][:docker] &&
11
+ !SETTINGS[:katello][:use_pulp_2_for_content_type][:file]) ||
12
+ system('systemctl is-enabled pulpcore-api.service')
13
+ end
14
+
8
15
  def services(capsule_id = nil)
9
16
  proxy = fetch_proxy(capsule_id)
10
17
  services = [:candlepin, :candlepin_auth, :foreman_tasks, :katello_events, :candlepin_events]
11
- services += [:pulp3] if proxy&.pulp3_enabled?
18
+ services += [:pulp3] if proxy&.pulp3_enabled? && pulpcore_enabled
12
19
  if proxy.nil? || proxy.has_feature?(SmartProxy::PULP_NODE_FEATURE) || proxy.has_feature?(SmartProxy::PULP_FEATURE)
13
20
  services += [:pulp, :pulp_auth]
14
21
  end
@@ -16,9 +23,7 @@ module Katello
16
23
  services
17
24
  end
18
25
 
19
- #
20
26
  # Calls "status" services in all backend engines.
21
- #
22
27
  def ping(services: nil, capsule_id: nil)
23
28
  services ||= self.services(capsule_id)
24
29
  result = {}
@@ -51,7 +56,7 @@ module Katello
51
56
  running = status&.dig(:running)
52
57
 
53
58
  if running
54
- result[:message] = "#{status[:processed_count]} Processed, #{status[:failed_count]} Failed"
59
+ result[:message] = "#{status[:processed_count].to_i} Processed, #{status[:failed_count].to_i} Failed"
55
60
  else
56
61
  result[:status] = FAIL_RETURN_CODE
57
62
  result[:message] = _("Not running")
@@ -60,14 +65,14 @@ module Katello
60
65
 
61
66
  def ping_katello_events(result)
62
67
  exception_watch(result) do
63
- status = Katello::EventMonitor::PollerThread.status(refresh: false)
68
+ status = Katello::EventDaemon::Runner.service_status(:katello_events)
64
69
  event_daemon_status(status, result)
65
70
  end
66
71
  end
67
72
 
68
73
  def ping_candlepin_events(result)
69
74
  exception_watch(result) do
70
- status = Katello::CandlepinEventListener.status(refresh: false)
75
+ status = Katello::EventDaemon::Runner.service_status(:candlepin_events)
71
76
  event_daemon_status(status, result)
72
77
  end
73
78
  end
@@ -22,6 +22,7 @@ module Katello
22
22
  where(["end_date < ?", days.to_i.days.from_now.end_of_day])
23
23
  end
24
24
  scope :upstream, -> { where.not(upstream_pool_id: nil) }
25
+ scope :redhat, -> { joins(:products).merge(Katello::Product.redhat).distinct }
25
26
 
26
27
  include Glue::Candlepin::Pool
27
28
  include Glue::Candlepin::CandlepinObject
@@ -51,6 +52,10 @@ module Katello
51
52
 
52
53
  DAYS_RECENTLY_EXPIRED = 30
53
54
 
55
+ def redhat?
56
+ self.class.redhat.where(:id => self.id).exists?
57
+ end
58
+
54
59
  def active?
55
60
  active
56
61
  end
@@ -3,9 +3,9 @@ module Katello
3
3
  audited
4
4
 
5
5
  include ForemanTasks::Concerns::ActionSubject
6
- include Glue::Candlepin::Product if SETTINGS[:katello][:use_cp]
7
- include Glue::Pulp::Repos if SETTINGS[:katello][:use_pulp]
8
- include Glue if SETTINGS[:katello][:use_cp] || SETTINGS[:katello][:use_pulp]
6
+ include Glue::Candlepin::Product
7
+ include Glue::Pulp::Repos
8
+ include Glue
9
9
 
10
10
  include Katello::Authorization::Product
11
11
 
@@ -12,9 +12,9 @@ module Katello
12
12
 
13
13
  include ForemanTasks::Concerns::ActionSubject
14
14
  include Glue::Candlepin::Repository
15
- include Glue::Pulp::Repo if SETTINGS[:katello][:use_pulp]
15
+ include Glue::Pulp::Repo
16
16
 
17
- include Glue if (SETTINGS[:katello][:use_cp] || SETTINGS[:katello][:use_pulp])
17
+ include Glue
18
18
  include Authorization::Repository
19
19
  include Katello::Engine.routes.url_helpers
20
20
 
@@ -109,6 +109,8 @@ module Katello
109
109
  has_many :distribution_references, :class_name => 'Katello::Pulp3::DistributionReference', :foreign_key => :repository_id,
110
110
  :dependent => :destroy, :inverse_of => :repository
111
111
 
112
+ has_many :smart_proxy_sync_histories, :class_name => "::Katello::SmartProxySyncHistory", :inverse_of => :repository, :dependent => :delete_all
113
+
112
114
  validates_with Validators::ContainerImageNameValidator, :attributes => :container_repository_name, :allow_blank => false, :if => :docker?
113
115
  validates :container_repository_name, :if => :docker?, :uniqueness => {message: ->(object, _data) do
114
116
  _("for repository '%{name}' is not unique and cannot be created in '%{env}'. Its Container Repository Name (%{container_name}) conflicts with an existing repository. Consider changing the Lifecycle Environment's Registry Name Pattern to something more specific.") %
@@ -120,6 +122,8 @@ module Katello
120
122
 
121
123
  scope :has_url, -> { joins(:root).where.not("#{RootRepository.table_name}.url" => nil) }
122
124
  scope :on_demand, -> { joins(:root).where("#{RootRepository.table_name}.download_policy" => ::Runcible::Models::YumImporter::DOWNLOAD_ON_DEMAND) }
125
+ scope :immediate, -> { joins(:root).where("#{RootRepository.table_name}.download_policy" => ::Runcible::Models::YumImporter::DOWNLOAD_IMMEDIATE) }
126
+ scope :non_immediate, -> { joins(:root).where.not("#{RootRepository.table_name}.download_policy" => ::Runcible::Models::YumImporter::DOWNLOAD_IMMEDIATE) }
123
127
  scope :in_default_view, -> { joins(:content_view_version => :content_view).where("#{Katello::ContentView.table_name}.default" => true) }
124
128
  scope :in_non_default_view, -> { joins(:content_view_version => :content_view).where("#{Katello::ContentView.table_name}.default" => false) }
125
129
  scope :deb_type, -> { with_type(DEB_TYPE) }
@@ -141,7 +145,7 @@ module Katello
141
145
  scoped_search :rename => :product, :on => :name, :relation => :product, :complete_value => true
142
146
  scoped_search :rename => :product_id, :on => :id, :relation => :product
143
147
  scoped_search :on => :content_type, :relation => :root, :complete_value => -> do
144
- Katello::RepositoryTypeManager.repository_types.keys.each_with_object({}) { |value, hash| hash[value.to_sym] = value }
148
+ Katello::RepositoryTypeManager.repository_types.keys.index_by { |value| value.to_sym }
145
149
  end
146
150
  scoped_search :on => :content_view_id, :relation => :content_view_repositories, :validator => ScopedSearch::Validators::INTEGER, :only_explicit => true
147
151
  scoped_search :on => :distribution_version, :complete_value => true
@@ -152,6 +156,7 @@ module Katello
152
156
  scoped_search :on => :redhat, :complete_value => { :true => true, :false => false }, :ext_method => :search_by_redhat
153
157
  scoped_search :on => :container_repository_name, :complete_value => true
154
158
  scoped_search :on => :description, :relation => :root, :only_explicit => true
159
+ scoped_search :on => :download_policy, :relation => :root, :only_explicit => true
155
160
  scoped_search :on => :name, :relation => :product, :rename => :product_name
156
161
  scoped_search :on => :id, :relation => :product, :rename => :product_id, :only_explicit => true
157
162
  scoped_search :on => :label, :relation => :root, :complete_value => true, :only_explicit => true
@@ -285,6 +290,10 @@ module Katello
285
290
  root.download_policy == Runcible::Models::YumImporter::DOWNLOAD_ON_DEMAND
286
291
  end
287
292
 
293
+ def immediate?
294
+ root.download_policy == ::Runcible::Models::YumImporter::DOWNLOAD_IMMEDIATE
295
+ end
296
+
288
297
  def yum_gpg_key_url
289
298
  # if the repo has a gpg key return a url to access it
290
299
  if self.root.gpg_key.try(:content).present?
@@ -531,6 +540,30 @@ module Katello
531
540
  clone
532
541
  end
533
542
 
543
+ def self.synced_on_capsule(smart_proxy)
544
+ smart_proxy.smart_proxy_sync_histories.map { |sph| sph.repository unless sph.finished_at.nil? }
545
+ end
546
+
547
+ def clear_smart_proxy_sync_histories(smart_proxy = nil)
548
+ if smart_proxy
549
+ self.smart_proxy_sync_histories.where(:smart_proxy_id => smart_proxy.id).try(:delete_all)
550
+ else
551
+ self.smart_proxy_sync_histories.delete_all
552
+ end
553
+ end
554
+
555
+ def create_smart_proxy_sync_history(smart_proxy)
556
+ clear_smart_proxy_sync_histories(smart_proxy)
557
+ sp_history_args = {
558
+ :smart_proxy_id => smart_proxy.id,
559
+ :repository_id => self.id,
560
+ :started_at => Time.now
561
+ }
562
+ sp_history = ::Katello::SmartProxySyncHistory.create sp_history_args
563
+ sp_history.save!
564
+ sp_history.id
565
+ end
566
+
534
567
  def latest_sync_audit
535
568
  self.audits.where(:action => AUDIT_SYNC_ACTION).order(:created_at).last
536
569
  end
@@ -0,0 +1,8 @@
1
+ module Katello
2
+ class SmartProxySyncHistory < Katello::Model
3
+ self.table_name = 'katello_smart_proxy_sync_history'
4
+
5
+ belongs_to :smart_proxy, :class_name => "::SmartProxy", :inverse_of => :smart_proxy_sync_histories
6
+ belongs_to :repository, :class_name => "Katello::Repository", :inverse_of => :smart_proxy_sync_histories
7
+ end
8
+ end