katello 3.18.0.rc2.1 → 4.0.0.rc2

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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/katello/katello.scss +0 -72
  3. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +0 -19
  4. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -3
  5. data/app/controllers/katello/api/v2/api_controller.rb +1 -2
  6. data/app/controllers/katello/api/v2/capsule_content_controller.rb +2 -2
  7. data/app/controllers/katello/api/v2/content_credentials_controller.rb +24 -24
  8. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +98 -0
  9. data/app/controllers/katello/api/v2/content_exports_controller.rb +88 -0
  10. data/app/controllers/katello/api/v2/content_imports_controller.rb +59 -0
  11. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +1 -1
  12. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +56 -94
  13. data/app/controllers/katello/api/v2/content_views_controller.rb +2 -2
  14. data/app/controllers/katello/api/v2/host_errata_controller.rb +1 -1
  15. data/app/controllers/katello/api/v2/host_packages_controller.rb +6 -6
  16. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -3
  17. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +3 -2
  18. data/app/controllers/katello/api/v2/repositories_controller.rb +5 -19
  19. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +34 -0
  20. data/app/controllers/katello/api/v2/subscriptions_controller.rb +1 -1
  21. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +8 -4
  22. data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +1 -1
  23. data/app/helpers/katello/sync_management_helper.rb +0 -2
  24. data/app/lib/actions/candlepin/environment/create.rb +1 -1
  25. data/app/lib/actions/candlepin/environment/set_content.rb +1 -1
  26. data/app/lib/actions/katello/activation_key/create.rb +9 -11
  27. data/app/lib/actions/katello/agent/dispatch_history_presenter.rb +64 -0
  28. data/app/lib/actions/katello/agent_action.rb +107 -0
  29. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +6 -2
  30. data/app/lib/actions/katello/bulk_agent_action.rb +21 -0
  31. data/app/lib/actions/katello/capsule_content/sync.rb +8 -8
  32. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +16 -2
  33. data/app/lib/actions/katello/check_matching_content.rb +17 -0
  34. data/app/lib/actions/katello/content_view/environment_create.rb +6 -8
  35. data/app/lib/actions/katello/content_view/promote_to_environment.rb +1 -1
  36. data/app/lib/actions/katello/content_view/publish.rb +2 -2
  37. data/app/lib/actions/katello/content_view_version/import.rb +2 -1
  38. data/app/lib/actions/katello/content_view_version/import_library.rb +17 -0
  39. data/app/lib/actions/katello/content_view_version/incremental_update.rb +30 -10
  40. data/app/lib/actions/katello/host/erratum/applicable_errata_install.rb +1 -1
  41. data/app/lib/actions/katello/host/erratum/install.rb +8 -26
  42. data/app/lib/actions/katello/host/hypervisors_update.rb +4 -4
  43. data/app/lib/actions/katello/host/package/install.rb +8 -21
  44. data/app/lib/actions/katello/host/package/remove.rb +8 -20
  45. data/app/lib/actions/katello/host/package/update.rb +9 -22
  46. data/app/lib/actions/katello/host/package_group/install.rb +8 -21
  47. data/app/lib/actions/katello/host/package_group/remove.rb +8 -20
  48. data/app/lib/actions/katello/host/update_system_purpose.rb +1 -1
  49. data/app/lib/actions/katello/organization/create.rb +3 -5
  50. data/app/lib/actions/katello/organization/destroy.rb +1 -1
  51. data/app/lib/actions/katello/organization/manifest_delete.rb +3 -5
  52. data/app/lib/actions/katello/organization/manifest_import.rb +1 -1
  53. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  54. data/app/lib/actions/katello/repository/check_matching_content.rb +3 -1
  55. data/app/lib/actions/katello/repository/clone_contents.rb +8 -11
  56. data/app/lib/actions/katello/repository/create.rb +0 -8
  57. data/app/lib/actions/katello/repository/filtered_index_content.rb +3 -0
  58. data/app/lib/actions/katello/repository/index_content.rb +1 -0
  59. data/app/lib/actions/katello/repository/multi_clone_contents.rb +9 -12
  60. data/app/lib/actions/katello/repository/update.rb +0 -8
  61. data/app/lib/actions/middleware/execute_if_contents_changed.rb +4 -1
  62. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +24 -4
  63. data/app/lib/actions/pulp/consumer.rb +0 -11
  64. data/app/lib/actions/pulp/orchestration/repository/refresh_repos.rb +0 -6
  65. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +3 -3
  66. data/app/lib/actions/pulp3/content_migration.rb +10 -0
  67. data/app/lib/actions/pulp3/content_migration_presenter.rb +59 -0
  68. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +1 -1
  69. data/app/lib/actions/pulp3/content_view_version/export.rb +3 -2
  70. data/app/lib/actions/pulp3/import_migration.rb +6 -1
  71. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +2 -1
  72. data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +17 -13
  73. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +60 -0
  74. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +0 -4
  75. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +16 -3
  76. data/app/lib/actions/pulp3/orchestration/repository/refresh_repos.rb +1 -6
  77. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  78. data/app/lib/actions/pulp3/repository/delete.rb +1 -1
  79. data/app/lib/actions/pulp3/repository/save_version.rb +1 -1
  80. data/app/lib/actions/pulp3/repository/upload_tag.rb +18 -0
  81. data/app/lib/katello/agent/base_message.rb +38 -0
  82. data/app/lib/katello/agent/client_message_handler.rb +60 -0
  83. data/app/lib/katello/agent/connection.rb +24 -0
  84. data/app/lib/katello/agent/install_errata_message.rb +25 -0
  85. data/app/lib/katello/agent/install_package_group_message.rb +25 -0
  86. data/app/lib/katello/agent/install_package_message.rb +28 -0
  87. data/app/lib/katello/agent/remove_package_group_message.rb +25 -0
  88. data/app/lib/katello/agent/remove_package_message.rb +28 -0
  89. data/app/lib/katello/agent/update_package_message.rb +25 -0
  90. data/app/lib/katello/concerns/base_template_scope_extensions.rb +8 -0
  91. data/app/lib/katello/event_daemon/monitor.rb +53 -0
  92. data/app/lib/katello/event_daemon/runner.rb +99 -0
  93. data/app/lib/katello/event_daemon/services/agent_event_receiver.rb +62 -0
  94. data/app/lib/katello/logging.rb +32 -0
  95. data/app/lib/katello/messaging/connection.rb +1 -7
  96. data/app/lib/katello/messaging/received_message.rb +1 -1
  97. data/app/lib/katello/qpid/connection.rb +130 -0
  98. data/app/lib/katello/validators/content_view_puppet_module_validator.rb +1 -1
  99. data/app/models/katello/activation_key.rb +2 -2
  100. data/app/models/katello/agent/dispatch_history.rb +17 -0
  101. data/app/models/katello/authorization/content_view_version.rb +25 -2
  102. data/app/models/katello/authorization/content_view_version_export_history.rb +1 -1
  103. data/app/models/katello/authorization/organization.rb +8 -0
  104. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  105. data/app/models/katello/concerns/host_managed_extensions.rb +3 -0
  106. data/app/models/katello/concerns/operatingsystem_extensions.rb +2 -0
  107. data/app/models/katello/concerns/organization_extensions.rb +2 -2
  108. data/app/models/katello/concerns/pulp_database_unit.rb +7 -0
  109. data/app/models/katello/concerns/redhat_extensions.rb +2 -2
  110. data/app/models/katello/concerns/smart_proxy_extensions.rb +31 -5
  111. data/app/models/katello/content_migration_progress.rb +4 -0
  112. data/app/models/katello/content_view.rb +10 -1
  113. data/app/models/katello/content_view_environment.rb +2 -2
  114. data/app/models/katello/content_view_history.rb +2 -1
  115. data/app/models/katello/content_view_package_filter.rb +1 -1
  116. data/app/models/katello/content_view_puppet_environment.rb +2 -2
  117. data/app/models/katello/content_view_version.rb +2 -1
  118. data/app/models/katello/content_view_version_export_history.rb +26 -1
  119. data/app/models/katello/erratum.rb +3 -1
  120. data/app/models/katello/events/delete_host_agent_queue.rb +19 -0
  121. data/app/models/katello/glue/candlepin/pool.rb +2 -0
  122. data/app/models/katello/glue/pulp/repo.rb +0 -6
  123. data/app/models/katello/glue/pulp/repos.rb +1 -22
  124. data/app/models/katello/host/subscription_facet.rb +4 -0
  125. data/app/models/katello/ping.rb +12 -4
  126. data/app/models/katello/pool.rb +5 -0
  127. data/app/models/katello/product.rb +3 -3
  128. data/app/models/katello/repository.rb +10 -3
  129. data/app/models/katello/subscription_status.rb +3 -2
  130. data/app/models/setting/content.rb +0 -2
  131. data/app/presenters/katello/host_subscription_presenter.rb +3 -4
  132. data/app/presenters/katello/host_subscriptions_presenter.rb +24 -0
  133. data/app/services/katello/agent/dispatcher.rb +66 -0
  134. data/app/services/katello/applicability/applicable_content_helper.rb +44 -15
  135. data/app/services/katello/candlepin_event_listener.rb +12 -19
  136. data/app/services/katello/event_monitor/poller_thread.rb +3 -11
  137. data/app/services/katello/pulp/smart_proxy_repository.rb +0 -15
  138. data/app/services/katello/pulp3/api/docker.rb +4 -0
  139. data/app/services/katello/pulp3/content_view_version/export.rb +63 -5
  140. data/app/services/katello/pulp3/content_view_version/import.rb +40 -0
  141. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +0 -16
  142. data/app/services/katello/pulp3/content_view_version/import_validator.rb +26 -49
  143. data/app/services/katello/pulp3/docker_manifest.rb +1 -0
  144. data/app/services/katello/pulp3/docker_tag.rb +1 -0
  145. data/app/services/katello/pulp3/migration.rb +44 -9
  146. data/app/services/katello/pulp3/repository.rb +13 -4
  147. data/app/services/katello/pulp3/repository/docker.rb +5 -0
  148. data/app/services/katello/pulp3/repository/yum.rb +15 -9
  149. data/app/services/katello/pulp3/task.rb +4 -0
  150. data/app/services/katello/pulp3/task_group.rb +4 -0
  151. data/app/services/katello/registration_manager.rb +10 -0
  152. data/app/services/katello/repository_type.rb +1 -1
  153. data/app/views/foreman/smart_proxies/_content_tab.html.erb +4 -47
  154. data/app/views/foreman/smart_proxies/show.html.erb +1 -1
  155. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +22 -25
  156. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +1 -0
  157. data/app/views/katello/api/v2/content_views/show.json.rabl +6 -0
  158. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -9
  159. data/app/views/katello/layouts/react.html.erb +3 -2
  160. data/app/views/katello/sync_management/_products.html.erb +1 -1
  161. data/app/views/overrides/activation_keys/_host_tab_pane.html.erb +1 -5
  162. data/app/views/overrides/organizations/_edit_override.html.erb +1 -4
  163. data/app/views/overrides/smart_proxies/_environment_tab.html.erb +1 -1
  164. data/app/views/overrides/smart_proxies/_environment_tab_pane.html.erb +1 -1
  165. data/config/katello.yaml.example +0 -3
  166. data/config/routes/api/v2.rb +31 -13
  167. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  168. data/db/migrate/20191204214919_add_content_view_version_counts.rb +0 -1
  169. data/db/migrate/20200514092553_move_katello_fields_from_hostgroups.katello.rb +5 -2
  170. data/db/migrate/20201119211133_pulp3_migration_progress.rb +9 -0
  171. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +56 -0
  172. data/db/migrate/20210122200618_create_katello_agent_dispatch_history.rb +11 -0
  173. data/db/migrate/20210125161911_delete_erratum_install_batch_size_setting.rb +5 -0
  174. data/db/migrate/20210128231228_add_type_and_from_cvv_to_cvv_export_history.rb +14 -0
  175. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +7 -0
  176. data/db/migrate/20210208213920_add_available_module_stream_context.rb +8 -0
  177. data/db/seeds.d/104-proxy.rb +1 -1
  178. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  179. data/engines/bastion/app/assets/javascripts/bastion/auth/authorization.service.js +1 -1
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +1 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/katello-agent-notice.html +1 -1
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-system-purpose-modal.html +35 -40
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-register-os-client.directive.js +17 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -2
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-client.html +12 -5
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-deb-client.html +38 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-oracle-client.html +5 -0
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-sles-client.html +28 -0
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register.html +14 -11
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-activation-keys.controller.js +8 -3
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-content-hosts.controller.js +9 -3
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter-details.html +2 -2
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details.html +1 -1
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-publish.html +4 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +78 -7
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +17 -20
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +17 -24
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +1292 -1170
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +17 -20
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +858 -807
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +18 -19
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +17 -24
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +17 -18
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +986 -971
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +19 -20
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +9 -9
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +2 -2
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +1 -1
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/download-policy.service.js +0 -1
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +1 -1
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +2 -2
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscription-start-date.directive.js +21 -0
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/subscription-type.directive.js +16 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-start-date.html +2 -0
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/subscription-type.html +18 -0
  217. data/lib/katello/engine.rb +12 -6
  218. data/lib/katello/middleware/event_daemon.rb +1 -1
  219. data/lib/katello/permission_creator.rb +26 -5
  220. data/lib/katello/plugin.rb +3 -2
  221. data/lib/katello/tasks/delete_orphaned_content.rake +1 -3
  222. data/lib/katello/tasks/jenkins.rake +1 -1
  223. data/lib/katello/tasks/pulp3_content_switchover.rake +1 -1
  224. data/lib/katello/tasks/pulp3_migration.rake +18 -6
  225. data/lib/katello/tasks/pulp3_migration_abort.rake +7 -2
  226. data/lib/katello/tasks/pulp3_migration_stats.rake +28 -8
  227. data/lib/katello/tasks/pulp3_post_migration_check.rake +1 -3
  228. data/lib/katello/tasks/receptor/extract_orgs.rake +1 -1
  229. data/lib/katello/tasks/reimport.rake +1 -1
  230. data/lib/katello/tasks/repository.rake +3 -5
  231. data/lib/katello/tasks/reset.rake +0 -15
  232. data/lib/katello/tasks/upgrades/4.0/remove_ostree_puppet_content.rake +16 -0
  233. data/lib/katello/version.rb +1 -1
  234. data/lib/proxy_api/container_gateway.rb +21 -0
  235. data/locale/action_names.rb +51 -51
  236. data/locale/bn/katello.edit.po +8538 -0
  237. data/locale/bn/katello.po +136 -51
  238. data/locale/bn/katello.po.time_stamp +0 -0
  239. data/locale/cs/katello.edit.po +8440 -0
  240. data/locale/cs/katello.po +136 -49
  241. data/locale/cs/katello.po.time_stamp +0 -0
  242. data/locale/de/katello.edit.po +8344 -0
  243. data/locale/de/katello.po +136 -48
  244. data/locale/de/katello.po.time_stamp +0 -0
  245. data/locale/en/katello.edit.po +8161 -0
  246. data/locale/en/katello.po +136 -48
  247. data/locale/en/katello.po.time_stamp +0 -0
  248. data/locale/es/katello.edit.po +8306 -0
  249. data/locale/es/katello.po +136 -48
  250. data/locale/es/katello.po.time_stamp +0 -0
  251. data/locale/fr/katello.edit.po +8356 -0
  252. data/locale/fr/katello.po +136 -48
  253. data/locale/fr/katello.po.time_stamp +0 -0
  254. data/locale/gu/katello.edit.po +8540 -0
  255. data/locale/gu/katello.po +136 -51
  256. data/locale/gu/katello.po.time_stamp +0 -0
  257. data/locale/hi/katello.edit.po +8537 -0
  258. data/locale/hi/katello.po +136 -51
  259. data/locale/hi/katello.po.time_stamp +0 -0
  260. data/locale/it/katello.edit.po +8293 -0
  261. data/locale/it/katello.po +136 -48
  262. data/locale/it/katello.po.time_stamp +0 -0
  263. data/locale/ja/katello.edit.po +8322 -0
  264. data/locale/ja/katello.po +136 -48
  265. data/locale/ja/katello.po.time_stamp +0 -0
  266. data/locale/katello.pot +941 -767
  267. data/locale/kn/katello.edit.po +8538 -0
  268. data/locale/kn/katello.po +136 -51
  269. data/locale/kn/katello.po.time_stamp +0 -0
  270. data/locale/ko/katello.edit.po +8289 -0
  271. data/locale/ko/katello.po +136 -48
  272. data/locale/ko/katello.po.time_stamp +0 -0
  273. data/locale/mr/katello.edit.po +8502 -0
  274. data/locale/mr/katello.po +136 -51
  275. data/locale/mr/katello.po.time_stamp +0 -0
  276. data/locale/or/katello.edit.po +8538 -0
  277. data/locale/or/katello.po +136 -51
  278. data/locale/or/katello.po.time_stamp +0 -0
  279. data/locale/pa/katello.edit.po +8524 -0
  280. data/locale/pa/katello.po +136 -51
  281. data/locale/pa/katello.po.time_stamp +0 -0
  282. data/locale/pt/katello.edit.po +8255 -0
  283. data/locale/pt/katello.po +136 -51
  284. data/locale/pt/katello.po.time_stamp +0 -0
  285. data/locale/pt_BR/katello.edit.po +8289 -0
  286. data/locale/pt_BR/katello.po +136 -48
  287. data/locale/pt_BR/katello.po.time_stamp +0 -0
  288. data/locale/ru/katello.edit.po +8309 -0
  289. data/locale/ru/katello.po +136 -48
  290. data/locale/ru/katello.po.time_stamp +0 -0
  291. data/locale/ta/katello.edit.po +8536 -0
  292. data/locale/ta/katello.po +136 -51
  293. data/locale/ta/katello.po.time_stamp +0 -0
  294. data/locale/te/katello.edit.po +8536 -0
  295. data/locale/te/katello.po +136 -51
  296. data/locale/te/katello.po.time_stamp +0 -0
  297. data/locale/zh_CN/katello.edit.po +8288 -0
  298. data/locale/zh_CN/katello.po +136 -48
  299. data/locale/zh_CN/katello.po.time_stamp +0 -0
  300. data/locale/zh_TW/katello.edit.po +8420 -0
  301. data/locale/zh_TW/katello.po +136 -48
  302. data/locale/zh_TW/katello.po.time_stamp +0 -0
  303. data/package.json +1 -1
  304. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +0 -1
  305. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +2 -0
  306. data/webpack/__mocks__/foremanReact/components/common/dates/LongDateTime.js +5 -0
  307. data/webpack/{scenes/ContentViews/Details/Repositories → components/SelectableDropdown}/SelectableDropdown.js +20 -3
  308. data/webpack/components/SelectableDropdown/__tests__/SelectableDropdown.test.js +45 -0
  309. data/webpack/components/SelectableDropdown/index.js +3 -0
  310. data/webpack/components/Table/TableWrapper.js +2 -1
  311. data/webpack/components/Table/helpers.js +14 -0
  312. data/webpack/components/TypeAhead/TypeAhead.js +2 -1
  313. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +2 -1
  314. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +0 -1
  315. data/webpack/containers/Application/overrides.scss +6 -0
  316. data/webpack/index.js +6 -0
  317. data/webpack/redux/actions/RedHatRepositories/helpers.js +5 -5
  318. data/webpack/scenes/ContentViews/ContentViewsActions.js +31 -2
  319. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -1
  320. data/webpack/scenes/ContentViews/Copy/ContentViewCopySelectors.js +16 -0
  321. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +77 -0
  322. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +44 -0
  323. data/webpack/scenes/ContentViews/Copy/__tests__/contentViewCopyResult.fixtures.json +42 -0
  324. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +39 -0
  325. data/webpack/scenes/ContentViews/Copy/index.js +4 -0
  326. data/webpack/scenes/ContentViews/Create/ContentViewCreateSelectors.js +16 -0
  327. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +58 -0
  328. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +175 -0
  329. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +27 -0
  330. data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +42 -0
  331. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +92 -0
  332. data/webpack/scenes/ContentViews/Create/index.js +4 -0
  333. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +16 -0
  334. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +20 -1
  335. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +17 -7
  336. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +19 -13
  337. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +40 -0
  338. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +124 -0
  339. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +134 -0
  340. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +92 -0
  341. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +44 -25
  342. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +17 -7
  343. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +24 -0
  344. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +53 -3
  345. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +4 -3
  346. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +41 -0
  347. data/webpack/scenes/ContentViews/helpers.js +13 -0
  348. data/webpack/scenes/SmartProxy/Content.js +17 -0
  349. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +11 -0
  350. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +3 -0
  351. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +16 -0
  352. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +152 -0
  353. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentResult.fixtures.json +140 -0
  354. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +38 -0
  355. data/webpack/scenes/SmartProxy/index.js +4 -0
  356. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +3 -3
  357. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +2 -2
  358. data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +2 -2
  359. data/webpack/test-utils/react-testing-lib-wrapper.js +5 -2
  360. data/webpack/utils/helpers.js +3 -0
  361. metadata +160 -40
  362. data/app/controllers/katello/api/v2/gpg_keys_controller.rb +0 -114
  363. data/app/lib/actions/pulp/consumer/abstract_content_action.rb +0 -71
  364. data/app/lib/actions/pulp/consumer/content_install.rb +0 -43
  365. data/app/lib/actions/pulp/consumer/content_uninstall.rb +0 -26
  366. data/app/lib/actions/pulp/consumer/content_update.rb +0 -32
  367. data/app/overrides/disable_turbolinks_on_proxies_index.rb +0 -5
  368. data/app/services/katello/event_daemon.rb +0 -135
  369. data/app/services/katello/pulp/content_counts_calculator.rb +0 -60
  370. data/db/functions/empty_v01.sql +0 -7
  371. data/db/functions/evr_trigger_v01.sql +0 -9
  372. data/db/functions/isalpha_v01.sql +0 -11
  373. data/db/functions/isalphanum_v01.sql +0 -12
  374. data/db/functions/isdigit_v01.sql +0 -10
  375. data/db/functions/rpmver_array_v01.sql +0 -60
  376. data/lib/katello/tasks/common.rake +0 -7
  377. data/lib/katello/tasks/reports.rake +0 -4
  378. data/lib/katello/tasks/upgrades/3.10/update_gpg_key_urls.rake +0 -32
  379. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.scss +0 -5
  380. data/webpack/scenes/ContentViews/Table/actionResolver.js +0 -28
