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
@@ -21,6 +21,15 @@ module Katello
21
21
  end
22
22
  end
23
23
 
24
+ def clear_smart_proxy_sync_histories(repo_list = [])
25
+ if repo_list.empty?
26
+ @smart_proxy.smart_proxy_sync_histories.delete_all
27
+ return
28
+ end
29
+ repo_ids = repo_list.map(&:id)
30
+ @smart_proxy.smart_proxy_sync_histories.where("repository_id IN (?)", repo_ids).delete_all
31
+ end
32
+
24
33
  def combined_repos_available_to_capsule(environment = nil, content_view = nil, repository = nil)
25
34
  lifecycle_environment_check(environment, repository)
26
35
  if repository
@@ -0,0 +1,12 @@
1
+ <div class='form-group'>
2
+ <label class='col-md-2 control-label'>
3
+ <%= _('Activation Key(s)') %>
4
+ <% help = _('Activation key(s) for Subscription Manager. Required for CentOS and Red Hat Enterprise Linux. Multiple keys add separated by comma, example: key1,key2,key3.') %>
5
+ <a rel="popover" data-content="<%= help %>" data-trigger="focus" data-container="body" data-html="true" tabindex="-1">
6
+ <span class="pficon pficon-info "></span>
7
+ </a>
8
+ </label>
9
+ <div class='col-md-4'>
10
+ <%= text_field_tag 'activation_key', params[:activation_key], class: 'form-control' %>
11
+ </div>
12
+ </div>
@@ -1,48 +1,5 @@
1
- <br />
1
+ <%= javascript_include_tag *webpack_asset_paths('katello', extension: 'js') %>
2
2
 
3
- <table class="table table-bordered">
4
- <thead>
5
- <tr>
6
- <th translate>Content View Name</th>
7
- <th translate>Composite</th>
8
- <th translate>Last Published</th>
9
- <th translate>Hosts</th>
10
- <th translate>Products</th>
11
- <th translate>Apt repos</th>
12
- <th translate>Yum repos</th>
13
- <th translate>Container Image repos</th>
14
- <th translate>Deb Packages</th>
15
- <th translate>RPM Packages</th>
16
- <th translate>Errata</th>
17
- <th translate>Puppet modules</th>
18
- </tr>
19
- </thead>
20
- <tbody>
21
- <tr ng-repeat-start="env in syncStatus.lifecycle_environments">
22
- <td colspan="10"
23
- ng-click="toggleExpandEnvironment(env)"
24
- class="expander {{isEnvronmentExpanded(env) ? '' : 'collapsed'}}">
25
- <span class="caret"></span>
26
- {{ env.name }}
27
- </td>
28
- </tr>
29
- <tr ng-repeat-end ng-repeat="cv in env.content_views" ng-show="isEnvronmentExpanded(env)">
30
- <td>
31
- <a href="{{ productsOrVersionUrl(cv.default, cv.id) }}" target="_self">
32
- {{ cv.name }}
33
- </a>
34
- </td>
35
- <td>{{ cv.composite | booleanToYesNo }}</td>
36
- <td>{{ cv.last_published }}</td>
37
- <td>{{ cv.counts.content_hosts }}</td>
38
- <td>{{ cv.counts.products }}</td>
39
- <td>{{ cv.counts.apt_repositories }}</td>
40
- <td>{{ cv.counts.yum_repositories }}</td>
41
- <td>{{ cv.counts.docker_repositories }}</td>
42
- <td>{{ cv.counts.deb_packages }}</td>
43
- <td>{{ cv.counts.packages }}</td>
44
- <td>{{ cv.counts.errata }}</td>
45
- <td>{{ cv.counts.puppet_modules }}</td>
46
- </td>
47
- </tbody>
48
- </table>
3
+ <br />
4
+ <% @smartProxyId= @smart_proxy.id %>
5
+ <%= react_component('Content', smartProxyId: @smartProxyId,) %>
@@ -1,4 +1,4 @@
1
- <% if @smart_proxy.has_feature?(SmartProxy::PULP_NODE_FEATURE) -%>
1
+ <% if @smart_proxy.pulp_mirror? -%>
2
2
  <div ng-controller="CapsuleContentController">
