blob: de77e4f5ada9f29434f5d69823b23a01affc98ae [file] [log] [blame]
# 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