@@ -246,4 +246,45 @@ test('No results message is shown for empty search', async (done) => {
246
246
  assertNockRequest(withSearchScope);
247
247
  assertNockRequest(searchResultScope, done);
248
248
  });
249
+
250
+ test('Displays Create Content View and opens modal with Form', async () => {
251
+ mockAutocomplete(nockInstance, autocompleteUrl);
252
+
253
+ const noResults = {
254
+ total: 0,
255
+ subtotal: 0,
256
+ page: 1,
257
+ per_page: 20,
258
+ results: [],
259
+ };
260
+ nockInstance
261
+ .get(cvIndexPath)
262
+ .query(true)
263
+ .reply(200, noResults);
264
+ const {
265
+ getByText, queryByText, getByLabelText,
266
+ } = renderWithRedux(<ContentViewsPage />, renderOptions);
267
+ await patientlyWaitFor(() => expect(queryByText('Create content view')).toBeTruthy());
268
+
269
+ expect(queryByText('Description')).not.toBeInTheDocument();
270
+ expect(queryByText('Name')).not.toBeInTheDocument();
271
+ expect(queryByText('Label')).not.toBeInTheDocument();
272
+ expect(queryByText('Composite content view')).not.toBeInTheDocument();
273
+ expect(queryByText('Component content view')).not.toBeInTheDocument();
274
+ expect(queryByText('Solve Dependencies')).not.toBeInTheDocument();
275
+ expect(queryByText('Auto Publish')).not.toBeInTheDocument();
276
+ expect(queryByText('Import Only')).not.toBeInTheDocument();
277
+
278
+ getByLabelText('create_content_view').click();
279
+
280
+ expect(getByText('Description')).toBeInTheDocument();
281
+ expect(getByText('Name')).toBeInTheDocument();
282
+ expect(getByText('Label')).toBeInTheDocument();
283
+ expect(getByText('Composite content view')).toBeInTheDocument();
284
+ expect(getByText('Component content view')).toBeInTheDocument();
285
+ expect(getByText('Solve Dependencies')).toBeInTheDocument();
286
+ expect(queryByText('Auto Publish')).not.toBeInTheDocument();
287
+ expect(getByText('Import Only')).toBeInTheDocument();
288
+ });
289
+
249
290
  /* eslint-enable no-useless-escape */
