mirror of https://github.com/docker/docker-py.git
125 lines
3.1 KiB
Python
125 lines
3.1 KiB
Python
import os
|
|
import os.path
|
|
import shutil
|
|
import tarfile
|
|
import tempfile
|
|
import unittest
|
|
|
|
import docker
|
|
import six
|
|
|
|
BUSYBOX = 'busybox:buildroot-2014.02'
|
|
EXEC_DRIVER = []
|
|
|
|
|
|
def make_tree(dirs, files):
|
|
base = tempfile.mkdtemp()
|
|
|
|
for path in dirs:
|
|
os.makedirs(os.path.join(base, path))
|
|
|
|
for path in files:
|
|
with open(os.path.join(base, path), 'w') as f:
|
|
f.write("content")
|
|
|
|
return base
|
|
|
|
|
|
def simple_tar(path):
|
|
f = tempfile.NamedTemporaryFile()
|
|
t = tarfile.open(mode='w', fileobj=f)
|
|
|
|
abs_path = os.path.abspath(path)
|
|
t.add(abs_path, arcname=os.path.basename(path), recursive=False)
|
|
|
|
t.close()
|
|
f.seek(0)
|
|
return f
|
|
|
|
|
|
def untar_file(tardata, filename):
|
|
with tarfile.open(mode='r', fileobj=tardata) as t:
|
|
f = t.extractfile(filename)
|
|
result = f.read()
|
|
f.close()
|
|
return result
|
|
|
|
|
|
def exec_driver_is_native():
|
|
global EXEC_DRIVER
|
|
if not EXEC_DRIVER:
|
|
c = docker_client()
|
|
EXEC_DRIVER = c.info()['ExecutionDriver']
|
|
c.close()
|
|
return EXEC_DRIVER.startswith('native')
|
|
|
|
|
|
def docker_client(**kwargs):
|
|
return docker.Client(**docker_client_kwargs(**kwargs))
|
|
|
|
|
|
def docker_client_kwargs(**kwargs):
|
|
client_kwargs = docker.utils.kwargs_from_env(assert_hostname=False)
|
|
client_kwargs.update(kwargs)
|
|
return client_kwargs
|
|
|
|
|
|
class BaseTestCase(unittest.TestCase):
|
|
tmp_imgs = []
|
|
tmp_containers = []
|
|
tmp_folders = []
|
|
tmp_volumes = []
|
|
|
|
def setUp(self):
|
|
if six.PY2:
|
|
self.assertRegex = self.assertRegexpMatches
|
|
self.assertCountEqual = self.assertItemsEqual
|
|
self.client = docker_client(timeout=60)
|
|
self.tmp_imgs = []
|
|
self.tmp_containers = []
|
|
self.tmp_folders = []
|
|
self.tmp_volumes = []
|
|
self.tmp_networks = []
|
|
|
|
def tearDown(self):
|
|
for img in self.tmp_imgs:
|
|
try:
|
|
self.client.remove_image(img)
|
|
except docker.errors.APIError:
|
|
pass
|
|
for container in self.tmp_containers:
|
|
try:
|
|
self.client.stop(container, timeout=1)
|
|
self.client.remove_container(container)
|
|
except docker.errors.APIError:
|
|
pass
|
|
for network in self.tmp_networks:
|
|
try:
|
|
self.client.remove_network(network)
|
|
except docker.errors.APIError:
|
|
pass
|
|
for folder in self.tmp_folders:
|
|
shutil.rmtree(folder)
|
|
|
|
for volume in self.tmp_volumes:
|
|
try:
|
|
self.client.remove_volume(volume)
|
|
except docker.errors.APIError:
|
|
pass
|
|
|
|
self.client.close()
|
|
|
|
def run_container(self, *args, **kwargs):
|
|
container = self.client.create_container(*args, **kwargs)
|
|
self.tmp_containers.append(container)
|
|
self.client.start(container)
|
|
exitcode = self.client.wait(container)
|
|
|
|
if exitcode != 0:
|
|
output = self.client.logs(container)
|
|
raise Exception(
|
|
"Container exited with code {}:\n{}"
|
|
.format(exitcode, output))
|
|
|
|
return container
|