katello 4.4.2.2 → 4.5.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 (444) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  3. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +98 -0
  4. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  5. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  7. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  8. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  9. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  11. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  12. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  13. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  14. data/app/controllers/katello/api/v2/repositories_controller.rb +9 -3
  15. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  16. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  17. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  18. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  19. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  21. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  22. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +2 -2
  24. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  25. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  26. data/app/lib/actions/katello/content_view/publish.rb +7 -9
  27. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  28. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  29. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  30. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  31. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  32. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  33. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  34. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  35. data/app/lib/actions/katello/product/content_create.rb +10 -8
  36. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  37. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  38. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  39. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  40. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  41. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  42. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  43. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  44. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  45. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  46. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  47. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +18 -0
  48. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  49. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +18 -0
  50. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  51. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  52. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  53. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +4 -1
  54. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +2 -0
  55. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  56. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  57. data/app/lib/katello/util/errata.rb +2 -3
  58. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  59. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  60. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  61. data/app/models/katello/alternate_content_source.rb +66 -0
  62. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  63. data/app/models/katello/authorization/repository.rb +3 -3
  64. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  65. data/app/models/katello/cdn_configuration.rb +15 -15
  66. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  67. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  68. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  69. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  70. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  71. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  72. data/app/models/katello/content.rb +1 -0
  73. data/app/models/katello/content_credential.rb +6 -0
  74. data/app/models/katello/content_override.rb +7 -3
  75. data/app/models/katello/content_view.rb +33 -2
  76. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  77. data/app/models/katello/content_view_filter.rb +4 -0
  78. data/app/models/katello/content_view_version.rb +12 -0
  79. data/app/models/katello/content_view_version_export_history.rb +3 -1
  80. data/app/models/katello/erratum.rb +9 -5
  81. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  82. data/app/models/katello/host/content_facet.rb +14 -0
  83. data/app/models/katello/host_available_module_stream.rb +12 -0
  84. data/app/models/katello/product_content.rb +1 -0
  85. data/app/models/katello/purpose_sla_status.rb +1 -1
  86. data/app/models/katello/purpose_status.rb +2 -2
  87. data/app/models/katello/repository.rb +7 -4
  88. data/app/models/katello/root_repository.rb +1 -1
  89. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  90. data/app/models/katello/sync_plan.rb +1 -1
  91. data/app/presenters/katello/product_content_presenter.rb +15 -0
  92. data/app/services/katello/applicable_host_queue.rb +1 -1
  93. data/app/services/katello/content_unit_indexer.rb +2 -1
  94. data/app/services/katello/product_content_finder.rb +12 -2
  95. data/app/services/katello/pulp3/alternate_content_source.rb +117 -0
  96. data/app/services/katello/pulp3/api/file.rb +8 -0
  97. data/app/services/katello/pulp3/api/yum.rb +8 -0
  98. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  99. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  100. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  101. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  102. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  103. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  104. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  105. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  106. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  107. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  108. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  109. data/app/services/katello/pulp3/repository.rb +7 -91
  110. data/app/services/katello/pulp3/service_common.rb +66 -0
  111. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  112. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  113. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  114. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  115. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  116. data/app/views/foreman/job_templates/install_group.erb +4 -4
  117. data/app/views/foreman/job_templates/install_package.erb +4 -4
  118. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  119. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  120. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  121. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  122. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  123. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  124. data/app/views/foreman/job_templates/update_group.erb +4 -4
  125. data/app/views/foreman/job_templates/update_package.erb +4 -4
  126. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  127. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +15 -0
  128. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  129. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  130. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  131. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  132. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  133. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  134. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  135. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  136. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  137. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  138. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  139. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  140. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  141. data/config/routes/api/v2.rb +7 -0
  142. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  143. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  144. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  145. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  146. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  147. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +10 -12
  148. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  149. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  150. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  151. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  152. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  153. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  154. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  155. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  156. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  157. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  158. data/db/seeds.d/150-module_job_templates.rb +1 -1
  159. data/engines/bastion/README.md +1 -0
  160. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  161. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +10 -5
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  165. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  166. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  167. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  168. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  169. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  170. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  189. data/lib/katello/engine.rb +1 -5
  190. data/lib/katello/permission_creator.rb +32 -4
  191. data/lib/katello/plugin.rb +378 -4
  192. data/lib/katello/tasks/reset.rake.bak +67 -0
  193. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  194. data/lib/katello/version.rb +1 -1
  195. data/locale/action_names.rb +47 -41
  196. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  197. data/locale/bn/katello.po +820 -106
  198. data/locale/bn/katello.po.time_stamp +0 -0
  199. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  200. data/locale/cs/katello.po +818 -104
  201. data/locale/cs/katello.po.time_stamp +0 -0
  202. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  203. data/locale/de/katello.po +893 -179
  204. data/locale/de/katello.po.time_stamp +0 -0
  205. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  206. data/locale/en/katello.po +817 -103
  207. data/locale/en/katello.po.time_stamp +0 -0
  208. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  209. data/locale/es/katello.po +882 -168
  210. data/locale/es/katello.po.time_stamp +0 -0
  211. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/fr/katello.po +1219 -505
  213. data/locale/fr/katello.po.time_stamp +0 -0
  214. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  215. data/locale/gu/katello.po +826 -112
  216. data/locale/gu/katello.po.time_stamp +0 -0
  217. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/hi/katello.po +826 -112
  219. data/locale/hi/katello.po.time_stamp +0 -0
  220. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/it/katello.po +863 -148
  222. data/locale/it/katello.po.time_stamp +0 -0
  223. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/ja/katello.po +1216 -499
  225. data/locale/ja/katello.po.time_stamp +0 -0
  226. data/locale/katello.pot +3847 -2507
  227. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/kn/katello.po +826 -112
  229. data/locale/kn/katello.po.time_stamp +0 -0
  230. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/ko/katello.po +912 -198
  232. data/locale/ko/katello.po.time_stamp +0 -0
  233. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/mr/katello.po +826 -112
  235. data/locale/mr/katello.po.time_stamp +0 -0
  236. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/or/katello.po +826 -112
  238. data/locale/or/katello.po.time_stamp +0 -0
  239. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/pa/katello.po +826 -112
  241. data/locale/pa/katello.po.time_stamp +0 -0
  242. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  243. data/locale/pt/katello.po +817 -103
  244. data/locale/pt/katello.po.time_stamp +0 -0
  245. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  246. data/locale/pt_BR/katello.po +879 -165
  247. data/locale/pt_BR/katello.po.time_stamp +0 -0
  248. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/ru/katello.po +927 -213
  250. data/locale/ru/katello.po.time_stamp +0 -0
  251. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ta/katello.po +820 -106
  253. data/locale/ta/katello.po.time_stamp +0 -0
  254. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/te/katello.po +826 -112
  256. data/locale/te/katello.po.time_stamp +0 -0
  257. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/zh_CN/katello.po +1202 -486
  259. data/locale/zh_CN/katello.po.time_stamp +0 -0
  260. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/zh_TW/katello.po +856 -142
  262. data/locale/zh_TW/katello.po.time_stamp +0 -0
  263. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  264. data/webpack/components/Errata/index.js +38 -8
  265. data/webpack/components/Packages/index.js +1 -4
  266. data/webpack/components/Search/Search.js +18 -3
  267. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  268. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  269. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  270. data/webpack/components/Table/MainTable.js +29 -4
  271. data/webpack/components/Table/TableHooks.js +63 -19
  272. data/webpack/components/Table/TableWrapper.js +4 -2
  273. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  274. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  275. data/webpack/components/TypeAhead/TypeAhead.js +8 -0
  276. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  277. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +5 -2
  278. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  279. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +256 -0
  280. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +202 -0
  281. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  282. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  283. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  284. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  285. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  286. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  287. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  288. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  289. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  290. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +187 -0
  291. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  292. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  293. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  294. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  295. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +110 -0
  296. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  297. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  298. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  299. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  300. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  301. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  302. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +62 -39
  303. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  304. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  305. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  306. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +486 -116
  307. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +147 -1
  308. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +6 -3
  309. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  310. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +2 -1
  311. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +48 -19
  312. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +35 -47
  313. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  314. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  315. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  316. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +269 -132
  317. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +47 -11
  318. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +30 -42
  319. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +36 -1
  320. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +94 -46
  321. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +18 -2
  322. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  323. data/webpack/containers/Application/config.js +5 -0
  324. data/webpack/global_index.js +30 -7
  325. data/webpack/global_test_setup.js +13 -0
  326. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  327. data/webpack/redux/actions/RedHatRepositories/helpers.js +9 -8
  328. data/webpack/scenes/AlternateContentSources/ACSActions.js +53 -0
  329. data/webpack/scenes/AlternateContentSources/ACSConstants.js +4 -0
  330. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  331. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +15 -0
  332. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +152 -0
  333. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  334. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  335. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  336. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  337. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  338. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  339. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  340. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  341. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  342. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  343. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  344. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  346. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  347. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  348. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  349. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  350. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  351. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  352. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  353. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  354. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  355. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  356. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  357. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  358. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  359. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  360. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  361. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  362. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  363. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  364. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  365. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  366. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  367. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  368. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  369. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  370. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  371. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  372. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  373. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  374. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  375. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  376. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  377. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  378. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  379. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  380. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  381. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  382. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  383. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  384. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  385. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  386. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  387. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  388. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  389. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  390. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  391. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  392. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  393. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  394. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  395. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  396. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  397. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  398. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  399. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  400. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  401. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  402. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  403. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  404. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  405. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  406. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  407. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  408. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  409. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  410. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  411. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  412. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  413. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  414. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  415. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +9 -5
  416. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  417. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  418. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  419. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  420. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  421. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  422. data/webpack/scenes/ContentViews/helpers.js +3 -0
  423. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  424. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  425. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  426. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  427. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  428. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  429. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  430. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  431. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  432. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  433. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  434. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  435. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  436. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  437. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  438. data/webpack/scenes/Tasks/helpers.js +33 -5
  439. data/webpack/utils/helpers.js +2 -0
  440. metadata +158 -40
  441. data/app/models/setting/content.rb +0 -201
  442. data/webpack/components/Table/__test__/useBulkSelect.test.js +0 -99
  443. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  444. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -44,16 +44,18 @@ module Actions