@@ -0,0 +1,13 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+
3
+ export const dependenciesHelpText = __('This will solve RPM and module stream dependencies on every publish of this content view. ' +
4
+ 'Dependency solving significantly increases publish time (publishes can take over three times as long) ' +
5
+ 'and filters will be ignored when adding packages to solve dependencies. ' +
6
+ 'Also, certain scenarios involving errata may still cause dependency errors.');
7
+
8
+ export const autoPublishHelpText = __('Automatically publish a new version of the composite content view whenever one of its content views is published. ' +
9
+ 'Autopublish will only happen for component views that use the \'Always use latest version\' option.');
10
+
11
+ export const importOnlyHelpText = __('Designate whether this content view is for importing from an upstream server. ' +
12
+ 'Import-only content views cannot be published directly.');
13
+
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import SmartProxyContentTable from './SmartProxyContentTable';
4
+
5
+ const Content = ({ smartProxyId }) => (
6
+ <SmartProxyContentTable smartProxyId={smartProxyId} />
7
+ );
8
+
9
+ Content.propTypes = {
10
+ smartProxyId: PropTypes.number,
11
+ };
12
+
13
+ Content.defaultProps = {
14
+ smartProxyId: null,
15
+ };
16
+
17
+ export default Content;
@@ -0,0 +1,11 @@
1
+ import { API_OPERATIONS, get } from 'foremanReact/redux/API';
2
+ import api, { orgId } from '../../services/api';
3
+ import SMART_PROXY_CONTENT_KEY from './SmartProxyContentConstants';
4
+
5
+ const getSmartProxyContent = ({ smartProxyId }) => get({
6
+ type: API_OPERATIONS.GET,
7
+ key: SMART_PROXY_CONTENT_KEY,
8
+ url: api.getApiUrl(`/capsules/${smartProxyId}/content/sync?${orgId()}`),
9
+ });
10
+
11
+ export default getSmartProxyContent;
@@ -0,0 +1,3 @@
1
+ const SMART_PROXY_CONTENT_KEY = 'SMART_PROXY_CONTENT';
2
+
3
+ export default SMART_PROXY_CONTENT_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 SMART_PROXY_CONTENT_KEY from './SmartProxyContentConstants';
8
+
9
+ export const selectSmartProxyContent = state =>
10
+ selectAPIResponse(state, SMART_PROXY_CONTENT_KEY) || {};
11
+
12
+ export const selectSmartProxyContentStatus = state =>
13
+ selectAPIStatus(state, SMART_PROXY_CONTENT_KEY) || STATUS.PENDING;
14
+
15
+ export const selectSmartProxyContentError = state =>
16
+ selectAPIError(state, SMART_PROXY_CONTENT_KEY);
@@ -0,0 +1,152 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useSelector, useDispatch } from 'react-redux';
4
+ import { wrappable } from '@patternfly/react-table';
5
+ import { CheckCircleIcon, TimesCircleIcon } from '@patternfly/react-icons';
6
+ import { STATUS } from 'foremanReact/constants';
7
+ import { translate as __ } from 'foremanReact/common/I18n';
8
+ import { urlBuilder } from 'foremanReact/common/urlHelpers';
9
+ import LongDateTime from 'foremanReact/components/common/dates/LongDateTime';
10
+ import MainTable from '../../components/Table/MainTable';
11
+ import getSmartProxyContent from './SmartProxyContentActions';
12
+ import ContentViewIcon from '../../scenes/ContentViews/components/ContentViewIcon';
13
+ import {
14
+ selectSmartProxyContent,
15
+ selectSmartProxyContentStatus,
16
+ selectSmartProxyContentError,
17
+ } from './SmartProxyContentSelectors';
18
+
19
+ const SmartProxyContentTable = ({ smartProxyId }) => {
20
+ const dispatch = useDispatch();
21
+ const [rows, setRows] = useState([]);
22
+ const response = useSelector(state => selectSmartProxyContent(state));
23
+ const status = useSelector(state => selectSmartProxyContentStatus(state));
24
+ const error = useSelector(state => selectSmartProxyContentError(state));
25
+ const columnHeaders = [
26
+ {
27
+ title: __('Environment'),
28
+ transforms: [wrappable],
29
+ },
30
+ {
31
+ title: __('Content view'),
32
+ transforms: [wrappable],
33
+ },
34
+ {
35
+ title: __('Type'),
36
+ transforms: [wrappable],
37
+ },
38
+ {
39
+ title: __('Last published'),
40
+ transforms: [wrappable],
41
+ },
42
+ {
43
+ title: __('Repositories'),
44
+ transforms: [wrappable],
45
+ },
46
+ {
47
+ title: __('Synced to smart proxy'),
48
+ transforms: [wrappable],
49
+ },
50
+ ];
51
+
52
+ const fetchWithParams = () => {
53
+ dispatch(getSmartProxyContent({ smartProxyId }));
54
+ };
55
+
56
+ const buildrows = (results) => {
57
+ const newRows = [];
58
+ let envCount = 0;
59
+ results.forEach((env) => {
60
+ const { name, content_views: contentViews } = env;
61
+ const cellEnv = {
62
+ isOpen: false,
63
+ cells: [name, null, null, null, null, null],
64
+ };
65
+ newRows.push(cellEnv);
66
+ contentViews.forEach((cv) => {
67
+ const {
68
+ id, name: cvName, composite, last_published: lastPublished, up_to_date: upToDate, counts,
69
+ } = cv;
70
+ const { repositories } = counts;
71
+ const cvType = <ContentViewIcon composite={composite} />;
72
+ const upToDateVal = upToDate ? <CheckCircleIcon /> : <TimesCircleIcon />;
73
+ const cellCv =
74
+ {
75
+ parent: envCount,
76
+ cells: [
77
+ {
78
+ title: null,
79
+ props: {
80
+ colSpan: 1,
81
+ },
82
+ },
83
+ {
84
+ title: <a href={urlBuilder('content_views', '', id)}>{cvName}</a>,
85
+ props: {
86
+ colSpan: 1,
87
+ },
88
+ },
89
+ {
90
+ title: cvType,
91
+ props: {
92
+ colSpan: 1,
93
+ },
94
+ },
95
+ {
96
+ title: <LongDateTime date={lastPublished} showRelativeTimeTooltip />,
97
+ props: {
98
+ colSpan: 1,
99
+ },
100
+ },
101
+ {
102
+ title: repositories,
103
+ props: {
104
+ colSpan: 1,
105
+ },
106
+ },
107
+ {
108
+ title: upToDateVal,
109
+ props: {
110
+ colSpan: 1,
111
+ },
112
+ },
113
+ ],
114
+ };
115
+ newRows.push(cellCv);
116
+ });
117
+ envCount = newRows.length;
118
+ });
119
+ return newRows;
120
+ };
121
+
122
+ const onCollapse = (row, setRow) => (event, rowKey, isOpen) => {
123
+ const newRows = [...row];
124
+ newRows[rowKey].isOpen = isOpen;
125
+ setRow(newRows);
126
+ };
127
+
128
+
129
+ useEffect(() => fetchWithParams(), []);
130
+
131
+ useEffect(() => {
132
+ if (status !== STATUS.PENDING && response) {
133
+ const { lifecycle_environments: env } = response;
134
+ setRows(buildrows(env));
135
+ }
136
+ }, [JSON.stringify(response), status, error]);
137
+
138
+
139
+ return (
140
+ <MainTable onCollapse={onCollapse(rows, setRows)} status={status} cells={columnHeaders} rows={rows} error={error} emptyContentTitle="No content synced" emptyContentBody="No content synced to smart proxy" emptySearchTitle="Empty" emptySearchBody="Empty" />
141
+ );
142
+ };
143
+
144
+ SmartProxyContentTable.propTypes = {
145
+ smartProxyId: PropTypes.number,
146
+ };
147
+
148
+ SmartProxyContentTable.defaultProps = {
149
+ smartProxyId: null,
150
+ };
151
+
152
+ export default SmartProxyContentTable;
@@ -0,0 +1,140 @@
1
+ {
2
+ "last_sync_time": "2021-01-12 14:39:01 -0500",
3
+ "active_sync_tasks": [],
4
+ "last_failed_sync_tasks": [],
5
+ "lifecycle_environments": [
6
+ {
7
+ "library": true,
8
+ "id": 1,
9
+ "name": "Library",
10
+ "label": "Library",
11
+ "description": null,
12
+ "organization_id": 1,
13
+ "organization": {
14
+ "name": "Default Organization",
15
+ "label": "Default_Organization",
16
+ "id": 1
17
+ },
18
+ "syncable": false,
19
+ "counts": {
20
+ "content_hosts": 0,
21
+ "content_views": 2,
22
+ "products": 1
23
+ },
24
+ "content_views": [
25
+ {
26
+ "id": 1,
27
+ "label": "Default_Organization_View",
28
+ "name": "Default Organization View",
29
+ "composite": false,
30
+ "last_published": "2021-01-05 09:55:20 -0500",
31
+ "default": true,
32
+ "up_to_date": true,
33
+ "counts": {
34
+ "content_hosts": 0,
35
+ "products": 1,
36
+ "repositories": 2
37
+ }
38
+ },
39
+ {
40
+ "id": 2,
41
+ "label": "cv1",
42
+ "name": "cv1",
43
+ "composite": false,
44
+ "last_published": "2021-01-12 14:36:31 -0500",
45
+ "default": false,
46
+ "up_to_date": true,
47
+ "counts": {
48
+ "content_hosts": 0,
49
+ "products": 1,
50
+ "repositories": 1
51
+ }
52
+ },
53
+ {
54
+ "id": 3,
55
+ "label": "cv2",
56
+ "name": "cv2",
57
+ "composite": false,
58
+ "last_published": "2021-01-12 14:37:05 -0500",
59
+ "default": false,
60
+ "up_to_date": true,
61
+ "counts": {
62
+ "content_hosts": 0,
63
+ "products": 1,
64
+ "repositories": 1
65
+ }
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "library": false,
71
+ "id": 2,
72
+ "name": "dev",
73
+ "label": "dev",
74
+ "description": null,
75
+ "organization_id": 1,
76
+ "organization": {
77
+ "name": "Default Organization",
78
+ "label": "Default_Organization",
79
+ "id": 1
80
+ },
81
+ "syncable": false,
82
+ "counts": {
83
+ "content_hosts": 0,
84
+ "content_views": 1,
85
+ "products": 1
86
+ },
87
+ "content_views": [
88
+ {
89
+ "id": 2,
90
+ "label": "cv1",
91
+ "name": "cv1",
92
+ "composite": false,
93
+ "last_published": "2021-01-12 14:36:31 -0500",
94
+ "default": false,
95
+ "up_to_date": true,
96
+ "counts": {
97
+ "content_hosts": 0,
98
+ "products": 1,
99
+ "repositories": 1
100
+ }
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "library": false,
106
+ "id": 3,
107
+ "name": "test",
108
+ "label": "test",
109
+ "description": null,
110
+ "organization_id": 1,
111
+ "organization": {
112
+ "name": "Default Organization",
113
+ "label": "Default_Organization",
114
+ "id": 1
115
+ },
116
+ "syncable": true,
117
+ "counts": {
118
+ "content_hosts": 0,
119
+ "content_views": 1,
120
+ "products": 1
121
+ },
122
+ "content_views": [
123
+ {
124
+ "id": 2,
125
+ "label": "cv1",
126
+ "name": "cv1",
127
+ "composite": false,
128
+ "last_published": "2021-01-12 14:36:31 -0500",
129
+ "default": false,
130
+ "up_to_date": false,
131
+ "counts": {
132
+ "content_hosts": 0,
133
+ "products": 1,
134
+ "repositories": 0
135
+ }
136
+ }
137
+ ]
138
+ }
139
+ ]
140
+ }
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
3
+
4
+ import { nockInstance, assertNockRequest } from '../../../test-utils/nockWrapper';
5
+ import api from '../../../services/api';
6
+ import SmartProxyContentTable from '../SmartProxyContentTable';
7
+
8
+ const smartProxyContentData = require('./SmartProxyContentResult.fixtures.json');
9
+
10
+ const smartProxyContentPath = api.getApiUrl('/capsules/1/content/sync');
11
+
12
+ const smartProxyContent = { ...smartProxyContentData };
13
+
14
+ const contentTable = <SmartProxyContentTable smartProxyId={1} />;
15
+
16
+ test('Can display Smart proxy content table', async (done) => {
17
+ const detailsScope = nockInstance
18
+ .get(smartProxyContentPath)
19
+ .query(true)
20
+ .reply(200, smartProxyContent);
21
+
22
+ const { getByText, getAllByLabelText } = renderWithRedux(contentTable);
23
+ await patientlyWaitFor(() => expect(getByText('Environment')).toBeInTheDocument());
24
+ expect(getByText('Content view')).toBeInTheDocument();
25
+ expect(getByText('Type')).toBeInTheDocument();
26
+ expect(getByText('Last published')).toBeInTheDocument();
27
+ expect(getByText('Repositories')).toBeInTheDocument();
28
+ expect(getByText('Synced to smart proxy')).toBeInTheDocument();
29
+ expect(getAllByLabelText('Details')[0]).toHaveAttribute('aria-expanded', 'false');
30
+ getAllByLabelText('Details')[0].click();
31
+ expect(getAllByLabelText('Details')[0]).toHaveAttribute('aria-expanded', 'true');
32
+ expect(getByText('Library')).toBeInTheDocument();
33
+ expect(getByText('Default Organization View')).toBeInTheDocument();
34
+ expect(getByText('dev')).toBeInTheDocument();
35
+
36
+
37
+ assertNockRequest(detailsScope, done);
38
+ });