added relationships in instance_elements (Parameters excluded)
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/5281bf59 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/5281bf59 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/5281bf59 Branch: refs/heads/ARIA-44-Merge-parser-and-storage-models Commit: 5281bf5919aed515cc30bc4ab224bd7b9da9e37c Parents: 9ae5401 Author: mxmrlv <[email protected]> Authored: Thu Jan 19 17:54:46 2017 +0200 Committer: mxmrlv <[email protected]> Committed: Thu Jan 19 17:54:46 2017 +0200 ---------------------------------------------------------------------- aria/modeling/instance_elements.py | 94 +++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5281bf59/aria/modeling/instance_elements.py ---------------------------------------------------------------------- diff --git a/aria/modeling/instance_elements.py b/aria/modeling/instance_elements.py index a4a3108..ccf1531 100644 --- a/aria/modeling/instance_elements.py +++ b/aria/modeling/instance_elements.py @@ -2,8 +2,10 @@ from sqlalchemy import ( Column, Text, - Integer + Integer, + ForeignKey ) +from sqlalchemy import orm from . import elements, utils from ..storage import structure, type @@ -14,18 +16,19 @@ from ..parser import validation # region Tier 0 elements class ServiceInstance(elements.Element, structure.ModelMixin): - + __tablename__ = 'service_instance' description = Column(Text) metadata = Column() # NOTE: is the solution is really to create a list of foreign key # NOTE: (which would replace the dict) and filter according to the name etc...? - nodes = Column(type.StrictDict(str, "Node")) - groups = Column(type.StrictDict(str, "Group")) - policies = Column(type.StrictDict(str, "Policy")) + nodes = orm.relationship('node') + groups = orm.relationship('group') + policies = orm.relationship('policy') substitution = Column() + operations = orm.relationship('operation') + inputs = Column(type.StrictDict(str, "Parameter")) outputs = Column(type.StrictDict(str, "Parameter")) - operations = Column(type.StrictDict(str, "Operation")) def satisfy_requirements(self, context): satisfied = True @@ -95,7 +98,12 @@ class Operation(elements.Element, structure.ModelMixin): * :code:`retry_interval`: Interval between retries * :code:`inputs`: Dict of :class:`Parameter` """ + __tablename__ = 'operation' + # region foreign_keys + service_instance_fk = Column(Integer, ForeignKey('service_instance.id')) + interface_instance_fk = Column(Integer, ForeignKey('interface.id')) + # endregion description = Column(Text) # Check: what's this for? implementation = Column() @@ -154,11 +162,17 @@ class Interface(elements.Element, structure.ModelMixin): * :code:`inputs`: Dict of :class:`Parameter` * :code:`operations`: Dict of :class:`Operation` """ + __tablename__ = 'interface' + # region foreign_keys + group_fk = Column(Integer, ForeignKey('group.id')) + node_fk = Column(Integer, ForeignKey('node.id')) + + # endregion description = Column(Text) type_name = Column(Text) inputs = Column(type.StrictDict(key_cls=str, value_cls=elements.Parameter)) - operations = Column(type.StrictDict(key_cls=str, value_cls=Operation)) + operations = orm.relationship('operation') @property def as_raw(self): @@ -208,7 +222,11 @@ class Capability(elements.Element, structure.ModelMixin): * :code:`max_occurrences`: Maximum number of requirement matches allowed * :code:`properties`: Dict of :class:`Parameter` """ + __tablename__ = 'capability' + # region foreign_keys + node_fk = Column(Integer, ForeignKey('node.id')) + # endregion type_name = Column(Text) properties = Column(type.StrictDict(basestring, elements.Parameter)) @@ -276,6 +294,11 @@ class Artifact(elements.Element, structure.ModelMixin): * :code:`repository_credential`: Dict of string * :code:`properties`: Dict of :class:`Parameter` """ + __tablename__ = 'artifact' + # region foreign_keys + node_fk = Column(Integer, ForeignKey('node.id')) + + # endregion description = Column(Text) type_name = Column(Text) @@ -338,7 +361,11 @@ class Policy(elements.Element, structure.ModelMixin): * :code:`target_node_ids`: Must be represented in the :class:`ServiceInstance` * :code:`target_group_ids`: Must be represented in the :class:`ServiceInstance` """ + __tablename__ = 'policy' + # region foreign_keys + service_instance_fk = Column(Integer, ForeignKey('service_instance.id')) + # endregion type_name = Column(Text) properties = Column(type.StrictDict(basestring, elements.Parameter)) target_node_ids = Column(type.StrictList(basestring)) @@ -394,11 +421,16 @@ class GroupPolicy(elements.Element, structure.ModelMixin): * :code:`properties`: Dict of :class:`Parameter` * :code:`triggers`: Dict of :class:`GroupPolicyTrigger` """ + __tablename__ = 'group_policy' + # region foreign_keys + group_fk = Column(Integer, ForeignKey('group.id')) + + # endregion description = Column(Text) type_name = Column(Text) properties = Column(type.StrictDict(basestring, elements.Parameter)) - triggers = Column(type.StrictDict(basestring, GroupPolicyTrigger)) + triggers = orm.relationship('group_policy_trigger') @property def as_raw(self): @@ -445,6 +477,10 @@ class GroupPolicyTrigger(elements.Element, structure.ModelMixin): * :code:`implementation`: Implementation string (interpreted by the orchestrator) * :code:`properties`: Dict of :class:`Parameter` """ + # section foregin keys + group_policy_fk = Column(Integer, ForeignKey('group_policy.id')) + + # endsection description = Column(Text) # Check: what's that? @@ -569,14 +605,20 @@ class Node(elements.Element, structure.ModelMixin): * :code:`capabilities`: Dict of :class:`CapabilityTemplate` * :code:`relationship`: List of :class:`Relationship` """ + __tablename__ = 'node' + + # region foreign_keys + service_instance_fk = Column(Integer, ForeignKey('service_instance.id')) + + # endregion type_name = Column(Text) template_name = Column(Text) properties = Column(type.StrictDict(basestring, elements.Parameter)) - interfaces = Column(type.StrictDict(basestring, Interface)) - artifacts = Column(type.StrictDict(basestring, Artifact)) - capabilities = Column(type.StrictDict(basestring, Capability)) - relationships = Column(type.StrictList(Relationship)) + interfaces = orm.relationship('interface') + artifacts = orm.relationship('artifact') + capabilities = orm.relationship('capability') + relationships = orm.relationship('relationship') def satisfy_requirements(self, context): node_template = context.modeling.model.node_templates.get(self.template_name) @@ -650,7 +692,6 @@ class Node(elements.Element, structure.ModelMixin): level=validation.Issue.BETWEEN_INSTANCES) return False - def validate_capabilities(self, context): satisfied = False for capability in self.capabilities.itervalues(): @@ -730,21 +771,11 @@ class Relationship(elements.Element, structure.ModelMixin): * :code:`source_interfaces`: Dict of :class:`Interface` * :code:`target_interfaces`: Dict of :class:`Interface` """ + __tablename__ = 'relationship' + # region foreign_keys + node_fk = Column(Integer, ForeignKey('node.id')) - def __init__(self, name=None, - source_requirement_index=None, - type_name=None, - template_name=None): - if name is not None and not isinstance(name, basestring): - raise ValueError('name must be a string or None') - if (source_requirement_index is not None and - (not isinstance(source_requirement_index, int) or ( - source_requirement_index < 0))): - raise ValueError('source_requirement_index must be int > 0') - if type_name is not None and not isinstance(type_name, basestring): - raise ValueError('type_name must be a string or None') - if template_name is not None and not isinstance(template_name, basestring): - raise ValueError('template_name must be a string or None') + # endregion source_requirement_index = Column(Integer) target_node_id = Column(Text) @@ -821,12 +852,17 @@ class Group(elements.Element, structure.ModelMixin): * :code:`member_node_ids`: Must be represented in the :class:`ServiceInstance` * :code:`member_group_ids`: Must be represented in the :class:`ServiceInstance` """ + __tablename__ = 'group' + # region foreign_keys + service_instance_fk = Column(Integer, ForeignKey('service_instance.id')) + + # endregion type_name = Column(Text) template_name = Column(Text) properties = Column(type.StrictDict(basestring, elements.Parameter)) - interfaces = Column(type.StrictDict(basestring, Interface)) - policies = Column(type.StrictDict(basestring, GroupPolicy)) + interfaces = orm.relationship('interface') + policies = orm.relationship('group_policy') member_node_ids = Column(type.StrictList(basestring)) member_group_ids = Column(type.StrictList(basestring))