44
44
  root = ::Katello::RootRepository.find(input[:root_repository_id])
45
45
  root.update(:content_id => input[:content_id])
46
46
 
47
- content = ::Katello::Content.create!(name: root.name,
48
- organization_id: root.product.organization_id,
49
- cp_content_id: root.content_id,
50
- content_type: root.content_type,
51
- label: root.custom_content_label,
52
- content_url: root.custom_content_path,
53
- vendor: ::Katello::Provider::CUSTOM)
47
+ content = ::Katello::Content.where(organization_id: root.product.organization_id, cp_content_id: root.content_id).first_or_create do |new_content|
48
+ new_content.name = root.name
49
+ new_content.content_type = root.content_type
50
+ new_content.label = root.custom_content_label
51
+ new_content.content_url = root.custom_content_path
52
+ new_content.vendor = ::Katello::Provider::CUSTOM
53
+ end
54
54
 
55
55
  #custom product content is always enabled by default
56
- ::Katello::ProductContent.create!(product: root.product, content: content, enabled: true)
56
+ ::Katello::ProductContent.where(product: root.product, content: content).first_or_create do |pc|
57
+ pc.enabled = true
58
+ end
57
59
  end
58
60
  end
59
61
  end
@@ -14,22 +14,16 @@ module Actions
14
14
  destroy_content = options.fetch(:destroy_content, true)
