katello 3.18.5 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (239) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/katello/katello.scss +72 -0
  3. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +6 -4
  4. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +0 -19
  5. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -3
  6. data/app/controllers/katello/api/v2/content_credentials_controller.rb +24 -24
  7. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +1 -1
  8. data/app/controllers/katello/api/v2/content_exports_controller.rb +4 -0
  9. data/app/controllers/katello/api/v2/content_views_controller.rb +2 -2
  10. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -3
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +3 -19
  12. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +34 -0
  13. data/app/controllers/katello/api/v2/subscriptions_controller.rb +1 -1
  14. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +8 -4
  15. data/app/controllers/katello/concerns/api/v2/authorization.rb +1 -14
  16. data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +1 -1
  17. data/app/helpers/katello/sync_management_helper.rb +0 -2
  18. data/app/lib/actions/candlepin/environment/create.rb +1 -1
  19. data/app/lib/actions/candlepin/environment/set_content.rb +1 -1
  20. data/app/lib/actions/katello/activation_key/create.rb +9 -11
  21. data/app/lib/actions/katello/capsule_content/sync.rb +8 -8
  22. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +9 -0
  23. data/app/lib/actions/katello/check_matching_content.rb +17 -0
  24. data/app/lib/actions/katello/content_view/environment_create.rb +6 -8
  25. data/app/lib/actions/katello/content_view/publish.rb +1 -1
  26. data/app/lib/actions/katello/content_view_version/incremental_update.rb +11 -7
  27. data/app/lib/actions/katello/host/hypervisors_update.rb +4 -4
  28. data/app/lib/actions/katello/organization/create.rb +3 -5
  29. data/app/lib/actions/katello/organization/destroy.rb +1 -1
  30. data/app/lib/actions/katello/organization/manifest_delete.rb +3 -5
  31. data/app/lib/actions/katello/organization/manifest_import.rb +1 -1
  32. data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
  33. data/app/lib/actions/katello/orphan_cleanup/remove_orphans.rb +1 -1
  34. data/app/lib/actions/katello/repository/check_matching_content.rb +3 -1
  35. data/app/lib/actions/katello/repository/clone_contents.rb +8 -11
  36. data/app/lib/actions/katello/repository/create.rb +0 -8
  37. data/app/lib/actions/katello/repository/filtered_index_content.rb +3 -0
  38. data/app/lib/actions/katello/repository/index_content.rb +1 -0
  39. data/app/lib/actions/katello/repository/multi_clone_contents.rb +9 -12
  40. data/app/lib/actions/katello/repository/sync.rb +1 -5
  41. data/app/lib/actions/katello/repository/update.rb +0 -8
  42. data/app/lib/actions/middleware/execute_if_contents_changed.rb +4 -1
  43. data/app/lib/actions/pulp/orchestration/repository/refresh_repos.rb +0 -6
  44. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +3 -3
  45. data/app/lib/actions/pulp3/content_guard/refresh_all_distributions.rb +1 -2
  46. data/app/lib/actions/pulp3/content_migration_presenter.rb +2 -5
  47. data/app/lib/actions/pulp3/orchestration/repository/refresh_repos.rb +1 -6
  48. data/app/lib/katello/concerns/base_template_scope_extensions.rb +8 -0
  49. data/app/lib/katello/errors.rb +1 -1
  50. data/app/lib/katello/event_daemon/monitor.rb +53 -0
  51. data/app/lib/katello/event_daemon/runner.rb +99 -0
  52. data/app/lib/katello/logging.rb +32 -0
  53. data/app/lib/katello/messaging/connection.rb +1 -7
  54. data/app/lib/katello/util/pulpcore_content_filters.rb +1 -1
  55. data/app/lib/katello/validators/content_view_puppet_module_validator.rb +1 -1
  56. data/app/models/katello/activation_key.rb +2 -2
  57. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  58. data/app/models/katello/concerns/hostgroup_extensions.rb +2 -4
  59. data/app/models/katello/concerns/organization_extensions.rb +2 -2
  60. data/app/models/katello/concerns/pulp_database_unit.rb +0 -12
  61. data/app/models/katello/concerns/redhat_extensions.rb +8 -9
  62. data/app/models/katello/concerns/smart_proxy_extensions.rb +24 -0
  63. data/app/models/katello/content_view.rb +5 -1
  64. data/app/models/katello/content_view_environment.rb +2 -2
  65. data/app/models/katello/content_view_puppet_environment.rb +2 -2
  66. data/app/models/katello/content_view_version.rb +2 -1
  67. data/app/models/katello/content_view_version_export_history.rb +20 -0
  68. data/app/models/katello/erratum.rb +3 -1
  69. data/app/models/katello/file_unit.rb +0 -4
  70. data/app/models/katello/glue/candlepin/pool.rb +2 -0
  71. data/app/models/katello/glue/pulp/repo.rb +0 -6
  72. data/app/models/katello/glue/pulp/repos.rb +1 -22
  73. data/app/models/katello/host/content_facet.rb +31 -9
  74. data/app/models/katello/ping.rb +19 -39
  75. data/app/models/katello/pool.rb +5 -0
  76. data/app/models/katello/product.rb +3 -3
  77. data/app/models/katello/repository.rb +3 -3
  78. data/app/presenters/katello/host_subscription_presenter.rb +3 -4
  79. data/app/presenters/katello/host_subscriptions_presenter.rb +24 -0
  80. data/app/services/katello/applicability/applicable_content_helper.rb +6 -8
  81. data/app/services/katello/candlepin_event_listener.rb +11 -19
  82. data/app/services/katello/event_monitor/poller_thread.rb +2 -11
  83. data/app/services/katello/pulp/repository.rb +2 -4
  84. data/app/services/katello/pulp/smart_proxy_repository.rb +0 -15
  85. data/app/services/katello/pulp3/api/core.rb +0 -14
  86. data/app/services/katello/pulp3/erratum.rb +1 -2
  87. data/app/services/katello/pulp3/migration.rb +9 -83
  88. data/app/services/katello/pulp3/migration_plan.rb +5 -54
  89. data/app/services/katello/pulp3/migration_switchover.rb +5 -36
  90. data/app/services/katello/pulp3/repository/apt.rb +2 -1
  91. data/app/services/katello/pulp3/repository/yum.rb +2 -11
  92. data/app/services/katello/pulp3/repository.rb +13 -34
  93. data/app/services/katello/pulp3/rpm.rb +1 -5
  94. data/app/services/katello/pulp3/task.rb +5 -8
  95. data/app/services/katello/pulp3/task_group.rb +5 -13
  96. data/app/services/katello/repository_type.rb +1 -1
  97. data/app/views/foreman/smart_proxies/_content_tab.html.erb +4 -47
  98. data/app/views/foreman/smart_proxies/show.html.erb +1 -1
  99. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +22 -25
  100. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +1 -0
  101. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -9
  102. data/app/views/katello/sync_management/_products.html.erb +1 -1
  103. data/app/views/overrides/organizations/_edit_override.html.erb +1 -4
  104. data/app/views/overrides/smart_proxies/_environment_tab.html.erb +1 -1
  105. data/app/views/overrides/smart_proxies/_environment_tab_pane.html.erb +1 -1
  106. data/config/katello.yaml.example +0 -3
  107. data/config/routes/api/v2.rb +8 -10
  108. data/db/migrate/20191204214919_add_content_view_version_counts.rb +0 -1
  109. data/db/migrate/20200514092553_move_katello_fields_from_hostgroups.katello.rb +1 -1
  110. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +56 -0
  111. data/db/migrate/20210128231228_add_type_and_from_cvv_to_cvv_export_history.rb +14 -0
  112. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +7 -0
  113. data/db/seeds.d/104-proxy.rb +1 -1
  114. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  115. data/engines/bastion/app/assets/javascripts/bastion/auth/authorization.service.js +1 -1
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +1 -1
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-register-os-client.directive.js +17 -0
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -2
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-client.html +11 -4
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-deb-client.html +38 -0
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-oracle-client.html +5 -0
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-sles-client.html +28 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register.html +14 -11
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter-details.html +2 -2
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +2 -2
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +1 -1
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/download-policy.service.js +0 -1
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +1 -1
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +2 -2
  131. data/lib/katello/engine.rb +4 -5
  132. data/lib/katello/middleware/event_daemon.rb +1 -1
  133. data/lib/katello/permission_creator.rb +3 -2
  134. data/lib/katello/plugin.rb +2 -2
  135. data/lib/katello/tasks/jenkins.rake +1 -1
  136. data/lib/katello/tasks/pulp3_content_switchover.rake +20 -31
  137. data/lib/katello/tasks/pulp3_migration.rake +25 -45
  138. data/lib/katello/tasks/pulp3_migration_abort.rake +0 -8
  139. data/lib/katello/tasks/pulp3_migration_stats.rake +3 -46
  140. data/lib/katello/tasks/upgrades/4.0/remove_ostree_puppet_content.rake +16 -0
  141. data/lib/katello/version.rb +1 -1
  142. data/lib/proxy_api/container_gateway.rb +21 -0
  143. data/locale/bn/katello.edit.po +0 -0
  144. data/locale/cs/katello.edit.po +0 -0
  145. data/locale/de/katello.edit.po +0 -0
  146. data/locale/en/katello.edit.po +0 -0
  147. data/locale/es/katello.edit.po +0 -0
  148. data/locale/fr/katello.edit.po +0 -0
  149. data/locale/gu/katello.edit.po +0 -0
  150. data/locale/hi/katello.edit.po +0 -0
  151. data/locale/it/katello.edit.po +0 -0
  152. data/locale/ja/katello.edit.po +0 -0
  153. data/locale/kn/katello.edit.po +0 -0
  154. data/locale/ko/katello.edit.po +0 -0
  155. data/locale/mr/katello.edit.po +0 -0
  156. data/locale/or/katello.edit.po +0 -0
  157. data/locale/pa/katello.edit.po +0 -0
  158. data/locale/pt/katello.edit.po +0 -0
  159. data/locale/pt_BR/katello.edit.po +0 -0
  160. data/locale/ru/katello.edit.po +0 -0
  161. data/locale/ta/katello.edit.po +0 -0
  162. data/locale/te/katello.edit.po +0 -0
  163. data/locale/zh_CN/katello.edit.po +0 -0
  164. data/locale/zh_TW/katello.edit.po +0 -0
  165. data/package.json +1 -1
  166. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +0 -1
  167. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +2 -0
  168. data/webpack/__mocks__/foremanReact/components/common/dates/LongDateTime.js +5 -0
  169. data/webpack/{scenes/ContentViews/Details/Repositories → components/SelectableDropdown}/SelectableDropdown.js +20 -3
  170. data/webpack/components/SelectableDropdown/__tests__/SelectableDropdown.test.js +45 -0
  171. data/webpack/components/SelectableDropdown/index.js +3 -0
  172. data/webpack/components/Table/TableWrapper.js +2 -1
  173. data/webpack/components/Table/helpers.js +14 -0
  174. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +0 -1
  175. data/webpack/containers/Application/overrides.scss +6 -0
  176. data/webpack/index.js +6 -0
  177. data/webpack/redux/actions/RedHatRepositories/helpers.js +5 -5
  178. data/webpack/scenes/ContentViews/ContentViewsActions.js +31 -2
  179. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -1
  180. data/webpack/scenes/ContentViews/Copy/ContentViewCopySelectors.js +16 -0
  181. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +77 -0
  182. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +44 -0
  183. data/webpack/scenes/ContentViews/Copy/__tests__/contentViewCopyResult.fixtures.json +42 -0
  184. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +39 -0
  185. data/webpack/scenes/ContentViews/Copy/index.js +4 -0
  186. data/webpack/scenes/ContentViews/Create/ContentViewCreateSelectors.js +16 -0
  187. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +58 -0
  188. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +175 -0
  189. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +27 -0
  190. data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +42 -0
  191. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +92 -0
  192. data/webpack/scenes/ContentViews/Create/index.js +4 -0
  193. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +16 -0
  194. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +20 -1
  195. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +17 -7
  196. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +19 -13
  197. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +40 -0
  198. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +124 -0
  199. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +134 -0
  200. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +92 -0
  201. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +44 -25
  202. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +17 -7
  203. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +24 -0
  204. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +53 -3
  205. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +4 -3
  206. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +41 -0
  207. data/webpack/scenes/ContentViews/helpers.js +13 -0
  208. data/webpack/scenes/SmartProxy/Content.js +17 -0
  209. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +11 -0
  210. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +3 -0
  211. data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +16 -0
  212. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +152 -0
  213. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentResult.fixtures.json +140 -0
  214. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +38 -0
  215. data/webpack/scenes/SmartProxy/index.js +4 -0
  216. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +2 -7
  217. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +3 -3
  218. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +2 -2
  219. data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +2 -2
  220. data/webpack/scenes/Subscriptions/Manifest/index.js +0 -1
  221. data/webpack/test-utils/react-testing-lib-wrapper.js +5 -2
  222. data/webpack/utils/helpers.js +3 -0
  223. metadata +103 -63
  224. data/app/controllers/katello/api/v2/gpg_keys_controller.rb +0 -114
  225. data/app/lib/actions/pulp3/content_migration_reset.rb +0 -22
  226. data/app/lib/katello/util/hostgroup_facets_helper.rb +0 -126
  227. data/app/overrides/disable_turbolinks_on_proxies_index.rb +0 -5
  228. data/app/services/katello/event_daemon.rb +0 -135
  229. data/app/services/katello/pulp/content_counts_calculator.rb +0 -60
  230. data/db/migrate/20210201165835_add_migration_missing_content.rb +0 -12
  231. data/db/migrate/20210420140050_add_pulp3_hrefs_to_content_types_deb.rb +0 -5
  232. data/lib/katello/tasks/check_config.rake +0 -11
  233. data/lib/katello/tasks/fix_hostgroup_facets.rake +0 -8
  234. data/lib/katello/tasks/pulp3_migration_approve_corrupted.rake +0 -21
  235. data/lib/katello/tasks/pulp3_migration_reset.rake +0 -26
  236. data/lib/katello/tasks/reports.rake +0 -7
  237. data/lib/katello/tasks/upgrades/3.10/update_gpg_key_urls.rake +0 -32
  238. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.scss +0 -5
  239. data/webpack/scenes/ContentViews/Table/actionResolver.js +0 -28
