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,4 @@
1
+ import { withRouter } from 'react-router-dom';
2
+ import CreateContentViewModal from './CreateContentViewModal';
3
+
4
+ export default withRouter(CreateContentViewModal);
@@ -8,8 +8,10 @@ import {
8
8
  UPDATE_CONTENT_VIEW_SUCCESS,
9
9
  NOT_ADDED,
10
10
  ALL_STATUSES,
11
+ REPOSITORY_TYPES,
11
12
  cvDetailsKey,
12
13
  cvDetailsRepoKey,
14
+ cvDetailsFilterKey,
13
15
  } from '../ContentViewsConstants';
14
16
  import api from '../../../services/api';
15
17
 
@@ -63,4 +65,18 @@ export const getContentViewRepositories = (cvId, params, status) => {
63
65
  });
64
66
  };
65
67
 
68
+ export const getRepositoryTypes = () => get({
69
+ type: API_OPERATIONS.GET,
70
+ key: REPOSITORY_TYPES,
71
+ errorToast: error => __(`Something went wrong while retrieving the repository types! ${error}`),
72
+ url: api.getApiUrl('/repositories/repository_types'),
73
+ });
74
+
75
+ export const getContentViewFilters = (cvId, params) => get({
76
+ key: cvDetailsFilterKey(cvId),
77
+ params: { content_view_id: cvId, ...params },
78
+ errorToast: error => __(`Something went wrong while retrieving the content view filters! ${error}`),
79
+ url: api.getApiUrl('/content_view_filters'),
80
+ });
81
+
66
82
  export default getContentViewDetails;
@@ -4,7 +4,12 @@ import {
4
4
  selectAPIResponse,
5
5
  } from 'foremanReact/redux/API/APISelectors';
6
6
  import { STATUS } from 'foremanReact/constants';
7
- import { cvDetailsKey, cvDetailsRepoKey } from '../ContentViewsConstants';
7
+ import {
8
+ cvDetailsKey,
9
+ cvDetailsRepoKey,
10
+ cvDetailsFilterKey,
11
+ REPOSITORY_TYPES,
12
+ } from '../ContentViewsConstants';
8
13
 
9
14
  export const selectCVDetails = (state, cvId) =>
10
15
  selectAPIResponse(state, cvDetailsKey(cvId)) || {};
@@ -24,5 +29,19 @@ export const selectCVReposStatus = (state, cvId) =>
24
29
  export const selectCVReposError = (state, cvId) =>
25
30
  selectAPIError(state, cvDetailsRepoKey(cvId));
26
31
 
32
+ export const selectRepoTypes = state =>
33
+ selectAPIResponse(state, REPOSITORY_TYPES) || {};
34
+
35
+ export const selectRepoTypesStatus = state =>
36
+ selectAPIStatus(state, REPOSITORY_TYPES) || STATUS.PENDING;
37
+
38
+ export const selectCVFilters = (state, cvId) =>
39
+ selectAPIResponse(state, cvDetailsFilterKey(cvId)) || {};
40
+
41
+ export const selectCVFiltersStatus = (state, cvId) =>
42
+ selectAPIStatus(state, cvDetailsFilterKey(cvId)) || STATUS.PENDING;
43
+
44
+ export const selectCVFiltersError = (state, cvId) =>
45
+ selectAPIError(state, cvDetailsFilterKey(cvId));
27
46
 
28
47
  export const selectIsCVUpdating = state => state.katello?.contentViewDetails?.updating;
@@ -1,12 +1,14 @@
1
1
  import React from 'react';
2
2
  import { useSelector, shallowEqual } from 'react-redux';
3
- import { Grid, GridItem, TextContent, Text, TextVariants } from '@patternfly/react-core';
3
+ import { Grid, GridItem, TextContent, Text, TextVariants, Button } from '@patternfly/react-core';
4
+ import { ExternalLinkAltIcon } from '@patternfly/react-icons';
4
5
  import { translate as __ } from 'foremanReact/common/I18n';
5
6
  import PropTypes from 'prop-types';
6
7
 
7
8
  import DetailsContainer from './DetailsContainer';
