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
data/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "@sheerun/mutationobserver-shim": "^0.3.3",
27
27
  "@testing-library/jest-dom": "^5.3.0",
28
28
  "@testing-library/react": "^10.0.2",
29
- "@theforeman/builder": "^4.6.0",
29
+ "@theforeman/builder": ">= 6.0.0",
30
30
  "@theforeman/find-foreman": "^4.8.0",
31
31
  "axios-mock-adapter": "^1.10.0",
32
32
  "babel-eslint": "^10.0.3",
@@ -1,3 +1,2 @@
1
1
  // eslint-disable-next-line import/prefer-default-export
2
2
  export const useForemanSettings = () => ({ perPage: 20 });
3
- export const usePaginationOptions = () => [5, 10, 20, 50];
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export const usePaginationOptions = () => [5, 10, 20, 50];
@@ -0,0 +1,5 @@
1
+ // This component uses the intl context from Foreman, we need to figure out how to mock that
2
+ // context before using this component directly from Foreman in testing
3
+
4
+ export default () => 'A Mocked Date';
5
+
@@ -1,12 +1,19 @@
1
1
  import React, { useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { Select, SelectOption, SelectVariant, Level, LevelItem } from '@patternfly/react-core';
3
+ import { Spinner, Select, SelectOption, SelectVariant, Level, LevelItem } from '@patternfly/react-core';
4
+ import { ErrorCircleOIcon } from '@patternfly/react-icons';
5
+
4
6
 
5
7
  const SelectableDropdown = ({
6
- items, title, selected, setSelected,
8
+ items, title, selected, setSelected, loading, error,
7
9
  }) => {
8
10
  const [isOpen, setIsOpen] = useState(false);
9
- const onSelect = (event, selection) => {
11
+ const icon = () => {
12
+ if (error) return <span aria-label={`${title} error`}><ErrorCircleOIcon color="red" /></span>;
13
+ if (loading) return <span aria-label={`${title} spinner`}><Spinner size="sm" /></span>;
14
+ return null;
15
+ };
16
+ const onSelect = (_event, selection) => {
10
17
  setSelected(selection);
11
18
  setIsOpen(false);
12
19
  };
@@ -30,6 +37,8 @@ const SelectableDropdown = ({
30
37
  onSelect={onSelect}
31
38
  selections={selected}
32
39
  isOpen={isOpen}
40
+ isDisabled={loading || error}
41
+ toggleIcon={icon()}
33
42
  >
34
43
  {selectItems}
35
44
  </Select>
@@ -43,6 +52,14 @@ SelectableDropdown.propTypes = {
43
52
  title: PropTypes.string.isRequired,
44
53
  selected: PropTypes.string.isRequired,
45
54
  setSelected: PropTypes.func.isRequired,
55
+ // If the items are loaded dynamically, you can pass in loading or error states
56
+ loading: PropTypes.bool,
57
+ error: PropTypes.bool,
58
+ };
59
+
60
+ SelectableDropdown.defaultProps = {
61
+ loading: false,
62
+ error: false,
46
63
  };
47
64
 
48
65
 
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { render } from 'react-testing-lib-wrapper';
3
+
4
+ import SelectableDropdown from '../SelectableDropdown';
5
+
6
+ const type = 'Breakfast';
7
+
8
+ test('Can dynamically load options', async () => {
9
+ const { rerender, queryByText, queryByLabelText } = render(<SelectableDropdown
10
+ items={[]}
11
+ title={type}
12
+ selected=""
13
+ setSelected={jest.fn}
14
+ placeholderText={type}
15
+ loading
16
+ error={false}
17
+ />);
18
+ expect(queryByLabelText(`${type} spinner`)).toBeInTheDocument();
19
+
20
+ rerender(<SelectableDropdown
21
+ items={['donut', 'croissant', 'bear claw']}
22
+ title={type}
23
+ selected=""
24
+ setSelected={jest.fn}
25
+ placeholderText={type}
26
+ loading={false}
27
+ error={false}
28
+ />);
29
+ expect(queryByLabelText(`${type} spinner`)).not.toBeInTheDocument();
30
+ expect(queryByText('donut')).toBeInTheDocument();
31
+ });
32
+
33
+
34
+ test('Can handle error', async () => {
35
+ const { queryByLabelText } = render(<SelectableDropdown
36
+ items={[]}
37
+ title={type}
38
+ selected=""
39
+ setSelected={jest.fn}
40
+ placeholderText={type}
41
+ loading={false}
42
+ error
43
+ />);
44
+ expect(queryByLabelText(`${type} error`)).toBeInTheDocument();
45
+ });
@@ -0,0 +1,3 @@
1
+ import SelectableDropdown from './SelectableDropdown';
2
+
3
+ export default SelectableDropdown;
@@ -3,7 +3,8 @@ import { Pagination, Flex, FlexItem } from '@patternfly/react-core';
3
3
 
4
4
  import PropTypes from 'prop-types';
5
5
  import { useDispatch } from 'react-redux';
6
- import { usePaginationOptions, useForemanSettings } from 'foremanReact/Root/Context/ForemanContext';
6
+ import { useForemanSettings } from 'foremanReact/Root/Context/ForemanContext';
7
+ import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
7
8
 
8
9
  import MainTable from './MainTable';
9
10
  import Search from '../../components/Search';
@@ -0,0 +1,14 @@
1
+ // Can be included as a TableWrapper prop for selectable rows
2
+ const onSelect = (rows, setRows) => (_event, isSelected, rowId) => {
3
+ let newRows;
4
+ if (rowId === -1) {
5
+ newRows = rows.map(row => ({ ...row, selected: isSelected }));
6
+ } else {
7
+ newRows = [...rows];
8
+ newRows[rowId].selected = isSelected;
9
+ }
10
+
11
+ setRows(newRows);
12
+ };
13
+
14
+ export default onSelect;
@@ -1,6 +1,7 @@
1
1
  import React, { Component } from 'react';
2
2
  import Downshift from 'downshift';
3
3
  import PropTypes from 'prop-types';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
4
5
 
5
6
  import TypeAheadSearch from './pf3Search/TypeAheadSearch';
6
7
  // eslint-disable-next-line import/no-named-default
@@ -101,7 +102,7 @@ TypeAhead.propTypes = {
101
102
  };
102
103
 
103
104
  TypeAhead.defaultProps = {
104
- actionText: 'Search',
105
+ actionText: __('Search'),
105
106
  initialInputValue: '',
106
107
  patternfly4: false,
107
108
  };
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { InputGroup, Button, Icon } from 'patternfly-react';
3
3
  import PropTypes from 'prop-types';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
4
5
 
5
6
  import TypeAheadInput from './TypeAheadInput';
6
7
  import TypeAheadItems from './TypeAheadItems';
@@ -46,7 +47,7 @@ TypeAheadSearch.propTypes = {
46
47
  };
47
48
 
48
49
  TypeAheadSearch.defaultProps = {
49
- actionText: 'Search',
50
+ actionText: __('Search'),
50
51
  };
51
52
 
52
53
  export default TypeAheadSearch;
@@ -7,7 +7,6 @@ import keyPressHandler from '../helpers/helpers';
7
7
  import TypeAheadInput from './TypeAheadInput';
8
8
  import TypeAheadItems from './TypeAheadItems';
9
9
  import commonSearchPropTypes from '../helpers/commonPropTypes';
10
- import './TypeAheadSearch.scss';
11
10
 
12
11
  const TypeAheadSearch = ({
13
12
  userInputValue, clearSearch, getInputProps, getItemProps, isOpen, inputValue, highlightedIndex,
@@ -54,3 +54,9 @@ td, th {
54
54
  }
55
55
  }
56
56
  }
57
+
58
+ // Override browser default outline ring on focus
59
+ *:focus {
60
+ outline: none;
61
+ }
62
+
data/webpack/index.js CHANGED
@@ -5,6 +5,7 @@
5
5
 
6
6
  import componentRegistry from 'foremanReact/components/componentRegistry';
7
7
  import Application from './containers/Application/index';
8
+ import Content from './scenes/SmartProxy/Content';
8
9
  import './redux';
9
10
  // Not currently mocking anything
10
11
  // import './services/api/setupMocks';
@@ -13,3 +14,8 @@ componentRegistry.register({
13
14
  name: 'katello',
14
15
  type: Application,
15
16
  });
17
+
18
+ componentRegistry.register({
19
+ name: 'Content',
20
+ type: Content,
21
+ });
@@ -25,16 +25,16 @@ const recommendedRepositoriesRHEL = [
25
25
  ];
26
26
 
27
27
  const recommendedRepositoriesSatTools = [
28
- 'satellite-tools-6.8-for-rhel-8-x86_64-rpms',
29
- 'rhel-7-server-satellite-tools-6.8-rpms',
30
- 'rhel-6-server-satellite-tools-6.8-rpms',
31
- 'rhel-5-server-els-satellite-tools-6.8-rpms',
28
+ 'satellite-tools-6.9-for-rhel-8-x86_64-rpms',
29
+ 'rhel-7-server-satellite-tools-6.9-rpms',
30
+ 'rhel-6-server-satellite-tools-6.9-rpms',
31
+ 'rhel-5-server-els-satellite-tools-6.9-rpms',
32
32
  'rhel-7-server-satellite-maintenance-6-rpms',
33
33
  ];
34
34
 
35
35
  const recommendedRepositoriesMisc = [
36
36
  'rhel-server-rhscl-7-rpms',
37
- 'rhel-7-server-satellite-capsule-6.8-rpms',
37
+ 'rhel-7-server-satellite-capsule-6.9-rpms',
38
38
  'rhel-7-server-ansible-2.9-rpms',
39
39
  ];
40
40
 
@@ -1,6 +1,8 @@
1
- import { API_OPERATIONS, get } from 'foremanReact/redux/API';
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { API_OPERATIONS, get, post } from 'foremanReact/redux/API';
2
3
  import api, { orgId } from '../../services/api';
3
- import CONTENT_VIEWS_KEY from './ContentViewsConstants';
4
+ import CONTENT_VIEWS_KEY, { CREATE_CONTENT_VIEW_KEY, COPY_CONTENT_VIEW_KEY } from './ContentViewsConstants';
5
+ import { getResponseErrorMsgs } from '../../utils/helpers';
4
6
 
5
7
  export const createContentViewsParams = extraParams => ({
6
8
  organization_id: orgId(),
@@ -15,4 +17,31 @@ const getContentViews = extraParams => get({
15
17
  params: createContentViewsParams(extraParams),
16
18
  });
17
19
 
20
+ const cvSuccessToast = (response) => {
21
+ const { data: { name } } = response;
22
+ return __(`Content view ${name} created`);
23
+ };
24
+
25
+ const cvErrorToast = (error) => {
26
+ const message = getResponseErrorMsgs(error.response);
27
+ return message;
28
+ };
29
+
30
+ export const createContentView = params => post({
31
+ type: API_OPERATIONS.POST,
32
+ key: CREATE_CONTENT_VIEW_KEY,
33
+ url: api.getApiUrl('/content_views'),
34
+ params,
35
+ successToast: response => cvSuccessToast(response),
36
+ errorToast: error => cvErrorToast(error),
37
+ });
38
+
39
+ export const copyContentView = params => post({
40
+ type: API_OPERATIONS.POST,
41
+ key: COPY_CONTENT_VIEW_KEY,
42
+ url: api.getApiUrl(`/content_views/${params.id}/copy`),
43
+ params,
44
+ successToast: response => cvSuccessToast(response),
45
+ errorToast: error => cvErrorToast(error),
46
+ });
18
47
  export default getContentViews;
@@ -1,14 +1,18 @@
1
1
  const CONTENT_VIEWS_KEY = 'CONTENT_VIEWS';
2
+ export const CREATE_CONTENT_VIEW_KEY = 'CONTENT_VIEW_CREATE';
3
+ export const COPY_CONTENT_VIEW_KEY = 'CONTENT_VIEW_COPY';
2
4
  export const UPDATE_CONTENT_VIEW = 'UPDATE_CONTENT_VIEW';
3
5
  export const UPDATE_CONTENT_VIEW_SUCCESS = 'UPDATE_CONTENT_VIEW_SUCCESS';
4
6
  export const UPDATE_CONTENT_VIEW_FAILURE = 'UPDATE_CONTENT_VIEW_FAILURE';
5
-
6
7
  export const cvDetailsKey = cvId => `${CONTENT_VIEWS_KEY}_${cvId}`;
7
8
  export const cvDetailsRepoKey = cvId => `${CONTENT_VIEWS_KEY}_REPOSITORIES_${cvId}`;
9
+ export const cvDetailsFilterKey = cvId => `${CONTENT_VIEWS_KEY}_FILTERS_${cvId}`;
8
10
 
9
11
  // Repo added to content view status display and key
10
12
  export const ADDED = 'Added';
11
13
  export const NOT_ADDED = 'Not added';
12
14
  export const ALL_STATUSES = 'All';
13
15
 
16
+ export const REPOSITORY_TYPES = 'REPOSITORY_TYPES';
17
+
14
18
  export default CONTENT_VIEWS_KEY;
@@ -0,0 +1,16 @@
1
+ import {
2
+ selectAPIStatus,
3
+ selectAPIError,
4
+ selectAPIResponse,
5
+ } from 'foremanReact/redux/API/APISelectors';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { COPY_CONTENT_VIEW_KEY } from '../ContentViewsConstants';
8
+
9
+ export const selectCopyContentViews = state =>
10
+ selectAPIResponse(state, COPY_CONTENT_VIEW_KEY) || {};
11
+
12
+ export const selectCopyContentViewStatus = state =>
13
+ selectAPIStatus(state, COPY_CONTENT_VIEW_KEY) || STATUS.PENDING;
14
+
15
+ export const selectCopyContentViewError = state =>
16
+ selectAPIError(state, COPY_CONTENT_VIEW_KEY);
@@ -0,0 +1,77 @@
1
+ import { STATUS } from 'foremanReact/constants';
2
+ import React, { useState, useEffect } from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import { useDispatch, useSelector } from 'react-redux';
5
+ import { Redirect } from 'react-router-dom';
6
+ import { Form, FormGroup, TextInput, ActionGroup, Button } from '@patternfly/react-core';
7
+ import {
8
+ selectCopyContentViewError, selectCopyContentViews,
9
+ selectCopyContentViewStatus,
10
+ } from './ContentViewCopySelectors';
11
+ import { copyContentView } from '../ContentViewsActions';
12
+
13
+ const CopyContentViewForm = ({ cvId, setModalOpen }) => {
14
+ const dispatch = useDispatch();
15
+ const [name, setName] = useState('');
16
+ const [redirect, setRedirect] = useState(false);
17
+ const [saving, setSaving] = useState(false);
18
+ const response = useSelector(selectCopyContentViews);
19
+ const status = useSelector(selectCopyContentViewStatus);
20
+ const error = useSelector(selectCopyContentViewError);
21
+
22
+ useEffect(() => {
23
+ const { id } = response;
24
+ if (id && status === STATUS.RESOLVED) {
25
+ setSaving(false);
26
+ setRedirect(true);
27
+ } else if (status === STATUS.ERROR) {
28
+ setSaving(false);
29
+ }
30
+ }, [JSON.stringify(response), status, error]);
31
+
32
+ const onSubmit = () => {
33
+ setSaving(true);
34
+ dispatch(copyContentView({
35
+ id: cvId,
36
+ name,
37
+ }));
38
+ };
39
+
40
+ if (redirect) {
41
+ const { id } = response;
42
+ return (<Redirect to={`/labs/content_views/${id}`} />);
43
+ }
44
+
45
+ return (
46
+ <Form>
47
+ <FormGroup label="Name" isRequired fieldId="name">
48
+ <TextInput
49
+ isRequired
50
+ type="text"
51
+ id="name"
52
+ aria-label="input_name"
53
+ name="name"
54
+ value={name}
55
+ onChange={value => setName(value)}
56
+ />
57
+ </FormGroup>
58
+ <ActionGroup>
59
+ <Button aria-label="copy_content_view" variant="primary" isDisabled={saving} onClick={() => onSubmit()}>Copy content view</Button>
60
+ <Button variant="link" onClick={() => setModalOpen(false)}>Cancel</Button>
61
+ </ActionGroup>
62
+ </Form>
63
+ );
64
+ };
65
+
66
+ CopyContentViewForm.propTypes = {
67
+ cvId: PropTypes.string,
68
+ setModalOpen: PropTypes.func,
69
+ };
70
+
71
+ CopyContentViewForm.defaultProps = {
72
+ cvId: null,
73
+ setModalOpen: null,
74
+ };
75
+
76
+
77
+ export default CopyContentViewForm;
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Modal, ModalVariant } from '@patternfly/react-core';
4
+ import CopyContentViewForm from './CopyContentViewForm';
5
+
6
+ const CopyContentViewModal = ({
7
+ cvId, cvName, show, setIsOpen,
8
+ }) => {
9
+ const description = (
10
+ <p>
11
+ This will create a copy of <b>{cvName}</b>, including details,
12
+ repositories, and filters. Generated data such
13
+ as history, tasks and versions will not be copied.
14
+ </p>
15
+ );
16
+ return (
17
+ <Modal
18
+ title="Copy content view"
19
+ variant={ModalVariant.small}
20
+ isOpen={show}
21
+ description={description}
22
+ onClose={() => {
23
+ setIsOpen(false);
24
+ }}
25
+ appendTo={document.body}
26
+ ><CopyContentViewForm cvId={cvId} setModalOpen={setIsOpen} />
27
+ </Modal>);
28
+ };
29
+
30
+ CopyContentViewModal.propTypes = {
31
+ cvId: PropTypes.string,
32
+ cvName: PropTypes.string,
33
+ show: PropTypes.bool,
34
+ setIsOpen: PropTypes.func,
35
+ };
36
+
37
+ CopyContentViewModal.defaultProps = {
38
+ cvId: null,
39
+ cvName: null,
40
+ show: false,
41
+ setIsOpen: null,
42
+ };
43
+
44
+ export default CopyContentViewModal;