@@ -0,0 +1,17 @@
1
+ module Actions
2
+ module Katello
3
+ module CheckMatchingContent
4
+ def check_matching_content(new_repository, source_repositories)
5
+ check_matching_content = ::Katello::RepositoryTypeManager.find(new_repository.content_type).metadata_publish_matching_check
6
+ if new_repository.environment && source_repositories.count == 1 && check_matching_content
7
+ match_check_output = plan_action(Katello::Repository::CheckMatchingContent,
8
+ :source_repo_id => source_repositories.first.id,
9
+ :target_repo_id => new_repository.id).output
10
+
11
+ return match_check_output[:matching_content]
12
+ end
13
+ false
14
+ end
15
+ end
16
+ end
17
+ end
@@ -4,14 +4,12 @@ module Actions
4
4
  class EnvironmentCreate < Actions::Base
5
5
  def plan(content_view_environment)
6
6
  content_view_environment.save!
7
- if ::SETTINGS[:katello][:use_cp]
8
- content_view = content_view_environment.content_view
9
- plan_action(Candlepin::Environment::Create,
10
- organization_label: content_view.organization.label,
11
- cp_id: content_view_environment.cp_id,
12
- name: content_view_environment.label,
13
- description: content_view.description)
14
- end
7
+ content_view = content_view_environment.content_view
8
+ plan_action(Candlepin::Environment::Create,
9
+ organization_label: content_view.organization.label,
10
+ cp_id: content_view_environment.cp_id,
11
+ name: content_view_environment.label,
12
+ description: content_view.description)
15
13
  end
16
14
 
17
15
  def humanized_name
@@ -6,7 +6,7 @@ module Actions
6
6
  include ::Katello::ContentViewHelper
7
7
  attr_accessor :version
8
8
  # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/CyclomaticComplexity
9
- def plan(content_view, description = "", options = {importing: false})
9
+ def plan(content_view, description = "", options = {importing: false}) # rubocop:disable Metrics/PerceivedComplexity
10
10
  action_subject(content_view)
11
11
 
12
12
  content_view.check_ready_to_publish!(importing: options[:importing])
@@ -19,7 +19,7 @@ module Actions
19
19
 
20
20
  # rubocop:disable Metrics/MethodLength
21
21
  # rubocop:disable Metrics/AbcSize
22
- def plan(old_version, environments, options = {})
22
+ def plan(old_version, environments, options = {}) # rubocop:disable Metrics/CyclomaticComplexity
23
23
  dep_solve = options.fetch(:resolve_dependencies, true)
24
24
  description = options.fetch(:description, '')
25
25
  content = options.fetch(:content, {})
@@ -88,11 +88,15 @@ module Actions
88
88
  end
89
89
  end
90
90
 
91
- sequence do
92
- new_puppet_environment = plan_action(Katello::ContentViewPuppetEnvironment::Clone, old_version,
93
- :new_version => new_content_view_version).new_puppet_environment
94
- check_puppet_module_duplicates(content[:puppet_module_ids])
95
- copy_action_outputs += copy_puppet_content(new_puppet_environment, content[:puppet_module_ids], old_version) unless content[:puppet_module_ids].blank?
91
+ if SmartProxy.pulp_primary.has_feature?(SmartProxy::PULP_FEATURE) && SETTINGS[:katello][:content_types][:puppet]
92
+ sequence do
93
+ new_puppet_environment = plan_action(Katello::ContentViewPuppetEnvironment::Clone, old_version,
94
+ :new_version => new_content_view_version).new_puppet_environment
95
+ check_puppet_module_duplicates(content[:puppet_module_ids])
96
+ unless content[:puppet_module_ids].blank?
97
+ copy_action_outputs += copy_puppet_content(new_puppet_environment, content[:puppet_module_ids], old_version)
98
+ end
99
+ end
96
100
  end
