Metadata storage in object model

Modified serializer/deserializer to load and persist the "metadata"
block of the ?-section of object model. Added a "metadata()" function
to read the value of this block for any object.

Change-Id: Ideee8a9d242738d3e7fea03d2adc847ed95401f3
Targets-blueprint: metadata-assignment-and-propagation
This commit is contained in:
Alexander Tivelkov 2016-09-28 20:19:37 +03:00 committed by Kirill Zaitsev
parent 343f8b49e3
commit e43eb9321b
7 changed files with 31 additions and 5 deletions

View File

@ -59,3 +59,4 @@ RUNTIME_VERSION_1_1 = semantic_version.Version('1.1.0')
RUNTIME_VERSION_1_2 = semantic_version.Version('1.2.0') RUNTIME_VERSION_1_2 = semantic_version.Version('1.2.0')
RUNTIME_VERSION_1_3 = semantic_version.Version('1.3.0') RUNTIME_VERSION_1_3 = semantic_version.Version('1.3.0')
RUNTIME_VERSION_1_4 = semantic_version.Version('1.4.0') RUNTIME_VERSION_1_4 = semantic_version.Version('1.4.0')
RUNTIME_VERSION_1_5 = semantic_version.Version('1.5.0')

View File

@ -570,6 +570,7 @@ def parse_object_definition(spec, scope_type, context):
'properties': yaqlutils.filter_parameters_dict(props), 'properties': yaqlutils.filter_parameters_dict(props),
'id': system_data.get('id'), 'id': system_data.get('id'),
'name': system_data.get('name'), 'name': system_data.get('name'),
'metadata': system_data.get('metadata'),
'destroyed': system_data.get('destroyed', False), 'destroyed': system_data.get('destroyed', False),
'dependencies': system_data.get('dependencies', {}), 'dependencies': system_data.get('dependencies', {}),
'extra': { 'extra': {
@ -585,6 +586,7 @@ def assemble_object_definition(parsed, model_format=dsl_types.DumpTypes.Mixed):
parsed['type']: parsed['properties'], parsed['type']: parsed['properties'],
'id': parsed['id'], 'id': parsed['id'],
'name': parsed['name'], 'name': parsed['name'],
'metadata': parsed['metadata'],
'dependencies': parsed['dependencies'], 'dependencies': parsed['dependencies'],
'destroyed': parsed['destroyed'] 'destroyed': parsed['destroyed']
} }
@ -593,7 +595,8 @@ def assemble_object_definition(parsed, model_format=dsl_types.DumpTypes.Mixed):
result = parsed['properties'] result = parsed['properties']
header = { header = {
'id': parsed['id'], 'id': parsed['id'],
'name': parsed['name'] 'name': parsed['name'],
'metadata': parsed['metadata']
} }
if parsed['destroyed']: if parsed['destroyed']:
header['destroyed'] = True header['destroyed'] = True

View File

@ -25,7 +25,7 @@ from murano.dsl import yaql_integration
class MuranoObject(dsl_types.MuranoObject): class MuranoObject(dsl_types.MuranoObject):
def __init__(self, murano_class, owner, object_id=None, name=None, def __init__(self, murano_class, owner, object_id=None, name=None,
known_classes=None, this=None): known_classes=None, this=None, metadata=None):
self._initialized = False self._initialized = False
self._destroyed = False self._destroyed = False
if known_classes is None: if known_classes is None:
@ -42,6 +42,7 @@ class MuranoObject(dsl_types.MuranoObject):
self._executor = helpers.weak_ref(helpers.get_executor()) self._executor = helpers.weak_ref(helpers.get_executor())
self._config = murano_class.package.get_class_config( self._config = murano_class.package.get_class_config(
murano_class.name) murano_class.name)
self._metadata = metadata
if not isinstance(self._config, dict): if not isinstance(self._config, dict):
self._config = {} self._config = {}
known_classes[murano_class.name] = self known_classes[murano_class.name] = self
@ -66,6 +67,10 @@ class MuranoObject(dsl_types.MuranoObject):
def name(self): def name(self):
return self.real_this._name return self.real_this._name
@property
def metadata(self):
return self.real_this._metadata
@extension.setter @extension.setter
def extension(self, value): def extension(self, value):
self._extension = value self._extension = value
@ -325,7 +330,8 @@ class MuranoObject(dsl_types.MuranoObject):
result = { result = {
self.type: result, self.type: result,
'id': self.object_id, 'id': self.object_id,
'name': self.name 'name': self.name,
'metadata': self.metadata
} }
header = result header = result
else: else:
@ -334,12 +340,14 @@ class MuranoObject(dsl_types.MuranoObject):
'type': self.type, 'type': self.type,
'id': self.object_id, 'id': self.object_id,
'name': self.name, 'name': self.name,
'metadata': self.metadata
}}) }})
else: else:
result.update({'?': { result.update({'?': {
'type': helpers.format_type_string(self.type), 'type': helpers.format_type_string(self.type),
'id': self.object_id, 'id': self.object_id,
'name': self.name 'name': self.name,
'metadata': self.metadata
}}) }})
header = result['?'] header = result['?']
if self.destroyed: if self.destroyed:

View File

@ -273,6 +273,7 @@ class InitializationObjectStore(ObjectStore):
obj = mo_type( obj = mo_type(
class_obj, owner, class_obj, owner,
name=parsed['name'], name=parsed['name'],
metadata=parsed['metadata'],
object_id=object_id if self._keep_ids else None) object_id=object_id if self._keep_ids else None)
obj.load_dependencies(parsed['dependencies']) obj.load_dependencies(parsed['dependencies'])
if parsed['destroyed']: if parsed['destroyed']:

View File

@ -154,6 +154,11 @@ def name(object_):
return None if object_ is None else object_.name return None if object_ is None else object_.name
@specs.parameter('object_', dsl.MuranoObjectParameter())
def metadata(object_):
return object_.object.metadata
@specs.parameter('obj', dsl.MuranoObjectParameter(decorate=False)) @specs.parameter('obj', dsl.MuranoObjectParameter(decorate=False))
@specs.parameter('property_name', yaqltypes.Keyword()) @specs.parameter('property_name', yaqltypes.Keyword())
@specs.name('#operator_.') @specs.name('#operator_.')
@ -270,6 +275,7 @@ def register(context, runtime_version):
context.register_function(typeinfo) context.register_function(typeinfo)
context.register_function(typeinfo_for_class) context.register_function(typeinfo_for_class)
context.register_function(name) context.register_function(name)
context.register_function(metadata)
context.register_function(obj_attribution) context.register_function(obj_attribution)
context.register_function(obj_attribution_static) context.register_function(obj_attribution_static)
context.register_function(op_dot) context.register_function(op_dot)

View File

@ -116,6 +116,7 @@ class TestDump(test_case.DslTestCase):
self.assertNotIn('qux', res) self.assertNotIn('qux', res)
def _get_body(self, obj): def _get_body(self, obj):
body_key = [k for k in obj.keys() if k not in ('id', 'name')][0] body_key = [k for k in obj.keys()
if k not in ('id', 'name', 'metadata')][0]
self.assertIsInstance(body_key, dsl_types.MuranoType) self.assertIsInstance(body_key, dsl_types.MuranoType)
return obj[body_key] return obj[body_key]

View File

@ -0,0 +1,6 @@
---
features:
- Added a ``metadata()`` yaql function to retrieve the meta information about the
object, stored in the "?/metadata" section of object model.
other:
- Bumped the RUNTIME_VERSION attribute to 1.5