katello 4.13.0 → 4.14.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 (341) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js +12 -8
  3. data/app/assets/javascripts/katello/locale/bn/katello.js +274 -22
  4. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +274 -22
  5. data/app/assets/javascripts/katello/locale/ca/katello.js +274 -22
  6. data/app/assets/javascripts/katello/locale/cs/katello.js +274 -22
  7. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +275 -23
  8. data/app/assets/javascripts/katello/locale/de/katello.js +280 -28
  9. data/app/assets/javascripts/katello/locale/de_AT/katello.js +274 -22
  10. data/app/assets/javascripts/katello/locale/de_DE/katello.js +274 -22
  11. data/app/assets/javascripts/katello/locale/el/katello.js +274 -22
  12. data/app/assets/javascripts/katello/locale/en/katello.js +274 -22
  13. data/app/assets/javascripts/katello/locale/en_GB/katello.js +274 -22
  14. data/app/assets/javascripts/katello/locale/en_US/katello.js +274 -22
  15. data/app/assets/javascripts/katello/locale/es/katello.js +276 -24
  16. data/app/assets/javascripts/katello/locale/et_EE/katello.js +274 -22
  17. data/app/assets/javascripts/katello/locale/fr/katello.js +283 -31
  18. data/app/assets/javascripts/katello/locale/gl/katello.js +274 -22
  19. data/app/assets/javascripts/katello/locale/gu/katello.js +274 -22
  20. data/app/assets/javascripts/katello/locale/he_IL/katello.js +274 -22
  21. data/app/assets/javascripts/katello/locale/hi/katello.js +274 -22
  22. data/app/assets/javascripts/katello/locale/id/katello.js +274 -22
  23. data/app/assets/javascripts/katello/locale/it/katello.js +274 -22
  24. data/app/assets/javascripts/katello/locale/ja/katello.js +283 -31
  25. data/app/assets/javascripts/katello/locale/ka/katello.js +280 -28
  26. data/app/assets/javascripts/katello/locale/kn/katello.js +274 -22
  27. data/app/assets/javascripts/katello/locale/ko/katello.js +274 -22
  28. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +274 -22
  29. data/app/assets/javascripts/katello/locale/mr/katello.js +274 -22
  30. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +274 -22
  31. data/app/assets/javascripts/katello/locale/or/katello.js +274 -22
  32. data/app/assets/javascripts/katello/locale/pa/katello.js +274 -22
  33. data/app/assets/javascripts/katello/locale/pl/katello.js +274 -22
  34. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +274 -22
  35. data/app/assets/javascripts/katello/locale/pt/katello.js +274 -22
  36. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +276 -24
  37. data/app/assets/javascripts/katello/locale/ro/katello.js +274 -22
  38. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +274 -22
  39. data/app/assets/javascripts/katello/locale/ru/katello.js +274 -22
  40. data/app/assets/javascripts/katello/locale/sl/katello.js +274 -22
  41. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +274 -22
  42. data/app/assets/javascripts/katello/locale/ta/katello.js +274 -22
  43. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +274 -22
  44. data/app/assets/javascripts/katello/locale/te/katello.js +274 -22
  45. data/app/assets/javascripts/katello/locale/tr/katello.js +274 -22
  46. data/app/assets/javascripts/katello/locale/vi/katello.js +274 -22
  47. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +274 -22
  48. data/app/assets/javascripts/katello/locale/zh/katello.js +274 -22
  49. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +283 -31
  50. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +274 -22
  51. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +118 -74
  52. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +15 -2
  53. data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -1
  54. data/app/controllers/katello/api/v2/api_controller.rb +7 -0
  55. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -4
  56. data/app/controllers/katello/api/v2/debs_controller.rb +3 -2
  57. data/app/controllers/katello/api/v2/environments_controller.rb +2 -4
  58. data/app/controllers/katello/api/v2/host_contents_controller.rb +8 -3
  59. data/app/controllers/katello/api/v2/host_errata_controller.rb +4 -4
  60. data/app/controllers/katello/api/v2/host_packages_controller.rb +2 -2
  61. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -1
  62. data/app/controllers/katello/api/v2/packages_controller.rb +13 -3
  63. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +6 -2
  64. data/app/controllers/katello/api/v2/repositories_controller.rb +3 -4
  65. data/app/controllers/katello/api/v2/repository_sets_controller.rb +13 -14
  66. data/app/controllers/katello/api/v2/subscriptions_controller.rb +15 -9
  67. data/app/controllers/katello/api/v2/sync_controller.rb +2 -2
  68. data/app/controllers/katello/application_controller.rb +1 -1
  69. data/app/controllers/katello/concerns/api/v2/authorization.rb +3 -2
  70. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +28 -0
  71. data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +1 -1
  72. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +4 -3
  73. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +2 -4
  74. data/app/controllers/katello/remote_execution_controller.rb +53 -58
  75. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +19 -2
  76. data/app/helpers/katello/katello_urls_helper.rb +1 -1
  77. data/app/lib/actions/katello/alternate_content_source/alternate_content_source_common.rb +1 -1
  78. data/app/lib/actions/katello/alternate_content_source/update.rb +2 -1
  79. data/app/lib/actions/katello/capsule_content/verify_checksum.rb +1 -2
  80. data/app/lib/actions/katello/content_view/publish.rb +1 -0
  81. data/app/lib/actions/katello/content_view_version/create_repos.rb +1 -0
  82. data/app/lib/actions/katello/content_view_version/incremental_update.rb +3 -2
  83. data/app/lib/actions/katello/environment/{publish_repositories.rb → publish_container_repositories.rb} +10 -8
  84. data/app/lib/actions/katello/foreman/content_update.rb +4 -6
  85. data/app/lib/actions/katello/host/hypervisors_update.rb +6 -4
  86. data/app/lib/actions/katello/repository/create.rb +4 -4
  87. data/app/lib/actions/katello/repository/discover.rb +11 -4
  88. data/app/lib/actions/katello/repository/import_upload.rb +4 -6
  89. data/app/lib/actions/katello/repository/metadata_generate.rb +1 -0
  90. data/app/lib/actions/katello/repository/update.rb +3 -3
  91. data/app/lib/actions/katello/repository_set/enable_repository.rb +5 -6
  92. data/app/lib/actions/middleware/backend_services_check.rb +3 -2
  93. data/app/lib/actions/pulp3/abstract_async_task.rb +2 -4
  94. data/app/lib/actions/pulp3/capsule_content/verify_checksum.rb +1 -2
  95. data/app/lib/actions/pulp3/orchestration/repository/copy_all_units.rb +5 -1
  96. data/app/lib/actions/pulp3/orchestration/repository/delete.rb +5 -2
  97. data/app/lib/actions/pulp3/repository/create_publication.rb +4 -0
  98. data/app/lib/actions/pulp3/repository/save_version.rb +3 -5
  99. data/app/lib/katello/concerns/base_template_scope_extensions.rb +5 -9
  100. data/app/lib/katello/errors.rb +1 -0
  101. data/app/lib/katello/http_resource.rb +1 -0
  102. data/app/lib/katello/lazy_accessor.rb +1 -1
  103. data/app/lib/katello/repo_discovery.rb +4 -190
  104. data/app/lib/katello/resources/candlepin/candlepin_ping.rb +0 -5
  105. data/app/lib/katello/resources/candlepin/owner.rb +1 -1
  106. data/app/lib/katello/resources/candlepin/pool.rb +1 -2
  107. data/app/lib/katello/resources/candlepin/upstream_job.rb +1 -1
  108. data/app/lib/katello/resources/cdn.rb +3 -2
  109. data/app/lib/katello/resources/discovery/container.rb +127 -0
  110. data/app/lib/katello/resources/discovery/yum.rb +95 -0
  111. data/app/lib/katello/util/cdn_var_substitutor.rb +5 -3
  112. data/app/lib/katello/util/data.rb +3 -2
  113. data/app/lib/katello/util/errata.rb +4 -3
  114. data/app/lib/katello/util/package.rb +3 -3
  115. data/app/lib/katello/util/path_with_substitutions.rb +1 -1
  116. data/app/lib/katello/util/report_table.rb +3 -2
  117. data/app/lib/katello/util/url_matcher.rb +1 -1
  118. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +4 -3
  119. data/app/lib/katello/validators/alternate_content_source_products_validator.rb +5 -7
  120. data/app/lib/katello/validators/container_image_name_validator.rb +1 -1
  121. data/app/lib/katello/validators/katello_name_format_validator.rb +2 -2
  122. data/app/lib/katello/validators/no_trailing_space_validator.rb +2 -2
  123. data/app/lib/katello/validators/prior_validator.rb +2 -2
  124. data/app/lib/katello/validators/product_unique_attribute_validator.rb +2 -4
  125. data/app/models/katello/activation_key.rb +4 -6
  126. data/app/models/katello/alternate_content_source.rb +1 -1
  127. data/app/models/katello/authorization/host_tracer.rb +1 -2
  128. data/app/models/katello/candlepin/repository_mapper.rb +2 -2
  129. data/app/models/katello/concerns/host_managed_extensions.rb +41 -10
  130. data/app/models/katello/concerns/hostgroup_extensions.rb +2 -4
  131. data/app/models/katello/concerns/location_extensions.rb +2 -4
  132. data/app/models/katello/concerns/operatingsystem_extensions.rb +84 -16
  133. data/app/models/katello/concerns/smart_proxy_extensions.rb +4 -4
  134. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +2 -0
  135. data/app/models/katello/content_view.rb +5 -1
  136. data/app/models/katello/content_view_environment.rb +19 -4
  137. data/app/models/katello/content_view_environment_content_facet.rb +11 -0
  138. data/app/models/katello/erratum.rb +1 -1
  139. data/app/models/katello/event.rb +1 -1
  140. data/app/models/katello/glue/provider.rb +1 -2
  141. data/app/models/katello/hash_util.rb +1 -1
  142. data/app/models/katello/host/content_facet.rb +16 -3
  143. data/app/models/katello/host/subscription_facet.rb +27 -4
  144. data/app/models/katello/host_collection.rb +12 -8
  145. data/app/models/katello/pool.rb +5 -1
  146. data/app/models/katello/product.rb +7 -4
  147. data/app/models/katello/provider.rb +1 -2
  148. data/app/models/katello/repository.rb +18 -4
  149. data/app/models/katello/root_repository.rb +29 -0
  150. data/app/models/katello/rpm.rb +2 -2
  151. data/app/models/katello/subscription_facet_pool.rb +1 -1
  152. data/app/models/katello/sync_plan.rb +5 -4
  153. data/app/models/katello/task_status.rb +18 -18
  154. data/app/presenters/katello/product_host_count_presenter.rb +10 -0
  155. data/app/services/katello/candlepin/consumer.rb +11 -11
  156. data/app/services/katello/candlepin/message_handler.rb +3 -2
  157. data/app/services/katello/content_unit_indexer.rb +6 -0
  158. data/app/services/katello/pulp3/alternate_content_source.rb +1 -3
  159. data/app/services/katello/pulp3/api/core.rb +1 -1
  160. data/app/services/katello/pulp3/api/docker.rb +10 -0
  161. data/app/services/katello/pulp3/content_view_version/export.rb +1 -0
  162. data/app/services/katello/pulp3/content_view_version/import.rb +6 -4
  163. data/app/services/katello/pulp3/content_view_version/importable_products.rb +1 -3
  164. data/app/services/katello/pulp3/repository/apt.rb +4 -16
  165. data/app/services/katello/pulp3/repository/yum.rb +9 -5
  166. data/app/services/katello/pulp3/repository.rb +2 -2
  167. data/app/services/katello/pulp3/repository_mirror.rb +2 -9
  168. data/app/services/katello/pulp3/task.rb +4 -2
  169. data/app/services/katello/registration_manager.rb +13 -3
  170. data/app/services/katello/repository_type.rb +1 -1
  171. data/app/services/katello/smart_proxy_helper.rb +1 -0
  172. data/app/views/dashboard/_host_collection_widget.html.erb +5 -4
  173. data/app/views/foreman/job_templates/install_errata.erb +2 -0
  174. data/app/views/foreman/job_templates/install_errata_-_katello_ansible_default.erb +2 -0
  175. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +2 -0
  176. data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +3 -1
  177. data/app/views/foreman/job_templates/install_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  178. data/app/views/foreman/job_templates/remove_packages_by_search_query_-_katello_ansible_default.erb +2 -2
  179. data/app/views/foreman/job_templates/resolve_traces.erb +5 -1
  180. data/app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  181. data/app/views/foreman/job_templates/upload_profile.erb +2 -0
  182. data/app/views/foreman/smart_proxies/_reclaim_space.html.erb +7 -5
  183. data/app/views/katello/api/v2/content_facet/base.json.rabl +18 -2
  184. data/app/views/katello/api/v2/packages/thindex.json.rabl +6 -0
  185. data/app/views/katello/api/v2/repositories/show.json.rabl +8 -8
  186. data/app/views/katello/api/v2/repository_sets/show.json.rabl +1 -1
  187. data/app/views/katello/api/v2/subscription_facet/base.json.rabl +1 -1
  188. data/app/views/katello/api/v2/subscriptions/index.json.rabl +1 -0
  189. data/app/views/katello/api/v2/subscriptions/show.json.rabl +1 -0
  190. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +14 -11
  191. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +4 -4
  192. data/config/initializers/monkeys.rb +0 -1
  193. data/config/routes/api/v2.rb +3 -1
  194. data/config/routes.rb +1 -3
  195. data/db/migrate/20160114200145_add_mirror_on_sync_to_repositories.rb +1 -0
  196. data/db/migrate/20160131182301_add_download_policy_to_katello_repositories.rb +1 -0
  197. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +3 -0
  198. data/db/migrate/20240522165308_add_priority_to_content_view_environment_content_facet.rb +5 -0
  199. data/db/migrate/20240621121212_katello_repository_debs_id_bigint.rb +6 -0
  200. data/db/migrate/20240729192228_add_convert2rhel_to_host_facets.rb +9 -0
  201. data/db/seeds.d/102-organizations.rb +5 -7
  202. data/db/seeds.d/150-module_job_templates.rb +7 -9
  203. data/db/seeds.d/75-job_templates.rb +9 -16
  204. data/engines/bastion_katello/README.md +3 -0
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-errata.controller.js +3 -3
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +6 -6
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/views/erratum-content-hosts.html +2 -2
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -4
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +6 -6
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +31 -27
  211. data/engines/bastion_katello/lib/bastion_katello/engine.rb +2 -2
  212. data/lib/katello/engine.rb +1 -8
  213. data/lib/katello/permission_creator.rb +3 -2
  214. data/lib/katello/plugin.rb +31 -27
  215. data/lib/katello/repository_types/docker.rb +1 -0
  216. data/lib/katello/repository_types/yum.rb +1 -0
  217. data/lib/katello/tasks/clean_old_file_repos.rake +2 -4
  218. data/lib/katello/tasks/reset.rake +3 -4
  219. data/lib/katello/version.rb +1 -1
  220. data/lib/katello.rb +0 -4
  221. data/lib/monkeys/ar_postgres_evr_t.rb +2 -0
  222. data/locale/action_names.rb +1 -1
  223. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/bn/katello.po +274 -22
  225. data/locale/bn_IN/katello.po +274 -22
  226. data/locale/ca/katello.po +274 -22
  227. data/locale/cs/katello.po +274 -22
  228. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  229. data/locale/cs_CZ/katello.po +275 -23
  230. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/de/katello.po +280 -28
  232. data/locale/de_AT/katello.po +274 -22
  233. data/locale/de_DE/katello.po +274 -22
  234. data/locale/el/katello.po +274 -22
  235. data/locale/en/katello.po +274 -22
  236. data/locale/en_GB/katello.po +274 -22
  237. data/locale/en_US/katello.po +274 -22
  238. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  239. data/locale/es/katello.po +276 -24
  240. data/locale/et_EE/katello.po +274 -22
  241. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/fr/katello.po +283 -31
  243. data/locale/gl/katello.po +274 -22
  244. data/locale/gu/katello.po +274 -22
  245. data/locale/he_IL/katello.po +274 -22
  246. data/locale/hi/katello.po +274 -22
  247. data/locale/id/katello.po +274 -22
  248. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/it/katello.po +274 -22
  250. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  251. data/locale/ja/katello.po +283 -31
  252. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  253. data/locale/ka/katello.po +280 -28
  254. data/locale/katello.pot +1001 -527
  255. data/locale/kn/katello.po +274 -22
  256. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  257. data/locale/ko/katello.po +274 -22
  258. data/locale/ml_IN/katello.po +274 -22
  259. data/locale/mr/katello.po +274 -22
  260. data/locale/nl_NL/katello.po +274 -22
  261. data/locale/or/katello.po +274 -22
  262. data/locale/pa/katello.po +274 -22
  263. data/locale/pl/katello.po +274 -22
  264. data/locale/pl_PL/katello.po +274 -22
  265. data/locale/pt/katello.po +274 -22
  266. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/pt_BR/katello.po +276 -24
  268. data/locale/ro/katello.po +274 -22
  269. data/locale/ro_RO/katello.po +274 -22
  270. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/ru/katello.po +274 -22
  272. data/locale/sl/katello.po +274 -22
  273. data/locale/sv_SE/katello.po +274 -22
  274. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  275. data/locale/ta/katello.po +274 -22
  276. data/locale/ta_IN/katello.po +274 -22
  277. data/locale/te/katello.po +274 -22
  278. data/locale/tr/katello.po +274 -22
  279. data/locale/vi/katello.po +274 -22
  280. data/locale/vi_VN/katello.po +274 -22
  281. data/locale/zh/katello.po +274 -22
  282. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  283. data/locale/zh_CN/katello.po +283 -31
  284. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  285. data/locale/zh_TW/katello.po +274 -22
  286. data/webpack/ForemanColumnExtensions/index.js +44 -1
  287. data/webpack/components/Table/TableWrapper.js +6 -0
  288. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +24 -3
  289. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +124 -56
  290. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +2 -3
  291. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViewDetailsCard.test.js +44 -10
  292. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +75 -31
  293. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  294. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +1 -1
  295. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +22 -7
  296. data/webpack/components/extensions/Hosts/ActionsBar/ActionsBar.scss +14 -0
  297. data/webpack/components/extensions/Hosts/ActionsBar/index.js +82 -23
  298. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js +5 -2
  299. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/02_BulkErrataTable.js +171 -0
  300. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_Review.js +160 -0
  301. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +99 -0
  302. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/BulkErrataWizard.js +157 -0
  303. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/index.js +24 -0
  304. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/02_BulkPackagesTable.js +157 -0
  305. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_Review.js +168 -0
  306. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +141 -0
  307. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +252 -0
  308. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/index.js +24 -0
  309. data/webpack/components/extensions/Hosts/BulkActions/HostReview.js +176 -0
  310. data/webpack/components/extensions/Hosts/TableRowActions/index.js +17 -0
  311. data/webpack/global_index.js +11 -3
  312. data/webpack/redux/actions/RedHatRepositories/repositorySetRepositories.js +5 -6
  313. data/webpack/redux/reducers/RedHatRepositories/__tests__/repositorySetRepositories.test.js +1 -1
  314. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +1 -1
  315. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +2 -1
  316. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +2 -1
  317. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -1
  318. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
  319. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +2 -1
  320. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -2
  321. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +2 -1
  322. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -2
  323. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +2 -1
  324. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +2 -1
  325. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +2 -1
  326. data/webpack/scenes/ContentViews/components/ContentViewSelect/ContentViewSelectOption.js +2 -2
  327. data/webpack/scenes/Subscriptions/Details/SubscriptionAttributes.js +1 -0
  328. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetailInfo.test.js.snap +10 -0
  329. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +6 -0
  330. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +2 -0
  331. data/webpack/scenes/Subscriptions/__tests__/subscriptions.fixtures.js +14 -0
  332. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableHelpers.js +1 -0
  333. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +10 -0
  334. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.fixtures.js +1 -0
  335. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/__snapshots__/SubscriptionsToolbar.test.js.snap +10 -0
  336. data/webpack/scenes/Tasks/helpers.js +1 -1
  337. metadata +49 -29
  338. data/app/assets/javascripts/katello/containers/container.js +0 -304
  339. data/db/migrate/20240531193030_remove_sha1_repository_checksum_type.rb +0 -10
  340. data/lib/monkeys/anemone.rb +0 -33
  341. data/webpack/utils/useKatelloDocUrl.js +0 -18
