diff options
Diffstat (limited to 'tests/cloud_tests/platforms')
-rw-r--r-- | tests/cloud_tests/platforms/__init__.py | 19 | ||||
-rw-r--r-- | tests/cloud_tests/platforms/base.py | 53 | ||||
-rw-r--r-- | tests/cloud_tests/platforms/lxd.py | 97 |
3 files changed, 169 insertions, 0 deletions
diff --git a/tests/cloud_tests/platforms/__init__.py b/tests/cloud_tests/platforms/__init__.py new file mode 100644 index 00000000..f9f56035 --- /dev/null +++ b/tests/cloud_tests/platforms/__init__.py @@ -0,0 +1,19 @@ +# This file is part of cloud-init. See LICENSE file for license information. + +from tests.cloud_tests.platforms import lxd + +PLATFORMS = { + 'lxd': lxd.LXDPlatform, +} + + +def get_platform(platform_name, config): + """ + Get the platform object for 'platform_name' and init + """ + platform_cls = PLATFORMS.get(platform_name) + if not platform_cls: + raise ValueError('invalid platform name: {}'.format(platform_name)) + return platform_cls(config) + +# vi: ts=4 expandtab diff --git a/tests/cloud_tests/platforms/base.py b/tests/cloud_tests/platforms/base.py new file mode 100644 index 00000000..615e2e06 --- /dev/null +++ b/tests/cloud_tests/platforms/base.py @@ -0,0 +1,53 @@ +# This file is part of cloud-init. See LICENSE file for license information. + + +class Platform(object): + """ + Base class for platforms + """ + platform_name = None + + def __init__(self, config): + """ + Set up platform + """ + self.config = config + + def get_image(self, img_conf): + """ + Get image using 'img_conf', where img_conf is a dict containing all + image configuration parameters + + in this dict there must be a 'platform_ident' key containing + configuration for identifying each image on a per platform basis + + see implementations for get_image() for details about the contents + of the platform's config entry + + note: see 'releases' main_config.yaml for example entries + + img_conf: configuration for image + return_value: cloud_tests.images instance + """ + raise NotImplementedError + + def destroy(self): + """ + Clean up platform data + """ + pass + + def _extract_img_platform_config(self, img_conf): + """ + extract platform configuration for current platform from img_conf + """ + platform_ident = img_conf.get('platform_ident') + if not platform_ident: + raise ValueError('invalid img_conf, missing \'platform_ident\'') + ident = platform_ident.get(self.platform_name) + if not ident: + raise ValueError('img_conf: {} missing config for platform {}' + .format(img_conf, self.platform_name)) + return ident + +# vi: ts=4 expandtab diff --git a/tests/cloud_tests/platforms/lxd.py b/tests/cloud_tests/platforms/lxd.py new file mode 100644 index 00000000..847cc549 --- /dev/null +++ b/tests/cloud_tests/platforms/lxd.py @@ -0,0 +1,97 @@ +# This file is part of cloud-init. See LICENSE file for license information. + +from pylxd import (Client, exceptions) + +from tests.cloud_tests.images import lxd as lxd_image +from tests.cloud_tests.instances import lxd as lxd_instance +from tests.cloud_tests.platforms import base +from tests.cloud_tests import util + +DEFAULT_SSTREAMS_SERVER = "https://images.linuxcontainers.org:8443" + + +class LXDPlatform(base.Platform): + """ + Lxd test platform + """ + platform_name = 'lxd' + + def __init__(self, config): + """ + Set up platform + """ + super(LXDPlatform, self).__init__(config) + # TODO: allow configuration of remote lxd host via env variables + # set up lxd connection + self.client = Client() + + def get_image(self, img_conf): + """ + Get image + img_conf: dict containing config for image. platform_ident must have: + alias: alias to use for simplestreams server + sstreams_server: simplestreams server to use, or None for default + return_value: cloud_tests.images instance + """ + lxd_conf = self._extract_img_platform_config(img_conf) + image = self.client.images.create_from_simplestreams( + lxd_conf.get('sstreams_server', DEFAULT_SSTREAMS_SERVER), + lxd_conf['alias']) + return lxd_image.LXDImage( + image.properties['description'], img_conf, self, image) + + def launch_container(self, image=None, container=None, ephemeral=False, + config=None, block=True, + image_desc=None, use_desc=None): + """ + launch a container + image: image fingerprint to launch from + container: container to copy + ephemeral: delete image after first shutdown + config: config options for instance as dict + block: wait until container created + image_desc: description of image being launched + use_desc: description of container's use + return_value: cloud_tests.instances instance + """ + if not (image or container): + raise ValueError("either image or container must be specified") + container = self.client.containers.create({ + 'name': util.gen_instance_name(image_desc=image_desc, + use_desc=use_desc, + used_list=self.list_containers()), + 'ephemeral': bool(ephemeral), + 'config': config if isinstance(config, dict) else {}, + 'source': ({'type': 'image', 'fingerprint': image} if image else + {'type': 'copy', 'source': container}) + }, wait=block) + return lxd_instance.LXDInstance(container.name, self, container) + + def container_exists(self, container_name): + """ + check if container with name 'container_name' exists + return_value: True if exists else False + """ + res = True + try: + self.client.containers.get(container_name) + except exceptions.LXDAPIException as e: + res = False + if e.response.status_code != 404: + raise + return res + + def list_containers(self): + """ + list names of all containers + return_value: list of names + """ + return [container.name for container in self.client.containers.all()] + + def destroy(self): + """ + Clean up platform data + """ + super(LXDPlatform, self).destroy() + +# vi: ts=4 expandtab |