97
101
  end
98
102
 
@@ -201,7 +205,7 @@ module Actions
201
205
  end
202
206
  end
203
207
 
204
- def run
208
+ def run # rubocop:disable Metrics/CyclomaticComplexity
205
209
  content = { ::Katello::Erratum::CONTENT_TYPE => [],
206
210
  ::Katello::Rpm::CONTENT_TYPE => [],
207
211
  ::Katello::ModuleStream::CONTENT_TYPE => [],
@@ -54,10 +54,10 @@ module Actions
54
54
 
55
55
  # Loads all resources needed for refreshing subscription facet
56
56
  def load_resources
57
- @organizations = ::Organization.where(label: hypervisors_field(:organization_label)).map { |org| [org.label, org] }.to_h
57
+ @organizations = ::Organization.where(label: hypervisors_field(:organization_label)).index_by { |org| org.label }
58
58
 
59
59
  candlepin_data = ::Katello::Resources::Candlepin::Consumer.get_all_with_facts(hypervisors_field(:uuid))
60
- @candlepin_attributes = candlepin_data.map { |consumer| [consumer[:uuid], consumer] }.to_h
60
+ @candlepin_attributes = candlepin_data.index_by { |consumer| consumer[:uuid] }
61
61
 
62
62
  @hosts = {}
63
63
  @hosts.merge!(load_hosts_by_uuid)
@@ -70,7 +70,7 @@ module Actions
70
70
  hosts_by_uuid.each do |host|
71
71
  validate_host_organization(host, host.organization.try(:id))
72
72
  end
73
- hosts_by_uuid.map { |host| [host.subscription_facet.uuid, host] }.to_h
73
+ hosts_by_uuid.index_by { |host| host.subscription_facet.uuid }
74
74
  end
75
75
 
76
76
  def load_hosts_by_duplicate_name
@@ -82,7 +82,7 @@ module Actions
82
82
  validate_host_organization(host, duplicate_name_orgs[host.name].try(:id))
83
83
  end
84
84
 
85
- hosts_by_dup_name.map { |host| [duplicate_names[host.name], host] }.to_h
85
+ hosts_by_dup_name.index_by { |host| duplicate_names[host.name] }
86
86
  end
87
87
 
88
88
  def create_missing_hosts
@@ -12,11 +12,9 @@ module Actions
12
12
  organization.save!
13
13
 
14
14
  sequence do
15
- if ::SETTINGS[:katello][:use_cp]
16
- cp_create = plan_action(Candlepin::Owner::Create,
17
- label: organization.label,
18
- name: organization.name)
19
- end
15
+ cp_create = plan_action(Candlepin::Owner::Create,
16
+ label: organization.label,
17
+ name: organization.name)
20
18
  plan_action(Katello::Environment::LibraryCreate, organization.library)
21
19
  end
22
20
  if cp_create
@@ -17,7 +17,7 @@ module Actions
17
17
  remove_providers(organization)
18
18
  remove_environments(organization)
19
19
  plan_self
20
- plan_action(Candlepin::Owner::Destroy, label: organization.label) if ::SETTINGS[:katello][:use_cp]
20
+ plan_action(Candlepin::Owner::Destroy, label: organization.label)
21
21
  end
22
22
  end
23
23
 
@@ -12,11 +12,9 @@ module Actions
12
12
  sequence do
13
13
  plan_action(Candlepin::Owner::DestroyImports, label: organization.label)
14
14
 
15
- if SETTINGS[:katello][:use_pulp]
16
- repositories = ::Katello::Repository.in_default_view.in_product(::Katello::Product.redhat.in_org(organization))
17
- repositories.each do |repo|
18
- plan_action(Katello::Repository::RefreshRepository, repo)
19
- end
15
+ repositories = ::Katello::Repository.in_default_view.in_product(::Katello::Product.redhat.in_org(organization))
16
+ repositories.each do |repo|
17
+ plan_action(Katello::Repository::RefreshRepository, repo)
20
18
  end
21
19
  plan_self
22
20
  end
@@ -17,7 +17,7 @@ module Actions
17
17
  :force => force)
