mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-22 18:00:35 +00:00
55 lines
1.6 KiB
Python
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()
|