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 #1648
  • Loading branch information
MichalPysik authored and lubosmj committed Jun 20, 2024
1 parent ff3068c commit ce05037
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 1 deletion.
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 (those will always be read-only), 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)[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]
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
jsonschema>=4.4,<4.23
pulpcore>=3.46.0,<3.55
pulpcore>=3.49.0,<3.55
pyjwt[crypto]>=2.4,<2.9
1 change: 1 addition & 0 deletions staging_docs/user/tutorials/00-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@ If you'd like to watch a recent talk about Pulp Container and see it in action,
- Sign images and host Cosign signatures, SBOMS and attestations
- Sign images and host Atomic signature type via extensions API
- Host content via pull-through caching distributions
- Discover and replicate distributions to serve the same content as the upstream Pulp

0 comments on commit ce05037

Please sign in to comment.