katello 4.1.2 → 4.2.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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +20 -2
  3. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +2 -2
  4. data/app/controllers/katello/api/v2/content_credentials_controller.rb +3 -3
  5. data/app/controllers/katello/api/v2/content_uploads_controller.rb +5 -2
  6. data/app/controllers/katello/api/v2/content_view_components_controller.rb +33 -1
  7. data/app/controllers/katello/api/v2/content_views_controller.rb +12 -0
  8. data/app/controllers/katello/api/v2/host_errata_controller.rb +1 -1
  9. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -2
  10. data/app/controllers/katello/api/v2/products_controller.rb +4 -4
  11. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +3 -11
  12. data/app/controllers/katello/api/v2/repositories_controller.rb +69 -47
  13. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +0 -28
  14. data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +26 -5
  15. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +29 -2
  16. data/app/lib/actions/candlepin/environment/destroy.rb +2 -0
  17. data/app/lib/actions/katello/agent_action.rb +2 -2
  18. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +3 -2
  19. data/app/lib/actions/katello/{gpg_key → content_credential}/update.rb +1 -1
  20. data/app/lib/actions/katello/content_view/publish.rb +6 -1
  21. data/app/lib/actions/katello/content_view_version/create_repos.rb +1 -1
  22. data/app/lib/actions/katello/content_view_version/incremental_update.rb +0 -47
  23. data/app/lib/actions/katello/host/upload_package_profile.rb +7 -21
  24. data/app/lib/actions/katello/host/upload_profiles.rb +6 -52
  25. data/app/lib/actions/katello/orphan_cleanup/remove_orphans.rb +3 -1
  26. data/app/lib/actions/katello/repository/clone_contents.rb +1 -7
  27. data/app/lib/actions/katello/repository/clone_to_environment.rb +1 -7
  28. data/app/lib/actions/katello/repository/create.rb +9 -8
  29. data/app/lib/actions/katello/repository/create_root.rb +1 -1
  30. data/app/lib/actions/katello/repository/destroy.rb +1 -3
  31. data/app/lib/actions/katello/repository/import_upload.rb +9 -3
  32. data/app/lib/actions/katello/repository/instance_update.rb +1 -1
  33. data/app/lib/actions/katello/repository/metadata_generate.rb +2 -8
  34. data/app/lib/actions/katello/repository/multi_clone_contents.rb +0 -1
  35. data/app/lib/actions/katello/repository/refresh_repository.rb +1 -4
  36. data/app/lib/actions/katello/repository/remove_content.rb +6 -4
  37. data/app/lib/actions/katello/repository/sync.rb +5 -25
  38. data/app/lib/actions/katello/repository/update.rb +1 -2
  39. data/app/lib/actions/katello/repository/update_http_proxy_details.rb +2 -5
  40. data/app/lib/actions/katello/repository/update_redhat_repository.rb +1 -1
  41. data/app/lib/actions/katello/repository/upload_files.rb +13 -10
  42. data/app/lib/actions/katello/repository/upload_package_group.rb +2 -11
  43. data/app/lib/actions/katello/repository/verify_checksum.rb +0 -1
  44. data/app/lib/actions/katello/repository_set/enable_repository.rb +1 -1
  45. data/app/lib/actions/pulp3/orchestration/repository/create.rb +2 -2
  46. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +25 -4
  47. data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +17 -5
  48. data/app/lib/actions/pulp3/repository/commit_upload.rb +25 -2
  49. data/app/lib/actions/pulp3/repository/create.rb +4 -3
  50. data/app/lib/actions/pulp3/repository/create_remote.rb +1 -6
  51. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +5 -2
  52. data/app/lib/actions/pulp3/repository/repair.rb +4 -0
  53. data/app/lib/actions/pulp3/repository/save_artifact.rb +8 -1
  54. data/app/lib/actions/pulp3/repository/update_remote.rb +7 -4
  55. data/app/lib/actions/pulp3/repository/upload_file.rb +29 -3
  56. data/app/lib/katello/agent/base_message.rb +7 -4
  57. data/app/lib/katello/agent/update_package_message.rb +8 -0
  58. data/app/lib/katello/errors.rb +1 -0
  59. data/app/lib/katello/http_resource.rb +26 -73
  60. data/app/lib/katello/resources/candlepin/consumer.rb +1 -1
  61. data/app/lib/katello/resources/candlepin/environment.rb +2 -0
  62. data/app/lib/katello/resources/registry.rb +7 -20
  63. data/app/lib/katello/util/http_proxy.rb +0 -3
  64. data/app/lib/katello/validators/gpg_key_content_validator.rb +1 -1
  65. data/app/models/katello/authorization/{gpg_key.rb → content_credential.rb} +1 -1
  66. data/app/models/katello/authorization/product.rb +0 -4
  67. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  68. data/app/models/katello/concerns/host_managed_extensions.rb +15 -3
  69. data/app/models/katello/concerns/organization_extensions.rb +1 -1
  70. data/app/models/katello/concerns/pulp_database_unit.rb +13 -5
  71. data/app/models/katello/concerns/smart_proxy_extensions.rb +45 -41
  72. data/app/models/katello/{gpg_key.rb → content_credential.rb} +4 -4
  73. data/app/models/katello/content_view.rb +6 -1
  74. data/app/models/katello/content_view_repository.rb +3 -2
  75. data/app/models/katello/content_view_version.rb +5 -3
  76. data/app/models/katello/erratum.rb +2 -2
  77. data/app/models/katello/generic_content_unit.rb +16 -0
  78. data/app/models/katello/glue/pulp/repos.rb +8 -24
  79. data/app/models/katello/host/content_facet.rb +7 -2
  80. data/app/models/katello/kt_environment.rb +1 -1
  81. data/app/models/katello/product.rb +4 -4
  82. data/app/models/katello/repository.rb +14 -8
  83. data/app/models/katello/repository_generic_content_unit.rb +7 -0
  84. data/app/models/katello/root_repository.rb +45 -10
  85. data/app/models/setting/content.rb +8 -1
  86. data/app/services/cert/certs.rb +16 -8
  87. data/app/services/katello/applicability/applicable_content_helper.rb +2 -1
  88. data/app/services/katello/candlepin/consumer.rb +6 -0
  89. data/app/services/katello/component_view_presenter.rb +27 -0
  90. data/app/services/katello/host/package_profile_uploader.rb +41 -0
  91. data/app/services/katello/host/profiles_uploader.rb +74 -0
  92. data/app/services/katello/pulp/repository.rb +1 -1
  93. data/app/services/katello/pulp/server.rb +2 -2
  94. data/app/services/katello/pulp3/api/core.rb +8 -0
  95. data/app/services/katello/pulp3/api/generic.rb +68 -0
  96. data/app/services/katello/pulp3/generic_content_unit.rb +29 -0
  97. data/app/services/katello/pulp3/pulp_content_unit.rb +5 -1
  98. data/app/services/katello/pulp3/repository/ansible_collection.rb +5 -9
  99. data/app/services/katello/pulp3/repository/generic.rb +94 -0
  100. data/app/services/katello/pulp3/repository/yum.rb +21 -9
  101. data/app/services/katello/pulp3/repository.rb +63 -12
  102. data/app/services/katello/pulp3/repository_mirror.rb +2 -2
  103. data/app/services/katello/pulp3/smart_proxy_repository.rb +4 -4
  104. data/app/services/katello/registration_manager.rb +18 -5
  105. data/app/services/katello/repository_type.rb +59 -1
  106. data/app/services/katello/repository_type_manager.rb +116 -24
  107. data/app/views/katello/api/v2/content_views/base.json.rabl +4 -4
  108. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -0
  109. data/app/views/smart_proxies/plugins/_pulpcore.html.erb +3 -6
  110. data/app/views/smart_proxies/pulp_status.html.erb +0 -7
  111. data/config/katello.yaml.example +0 -21
  112. data/config/routes/api/v2.rb +2 -1
  113. data/db/functions/deb_version_cmp_v01.sql +200 -0
  114. data/db/migrate/20171110082124_add_ssl_certs_to_products_and_repos.rb +5 -1
  115. data/db/migrate/20200402130013_add_repsoitory_docker_meta_tag_f_key.rb +3 -1
  116. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +14 -4
  117. data/db/migrate/20210624221630_katello_generic_content.rb +22 -0
  118. data/db/migrate/20210625095042_add_retain_package_versions_count.rb +9 -0
  119. data/db/migrate/20210628182553_add_generic_remote_options_to_root_repository.rb +5 -0
  120. data/db/migrate/20210714140440_remove_repo_export_permission.rb +5 -0
  121. data/db/migrate/20210721163730_change_gpg_keys_to_content_credentials.rb +8 -0
  122. data/db/migrate/20210728130748_create_function_deb_version_cmp.rb +12 -0
  123. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -1
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +7 -5
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-errata-modal.controller.js +1 -0
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-errata-modal.html +4 -1
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-module-streams.html +1 -1
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details.html +1 -1
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +1 -1
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/views/apply-errata-confirm.html +1 -2
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +25 -33
  132. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/views/products-bulk-advanced-sync-modal.html +1 -1
  133. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +1 -6
  134. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +17 -2
  135. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +9 -0
  136. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +0 -2
  137. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-advanced-sync-options.html +1 -25
  138. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +1 -1
  139. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +33 -15
  140. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +6 -0
  141. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +11 -3
  142. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +0 -6
  143. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/aggregate-task.factory.js +3 -3
  144. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/task.factory.js +1 -1
  145. data/lib/katello/engine.rb +2 -4
  146. data/lib/katello/permission_creator.rb +6 -12
  147. data/lib/katello/plugin.rb +76 -80
  148. data/lib/katello/repository_types/python.rb +37 -0
  149. data/lib/katello/tasks/reimport.rake +0 -9
  150. data/lib/katello/tasks/repository.rake +4 -3
  151. data/lib/katello/tasks/upgrades/4.0/remove_ostree_puppet_content.rake +4 -2
  152. data/lib/katello/version.rb +1 -1
  153. data/locale/action_names.rb +28 -29
  154. data/locale/bn/katello.po +700 -222
  155. data/locale/bn/katello.po.time_stamp +0 -0
  156. data/locale/cs/katello.po +168 -60
  157. data/locale/cs/katello.po.time_stamp +0 -0
  158. data/locale/de/katello.po +586 -353
  159. data/locale/de/katello.po.time_stamp +0 -0
  160. data/locale/en/katello.po +168 -60
  161. data/locale/en/katello.po.time_stamp +0 -0
  162. data/locale/es/katello.po +1389 -1190
  163. data/locale/es/katello.po.time_stamp +0 -0
  164. data/locale/fr/katello.po +1741 -1495
  165. data/locale/fr/katello.po.time_stamp +0 -0
  166. data/locale/gu/katello.po +897 -417
  167. data/locale/gu/katello.po.time_stamp +0 -0
  168. data/locale/hi/katello.po +893 -416
  169. data/locale/hi/katello.po.time_stamp +0 -0
  170. data/locale/it/katello.po +372 -171
  171. data/locale/it/katello.po.time_stamp +0 -0
  172. data/locale/ja/katello.po +1658 -1440
  173. data/locale/ja/katello.po.time_stamp +0 -0
  174. data/locale/katello.pot +934 -737
  175. data/locale/kn/katello.po +895 -417
  176. data/locale/kn/katello.po.time_stamp +0 -0
  177. data/locale/ko/katello.po +516 -318
  178. data/locale/ko/katello.po.time_stamp +0 -0
  179. data/locale/mr/katello.po +858 -416
  180. data/locale/mr/katello.po.time_stamp +0 -0
  181. data/locale/or/katello.po +895 -417
  182. data/locale/or/katello.po.time_stamp +0 -0
  183. data/locale/pa/katello.po +875 -412
  184. data/locale/pa/katello.po.time_stamp +0 -0
  185. data/locale/pt/katello.po +348 -155
  186. data/locale/pt/katello.po.time_stamp +0 -0
  187. data/locale/pt_BR/katello.po +1399 -1216
  188. data/locale/pt_BR/katello.po.time_stamp +0 -0
  189. data/locale/ru/katello.po +672 -464
  190. data/locale/ru/katello.po.time_stamp +0 -0
  191. data/locale/ta/katello.po +698 -222
  192. data/locale/ta/katello.po.time_stamp +0 -0
  193. data/locale/te/katello.po +892 -416
  194. data/locale/te/katello.po.time_stamp +0 -0
  195. data/locale/zh_CN/katello.po +2030 -1846
  196. data/locale/zh_CN/katello.po.time_stamp +0 -0
  197. data/locale/zh_TW/katello.po +736 -408
  198. data/locale/zh_TW/katello.po.time_stamp +0 -0
  199. data/package.json +3 -1
  200. data/webpack/components/AddedStatusLabel.js +5 -0
  201. data/webpack/components/EditableTextInput/EditableTextInput.js +3 -3
  202. data/webpack/components/RoutedTabs/RoutedTabs.js +7 -8
  203. data/webpack/components/Table/TableWrapper.js +19 -11
  204. data/webpack/components/Table/helpers.js +1 -1
  205. data/webpack/components/extensions/HostDetails/Tabs/ContentTab.js +42 -0
  206. data/webpack/components/extensions/HostDetails/Tabs/SubscriptionTab.js +12 -0
  207. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +4 -0
  208. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  209. data/webpack/components/extensions/RegistrationCommands/index.js +1 -2
  210. data/webpack/components/pf3Table/formatters/selectionHeaderCellFormatter.js +2 -1
  211. data/webpack/fills_index.js +4 -1
  212. data/webpack/redux/actions/RedHatRepositories/helpers.js +2 -4
  213. data/webpack/redux/reducers/RedHatRepositories/enabled.js +4 -1
  214. data/webpack/scenes/ContentViews/ContentViewsActions.js +16 -1
  215. data/webpack/scenes/ContentViews/ContentViewsConstants.js +15 -0
  216. data/webpack/scenes/ContentViews/ContentViewsPage.js +12 -22
  217. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +4 -3
  218. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +25 -14
  219. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +4 -2
  220. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +153 -0
  221. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +21 -10
  222. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +157 -19
  223. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.fixtures.json +100 -108
  224. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +140 -16
  225. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/publishedContentViewDetails.fixtures.json +367 -0
  226. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +59 -6
  227. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +43 -0
  228. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +44 -13
  229. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +161 -0
  230. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +54 -0
  231. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterCreateResult.fixtures.json +124 -0
  232. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -6
  233. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +7 -6
  234. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +4 -3
  235. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +71 -12
  236. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +77 -0
  237. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +13 -12
  238. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  239. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +17 -14
  240. data/webpack/scenes/ContentViews/Details/Repositories/LastSync.js +3 -3
  241. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +2 -2
  242. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +6 -2
  243. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +61 -20
  244. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewTaskInProgressResponse.fixtures.json +71 -0
  245. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewTaskResponse.fixtures.json +75 -0
  246. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +86 -1
  247. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersionsWithTask.fixtures.json +713 -0
  248. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +3 -0
  249. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +184 -0
  250. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +104 -0
  251. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +71 -0
  252. data/webpack/scenes/ContentViews/Publish/ContentViewPublishSelectors.js +17 -0
  253. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +145 -0
  254. data/webpack/scenes/ContentViews/Publish/__tests__/environmentPaths.fixtures.json +352 -0
  255. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +184 -0
  256. data/webpack/scenes/ContentViews/Publish/__tests__/publishResponse.fixture.json +69 -0
  257. data/webpack/scenes/ContentViews/Publish/cvPublishForm.scss +3 -0
  258. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +76 -49
  259. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +15 -2
  260. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +6 -10
  261. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +22 -10
  262. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPathActions.js +12 -0
  263. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPathConstants.js +2 -0
  264. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPathSelectors.js +16 -0
  265. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +72 -0
  266. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +8 -0
  267. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +85 -0
  268. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +9 -8
  269. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +4 -25
  270. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -3
  271. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +3 -3
  272. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +4 -2
  273. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +24 -0
  274. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +4 -1
  275. data/webpack/scenes/Subscriptions/index.js +1 -4
  276. metadata +97 -38
  277. data/app/lib/actions/candlepin/environment/create.rb +0 -21
  278. data/app/lib/actions/foreman/environment/destroy.rb +0 -23
  279. data/app/lib/actions/katello/content_view/environment_create.rb +0 -21
  280. data/app/lib/actions/katello/repository/export.rb +0 -85
  281. data/app/lib/actions/katello/repository/purge_empty_content.rb +0 -16
  282. data/app/lib/actions/katello/repository/upload_errata.rb +0 -38
  283. data/app/lib/katello/util/proxy_uri.rb +0 -64
  284. data/app/models/katello/rhsm_fact_importer.rb +0 -20
  285. data/app/models/katello/rhsm_fact_name.rb +0 -17
  286. data/app/models/katello/rhsm_fact_parser.rb +0 -120
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e1df4c90d3b97976268e14d23a3a58a006ef9659059f029f4c5eff51099dca23
4
- data.tar.gz: 228835f2dff702bcef05b93738aca3248e94e03d7f1f8874eabf7648964f7d3f
3
+ metadata.gz: '0888b27382889ee155584abcf025ee49161afc59cd18d578a7fd517d5a50dae5'
4
+ data.tar.gz: 5e488c438f3a561d2b76eaf6d657842ec117efb95d887af8f7dfa040d265e5ae
5
5
  SHA512:
6
- metadata.gz: 73cff67750374c2235cbe78cfe11a3a0d8d1f86982d05bba2288eda2a416ff622466d089ea3a3633fa59b3cad27a28dfaf022c917e0809ebfdf741580d2199da
7
- data.tar.gz: b5478182ea63c8a1c0386c9952c40481bea38a549b7e93c7566016a39a08c43f7ac495a175d473ee9cf39fb85279725949326a1f8179dc20edfe05d195883d7a
6
+ metadata.gz: 7572571d4da028a2c7d8f1822632b1629a274ad6f0f21746f345f994ae60d04c4e5f8e22f3f2c848df6c809ba497d49487ccd491b4748ca31978926ee8ec9e9f
7
+ data.tar.gz: 6ef52bd64650d97097a29590bd8602045ec9e0c72978047be9e5f998bff112314f6be1028dc06f977682daea13ca1d270c4d0d13587e56dbabba8f5ea3e66c08
@@ -15,7 +15,16 @@ module Katello
15
15
  #param :id, String, :desc => N_("UUID of the consumer"), :required => true
16
16
  def upload_package_profile
17
17
  User.as_anonymous_admin do
18
- async_task(::Actions::Katello::Host::UploadPackageProfile, @host, request.raw_post)
18
+ if Setting['upload_profiles_without_dynflow']
19
+ uploader = ::Katello::Host::PackageProfileUploader.new(
20
+ host: @host,
21
+ profile_string: request.raw_post
22
+ )
23
+ uploader.upload
24
+ uploader.trigger_applicability_generation
25
+ else
26
+ async_task(::Actions::Katello::Host::UploadPackageProfile, @host, request.raw_post)
27
+ end
19
28
  end
