Skip to content

Commit

Permalink
Add support for Replicate feature
Browse files Browse the repository at this point in the history
Pulp Container now supports the Replication feature.

closes pulp#1648
  • Loading branch information
MichalPysik committed Jun 10, 2024
1 parent 7cab423 commit a98f10d
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGES/1648.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Added support for the Replication feature. The replication process allows a Pulp instance to
replicate container repositories from an upstream Pulp, creating the required remotes,
repositories, and distributions.
53 changes: 53 additions & 0 deletions pulp_container/app/replica.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from pulpcore.plugin.replica import Replicator
from pulpcore.plugin.util import get_url

from pulp_glue.container.context import (
PulpContainerDistributionContext,
PulpContainerRepositoryContext,
)

from pulp_container.app.models import ContainerDistribution, ContainerRemote, ContainerRepository
from pulp_container.app.tasks import synchronize as container_synchronize


class ContainerReplicator(Replicator):
distribution_ctx_cls = PulpContainerDistributionContext
repository_ctx_cls = PulpContainerRepositoryContext
remote_model_cls = ContainerRemote
repository_model_cls = ContainerRepository
distribution_model_cls = ContainerDistribution
distribution_serializer_name = "ContainerDistributionSerializer"
repository_serializer_name = "ContainerRepositorySerializer"
remote_serializer_name = "ContainerRemoteSerializer"
app_label = "container"
sync_task = container_synchronize

def sync_params(self, repository, remote):
"""Returns a dictionary where key is a parameter for the sync task."""
return dict(
remote_pk=str(remote.pk),
repository_pk=str(repository.pk),
signed_only=False,
mirror=True,
)

def url(self, upstream_distribution):
return self.pulp_ctx._api_kwargs["base_url"]

def remote_extra_fields(self, upstream_distribution):
upstream_name = upstream_distribution["registry_path"].split("/")[1]
return {"upstream_name": upstream_name}

def distribution_data(self, repository, upstream_distribution):
"""
Return the fields that need to be updated/cleared on distributions for idempotence.
"""
return {
"repository": get_url(repository),
"base_path": upstream_distribution["base_path"],
"private": upstream_distribution["private"],
"description": upstream_distribution["description"],
}


REPLICATION_ORDER = [ContainerReplicator]

0 comments on commit a98f10d

Please sign in to comment.