8
9
  import ContentViewInfo from './ContentViewInfo';
9
10
  import ContentViewRepositories from './Repositories/ContentViewRepositories';
11
+ import ContentViewFilters from './Filters/ContentViewFilters';
10
12
  import { selectCVDetails } from './ContentViewDetailSelectors';
11
13
  import TabbedView from '../../../components/TabbedView';
12
14
 
@@ -30,27 +32,35 @@ const ContentViewDetails = ({ match }) => {
30
32
  },
31
33
  {
32
34
  title: __('Filters'),
33
- content: <React.Fragment>Filters</React.Fragment>,
35
+ content: <ContentViewFilters cvId={cvId} />,
34
36
  },
35
37
  {
36
38
  title: __('History'),
37
39
  content: <React.Fragment>History</React.Fragment>,
38
40
  },
39
- {
40
- title: __('Tasks'),
41
- content: <React.Fragment>Tasks</React.Fragment>,
42
- },
43
41
  ];
44
42
 
45
43
  return (
46
44
  <Grid className="grid-with-margin">
47
45
  <DetailsContainer cvId={cvId}>
48
46
  <React.Fragment>
49
- <GridItem span={12}>
47
+ <GridItem span={8}>
50
48
  <TextContent>
51
49
  <Text component={TextVariants.h1}>{`${name} content view`}</Text>
52
50
  </TextContent>
53
51
  </GridItem>
52
+ <GridItem span={4} style={{ textAlign: 'right' }}>
53
+ <Button
54
+ component="a"
55
+ aria-label="view tasks button"
56
+ href={`/foreman_tasks/tasks?search=resource_type%3D+Katello%3A%3AContentView+resource_id%3D${cvId}`}
57
+ target="_blank"
58
+ variant="secondary"
59
+ >
60
+ {'View tasks '}
61
+ <ExternalLinkAltIcon />
62
+ </Button>
63
+ </GridItem>
54
64
  <GridItem span={12}>
55
65
  <TabbedView tabs={tabs} />
56
66
  </GridItem>
@@ -8,6 +8,7 @@ import {
8
8
  TextListVariants,
9
9
  TextListItem,
10
10
  TextListItemVariants,
11
+ Switch,
11
12
  } from '@patternfly/react-core';
12
13
  import PropTypes from 'prop-types';
13
14
  import { translate as __ } from 'foremanReact/common/I18n';
@@ -18,6 +19,8 @@ import Loading from '../../../components/Loading';
18
19
  import ContentViewIcon from '../components/ContentViewIcon';
19
20
  import ActionableDetail from '../../../components/ActionableDetail';
20
21
  import './contentViewInfo.scss';
22
+ import { dependenciesHelpText, autoPublishHelpText } from '../helpers';
23
+ import { LabelImportOnly } from '../Create/ContentViewFormComponents';
21
24
 
22
25
  const ContentViewInfo = ({ cvId, details }) => {
23
26
  const dispatch = useDispatch();
@@ -29,19 +32,9 @@ const ContentViewInfo = ({ cvId, details }) => {
29
32
  composite,
30
33
  solve_dependencies: solveDependencies,
31
34
  auto_publish: autoPublish,
35
+ import_only: importOnly,
32
36
  } = details;
33
37
 
34
- const autoPublishTooltip = __('Applicable only for composite views. Auto publish composite ' +
35
- 'view when a new version of a component content view is created. Also note auto publish will ' +
36
- 'only happen when the component is marked "latest".');
37
-
38
- const solveDependenciesTooltip = __('This option will solve RPM and Module Stream dependencies ' +
39
- 'on every publish of this Content View. Dependency solving significantly increases publish ' +
40
- 'time (publishes can take over three times as long) and filters will be ignored when adding ' +
41
- 'packages to solve dependencies. Also, certain scenarios involving errata may still cause ' +
42
- 'dependency errors.');
43
-
44
-
45
38
  if (updating) return <Loading size="sm" showText={false} />;
46
39
  const onEdit = (val, attribute) => dispatch(updateContentView(cvId, { [attribute]: val }));
47
40
  return (
@@ -85,7 +78,7 @@ const ContentViewInfo = ({ cvId, details }) => {
85
78
  attribute="auto_publish"
86
79
  value={autoPublish}
87
80
  onEdit={onEdit}
88
- tooltip={autoPublishTooltip}
81
+ tooltip={autoPublishHelpText}
89
82
  boolean
90
83
  />) :
91
84
  (<ActionableDetail
@@ -93,9 +86,21 @@ const ContentViewInfo = ({ cvId, details }) => {
93
86
  attribute="solve_dependencies"
94
87
  value={solveDependencies}
95
88
  onEdit={onEdit}
96
- tooltip={solveDependenciesTooltip}
89
+ tooltip={dependenciesHelpText}
97
90
  boolean
98
91
  />)}
92
+ <TextListItem component={TextListItemVariants.dt}>
93
+ {LabelImportOnly()}
94
+ </TextListItem>
95
+ <TextListItem component={TextListItemVariants.dd} className="foreman-spaced-list">
96
+ <Switch
97
+ id="import_only_switch"
98
+ aria-label="import_only_switch"
99
+ isChecked={importOnly}
100
+ className="foreman-spaced-list"
101
+ disabled
102
+ />
103
+ </TextListItem>
99
104
  </TextList>
100
105
  </TextContent>
101
106
  );
@@ -110,6 +115,7 @@ ContentViewInfo.propTypes = {
110
115
  composite: PropTypes.bool,
111
116
  solve_dependencies: PropTypes.bool,
112
117
  auto_publish: PropTypes.bool,
118
+ import_only: PropTypes.bool,
113
119
  }).isRequired,
114
120
  };
115
121
 
@@ -0,0 +1,40 @@
1
+ import React, { Fragment } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+
5
+ import RepoIcon from '../Repositories/RepoIcon';
6
+ import { capitalize } from '../../../../utils/helpers';
7
+
8
+ const typeName = (type, errataByDate) => {
9
+ if (errataByDate) return 'Errata - by date range';
10
+ const nameMap = {
11
+ rpm: __('RPM'),
12
+ docker: __('Container image tag'),
13
+ modulemd: __('Module stream'),
14
+ erratum: __('Errata'),
15
+ };
16
+
17
+ if (Object.prototype.hasOwnProperty.call(nameMap, type)) return nameMap[type];
18
+ return capitalize(type.replace('_', ' '));
19
+ };
20
+
21
+ const ContentType = ({ type, errataByDate }) => {
22
+ const repoType = ['rpm', 'modulemd', 'rpm', 'erratum', 'package_group'].includes(type) ? 'yum' : type;
23
+ return (
24
+ <Fragment>
25
+ <span style={{ marginRight: '5px' }}><RepoIcon type={repoType} /></span>
26
+ {typeName(type, errataByDate)}
27
+ </Fragment>
28
+ );
29
+ };
30
+
31
+ ContentType.propTypes = {
32
+ type: PropTypes.string.isRequired,
33
+ errataByDate: PropTypes.bool,
34
+ };
35
+
36
+ ContentType.defaultProps = {
37
+ errataByDate: false,
38
+ };
39
+
40
+ export default ContentType;
@@ -0,0 +1,124 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { shallowEqual, useSelector } from 'react-redux';
3
+ import { Label } from '@patternfly/react-core';
4
+ import { TableVariant } from '@patternfly/react-table';
5
+ import { STATUS } from 'foremanReact/constants';
6
+ import LongDateTime from 'foremanReact/components/common/dates/LongDateTime';
7
+ import { translate as __ } from 'foremanReact/common/I18n';
8
+ import PropTypes from 'prop-types';
9
+
10
+ import TableWrapper from '../../../../components/Table/TableWrapper';
11
+ import onSelect from '../../../../components/Table/helpers';
12
+ import { getContentViewFilters } from '../ContentViewDetailActions';
13
+ import {
14
+ selectCVFilters,
15
+ selectCVFiltersStatus,
16
+ selectCVFiltersError,
17
+ } from '../ContentViewDetailSelectors';
18
+ import { truncate } from '../../../../utils/helpers';
19
+ import ContentType from './ContentType';
20
+
21
+ // won't be needed when details pages are built, linking to old pages for now
22
+ const cvFilterUrl = (cvId, filterId, type, errataByDate) => {
23
+ const repoType = type === 'docker' ? 'docker' : 'yum';
24
+ const filterType = errataByDate ? 'errata_by_date' : type;
25
+ const base = `/content_views/${cvId}/repositories/${repoType}/filters/${filterId}`;
26
+ const endings = {
27
+ rpm: '/package/details',
28
+ package_group: '/package-group/list',
29
+ erratum: '/errata/list',
30
+ errata_by_date: '/errata/date_type',
31
+ modulemd: '/module-stream/list',
32
+ docker: '/docker/details',
33
+ };
34
+
35
+ return base + endings[filterType];
36
+ };
37
+
38
+ const ContentViewFilters = ({ cvId }) => {
39
+ const response = useSelector(state => selectCVFilters(state, cvId), shallowEqual);
40
+ const status = useSelector(state => selectCVFiltersStatus(state, cvId), shallowEqual);
41
+ const error = useSelector(state => selectCVFiltersError(state, cvId), shallowEqual);
42
+ const [rows, setRows] = useState([]);
43
+ const [metadata, setMetadata] = useState({});
44
+ const [searchQuery, updateSearchQuery] = useState('');
45
+ const loading = status === STATUS.PENDING;
46
+
47
+ const columnHeaders = [
48
+ __('Name'),
49
+ __('Description'),
50
+ __('Updated'),
51
+ __('Content type'),
52
+ __('Inclusion type'),
53
+ ];
54
+
55
+ const buildRows = (results) => {
56
+ const newRows = [];
57
+ results.forEach((filter) => {
58
+ let errataByDate = false;
59
+ const {
60
+ id, name, type, description, updated_at: updatedAt, inclusion,
61
+ } = filter;
62
+ if (filter.type === 'erratum' && filter.rules[0].types) errataByDate = true;
63
+
64
+ const cells = [
65
+ { title: <a href={cvFilterUrl(cvId, id, type, errataByDate)}>{name}</a> },
66
+ truncate(description || ''),
67
+ { title: <LongDateTime date={updatedAt} showRelativeTimeTooltip /> },
68
+ { title: <ContentType type={type} errataByDate={errataByDate} /> },
69
+ {
70
+ title: (
71
+ <Label color={inclusion && 'blue'}>
72
+ {inclusion ? 'Include' : 'Exclude'}
73
+ </Label>),
74
+ },
75
+ ];
76
+
77
+ newRows.push({ cells });
78
+ });
79
+ return newRows;
80
+ };
81
+
82
+ useEffect(() => {
83
+ const { results, ...meta } = response;
84
+ setMetadata(meta);
85
+
86
+ if (!loading && results) {
87
+ const newRows = buildRows(results);
88
+ setRows(newRows);
89
+ }
90
+ }, [JSON.stringify(response)]);
91
+
92
+ const emptyContentTitle = __("You currently don't have any filters for this content view.");
93
+ const emptyContentBody = __("Add filters using the 'Add filter' button above."); // needs link
94
+ const emptySearchTitle = __('No matching filters found');
95
+ const emptySearchBody = __('Try changing your search settings.');
96
+
97
+ return (
98
+ <TableWrapper
99
+ {...{
100
+ rows,
101
+ metadata,
102
+ emptyContentTitle,
103
+ emptyContentBody,
104
+ emptySearchTitle,
105
+ emptySearchBody,
106
+ searchQuery,
107
+ updateSearchQuery,
108
+ error,
109
+ status,
110
+ }}
111
+ onSelect={onSelect(rows, setRows)}
112
+ cells={columnHeaders}
113
+ variant={TableVariant.compact}
114
+ autocompleteEndpoint="/content_view_filters/auto_complete_search"
115
+ fetchItems={params => getContentViewFilters(cvId, params)}
116
+ />);
117
+ };
118
+
119
+
120
+ ContentViewFilters.propTypes = {
121
+ cvId: PropTypes.number.isRequired,
122
+ };
123
+
124
+ export default ContentViewFilters;
@@ -0,0 +1,134 @@
1
+ {
2
+ "total":6,
3
+ "subtotal":6,
4
+ "page":"1",
5
+ "per_page":"20",
6
+ "error":null,
7
+ "search":null,
8
+ "sort":{
9
+ "by":"name",
10
+ "order":"asc"
11
+ },
12
+ "results":[
13
+ {
14
+ "inclusion":true,
15
+ "id":4,
16
+ "name":"af1",
17
+ "description":"A really great filter",
18
+ "created_at":"2020-12-07 09:58:36 -0500",
19
+ "updated_at":"2020-12-07 10:42:05 -0500",
20
+ "content_view":{
21
+ },
22
+ "repositories":[
23
+
24
+ ],
25
+ "type":"rpm",
26
+ "rules":[
27
+
28
+ ]
29
+ },
30
+ {
31
+ "inclusion":false,
32
+ "id":5,
33
+ "name":"Another filter",
34
+ "description":"hey",
35
+ "created_at":"2020-12-07 12:59:12 -0500",
36
+ "updated_at":"2020-12-07 12:59:12 -0500",
37
+ "content_view":{
38
+ },
39
+ "repositories":[
40
+
41
+ ],
42
+ "type":"package_group",
43
+ "rules":[
44
+
45
+ ]
46
+ },
47
+ {
48
+ "inclusion":true,
49
+ "id":6,
50
+ "name":"f2",
51
+ "description":null,
52
+ "created_at":"2020-12-08 09:26:11 -0500",
53
+ "updated_at":"2020-12-08 09:26:11 -0500",
54
+ "content_view":{
55
+ },
56
+ "repositories":[
57
+
58
+ ],
59
+ "type":"erratum",
60
+ "rules":[
61
+ {
62
+ "content_view_filter_id":6,
63
+ "errata_id":"RHEA-2012:0059",
64
+ "date_type":"updated",
65
+ "id":3,
66
+ "created_at":"2020-12-08 10:32:25 -0500",
67
+ "updated_at":"2020-12-08 10:32:25 -0500"
68
+ }
69
+ ]
70
+ },
71
+ {
72
+ "inclusion":false,
73
+ "id":7,
74
+ "name":"f3",
75
+ "description":null,
76
+ "created_at":"2020-12-08 09:26:27 -0500",
77
+ "updated_at":"2020-12-08 09:26:27 -0500",
78
+ "content_view":{
79
+ },
80
+ "repositories":[
81
+
82
+ ],
83
+ "type":"erratum",
84
+ "rules":[
85
+ {
86
+ "content_view_filter_id":7,
87
+ "types":[
88
+ "security",
89
+ "enhancement",
90
+ "bugfix"
91
+ ],
92
+ "date_type":"updated",
93
+ "id":2,
94
+ "created_at":"2020-12-08 09:26:27 -0500",
95
+ "updated_at":"2020-12-08 09:26:27 -0500"
96
+ }
97
+ ]
98
+ },
99
+ {
100
+ "inclusion":false,
101
+ "id":8,
102
+ "name":"f4",
103
+ "description":null,
104
+ "created_at":"2020-12-08 09:26:51 -0500",
105
+ "updated_at":"2020-12-08 09:26:51 -0500",
106
+ "content_view":{
107
+ },
108
+ "repositories":[
109
+
110
+ ],
111
+ "type":"modulemd",
112
+ "rules":[
113
+
114
+ ]
115
+ },
116
+ {
117
+ "inclusion":true,
118
+ "id":9,
119
+ "name":"f5",
120
+ "description":null,
121
+ "created_at":"2020-12-08 09:32:53 -0500",
122
+ "updated_at":"2020-12-08 09:32:53 -0500",
123
+ "content_view":{
124
+ },
125
+ "repositories":[
126
+
127
+ ],
128
+ "type":"docker",
129
+ "rules":[
130
+
131
+ ]
132
+ }
133
+ ]
134
+ }