15
15
  remove_from_content_view_versions = options.fetch(:remove_from_content_view_versions, false)
16
16
  action_subject(repository)
17
+ check_destroyable!(repository, remove_from_content_view_versions)
18
+ remove_generated_content_views(repository)
17
19
 
18
- unless repository.destroyable?(remove_from_content_view_versions)
19
- # The repository is going to be deleted in finalize, but it cannot be deleted.
20
- # Stop now and inform the user.
21
- fail repository.errors.messages.values.join("\n")
22
- end
20
+ remove_versions(repository, repository.content_views.generated_for_library, affected_cvv_ids)
23
21
 
24
22
  plan_action(Actions::Pulp3::Orchestration::Repository::Delete,
25
23
  repository,
26
24
  SmartProxy.pulp_primary)
27
25
 
28
- if remove_from_content_view_versions
29
- library_instances_inverse = repository.library_instances_inverse
30
- affected_cvv_ids = library_instances_inverse.pluck(:content_view_version_id).uniq
31
- plan_action(::Actions::BulkAction, ::Actions::Katello::Repository::Destroy, library_instances_inverse)
32
- end
26
+ remove_versions(repository, repository.content_views.generated_for_none, affected_cvv_ids) if remove_from_content_view_versions
33
27
 
34
28
  plan_self(:user_id => ::User.current.id, :affected_cvv_ids => affected_cvv_ids)
35
29
  sequence do
@@ -50,8 +44,9 @@ module Actions
50
44
  delete_record(repository, {docker_cleanup: docker_cleanup})
51
45
 
52
46
  if (affected_cvv_ids = input[:affected_cvv_ids]).any?
53
- affected_cvv_ids.each do |cvv_id|
54
- ::Katello::ContentViewVersion.find(cvv_id).update_content_counts!
47
+ cvvs = ::Katello::ContentViewVersion.where(id: affected_cvv_ids)
48
+ cvvs.each do |cvv|
49
+ cvv.update_content_counts!
55
50
  end
56
51
  end
57
52
  end
@@ -77,6 +72,35 @@ module Actions
77
72
  ::Katello::DockerMetaTag.cleanup_tags if options[:docker_cleanup]
78
73
  end
79
74
 
