Problem:
Hi,
I’m having another issue with Pulp. When manually uploading python packages, I sometimes get the following error message:
“Error during upload: Task 108def81-56b1-421b-9d1a-0956fb9a254f: Katello::Errors::Pulp3Error: [Errno 17] File exists: ‘simple/prometheus-client/’”
An example is trying to upload the package:
prometheus_client-0.19.0-py3-none-any.whl
when the package
prometheus_client-0.20.0-py3-none-any.whl
is already present — or vice versa.
A similar issue occurs with the following packages:
email_validator-1.3.1-py2.py3-none-any.whl
andemail_validator-2.2.0-py3-none-any.whl
pure_eval-0.2.2-py3-none-any.whl
andpure_eval-0.2.3-py3-none-any.whl
This blocks further uploads of packages. The workaround is to delete one of them.
Expected outcome:
Upload successful.
Foreman and Proxy versions:
Foreman 3.9.1, Proxy 3.9.1
Foreman and Proxy plugin versions:
Foreman 3.9.1, Katello 4.11.0, Foreman-tasks 9.0.0
Distribution and version:
Red Hat Enterprise Linux 8.10
Other relevant data:
Logs:
Action:
Actions::Pulp3::Repository::CreatePublication
Input:
{“repository_id”=>9704,
“smart_proxy_id”=>1,
“contents_changed”=>true,
“skip_publication_creation”=>nil,
“remote_user”=>“admin”,
“remote_cp_user”=>“admin”,
“current_request_id”=>“1929b264-ca72-4792-84b9-b5c2612f265d”,
“current_timezone”=>“Warsaw”,
“current_organization_id”=>1,
“current_location_id”=>nil,
“current_user_id”=>4}
Output:
{“response”=>
{“task”=>“/pulp/api/v3/tasks/0196b631-149a-7065-ac6f-41eba8596d8b/”},
“pulp_tasks”=>
[{“pulp_href”=>“/pulp/api/v3/tasks/0196b631-149a-7065-ac6f-41eba8596d8b/”,
“pulp_created”=>“2025-05-09T17:56:32.026+00:00”,
“state”=>“failed”,
“name”=>“pulp_python.app.tasks.publish.publish”,
“logging_cid”=>“1929b264-ca72-4792-84b9-b5c2612f265d”,
“created_by”=>“/pulp/api/v3/users/1/”,
“started_at”=>“2025-05-09T17:56:32.371+00:00”,
“finished_at”=>“2025-05-09T17:56:46.904+00:00”,
“error”=>
{“traceback”=>
" File “/usr/lib/python3.11/site-packages/pulpcore/tasking/tasks.py”, line 61, in _execute_task\n" +
" result = func(*args, **kwargs)\n" +
" ^^^^^^^^^^^^^^^^^^^^^\n" +
" File “/usr/lib/python3.11/site-packages/pulp_python/app/tasks/publish.py”, line 33, in publish\n" +
" write_simple_api(pub)\n" +
" File “/usr/lib/python3.11/site-packages/pulp_python/app/tasks/publish.py”, line 88, in write_simple_api\n" +
" write_project_page(\n" +
" File “/usr/lib/python3.11/site-packages/pulp_python/app/tasks/publish.py”, line 113, in write_project_page\n" +
" os.mkdir(project_dir)\n",
“description”=>“[Errno 17] File exists: ‘simple/prometheus-client/’”},
“worker”=>“/pulp/api/v3/workers/0196b62f-c1ab-7ac4-9c8e-085d30639a37/”,
“child_tasks”=>,
“progress_reports”=>,
“created_resources”=>,
“reserved_resources_record”=>
[“shared:/pulp/api/v3/repositories/python/python/0196b55b-3eca-7410-b633-d14ad25f617e/”,
“shared:/pulp/api/v3/domains/018d35a6-7d26-7eda-9c61-75801b2b21d1/”]}],
“task_groups”=>,
“poll_attempts”=>{“total”=>13, “failed”=>1}}
Exception:
Katello::Errors::Pulp3Error: [Errno 17] File exists: ‘simple/prometheus-client/’
Backtrace:
/usr/share/gems/gems/katello-4.11.0/app/lib/actions/pulp3/abstract_async_task.rb:108:in block in check_for_errors' /usr/share/gems/gems/katello-4.11.0/app/lib/actions/pulp3/abstract_async_task.rb:106:in
each’
/usr/share/gems/gems/katello-4.11.0/app/lib/actions/pulp3/abstract_async_task.rb:106:in check_for_errors' /usr/share/gems/gems/katello-4.11.0/app/lib/actions/pulp3/abstract_async_task.rb:162:in
poll_external_task’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action/polling.rb:100:in poll_external_task_with_rescue' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action/polling.rb:22:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action/cancellable.rb:14:in run' /usr/share/gems/gems/katello-4.11.0/app/lib/actions/pulp3/abstract_async_task.rb:10:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:589:in block (3 levels) in execute_run' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/katello-4.11.0/app/lib/actions/middleware/execute_if_contents_changed.rb:5:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:32:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/katello-4.11.0/app/lib/actions/middleware/remote_action.rb:16:in
block in run’
/usr/share/gems/gems/katello-4.11.0/app/lib/actions/middleware/remote_action.rb:40:in block in as_remote_user' /usr/share/gems/gems/katello-4.11.0/app/models/katello/concerns/user_extensions.rb:21:in
cp_config’
/usr/share/gems/gems/katello-4.11.0/app/lib/actions/middleware/remote_action.rb:27:in as_cp_user' /usr/share/gems/gems/katello-4.11.0/app/lib/actions/middleware/remote_action.rb:39:in
as_remote_user’
/usr/share/gems/gems/katello-4.11.0/app/lib/actions/middleware/remote_action.rb:16:in run' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in
call’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in pass' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in
pass’
/usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/rails_executor_wrap.rb:14:in block in run' /usr/share/gems/gems/activesupport-6.1.7.6/lib/active_support/execution_wrapper.rb:91:in
wrap’
/usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/rails_executor_wrap.rb:13:in run' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in
call’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in pass' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action/progress.rb:31:in with_progress_calculation' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action/progress.rb:17:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/load_setting_values.rb:20:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_request_id.rb:15:in
block in run’
/usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_request_id.rb:52:in restore_current_request_id' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_request_id.rb:15:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_timezone.rb:15:in
block in run’
/usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_timezone.rb:44:in restore_curent_timezone' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_timezone.rb:15:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_taxonomies.rb:15:in
block in run’
/usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_taxonomies.rb:45:in restore_current_taxonomies' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_taxonomies.rb:15:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:32:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:27:in
pass’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware.rb:19:in pass' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_user.rb:15:in
block in run’
/usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_user.rb:54:in restore_curent_user' /usr/share/gems/gems/foreman-tasks-9.0.0/app/lib/actions/middleware/keep_current_user.rb:15:in
run’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/stack.rb:23:in call' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/middleware/world.rb:31:in
execute’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:588:in block (2 levels) in execute_run' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:587:in
catch’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:587:in block in execute_run' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:490:in
block in with_error_handling’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:490:in catch' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:490:in
with_error_handling’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:582:in execute_run' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/action.rb:303:in
execute’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:18:in block (2 levels) in execute' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/execution_plan/steps/abstract.rb:167:in
with_meta_calculation’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:17:in block in execute' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:32:in
open_action’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:16:in execute' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/director.rb:94:in
execute’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/executors/sidekiq/worker_jobs.rb:11:in block (2 levels) in perform' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/executors.rb:18:in
run_user_code’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/executors/sidekiq/worker_jobs.rb:9:in block in perform' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/executors/sidekiq/worker_jobs.rb:25:in
with_telemetry’
/usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/executors/sidekiq/worker_jobs.rb:8:in perform' /usr/share/gems/gems/dynflow-1.8.2/lib/dynflow/executors/sidekiq/serialization.rb:27:in
perform’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in execute_job' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in
block (2 levels) in process’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:172:in invoke' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in
block in process’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in block (6 levels) in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in
local’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in block (5 levels) in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq.rb:44:in
block in module:Sidekiq’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in block (4 levels) in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in
stats’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in block (3 levels) in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in
call’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in block (2 levels) in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in
global’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in block in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in
prepare’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in dispatch' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in
process’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in process_one' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in
run’
/usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:8:in watchdog' /usr/share/gems/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:17:in
block in safe_thread’
/usr/share/gems/gems/logging-2.3.1/lib/logging/diagnostic_context.rb:474:in `block in create_with_logging_context’
Action:
Actions::Pulp3::Repository::SavePublication
Input:
{“repository_id”=>9704,
“tasks”=>Step(12).output,
“contents_changed”=>true,
“remote_user”=>“admin”,
“remote_cp_user”=>“admin”,
“current_request_id”=>“1929b264-ca72-4792-84b9-b5c2612f265d”,
“current_timezone”=>“Warsaw”,
“current_organization_id”=>1,
“current_location_id”=>nil,
“current_user_id”=>4}
Output:
{}