mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-24 15:36:27 +00:00
Move build servers into separate module
This commit is contained in:
parent
36728cf648
commit
ef37cd257f
6 changed files with 74 additions and 69 deletions
46
bootstrapvz/remote/build_servers/__init__.py
Normal file
46
bootstrapvz/remote/build_servers/__init__.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
|
||||||
|
def pick_build_server(build_servers, manifest, preferences={}):
|
||||||
|
# Validate the build servers list
|
||||||
|
from bootstrapvz.common.tools import load_data
|
||||||
|
import os.path
|
||||||
|
schema = load_data(os.path.normpath(os.path.join(os.path.dirname(__file__), 'build-servers-schema.yml')))
|
||||||
|
import jsonschema
|
||||||
|
jsonschema.validate(build_servers, schema)
|
||||||
|
|
||||||
|
if manifest['provider']['name'] == 'ec2':
|
||||||
|
must_bootstrap = 'ec2-' + manifest['volume']['backing']
|
||||||
|
else:
|
||||||
|
must_bootstrap = manifest['provider']['name']
|
||||||
|
|
||||||
|
def matches(name, settings):
|
||||||
|
if preferences.get('name', name) != name:
|
||||||
|
return False
|
||||||
|
if preferences.get('release', settings['release']) != settings['release']:
|
||||||
|
return False
|
||||||
|
if must_bootstrap not in settings['can_bootstrap']:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
for name, settings in build_servers.iteritems():
|
||||||
|
if not matches(name, settings):
|
||||||
|
continue
|
||||||
|
if settings['type'] == 'local':
|
||||||
|
from local import LocalBuildServer
|
||||||
|
return LocalBuildServer(name, settings)
|
||||||
|
else:
|
||||||
|
from remote import RemoteBuildServer
|
||||||
|
return RemoteBuildServer(name, settings)
|
||||||
|
raise Exception('Unable to find a build server that matches your preferences.')
|
||||||
|
|
||||||
|
|
||||||
|
def getNPorts(n, port_range=(1024, 65535)):
|
||||||
|
import random
|
||||||
|
ports = []
|
||||||
|
for i in range(0, n):
|
||||||
|
while True:
|
||||||
|
port = random.randrange(*port_range)
|
||||||
|
if port not in ports:
|
||||||
|
ports.append(port)
|
||||||
|
break
|
||||||
|
return ports
|
17
bootstrapvz/remote/build_servers/build_server.py
Normal file
17
bootstrapvz/remote/build_servers/build_server.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
|
||||||
|
class BuildServer(object):
|
||||||
|
|
||||||
|
def __init__(self, name, settings):
|
||||||
|
self.name = name
|
||||||
|
self.settings = settings
|
||||||
|
self.build_settings = settings.get('build_settings', {})
|
||||||
|
self.can_bootstrap = settings['can_bootstrap']
|
||||||
|
self.release = settings.get('release', None)
|
||||||
|
|
||||||
|
def apply_build_settings(self, manifest_data):
|
||||||
|
if manifest_data['provider']['name'] == 'virtualbox' and 'guest_additions' in manifest_data['provider']:
|
||||||
|
manifest_data['provider']['guest_additions'] = self.build_settings['guest_additions']
|
||||||
|
if 'apt_proxy' in self.build_settings:
|
||||||
|
manifest_data.get('plugins', {})['apt_proxy'] = self.build_settings['apt_proxy']
|
||||||
|
return manifest_data
|
8
bootstrapvz/remote/build_servers/local.py
Normal file
8
bootstrapvz/remote/build_servers/local.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
from build_server import BuildServer
|
||||||
|
|
||||||
|
|
||||||
|
class LocalBuildServer(BuildServer):
|
||||||
|
|
||||||
|
def run(self, manifest):
|
||||||
|
from bootstrapvz.base.main import run
|
||||||
|
return run(manifest)
|
|
@ -1,64 +1,9 @@
|
||||||
|
from build_server import BuildServer
|
||||||
from bootstrapvz.common.tools import log_check_call
|
from bootstrapvz.common.tools import log_check_call
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def pick_build_server(build_servers, manifest, preferences={}):
|
|
||||||
# Validate the build servers list
|
|
||||||
from bootstrapvz.common.tools import load_data
|
|
||||||
import os.path
|
|
||||||
schema = load_data(os.path.normpath(os.path.join(os.path.dirname(__file__), 'build-servers-schema.yml')))
|
|
||||||
import jsonschema
|
|
||||||
jsonschema.validate(build_servers, schema)
|
|
||||||
|
|
||||||
if manifest['provider']['name'] == 'ec2':
|
|
||||||
must_bootstrap = 'ec2-' + manifest['volume']['backing']
|
|
||||||
else:
|
|
||||||
must_bootstrap = manifest['provider']['name']
|
|
||||||
|
|
||||||
def matches(name, settings):
|
|
||||||
if preferences.get('name', name) != name:
|
|
||||||
return False
|
|
||||||
if preferences.get('release', settings['release']) != settings['release']:
|
|
||||||
return False
|
|
||||||
if must_bootstrap not in settings['can_bootstrap']:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
for name, settings in build_servers.iteritems():
|
|
||||||
if not matches(name, settings):
|
|
||||||
continue
|
|
||||||
if settings['type'] == 'local':
|
|
||||||
return LocalBuildServer(name, settings)
|
|
||||||
else:
|
|
||||||
return RemoteBuildServer(name, settings)
|
|
||||||
raise Exception('Unable to find a build server that matches your preferences.')
|
|
||||||
|
|
||||||
|
|
||||||
class BuildServer(object):
|
|
||||||
|
|
||||||
def __init__(self, name, settings):
|
|
||||||
self.name = name
|
|
||||||
self.settings = settings
|
|
||||||
self.build_settings = settings.get('build_settings', {})
|
|
||||||
self.can_bootstrap = settings['can_bootstrap']
|
|
||||||
self.release = settings.get('release', None)
|
|
||||||
|
|
||||||
def apply_build_settings(self, manifest_data):
|
|
||||||
if manifest_data['provider']['name'] == 'virtualbox' and 'guest_additions' in manifest_data['provider']:
|
|
||||||
manifest_data['provider']['guest_additions'] = self.build_settings['guest_additions']
|
|
||||||
if 'apt_proxy' in self.build_settings:
|
|
||||||
manifest_data.get('plugins', {})['apt_proxy'] = self.build_settings['apt_proxy']
|
|
||||||
return manifest_data
|
|
||||||
|
|
||||||
|
|
||||||
class LocalBuildServer(BuildServer):
|
|
||||||
|
|
||||||
def run(self, manifest):
|
|
||||||
from bootstrapvz.base.main import run
|
|
||||||
return run(manifest)
|
|
||||||
|
|
||||||
|
|
||||||
class RemoteBuildServer(BuildServer):
|
class RemoteBuildServer(BuildServer):
|
||||||
|
|
||||||
def __init__(self, name, settings):
|
def __init__(self, name, settings):
|
||||||
|
@ -70,6 +15,7 @@ class RemoteBuildServer(BuildServer):
|
||||||
self.keyfile = settings['keyfile']
|
self.keyfile = settings['keyfile']
|
||||||
self.server_bin = settings['server_bin']
|
self.server_bin = settings['server_bin']
|
||||||
|
|
||||||
|
from . import getNPorts
|
||||||
# We can't use :0 for the forwarding ports because
|
# We can't use :0 for the forwarding ports because
|
||||||
# A: It's quite hard to retrieve the port on the remote after the daemon has started
|
# A: It's quite hard to retrieve the port on the remote after the daemon has started
|
||||||
# B: SSH doesn't accept 0:localhost:0 as a port forwarding option
|
# B: SSH doesn't accept 0:localhost:0 as a port forwarding option
|
||||||
|
@ -157,15 +103,3 @@ class RemoteBuildServer(BuildServer):
|
||||||
def run(self, manifest):
|
def run(self, manifest):
|
||||||
from bootstrapvz.remote.main import run
|
from bootstrapvz.remote.main import run
|
||||||
return run(manifest, self)
|
return run(manifest, self)
|
||||||
|
|
||||||
|
|
||||||
def getNPorts(n, port_range=(1024, 65535)):
|
|
||||||
import random
|
|
||||||
ports = []
|
|
||||||
for i in range(0, n):
|
|
||||||
while True:
|
|
||||||
port = random.randrange(*port_range)
|
|
||||||
if port not in ports:
|
|
||||||
ports.append(port)
|
|
||||||
break
|
|
||||||
return ports
|
|
|
@ -6,7 +6,7 @@ log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def initialize_image(manifest, build_server, bootstrap_info):
|
def initialize_image(manifest, build_server, bootstrap_info):
|
||||||
from bootstrapvz.remote.build_servers import LocalBuildServer
|
from bootstrapvz.remote.build_servers.local import LocalBuildServer
|
||||||
if isinstance(build_server, LocalBuildServer):
|
if isinstance(build_server, LocalBuildServer):
|
||||||
image_path = bootstrap_info.volume.image_path
|
image_path = bootstrap_info.volume.image_path
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Add table
Reference in a new issue