@@ -11,8 +11,7 @@ module Katello
11
11
 
12
12
  module Overrides
13
13
  def refresh
14
- errors = super
15
- errors
14
+ super
16
15
  end
17
16
  end
18
17
 
@@ -254,10 +253,11 @@ module Katello
254
253
  end
255
254
 
256
255
  def pulp3_ssl_configuration(config, connection_adapter = Faraday.default_adapter)
257
- if connection_adapter == :excon
256
+ case connection_adapter
257
+ when :excon
258
258
  config.ssl_client_cert = ::Cert::Certs.ssl_client_cert_filename
259
259
  config.ssl_client_key = ::Cert::Certs.ssl_client_key_filename
260
- elsif connection_adapter == :net_http
260
+ when :net_http
261
261
  config.ssl_client_cert = ::Cert::Certs.ssl_client_cert
262
262
  config.ssl_client_key = ::Cert::Certs.ssl_client_key
263
263
  else
@@ -28,6 +28,7 @@ module Katello
28
28
  scoped_search :on => :registered_through, :relation => :subscription_facet, :complete_value => true, :only_explicit => true
29
29
  scoped_search :on => :registered_at, :relation => :subscription_facet, :rename => :registered_at, :only_explicit => true
30
30
  scoped_search :on => :uuid, :relation => :subscription_facet, :rename => :subscription_uuid, :only_explicit => true