18
18
  plan_action(Candlepin::Owner::ImportProducts, :organization_id => organization.id)
19
19
 
20
- if manifest_update && SETTINGS[:katello][:use_pulp]
20
+ if manifest_update
21
21
  repositories = ::Katello::Repository.in_default_view.in_product(::Katello::Product.redhat.in_org(organization))
22
22
  repositories.each do |repo|
23
23
  plan_action(Katello::Repository::RefreshRepository, repo)
@@ -28,7 +28,7 @@ module Actions
28
28
  :dependency => export_action.output)
29
29
  import_products = plan_action(Candlepin::Owner::ImportProducts, :organization_id => organization.id, :dependency => owner_import.output)
30
30
 
31
- if manifest_update && SETTINGS[:katello][:use_pulp]
31
+ if manifest_update
32
32
  repositories = ::Katello::Repository.in_default_view.in_product(::Katello::Product.redhat.in_org(organization))
33
33
  repositories.each do |repo|
34
34
  plan_action(Katello::Repository::RefreshRepository, repo, :dependency => import_products.output)
@@ -8,7 +8,7 @@ module Actions
8
8
  def plan(proxy)
9
9
  sequence do
10
10
  plan_action(Actions::Pulp::Orchestration::OrphanCleanup::RemoveOrphans, proxy)
11
- if proxy.pulp3_enabled? && ::Katello::Ping.pulpcore_enabled
11
+ if proxy.pulp3_enabled?
12
12
  plan_action(
13
13
  Actions::Pulp3::Orchestration::OrphanCleanup::RemoveOrphans,
14
14
  proxy)
@@ -23,8 +23,10 @@ module Actions
23
23
  yum_metadata_files = yum_metadata_files_match?(source_repo, target_repo)
24
24
  checksum_match = (target_repo.saved_checksum_type == source_repo.saved_checksum_type)
25
25
 
26
+ published = target_repo.backend_service(SmartProxy.pulp_primary).published?
27
+
26
28
  output[:checksum_match] = checksum_match
27
- output[:matching_content] = yum_metadata_files && srpms_match && rpms && errata && package_groups && distributions && target_repo.published? && checksum_match
29
+ output[:matching_content] = yum_metadata_files && srpms_match && rpms && errata && package_groups && distributions && published && checksum_match
28
30
  end
29
31
 
30
32
  if source_repo.content_type == ::Katello::Repository::DEB_TYPE
@@ -3,6 +3,8 @@ module Actions
3
3
  module Repository
4
4
  class CloneContents < Actions::Base
5
5
  include Actions::Katello::PulpSelector
6
+ include Actions::Katello::CheckMatchingContent
7
+
6
8
  def plan(source_repositories, new_repository, options)
7
9
  filters = options.fetch(:filters, nil)
8
10
  rpm_filenames = options.fetch(:rpm_filenames, nil)
@@ -20,10 +22,12 @@ module Actions
20
22
  filters: filters, rpm_filenames: rpm_filenames, solve_dependencies: solve_dependencies)
21
23
  end
22
24
 
23
- metadata_generate(source_repositories, new_repository, filters, rpm_filenames) if generate_metadata
25
+ matching_content = check_matching_content(new_repository, source_repositories)
26
+ metadata_generate(source_repositories, new_repository, filters, rpm_filenames, matching_content) if generate_metadata
24
27
 
25
28
  index_options = {id: new_repository.id}
26
29
  index_options[:source_repository_id] = source_repositories.first.id if source_repositories.count == 1 && filters.empty? && rpm_filenames.nil?
