Allow passing data into the manifest.

This makes it possible to create dynamically created manifests
This commit is contained in:
Anders Ingemann 2014-07-09 22:41:40 +02:00
parent 7fe9c1ba36
commit 0cc26d82d0
3 changed files with 31 additions and 19 deletions

View file

@ -20,8 +20,12 @@ def main():
# Set up logging
setup_loggers(opts)
# Load the manifest
from manifest import Manifest
manifest = Manifest(path=opts['MANIFEST'])
# Everything has been set up, begin the bootstrapping process
run(opts['MANIFEST'],
run(manifest,
debug=opts['--debug'],
pause_on_error=opts['--pause-on-error'],
dry_run=opts['--dry-run'])
@ -68,15 +72,11 @@ def setup_loggers(opts):
root.addHandler(console_handler)
def run(manifest_path, debug=False, pause_on_error=False, dry_run=False):
def run(manifest, debug=False, pause_on_error=False, dry_run=False):
"""Runs the bootstrapping process
:params dict opts: Dictionary of options from the commandline
"""
# Load the manifest
from manifest import Manifest
manifest = Manifest(manifest_path)
# Get the tasklist
from tasklist import load_tasks
from tasklist import TaskList

View file

@ -2,6 +2,7 @@
to determine which tasks should be added to the tasklist, what arguments various
invocations should have etc..
"""
from bootstrapvz.common.exceptions import ManifestError
from bootstrapvz.common.tools import load_data
import logging
log = logging.getLogger(__name__)
@ -14,32 +15,44 @@ class Manifest(object):
Currently, immutability is not enforced and it would require a fair amount of code
to enforce it, instead we just rely on tasks behaving properly.
"""
def __init__(self, path):
def __init__(self, path=None, data=None):
"""Initializer: Given a path we load, validate and parse the manifest.
To create the manifest from dynamic data instead of the contents of a file,
provide a properly constructed dict as the data argument.
:param str path: The path to the manifest
:param str path: The path to the manifest (ignored, when `data' is provided)
:param str data: The manifest data, if it is not None, it will be used instead of the contents of `path'
"""
if path is None and data is None:
raise ManifestError('`path\' or `data\' must be provided')
self.path = path
self.load()
self.load(data)
self.initialize()
self.validate()
self.parse()
def load(self):
def load(self, data=None):
"""Loads the manifest and performs a basic validation.
This function reads the manifest, loads the specified provider and plugins, and performs
some basic validation of the manifest itself to ensure that the properties
required for initalization are accessible
This function reads the manifest and performs some basic validation of
the manifest itself to ensure that the properties required for initalization are accessible
(otherwise the user would be presented with some cryptic error messages).
Once the provider and plugins are loaded,
the initialize() function is called on each of them (if it exists).
The provider must have an initialize function.
"""
self.data = load_data(self.path)
if data is None:
self.data = load_data(self.path)
else:
self.data = data
from . import validate_manifest
# Validate the manifest with the base validation function in __init__
validate_manifest(self.data, self.schema_validator, self.validation_error)
def initialize(self):
"""Initializes the provider and the plugins.
This function loads the specified provider and plugins.
Once the provider and plugins are loaded,
the initialize() function is called on each of them (if it exists).
The provider must have an initialize function.
"""
# Get the provider name from the manifest and load the corresponding module
provider_modname = 'bootstrapvz.providers.' + self.data['provider']['name']
log.debug('Loading provider ' + provider_modname)
@ -116,5 +129,4 @@ class Manifest(object):
:param list data_path: A path to the location in the manifest where the error occurred
:raises ManifestError: With absolute certainty
"""
from bootstrapvz.common.exceptions import ManifestError
raise ManifestError(message, self.path, data_path)

View file

@ -29,7 +29,7 @@ def validate_manifests(path):
and checks that all the data values have successfully
been created.
"""
manifest = Manifest(path)
manifest = Manifest(path=path)
assert_true(manifest.data)
assert_true(manifest.data['provider'])