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,99 @@
1
+ module Katello
2
+ module EventDaemon
3
+ class Runner
4
+ STATUS_CACHE_KEY = "katello_event_daemon_status".freeze
5
+ @services = {}
6
+ @cache = ActiveSupport::Cache::MemoryStore.new
7
+
8
+ class << self
9
+ def initialize
10
+ FileUtils.touch(lock_file)
11
+ end
12
+
13
+ def settings
14
+ SETTINGS[:katello][:event_daemon]
15
+ end
16
+
17
+ def pid
18
+ return unless pid_file && File.exist?(pid_file)
19
+
20
+ File.open(pid_file) { |f| f.read.to_i }
21
+ end
22
+
23
+ def pid_file
24
+ pid_dir.join('katello_event_daemon.pid')
25
+ end
26
+
27
+ def pid_dir
28
+ Rails.root.join('tmp', 'pids')
29
+ end
30
+
31
+ def lock_file
32
+ Rails.root.join('tmp', 'katello_event_daemon.lock')
33
+ end
34
+
35
+ def write_pid_file
36
+ return unless pid_file
37
+
38
+ FileUtils.mkdir_p(pid_dir)
39
+ File.open(pid_file, 'w') { |f| f.puts Process.pid }
40
+ end
41
+
42
+ def stop
43
+ return unless pid == Process.pid
44
+ @monitor_thread.kill
45
+ @cache.clear
46
+ @services.values.each(&:close)
47
+ File.unlink(pid_file) if pid_file && File.exist?(pid_file)
48
+ end
49
+
50
+ def start
51
+ return unless runnable?
52
+ lockfile = File.open(lock_file, 'r')
53
+ begin
54
+ lockfile.flock(File::LOCK_EX)
55
+ return if started? # ensure it wasn't started while we waited for the lock
56
+ start_monitor_thread
57
+ write_pid_file
58
+
59
+ at_exit do
60
+ stop
61
+ end
62
+
63
+ Rails.logger.info("Katello event daemon started process=#{Process.pid}")
64
+ ensure
65
+ lockfile.flock(File::LOCK_UN)
66
+ end
67
+ end
68
+
69
+ def started?
70
+ Process.kill(0, pid)
71
+ true
72
+ rescue Errno::ESRCH, TypeError # process no longer exists or we had no PID cached
73
+ false
74
+ end
75
+
76
+ def start_monitor_thread
77
+ @monitor_thread = Thread.new do
78
+ Katello::EventDaemon::Monitor.new(@services).start
79
+ end
80
+ end
81
+
82
+ def runnable?
83
+ # avoid accessing the disk on each request
84
+ @cache.fetch('katello_event_daemon_runnable', expires_in: 1.minute) do
85
+ !started? && settings[:enabled] && !::Foreman.in_rake? && !Rails.env.test?
86
+ end
87
+ end
88
+
89
+ def register_service(name, klass)
90
+ @services[name] = klass
91
+ end
92
+
93
+ def service_status(service_name = nil)
94
+ Rails.cache.read(STATUS_CACHE_KEY)&.dig(service_name)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -10,5 +10,37 @@ module Katello
10
10
 
11
11
  logger.send(level, "#{message} #{data_string}")
12
12
  end
13
+
14
+ class Timer
15
+ def initialize(key = "default")
16
+ @key = key
17
+ @start_time = Time.now
18
+ Thread.current[:timers] ||= {}
19
+ Thread.current[:timers][key] = self
20
+ end
21
+
22
+ def start
23
+ Rails.logger.info "Timer #{@key} already started; resetting start time" if @start_time
24
+ Rails.logger.info "Timer #{@key} starting at #{Time.now}"
25
+ @start_time = Time.now
26
+ self
27
+ end
28
+
29
+ def stop
30
+ fail ::StandardError, "Timer #{@key} is not started" unless @start_time
31
+ duration = (Time.now - @start_time).truncate(2)
32
+ @start_time = nil
33
+ Rails.logger.info "Timer #{@key} stopping at #{Time.now}: #{duration} sec"
34
+ end
35
+
36
+ def self.find_by_key(key)
37
+ if Thread.current&.[](:timers)&.[](key)
38
+ Thread.current[:timers][key]
39
+ else
40
+ Rails.logger.warn "Timer #{key} not found on current thread; creating a new timer"
41
+ self.new(key)
42
+ end
43
+ end
44
+ end
13
45
  end
