1 # Licensed under the Apache License, Version 2.0 (the "License"); you may
2 # not use this file except in compliance with the License. You may obtain
3 # a copy of the License at
5 # http://www.apache.org/licenses/LICENSE-2.0
7 # Unless required by applicable law or agreed to in writing, software
8 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10 # License for the specific language governing permissions and limitations
16 from toscaparser.common.exception import ExceptionCollector
17 from toscaparser.common.exception import ValidationError
18 from toscaparser.extensions.exttools import ExtTools
19 import toscaparser.utils.yamlparser
21 log = logging.getLogger('tosca')
24 class EntityType(object):
25 '''Base class for TOSCA elements.'''
27 SECTIONS = (DERIVED_FROM, PROPERTIES, ATTRIBUTES, REQUIREMENTS,
28 INTERFACES, CAPABILITIES, TYPE, ARTIFACTS) = \
29 ('derived_from', 'properties', 'attributes', 'requirements',
30 'interfaces', 'capabilities', 'type', 'artifacts')
32 '''TOSCA definition file.'''
33 TOSCA_DEF_FILE = os.path.join(
34 os.path.dirname(os.path.abspath(__file__)),
35 "TOSCA_definition_1_0.yaml")
37 loader = toscaparser.utils.yamlparser.load_yaml
39 TOSCA_DEF = loader(TOSCA_DEF_FILE)
41 RELATIONSHIP_TYPE = (DEPENDSON, HOSTEDON, CONNECTSTO, ATTACHESTO,
43 ('tosca.relationships.DependsOn',
44 'tosca.relationships.HostedOn',
45 'tosca.relationships.ConnectsTo',
46 'tosca.relationships.AttachesTo',
47 'tosca.relationships.network.LinksTo',
48 'tosca.relationships.network.BindsTo')
50 NODE_PREFIX = 'tosca.nodes.'
51 RELATIONSHIP_PREFIX = 'tosca.relationships.'
52 CAPABILITY_PREFIX = 'tosca.capabilities.'
53 INTERFACE_PREFIX = 'tosca.interfaces.'
54 ARTIFACT_PREFIX = 'tosca.artifacts.'
55 POLICY_PREFIX = 'tosca.policies.'
56 GROUP_PREFIX = 'tosca.groups.'
57 # currently the data types are defined only for network
58 # but may have changes in the future.
59 DATATYPE_PREFIX = 'tosca.datatypes.network.'
62 def derived_from(self, defs):
63 '''Return a type this type is derived from.'''
64 return self.entity_value(defs, 'derived_from')
66 def is_derived_from(self, type_str):
67 '''Check if object inherits from the given type.
69 Returns true if this object is derived from 'type_str'.
74 elif self.type == type_str:
76 elif self.parent_type:
77 return self.parent_type.is_derived_from(type_str)
81 def entity_value(self, defs, key):
85 def get_value(self, ndtype, defs=None, parent=None):
88 if not hasattr(self, 'defs'):
92 # copy the value to avoid that next operations add items in the
94 value = copy.copy(defs[ndtype])
100 # get the parent value
101 parent_value = p.defs[ndtype]
103 if isinstance(value, dict):
104 for k, v in parent_value.items():
105 if k not in value.keys():
107 if isinstance(value, list):
108 for p_value in parent_value:
109 if p_value not in value:
110 value.append(p_value)
112 value = copy.copy(parent_value)
116 def get_definition(self, ndtype):
118 if not hasattr(self, 'defs'):
120 ExceptionCollector.appendException(
121 ValidationError(message="defs is " + str(defs)))
124 if defs is not None and ndtype in defs:
128 inherited = p.get_definition(ndtype)
130 inherited = dict(inherited)
134 inherited.update(value)
135 value.update(inherited)
139 def update_definitions(version):
140 exttools = ExtTools()
141 extension_defs_file = exttools.get_defs_file(version)
143 loader = toscaparser.utils.yamlparser.load_yaml
145 EntityType.TOSCA_DEF.update(loader(extension_defs_file))