diff --git a/common/bootstrapinfo.py b/common/bootstrapinfo.py index 138a537..9a72a8a 100644 --- a/common/bootstrapinfo.py +++ b/common/bootstrapinfo.py @@ -1,6 +1,6 @@ class BootstrapInformation(object): - def __init__(self, manifest=None, args=None): + def __init__(self, manifest=None, debug=False): self.manifest = manifest - self.args = args + self.debug = debug diff --git a/common/main.py b/common/main.py index 8c8899c..9cd8cee 100644 --- a/common/main.py +++ b/common/main.py @@ -1,4 +1,3 @@ -from providers import providers def main(): @@ -6,20 +5,20 @@ def main(): parser = ArgumentParser(description='Bootstrap Debian for the cloud.') parser.add_argument('--debug', action='store_true', help='Print debugging information') + parser.add_argument('manifest', help='Manifest file to use for bootstrapping', metavar='MANIFEST') parser.set_defaults(func=run) - subparsers = parser.add_subparsers(title='providers', description='supported providers', dest='provider') - - for provider in providers.values(): - provider.init_subparser(subparsers) - args = parser.parse_args() args.func(args) def run(args): - provider = providers[args.provider] - manifest = provider.Manifest(args.manifest) + from manifest import load_manifest + from manifest import get_provider + data = load_manifest(args.manifest) + provider = get_provider(data) + + manifest = provider.Manifest(args.manifest, data) manifest.validate() manifest.load_plugins() @@ -27,5 +26,5 @@ def run(args): tasklist.plugins(manifest) from common import BootstrapInformation - bootstrap_info = BootstrapInformation(manifest, args) + bootstrap_info = BootstrapInformation(manifest=manifest, debug=args.debug) tasklist.run(bootstrap_info) diff --git a/common/manifest.py b/common/manifest.py index 6aed6a9..5c38c6b 100644 --- a/common/manifest.py +++ b/common/manifest.py @@ -1,15 +1,25 @@ -import json + + +def load_manifest(path): + import json + return json.load(open(path)) + + +def get_provider(data): + provider = __import__('providers.%s' % data['provider'], fromlist=['providers']) + return provider class Manifest(object): - def __init__(self, path): + def __init__(self, path, data): self.path = path - self.parse(json.load(open(self.path))) + self.parse(data) def parse(self, data): - self.volume = data['volume'] - self.system = data['system'] - self.plugins = data['plugins'] + self.provider = data['provider'] + self.volume = data['volume'] + self.system = data['system'] + self.plugins = data['plugins'] def validate(self): pass diff --git a/providers/__init__.py b/providers/__init__.py index 179b21d..e69de29 100644 --- a/providers/__init__.py +++ b/providers/__init__.py @@ -1,4 +0,0 @@ -import ec2 - - -providers = {'ec2': ec2} diff --git a/providers/ec2/__init__.py b/providers/ec2/__init__.py index aae1fa6..c7d6077 100644 --- a/providers/ec2/__init__.py +++ b/providers/ec2/__init__.py @@ -1,13 +1,6 @@ from manifest import Manifest -def init_subparser(subparsers): - sub = subparsers.add_parser('ec2', help='Bootstrap Debian for EC2') - sub.add_argument('--access-key', help='AWS Access Key', metavar='ID') - sub.add_argument('--secret-key', help='AWS Secret Key', metavar='KEY') - sub.add_argument('manifest', help='Manifest file to use for bootstrapping', metavar='MANIFEST') - - def tasklist(manifest): from common import TaskList import packages diff --git a/providers/ec2/ec2.py b/providers/ec2/ec2.py index 2931a71..a8f5fa3 100644 --- a/providers/ec2/ec2.py +++ b/providers/ec2/ec2.py @@ -4,14 +4,11 @@ from common import Task class GetCredentials(Task): def run(self, info): super(GetCredentials, self).run(info) - info.ec2_credentials = self.get_ec2_credentials(info.args, info.manifest) + info.ec2_credentials = self.get_ec2_credentials(info.manifest) - def get_ec2_credentials(self, args, manifest): + def get_ec2_credentials(self, manifest): from os import getenv - # args override manifest override environment - if(args.access_key and args.secret_key): - return {'access_key': args.access_key, - 'secret_key': args.secret_key} + # manifest overrides environment if(manifest.credentials['access-key'] and manifest.credentials['secret-key']): return {'access_key': manifest.credentials['access-key'], 'secret_key': manifest.credentials['secret-key']} @@ -19,8 +16,6 @@ class GetCredentials(Task): return {'access_key': getenv('EC2_ACCESS_KEY'), 'secret_key': getenv('EC2_SECRET_KEY')} - if(bool(args.access_key) != bool(args.secret_key)): - raise RuntimeError('Both the access key and secret key must be specified as arguments.') if(bool(manifest.credentials['access-key']) != bool(manifest.credentials['secret-key'])): raise RuntimeError('Both the access key and secret key must be specified in the manifest.') if(bool(getenv('EC2_ACCESS_KEY')) != bool(getenv('EC2_SECRET_KEY'))):