30
+ index_options[:matching_content] = matching_content
27
31
  plan_action(Katello::Repository::IndexContent, index_options)
28
32
 
29
33
  if purge_empty_contents && new_repository.backend_service(SmartProxy.pulp_primary).should_purge_empty_contents?
@@ -32,22 +36,15 @@ module Actions
32
36
  end
33
37
  end
34
38
 
35
- def metadata_generate(source_repositories, new_repository, filters, rpm_filenames)
39
+ def metadata_generate(source_repositories, new_repository, filters, rpm_filenames, matching_content)
36
40
  metadata_options = {}
37
41
 
42
+ metadata_options[:matching_content] = matching_content
43
+
38
44
  if source_repositories.count == 1 && filters.empty? && rpm_filenames.empty?
39
45
  metadata_options[:source_repository] = source_repositories.first
40
46
  end
41
47
 
42
- check_matching_content = ::Katello::RepositoryTypeManager.find(new_repository.content_type).metadata_publish_matching_check
43
- if new_repository.environment && source_repositories.count == 1 && check_matching_content && !SmartProxy.pulp_primary.pulp3_support?(new_repository)
44
- match_check_output = plan_action(Katello::Repository::CheckMatchingContent,
45
- :source_repo_id => source_repositories.first.id,
46
- :target_repo_id => new_repository.id).output
47
-
48
- metadata_options[:matching_content] = match_check_output[:matching_content]
49
- end
50
-
51
48
  plan_action(Katello::Repository::MetadataGenerate, new_repository, metadata_options)
52
49
  unless source_repositories.first.saved_checksum_type == new_repository.saved_checksum_type