3
3
  <%= render :file => 'smart_proxies/show' %>
4
4
  </div>
@@ -17,33 +17,30 @@ child @lifecycle_environments => :lifecycle_environments do
17
17
  node :syncable do |env|
18
18
  @capsule.environment_syncable?(env)
19
19
  end
20
- node :counts do |env|
21
- counts = {
22
- :content_hosts => env.hosts.authorized("view_hosts").count,
23
- :content_views => env.content_views.non_default.count,
24
- :products => env.products.enabled.count
25
- }
26
- repo_data = @capsule.smart_proxy_service.current_repositories_data(env)
27
- counts.merge!(Katello::Pulp::ContentCountsCalculator.new(repo_data).calculate)
28
- end
29
20
 
30
- node :content_views do |env|
31
- env.content_views.map do |content_view|
32
- attributes = {
33
- :id => content_view.id,
34
- :label => content_view.label,
35
- :name => content_view.name,
36
- :composite => content_view.composite,
37
- :last_published => content_view.versions.empty? ? nil : content_view.versions.last.created_at,
38
- :default => content_view.default,
39
- :counts => {
40
- :content_hosts => content_view.hosts.authorized("view_hosts").count,
41
- :products => content_view.products.enabled.count
42
- }
21
+ if @capsule.has_feature?(SmartProxy::PULP_NODE_FEATURE) || @capsule.has_feature?(SmartProxy::PULP3_FEATURE)
22
+ node :counts do |env|
23
+ {
24
+ :content_views => env.content_views.non_default.count
43
25
  }
44
- repo_data = @capsule.smart_proxy_service.current_repositories_data(env, content_view)
45
- attributes[:counts].merge!(Katello::Pulp::ContentCountsCalculator.new(repo_data).calculate)
46
- attributes
26
+ end
27
+
28
+ node :content_views do |env|
29
+ env.content_views.map do |content_view|
30
+ attributes = {
31
+ :id => content_view.id,
32
+ :label => content_view.label,
33
+ :name => content_view.name,
34
+ :composite => content_view.composite,
35
+ :last_published => content_view.versions.empty? ? nil : content_view.versions.last.created_at,
36
+ :default => content_view.default,
37
+ :up_to_date => @capsule.repos_pending_sync(env, content_view).empty?,
38
+ :counts => {
39
+ :repositories => @capsule.current_repositories_data(env, content_view).try(:count)
40
+ }
41
+ }
42
+ attributes
43
+ end
47
44
  end
48
45
  end
49
46
  end
@@ -1,6 +1,7 @@
1
1
  object @resource
2
2
 
3
3
  attributes :destination_server, :path, :id, :metadata
4
+ attributes :export_type => :type
4
5
 
5
6
  node :content_view_version do |h|
6
7
  h.content_view_version.name
@@ -9,6 +9,7 @@ attributes :version_count
9
9
  attributes :latest_version
10
10
  attributes :auto_publish
11
11
  attributes :solve_dependencies
12
+ attributes :import_only
12
13
 
13
14
  node :next_version do |content_view|
14
15
  content_view.next_version.to_f.to_s
@@ -4,6 +4,12 @@ extends "katello/api/v2/content_views/base"
4
4
 
5
5
  attributes :content_host_count
6
6
 
7
+ node :errors do
8
+ unless @resource.valid?
9
+ attribute :messages => @resource.errors.full_messages
10
+ end
11
+ end
12
+
7
13
  child :duplicate_repositories_to_publish => :duplicate_repositories_to_publish do
8
14
  attributes :id, :name
9
15
  node :components do |repo|
@@ -4,17 +4,15 @@ extends "api/v2/taxonomies/show"
4
4
 
5
5
  attributes :task_id, :label, :redhat_repository_url
6
6
 
7
- if ::SETTINGS[:katello][:use_cp]
8
- attributes :system_purposes, :system_purposes
9
- attributes :service_levels, :service_level
7
+ attributes :system_purposes, :system_purposes
8
+ attributes :service_levels, :service_level
10
9
 
11
- node :simple_content_access do |org|
12
- org.simple_content_access?
13
- end
10
+ node :simple_content_access do |org|
11
+ org.simple_content_access?
12
+ end
14
13
 
15
- node :owner_details do |org|
16
- partial('katello/api/v2/organizations/owner_details', object: OpenStruct.new(org.owner_details))
17
- end
14
+ node :owner_details do |org|
15
+ partial('katello/api/v2/organizations/owner_details', object: OpenStruct.new(org.owner_details))
18
16
  end
19
17
 
20
18
  node :default_content_view_id do |org|
@@ -10,7 +10,8 @@
10
10
  <%= notifications %>
11
11
  <div id="organization-id" data-id="<%= Organization.current.id if Organization.current %>" ></div>
12
12
  <div id="user-id" data-id="<%= User.current.id if User.current %>" ></div>
13
- <div id="reactRoot"></div>
14
- <%= mount_react_component('katello', '#reactRoot') %>
13
+ <div id="reactRoot">
14
+ <%= react_component('katello') %>
15
+ </div>
15
16
  <% end %>
16
17
  <%= render file: "layouts/base" %>
@@ -9,13 +9,9 @@
9
9
 
10
10
  <%= field(f, _("Activation Keys"),
11
11
  :help_inline => _("The value will be available in templates as @host.params['#{kt_ak_label}']")) do
12
- tag.div id: :kt_activation_keys
12
+ react_component('TypeAheadSelect', { id: 'kt_activation_keys', multiple: true, allowNew: true })
13
13
  end %>
14
14
 
15
- <%= mount_react_component('TypeAheadSelect', '#kt_activation_keys',
16
- {id: 'kt_activation_keys', multiple: true, allowNew: true}.to_json,
17
- { flatten_data: true }) %>
18
-
19
15
  <div class="alert alert-info">
20
16
  <p><b><%= _('Subscriptions information based on selected activation keys:') %></b></p>
21
17
  <ul id="ak-subscriptions-info"></ul>
@@ -3,10 +3,7 @@
3
3
  <%= javascript_include_tag 'katello/organizations/download_certificate' %>
4
4
 
5
5
  <%= text_f f, :label, :disabled => true, :class => 'input-xlarge' %>
6
-
7
- <% if ::SETTINGS[:katello][:use_cp] %>
8
- <%= selectable_f(f, :service_level, options_for_select(service_level_options, service_level_selected), {}, :label => _('Default System SLA')) %>
9
- <% end %>
6
+ <%= selectable_f(f, :service_level, options_for_select(service_level_options, service_level_selected), {}, :label => _('Default System SLA')) %>
10
7
 
11
8
  <%= field(f, _('Debug Certificate'),
12
9
  :help_inline => _('This certificate allows a user to view the repositories in any environment from a browser.')) do
@@ -1,4 +1,4 @@
1
- <% if !@smart_proxy.new_record? && @smart_proxy.has_feature?(SmartProxy::PULP_NODE_FEATURE) -%>
1
+ <% if !@smart_proxy.new_record? && @smart_proxy.pulp_mirror? -%>
2
2
  <li id="kt_environments_tab">
3
3
  <a href="#kt_environments" data-toggle="tab"><%= _('Lifecycle Environments') %></a>
4
4
  </li>
@@ -1,4 +1,4 @@
1
- <% if !@smart_proxy.new_record? && @smart_proxy.has_feature?(SmartProxy::PULP_NODE_FEATURE) -%>
1
+ <% if !@smart_proxy.new_record? && @smart_proxy.pulp_mirror? -%>
2
2
  <div class="tab-pane" id="kt_environments">
3
3
  <%= multiple_selects f, :lifecycle_environments, Katello::KTEnvironment.completer_scope(:organization_id => ::Organization.current.try(:id)), @smart_proxy.lifecycle_environment_ids, {:label => _('Lifecycle Environments')}, @smart_proxy.default_capsule? ? {:disabled => :disabled } : {} %>
4
4
 
@@ -10,9 +10,6 @@
10
10
  :ostree: true
11
11
  :ansible_collection: true
12
12
 
13
- :use_cp: true # set to true/false if you want to override default
14
- :use_pulp: true # set to true/false if you want to override default
15
-
16
13
  :rest_client_timeout: 30
17
14
  :gpg_strict_validation: false
18
15
 
@@ -113,6 +113,22 @@ Katello::Engine.routes.draw do
113
113
  end
114
114
  end
115
115
 
116
+ api_resources :content_exports, :only => [] do
117
+ collection do
118
+ post :version
119
+ post :library
120
+ get :index
121
+ get :api_status
122
+ end
123
+ end
124
+
125
+ api_resources :content_export_incrementals, :only => [] do
126
+ collection do
127
+ post :version
128
+ post :library
129
+ end
130
+ end
131
+
116
132
  api_resources :content_view_versions, :except => [:create] do
117
133
  member do
118
134
  post :promote
@@ -121,11 +137,15 @@ Katello::Engine.routes.draw do
121
137
  get :available_errata, :controller => :errata
122
138
  end
123
139
  collection do
124
- get :export_histories
125
- get :export_api_status
126
140
  get :auto_complete_search
127
141
  post :incremental_update
128
- post :import
142
+ end
143
+ end
144
+
145
+ api_resources :content_imports, :only => [] do
146
+ collection do
147
+ post :version
148
+ post :library
129
149
  end
130
150
  end
131
151
 
@@ -187,14 +207,6 @@ Katello::Engine.routes.draw do
187
207
  end
188
208
  end
189
209
 
190
- api_resources :gpg_keys, :only => [:index, :show, :create, :update, :destroy] do
191
- member do
192
- get :content
193
- post :content, :action => :set_content
194
- end
195
- get :auto_complete_search, :on => :collection
196
- end
197
-
198
210
  api_resources :host_collections, :only => [:index, :show, :create, :update, :destroy] do
199
211
  member do
200
212
  post :copy
@@ -340,8 +352,6 @@ Katello::Engine.routes.draw do
340
352
  end
341
353
  end
342
354
 
343
- api_resources :gpg_keys, :only => [:index]
344
-
345
355
  api_resources :content_views, :only => [:index, :create]
346
356
  api_resources :subscriptions, :only => [:index, :upload, :delete_manifest, :refresh_manifest, :show] do
347
357
  collection do
@@ -351,6 +361,14 @@ Katello::Engine.routes.draw do
351
361
  end
352
362
  end
353
363
 
364
+ api_resources :simple_content_access, only: [] do
365
+ collection do
366
+ put :enable
367
+ put :disable
368
+ get :eligible
369
+ end
370
+ end
371
+
354
372
  api_resources :upstream_subscriptions, only: [:index, :create] do
355
373
  collection do
356
374
  delete :destroy
@@ -329,7 +329,7 @@ class MigrateContentHosts < ActiveRecord::Migration[4.2]
329
329
  # rubocop:disable Metrics/MethodLength
330
330
  # rubocop:disable Metrics/AbcSize
331
331
  def up
332
- if User.where(:login => User::ANONYMOUS_API_ADMIN).first.nil?
332
+ unless User.unscoped.where(:login => User::ANONYMOUS_API_ADMIN).exists?
333
333
  logger.warn("Foreman anonymous admin does not exist, skipping content host migration.")
334
334
  return
335
335
  end
@@ -2,6 +2,5 @@ class AddContentViewVersionCounts < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  add_column :katello_content_view_versions, :content_counts, :text
4
4
  Katello::ContentViewVersion.reset_column_information
5
- Katello::ContentViewVersion.all.each(&:update_content_counts!)
6
5
  end
7
6
  end
@@ -1,6 +1,6 @@
1
1
  class MoveKatelloFieldsFromHostgroups < ActiveRecord::Migration[6.0]
2
2
  def up
3
- if User.where(login: User::ANONYMOUS_ADMIN).exists?
3
+ if User.unscoped.where(login: User::ANONYMOUS_ADMIN).exists?
4
4
  User.as_anonymous_admin do
5
5
  copy_data_from_hostgroup
6
6
  end
@@ -46,7 +46,10 @@ class MoveKatelloFieldsFromHostgroups < ActiveRecord::Migration[6.0]
46
46
  content_facet.kickstart_repository_id = kickstart_repository_id
47
47
  content_facet.content_view_id = content_view_id
48
48
  content_facet.lifecycle_environment_id = lifecycle_environment_id
49
- content_facet.save!
49
+ unless content_facet.save
50
+ Rails.logger.warn("Unable to save content facet hostgroup for #{content_facet.inspect} ")
51
+ Rails.logger.warn(content_facet.errors.full_messages.join("\n"))
52
+ end
50
53
  end
51
54
  end
52
55
  end
@@ -0,0 +1,13 @@
1
+ class CreateKatelloSmartProxySyncHistory < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :katello_smart_proxy_sync_history do |t|
4
+ t.references :smart_proxy, :null => false
5
+ t.references :repository, :null => false
6
+ t.datetime :started_at
7
+ t.datetime :finished_at
8
+ end
9
+ add_index "katello_smart_proxy_sync_history", ["smart_proxy_id"], :name => "index_spsh_smart_proxy_id"
10
+ add_index "katello_smart_proxy_sync_history", ["repository_id"], :name => "index_spsh_repository_id"
11
+ add_index "katello_smart_proxy_sync_history", [:smart_proxy_id, :repository_id], :unique => true, :name => 'index_spsh_smart_proxy_repository_unique'
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class AddImportOnlyToKatelloContentView < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :katello_content_views, :import_only, :boolean, :default => false, :null => false
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class Pulp3MigrationProgress < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :katello_content_migration_progresses do |t|
4
+ t.string :progress_message
5
+ t.boolean :canceled, null: false, default: false
6
+ t.string :task_id, null: false, index: {name: 'katello_content_migration_progress_task_id', unique: true }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,56 @@
1
+ class DeletePuppetAndOstreeRepos < ActiveRecord::Migration[6.0]
2
+ class FakeContentViewPuppetModule < Katello::Model
3
+ self.table_name = 'katello_content_view_puppet_modules'
4
+ end
5
+
6
+ class FakeContentViewPuppetEnvironmentPuppetModule < Katello::Model
7
+ self.table_name = 'katello_content_view_puppet_environment_puppet_modules'
8
+ end
9
+
10
+ class FakeRepositoryPuppetModule < Katello::Model
11
+ self.table_name = 'katello_repository_puppet_modules'
12
+ end
13
+
14
+ class FakeContentViewPuppetEnvironment < Katello::Model
15
+ self.table_name = 'katello_content_view_puppet_environments'
16
+ end
17
+ class FakePuppetModule < Katello::Model
18
+ self.table_name = 'katello_puppet_modules'
19
+ end
20
+ class FakeRepositoryOstreeBranch < Katello::Model
21
+ self.table_name = 'katello_repository_ostree_branches'
22
+ end
23
+ class FakeOstreeBranch < Katello::Model
24
+ self.table_name = 'katello_ostree_branches'
25
+ end
26
+
27
+ def up
28
+ if Katello::Repository.ostree_type.any? || Katello::Repository.puppet_type.any?
29
+ User.as_anonymous_admin do
30
+ FakeContentViewPuppetModule.delete_all
31
+ FakeContentViewPuppetEnvironmentPuppetModule.delete_all
32
+ FakeRepositoryPuppetModule.delete_all
33
+
34
+ FakeContentViewPuppetEnvironment.delete_all
35
+ FakePuppetModule.delete_all
36
+
37
+ Katello::Repository.puppet_type.delete_all
38
+
39
+ FakeRepositoryOstreeBranch.delete_all
40
+ FakeOstreeBranch.delete_all
41
+ Katello::Repository.ostree_type.where.not(:library_instance_id => nil, :environment_id => nil).destroy_all #CV LCE repos
42
+ Katello::Repository.ostree_type.where.not(:library_instance_id => nil).destroy_all # archive repos
43
+ Katello::Repository.ostree_type.destroy_all #all the rest (should just be library repos)
44
+
45
+ Katello::ContentViewVersion.where.not(:content_counts => nil).each do |version|
46
+ version.content_counts.except!('ostree', 'puppet_module')
47
+ version.save
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def down
54
+ fail ActiveRecord::IrreversibleMigration
55
+ end
56
+ end