31
+ scoped_search :on => :convert2rhel_through_foreman, :relation => :subscription_facet, :only_explicit => true
31
32
  scoped_search :relation => :activation_keys, :on => :name, :rename => :activation_key, :complete_value => true, :ext_method => :find_by_activation_key
32
33
  scoped_search :relation => :activation_keys, :on => :id, :rename => :activation_key_id, :complete_value => true, :ext_method => :find_by_activation_key_id,
33
34
  :only_explicit => true, :validator => ScopedSearch::Validators::INTEGER
@@ -42,6 +43,7 @@ module Katello
42
43
  end
43
44
 
44
45
  def update_candlepin_associations(consumer_params = nil)
46
+ Rails.logger.debug "Updating Candlepin associations for host #{name}"
45
47
  content_facet.cves_changed = false if content_facet
46
48
  content_facet&.save!
47
49
 
@@ -712,6 +712,7 @@ module Katello
712
712
  end
713
713
 
714
714
  def check_remove_from_environment!(env)
715
+ check_orphaned_content_facets!(environments: [env])
715
716
  errors = []
716
717
 
717
718
  dependencies = { hosts: _("hosts"),
@@ -730,6 +731,7 @@ module Katello
730
731
  end
731
732
 
732
733
  def check_ready_to_destroy!
734
+ check_orphaned_content_facets!(environments: self.environments)
733
735
  errors = []
734
736
 
735
737
  dependencies = { environments: _("environments"),
@@ -862,7 +864,9 @@ module Katello
862
864
  }
863
865
 
864
866
  table = Audit.arel_table
865
- repository_condition = table[:auditable_id].eq(id).and(audited_changes_like.call("repository_ids"))
867
+ repository_condition = table[:auditable_id].eq(id)
868
+ .and(table[:auditable_type].eq('Katello::ContentView'))
869
+ .and(audited_changes_like.call("repository_ids"))
866
870
 
867
871
  cv_repository_condition = table[:auditable_id].in(cv_repository_ids)
868
872
  .and(table[:auditable_type].eq('Katello::Repository'))
@@ -24,12 +24,23 @@ module Katello
24
24
  before_save :generate_info
25
25
 
26
26
  scope :non_default, -> { joins(:content_view).where("katello_content_views.default" => false) }
27
+ scope :default, -> { joins(:content_view).where("katello_content_views.default" => true) }
27
28
  alias :lifecycle_environment :environment
28
29
 
29
30
  def self.for_content_facets(content_facets)
30
31
  joins(:content_view_environment_content_facets, :content_facets).where("#{Katello::ContentViewEnvironmentContentFacet.table_name}.content_facet_id" => content_facets).uniq
31
32
  end
32
33
 
34
+ def self.with_candlepin_name(cp_name, organization: Organization.current)
35
+ lce_name, cv_name = cp_name.split('/')
36
+ if cv_name.blank? && lce_name == 'Library'
37
+ return default.find_by(
38
+ environment: ::Katello::KTEnvironment.library.where(organization: organization)&.first
39
+ )
40
+ end
41
+ joins(:environment, :content_view).where("#{Katello::KTEnvironment.table_name}.label" => lce_name, "#{Katello::ContentView.table_name}.label" => cv_name).first
42
+ end
43
+
33
44
  # retrieve the owning environment for this content view environment.
34
45
  def owner
35
46
  self.environment
@@ -47,10 +58,14 @@ module Katello
47
58
  content_view.default? && environment.library?
48
59
  end
49
60
 
50
- # TODO: uncomment when we need to start showing multiple CVE names in UI
51
- # def candlepin_name
52
- # "#{environment.label}/#{content_view.label}"
53
- # end
61
+ def candlepin_name
62
+ return environment.label if default_environment?
63
+ "#{environment.label}/#{content_view.label}"
64
+ end
65
+
66
+ def priority(content_facet)
67
+ content_view_environment_content_facets.find_by(:content_facet_id => content_facet.id).try(:priority)
68
+ end
54
69
 
55
70
  private
56
71
 
@@ -3,6 +3,8 @@ module Katello
3
3
  belongs_to :content_view_environment, :class_name => "::Katello::ContentViewEnvironment", :inverse_of => :content_view_environment_content_facets
4
4
  belongs_to :content_facet, :class_name => "::Katello::Host::ContentFacet", :inverse_of => :content_view_environment_content_facets
5
5
 
6
+ default_scope { order(:priority => :asc) }
7
+
6
8
  validates :content_view_environment_id, presence: true
7
9
  validates :content_facet_id, presence: true, unless: :new_record?
8
10
  validate :ensure_valid_content_source, if: proc { Setting['validate_host_lce_content_source_coherence'] }
@@ -19,5 +21,14 @@ module Katello
19
21
  errors.add(:base, error_msg)
20
22
  end
21
23
  end
24
+
25
+ def self.reprioritize_for_content_facet(content_facet, new_cves)
26
+ new_order = new_cves.map do |cve|
27
+ content_facet.content_view_environment_content_facets.find_by(:content_view_environment_id => cve.id)
28
+ end
29
+ new_order.compact.each_with_index do |cvecf, index|
30
+ cvecf.update_column(:priority, index)
31
+ end
32
+ end
22
33
  end
23
34
  end
@@ -67,7 +67,7 @@ module Katello
67
67
  end
68
68
 
69
69
  def self.applicable_to_hosts(hosts)
70
- # Note: ContentFacetErrata actually holds the "Applicable Errata" to that host
70
+ # NOTE: ContentFacetErrata actually holds the "Applicable Errata" to that host
71
71
  # It is not the errata "belonging" to the host. Its rather the errata that is "applicable"
72
72
  # which is calculated elsewhere.
73
73
 
@@ -1,7 +1,7 @@
1
1
  module Katello
2
2
  class Event < Katello::Model
3
3
  validate :validate_event_type
4
- # Note: Do not use active record call backs or dependent references on this class
4
+ # NOTE: Do not use active record call backs or dependent references on this class
5
5
  # Direct deletes are made in EventQueue#clear_events (instead of destroys).
6
6
 
7
7
  serialize :metadata, Hash
@@ -34,7 +34,7 @@ module Katello
34
34
  API_URL = 'https://subscription.rhsm.redhat.com/subscription/consumers/'.freeze
35
35
  def api_url(upstream = {})
36
36
  # Default to Red Hat
37
- upstream['apiUrl'] || API_URL
37
+ ENV['REDHAT_RHSM_API_URL'] || upstream['apiUrl'] || API_URL
38
38
  end
39
39
 
40
40
  def sync
@@ -65,7 +65,6 @@ module Katello
65
65
  Rails.logger.error "Upstream identity certificate not available"
66
66
  fail _("Upstream identity certificate not available")
67
67
  end
68
-
69
68
  params = {}
70
69
  params[:capabilities] = Resources::Candlepin::CandlepinPing.ping['managerCapabilities'].inject([]) do |result, element|
71
70
  result << {'name' => element}
@@ -16,7 +16,7 @@ module Katello
16
16
  subhash = hash[params.first]
17
17
  # If we don't have a subhash don't try and recurse down
18
18
  if !subhash.nil? && !subhash.empty?
19
- self.null_safe_get(subhash, default, params[1..-1])
19
+ self.null_safe_get(subhash, default, params[1..])
20
20
  else
21
21
  default
22
22
  end
@@ -64,6 +64,7 @@ module Katello
64
64
  end
65
65
 
66
66
  def mark_cves_changed(_cve)
67
+ Rails.logger.debug("ContentFacet: Marking CVEs changed for host #{host&.to_label}")
67
68
  self.cves_changed = true
68
69
  end
69
70
 
@@ -99,6 +100,17 @@ module Katello
99
100
  content_view_environments&.first&.lifecycle_environment
100
101
  end
101
102
 
103
+ def content_view_environments=(new_cves)
104
+ if new_cves.length > 1 && !Setting['allow_multiple_content_views']
105
+ fail ::Katello::Errors::MultiEnvironmentNotSupportedError,
106
+ _("Assigning a host to multiple content view environments is not enabled.")
107
+ end
108
+ super(new_cves)
109
+ Katello::ContentViewEnvironmentContentFacet.reprioritize_for_content_facet(self, new_cves)
110
+ self.content_view_environments.reload unless self.new_record?
111
+ self.host&.update_candlepin_associations unless self.host&.new_record?
112
+ end
113
+
102
114
  # rubocop:disable Metrics/CyclomaticComplexity
103
115
  def assign_single_environment(
104
116
  content_view_id: nil, lifecycle_environment_id: nil, environment_id: nil,
@@ -126,9 +138,10 @@ module Katello
126
138
  end
127
139
 
128
140
  def default_environment?
129
- content_view_environments.any? do |cve|
130
- cve.content_view.default? && cve.lifecycle_environment.library?
131
- end
141
+ return if content_view_environments.blank?
142
+ # if default cve is first, this is equivalent to default being the only one.
143
+ # if default cve is not first, candlepin will prioritize CV repos over library repos in case of conflicts.
144
+ content_view_environments.first.default_environment?
132
145
  end
133
146
 
134
147
  def update_repositories_by_paths(paths)
@@ -162,10 +162,22 @@ module Katello
162
162
  end
163
163
  end
164
164
 
165
+ def candlepin_environments_cp_ids
166
+ candlepin_environments.map { |e| e[:id] }
167
+ end
168
+
165
169
  def content_view_environments
166
170
  self.host.content_facet.try(:content_view_environments)
167
171
  end
168
172
 
173
+ def consumer_cve_order_from_candlepin
174
+ Katello::Resources::Candlepin::Consumer.get(uuid)['environments'].map { |e| e['id'] }
175
+ end
176
+
177
+ def cves_ordered_correctly?
178
+ consumer_cve_order_from_candlepin == candlepin_environments_cp_ids
179
+ end
180
+
169
181
  def organization
170
182
  self.host.organization
171
183
  end
@@ -229,10 +241,8 @@ module Katello
229
241
  setting_fact = Setting[:register_hostname_fact]
230
242
  only_use_custom_fact = Setting[:register_hostname_fact_strict_match]
231
243
 
232
- if !setting_fact.blank? && !facts[setting_fact].blank?
233
- if only_use_custom_fact || ::Host.where(:name => setting_fact.downcase).any?
234
- facts[setting_fact]
235
- end
244
+ if !setting_fact.blank? && !facts[setting_fact].blank? && (only_use_custom_fact || ::Host.where(:name => setting_fact.downcase).any?)
245
+ facts[setting_fact]
236
246
  end
237
247
  end
238
248
 
@@ -287,6 +297,19 @@ module Katello
287
297
  false
288
298
  end
289
299
 
300
+ def self.populate_fields_from_facts(host, parser, _type, _source_proxy)
301
+ has_convert2rhel = parser.facts.key?('conversions.env.CONVERT2RHEL_THROUGH_FOREMAN')
302
+ return unless host.subscription_facet || has_convert2rhel
303
+ # Add in custom convert2rhel fact if system was converted using convert2rhel through Katello
304
+ # We want the value nil unless the custom fact is present otherwise we get a 0 in the database which if debugging
305
+ # might make you think it was converted2rhel but not with satellite, that is why I have the tenary below.
306
+ facet = host.subscription_facet || host.build_subscription_facet
307
+ facet.attributes = {
308
+ convert2rhel_through_foreman: has_convert2rhel ? ::Foreman::Cast.to_bool(parser.facts['conversions.env.CONVERT2RHEL_THROUGH_FOREMAN']) : nil
309
+ }.compact
310
+ facet.save unless facet.new_record?
311
+ end
312
+
290
313
  private
291
314
 
292
315
  def update_status(status_class, **args)
@@ -58,8 +58,12 @@ module Katello
58
58
  consumer_ids
59
59
  end
60
60
 
61
- def errata(type = nil)
62
- query = Erratum.joins(:content_facets).where("#{Katello::Host::ContentFacet.table_name}.host_id" => self.host_ids)
61
+ def errata(type = nil, installable_only: false)
62
+ query = if installable_only
63
+ Katello::Erratum.installable_for_hosts(self.hosts)
64
+ else
65
+ Katello::Erratum.applicable_to_hosts(self.hosts)
66
+ end
63
67
  type ? query.of_type(type) : query
64
68
  end
65
69
 
@@ -95,16 +99,16 @@ module Katello
95
99
  return host_collections_hash[:critical].to_a, host_collections_hash[:warning].to_a, host_collections_hash[:ok].to_a
96
100
  end
97
101
 
98
- def security_updates?
99
- errata(Erratum::SECURITY).any?
102
+ def security_updates?(installable_only: false)
103
+ errata(Erratum::SECURITY, installable_only: installable_only).any?
100
104
  end
101
105
 
102
- def bugzilla_updates?
103
- errata(Erratum::BUGZILLA).any?
106
+ def bugzilla_updates?(installable_only: false)
107
+ errata(Erratum::BUGZILLA, installable_only: installable_only).any?
104
108
  end
105
109
 
106
- def enhancement_updates?
107
- errata(Erratum::ENHANCEMENT).any?
110
+ def enhancement_updates?(installable_only: false)
111
+ errata(Erratum::ENHANCEMENT, installable_only: installable_only).any?
108
112
  end
109
113
 
110
114
  def self.humanize_class_name(_name = nil)
@@ -55,6 +55,10 @@ module Katello
55
55
 
56
56
  validate :subscription_matches_organization
57
57
 
58
+ def product_host_count
59
+ Katello::Host::ContentFacet.joins(bound_repositories: { product: :pools }).where(pools: { id: id }).distinct.count
60
+ end
61
+
58
62
  def subscription_matches_organization
59
63
  return if errors[:subscription].any? || errors[:organization].any? # let other validations catch this
60
64
  unless subscription&.organization_id == self.organization_id
@@ -147,7 +151,7 @@ module Katello
147
151
  property :days_until_expiration, Integer, desc: 'Returns number of days until expiration'
148
152
  end
149
153
  class Jail < ::Safemode::Jail
150
- allow :id, :name, :available, :quantity, :product_id, :contract_number, :type, :account_number, :start_date, :end_date, :organization, :consumed, :days_until_expiration
154
+ allow :id, :name, :available, :quantity, :product_id, :contract_number, :type, :account_number, :start_date, :end_date, :organization, :consumed, :days_until_expiration, :product_host_count
151
155
  end
152
156
  end
153
157
  end
@@ -84,6 +84,10 @@ module Katello
84
84
 
85
85
  before_create :assign_unique_label
86
86
 
87
+ def acs_compatible_repositories
88
+ repositories.has_url.not_uln.library
89
+ end
90
+
87
91
  def orphaned?
88
92
  self.pool_products.empty?
89
93
  end
@@ -122,13 +126,12 @@ module Katello
122
126
  options = {} if options.nil?
123
127
 
124
128
  hash = super(options.merge(:except => [:cp_id, :id]))
125
- hash = hash.merge(:multiplier => self.multiplier,
129
+ hash.merge(:multiplier => self.multiplier,
126
130
  :attributes => self.attrs,
127
131
  :id => self.cp_id,
128
132
  :sync_plan_name => self.sync_plan ? self.sync_plan.name : nil,
129
133
  :sync_state => self.sync_state,
130
134
  :last_sync => self.last_sync)
131
- hash
132
135
  end
133
136
 
134
137
  def redhat?
@@ -168,8 +171,8 @@ module Katello
168
171
  self.label = Util::Model.labelize(self.name) if self.label.blank?
169
172
 
170
173
  # if the object label is already being used in this org, append the id to make it unique
171
- if Product.all_in_org(self.organization).where("#{Katello::Product.table_name}.label = ?", self.label).count > 0
172
- self.label = self.label + "_" + self.cp_id unless self.cp_id.blank?
174
+ if Product.all_in_org(self.organization).where("#{Katello::Product.table_name}.label = ?", self.label).count > 0 && !self.cp_id.blank?
175
+ self.label = self.label + "_" + self.cp_id
173
176
  end
174
177
  end
175
178
 
@@ -84,9 +84,8 @@ module Katello
84
84
  def serializable_hash(options = {})
85
85
  options = {} if options.nil?
86
86
  hash = super(options)
87
- hash = hash.merge(:sync_state => self.sync_state,
87
+ hash.merge(:sync_state => self.sync_state,
88
88
  :last_sync => self.last_sync)
89
- hash
90
89
  end
91
90
 
92
91
  def manifest_task
@@ -32,6 +32,8 @@ module Katello
32
32
 
33
33
  EXPORTABLE_TYPES = [YUM_TYPE, FILE_TYPE, ANSIBLE_COLLECTION_TYPE, DOCKER_TYPE, DEB_TYPE].freeze
34
34
 
35
+ ALLOWED_UPDATE_FIELDS = ['version_href', 'last_indexed'].freeze
36
+
35
37
  define_model_callbacks :sync, :only => :after
36
38
 
37
39
  belongs_to :root, :inverse_of => :repositories, :class_name => "Katello::RootRepository"
@@ -119,8 +121,10 @@ module Katello
119
121
 
120
122
  before_validation :set_pulp_id
121
123
  before_validation :set_container_repository_name, :unless => :skip_container_name?
124
+ before_update :prevent_updates, :unless => :allow_updates?
122
125
 
123
126
  scope :has_url, -> { joins(:root).where.not("#{RootRepository.table_name}.url" => nil) }
127
+ scope :not_uln, -> { joins(:root).where("#{RootRepository.table_name}.url NOT LIKE 'uln%'") }
124
128
  scope :on_demand, -> { joins(:root).where("#{RootRepository.table_name}.download_policy" => ::Katello::RootRepository::DOWNLOAD_ON_DEMAND) }
125
129
  scope :immediate, -> { joins(:root).where("#{RootRepository.table_name}.download_policy" => ::Katello::RootRepository::DOWNLOAD_IMMEDIATE) }
126
130
  scope :non_immediate, -> { joins(:root).where.not("#{RootRepository.table_name}.download_policy" => ::Katello::RootRepository::DOWNLOAD_IMMEDIATE) }
@@ -166,7 +170,7 @@ module Katello
166
170
  scoped_search :on => :name, :relation => :product, :rename => :product_name
167
171
  scoped_search :on => :id, :relation => :product, :rename => :product_id, :only_explicit => true
168
172
  scoped_search :on => :label, :relation => :root, :complete_value => true, :only_explicit => true
169
- scoped_search :on => :content_label, :ext_method => :search_by_content_label
173
+ scoped_search :on => :content_label, :ext_method => :search_by_content_label, :default_operator => :like
170
174
 
171
175
  delegate :product, :redhat?, :custom?, :to => :root
172
176
  delegate :yum?, :docker?, :deb?, :file?, :ostree?, :ansible_collection?, :generic?, :to => :root
@@ -179,7 +183,7 @@ module Katello
179
183
  :deb_components, :deb_architectures, :ssl_ca_cert_id, :ssl_ca_cert, :ssl_client_cert, :ssl_client_cert_id,
180
184
  :ssl_client_key_id, :os_versions, :ssl_client_key, :ignorable_content, :description, :include_tags, :exclude_tags,
181
185
  :ansible_collection_requirements, :ansible_collection_auth_url, :ansible_collection_auth_token,
182
- :http_proxy_policy, :http_proxy_id, :to => :root
186
+ :http_proxy_policy, :http_proxy_id, :prevent_updates, :to => :root
183
187
 
184
188
  delegate :content_id, to: :root, allow_nil: true
185
189
  delegate :repository_type, to: :root
@@ -345,9 +349,10 @@ module Katello
345
349
  def content_counts
346
350
  content_counts = {}
347
351
  RepositoryTypeManager.defined_repository_types[content_type].content_types_to_index.each do |content_type|
348
- if content_type&.model_class::CONTENT_TYPE == DockerTag::CONTENT_TYPE
352
+ case content_type&.model_class::CONTENT_TYPE
353
+ when DockerTag::CONTENT_TYPE
349
354
  content_counts[DockerTag::CONTENT_TYPE] = docker_tags.count
350
- elsif content_type&.model_class::CONTENT_TYPE == GenericContentUnit::CONTENT_TYPE
355
+ when GenericContentUnit::CONTENT_TYPE
351
356
  content_counts[content_type.content_type] = content_type&.model_class&.in_repositories(self)&.where(:content_type => content_type.content_type)&.count
352
357
  else
353
358
  content_counts[content_type.label] = content_type&.model_class&.in_repositories(self)&.count
@@ -791,6 +796,8 @@ module Katello
791
796
  return true
792
797
  elsif !self.custom? && self.redhat_deletable?(remove_from_content_view_versions)
793
798
  return true
799
+ elsif Setting.find_by(name: 'delete_repo_across_cv')&.value
800
+ return true
794
801
  else
795
802
  errors.add(:base, _("Repository cannot be deleted since it has already been included in a published Content View. " \
796
803
  "Please delete all Content View versions containing this repository before attempting to delete it "\
@@ -1007,6 +1014,7 @@ module Katello
1007
1014
  repository_type.index_additional_data_proc&.call(self)
1008
1015
  end
1009
1016
  self.update!(last_indexed: DateTime.now)
1017
+
1010
1018
  true
1011
1019
  end
1012
1020
 
@@ -1048,6 +1056,12 @@ module Katello
1048
1056
  DockerMetaTag.cleanup_tags
1049
1057
  end
1050
1058
 
1059
+ def allow_updates?
1060
+ # allow the update if this repo is not in the default view
1061
+ return true unless in_default_view?
1062
+ root.allow_updates?(::Katello::Repository::ALLOWED_UPDATE_FIELDS)
1063
+ end
1064
+
1051
1065
  apipie :class, desc: "A class representing #{model_name.human} object" do
1052
1066
  name 'Repository'
1053
1067
  refs 'Repository'
@@ -46,6 +46,8 @@ module Katello
46
46
  MIRRORING_POLICY_COMPLETE = 'mirror_complete'.freeze
47
47
  MIRRORING_POLICIES = [MIRRORING_POLICY_ADDITIVE, MIRRORING_POLICY_COMPLETE, MIRRORING_POLICY_CONTENT].freeze
48
48
 
49
+ ALLOWED_UPDATE_FIELDS = ['updated_at', 'content_id'].freeze
50
+
49
51
  belongs_to :product, :inverse_of => :root_repositories, :class_name => "Katello::Product"
50
52
  has_one :provider, :through => :product
51
53
 
@@ -60,6 +62,8 @@ module Katello
60
62
  has_many :repository_references, :class_name => 'Katello::Pulp3::RepositoryReference',
61
63
  :dependent => :destroy, :inverse_of => :root_repository
62
64
 
65
+ before_validation :remove_sha1_checksum_type, if: :sha1_checksum?
66
+
63
67
  validates_lengths_from_database :except => [:label]
64
68
  validates_with Validators::KatelloLabelFormatValidator, :attributes => :label
65
69
  validates_with Validators::KatelloNameFormatValidator, :attributes => :name
@@ -113,6 +117,7 @@ module Katello
113
117
  }
114
118
 
115
119
  validates :container_push_name_format, inclusion: { in: ['label', 'id'].freeze, allow_nil: true}
120
+ before_update :prevent_updates, :unless => :allow_updates?
116
121
 
117
122
  scope :subscribable, -> { where(content_type: RootRepository::SUBSCRIBABLE_TYPES) }
118
123
  scope :skipable_metadata_check, -> { where(content_type: RootRepository::SKIPABLE_METADATA_TYPES) }
@@ -157,6 +162,14 @@ module Katello
157
162
  joins(:product).where("#{Katello::Product.table_name}.organization_id" => org)
158
163
  end
159
164
 
165
+ def sha1_checksum?
166
+ checksum_type == 'sha1'
167
+ end
168
+
169
+ def remove_sha1_checksum_type
170
+ self.checksum_type = nil
171
+ end
172
+
160
173
  def ensure_content_attribute_restrictions
161
174
  CONTENT_ATTRIBUTE_RESTRICTIONS.each do |attribute, value|
162
175
  if self.send(attribute).present? && !value.include?(self.content_type)
@@ -445,6 +458,22 @@ module Katello
445
458
  end
446
459
  end
447
460
 
461
+ def allow_updates?(additional_allowed_fields = [])
462
+ # allow updates for non-container-push repos, repos not in default view, and
463
+ # repos with a library instance
464
+ return true unless is_container_push && library_instance.present?
465
+
466
+ # let updates that contain ONLY allowed strings through
467
+ allowed_fields = ::Katello::RootRepository::ALLOWED_UPDATE_FIELDS + additional_allowed_fields
468
+ return true if (changed - allowed_fields).empty?
469
+
470
+ false
471
+ end
472
+
473
+ def prevent_updates
474
+ fail _("Cannot update properties of a container push repository")
475
+ end
476
+
448
477
  apipie :class, desc: 'A class representing Repository object' do
449
478
  name 'Repository'
450
479
  refs 'Repository'
@@ -53,7 +53,7 @@ module Katello
53
53
  # https://github.com/wvanbergen/scoped_search/blob/master/lib/scoped_search/query_builder.rb
54
54
  if ['LIKE', 'NOT LIKE'].include?(operator)
55
55
  conditions = "#{self.table_name}.#{column} #{operator} ?"
56
- parameter = (value !~ /^\%|\*/ && value !~ /\%|\*$/) ? "%#{value}%" : value.tr_s('%*', '%')
56
+ parameter = (value !~ /^%|\*/ && value !~ /%|\*$/) ? "%#{value}%" : value.tr_s('%*', '%')
57
57
  return { :conditions => conditions, :parameter => [parameter] }
58
58
  elsif ['IN', 'NOT IN'].include?(operator)
59
59
  conditions = "#{self.table_name}.#{column} #{operator} (#{value.split(',').collect { '?' }.join(',')})"
@@ -124,7 +124,7 @@ module Katello
124
124
  end
125
125
 
126
126
  def self.scoped_search_evr_like(operator, value)
127
- val = (value !~ /^\%|\*/ && value !~ /\%|\*$/) ? "%#{value}%" : value.tr_s('%*', '%')
127
+ val = (value !~ /^%|\*/ && value !~ /%|\*$/) ? "%#{value}%" : value.tr_s('%*', '%')
128
128
  evr = Util::Package.parse_evr(val)
129
129
  (e, v, r) = [evr[:epoch], evr[:version], evr[:release]]
130
130
  conditions = []
@@ -1,6 +1,6 @@
1
1
  module Katello
2
2
  class SubscriptionFacetPool < Katello::Model
3
- # Note: Do not use active record call backs or dependent references on this class
3
+ # NOTE: Do not use active record call backs or dependent references on this class
4
4
  # Direct deletes are made in Pool#import_hosts (instead of destroys).
5
5
  belongs_to :subscription_facet, :inverse_of => :subscription_facet_pools, :class_name => 'Katello::Host::SubscriptionFacet'
6
6
  belongs_to :pool, :inverse_of => :subscription_facet_pools, :class_name => 'Katello::Pool'
@@ -148,13 +148,14 @@ module Katello
148
148
  if interval.nil?
149
149
  fail _("Interval cannot be nil")
150
150
  end
151
- if (interval.downcase.eql? "hourly")
151
+ case interval.downcase
152
+ when "hourly"
152
153
  cron = min.to_s + " * * * *"
153
- elsif (interval.downcase.eql? "daily")
154
+ when "daily"
154
155
  cron = min.to_s + " " + hour.to_s + " * * *"
155
- elsif (interval.downcase.eql? "weekly")
156
+ when "weekly"
156
157
  cron = min.to_s + " " + hour.to_s + " * * " + day.to_s
157
- elsif (interval.downcase.eql? CUSTOM_CRON)
158
+ when CUSTOM_CRON
158
159
  cron = cron_expression
159
160
  else
160
161
  fail _("Interval not set correctly")
@@ -154,18 +154,16 @@ module Katello
154
154
  when :package
155
155
  p = self.parameters[:packages]
156
156
  first_package = p.first.is_a?(Hash) ? p.first[:name] : p.first
157
- unless p && p.length > 0
158
- if self.task_type == "package_update"
159
- case self.overall_status
160
- when "running"
161
- return "updating"
162
- when "waiting"
163
- return "updating"
164
- when "error"
165
- return _("all packages update failed")
166
- else
167
- return _("all packages update")
168
- end
157
+ if !p && p.length > 0 && (self.task_type == "package_update")
158
+ case self.overall_status
159
+ when "running"
160
+ return "updating"
161
+ when "waiting"
162
+ return "updating"
163
+ when "error"
164
+ return _("all packages update failed")
165
+ else
166
+ return _("all packages update")
169
167
  end
170
168
  end
171
169
 
@@ -229,14 +227,15 @@ module Katello
229
227
  ret = []
230
228
  task_type = self.task_type.to_s
231
229
 
232
- if task_type =~ /^package_group/
230
+ case task_type
231
+ when /^package_group/
233
232
  action = task_type.include?("remove") ? :removed : :installed
234
233
  ret = packages_change_description(result[:details][:package_group], action)
235
- elsif task_type == "package_install" || task_type == "errata_install"
234
+ when "package_install", "errata_install"
236
235
  ret = packages_change_description(result[:details][:rpm], :installed)
237
- elsif task_type == "package_update"
236
+ when "package_update"
238
237
  ret = packages_change_description(result[:details][:rpm], :updated)
239
- elsif task_type == "package_remove"
238
+ when "package_remove"
240
239
  ret = packages_change_description(result[:details][:rpm], :removed)
241
240
  end
242
241
  ret
@@ -246,13 +245,14 @@ module Katello
246
245
  errors, stacktrace = self.result[:errors]
247
246
  return "" unless errors
248
247
  # Handle not very friendly Pulp message
249
- if errors =~ /^\(.*\)$/
248
+ case errors
249
+ when /^\(.*\)$/
250
250
  if stacktrace.class == Array
251
251
  stacktrace.last.split(":").first
252
252
  else
253
253
  stacktrace.split("(").first
254
254
  end
255
- elsif errors =~ /^\[.*,.*\]$/m
255
+ when /^\[.*,.*\]$/m
256
256
  result = errors.split(",").map do |error|
257
257
  error.gsub(/^\W+|\W+$/, "")
258
258
  end
@@ -0,0 +1,10 @@
1
+ module Katello
2
+ class ProductHostCountPresenter < SimpleDelegator
3
+ attr_reader :product_host_count
4
+
5
+ def initialize(pool)
6
+ @product_host_count = pool.product_host_count
7
+ super(pool)
8
+ end
9
+ end
10
+ end