20
29
  render :json => Resources::Candlepin::Consumer.get(@host.subscription_facet.uuid)
21
30
  end
@@ -24,7 +33,16 @@ module Katello
24
33
  param :id, String, :desc => N_("UUID of the consumer"), :required => true
25
34
  def upload_profiles
26
35
  User.as_anonymous_admin do
27
- async_task(::Actions::Katello::Host::UploadProfiles, @host, request.raw_post)
36
+ if Setting['upload_profiles_without_dynflow']
37
+ uploader = ::Katello::Host::ProfilesUploader.new(
38
+ host: @host,
39
+ profile_string: request.raw_post
40
+ )
41
+ uploader.upload
42
+ uploader.trigger_applicability_generation
43
+ else
44
+ async_task(::Actions::Katello::Host::UploadProfiles, @host, request.raw_post)
45
+ end
28
46
  end
29
47
  render :json => Resources::Candlepin::Consumer.get(@host.subscription_facet.uuid)
30
48
  end
@@ -48,7 +48,8 @@ module Katello
48
48
  end
49
49
 
50
50
  rescue_from RestClient::Exception do |e|
51
- Rails.logger.error pp_exception(e)
51
+ Rails.logger.error(pp_exception(e, with_backtrace: false))
52
+ Rails.logger.error(e.backtrace.detect { |line| line.match("katello.*controller") })
52
53
  if request_from_katello_cli?
