mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-15 17:30:47 +00:00
Add better example/test of the python3-lxc API
Replaced python-lxc/test.py by a new api_test.py script that uses all the available function of the API to run a batch of basic tests. This example is useful both as a test of the API and as a guide on how to use the python API to manage containers. Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
This commit is contained in:
parent
38b280ca2c
commit
e0de36d791
155
src/python-lxc/examples/api_test.py
Normal file
155
src/python-lxc/examples/api_test.py
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
#
|
||||||
|
# api_test.py: Test/demo of the python3-lxc API
|
||||||
|
#
|
||||||
|
# (C) Copyright Canonical Ltd. 2012
|
||||||
|
#
|
||||||
|
# Authors:
|
||||||
|
# Stéphane Graber <stgraber@ubuntu.com>
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
import warnings
|
||||||
|
warnings.filterwarnings("ignore", "The python-lxc API isn't yet stable")
|
||||||
|
|
||||||
|
import lxc
|
||||||
|
import uuid
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Some constants
|
||||||
|
LXC_PATH_LIB = "/var/lib/lxc"
|
||||||
|
LXC_TEMPLATE = "ubuntu"
|
||||||
|
|
||||||
|
# Let's pick a random name, avoiding clashes
|
||||||
|
CONTAINER_NAME = str(uuid.uuid1())
|
||||||
|
CLONE_NAME = str(uuid.uuid1())
|
||||||
|
|
||||||
|
## Instantiate the container instance
|
||||||
|
print("Getting instance for '%s'" % CONTAINER_NAME)
|
||||||
|
container = lxc.Container(CONTAINER_NAME)
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(container.config_file_name == "%s/%s/config" %
|
||||||
|
(LXC_PATH_LIB, CONTAINER_NAME))
|
||||||
|
assert(container.defined == False)
|
||||||
|
assert(container.init_pid == -1)
|
||||||
|
assert(container.name == CONTAINER_NAME)
|
||||||
|
assert(container.running == False)
|
||||||
|
assert(container.state == "STOPPED")
|
||||||
|
|
||||||
|
## Create a rootfs
|
||||||
|
print("Creating rootfs using '%s'" % LXC_TEMPLATE)
|
||||||
|
container.create(LXC_TEMPLATE)
|
||||||
|
container.load_config() # FIXME: workaround for get_config_item segfault
|
||||||
|
|
||||||
|
assert(container.defined == True)
|
||||||
|
assert(container.name == CONTAINER_NAME
|
||||||
|
== container.get_config_item("lxc.utsname"))
|
||||||
|
assert(container.name in lxc.list_containers())
|
||||||
|
|
||||||
|
## Test the config
|
||||||
|
print("Testing the configuration")
|
||||||
|
capdrop = container.get_config_item("lxc.cap.drop")
|
||||||
|
container.clear_config_item("lxc.cap.drop")
|
||||||
|
container.set_config_item("lxc.cap.drop", capdrop[:-1])
|
||||||
|
container.append_config_item("lxc.cap.drop", capdrop[-1])
|
||||||
|
container.save_config()
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(isinstance(capdrop, list))
|
||||||
|
assert(capdrop == container.get_config_item("lxc.cap.drop"))
|
||||||
|
|
||||||
|
## Test the networking
|
||||||
|
print("Testing the networking")
|
||||||
|
container.network.remove(0) # FIXME: workaround for get_config_item segfault
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert("name" in container.get_keys("lxc.network.0"))
|
||||||
|
assert(len(container.network) == 1)
|
||||||
|
assert(container.network[0].hwaddr.startswith("00:16:3e"))
|
||||||
|
|
||||||
|
## Starting the container
|
||||||
|
print("Starting the container")
|
||||||
|
container.start()
|
||||||
|
container.wait("RUNNING", 3)
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(container.init_pid > 1)
|
||||||
|
assert(container.running == True)
|
||||||
|
assert(container.state == "RUNNING")
|
||||||
|
|
||||||
|
## Checking IP address
|
||||||
|
print("Getting the IP addresses")
|
||||||
|
ips = container.get_ips(timeout=10)
|
||||||
|
container.attach("NETWORK|UTSNAME", "/sbin/ifconfig", "eth0")
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(len(ips) > 0)
|
||||||
|
|
||||||
|
## Freezing the container
|
||||||
|
print("Freezing the container")
|
||||||
|
container.freeze()
|
||||||
|
container.wait("FROZEN", 3)
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(container.init_pid > 1)
|
||||||
|
assert(container.running == True)
|
||||||
|
assert(container.state == "FROZEN")
|
||||||
|
|
||||||
|
## Unfreezing the container
|
||||||
|
print("Unfreezing the container")
|
||||||
|
container.unfreeze()
|
||||||
|
container.wait("RUNNING", 3)
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(container.init_pid > 1)
|
||||||
|
assert(container.running == True)
|
||||||
|
assert(container.state == "RUNNING")
|
||||||
|
|
||||||
|
if len(sys.argv) > 1 and sys.argv[1] == "--with-console":
|
||||||
|
## Attaching to tty1
|
||||||
|
print("Attaching to tty1")
|
||||||
|
container.console(tty=1)
|
||||||
|
|
||||||
|
## Shutting down the container
|
||||||
|
print("Shutting down the container")
|
||||||
|
container.shutdown(3)
|
||||||
|
|
||||||
|
if container.running:
|
||||||
|
print("Stopping the container")
|
||||||
|
container.stop()
|
||||||
|
container.wait("STOPPED", 3)
|
||||||
|
|
||||||
|
# A few basic checks of the current state
|
||||||
|
assert(container.init_pid == -1)
|
||||||
|
assert(container.running == False)
|
||||||
|
assert(container.state == "STOPPED")
|
||||||
|
|
||||||
|
## Cloning the container
|
||||||
|
print("Cloning the container")
|
||||||
|
clone = lxc.Container(CLONE_NAME)
|
||||||
|
clone.clone(container)
|
||||||
|
clone.load_config() # FIXME: workaround for get_config_item segfault
|
||||||
|
clone.network.remove(0) # FIXME: workaround for get_config_item segfault
|
||||||
|
clone.start()
|
||||||
|
clone.stop()
|
||||||
|
clone.destroy()
|
||||||
|
|
||||||
|
## Destroy the container
|
||||||
|
print("Destroying the container")
|
||||||
|
container.destroy()
|
||||||
|
|
||||||
|
assert(container.defined == False)
|
@ -1,28 +0,0 @@
|
|||||||
import lxc
|
|
||||||
|
|
||||||
t1 = lxc.Container("test")
|
|
||||||
print("Name set properly: %s" % (t1.name == "test"))
|
|
||||||
print("Test config loaded properly: %s" % t1.load_config("/etc/lxc/lxc.conf"))
|
|
||||||
print("Real config loaded properly: %s" % t1.load_config())
|
|
||||||
print("Test config path: %s" % (t1.config_file_name == "/var/lib/lxc/test/config"))
|
|
||||||
print("Set config item: %s" % t1.set_config_item("lxc.utsname", "blabla"))
|
|
||||||
print("Container defined: %s" % (t1.defined))
|
|
||||||
print("Started properly: %s" % t1.start())
|
|
||||||
print("Container running: %s" % t1.wait("RUNNING"))
|
|
||||||
print("Container state: %s" % t1.state)
|
|
||||||
print("Container running: %s" % t1.running)
|
|
||||||
print("Container init process: %s" % t1.init_pid)
|
|
||||||
print("Freezing: %s" % t1.freeze())
|
|
||||||
print("Container frozen: %s" % t1.wait("FROZEN"))
|
|
||||||
print("Container state: %s" % t1.state)
|
|
||||||
print("Unfreezing: %s" % t1.unfreeze())
|
|
||||||
print("Container running: %s" % t1.wait("RUNNING"))
|
|
||||||
print("Container state: %s" % t1.state)
|
|
||||||
print("Stopped properly: %s" % t1.stop())
|
|
||||||
print("Container state: %s" % t1.state)
|
|
||||||
|
|
||||||
#print("Started properly: %s" % t1.start(useinit=True))
|
|
||||||
#print("Container running: %s" % t1.wait("RUNNING"))
|
|
||||||
#print("Container state: %s" % t1.state)
|
|
||||||
#print("Stopped properly: %s" % t1.stop())
|
|
||||||
#print("Container state: %s" % t1.state)
|
|
Loading…
Reference in New Issue
Block a user