75
+ def remove_generated_content_views(repository)
76
+ # remove the content views generated for this repository (since we are deleting the repo)
77
+ content_views = repository.content_views.generated_for_repository
78
+ return if content_views.blank?
79
+ plan_action(::Actions::BulkAction, ::Actions::Katello::ContentView::Remove,
80
+ content_views,
81
+ skip_repo_destroy: true,
82
+ destroy_content_view: true)
83
+ end
84
+
85
+ def remove_versions(repository, content_views, affected_cvv_ids)
86
+ return if content_views.blank?
87
+
88
+ interested_inverses = repository.
89
+ library_instances_inverse.
90
+ joins(:content_view_version => :content_view).
91
+ merge(content_views)
92
+ affected_cvv_ids.concat(interested_inverses.pluck(:content_view_version_id).uniq)
93
+ plan_action(::Actions::BulkAction, ::Actions::Katello::Repository::Destroy, interested_inverses)
94
+ end
95
+
96
+ def check_destroyable!(repository, remove_from_content_view_versions)
97
+ unless repository.destroyable?(remove_from_content_view_versions)
98
+ # The repository is going to be deleted in finalize, but it cannot be deleted.
99
+ # Stop now and inform the user.
100
+ fail repository.errors.messages.values.join("\n")
101
+ end
102
+ end
103
+
80
104
  def humanized_name
81
105
  _("Delete")
82
106
  end
@@ -7,9 +7,14 @@ module Actions
7
7
  end
8
8
 
9
9
  def plan(product, content, options)
10
- repository = repository_mapper(product,
11
- content,
12
- options).find_repository
10
+ if options[:repository_id]
11
+ repository = ::Katello::Repository.find(options[:repository_id])
12
+ else
13
+ repository = repository_mapper(product,
14
+ content,
15
+ options).find_repository
16
+ end
17
+
13
18
  if repository
14
19
  action_subject(repository)
15
20
  plan_action(Repository::Destroy, repository)
@@ -0,0 +1,20 @@
1
+ module Actions
2
+ module Pulp3
3
+ module AlternateContentSource
4
+ class Create < Pulp3::Abstract
5
+ def plan(acs, smart_proxy)
6
+ plan_self(:acs_id => acs.id, :smart_proxy_id => smart_proxy.id)
7
+ end
8
+
9
+ def run
10
+ acs = ::Katello::AlternateContentSource.find(input[:acs_id])
11
+ output[:response] = acs.backend_service(smart_proxy).create
12
+ end
13
+
14
+ def rescue_strategy
15
+ Dynflow::Action::Rescue::Skip
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Actions
2
+ module Pulp3
3
+ module AlternateContentSource
4
+ class CreateRemote < Pulp3::Abstract
5
+ def plan(acs, smart_proxy)
6
+ plan_self(:acs_id => acs.id, :smart_proxy_id => smart_proxy.id)
7
+ end
8
+
9
+ def run
10
+ acs = ::Katello::AlternateContentSource.find(input[:acs_id])
11
+ output[:response] = acs.backend_service(smart_proxy).create_remote
12
+ end
13
+
14
+ def rescue_strategy
15
+ Dynflow::Action::Rescue::Skip
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ module Actions
2
+ module Pulp3
3
+ module AlternateContentSource
4
+ class Delete < Pulp3::Abstract
5
+ def plan(acs, smart_proxy)
6
+ plan_self(:acs_id => acs.id, :smart_proxy_id => smart_proxy.id)
7
+ end
8
+
9
+ def run
10
+ acs = ::Katello::AlternateContentSource.find(input[:acs_id])
11
+ output[:response] = acs.backend_service(smart_proxy).delete_alternate_content_source
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Actions
2
+ module Pulp3
3
+ module AlternateContentSource
4
+ class DeleteRemote < Pulp3::Abstract
5
+ def plan(acs, smart_proxy)
6
+ plan_self(:acs_id => acs.id, :smart_proxy_id => smart_proxy.id)
7
+ end
8
+
9
+ def run
10
+ acs = ::Katello::AlternateContentSource.find(input[:acs_id])
11
+ output[:response] = acs.backend_service(smart_proxy).delete_remote
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Actions
2
+ module Pulp3
3
+ module AlternateContentSource
4
+ class Update < Pulp3::Abstract
5
+ def plan(acs, smart_proxy)
6
+ plan_self(:acs_id => acs.id, :smart_proxy_id => smart_proxy.id)
7
+ end
8
+
9
+ def run
10
+ acs = ::Katello::AlternateContentSource.find(input[:acs_id])
11
+ output[:response] = acs.backend_service(smart_proxy).update
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Actions
2
+ module Pulp3
3
+ module AlternateContentSource
4
+ class UpdateRemote < Pulp3::Abstract
5
+ def plan(acs, smart_proxy)
6
+ acs.backend_service(smart_proxy).create_test_remote
7
+ plan_self(:acs_id => acs.id, :smart_proxy_id => smart_proxy.id)
8
+ end
9
+
10
+ def run
11
+ acs = ::Katello::AlternateContentSource.find(input[:acs_id])
12
+ output[:response] = acs.backend_service(smart_proxy).update_remote
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,9 +1,9 @@
1
1
  module Actions
