bootstrap-vz/base/manifest.py

68 lines
2.4 KiB
Python
Raw Normal View History

from common.tools import load_json
2013-06-09 20:29:54 +02:00
import logging
log = logging.getLogger(__name__)
class Manifest(object):
def __init__(self, path):
self.path = path
self.load()
self.validate()
self.parse()
def load(self):
self.data = load_json(self.path)
provider_modname = 'providers.{provider}'.format(provider=self.data['provider'])
log.debug('Loading provider `{modname}\''.format(modname=provider_modname))
self.modules = {'provider': __import__(provider_modname, fromlist=['providers']),
'plugins': [],
}
if 'plugins' in self.data:
for plugin_name, plugin_data in self.data['plugins'].iteritems():
modname = 'plugins.{plugin}'.format(plugin=plugin_name)
log.debug('Loading plugin `{modname}\''.format(modname=modname))
plugin = __import__(modname, fromlist=['plugins'])
self.modules['plugins'].append(plugin)
2013-05-02 19:13:35 +02:00
self.modules['provider'].initialize()
for module in self.modules['plugins']:
init = getattr(module, 'initialize', None)
if callable(init):
init()
2013-05-02 19:13:35 +02:00
def validate(self):
from . import validate_manifest
validate_manifest(self.data, self.schema_validator, self.validation_error)
self.modules['provider'].validate_manifest(self.data, self.schema_validator, self.validation_error)
for plugin in self.modules['plugins']:
validate = getattr(plugin, 'validate_manifest', None)
if callable(validate):
validate(self.data, self.schema_validator, self.validation_error)
2013-06-26 20:14:37 +02:00
def parse(self):
self.provider = self.data['provider']
self.bootstrapper = self.data['bootstrapper']
self.image = self.data['image']
self.volume = self.data['volume']
self.system = self.data['system']
2014-02-23 20:53:58 +01:00
self.packages = self.data['packages'] if 'packages' in self.data else {}
self.plugins = self.data['plugins'] if 'plugins' in self.data else {}
2013-06-23 21:50:18 +02:00
def load_json(self, path):
import json
from minify_json import json_minify
with open(path) as stream:
return json.loads(json_minify(stream.read(), False))
2013-06-26 20:14:37 +02:00
def schema_validator(self, data, schema_path):
2013-06-23 23:37:21 +02:00
import jsonschema
schema = load_json(schema_path)
2013-06-23 23:37:21 +02:00
try:
jsonschema.validate(data, schema)
except jsonschema.ValidationError as e:
self.validation_error(e.message, e.path)
2013-05-02 19:13:35 +02:00
def validation_error(self, message, json_path=None):
from common.exceptions import ManifestError
raise ManifestError(message, self.path, json_path)