2013-06-09 20:29:54 +02:00
|
|
|
import logging
|
|
|
|
log = logging.getLogger(__name__)
|
2013-06-09 15:50:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
def load_manifest(path):
|
2013-06-23 21:50:18 +02:00
|
|
|
data = load_json(path)
|
2013-06-09 15:50:00 +02:00
|
|
|
|
2013-07-01 20:56:38 +02:00
|
|
|
provider_name = data['provider']
|
|
|
|
provider = __import__('providers.{module}'.format(module=provider_name), fromlist=['providers'])
|
|
|
|
init = getattr(provider, 'initialize', None)
|
|
|
|
if callable(init):
|
|
|
|
init()
|
|
|
|
log.debug('Loaded provider `%s\'', provider_name)
|
2013-06-23 12:00:17 +02:00
|
|
|
manifest = provider.Manifest(path)
|
2013-05-02 19:13:35 +02:00
|
|
|
|
2013-06-23 12:00:17 +02:00
|
|
|
manifest.validate(data)
|
2013-06-30 23:20:54 +02:00
|
|
|
manifest.load_plugins(data)
|
2013-06-23 12:00:17 +02:00
|
|
|
manifest.parse(data)
|
|
|
|
return (provider, manifest)
|
2013-05-02 19:13:35 +02:00
|
|
|
|
2013-06-26 20:14:37 +02:00
|
|
|
|
2013-06-23 21:50:18 +02:00
|
|
|
def load_json(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
|
|
|
|
2013-05-02 19:13:35 +02:00
|
|
|
class Manifest(object):
|
2013-06-23 12:00:17 +02:00
|
|
|
def __init__(self, path):
|
2013-05-02 19:13:35 +02:00
|
|
|
self.path = path
|
2013-06-23 12:00:17 +02:00
|
|
|
|
2013-06-23 23:37:21 +02:00
|
|
|
def validate(self, data):
|
|
|
|
from os import path
|
2013-07-01 23:11:18 +02:00
|
|
|
schema_path = path.join(path.dirname(__file__), 'manifest-schema.json')
|
2013-06-23 23:37:21 +02:00
|
|
|
self.schema_validate(data, schema_path)
|
|
|
|
|
|
|
|
def schema_validate(self, data, schema_path):
|
|
|
|
import jsonschema
|
|
|
|
schema = load_json(schema_path)
|
|
|
|
try:
|
|
|
|
jsonschema.validate(data, schema)
|
|
|
|
except jsonschema.ValidationError as e:
|
|
|
|
from common.exceptions import ManifestError
|
|
|
|
raise ManifestError(e.message, self, e.path)
|
2013-05-02 19:13:35 +02:00
|
|
|
|
|
|
|
def parse(self, data):
|
2013-12-29 16:48:55 +01:00
|
|
|
self.data = data
|
2013-06-30 23:20:54 +02:00
|
|
|
self.provider = data['provider']
|
2013-06-27 23:26:29 +02:00
|
|
|
self.bootstrapper = data['bootstrapper']
|
2013-06-30 23:20:54 +02:00
|
|
|
self.volume = data['volume']
|
|
|
|
self.system = data['system']
|
2013-12-29 16:48:55 +01:00
|
|
|
self.packages = data['packages']
|
2013-08-11 18:05:54 +02:00
|
|
|
self.plugins = data['plugins'] if 'plugins' in data else {}
|
2013-05-02 19:13:35 +02:00
|
|
|
|
2013-06-30 23:20:54 +02:00
|
|
|
def load_plugins(self, data):
|
2013-05-16 08:00:28 +02:00
|
|
|
self.loaded_plugins = []
|
2013-08-11 18:05:54 +02:00
|
|
|
if 'plugins' in data:
|
|
|
|
for plugin_name, plugin_data in data['plugins'].iteritems():
|
2013-11-21 16:00:59 +01:00
|
|
|
modname = 'plugins.{plugin_name}'.format(plugin_name=plugin_name)
|
|
|
|
plugin = __import__(modname, fromlist=['plugins'])
|
|
|
|
init = getattr(plugin, 'initialize', None)
|
|
|
|
if callable(init):
|
|
|
|
init()
|
|
|
|
log.debug('Loaded plugin `%s\'', plugin_name)
|
|
|
|
self.loaded_plugins.append(plugin)
|
|
|
|
validate = getattr(plugin, 'validate_manifest', None)
|
|
|
|
if callable(validate):
|
|
|
|
validate(data, self.schema_validate)
|