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))
 

Reply via email to