--- /dev/null
+"""
+This test exercises LXD, to make sure that we can:
+1. Create a container profile
+2. Launch a container with a profile
+3. Stop a container
+4. Destroy a container
+5. Delete a container profile
+
+"""
+import logging
+# import os
+import pytest
+from . import base
+import subprocess
+import shlex
+import tempfile
+
+
+@pytest.mark.asyncio
+async def test_lxd():
+
+ container = base.create_lxd_container(name="test-lxd")
+ assert container is not None
+
+ # Get the hostname of the container
+ hostname = container.name
+
+ # Delete the container
+ base.destroy_lxd_container(container)
+
+ # Verify the container is deleted
+ client = base.get_lxd_client()
+ assert client.containers.exists(hostname) is False
+
+
+@pytest.mark.asyncio
+async def test_lxd_ssh():
+
+ with tempfile.TemporaryDirectory() as tmp:
+ try:
+ # Create a temporary keypair
+ cmd = shlex.split(
+ "ssh-keygen -t rsa -b 4096 -N '' -f {}/id_lxd_rsa".format(
+ tmp,
+ )
+ )
+ subprocess.check_call(cmd)
+ except subprocess.CalledProcessError as e:
+ logging.debug(e)
+ assert False
+
+ # Slurp the public key
+ public_key = None
+ with open("{}/id_lxd_rsa.pub".format(tmp), "r") as f:
+ public_key = f.read()
+
+ assert public_key is not None
+
+ # Create the container with the keypair injected via profile
+ container = base.create_lxd_container(
+ public_key=public_key,
+ name="test-lxd"
+ )
+ assert container is not None
+
+ # Get the hostname of the container
+ hostname = container.name
+
+ addresses = container.state().network['eth0']['addresses']
+ # The interface may have more than one address, but we only need
+ # the first one for testing purposes.
+ ipaddr = addresses[0]['address']
+
+ # Verify we can SSH into container
+ try:
+ cmd = shlex.split(
+ "ssh -i {}/id_lxd_rsa {} root@{} hostname".format(
+ tmp,
+ "-oStrictHostKeyChecking=no",
+ ipaddr,
+ )
+ )
+ subprocess.check_call(cmd)
+ except subprocess.CalledProcessError as e:
+ logging.debug(e)
+ assert False
+
+ # Delete the container
+ base.destroy_lxd_container(container)
+
+ # Verify the container is deleted
+ client = base.get_lxd_client()
+ assert client.containers.exists(hostname) is False
+
+ # Verify the container profile is deleted
+ assert client.profiles.exists(hostname) is False