def test_all(self): """ Sync a repository using a Remote url that does not exist. Test that we get a task failure. """ client_api = gen_container_client() repository_api = RepositoriesContainerApi(client_api) repository = repository_api.create( ContainerContainerRepository(**gen_repo())) self.addCleanup(repository_api.delete, repository.pulp_href) remote_api = RemotesContainerApi(client_api) remote_data = gen_container_remote( url="http://i-am-an-invalid-url.com/invalid/") remote = remote_api.create(ContainerContainerRemote(**remote_data)) self.addCleanup(remote_api.delete, remote.pulp_href) repository_sync_data = RepositorySyncURL(remote=remote.pulp_href) sync_response = repository_api.sync(repository.pulp_href, repository_sync_data) with self.assertRaises(PulpTaskError) as context: monitor_task(sync_response.task) self.assertIsNotNone(context.exception.task.error["description"])
def test_all(self): """ Sync a repository using a Remote url that does not exist. Test that we get a task failure. """ client_api = gen_container_client() repository_api = RepositoriesContainerApi(client_api) repository = repository_api.create( ContainerContainerRepository(**gen_repo())) self.addCleanup(repository_api.delete, repository.pulp_href) remote_api = RemotesContainerApi(client_api) remote_data = gen_container_remote( url="http://i-am-an-invalid-url.com/invalid/") remote = remote_api.create(ContainerContainerRemote(**remote_data)) self.addCleanup(remote_api.delete, remote.pulp_href) repository_sync_data = RepositorySyncURL(remote=remote.pulp_href) sync_response = repository_api.sync(repository.pulp_href, repository_sync_data) task = monitor_task(sync_response.task) if isinstance(task, dict): self.assertIsNotNone(task["error"]["description"]) else: self.assertFalse("Sync with an invalid remote URL was successful")
def setUpClass(cls): """Create class wide-variables.""" cls.cfg = config.get_config() cls.client = api.Client(cls.cfg, api.page_handler) api_client = gen_container_client() cls.repositories_api = RepositoriesContainerApi(api_client) cls.remotes_api = RemotesContainerApi(api_client) cls.distributions_api = DistributionsContainerApi(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) distribution_data = gen_distribution(repository=cls.repository.pulp_href) distribution_response = cls.distributions_api.create( ContainerContainerDistribution(**distribution_data) ) created_resources = monitor_task(distribution_response.task).created_resources cls.distribution = cls.distributions_api.read(created_resources[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 populate_pulp(url=REGISTRY_V2_FEED_URL): """Add container contents to Pulp. :param url: The container repository URL. Defaults to :data:`pulp_container.tests.functional.constants.REGISTRY_V2_FEED_URL` :returns: A dictionary of created resources. """ container_client = ContainerApiClient(configuration) remotes_api = RemotesContainerApi(container_client) repositories_api = RepositoriesContainerApi(container_client) container_remote = remotes_api.create(gen_container_remote(url)) sync_data = RepositorySyncURL(remote=container_remote.pulp_href) container_repository = repositories_api.create(gen_repo()) sync_response = repositories_api.sync(container_repository.pulp_href, sync_data) return monitor_task(sync_response.task).created_resources
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(self): """Sync repositories with the container plugin. In order to sync a repository a remote has to be associated within this repository. When a repository is created this version field is set as None. After a sync the repository version is updated. Do the following: 1. Create a repository, and a remote. 2. Assert that repository version is None. 3. Sync the remote. 4. Assert that repository version is not None. 5. Sync the remote one more time. 6. Assert that repository version is the same from the previous one. """ repository_api = RepositoriesContainerApi(self.client_api) repository = repository_api.create( ContainerContainerRepository(**gen_repo())) self.addCleanup(repository_api.delete, repository.pulp_href) remote_api = RemotesContainerApi(self.client_api) remote = remote_api.create(gen_container_remote()) self.addCleanup(remote_api.delete, remote.pulp_href) self.assertEqual(repository.latest_version_href, f"{repository.pulp_href}versions/0/") repository_sync_data = ContainerRepositorySyncURL( remote=remote.pulp_href) # Sync the repository. sync_response = repository_api.sync(repository.pulp_href, repository_sync_data) monitor_task(sync_response.task) repository = repository_api.read(repository.pulp_href) self.assertIsNotNone(repository.latest_version_href) # Sync the repository again. latest_version_href = repository.latest_version_href sync_response = repository_api.sync(repository.pulp_href, repository_sync_data) monitor_task(sync_response.task) repository = repository_api.read(repository.pulp_href) self.assertEqual(latest_version_href, repository.latest_version_href)
def test_all(self): """Verify whether is possible to create a remote without a URL. This test targets the following issues: * `Pulp #3395 <https://pulp.plan.io/issues/3395>`_ * `Pulp Smash #984 <https://github.com/pulp/pulp-smash/issues/984>`_ """ body = gen_container_remote() del body["url"] with self.assertRaises(ApiException): RemotesContainerApi(gen_container_client()).create(body)
def setUpClass(cls): """Create class-wide variables. 1. Create a repository. 2. Create a remote pointing to external registry. 3. Sync the repository using the remote and re-read the repo data. 4. Create a container distribution to serve the repository This tests targets the following issue: * `Pulp #4460 <https://pulp.plan.io/issues/4460>`_ """ cls.cfg = config.get_config() cls.registry_name = urlparse(cls.cfg.get_base_url()).netloc cls.client = api.Client(cls.cfg, api.code_handler) client_api = gen_container_client() cls.repositories_api = RepositoriesContainerApi(client_api) cls.remotes_api = RemotesContainerApi(client_api) cls.distributions_api = DistributionsContainerApi(client_api) with contextlib.ExitStack() as stack: # ensure tearDownClass runs if an error occurs here stack.callback(cls.tearDownClass) # Step 1 _repo = cls.repositories_api.create( ContainerContainerRepository(**gen_repo())) # Step 2 cls.remote = cls.remotes_api.create(gen_container_remote()) # Step 3 sync_data = RepositorySyncURL(remote=cls.remote.pulp_href) sync_response = cls.repositories_api.sync(_repo.pulp_href, sync_data) monitor_task(sync_response.task) cls.repo = cls.repositories_api.read(_repo.pulp_href) # Step 4. distribution_response = cls.distributions_api.create( ContainerContainerDistribution( **gen_distribution(repository=cls.repo.pulp_href, base_path="pulp_pre_upgrade_test"))) created_resources = monitor_task( distribution_response.task).created_resources distribution = cls.distributions_api.read(created_resources[0]) cls.distribution_with_repo = cls.distributions_api.read( distribution.pulp_href) # remove callback if everything goes well stack.pop_all()
def setUpClass(cls): """Create class-wide variables.""" cls.client_api = gen_container_client() cls.repository_api = RepositoriesContainerApi(cls.client_api) cls.from_repo = cls.repository_api.create( ContainerContainerRepository(**gen_repo())) cls.remote_api = RemotesContainerApi(cls.client_api) remote_data = gen_container_remote(upstream_name=PULP_FIXTURE_1) cls.remote = cls.remote_api.create(remote_data) delete_orphans()
def test_file_decriptors(self): """Test whether file descriptors are closed properly. This test targets the following issue: `Pulp #4073 <https://pulp.plan.io/issues/4073>`_ Do the following: 1. Check if 'lsof' is installed. If it is not, skip this test. 2. Create and sync a repo. 3. Run the 'lsof' command to verify that files in the path ``/var/lib/pulp/`` are closed after the sync. 4. Assert that issued command returns `0` opened files. """ cli_client = cli.Client(self.cfg, cli.echo_handler) # check if 'lsof' is available if cli_client.run(("which", "lsof")).returncode != 0: raise unittest.SkipTest("lsof package is not present") repo_api = RepositoriesContainerApi(self.client_api) repo = repo_api.create(gen_repo()) self.addCleanup(repo_api.delete, repo.pulp_href) remote_api = RemotesContainerApi(self.client_api) remote = remote_api.create(gen_container_remote()) self.addCleanup(remote_api.delete, remote.pulp_href) repository_sync_data = RepositorySyncURL(remote=remote.pulp_href) sync_response = repo_api.sync(repo.pulp_href, repository_sync_data) monitor_task(sync_response.task) cmd = "lsof -t +D {}".format(MEDIA_PATH).split() response = cli_client.run(cmd).stdout self.assertEqual(len(response), 0, response)
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 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): """Create class wide-variables.""" api_client = gen_container_client() cls.repositories_api = RepositoriesContainerApi(api_client) cls.remotes_api = RemotesContainerApi(api_client) cls.distributions_api = DistributionsContainerApi(api_client) cls.namespaces_api = PulpContainerNamespacesApi(api_client) cls.cfg = config.get_config() cls.client = api.Client(cls.cfg, api.json_handler) cls.repository = cls.repositories_api.create( ContainerContainerRepository(**gen_repo())) remote_data = gen_container_remote(upstream_name=PULP_FIXTURE_1) cls.remote = cls.remotes_api.create( ContainerContainerRemote(**remote_data)) sync_data = ContainerRepositorySyncURL(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): """Create class-wide variables and delete orphans. 1. Create a repository. 2. Create a remote pointing to external registry with policy=on_demand. 3. Sync the repository using the remote and re-read the repo data. 4. Create a container distribution to serve the repository 5. Create another container distribution to the serve the repository version This tests targets the following issue: * `Pulp #4460 <https://pulp.plan.io/issues/4460>`_ """ cls.cfg = config.get_config() cls.registry_name = urlparse(cls.cfg.get_base_url()).netloc client_api = gen_container_client() cls.repositories_api = RepositoriesContainerApi(client_api) cls.remotes_api = RemotesContainerApi(client_api) cls.distributions_api = DistributionsContainerApi(client_api) cls.teardown_cleanups = [] delete_orphans() with contextlib.ExitStack() as stack: # ensure tearDownClass runs if an error occurs here stack.callback(cls.tearDownClass) # Step 1 _repo = cls.repositories_api.create( ContainerContainerRepository(**gen_repo())) cls.teardown_cleanups.append( (cls.repositories_api.delete, _repo.pulp_href)) # Step 2 cls.remote = cls.remotes_api.create( gen_container_remote(policy="on_demand")) cls.teardown_cleanups.append( (cls.remotes_api.delete, cls.remote.pulp_href)) # Step 3 sync_data = RepositorySyncURL(remote=cls.remote.pulp_href) sync_response = cls.repositories_api.sync(_repo.pulp_href, sync_data) monitor_task(sync_response.task) cls.repo = cls.repositories_api.read(_repo.pulp_href) cls.artifacts_api = ArtifactsApi(core_client) cls.artifact_count = cls.artifacts_api.list().count # Step 4. distribution_response = cls.distributions_api.create( ContainerContainerDistribution(**gen_distribution( repository=cls.repo.pulp_href))) created_resources = monitor_task( distribution_response.task).created_resources distribution = cls.distributions_api.read(created_resources[0]) cls.distribution_with_repo = cls.distributions_api.read( distribution.pulp_href) cls.teardown_cleanups.append( (cls.distributions_api.delete, cls.distribution_with_repo.pulp_href)) # Step 5. distribution_response = cls.distributions_api.create( ContainerContainerDistribution(**gen_distribution( repository_version=cls.repo.latest_version_href))) created_resources = monitor_task( distribution_response.task).created_resources distribution = cls.distributions_api.read(created_resources[0]) cls.distribution_with_repo_version = cls.distributions_api.read( distribution.pulp_href) cls.teardown_cleanups.append( (cls.distributions_api.delete, cls.distribution_with_repo_version.pulp_href)) # remove callback if everything goes well stack.pop_all()
def test_import_export(self): """ Test exporting and importing of a container repository. """ core_client = CoreApiClient(configuration) container_client = ContainerApiClient(configuration) remotes_api = RemotesContainerApi(container_client) repositories_api = RepositoriesContainerApi(container_client) repository_versions_api = RepositoriesContainerVersionsApi( container_client) manifests_api = ContentManifestsApi(container_client) exporters_api = ExportersPulpApi(core_client) exports_api = ExportersPulpExportsApi(core_client) importers_api = ImportersPulpApi(core_client) imports_api = ImportersPulpImportsApi(core_client) # Setup remote = remotes_api.create(gen_container_remote()) self.addCleanup(remotes_api.delete, remote.pulp_href) sync_data = ContainerRepositorySyncURL(remote=remote.pulp_href) repository = repositories_api.create(gen_repo()) self.addCleanup(repositories_api.delete, repository.pulp_href) sync_response = repositories_api.sync(repository.pulp_href, sync_data) monitor_task(sync_response.task).created_resources # Export the repository body = { "name": uuid4(), "path": "/tmp/{}/".format(uuid4()), "repositories": [repository.pulp_href], } exporter = exporters_api.create(body) self.addCleanup(exporters_api.delete, exporter.pulp_href) export_response = exports_api.create(exporter.pulp_href, {}) export_href = monitor_task(export_response.task).created_resources[0] export = exports_api.read(export_href) # Clean the old repository out monitor_task( repository_versions_api.delete( repository.latest_version_href).task) delete_orphans() # Import the repository import_repository = repositories_api.create(gen_repo()) self.addCleanup(repositories_api.delete, import_repository.pulp_href) body = { "name": uuid4(), "repo_mapping": { repository.name: import_repository.name }, } importer = importers_api.create(body) self.addCleanup(importers_api.delete, importer.pulp_href) filenames = [ f for f in list(export.output_file_info.keys()) if f.endswith("tar.gz") ] import_response = imports_api.create(importer.pulp_href, {"path": filenames[0]}) if hasattr(import_response, "task_group"): task_group_href = import_response.task_group else: task_group_href = monitor_task( import_response.task).created_resources[1] monitor_task_group(task_group_href) # Verify that the imported repository contains the right associations import_repository = repositories_api.read(import_repository.pulp_href) manifests = manifests_api.list( repository_version=import_repository.latest_version_href).results for manifest in manifests: if "manifest.list" in manifest.media_type: self.assertNotEqual(manifest.listed_manifests, []) else: self.assertNotEqual(manifest.blobs, []) self.assertIsNotNone(manifest.config_blob)
def setUpClass(cls): """Create class-wide variables.""" cls.remote_api = RemotesContainerApi(gen_container_client()) cls.remote = {} cls.policies = ON_DEMAND_DOWNLOAD_POLICIES cls.body = _gen_verbose_remote()
def setUpClass(cls): """Create class-wide variables.""" cls.remote_api = RemotesContainerApi(gen_container_client()) cls.remote = None
def container_remote_api(container_client): """Container remote API fixture.""" return RemotesContainerApi(container_client)