diff --git a/CHANGES/1324.feature b/CHANGES/1324.feature new file mode 100644 index 000000000..c805a8a05 --- /dev/null +++ b/CHANGES/1324.feature @@ -0,0 +1 @@ +Added support for serving Python content form a repository version. diff --git a/pulp-glue/src/pulp_glue/python/context.py b/pulp-glue/src/pulp_glue/python/context.py index e05839e12..fd55894b3 100644 --- a/pulp-glue/src/pulp_glue/python/context.py +++ b/pulp-glue/src/pulp_glue/python/context.py @@ -72,6 +72,24 @@ def preprocess_entity(self, body: EntityDefinition, partial: bool = False) -> En body["publication"] = None if "repository" not in body and "publication" in body: body["repository"] = None + + if self.pulp_ctx.has_plugin(PluginRequirement("python", specifier=">=3.21.0")): + version = body.pop("version", None) + if version is not None: + if repository_href := body.pop("repository", None): + body["repository_version"] = f"{repository_href}versions/{version}/" + body["repository"] = None + else: + current_entity = getattr(self, "entity", {}) + if repository_href := current_entity.get("repository"): + body["repository_version"] = f"{repository_href}versions/{version}/" + body["repository"] = None + elif repository_version_href := current_entity.get("repository_version"): + repository_href = repository_version_href.partition("versions")[0] + body["repository_version"] = f"{repository_href}versions/{version}/" + elif "repository" in body: + body["repository_version"] = None + return body diff --git a/src/pulpcore/cli/python/distribution.py b/src/pulpcore/cli/python/distribution.py index 39f67fb31..c94e0f7cd 100644 --- a/src/pulpcore/cli/python/distribution.py +++ b/src/pulpcore/cli/python/distribution.py @@ -40,6 +40,7 @@ context_table={"python:python": PulpPythonRepositoryContext}, help=_( "Repository to be used for auto-distributing." + " When used with --version, this will create repository_version instead." " When set, this will unset the 'publication'." " Specified as '[[:]:]' or as href." ), @@ -75,6 +76,12 @@ def distribution(ctx: click.Context, pulp_ctx: PulpCLIContext, /, distribution_t ), ), repository_option, + pulp_option( + "--version", + type=int, + help=_("A repository version number, leave blank for latest."), + needs_plugins=[PluginRequirement("python", specifier=">=3.21.0")], + ), content_guard_option, pulp_option( "--allow-uploads/--block-uploads", diff --git a/tests/scripts/pulp_python/test_distribution.sh b/tests/scripts/pulp_python/test_distribution.sh index 69695d080..3a7b94c62 100755 --- a/tests/scripts/pulp_python/test_distribution.sh +++ b/tests/scripts/pulp_python/test_distribution.sh @@ -10,6 +10,7 @@ cleanup() { pulp python repository destroy --name "cli_test_python_distribution_repository" || true pulp python remote destroy --name "cli_test_python_distribution_remote" || true pulp python distribution destroy --name "cli_test_python_distro" || true + pulp python distribution destroy --name "cli_test_python_distro_repo_version" || true } trap cleanup EXIT @@ -42,3 +43,39 @@ expect_succ pulp python distribution update \ --remote "cli_test_python_distribution_remote" expect_succ pulp python distribution destroy --distribution "cli_test_python_distro" + +# Test repository_version functionality +pulp debug has-plugin --name "python" --specifier ">=3.21.0" || exit 0 + +expect_succ pulp python distribution create \ + --name "cli_test_python_distro_repo_version" \ + --base-path "cli_test_python_distro_repo_version" \ + --repository "cli_test_python_distribution_repository" \ + --version 0 +expect_succ pulp python distribution show --distribution "cli_test_python_distro_repo_version" +echo "$OUTPUT" | jq -e '.repository_version | contains("/versions/0/")' +echo "$OUTPUT" | jq -e '.repository == null' + +expect_succ pulp python distribution update \ + --distribution "cli_test_python_distro_repo_version" \ + --repository "cli_test_python_distribution_repository" \ + --version 1 +expect_succ pulp python distribution show --distribution "cli_test_python_distro_repo_version" +echo "$OUTPUT" | jq -e '.repository_version | contains("/versions/1/")' +echo "$OUTPUT" | jq -e '.repository == null' + +expect_succ pulp python distribution update \ + --distribution "cli_test_python_distro_repo_version" \ + --version 0 +expect_succ pulp python distribution show --distribution "cli_test_python_distro_repo_version" +echo "$OUTPUT" | jq -e '.repository_version | contains("/versions/0/")' +echo "$OUTPUT" | jq -e '.repository == null' + +expect_succ pulp python distribution update \ + --distribution "cli_test_python_distro_repo_version" \ + --repository "cli_test_python_distribution_repository" +expect_succ pulp python distribution show --distribution "cli_test_python_distro_repo_version" +echo "$OUTPUT" | jq -e '.repository_version == null' +echo "$OUTPUT" | jq -e '.repository != null' + +expect_succ pulp python distribution destroy --distribution "cli_test_python_distro_repo_version"