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 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): """Sync a remote repository and create a new distribution pointing to the repository.""" client_api = gen_container_client() cls.blobs_api = ContentBlobsApi(client_api) cls.manifests_api = ContentManifestsApi(client_api) cls.tags_api = ContentTagsApi(client_api) cls.repo_api = RepositoriesContainerApi(client_api) cls.remote_api = RemotesContainerApi(client_api) cls.dist_api = DistributionsContainerApi(client_api) cls.repo = cls.repo_api.create(gen_repo()) cls.remote = cls.remote_api.create(gen_container_remote()) body = ContainerRepositorySyncURL(remote=cls.remote.pulp_href) response = cls.repo_api.sync(cls.repo.pulp_href, body) monitor_task(response.task) cls.repo = cls.repo_api.read(cls.repo.pulp_href) response = cls.dist_api.create( gen_distribution(repository=cls.repo.pulp_href)) cls.distro = cls.dist_api.read( monitor_task(response.task).created_resources[0]) relative_path = os.path.join("v2/", f"{cls.distro.base_path}/") cls.dist_url = urljoin(PULP_CONTENT_HOST_BASE_URL, relative_path)
def setUpClass(cls): """Create class-wide variables.""" client_api = gen_container_client() cls.repositories_api = RepositoriesContainerApi(client_api) cls.remotes_api = RemotesContainerApi(client_api) cls.tags_api = ContentTagsApi(client_api) cls.versions_api = RepositoriesContainerVersionsApi(client_api) cls.repository = None
def test_sync_idempotency(self): """Ensure that sync does not create orphan tags https://pulp.plan.io/issues/5252 .""" sync_data = RepositorySyncURL(remote=self.remote.pulp_href) sync_response = self.repository_api.sync(self.from_repo.pulp_href, sync_data) monitor_task(sync_response.task) tags_api = ContentTagsApi(self.client_api) first_sync_tags_named_a = tags_api.list(name="manifest_a") sync_response = self.repository_api.sync(self.from_repo.pulp_href, sync_data) monitor_task(sync_response.task) second_sync_tags_named_a = tags_api.list(name="manifest_a") self.assertEqual(first_sync_tags_named_a.count, 1) self.assertEqual(second_sync_tags_named_a.count, 1)
def setUpClass(cls): """Create class wide-variables.""" api_client = gen_container_client() cls.repositories_api = RepositoriesContainerApi(api_client) cls.versions_api = RepositoriesContainerVersionsApi(api_client) cls.remotes_api = RemotesContainerApi(api_client) cls.tags_api = ContentTagsApi(api_client) cls.manifests_api = ContentManifestsApi(api_client) cls.repository = cls.repositories_api.create(ContainerContainerRepository(**gen_repo())) remote_data = gen_container_remote(upstream_name=DOCKERHUB_PULP_FIXTURE_1) cls.remote = cls.remotes_api.create(ContainerContainerRemote(**remote_data)) sync_data = RepositorySyncURL(remote=cls.remote.pulp_href) sync_response = cls.repositories_api.sync(cls.repository.pulp_href, sync_data) monitor_task(sync_response.task)
def setUpClass(cls): """ Define APIs to use and pull images needed later in tests """ api_client = gen_container_client() cfg = config.get_config() cls.repositories_api = RepositoriesContainerApi(api_client) cls.repo_version_api = RepositoriesContainerVersionsApi(api_client) cls.tags_api = ContentTagsApi(api_client) cls.manifests_api = ContentManifestsApi(api_client) 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", ] ) cls.user_repov_remover = gen_user( [ "container.delete_containerrepository_versions", "container.view_containerrepository", ] ) cls.user_repo_remover = gen_user( [ "container.delete_containerrepository", "container.view_containerrepository", ] ) cls.user_reader = gen_user(["container.view_containerrepository"]) cls.user_helpless = gen_user([]) # sync a repo 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)
def setUpClass(cls): """ Define APIs to use and pull images needed later in tests """ api_client = gen_container_client() cfg = config.get_config() cls.repositories_api = RepositoriesContainerApi(api_client) cls.repo_version_api = RepositoriesContainerVersionsApi(api_client) cls.tags_api = ContentTagsApi(api_client) cls.manifests_api = ContentManifestsApi(api_client) admin_user, admin_password = cfg.pulp_auth cls.user_admin = {"username": admin_user, "password": admin_password} cls.user_creator = gen_user( model_roles=[ "container.containerrepository_creator", "container.containerremote_creator", ] ) cls.user_repov_remover = gen_user( model_roles=[ "container.containerrepository_content_manager", ] ) # TODO: Not sure what is the right role for this user... cls.user_repo_remover = gen_user( model_roles=[ "container.containerrepository_owner", ] ) cls.user_reader = gen_user(model_roles=["container.containerrepository_viewer"]) cls.user_helpless = gen_user() # sync a repo cls.repository = cls.user_creator["repository_api"].create( ContainerContainerRepository(**gen_repo()) ) cls.remote = cls.user_creator["remote_api"].create( gen_container_remote(upstream_name=PULP_FIXTURE_1) ) sync_data = ContainerRepositorySyncURL(remote=cls.remote.pulp_href) sync_response = cls.user_creator["repository_api"].sync(cls.repository.pulp_href, sync_data) monitor_task(sync_response.task)
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): """Sync pulp/test-fixture-1 so we can copy content from it.""" api_client = gen_container_client() cls.repositories_api = RepositoriesContainerApi(api_client) cls.remotes_api = RemotesContainerApi(api_client) cls.tags_api = ContentTagsApi(api_client) cls.versions_api = RepositoriesContainerVersionsApi(api_client) cls.from_repo = cls.repositories_api.create(ContainerContainerRepository(**gen_repo())) remote_data = gen_container_remote(upstream_name=DOCKERHUB_PULP_FIXTURE_1) cls.remote = cls.remotes_api.create(ContainerContainerRemote(**remote_data)) sync_data = RepositorySyncURL(remote=cls.remote.pulp_href) sync_response = cls.repositories_api.sync(cls.from_repo.pulp_href, sync_data) monitor_task(sync_response.task) cls.latest_from_version = cls.repositories_api.read( cls.from_repo.pulp_href ).latest_version_href
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)