Revert "Clean up commented or unused code"
[osm/N2VC.git] / tests / test_lxd.py
diff --git a/tests/test_lxd.py b/tests/test_lxd.py
new file mode 100644 (file)
index 0000000..de77e4f
--- /dev/null
@@ -0,0 +1,110 @@
+#  Copyright 2019 Canonical Ltd.
+
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+
+#      http://www.apache.org/licenses/LICENSE-2.0
+
+#      Unless required by applicable law or agreed to in writing, software
+#      distributed under the License is distributed on an "AS IS" BASIS,
+#      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#      See the License for the specific language governing permissions and
+#      limitations under the License.
+
+"""
+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