14
46
  end
@@ -2,13 +2,7 @@ module Katello
2
2
  module Messaging
3
3
  class Connection
4
4
  def self.create(connection_class:, settings:)
5
- connection = connection_class.new(settings: settings)
6
-
7
- at_exit do
8
- connection.close
9
- end
10
-
11
- connection
5
+ connection_class.new(settings: settings)
12
6
  end
13
7
  end
14
8
  end
@@ -1,7 +1,7 @@
1
1
  module Katello
2
2
  module Validators
3
3
  class ContentViewPuppetModuleValidator < ActiveModel::Validator
4
- def validate(record)
4
+ def validate(record) # rubocop:disable Metrics/CyclomaticComplexity
5
5
  if record.uuid.blank? && (record.name.blank? || record.author.blank?)
6
6
  record.errors[:base] << _("Invalid puppet module parameters specified. \
7
7
  Either 'uuid' or 'name' and 'author' must be specified.")
@@ -1,8 +1,8 @@
1
1
  module Katello
2
2
  class ActivationKey < Katello::Model
3
3
  audited :except => [:cp_id], :associations => [:host_collections]
4
- include Glue::Candlepin::ActivationKey if SETTINGS[:katello][:use_cp]
5
- include Glue if SETTINGS[:katello][:use_cp]
4
+ include Glue::Candlepin::ActivationKey
5
+ include Glue
6
6
  include Katello::Authorization::ActivationKey
7
7
  include ForemanTasks::Concerns::ActionSubject
8
8
  include ScopedSearchExtensions
@@ -0,0 +1,15 @@
1
+ module Katello
2
+ module Authorization::ContentViewFilter
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def readable
7
+ where(:content_view_id => ::Katello::ContentView.readable)
8
+ end
9
+
10
+ def editable
11
+ where(:content_view_id => ::Katello::ContentView.editable)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -10,9 +10,32 @@ module Katello
10
10
  end
11
11
 
12
12
  module ClassMethods
13
+ def with_content_view_scope(scope)
14
+ joins(:content_view).merge(Katello::ContentView.send(scope))
15
+ end
16
+
13
17
  def readable
14
- view_ids = ::Katello::ContentView.readable.collect { |v| v.id }
15
- joins(:content_view).where("#{Katello::ContentView.table_name}.id" => view_ids)
18
+ with_content_view_scope(:readable)
19
+ end
20
+
21
+ def exportable
22
+ with_content_view_scope(:exportable)
23
+ end
24
+
25
+ def editable
26
+ with_content_view_scope(:editable)
27
+ end
28
+
29
+ def publishable
30
+ with_content_view_scope(:publishable)
31
+ end
32
+
33
+ def deletable
34
+ with_content_view_scope(:deletable)
35
+ end
36
+
37
+ def promotable_or_removable
38
+ with_content_view_scope(:promotable_or_removable)
16
39
  end
17
40
  end
18
41
  end
@@ -4,7 +4,7 @@ module Katello
4
4
 
5
5
  module ClassMethods
6
6
  def readable
7
- where(:content_view_version_id => Katello::ContentViewVersion.readable)
7
+ joins(:content_view_version).merge(Katello::ContentViewVersion.readable)
8
8
  end
9
9
  end
10
10
  end
@@ -12,6 +12,14 @@ module Katello
12
12
  authorized?(:import_manifest)
13
13
  end
14
14
 
15
+ def can_import_library_content?
16
+ authorized?(:import_library_content)
17
+ end
18
+
19
+ def can_export_library_content?
20
+ authorized?(:export_library_content)
21
+ end
22
+
15
23
  def readable_promotion_paths
16
24
  permissible_promotion_paths(KTEnvironment.readable)
17
25
  end
@@ -114,7 +114,7 @@ module Katello
114
114
  end
115
115
 
116
116
  def suse?
117
- content.content_type == Repository::YUM_TYPE && !!path.downcase.match(/suse/) # rubocop:disable Style/DoubleNegation
117
+ content.content_type == Repository::YUM_TYPE && !!path.downcase.match(/suse/)
118
118
  end
119
119
 
120
120
  def file?
@@ -17,6 +17,8 @@ module Katello
17
17
  TemplateKind.all.each do |kind|
18
18
  if name == ::Operatingsystem::REDHAT_ATOMIC_HOST_OS && kind.name == "provision"
19
19
  provisioning_template_name = Setting["katello_default_atomic_provision"]
20
+ elsif kind.name == 'registration'
21
+ provisioning_template_name = 'Linux registration default'
20
22
  else
21
23
  provisioning_template_name = Setting["katello_default_#{kind.name}"]
22
24
  end
@@ -9,8 +9,8 @@ module Katello
9
9
 
10
10
  include ForemanTasks::Concerns::ActionSubject
11
11
  prepend ForemanTasks::Concerns::ActionTriggering
12
- include Glue::Candlepin::Owner if SETTINGS[:katello][:use_cp]
13
- include Glue if SETTINGS[:katello][:use_cp]
12
+ include Glue::Candlepin::Owner
13
+ include Glue
14
14
 
15
15
  include Katello::Authorization::Organization
16
16
  include Ext::LabelFromName
@@ -91,6 +91,13 @@ module Katello
91
91
  service_class.pulp_units_batch_all(pulp_ids).each do |units|
92
92
  units.each do |unit|
93
93
  unit = unit.with_indifferent_access
94
+ if content_type == 'rpm' && repository
95
+ rpms_to_disassociate = ::Katello::Rpm.where(name: unit[:name], version: unit[:version], release: unit[:release],
96
+ epoch: unit[:epoch], arch: unit[:arch]).select(:id)
97
+ if rpms_to_disassociate.any?
98
+ ::Katello::RepositoryRpm.where(rpm_id: rpms_to_disassociate, repository_id: repository.id).destroy_all
99
+ end
100
+ end
94
101
  model = Katello::Util::Support.active_record_retry do
95
102
  self.where(:pulp_id => unit[service_class.unit_identifier]).first_or_create
96
103
  end
@@ -44,8 +44,8 @@ module Katello
44
44
 
45
45
  def kickstart_repos(host)
46
46
  distros = distribution_repositories(host).where(distribution_bootable: true)
47
- if distros && host.content_source
48
- distros.map { |distro| distro.to_hash(host.content_source) }
47
+ if distros && host&.content_facet&.content_source
48
+ distros.map { |distro| distro.to_hash(host.content_facet.content_source) }
49
49
  else
50
50
  []
51
51
  end
@@ -49,6 +49,8 @@ module Katello
49
49
  has_many :content_facets, :class_name => "::Katello::Host::ContentFacet", :foreign_key => :content_source_id,
50
50
  :inverse_of => :content_source, :dependent => :nullify
51
51
 
52
+ has_many :smart_proxy_sync_histories, :class_name => "::Katello::SmartProxySyncHistory", :inverse_of => :smart_proxy, dependent: :delete_all
53
+
52
54
  has_many :hostgroup_content_facets, :class_name => "::Katello::Hostgroup::ContentFacet", :foreign_key => :content_source_id,
53
55
  :inverse_of => :content_source, :dependent => :nullify
54
56
  has_many :hostgroups, :class_name => "::Hostgroup", :through => :hostgroup_content_facets
@@ -95,19 +97,23 @@ module Katello
95
97
  end
96
98
 
97
99
  def self.sync_needed?(environment)
98
- unscoped.with_environment(environment).any?
100
+ Setting[:foreman_proxy_content_auto_sync] && unscoped.with_environment(environment).any?
99
101
  end
100
102
  end
101
103
 
104
+ def update_unauthenticated_repo_list(repo_names)
105
+ ProxyAPI::ContainerGateway.new(url: self.url).unauthenticated_repository_list("repositories": repo_names)
106
+ end
107
+
102
108
  def puppet_path
103
109
  self[:puppet_path] || update_puppet_path
104
110
  end
105
111
 
106
112
  def update_puppet_path
107
113
  if has_feature?(PULP_FEATURE)
108
- path = ProxyAPI::Pulp.new(:url => self.url).capsule_puppet_path['puppet_content_dir']
114
+ path = ::ProxyAPI::Pulp.new(:url => self.url).capsule_puppet_path['puppet_content_dir']
109
115
  elsif has_feature?(PULP_NODE_FEATURE)
110
- path = ProxyAPI::PulpNode.new(:url => self.url).capsule_puppet_path['puppet_content_dir']
116
+ path = ::ProxyAPI::PulpNode.new(:url => self.url).capsule_puppet_path['puppet_content_dir']
111
117
  end
112
118
  self.update_attribute(:puppet_path, path || '') if persisted?
113
119
  path
@@ -128,7 +134,7 @@ module Katello
128
134
  config.host = uri.host
129
135
  config.scheme = uri.scheme
130
136
  pulp3_ssl_configuration(config)
131
- config.debugging = true
137
+ config.debugging = false
132
138
  config.logger = ::Foreman::Logging.logger('katello/pulp_rest')
133
139
  config.username = self.setting(PULP3_FEATURE, 'username')
134
140
  config.password = self.setting(PULP3_FEATURE, 'password')
@@ -177,7 +183,9 @@ module Katello
177
183
  end
178
184
 
179
185
  def fix_pulp3_capabilities(type)
180
- if missing_pulp3_capabilities? && !pulp2_preferred_for_type?(type)
186
+ repository_type_obj = type.is_a?(String) || type.is_a?(Symbol) ? Katello::RepositoryTypeManager.repository_types[type] : type
187
+
188
+ if missing_pulp3_capabilities? && repository_type_obj.pulp3_plugin && !pulp2_preferred_for_type?(repository_type_obj.id)
181
189
  self.refresh
182
190
  if self.capabilities(::SmartProxy::PULP3_FEATURE).empty?
183
191
  fail Katello::Errors::PulpcoreMissingCapabilities
@@ -344,6 +352,26 @@ module Katello
344
352
  end
345
353
  end
346
354
 
355
+ def repos_in_env_cv(environment = nil, content_view = nil)
356
+ repos = Katello::Repository
357
+ repos = repos.in_environment(environment) if environment
358
+ repos = repos.in_content_views([content_view]) if content_view
359
+ repos
360
+ end
361
+
362
+ def repos_in_sync_history
363
+ smart_proxy_sync_histories.map { |sync_history| sync_history.repository }
364
+ end
365
+
366
+ def current_repositories_data(environment = nil, content_view = nil)
367
+ return repos_in_sync_history unless (environment || content_view)
368
+ repos_in_sync_history & repos_in_env_cv(environment, content_view)
369
+ end
370
+
371
+ def repos_pending_sync(environment = nil, content_view = nil)
372
+ repos_in_env_cv(environment, content_view) - repos_in_sync_history
373
+ end
374
+
347
375
  def smart_proxy_service
348
376
  @smart_proxy_service ||= Pulp::SmartProxyRepository.new(self)
349
377
  end
@@ -0,0 +1,4 @@
1
+ module Katello
2
+ class ContentMigrationProgress < Katello::Model
3
+ end
4
+ end
@@ -8,6 +8,7 @@ module Katello
8
8
  include ForemanTasks::Concerns::ActionSubject
9
9
 
10
10
  CONTENT_DIR = "content_views".freeze
11
+ IMPORT_LIBRARY = "Import-Library".freeze
11
12
 
12
13
  belongs_to :organization, :inverse_of => :content_views, :class_name => "::Organization"
13
14
 
@@ -67,6 +68,14 @@ module Katello
67
68
  validates :composite,
68
69
  inclusion: { in: [false], message: "Composite Content Views can not solve dependencies"},
69
70
  if: :solve_dependencies
71
+ validates :import_only, :inclusion => [true, false]
72
+ validates :import_only,
73
+ inclusion: { in: [false], message: "Import-only Content Views can not be Composite"},
74
+ if: :composite
75
+ validates :import_only,
76
+ inclusion: { in: [false], message: "Import-only Content Views can not solve dependencies"},
77
+ if: :solve_dependencies
78
+ validate :import_only_immutable
70
79
 
71
80
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
72
81
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
@@ -94,6 +103,10 @@ module Katello
94
103
  name
95
104
  end
96
105
 
106
+ def library_import?
107
+ name == IMPORT_LIBRARY
108
+ end
109
+
97
110
  def content_host_count
98
111
  hosts.count
99
112
  end
@@ -228,6 +241,10 @@ module Katello
228
241
  environments.include?(env)
229
242
  end
230
243
 
244
+ apipie :method, 'Returns the Katello::ContentViewVersion for a given Lifecycle Environment' do
245
+ required :env, 'Katello::KTEnvironment', desc: 'a __Katello::KTEnvironment__ object for which we load the __Katello::ContentViewVersion__ object'
246
+ returns 'Katello::ContentViewVersion'
247
+ end
231
248
  def version(env)
232
249
  self.versions.in_environment(env).order("#{Katello::ContentViewVersion.table_name}.id ASC").readonly(false).last
233
250
  end
@@ -580,16 +597,23 @@ module Katello
580
597
  end
581
598
 
582
599
  def check_ready_to_import!
583
- fail _("User must be logged in.") if ::User.current.nil?
584
600
  fail _("Cannot import a composite content view") if composite?
601
+ fail _("This Content View must be set to Import-only before performing an import") unless import_only?
585
602
  true
586
603
  end
587
604
 
588
- def check_ready_to_publish!
605
+ def check_ready_to_publish!(importing: false)
589
606
  fail _("User must be logged in.") if ::User.current.nil?
590
607
  fail _("Cannot publish default content view") if default?
591
- check_composite_action_allowed!(organization.library)
592
- check_docker_repository_names!([organization.library])
608
+
609
+ if importing
610
+ check_ready_to_import!
611
+ else
612
+ fail _("Import-only content views can not be published directly") if import_only?
613
+ check_composite_action_allowed!(organization.library)
614
+ check_docker_repository_names!([organization.library])
615
+ end
616
+
593
617
  true
594
618
  end
595
619
 
@@ -698,6 +722,12 @@ module Katello
698
722
 
699
723
  private
700
724
 
725
+ def import_only_immutable
726
+ if import_only_changed? && self.persisted?
727
+ errors.add(:import_only, _("Import-only can not be changed after creation"))
728
+ end
729
+ end
730
+
701
731
  def generate_cp_environment_label(env)
702
732
  # The label for a default view, will simply be the env label; otherwise, it
703
733
  # will be a combination of env and view label. The reason being, the label
@@ -734,7 +764,7 @@ module Katello
734
764
  prop_group :katello_basic_props, Katello::Model, meta: { friendly_name: 'Content View' }
735
765
  end
736
766
  class Jail < ::Safemode::Jail
737
- allow :name, :label
767
+ allow :name, :label, :version
738
768
  end
739
769
  end
740
770
  end