2
2
  module Pulp3
3
3
  module ContentViewVersion
4
- class Import < Pulp3::AbstractAsyncTask
4
+ class CreateImport < Pulp3::AbstractAsyncTask
5
5
  input_format do
6
- param :content_view_version_id, Integer
6
+ param :organization_id, Integer
7
7
  param :smart_proxy_id, Integer
8
8
  param :importer_data, Hash
9
9
  param :path, String
@@ -11,12 +11,12 @@ module Actions
11
11
  end
12
12
 
13
13
  def invoke_external_task
14
- cvv = ::Katello::ContentViewVersion.find(input[:content_view_version_id])
14
+ metadata_map = ::Katello::Pulp3::ContentViewVersion::MetadataMap.new(metadata: input[:metadata])
15
15
  output[:pulp_tasks] = ::Katello::Pulp3::ContentViewVersion::Import.new(
16
+ organization: ::Organization.find(input[:organization_id]),
16
17
  smart_proxy: smart_proxy,
17
- content_view_version: cvv,
18
18
  path: input[:path],
19
- metadata: input[:metadata]
19
+ metadata_map: metadata_map
20
20
  ).create_import(input[:importer_data][:pulp_href])
21
21
  end
22
22
 
@@ -11,12 +11,13 @@ module Actions
11
11
 
12
12
  def run
13
13
  cvv = ::Katello::ContentViewVersion.find(input[:content_view_version_id])
14
+ metadata_map = ::Katello::Pulp3::ContentViewVersion::MetadataMap.new(metadata: input[:metadata])
14
15
  output[:importer_data] = ::Katello::Pulp3::ContentViewVersion::Import.new(
16
+ organization: cvv.content_view.organization,
15
17
  smart_proxy: smart_proxy,
16
- content_view_version: cvv,
17
18
  path: input[:path],
18
- metadata: input[:metadata]
19
- ).create_importer
19
+ metadata_map: metadata_map
20
+ ).create_importer(cvv)
20
21
  end
21
22
  end
22
23
  end
@@ -5,10 +5,21 @@ module Actions
5
5
  input_format do
6
6
  param :smart_proxy_id, Integer
7
7
  param :importer_data, Hash
8
+ param :organization_id, Integer
9
+ param :importer_data, Hash
10
+ param :path, String
11
+ param :metadata, Hash
8
12
  end
9
13
 
10
14
  def run
11
- ::Katello::Pulp3::ContentViewVersion::Import.new(smart_proxy: smart_proxy).destroy_importer(input[:importer_data][:pulp_href])
15
+ metadata_map = ::Katello::Pulp3::ContentViewVersion::MetadataMap.new(metadata: input[:metadata])
16
+ import = ::Katello::Pulp3::ContentViewVersion::Import.new(
17
+ organization: ::Organization.find(input[:organization_id]),
18
+ smart_proxy: smart_proxy,
19
+ path: input[:path],
20
+ metadata_map: metadata_map
21
+ )
22
+ import.destroy_importer(input[:importer_data][:pulp_href])
12
23
  end
13
24
  end
14
25
  end
