From ef37cd257f63084e23fb30da26a7e64c6facf745 Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Sun, 25 Jan 2015 11:55:15 +0100 Subject: [PATCH] Move build servers into separate module --- bootstrapvz/remote/build_servers/__init__.py | 46 ++++++++++++ .../build-servers-schema.yml | 0 .../remote/build_servers/build_server.py | 17 +++++ bootstrapvz/remote/build_servers/local.py | 8 +++ .../remote.py} | 70 +------------------ tests/integration/images/vbox.py | 2 +- 6 files changed, 74 insertions(+), 69 deletions(-) create mode 100644 bootstrapvz/remote/build_servers/__init__.py rename bootstrapvz/remote/{ => build_servers}/build-servers-schema.yml (100%) create mode 100644 bootstrapvz/remote/build_servers/build_server.py create mode 100644 bootstrapvz/remote/build_servers/local.py rename bootstrapvz/remote/{build_servers.py => build_servers/remote.py} (65%) diff --git a/bootstrapvz/remote/build_servers/__init__.py b/bootstrapvz/remote/build_servers/__init__.py new file mode 100644 index 0000000..f6da332 --- /dev/null +++ b/bootstrapvz/remote/build_servers/__init__.py @@ -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 diff --git a/bootstrapvz/remote/build-servers-schema.yml b/bootstrapvz/remote/build_servers/build-servers-schema.yml similarity index 100% rename from bootstrapvz/remote/build-servers-schema.yml rename to bootstrapvz/remote/build_servers/build-servers-schema.yml diff --git a/bootstrapvz/remote/build_servers/build_server.py b/bootstrapvz/remote/build_servers/build_server.py new file mode 100644 index 0000000..bb57c49 --- /dev/null +++ b/bootstrapvz/remote/build_servers/build_server.py @@ -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 diff --git a/bootstrapvz/remote/build_servers/local.py b/bootstrapvz/remote/build_servers/local.py new file mode 100644 index 0000000..8332995 --- /dev/null +++ b/bootstrapvz/remote/build_servers/local.py @@ -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) diff --git a/bootstrapvz/remote/build_servers.py b/bootstrapvz/remote/build_servers/remote.py similarity index 65% rename from bootstrapvz/remote/build_servers.py rename to bootstrapvz/remote/build_servers/remote.py index bd8e8ab..c14c23f 100644 --- a/bootstrapvz/remote/build_servers.py +++ b/bootstrapvz/remote/build_servers/remote.py @@ -1,64 +1,9 @@ +from build_server import BuildServer from bootstrapvz.common.tools import log_check_call import logging 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): def __init__(self, name, settings): @@ -70,6 +15,7 @@ class RemoteBuildServer(BuildServer): self.keyfile = settings['keyfile'] self.server_bin = settings['server_bin'] + from . import getNPorts # 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 # B: SSH doesn't accept 0:localhost:0 as a port forwarding option @@ -157,15 +103,3 @@ class RemoteBuildServer(BuildServer): def run(self, manifest): from bootstrapvz.remote.main import run 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 diff --git a/tests/integration/images/vbox.py b/tests/integration/images/vbox.py index 300ae45..f8d7803 100644 --- a/tests/integration/images/vbox.py +++ b/tests/integration/images/vbox.py @@ -6,7 +6,7 @@ log = logging.getLogger(__name__) 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): image_path = bootstrap_info.volume.image_path else: