Affinity and anti-affinity translate to heat resource type 35/16335/3
authorshangxdy <shang.xiaodong@zte.com.cn>
Mon, 4 Jul 2016 16:14:21 +0000 (00:14 +0800)
committershangxdy <shang.xiaodong@zte.com.cn>
Mon, 4 Jul 2016 16:28:58 +0000 (00:28 +0800)
Translate simple tosca policy types of tosca.policy.Placement.Colocate
and tosca.policy.Placement.Antilocate into heat resource
type(nova::servergroup and nova::server)

Change-Id: Icbe8c51c158886608a196951df19e9a503cb786a
JIRA: PARSER-39
Signed-off-by: shangxdy <shang.xiaodong@zte.com.cn>
tosca2heat/heat-translator/translator/hot/syntax/hot_resource.py
tosca2heat/heat-translator/translator/hot/tosca/tosca_policies_antilocate.py [new file with mode: 0644]
tosca2heat/heat-translator/translator/hot/tosca/tosca_policies_colocate.py [new file with mode: 0644]

index d7d0100..bbbeb46 100644 (file)
@@ -320,7 +320,9 @@ class HotResource(object):
 
         node_type = node.type_definition
         if isinstance(node_type, str) or \
-            node_type.type == "tosca.policies.Placement":
+            node_type.type == "tosca.policies.Placement"or \
+            node_type.type == "tosca.policies.Colocate" or \
+            node_type.type == "tosca.policies.Antilocate":
                 return operations
 
         while True:
@@ -338,7 +340,9 @@ class HotResource(object):
     def _get_interface_operations_from_type(node_type, node, lifecycle_name):
         operations = {}
         if isinstance(node_type, str) or \
-            node_type.type == "tosca.policies.Placement":
+            node_type.type == "tosca.policies.Placement" or \
+            node_type.type == "tosca.policies.Colocate" or \
+            node_type.type == "tosca.policies.Antilocate":
                 return operations
         if node_type.interfaces and lifecycle_name in node_type.interfaces:
             for name, elems in node_type.interfaces[lifecycle_name].items():
@@ -354,7 +358,9 @@ class HotResource(object):
     @staticmethod
     def get_base_type(node_type):
         if node_type.parent_type is not None:
-            if node_type.parent_type.type.endswith('.Root'):
+            if node_type.parent_type.type.endswith('.Root') or \
+               node_type.type == "tosca.policies.Colocate" or \
+               node_type.type == "tosca.policies.Antilocate":
                 return node_type
             else:
                 return HotResource.get_base_type(node_type.parent_type)
diff --git a/tosca2heat/heat-translator/translator/hot/tosca/tosca_policies_antilocate.py b/tosca2heat/heat-translator/translator/hot/tosca/tosca_policies_antilocate.py
new file mode 100644 (file)
index 0000000..b7aca4a
--- /dev/null
@@ -0,0 +1,36 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from translator.hot.syntax.hot_resource import HotResource
+
+# Name used to dynamically load appropriate map class.
+TARGET_CLASS_NAME = 'ToscaPoliciesAntilocate'
+
+
+class ToscaPoliciesAntilocate(HotResource):
+    '''Translate TOSCA policy type tosca.poicies.Placement.Antilocate'''
+
+    toscatype = 'tosca.policies.Placement.Antilocate'
+
+    def __init__(self, policy):
+        super(ToscaPoliciesAntilocate, self).__init__(
+            policy, type='OS::Nova::ServerGroup')
+        self.policy = policy
+
+    def handle_properties(self, resources):
+        self.properties["name"] = self.name
+        self.properties["policies"] = ["anti-affinity"]
+        for resource in resources:
+            if resource.name in self.policy.targets:
+                resource.properties["scheduler_hints"] = {
+                    "group": {"get_resource": self.name}}
diff --git a/tosca2heat/heat-translator/translator/hot/tosca/tosca_policies_colocate.py b/tosca2heat/heat-translator/translator/hot/tosca/tosca_policies_colocate.py
new file mode 100644 (file)
index 0000000..1a108bf
--- /dev/null
@@ -0,0 +1,36 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from translator.hot.syntax.hot_resource import HotResource
+
+# Name used to dynamically load appropriate map class.
+TARGET_CLASS_NAME = 'ToscaPoliciesColocate'
+
+
+class ToscaPoliciesColocate(HotResource):
+    '''Translate TOSCA policy type tosca.poicies.Placement.Colocate'''
+
+    toscatype = 'tosca.policies.Placement.Colocate'
+
+    def __init__(self, policy):
+        super(ToscaPoliciesColocate, self).__init__(
+            policy, type='OS::Nova::ServerGroup')
+        self.policy = policy
+
+    def handle_properties(self, resources):
+        self.properties["name"] = self.name
+        self.properties["policies"] = ["affinity"]
+        for resource in resources:
+            if resource.name in self.policy.targets:
+                resource.properties["scheduler_hints"] = {
+                    "group": {"get_resource": self.name}}