@@ -0,0 +1,18 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module AlternateContentSource
5
+ class Create < Pulp3::Abstract
6
+ def plan(acs, smart_proxy)
7
+ sequence do
8
+ plan_action(Actions::Pulp3::AlternateContentSource::CreateRemote, acs, smart_proxy)
9
+ plan_action(Actions::Pulp3::AlternateContentSource::Create, acs, smart_proxy)
10
+ # TODO: Should the hrefs be committed to acs records in a new action? Is it okay to be in the service class methods?
11
+ # -> i.e. do we need something like SaveVersions?
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module AlternateContentSource
5
+ class Delete < Pulp3::Abstract
6
+ def plan(acs, smart_proxy)
7
+ sequence do
8
+ plan_action(Actions::Pulp3::AlternateContentSource::Delete, acs, smart_proxy)
9
+ plan_action(Actions::Pulp3::AlternateContentSource::DeleteRemote, acs, smart_proxy)
10
+ plan_self(acs_id: acs.id, smart_proxy_id: smart_proxy.id)
11
+ end
12
+ end
13
+
14
+ def finalize
15
+ acs_id = input[:acs_id]
16
+ smart_proxy_id = input[:smart_proxy_id]
17
+ ::Katello::SmartProxyAlternateContentSource.find_by(alternate_content_source_id: acs_id, smart_proxy_id: smart_proxy_id).destroy
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module AlternateContentSource
5
+ class Update < Pulp3::Abstract
6
+ def plan(acs, smart_proxy)
7
+ sequence do
8
+ plan_action(Actions::Pulp3::AlternateContentSource::UpdateRemote, acs, smart_proxy)
9
+ plan_action(Actions::Pulp3::AlternateContentSource::Update, acs, smart_proxy)
10
+ # TODO: Should the hrefs be committed to acs records in a new action? Is it okay to be in the service class methods?
11
+ # -> i.e. do we need something like SaveVersions?
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -10,7 +10,7 @@ module Actions
10
10
  plan_action(Actions::Pulp3::Repository::CopyContent, repo, SmartProxy.pulp_primary!,
11
11
  repo.library_instance,
12
12
  copy_all: true,
13
- mirror: content_view_version.content_view.library_import?)
13
+ mirror: content_view_version.content_view.generated?)
14
14
  plan_action(Actions::Pulp3::Repository::SaveVersion, repo.library_instance)
15
15
  plan_action(Katello::Repository::IndexContent, id: repo.library_instance_id)
16
16
  plan_action(Katello::Repository::MetadataGenerate, repo.library_instance, :force => true)
@@ -0,0 +1,51 @@
1
+ module Actions
2
+ module Pulp3
3
+ module Orchestration
4
+ module ContentViewVersion
5
+ class ExportRepository < Actions::EntryAction
6
+ def plan(repository,
7
+ chunk_size: nil,
8
+ from_history: nil)
9
+ action_subject(repository)
10
+ validate_repositories_immediate!(repository)
11
+
12
+ content_view = ::Katello::Pulp3::ContentViewVersion::Export.find_repository_export_view(
13
+ repository: repository,
14
+ create_by_default: true)
15
+ content_view.update!(repository_ids: [repository.library_instance_or_self.id])
16
+
17
+ sequence do
18
+ publish_action = plan_action(::Actions::Katello::ContentView::Publish, content_view, '')
19
+ export_action = plan_action(Actions::Katello::ContentViewVersion::Export,
20
+ content_view_version: publish_action.version,
21
+ chunk_size: chunk_size,
22
+ from_history: from_history)
23
+ plan_self(export_action_output: export_action.output)
24
+ end
25
+ end
26
+
27
+ def run
28
+ output[:export_history_id] = input[:export_action_output][:export_history_id]
29
+ end
30
+
31
+ def humanized_name
32
+ _("Export Repository")
33
+ end
34
+
35
+ def rescue_strategy
36
+ Dynflow::Action::Rescue::Skip
37
+ end
38
+
39
+ def validate_repositories_immediate!(repository)
40
+ unless repository.immediate?
41
+ fail _("NOTE: Unable to fully export repository '%{repository}' because"\
42
+ " it does not have the 'immediate' download policy."\
43
+ " Update the download policy and sync the affected repository to include them in the export."\
44
+ % { repository: repository.name })
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -16,8 +16,8 @@ module Actions
16
16
  ).output
17
17
 
18
18
  plan_action(
19
- ::Actions::Pulp3::ContentViewVersion::Import,
20
- content_view_version_id: content_view_version.id,
19
+ ::Actions::Pulp3::ContentViewVersion::CreateImport,
20
+ organization_id: content_view_version.content_view.organization_id,
21
21
  smart_proxy_id: smart_proxy.id,
22
22
  importer_data: importer_output[:importer_data],
23
23
  path: path,
@@ -36,7 +36,10 @@ module Actions
36
36
  content_view_name: content_view_version.name
37
37
  )
38
38
  plan_action(::Actions::Pulp3::ContentViewVersion::DestroyImporter,
39
+ organization_id: content_view_version.content_view.organization_id,
39
40
  smart_proxy_id: smart_proxy.id,
41
+ path: path,
42
+ metadata: metadata,
40
43
  importer_data: importer_output[:importer_data])
41
44
  plan_self(
42
45
  content_view_name: content_view_version.name,
@@ -3,6 +3,7 @@ module Actions
3
3
  module Repository
4
4
  class RefreshDistribution < Pulp3::AbstractAsyncTask
5
5
  include Helpers::Presenter
6
+ middleware.use Actions::Middleware::ExecuteIfContentsChanged
6
7
 
7
8
  def plan(repository, smart_proxy, options = {})
8
9
  smart_proxy = SmartProxy.unscoped.find_by(id: smart_proxy) #support bulk actions
@@ -15,9 +16,11 @@ module Actions
15
16
  :repository_id => repository.id,
16
17
  :smart_proxy_id => smart_proxy.id
17
18
  }
