bootstrap-vz/tests/system/providers/virtualbox/__init__.py
2018-02-25 04:12:24 +00:00

55 lines
1.6 KiB
Python

from contextlib import contextmanager
import logging
log = logging.getLogger(__name__)
@contextmanager
def boot_image(manifest, build_server, bootstrap_info):
from bootstrapvz.remote.build_servers.local import LocalBuildServer
if isinstance(build_server, LocalBuildServer):
image_path = bootstrap_info.volume.image_path
else:
import tempfile
handle, image_path = tempfile.mkstemp()
import os
os.close(handle)
try:
build_server.download(bootstrap_info.volume.image_path, image_path)
except (Exception, KeyboardInterrupt):
os.remove(image_path)
raise
finally:
build_server.delete(bootstrap_info.volume.image_path)
from .image import VirtualBoxImage
image = VirtualBoxImage(image_path)
import hashlib
image_hash = hashlib.sha1(image_path).hexdigest()
instance_name = 'bootstrap-vz-{hash}'.format(hash=image_hash[:8])
try:
image.open()
try:
with run_instance(image, instance_name, manifest) as instance:
yield instance
finally:
image.close()
finally:
image.destroy()
@contextmanager
def run_instance(image, instance_name, manifest):
from .instance import VirtualBoxInstance
instance = VirtualBoxInstance(image, instance_name,
manifest.system['architecture'], manifest.release)
try:
instance.create()
try:
instance.boot()
yield instance
finally:
instance.shutdown()
finally:
instance.destroy()