summaryrefslogtreecommitdiff
path: root/tests/cloud_tests/platforms
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cloud_tests/platforms')
-rw-r--r--tests/cloud_tests/platforms/__init__.py19
-rw-r--r--tests/cloud_tests/platforms/base.py53
-rw-r--r--tests/cloud_tests/platforms/lxd.py97
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