53
54
  render :json => { :errors => [e.http_body] }, :status => e.http_code
54
55
  else
@@ -295,7 +296,6 @@ module Katello
295
296
  if facet.nil?
296
297
  # check with candlepin if consumer is Gone, raises RestClient::Gone
297
298
  User.as_anonymous_admin { Resources::Candlepin::Consumer.get(uuid) }
298
- fail HttpErrors::NotFound, _("Couldn't find consumer '%s'") % uuid
299
299
  end
300
300
  @host = ::Host::Managed.unscoped.find(facet.host_id)
301
301
  end
@@ -6,7 +6,7 @@ module Katello
6
6
  skip_before_action :check_media_type, :only => [:create, :content, :set_content]
7
7
 
8
8
  def resource_class
9
- Katello::GpgKey
9
+ Katello::ContentCredential
10
10
  end
11
11
 
12
12
  def_param_group :content_credential do
@@ -35,7 +35,7 @@ module Katello
35
35
  end
36
36
 
37
37
  def index_relation
38
- query = GpgKey.readable.where(:organization_id => @organization.id)
38
+ query = ContentCredential.readable.where(:organization_id => @organization.id)
39
39
  query = query.where(:name => params[:name]) if params[:name]
40
40
  query = query.where(:content_type => params[:content_type]) if params[:content_type]
41
41
  query
@@ -68,7 +68,7 @@ module Katello
68
68
  param :id, :number, :desc => N_('Content Credential ID'), :required => true
69
69
  param_group :content_credential
70
70
  def update
71
- sync_task(::Actions::Katello::GpgKey::Update, @content_credential, content_credential_params.to_h)
71
+ sync_task(::Actions::Katello::ContentCredential::Update, @content_credential, content_credential_params.to_h)
72
72
  respond_for_show(:resource => @content_credential)
73
73
  end
74
74
 
@@ -10,9 +10,12 @@ module Katello
10
10
  param :repository_id, :number, :required => true, :desc => N_("repository id")
11
11
  param :size, :number, :required => true, :desc => N_("Size of file to upload")
12
12
  param :checksum, String, :required => false, :desc => N_("Checksum of file to upload")
13
- param :content_type, RepositoryTypeManager.uploadable_content_types.map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
13
+ param :content_type, RepositoryTypeManager.uploadable_content_types(false).map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
14
14
  def create
15
- content_type = params[:content_type] || ::Katello::RepositoryTypeManager.find(@repository.content_type).default_managed_content_type.label
15
+ fail Katello::Errors::InvalidRepositoryContent, _("Cannot upload Ansible collections.") if @repository.ansible_collection?
16
+ content_type = params[:content_type] || ::Katello::RepositoryTypeManager.find(@repository.content_type)&.default_managed_content_type&.label
17
+ RepositoryTypeManager.check_content_matches_repo_type!(@repository, content_type)
18
+
16
19
  unit_type_id = SmartProxy.pulp_primary.content_service(content_type).content_type
17
20
  render :json => @repository.backend_content_service(::SmartProxy.pulp_primary).create_upload(params[:size], params[:checksum], unit_type_id)
18
21
  end
@@ -1,9 +1,10 @@
1
1
  module Katello
2
2
  class Api::V2::ContentViewComponentsController < Api::V2::ApiController
3
3
  include Katello::Concerns::FilteredAutoCompleteSearch
4
- before_action :find_composite_content_view, :only => [:show, :index]
4
+ before_action :find_composite_content_view, :only => [:show, :index, :show_all]
5
5
  before_action :find_composite_content_view_for_edit, :only => [:add_components, :remove_components, :update]
6
6
  before_action :find_authorized_katello_resource, :only => [:show, :update]
7
+ before_action :find_organization_from_cv, :only => [:show_all]
7
8
 
8
9
  wrap_parameters :include => %w(composite_content_view_id content_view_version_id content_view_id latest)
9
10
 
@@ -28,6 +29,33 @@ module Katello
28
29
  }
29
30
  end
30
31
 
