Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Advanced copy workflow fails when same destination repo is used during multi-repository-copy #3444

Open
GeorgFleig opened this issue Feb 14, 2024 · 0 comments
Labels

Comments

@GeorgFleig
Copy link

Version

  • core: 3.45.1
  • rpm: 3.25.1

Describe the bug
Hi, I am using the advanced copy workflow to craft a repository containing only the packages I need. Using the "Multi-repository-copy" described here, I can successfully copy RPM packages and their dependencies from multiple repositories (with cross dependencies) to multiple destination repositories.

My goal though is to copy all RPMs to a single repository. Defining the same destination repo for all source repos results in successful dependency resolution according to the solver debug log, however pulp will fail with the following error message:

pulp [e0978b46762b4f3688acb5a5b0b35a5a]: pulpcore.tasking.tasks:INFO: Starting task 018da344-2c37-71e3-9d13-46b9d9b380ce
pulp [e0978b46762b4f3688acb5a5b0b35a5a]: pulp_rpm.app.depsolving:INFO: Writing solver debug data to /var/tmp/pulp/018da344-2c37-71e3-9d13-46b9d9b380ce
pulp [e0978b46762b4f3688acb5a5b0b35a5a]: pulpcore.tasking.tasks:INFO: Task 018da344-2c37-71e3-9d13-46b9d9b380ce failed (duplicate key value violates unique constraint "core_repositoryversion_repository_id_number_3c54ce50_uniq"
DETAIL:  Key (repository_id, number)=(018da342-5e59-7cd4-ae2b-f6ae2c84c999, 1) already exists.)
pulp [e0978b46762b4f3688acb5a5b0b35a5a]: pulpcore.tasking.tasks:INFO:   File "/usr/local/lib/python3.9/site-packages/pulpcore/tasking/tasks.py", line 60, in _execute_task
    result = func(*args, **kwargs)

  File "/usr/lib64/python3.9/contextlib.py", line 79, in inner
    return func(*args, **kwds)

  File "/usr/local/lib/python3.9/site-packages/pulp_rpm/app/tasks/copy.py", line 235, in copy_content
    with dest_repo_version.repository.new_version(base_version=base_version) as new_version:

  File "/usr/local/lib/python3.9/site-packages/pulpcore/app/models/repository.py", line 186, in new_version
    version.save()

  File "/usr/lib64/python3.9/contextlib.py", line 79, in inner
    return func(*args, **kwds)

  File "/usr/local/lib/python3.9/site-packages/django_lifecycle/mixins.py", line 192, in save
    save(*args, **kwargs)

  File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 814, in save
    self.save_base(

  File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 877, in save_base
    updated = self._save_table(

  File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 1020, in _save_table
    results = self._do_insert(

  File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 1061, in _do_insert
    return manager._insert(

  File "/usr/local/lib/python3.9/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)

  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1805, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)

  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1822, in execute_sql
    cursor.execute(sql, params)

  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(

  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)

  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)

  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value

  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)

  File "/usr/local/lib/python3.9/site-packages/psycopg/cursor.py", line 732, in execute
    raise ex.with_traceback(None)

I did reduce the number of workers to 1 to make sure this is not a concurrency problem.

To Reproduce

# add remotes
pulp rpm remote create --name="appstream_93" --url "https://dl.rockylinux.org/pub/rocky/9.3/AppStream/x86_64/os/" --policy on_demand
pulp rpm remote create --name="baseos_93" --url "https://dl.rockylinux.org/pub/rocky/9.3/BaseOS/x86_64/os/" --policy on_demand

# add source repos and sync them from remote
pulp rpm repository create --autopublish --name appstream_93 --remote appstream_93
pulp rpm distribution create --generate-repo-config --name appstream_93 --repository appstream_93 --base-path appstream_93
pulp rpm repository sync --name appstream_93

pulp rpm repository create --autopublish --name baseos_93 --remote baseos_93
pulp rpm distribution create --generate-repo-config --name baseos_93 --repository baseos_93 --base-path baseos_93
pulp rpm repository sync --name baseos_93

# create dest repo
pulp rpm repository create --name dest_repo

# get repo version hrefs for copy command
pulp rpm repository list --field name --field latest_version_href

# get package href of postfix in appstream_93 repo for copy command
pulp rpm content list --field pulp_href --field version --field release --field name --name postfix --ordering -version --ordering -release --limit 1

# copy
curl -v \
  --header "Content-Type: application/json" \
  --user "admin:foobar" \
  --data '{
    "config": [
        {"source_repo_version": "<HREF_OF_APPSTREAM_REPO_VERSION>", "dest_repo": "<HREF_OF_DEST_REPO>", "content": ["<HREF_OF_POSTFIX_RPM>"]},
        {"source_repo_version": "<HREF_OF_BASEOS_REPO_VERSION>", "dest_repo": "<HREF_OF_DEST_REPO>", "content": []}
    ],
    "dependency_solving": true
  }' \
  http://localhost:8080/pulp/api/v3/rpm/copy/

Expected behavior
Ideally: All desired RPMs are placed into a single destination repository.

If that is not possible, then validation of the repo tuples to check for duplicate destination repositories. And ideally documentation stating that this is not allowed.

Additional context
https://discourse.pulpproject.org/t/use-advanced-copy-workflow-to-merge-rpm-repositories/1105

Workaround (as described in the discourse thread): Copy to two different destination repositories and use a second advanced copy workflow job to copy the contents of destination repo 2 destination repo 1. Remember to turn off dependency solving this time. Tested and worked as expected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants