bootstrap-vz/tests/integration/tools/bootable_manifest.py

59 lines
2 KiB
Python
Raw Normal View History

from bootstrapvz.remote.build_servers import LocalBuildServer
from ..images.virtualbox import VirtualBoxImage
class BootableManifest(object):
def __init__(self, manifest_data):
self.manifest_data = manifest_data
def pick_build_server(self, path='build-servers.yml'):
from bootstrapvz.common.tools import load_data
build_servers = load_data(path)
from bootstrapvz.remote.build_servers import pick_build_server
return pick_build_server(build_servers, self.manifest_data)
def get_manifest(self, build_server):
manifest_data = build_server.apply_build_settings(self.manifest_data)
from bootstrapvz.base.manifest import Manifest
return Manifest(data=manifest_data)
def bootstrap(self, manifest, build_server):
if isinstance(build_server, LocalBuildServer):
from bootstrapvz.base.main import run
bootstrap_info = run(manifest)
else:
from bootstrapvz.remote.main import run
bootstrap_info = run(manifest, build_server)
return bootstrap_info
def get_image(self, build_server, bootstrap_info, manifest):
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)
build_server.download(bootstrap_info.volume.image_path, image_path)
build_server.delete(bootstrap_info.volume.image_path)
image_type = {'virtualbox': VirtualBoxImage}
return image_type.get(self.manifest_data['provider']['name'])(manifest, image_path)
def __enter__(self):
self.build_server = self.pick_build_server()
self.manifest = self.get_manifest(self.build_server)
self.bootstrap_info = self.bootstrap(self.manifest, self.build_server)
self.image = self.get_image(self.build_server, self.bootstrap_info, self.manifest)
self.image.open()
self.instance = self.image.get_instance()
self.instance.up()
return self.instance
def __exit__(self, type, value, traceback):
if hasattr(self, 'instance'):
self.instance.down()
if hasattr(self, 'image'):
self.image.close()
self.image.destroy()