32
+ # content_views/:id/components/show_all
33
+ # Shows all content views, added and available to add, for a content view
34
+ # Undocumented endpoint since the functionality exists in separate calls already.
35
+ # This was created for ease of pagination and search for the UI
36
+ # param :id, :number, desc: N_("Content View id"), required: true
37
+ # param :status, ["Added", "Not added", "All"], :desc => N_("Filter to show added, not added or all components")
38
+ def show_all
39
+ kc = Katello::ContentView.table_name
40
+ kcc = Katello::ContentViewComponent.table_name
41
+ join_query = <<-SQL
42
+ LEFT OUTER JOIN #{kcc}
43
+ ON #{kc}.id = #{kcc}.content_view_id
44
+ AND #{kcc}.composite_content_view_id = #{@view.id}
45
+ SQL
46
+ order_query = <<-SQL
47
+ CAST (#{kcc}.composite_content_view_id as BOOLEAN) ASC, #{kc}.name
48
+ SQL
49
+
50
+ query = Katello::ContentView.readable.in_organization(@organization)
51
+ query = query&.non_composite&.non_default
52
+ custom_sort = ->(sort_query) { sort_query.joins(join_query).order(order_query) }
53
+ options = { resource_class: Katello::ContentView, custom_sort: custom_sort }
54
+ collection = scoped_search(query, nil, nil, options)
55
+ collection[:results] = ComponentViewPresenter.component_presenter(@view, params[:status], views: collection[:results])
56
+ respond_for_index(:collection => collection, :template => "index")
57
+ end
58
+
31
59
  api :PUT, "/content_views/:composite_content_view_id/content_view_components/add",
32
60
  N_("Add components to the content view")
33
61
  param :composite_content_view_id, :number, :desc => N_("composite content view identifier"), :required => true
@@ -135,5 +163,9 @@ module Katello
135
163
  fail "Unsupported default_sort type"
136
164
  end
137
165
  end
166
+
167
+ def find_organization_from_cv
168
+ @organization = @view.organization
169
+ end
138
170
  end
139
171
  end
@@ -90,6 +90,8 @@ module Katello
90
90
  param :description, String, :desc => N_("Description for the new published content view version")
91
91
  param :major, :number, :desc => N_("Override the major version number"), :required => false
92
92
  param :minor, :number, :desc => N_("Override the minor version number"), :required => false
93
+ param :environment_ids, Array, :desc => N_("Identifiers for Lifecycle Environment"), :required => false
94
+ param :is_force_promote, :bool, :desc => N_("force content view promotion and bypass lifecycle environment restriction"), :required => false
93
95
  param :repos_units, Array, :desc => N_("Specify the list of units in each repo"), :required => false do
94
96
  param :label, String, :desc => N_("repo label"), :required => true
95
97
  param :rpm_filenames, Array, of: String, :desc => N_("list of rpm filename strings to include in published version"), :required => true
@@ -108,6 +110,8 @@ module Katello
108
110
  end
109
111
 
110
112
  task = async_task(::Actions::Katello::ContentView::Publish, @content_view, params[:description],
113
+ :environment_ids => params[:environment_ids],
114
+ :is_force_promote => params[:is_force_promote],
111
115
  :major => params[:major],
112
116
  :minor => params[:minor],
113
117
  :repos_units => params[:repos_units])
@@ -164,6 +168,14 @@ module Katello
164
168
  respond_for_async :resource => task
165
169
  end
166
170
 
171
+ api :PUT, "/content_views/:id/remove_filters", N_("Delete multiple filters from a content view")
172
+ param :id, :number, :desc => N_("content view numeric identifier"), :required => true
173
+ param :filter_ids, Array, of: :number, :desc => N_("filter identifiers"), :required => true
174
+ def remove_filters
175
+ Katello::ContentViewFilter.where(id: params[:filter_ids]).try(:destroy_all)
176
+ respond_for_show(:resource => @content_view)
177
+ end
178
+
167
179
  api :DELETE, "/content_views/:id", N_("Delete a content view")
168
180
  param :id, :number, :desc => N_("content view numeric identifier"), :required => true
169
181
  def destroy
@@ -53,7 +53,7 @@ module Katello
53
53
 
54
54
  api :PUT, "/hosts/:host_id/errata/apply", N_("Schedule errata for installation using katello-agent. %s") % katello_agent_deprecation_text, deprecated: true
55
55
  param :host_id, :number, :desc => N_("Host ID"), :required => true
56
- param :errata_ids, Array, :desc => N_("List of Errata ids to install. Will be removed in %s") % katello_agent_removal_release, required: false, deprecated: true
56
+ param :errata_ids, Array, :desc => N_("List of Errata ids to install. Will be removed in %s") % katello_agent_removal_release, required: true
57
57
 
58
58
  param_group :bulk_errata_ids
59
59
  def apply
@@ -53,8 +53,7 @@ module Katello
53
53
  param :ids, Array, :desc => N_("List of product ids"), :required => true
54
54
  def verify_checksum_products
55
55
  repairable_products = @products.syncable
56
- repairable_roots = RootRepository.where(:product_id => repairable_products).
57
- where(:content_type => ::Katello::Repository::YUM_TYPE).has_url.select { |r| r.library_instance }.uniq
56
+ repairable_roots = RootRepository.where(:product_id => repairable_products).has_url.select { |r| r.library_instance }.uniq
58
57
 
59
58
  repairable_repositories = Katello::Repository.where(:root_id => repairable_roots)
60
59
  task = async_task(::Actions::BulkAction,
@@ -150,7 +150,7 @@ module Katello
150
150
  def authorize_gpg_key
151
151
  gpg_key_id = product_params[:gpg_key_id]
152
152
  if gpg_key_id
153
- gpg_key = GpgKey.readable.where(:id => gpg_key_id, :organization_id => @organization).first
153
+ gpg_key = ContentCredential.readable.where(:id => gpg_key_id, :organization_id => @organization).first
154
154
  throw_resource_not_found(name: 'gpg key', id: gpg_key_id) if gpg_key.nil?
155
155
  end
156
156
  end
@@ -158,7 +158,7 @@ module Katello
158
158
  def authorize_ssl_ca_cert
159
159
  ssl_ca_cert_id = product_params[:ssl_ca_cert_id]
160
160
  if ssl_ca_cert_id
161
- ssl_ca_cert = GpgKey.readable.where(:id => ssl_ca_cert_id, :organization_id => @organization).first
161
+ ssl_ca_cert = ContentCredential.readable.where(:id => ssl_ca_cert_id, :organization_id => @organization).first
162
162
  throw_resource_not_found(name: 'ssl ca cert', id: ssl_ca_cert_id) if ssl_ca_cert.nil?
163
163
  end
164
164
  end
@@ -166,7 +166,7 @@ module Katello
166
166
  def authorize_ssl_client_cert
167
167
  ssl_client_cert_id = product_params[:ssl_client_cert_id]
168
168
  if ssl_client_cert_id
169
- ssl_client_cert = GpgKey.readable.where(:id => ssl_client_cert_id, :organization_id => @organization).first
169
+ ssl_client_cert = ContentCredential.readable.where(:id => ssl_client_cert_id, :organization_id => @organization).first
170
170
  throw_resource_not_found(name: 'ssl client cert', id: ssl_client_cert_id) if ssl_client_cert.nil?
171
171
  end
172
172
  end
@@ -174,7 +174,7 @@ module Katello
174
174
  def authorize_ssl_client_key
175
175
  ssl_client_key_id = product_params[:ssl_client_key_id]
176
176
  if ssl_client_key_id
177
- ssl_client_key = GpgKey.readable.where(:id => ssl_client_key_id, :organization_id => @organization).first
177
+ ssl_client_key = ContentCredential.readable.where(:id => ssl_client_key_id, :organization_id => @organization).first
178
178
  throw_resource_not_found(name: 'ssl client key', id: ssl_client_key_id) if ssl_client_key.nil?
179
179
  end
180
180
  end
@@ -7,7 +7,6 @@ module Katello
7
7
  def destroy_repositories
8
8
  deletion_authorized_repositories = @repositories.deletable
9
9
  unpromoted_repos = deletion_authorized_repositories.reject { |repo| repo.promoted? }
10
- deletable_repositories = unpromoted_repos.reject { |repo| repo.redhat? }
11
10
 
12
11
  messages1 = format_bulk_action_messages(
13
12
  :success => "",
@@ -23,18 +22,11 @@ module Katello
23
22
  :authorized => unpromoted_repos
24
23
  )
25
24
 
26
- messages3 = format_bulk_action_messages(
27
- :success => "",
28
- :error => _("Repository %s cannot be deleted since they are Red Hat repositories."),
29
- :models => unpromoted_repos,
30
- :authorized => deletable_repositories
31
- )
32
-
33
- errors = messages3[:error] + messages1[:error] + messages2[:error]
25
+ errors = messages1[:error] + messages2[:error]
34
26
 
35
27
  task = nil
36
- if deletable_repositories.count > 0
37
- task = async_task(::Actions::BulkAction, ::Actions::Katello::Repository::Destroy, deletable_repositories)
28
+ if unpromoted_repos.any?
29
+ task = async_task(::Actions::BulkAction, ::Actions::Katello::Repository::Destroy, unpromoted_repos)
38
30
  else
39
31
  status = 400
40
32
  end
@@ -2,7 +2,14 @@ module Katello
2
2
  class Api::V2::RepositoriesController < Api::V2::ApiController # rubocop:disable Metrics/ClassLength
3
3
  include Katello::Concerns::FilteredAutoCompleteSearch
4
4
 
5
- wrap_parameters :repository, :include => RootRepository.attribute_names.concat([:ignore_global_proxy])
5
+ generic_repo_wrap_params = []
6
+ RepositoryTypeManager.generic_remote_options(defined_only: true).each do |option|
7
+ generic_repo_wrap_params << option.name
8
+ end
9
+
10
+ repo_wrap_params = RootRepository.attribute_names.concat([:ignore_global_proxy]) + generic_repo_wrap_params
11
+
12
+ wrap_parameters :repository, :include => repo_wrap_params
6
13
 
7
14
  CONTENT_CREDENTIAL_GPG_KEY_TYPE = "gpg_key".freeze
8
15
  CONTENT_CREDENTIAL_SSL_CA_CERT_TYPE = "ssl_ca_cert".freeze
@@ -14,13 +21,12 @@ module Katello
14
21
  before_action :find_product_for_create, :only => [:create]
15
22
  before_action :find_organization_from_product, :only => [:create]
16
23
  before_action :find_unauthorized_katello_resource, :only => [:gpg_key_content]
17
- before_action :find_authorized_katello_resource, :only => [:show, :update, :destroy, :sync, :export,
24
+ before_action :find_authorized_katello_resource, :only => [:show, :update, :destroy, :sync,
18
25
  :remove_content, :upload_content, :republish,
19
26
  :import_uploads, :verify_checksum]
20
27
  before_action :find_content, :only => :remove_content
21
28
  before_action :find_organization_from_repo, :only => [:update]
22
29
  before_action :error_on_rh_product, :only => [:create]
23
- before_action :error_on_rh_repo, :only => [:destroy]
24
30
  before_action(:only => [:create, :update]) { find_content_credential CONTENT_CREDENTIAL_GPG_KEY_TYPE }
25
31
  before_action(:only => [:create, :update]) { find_content_credential CONTENT_CREDENTIAL_SSL_CA_CERT_TYPE }
26
32
  before_action(:only => [:create, :update]) { find_content_credential CONTENT_CREDENTIAL_SSL_CLIENT_CERT_TYPE }
@@ -62,12 +68,17 @@ module Katello
62
68
  param :http_proxy_policy, ::Katello::RootRepository::HTTP_PROXY_POLICIES, :desc => N_("policies for HTTP proxy for content sync")
63
69
  param :http_proxy_id, :number, :desc => N_("ID of a HTTP Proxy")
64
70
  param :arch, String, :desc => N_("Architecture of content in the repository")
71
+ param :retain_package_versions_count, :number, :desc => N_("The maximum number of versions of each package to keep.")
72
+
73
+ RepositoryTypeManager.generic_remote_options(defined_only: true).each do |option|
74
+ param option.name, option.type, :desc => N_(option.description)
75
+ end
65
76
  end
66
77
 
67
78
  def_param_group :repo_create do
68
79
  param :label, String, :required => false
69
80
  param :product_id, :number, :required => true, :desc => N_("Product the repository belongs to")
70
- param :content_type, RepositoryTypeManager.creatable_repository_types.keys, :required => true, :desc => N_("type of repo")
81
+ param :content_type, RepositoryTypeManager.creatable_repository_types(false).keys, :required => true, :desc => N_("type of repo")
71
82
  end
72
83
 
73
84
  api :GET, "/repositories", N_("List of enabled repositories")
@@ -89,13 +100,13 @@ module Katello
89
100
  param :ostree_branch_id, String, :desc => N_("Id of an ostree branch to find repositories that contain that branch")
90
101
  param :library, :bool, :desc => N_("show repositories in Library and the default content view")
91
102
  param :archived, :bool, :desc => N_("show archived repositories")
92
- param :content_type, RepositoryTypeManager.repository_types.keys, :desc => N_("limit to only repositories of this type")
103
+ param :content_type, RepositoryTypeManager.defined_repository_types.keys, :desc => N_("limit to only repositories of this type")
93
104
  param :name, String, :desc => N_("name of the repository"), :required => false
94
105
  param :label, String, :desc => N_("label of the repository"), :required => false
95
106
  param :description, String, :desc => N_("description of the repository")
96
107
  param :available_for, String, :desc => N_("interpret specified object to return only Repositories that can be associated with specified object. Only 'content_view' & 'content_view_version' are supported."),
97
108
  :required => false
98
- param :with_content, RepositoryTypeManager.enabled_content_types, :desc => N_("only repositories having at least one of the specified content type ex: rpm , erratum")
109
+ param :with_content, RepositoryTypeManager.enabled_content_types(false), :desc => N_("only repositories having at least one of the specified content type ex: rpm , erratum")
99
110
  param :download_policy, ::Runcible::Models::YumImporter::DOWNLOAD_POLICIES, :desc => N_("limit to only repositories with this download policy")
100
111
  param :username, String, :desc => N_("only show the repositories readable by this user with this username")
101
112
  param_group :search, Api::V2::ApiController
@@ -217,8 +228,9 @@ module Katello
217
228
  param_group :repo
218
229
  def create
219
230
  repo_params = repository_params
220
- unless RepositoryTypeManager.creatable_by_user?(repo_params[:content_type])
221
- msg = _("Invalid params provided - content_type must be one of %s") % RepositoryTypeManager.creatable_repository_types.keys.join(",")
231
+ unless RepositoryTypeManager.creatable_by_user?(repo_params[:content_type], false)
232
+ msg = _("Invalid params provided - content_type must be one of %s") %
233
+ RepositoryTypeManager.creatable_repository_types(false).keys.join(",")
222
234
  fail HttpErrors::UnprocessableEntity, msg
223
235
  end
224
236
 
@@ -246,7 +258,7 @@ module Katello
246
258
  param :creatable, :bool, :desc => N_("When set to 'True' repository types that are creatable will be returned")
247
259
  def repository_types
248
260
  creatable = ::Foreman::Cast.to_bool(params[:creatable])
249
- repo_types = creatable ? RepositoryTypeManager.creatable_repository_types : RepositoryTypeManager.repository_types
261
+ repo_types = creatable ? RepositoryTypeManager.creatable_repository_types : RepositoryTypeManager.enabled_repository_types
250
262
  render :json => repo_types.values
251
263
  end
252
264
 
@@ -301,36 +313,6 @@ module Katello
301
313
  raise HttpErrors::BadRequest, e.message
302
314
  end
303
315
 
304
- api :POST, "/repositories/:id/export", N_("Export a repository")
305
- param :id, :number, :desc => N_("Repository identifier"), :required => true
306
- param :export_to_iso, :bool, :desc => N_("Export to ISO format"), :required => false
307
- param :iso_mb_size, :number, :desc => N_("maximum size of each ISO in MB"), :required => false
308
- param :since, Date, :desc => N_("Optional date of last export (ex: 2010-01-01T12:00:00Z)"), :required => false
309
- def export
310
- if params[:export_to_iso].blank? && params[:iso_mb_size].present?
311
- fail HttpErrors::BadRequest, _("ISO export must be enabled when specifying ISO size")
312
- end
313
-
314
- if params[:since].present?
315
- begin
316
- params[:since].to_datetime
317
- rescue
318
- raise HttpErrors::BadRequest, _("Invalid date provided.")
319
- end
320
- end
321
-
322
- fail HttpErrors::BadRequest, _("Repository content type must be 'yum' to export.") unless @repository.content_type == 'yum'
323
-
324
- fail HttpErrors::BadRequest, _("On demand repositories cannot be exported.") if @repository.download_policy == ::Runcible::Models::YumImporter::DOWNLOAD_ON_DEMAND
325
-
326
- task = async_task(::Actions::Katello::Repository::Export, [@repository],
327
- ::Foreman::Cast.to_bool(params[:export_to_iso]),
328
- params[:since].try(:to_datetime),
329
- params[:iso_mb_size],
330
- @repository.pulp_id)
331
- respond_for_async :resource => task
332
- end
333
-
334
316
  api :PUT, "/repositories/:id", N_("Update a repository")
335
317
  param :id, :number, :required => true, :desc => N_("repository ID")
336
318
  param :name, String, :required => false
@@ -339,6 +321,14 @@ module Katello
339
321
  def update
340
322
  repo_params = repository_params
341
323
 
324
+ if @repository.generic?
325
+ generic_remote_options = generic_remote_options_hash(repo_params)
326
+ repo_params[:generic_remote_options] = generic_remote_options.to_json
327
+ RepositoryTypeManager.generic_remote_options.each do |option|
328
+ repo_params&.delete(option.name)
329
+ end
330
+ end
331
+
342
332
  sync_task(::Actions::Katello::Repository::Update, @repository.root, repo_params)
343
333
  respond_for_show(:resource => @repository)
344
334
  end
@@ -356,7 +346,7 @@ module Katello
356
346
  desc "Remove content from a repository"
357
347
  param :id, :number, :required => true, :desc => "repository ID"
358
348
  param 'ids', Array, :required => true, :desc => "Array of content ids to remove"
359
- param :content_type, RepositoryTypeManager.removable_content_types.map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
349
+ param :content_type, RepositoryTypeManager.removable_content_types(false).map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
360
350
  param 'sync_capsule', :bool, :desc => N_("Whether or not to sync an external capsule after upload. Default: true")
361
351
  def remove_content
362
352
  sync_capsule = ::Foreman::Cast.to_bool(params.fetch(:sync_capsule, true))
@@ -367,9 +357,10 @@ module Katello
367
357
  api :POST, "/repositories/:id/upload_content", N_("Upload content into the repository")
368
358
  param :id, :number, :required => true, :desc => N_("repository ID")
369
359
  param :content, File, :required => true, :desc => N_("Content files to upload. Can be a single file or array of files.")
370
- param :content_type, RepositoryTypeManager.uploadable_content_types.map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
360
+ param :content_type, RepositoryTypeManager.uploadable_content_types(false).map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
371
361
  def upload_content
372
362
  fail Katello::Errors::InvalidRepositoryContent, _("Cannot upload Container Image content.") if @repository.docker?
363
+ fail Katello::Errors::InvalidRepositoryContent, _("Cannot upload Ansible collections.") if @repository.ansible_collection?
373
364
 
374
365
  filepaths = Array.wrap(params[:content]).compact.collect do |content|
375
366
  {path: content.path, filename: content.original_filename}
@@ -396,7 +387,7 @@ module Katello
396
387
  param :async, :bool, desc: N_("Do not wait for the ImportUpload action to finish. Default: false")
397
388
  param 'publish_repository', :bool, :desc => N_("Whether or not to regenerate the repository on disk. Default: true")
398
389
  param 'sync_capsule', :bool, :desc => N_("Whether or not to sync an external capsule after upload. Default: true")
399
- param :content_type, RepositoryTypeManager.uploadable_content_types.map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
390
+ param :content_type, RepositoryTypeManager.uploadable_content_types(false).map(&:label), :required => false, :desc => N_("content type ('deb', 'docker_manifest', 'file', 'ostree', 'rpm', 'srpm')")
400
391
  param :uploads, Array, :desc => N_("Array of uploads to import") do
401
392
  param 'id', String, :required => true
402
393
  param 'content_unit_id', String
@@ -461,7 +452,7 @@ module Katello
461
452
  credential_var = "@#{content_type}"
462
453
 
463
454
  if params[credential_id]
464
- credential_value = GpgKey.readable.where(:id => params[credential_id], :organization_id => @organization).first
455
+ credential_value = ContentCredential.readable.where(:id => params[credential_id], :organization_id => @organization).first
465
456
  instance_variable_set(credential_var, credential_value)
466
457
  if instance_variable_get(credential_var).nil?
467
458
  fail HttpErrors::NotFound, _("Couldn't find %{content_type} with id '%{id}'") % { :content_type => content_type, :id => params[credential_id] }
@@ -469,16 +460,29 @@ module Katello
469
460
  end
470
461
  end
471
462
 
463
+ # rubocop:disable Metrics/CyclomaticComplexity
472
464
  def repository_params
473
465
  keys = [:download_policy, :mirror_on_sync, :arch, :verify_ssl_on_sync, :upstream_password, :upstream_username, :download_concurrency,
474
466
  :ostree_upstream_sync_depth, :ostree_upstream_sync_policy, {:os_versions => []},
475
- :deb_releases, :deb_components, :deb_architectures, :description, :http_proxy_policy, :http_proxy_id,
467
+ :deb_releases, :deb_components, :deb_architectures, :description, :http_proxy_policy, :http_proxy_id, :retain_package_versions_count,
476
468
  {:ignorable_content => []}
477
469
  ]
478
470
 
479
471
  keys += [{:docker_tags_whitelist => []}, :docker_upstream_name] if params[:action] == 'create' || @repository&.docker?
480
472
  keys += [:ansible_collection_requirements, :ansible_collection_auth_url, :ansible_collection_auth_token] if params[:action] == 'create' || @repository&.ansible_collection?
481
473
  keys += [:label, :content_type] if params[:action] == "create"
474
+
475
+ if params[:action] == 'create' || @repository&.generic?
476
+ RepositoryTypeManager.generic_remote_options.each do |option|
477
+ if option.type == Array
478
+ keys += [{option.name => []}]
479
+ elsif option.type == Hash
480
+ keys += [{option.name => {}}]
481
+ else
482
+ keys += [option.name]
483
+ end
484
+ end
485
+ end
482
486
  if params[:action] == 'create' || @repository.custom?
483
487
  keys += [:url, :gpg_key_id, :ssl_ca_cert_id, :ssl_client_cert_id, :ssl_client_key_id, :unprotected, :name,
484
488
  :checksum_type]
@@ -496,8 +500,8 @@ module Katello
496
500
  credential_value
497
501
  end
498
502
 
499
- # rubocop:disable Metrics/CyclomaticComplexity
500
503
  # rubocop:disable Metrics/PerceivedComplexity
504
+ # rubocop:disable Metrics/MethodLength
501
505
  def construct_repo_from_params(repo_params) # rubocop:disable Metrics/AbcSize
502
506
  root = @product.add_repo(repo_params.slice(:label, :name, :description, :url, :content_type, :arch, :unprotected,
503
507
  :gpg_key, :ssl_ca_cert, :ssl_client_cert, :ssl_client_key,
@@ -512,6 +516,12 @@ module Katello
512
516
  root.http_proxy_policy = repo_params[:http_proxy_policy] if repo_params.key?(:http_proxy_policy)
513
517
  root.http_proxy_id = repo_params[:http_proxy_id] if repo_params.key?(:http_proxy_id)
514
518
  root.os_versions = repo_params.fetch(:os_versions, []) if root.yum?
519
+ root.retain_package_versions_count = repo_params[:retain_package_versions_count] if root.yum? && repo_params.key?(:retain_package_versions_count)
520
+
521
+ if root.generic?
522
+ generic_remote_options = generic_remote_options_hash(repo_params)
523
+ root.generic_remote_options = generic_remote_options.to_json
524
+ end
515
525
 
516
526
  if root.ostree?
517
527
  root.ostree_upstream_sync_policy = repo_params[:ostree_upstream_sync_policy]
@@ -550,11 +560,15 @@ module Katello
550
560
  end
551
561
 
552
562
  def find_content
553
- if params[:content_type]
554
- @content = @repository.units_for_removal(params[:ids], params[:content_type])
563
+ content_type = params[:content_type]
564
+
565
+ if content_type
566
+ @content = @repository.units_for_removal(params[:ids], content_type)
555
567
  else
556
568
  @content = @repository.units_for_removal(params[:ids])
557
569
  end
570
+
571
+ RepositoryTypeManager.check_content_matches_repo_type!(@repository, @content.first.class::CONTENT_TYPE)
558
572
  end
559
573
 
560
574
  def filter_by_content_view(query, content_view_id, environment_id, is_available_for)
@@ -573,5 +587,13 @@ module Katello
573
587
  end
574
588
  query
575
589
  end
590
+
591
+ def generic_remote_options_hash(repo_params)
592
+ generic_remote_options = {}
593
+ RepositoryTypeManager.generic_remote_options(content_type: repo_params[:content_type]).each do |option|
594
+ generic_remote_options[option.name] = repo_params[option.name]
595
+ end
596
+ generic_remote_options
597
+ end
576
598
  end
577
599
  end