53
50
  plan_self(:source_checksum_type => source_repositories.first.saved_checksum_type,
@@ -10,14 +10,6 @@ module Actions
10
10
 
11
11
  action_subject(repository)
12
12
 
13
- if repository.download_policy == ::Runcible::Models::YumImporter::DOWNLOAD_BACKGROUND
14
- ::Foreman::Deprecation.api_deprecation_warning("Background download_policy will be removed in Katello 4.0. Any background repositories will be converted to Immediate")
15
- end
16
-
17
- if root['content_type'] == 'puppet' || root['content_type'] == 'ostree'
18
- ::Foreman::Deprecation.api_deprecation_warning("Repository types of 'Puppet' and 'OSTree' will no longer be supported in Katello 4.0.")
19
- end
20
-
21
13
  org = repository.organization
22
14
  pulp2_create_action = plan_create ? Actions::Pulp::Repository::CreateInPlan : Actions::Pulp::Repository::Create
23
15
  sequence do
@@ -11,6 +11,9 @@ module Actions
11
11
  end
12
12
 
13
13
  # rubocop:disable Metrics/MethodLength
14
+ # rubocop:disable Metrics/CyclomaticComplexity
15
+ # rubocop:disable Metrics/AbcSize
16
+ # rubocop:disable Metrics/PerceivedComplexity
14
17
  def run
15
18
  repo = ::Katello::Repository.find(input[:id])
16
19
  if repo.puppet?
@@ -8,6 +8,7 @@ module Actions
8
8
  param :id, Integer
9
9
  param :dependency, Hash
10
10
  param :contents_changed
11
+ param :matching_content
11
12
  param :source_repository_id
12
13
  end
13
14
 
@@ -3,6 +3,8 @@ module Actions
3
3
  module Repository
4
4
  class MultiCloneContents < Actions::Base
5
5
  include Actions::Katello::PulpSelector
6
+ include Actions::Katello::CheckMatchingContent
7
+
6
8
  def plan(extended_repo_mapping, options)
7
9
  generate_metadata = options.fetch(:generate_metadata, true)
8
10
  copy_contents = options.fetch(:copy_contents, true)
@@ -18,34 +20,29 @@ module Actions
18
20
 
19
21
  concurrence do
20
22
  extended_repo_mapping.each do |source_repos, dest_repo_map|
23
+ dest_repo_map[:matching_content] = check_matching_content(dest_repo_map[:dest_repo], source_repos)
24
+
21
25
  if generate_metadata
22
- metadata_generate(source_repos, dest_repo_map[:dest_repo], dest_repo_map[:filters])
26
+ metadata_generate(source_repos, dest_repo_map[:dest_repo], dest_repo_map[:filters], dest_repo_map[:matching_content])
23
27
  end
24
28
  end
25
29
 
26
30
  extended_repo_mapping.values.each do |dest_repo_map|
27
- plan_action(Katello::Repository::IndexContent, id: dest_repo_map[:dest_repo].id)
31
+ plan_action(Katello::Repository::IndexContent, id: dest_repo_map[:dest_repo].id, matching_content: dest_repo_map[:matching_content])
28
32
  end
29
33
  end
30
34
  end
31
35
  end
32
36
 
33
- def metadata_generate(source_repositories, new_repository, filters)
37
+ def metadata_generate(source_repositories, new_repository, filters, matching_content)
34
38
  metadata_options = {}
35
39
 
40
+ metadata_options[:matching_content] = matching_content
41
+
36
42
  if source_repositories.count == 1 && filters.empty?
37
43
  metadata_options[:source_repository] = source_repositories.first
38
44
  end
39
45
 
40
- check_matching_content = ::Katello::RepositoryTypeManager.find(new_repository.content_type).metadata_publish_matching_check
41
- if new_repository.environment && source_repositories.count == 1 && check_matching_content
42
- match_check_output = plan_action(Katello::Repository::CheckMatchingContent,
43
- :source_repo_id => source_repositories.first.id,
44
- :target_repo_id => new_repository.id).output
45
-
46
- metadata_options[:matching_content] = match_check_output[:matching_content]
47
- end
48
-
49
46
  plan_action(Katello::Repository::MetadataGenerate, new_repository, metadata_options)
50
47
  unless source_repositories.first.saved_checksum_type == new_repository.saved_checksum_type
51
48
  plan_self(:source_checksum_type => source_repositories.first.saved_checksum_type,
@@ -72,11 +72,7 @@ module Actions
72
72
  end
73
73
  plan_self(:id => repo.id, :sync_result => output, :skip_metadata_check => skip_metadata_check, :validate_contents => validate_contents,
74
74
  :contents_changed => contents_changed)
75
-
76
- if generate_applicability && !SETTINGS[:katello][:katello_applicability]
77
- plan_action(Katello::Repository::ImportApplicability, :repo_id => repo.id, :contents_changed => contents_changed)
78
- end
79
-
75
+ plan_action(Katello::Repository::ImportApplicability, :repo_id => repo.id, :contents_changed => contents_changed) if generate_applicability
80
76
  plan_action(Katello::Repository::SyncHook, :id => repo.id)
81
77
  end
82
78
  end
@@ -14,14 +14,6 @@ module Actions
14
14
 
15
15
  root.update!(repo_params)
16
16
 
17
- if root.download_policy == ::Runcible::Models::YumImporter::DOWNLOAD_BACKGROUND
18
- ::Foreman::Deprecation.api_deprecation_warning("Background download_policy will be removed in Katello 4.0. Any background repositories will be converted to Immediate")
19
- end
20
-
21
- if root['content_type'] == 'puppet' || root['content_type'] == 'ostree'
22
- ::Foreman::Deprecation.api_deprecation_warning("Repository types of 'Puppet' and 'OSTree' will no longer be supported in Katello 4.0.")
23
- end
24
-
25
17
  if update_content?(repository)
26
18
  content = root.content
27
19
 
@@ -13,7 +13,10 @@ module Actions
13
13
 
14
14
  def execute?
15
15
  if action.input.keys.include?('contents_changed') && action.input['contents_changed'] == false
16
- self.action.output[:post_sync_skipped] = true
16
+ self.action.output[:post_action_skipped] = true
17
+ false
18
+ elsif action.input.keys.include?('matching_content') && action.input['matching_content'] == true
19
+ self.action.output[:post_action_skipped] = true
17
20
  false
18
21
  else
19
22
  true
@@ -4,12 +4,6 @@ module Actions
4
4
  module Repository
5
5
  class RefreshRepos < Pulp::AbstractAsyncTask
6
6
  include ::Actions::Katello::CapsuleContent::RefreshRepos
7
- input_format do
8
- param :smart_proxy_id
9
- param :environment_id
10
- param :content_view_id
11
- param :repository_id
12
- end
13
7
 
14
8
  def fetch_proxy_service(smart_proxy)
15
9
  ::Katello::Pulp::SmartProxyRepository.new(smart_proxy)
@@ -11,17 +11,17 @@ module Actions
11
11
  :options => options)
12
12
  end
13
13
 
14
- def run
14
+ def invoke_external_task
15
15
  smart_proxy = ::SmartProxy.unscoped.find(input[:smart_proxy_id])
16
16
  options = input[:options]
17
17
  tasks = options[:tasks]
18
18
  repo = ::Katello::Repository.find(input[:repository_id])
19
19
  if options[:use_repository_version]
20
- output[:response] = repo.backend_service(smart_proxy).with_mirror_adapter.refresh_distributions(:use_repository_version => true)
20
+ repo.backend_service(smart_proxy).with_mirror_adapter.refresh_distributions(:use_repository_version => true)
21
21
  elsif tasks && tasks[:pulp_tasks] && tasks[:pulp_tasks].first
22
22
  publication_href = tasks[:pulp_tasks].first[:created_resources].first
23
23
  if publication_href
24
- output[:response] = repo.backend_service(smart_proxy).with_mirror_adapter.refresh_distributions(:publication => publication_href)
24
+ repo.backend_service(smart_proxy).with_mirror_adapter.refresh_distributions(:publication => publication_href)
25
25
  end
26
26
  end
27
27
  end
@@ -6,8 +6,7 @@ module Actions
6
6
  sequence do
7
7
  plan_action(Actions::Pulp3::ContentGuard::Refresh, smart_proxy)
8
8
 
9
- protected_types = [::Katello::Repository::YUM_TYPE, ::Katello::Repository::FILE_TYPE, ::Katello::Repository::DEB_TYPE]
10
- roots = ::Katello::RootRepository.where(:content_type => protected_types).where(:unprotected => false)
9
+ roots = ::Katello::RootRepository.where.not(:content_type => ::Katello::Repository::DOCKER_TYPE).where(:unprotected => false)
11
10
  repositories = ::Katello::Repository.where(:root => roots)
12
11
  if repositories.any?
13
12
  plan_action(::Actions::BulkAction, Actions::Pulp3::Repository::RefreshDistribution, repositories, smart_proxy.id, assume_content_guard_exists: true)
@@ -38,9 +38,7 @@ module Actions
38
38
  end
39
39
 
40
40
  def humanized_output
41
- #prefer running reports where the done and total do not match
42
- report = task_progress_reports.find { |current| current['state'] == 'running' && current['total'] != 0 && current['done'] != current['total'] }
43
- report ||= task_progress_reports.find { |current| current['state'] == 'running' && current['total'] != 0 }
41
+ report = task_progress_reports.find { |current| current['state'] == 'running' && current['total'] != 0 }
44
42
  report ||= task_group_progress_reports.find { |current| current['total'] != 0 && current['done'] != current['total'] }
45
43
 
46
44
  if !report.blank? && report['total'] != 0
@@ -48,8 +46,7 @@ module Actions
48
46
  elsif report
49
47
  report['message']
50
48
  elsif task_progress_reports.empty?
51
- "Content migration starting. These steps may take a while to complete. " \
52
- "Refer to `foreman-maintain content migration-stats` for an estimate."
49
+ "Content migration starting. "
53
50
  else
54
51
  "Initial Migration steps complete."
55
52
  end
@@ -4,12 +4,7 @@ module Actions
4
4
  module Repository
5
5
  class RefreshRepos < Pulp3::AbstractAsyncTask
6
6
  include ::Actions::Katello::CapsuleContent::RefreshRepos
7
- input_format do
8
- param :smart_proxy_id
9
- param :environment_id
10
- param :content_view_id
11
- param :repository_id
12
- end
7
+
13
8
  def fetch_proxy_service(smart_proxy)
14
9
  ::Katello::Pulp3::SmartProxyRepository.instance_for_type(smart_proxy)
15
10
  end
@@ -19,6 +19,11 @@ module Katello
19
19
  host.subscriptions.redhat.pluck(:name)
20
20
  end
21
21
 
22
+ def host_redhat_subscriptions_consumed(host)
23
+ presenter = ::Katello::HostSubscriptionsPresenter.new(host)
24
+ presenter.subscriptions.select(&:redhat?).sum(&:quantity_consumed)
25
+ end
26
+
22
27
  def host_content_facet(host)
23
28
  host.content_facet
24
29
  end
@@ -87,6 +92,9 @@ module Katello
87
92
  end
88
93
 
89
94
  # rubocop:disable Metrics/MethodLength
95
+ # rubocop:disable Metrics/AbcSize
96
+ # rubocop:disable Metrics/CyclomaticComplexity
97
+ # rubocop:disable Metrics/PerceivedComplexity
90
98
  def load_errata_applications(filter_errata_type: nil, include_last_reboot: 'yes', since: nil, up_to: nil, status: nil, host_filter: nil)
91
99
  result = []
92
100
 
@@ -53,7 +53,7 @@ module Katello
53
53
 
54
54
  class PulpcoreMissingCapabilities < StandardError
55
55
  def message
56
- _("A smart proxy seems to have been refreshed without pulpcore being running. Please refresh the smart proxy after ensuring that pulpcore services are running.")
56
+ _("A smart proxy seems to have been refreshed without pulpcore being running. You may want to ")
57
57
  end
58
58
  end
59
59
 
@@ -0,0 +1,53 @@
1
+ module Katello
2
+ module EventDaemon
3
+ class Monitor
4
+ def initialize(services)
5
+ @services = services
6
+ @service_statuses = {}
7
+ @services.keys.each do |service_name|
8
+ @service_statuses[service_name] = { running: 'starting' }
9
+ end
10
+ end
11
+
12
+ def start
13
+ write_statuses_to_cache
14
+ loop do
15
+ Rails.application.executor.wrap do
16
+ check_services
17
+ end
18
+ sleep 15
19
+ end
20
+ end
21
+
22
+ def write_statuses_to_cache
23
+ Rails.cache.write(
24
+ Katello::EventDaemon::Runner::STATUS_CACHE_KEY,
25
+ @service_statuses
26
+ )
27
+ end
28
+
29
+ def check_services
30
+ @services.each do |service_name, service_class|
31
+ @service_statuses[service_name] = service_class.status
32
+ rescue => error
33
+ Rails.logger.error("Error occurred while pinging #{service_class}")
34
+ Rails.logger.error(error.message)
35
+ Rails.logger.error(error.backtrace.join("\n"))
36
+ ensure
37
+ if error || !@service_statuses.dig(service_name, :running)
38
+ begin
39
+ service_class.close
40
+ service_class.run
41
+ @service_statuses[service_name] = service_class.status
42
+ rescue => error
43
+ Rails.logger.error("Error occurred while starting #{service_class}")
44
+ Rails.logger.error(error.message)
45
+ Rails.logger.error(error.backtrace.join("\n"))
46
+ end
47
+ end
48
+ end
49
+ write_statuses_to_cache
50
+ end
51
+ end
52
+ end
53
+ end