def setUpClass(cls): """ Define APIs to use and pull images needed later in tests """ cfg = config.get_config() cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc admin_user, admin_password = cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} cls.user_creator = gen_user([ "container.add_containernamespace", "container.add_containerdistribution" ]) cls.user_dist_collaborator = gen_user([]) cls.user_dist_consumer = gen_user([]) cls.user_namespace_collaborator = gen_user([]) cls.user_reader = gen_user([]) cls.user_helpless = gen_user([]) # View push repositories, distributions, and namespaces using user_creator. api_client = gen_container_client() api_client.configuration.username = cls.user_admin["username"] api_client.configuration.password = cls.user_admin["password"] cls.pushrepository_api = RepositoriesContainerPushApi(api_client) cls.namespace_api = PulpContainerNamespacesApi(api_client) cls._pull(f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_a") cls._pull(f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_b") cls._pull(f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_c") cls._pull(f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_d")
def setUpClass(cls): """Define APIs to use and pull images needed later in tests.""" api_client = gen_container_client() cls.tags_api = ContentTagsApi(api_client) cls.manifests_api = ContentManifestsApi(api_client) cls.repositories_api = RepositoriesContainerPushApi(api_client) cfg = config.get_config() cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc cls.repository_name = "namespace/tags" cls.registry_repository_name = f"{cls.registry_name}/{cls.repository_name}" manifest_a = f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_a" tagged_registry_manifest_a = f"{cls.registry_repository_name}:manifest_a" manifest_b = f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_b" tagged_registry_manifest_b = f"{cls.registry_repository_name}:manifest_b" cls.registry.pull(manifest_a) cls.registry.pull(manifest_b) cls.registry.tag(manifest_a, tagged_registry_manifest_a) cls.registry.tag(manifest_b, tagged_registry_manifest_b) cls.registry.login("-u", "admin", "-p", "password", cls.registry_name) cls.registry.push(tagged_registry_manifest_a) cls.registry.push(tagged_registry_manifest_b) cls.repository = cls.repositories_api.list( name=cls.repository_name).results[0]
def setUpClass(cls): """ Define APIs to use and pull images needed later in tests """ api_client = gen_container_client() cls.pushrepository_api = RepositoriesContainerPushApi(api_client) cls.namespace_api = PulpContainerNamespacesApi(api_client) cls.repo_version_api = RepositoriesContainerVersionsApi(api_client) cfg = config.get_config() cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc admin_user, admin_password = cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} cls.user_creator = gen_user( [ "container.add_containerdistribution", "container.add_containernamespace", ] ) cls.user_reader = gen_user(["container.view_containerpushrepository"]) cls.user_helpless = gen_user([]) # create a push repo image_path = f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_d" cls._pull(image_path) repo_name = "testrv/perms" local_url = "/".join([cls.registry_name, f"{repo_name}:1.0"]) cls._push(image_path, local_url, cls.user_creator) cls.repository = cls.pushrepository_api.list(name=repo_name).results[0]
def gen_user(permissions): """Create a user with a set of permissions in the pulp database.""" user = { "username": utils.uuid4(), "password": utils.uuid4(), "permissions": permissions, } utils.execute_pulpcore_python( cli_client, "\n".join(CREATE_USER_CMD).format(**user), ) api_config = cfg.get_bindings_config() api_config.username = user["username"] api_config.password = user["password"] user["core_api_client"] = CoreApiClient(api_config) user["groups_api"] = GroupsApi(user["core_api_client"]) user["group_users_api"] = GroupsUsersApi(user["core_api_client"]) user["api_client"] = ContainerApiClient(api_config) user["distribution_api"] = DistributionsContainerApi(user["api_client"]) user["remote_api"] = RemotesContainerApi(user["api_client"]) user["repository_api"] = RepositoriesContainerApi(user["api_client"]) user["pushrepository_api"] = RepositoriesContainerPushApi(user["api_client"]) user["repo_version_api"] = RepositoriesContainerVersionsApi(user["api_client"]) user["tags_api"] = ContentTagsApi(user["api_client"]) user["manifests_api"] = ContentManifestsApi(user["api_client"]) user["blobs_api"] = ContentBlobsApi(user["api_client"]) return user
def setUpClass(cls): """ Define APIs to use. """ api_client = gen_container_client() cls.pushrepository_api = RepositoriesContainerPushApi(api_client) cls.namespace_api = PulpContainerNamespacesApi(api_client) cfg = config.get_config() cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc cls.user_creator = gen_user( model_roles=[ "container.containerdistribution_creator", "container.containernamespace_creator", ] ) cls.user_reader = gen_user(model_roles=["container.containerdistribution_consumer"]) cls.user_helpless = gen_user() # create a push repo image_path = f"{REGISTRY_V2_REPO_PULP}:manifest_d" cls._pull(image_path) repo_name = "test_push_repo/perms" local_url = "/".join([cls.registry_name, f"{repo_name}:1.0"]) cls._push(image_path, local_url, cls.user_creator) cls.repository = cls.pushrepository_api.list(name=repo_name).results[0]
def setUpClass(cls): """Define class-wide variables and initialize a repository needed later in the tests.""" cfg = config.get_config() cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc admin_user, admin_password = cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} api_client = gen_container_client() api_client.configuration.username = cls.user_admin["username"] api_client.configuration.password = cls.user_admin["password"] cls.repositories_api = RepositoriesContainerPushApi(api_client) cls.versions_api = RepositoriesContainerVersionsApi(api_client) cls.namespaces_api = PulpContainerNamespacesApi(api_client) cls.manifests_api = ContentManifestsApi(api_client) cls.distributions_api = DistributionsContainerApi(api_client) # the image tagged as 'manifest_a' consists of 3 blobs, 1 manifest, and 1 tag manifest_a_path = f"{REGISTRY_V2_REPO_PULP}:manifest_a" cls._pull(manifest_a_path) local_url = "/".join([cls.registry_name, "foo/bar:tag"]) cls._push(manifest_a_path, local_url, cls.user_admin) cls.repo = cls.repositories_api.list(name="foo/bar").results[0] cls.distribution = cls.distributions_api.list( name="foo/bar").results[0] cls.namespace = cls.namespaces_api.list(name="foo").results[0] # create a new tag to test if all tags pointing to the same manifest will be removed cls.manifest_a = cls.manifests_api.list().results[0] tag_data = TagImage(tag="new_tag", digest=cls.manifest_a.digest) tag_response = cls.repositories_api.tag(cls.repo.pulp_href, tag_data) monitor_task(tag_response.task) latest_version_href = cls.repositories_api.read( cls.repo.pulp_href).latest_version_href cls.content_to_remove = cls.versions_api.read( latest_version_href).content_summary.present
def gen_user(model_roles=None, object_roles=None): """Create a user with a set of permissions in the pulp database.""" if model_roles is None: model_roles = [] if object_roles is None: object_roles = [] user = { "username": utils.uuid4(), "password": utils.uuid4(), } new_user = users_api.create(user) user["pulp_href"] = new_user.pulp_href for role in model_roles: assign_role_to_user(user, role) for role, content_object in object_roles: assign_role_to_user(user, role, content_object) api_config = cfg.get_bindings_config() api_config.username = user["username"] api_config.password = user["password"] user["core_api_client"] = CoreApiClient(api_config) user["groups_api"] = GroupsApi(user["core_api_client"]) user["group_users_api"] = GroupsUsersApi(user["core_api_client"]) user["container_api_client"] = ContainerApiClient(api_config) user["namespace_api"] = PulpContainerNamespacesApi( user["container_api_client"]) user["distribution_api"] = DistributionsContainerApi( user["container_api_client"]) user["remote_api"] = RemotesContainerApi(user["container_api_client"]) user["repository_api"] = RepositoriesContainerApi( user["container_api_client"]) user["pushrepository_api"] = RepositoriesContainerPushApi( user["container_api_client"]) user["repo_version_api"] = RepositoriesContainerVersionsApi( user["container_api_client"]) user["tags_api"] = ContentTagsApi(user["container_api_client"]) user["manifests_api"] = ContentManifestsApi(user["container_api_client"]) user["blobs_api"] = ContentBlobsApi(user["container_api_client"]) return user
def setUpClass(cls): """Initialize class-wide variables and create a new repository by pushing content to it.""" cls.cfg = config.get_config() cls.client = api.Client(cls.cfg, api.code_handler) cls.registry = cli.RegistryClient(cls.cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cls.cfg.get_base_url()).netloc admin_user, admin_password = cls.cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} api_client = gen_container_client() api_client.configuration.username = cls.user_admin["username"] api_client.configuration.password = cls.user_admin["password"] cls.distributions_api = DistributionsContainerApi(api_client) cls.pushrepository_api = RepositoriesContainerPushApi(api_client) cls.repo_version_api = RepositoriesContainerVersionsApi(api_client) cls.blobs_api = ContentBlobsApi(api_client) cls._pull(f"{REGISTRY_V2_REPO_PULP}:manifest_a") local_url = f"{cls.registry_name}/test-1:manifest_a" image_path = f"{REGISTRY_V2_REPO_PULP}:manifest_a" cls._push(image_path, local_url, cls.user_admin) repository = cls.pushrepository_api.list(name="test-1").results[0] cls.blobs = cls.blobs_api.list(repository_version=repository.latest_version_href).results cls.distribution = cls.distributions_api.list(name="test-1").results[0] cls.user_pull = gen_user( object_roles=[("container.containernamespace_consumer", cls.distribution.namespace)] ) cls.user_push = gen_user( object_roles=[("container.containernamespace_collaborator", cls.distribution.namespace)] ) cls.user_anon = gen_user()
def setUpClass(cls): """Initialize a new manifest list that will be pushed to the registry.""" cfg = config.get_config() cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc admin_user, admin_password = cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} api_client = gen_container_client() api_client.configuration.username = cls.user_admin["username"] api_client.configuration.password = cls.user_admin["password"] cls.pushrepository_api = RepositoriesContainerPushApi(api_client) cls.distributions_api = DistributionsContainerApi(api_client) cls.manifests_api = ContentManifestsApi(api_client) cls.tags_api = ContentTagsApi(api_client) cls.manifest_a = f"{REGISTRY_V2_REPO_PULP}:manifest_a" cls.manifest_b = f"{REGISTRY_V2_REPO_PULP}:manifest_b" cls.manifest_c = f"{REGISTRY_V2_REPO_PULP}:manifest_c" cls._pull(cls.manifest_a) cls._pull(cls.manifest_b) cls._pull(cls.manifest_c) # get default manifests' digests for the further comparison manifest_a_digest = cls.registry.inspect(cls.manifest_a)[0]["Digest"] manifest_b_digest = cls.registry.inspect(cls.manifest_b)[0]["Digest"] manifest_c_digest = cls.registry.inspect(cls.manifest_c)[0]["Digest"] cls.manifests_v2s2_digests = sorted( [manifest_a_digest, manifest_b_digest, manifest_c_digest]) # create a new manifest list composed of the pulled manifest images cls.image_v2s2_tag = "manifest_list" cls.image_v2s2_path = f"{REGISTRY_V2_REPO_PULP}:{cls.image_v2s2_tag}" cls.local_v2s2_url = f"{cls.registry_name}/foo:{cls.image_v2s2_tag}" cls.registry._dispatch_command("manifest", "create", cls.image_v2s2_path) cls.registry._dispatch_command("manifest", "add", cls.image_v2s2_path, cls.manifest_a) cls.registry._dispatch_command("manifest", "add", cls.image_v2s2_path, cls.manifest_b) cls.registry._dispatch_command("manifest", "add", cls.image_v2s2_path, cls.manifest_c) # get digests of manifests after converting images to the OCI format by reloading them cls.registry._dispatch_command("save", cls.manifest_a, "--format", "oci-dir", "-o", "manifest_a.tar") cls.registry._dispatch_command("save", cls.manifest_b, "--format", "oci-dir", "-o", "manifest_b.tar") cls.registry._dispatch_command("save", cls.manifest_c, "--format", "oci-dir", "-o", "manifest_c.tar") cls.registry._dispatch_command("load", "-q", "-i", "manifest_a.tar") cls.registry._dispatch_command("load", "-q", "-i", "manifest_b.tar") cls.registry._dispatch_command("load", "-q", "-i", "manifest_c.tar") manifest_a_digest = cls.registry.inspect("manifest_a.tar")[0]["Digest"] manifest_b_digest = cls.registry.inspect("manifest_b.tar")[0]["Digest"] manifest_c_digest = cls.registry.inspect("manifest_c.tar")[0]["Digest"] cls.manifests_oci_digests = sorted( [manifest_a_digest, manifest_b_digest, manifest_c_digest]) # create an empty manifest list cls.empty_image_tag = "empty_manifest_list" cls.empty_image_path = f"{REGISTRY_V2_REPO_PULP}:{cls.empty_image_tag}" cls.empty_image_local_url = f"{cls.registry_name}/foo:{cls.empty_image_tag}" cls.registry._dispatch_command("manifest", "create", cls.empty_image_path)
def setUpClass(cls): """ Define APIs to use and pull images needed later in tests """ api_client = gen_container_client() cfg = config.get_config() cls.repository_api = RepositoriesContainerApi(api_client) cls.pushrepository_api = RepositoriesContainerPushApi(api_client) cls.tags_api = ContentTagsApi(api_client) cls.namespace_api = PulpContainerNamespacesApi(api_client) cls.registry = cli.RegistryClient(cfg) cls.registry.raise_if_unsupported(unittest.SkipTest, "Tests require podman/docker") cls.registry_name = urlparse(cfg.get_base_url()).netloc admin_user, admin_password = cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} cls.user_creator = gen_user( [ "container.add_containerrepository", "container.add_containerremote", "container.add_containernamespace", "container.add_containerdistribution", ] ) cls.user_creator2 = gen_user( [ "container.add_containernamespace", "container.add_containerdistribution", ] ) cls.user_reader = gen_user( [ "container.view_containerrepository", "container.view_containerpushrepository", ] ) cls.user_reader2 = gen_user(["container.view_containerrepository"]) cls.user_reader3 = gen_user(["container.view_containerpushrepository"]) cls.user_helpless = gen_user([]) # create a push repo with user_creator image_path = f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_a" cls._pull(image_path) repo_name = "testcontent/perms" local_url = "/".join([cls.registry_name, f"{repo_name}:1.0"]) cls._push(image_path, local_url, cls.user_creator) cls.push_repository = cls.pushrepository_api.list(name=repo_name).results[0] # create a second push repo with user_creator2 image_path = f"{DOCKERHUB_PULP_FIXTURE_1}:manifest_b" cls._pull(image_path) repo_name = "testcontent2/perms" local_url = "/".join([cls.registry_name, f"{repo_name}:1.0"]) cls._push(image_path, local_url, cls.user_creator2) cls.push_repository2 = cls.pushrepository_api.list(name=repo_name).results[0] # sync a repo with user_creator cls.repository = cls.user_creator["repository_api"].create( ContainerContainerRepository(**gen_repo()) ) cls.remote = cls.user_creator["remote_api"].create( gen_container_remote(upstream_name=DOCKERHUB_PULP_FIXTURE_1) ) sync_data = RepositorySyncURL(remote=cls.remote.pulp_href) sync_response = cls.user_creator["repository_api"].sync(cls.repository.pulp_href, sync_data) monitor_task(sync_response.task)
# coding=utf-8 """Tests that verify that images can be pushed to Pulp.""" import unittest from pulp_smash import cli, config, exceptions from pulp_container.tests.functional.utils import gen_container_client from pulpcore.client.pulp_container import RepositoriesContainerPushApi cfg = config.get_config() api_client = gen_container_client() push_repositories_api = RepositoriesContainerPushApi(api_client) registry = cli.RegistryClient(cfg) class PushContentTestCase(unittest.TestCase): """Verify whether images can be pushed to pulp.""" def test_push_using_registry_client(self): """Test push with official registry client""" registry.raise_if_unsupported(unittest.SkipTest, "Test requires podman/docker") # TODO better handling of the "http://" registry_name = cfg.get_base_url()[7:] local_url = "/".join([registry_name, "foo/bar:1.0"]) # Be sure to not being logged in registry.logout(registry_name) # Pull an image with large blobs registry.pull("centos:7")