19
+ refresh_options[:contents_changed] if options.key?(:contents_changed)
18
20
  action = plan_self(refresh_options)
19
21
 
20
- plan_action(SaveDistributionReferences, repository, smart_proxy, action.output)
22
+ plan_action(SaveDistributionReferences, repository, smart_proxy,
23
+ action.output, :contents_changed => options[:contents_changed])
21
24
  end
22
25
  end
23
26
 
@@ -2,6 +2,8 @@ module Actions
2
2
  module Pulp3
3
3
  module Repository
4
4
  class SaveDistributionReferences < Pulp3::Abstract
5
+ middleware.use Actions::Middleware::ExecuteIfContentsChanged
6
+
5
7
  def plan(repository, smart_proxy, tasks, options = {})
6
8
  plan_self(repository_id: repository.id, smart_proxy_id: smart_proxy.id, tasks: tasks, contents_changed: options[:contents_changed])
7
9
  end
@@ -23,6 +23,7 @@ module Katello
23
23
  rescue_from Errors::CdnSubstitutionError, :with => :rescue_from_bad_data
24
24
  rescue_from Errors::RegistrationError, :with => :rescue_from_bad_data
25
25
  rescue_from ActionController::ParameterMissing, :with => :rescue_from_missing_param
26
+ rescue_from ::ForemanTasks::Lock::LockConflict, :with => :rescue_from_bad_data
26
27
  end
27
28
 
28
29
  protected
@@ -118,7 +118,9 @@ module Katello
118
118
 
119
119
  def find_organization(label)
120
120
  response = get("/api/v2/organizations?search=#{CGI.escape("label = #{label}")}")
121
- JSON.parse(response)['results'].first
121
+ JSON.parse(response)['results'].first.tap do |org|
122
+ fail "Specified organization was not found: #{label}" if org.nil?
123
+ end
122
124
  rescue => e
123
125
  Rails.logger.error("Couldn't load upstream organization with label=#{label} error=#{e.message}")
124
126
  raise e
@@ -56,10 +56,9 @@ module Katello
56
56
  matching_errata = []
57
57
  errata.each do |erratum|
58
58
  # The erratum should be copied if package_pulp_hrefs has all of its packages that are available in the source repo.
59
- next if erratum.packages.empty?
60
59
  rpms_in_erratum_and_source_repo = erratum.packages.pluck(:filename) & source_repo_rpm_filenames
61
- next if rpms_in_erratum_and_source_repo.empty?
62
- if (rpms_in_erratum_and_source_repo - rpm_filenames - srpm_filenames).empty?
60
+ if (rpms_in_erratum_and_source_repo - rpm_filenames - srpm_filenames).empty? ||
61
+ erratum.packages.empty? || rpms_in_erratum_and_source_repo.empty?
63
62
  matching_errata << erratum
64
63
  end
65
64
  end
@@ -0,0 +1,29 @@
1
+ module Katello
2
+ module Validators
3
+ class AlternateContentSourcePathValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ if value
6
+ if attribute == :base_url
7
+ unless AlternateContentSourcePathValidator.validate_base_url(value)
8
+ record.errors[attribute] << N_("%s is not a valid path") % value
9
+ end
10
+ elsif attribute == :subpaths
11
+ unless AlternateContentSourcePathValidator.validate_subpaths(value)
12
+ record.errors[attribute] << N_('All subpaths must have a slash at the end and none at the front')
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ def self.validate_base_url(base_url)
19
+ base_url =~ /\A#{URI::DEFAULT_PARSER.make_regexp}\z/
20
+ end
21
+
22
+ # Subpaths must have a slash at the end and none at the front: 'path/'
23
+ def self.validate_subpaths(subpaths)
24
+ bad_subpaths = subpaths.select { |subpath| subpath[0] == '/' || subpath[-1] != '/' }
25
+ bad_subpaths.empty?
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ module Katello
2
+ module Validators
3
+ class ContentDefaultHttpProxySettingValidator < ActiveModel::Validator
4
+ def validate(record)
5
+ proxy = HttpProxy.where(name: record.value).first
6
+ return if proxy || record.value.blank?
7
+
8
+ record.errors.add(:base, _('There is no such HTTP proxy'))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -5,12 +5,17 @@ module Katello
5
5
  #support lifecycle_environment_id for foreman models
6
6
  environment_id = record.respond_to?(:lifecycle_environment_id) ? record.lifecycle_environment_id : record.environment_id
7
7
 
8
- if record.content_view_id && environment_id
8
+ if record.content_view_id
9
9
  view = ContentView.where(:id => record.content_view_id).first
10
- env = KTEnvironment.where(:id => environment_id).first
11
- unless view.blank? || env.blank? || view.in_environment?(env)
12
- record.errors[:base] << _("Content view '%{view}' is not in environment '%{env}'") %
13
- {:view => view.name, :env => env.name}
10
+ if environment_id
11
+ env = KTEnvironment.where(:id => environment_id).first
12
+ unless view.blank? || env.blank? || view.in_environment?(env)
13
+ record.errors[:base] << _("Content view '%{view}' is not in environment '%{env}'") %
14
+ {:view => view.name, :env => env.name}
15
+ end
16
+ end
17
+ if view&.generated_for_repository?
18
+ record.errors[:base] << _("Generated Content views cannot be assigned to Host/Activation Keys")
14
19
  end
15
20
  end
16
21
  end
@@ -0,0 +1,66 @@
1
+ module Katello
2
+ class AlternateContentSource < Katello::Model
3
+ include Ext::LabelFromName
4
+ include Encryptable
5
+ include ::ScopedSearchExtensions
6
+ include Authorization::AlternateContentSource
7
+ include ForemanTasks::Concerns::ActionSubject
8
+
9
+ self.table_name = :katello_alternate_content_sources
10
+
11
+ # TODO: simplified, rhui
12
+ ACS_TYPES = %w(custom).freeze
13
+ CONTENT_TYPES = [::Katello::Repository::YUM_TYPE, ::Katello::Repository::FILE_TYPE].freeze
14
+
15
+ encrypts :upstream_password
16
+
17
+ belongs_to :ssl_ca_cert, inverse_of: :ssl_ca_alternate_content_sources, class_name: "Katello::ContentCredential"
18
+ belongs_to :ssl_client_cert, inverse_of: :ssl_client_alternate_content_sources, class_name: "Katello::ContentCredential"
19
+ belongs_to :ssl_client_key, inverse_of: :ssl_key_alternate_content_sources, class_name: "Katello::ContentCredential"
20
+ belongs_to :http_proxy, inverse_of: :alternate_content_sources
21
+ has_many :smart_proxy_alternate_content_sources, dependent: :destroy,
22
+ inverse_of: :alternate_content_source
23
+ has_many :smart_proxies, through: :smart_proxy_alternate_content_sources
24
+
25
+ validates :base_url, if: :custom?, presence: true
26
+ validates :verify_ssl, if: :custom?, exclusion: [nil]
27
+ validates :alternate_content_source_type, inclusion: {
28
+ in: ->(_) { ACS_TYPES },
29
+ allow_blank: false,
30
+ message: ->(_, _) { _("is not a valid type. Must be one of the following: %s") % ACS_TYPES.join(',') }
31
+ }
32
+ validates :content_type, if: :custom?, inclusion: {
33
+ in: ->(_) { RepositoryTypeManager.defined_repository_types.keys & CONTENT_TYPES },
34
+ allow_blank: false,
35
+ message: ->(_, _) { _("is not allowed for ACS. Must be one of the following: %s") % (RepositoryTypeManager.defined_repository_types.keys & CONTENT_TYPES).join(',') }
36
+ }
37
+ validates_with Validators::AlternateContentSourcePathValidator, :attributes => [:base_url, :subpaths], :if => :custom?
38
+
39
+ scoped_search on: :name, complete_value: true
40
+ scoped_search on: :label, complete_value: true
41
+ scoped_search on: :description, complete_value: true
42
+ scoped_search on: :base_url, complete_value: true
43
+ scoped_search on: :subpath, ext_method: :search_by_subpath
44
+ scoped_search on: :content_type, complete_value: true
45
+ scoped_search on: :alternate_content_source_type, complete_value: true
46
+ scoped_search on: :upstream_username, complete_value: true
47
+ scoped_search on: :smart_proxy_id, relation: :smart_proxy_alternate_content_sources, validator: ScopedSearch::Validators::INTEGER, only_explicit: true
48
+
49
+ def backend_service(smart_proxy)
50
+ @service ||= ::Katello::Pulp3::AlternateContentSource.new(self, smart_proxy)
51
+ end
52
+
53
+ def custom?
54
+ alternate_content_source_type == 'custom'
55
+ end
56
+
57
+ def self.with_type(content_type)
58
+ where(content_type: content_type)
59
+ end
60
+
61
+ def self.search_by_subpath(_key, operator, value)
62
+ conditions = sanitize_sql_for_conditions(["? #{operator} ANY (subpaths)", value_to_sql(operator, value)])
63
+ { conditions: conditions }
64
+ end
65
+ end
66
+ end