Repository: incubator-ariatosca Updated Branches: refs/heads/ARIA-105-integrate-modeling 58aac8da2 -> daa2d538b
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/daa2d538/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py index 44e3cc5..c55ccdd 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py @@ -17,8 +17,7 @@ import re from types import FunctionType from datetime import datetime -from aria.parser.modeling import Type, RelationshipType, PolicyType -from aria.modeling.models import (ServiceTemplate, NodeTemplate, +from aria.modeling.models import (Type, ServiceTemplate, NodeTemplate, RequirementTemplate, RelationshipTemplate, CapabilityTemplate, GroupTemplate, PolicyTemplate, SubstitutionTemplate, SubstitutionTemplateMapping, InterfaceTemplate, OperationTemplate, @@ -29,7 +28,7 @@ from ..data_types import coerce_value def create_service_template_model(context): # pylint: disable=too-many-locals,too-many-branches model = ServiceTemplate(created_at=datetime.now(), - main_file_name='') + main_file_name=str(context.presentation.location)) model.description = context.presentation.get('service_template', 'description', 'value') @@ -47,27 +46,32 @@ def create_service_template_model(context): # pylint: disable=too-many-locals,to # Types create_types(context, context.modeling.node_types, - context.presentation.get('service_template', 'node_types')) + context.presentation.get('service_template', 'node_types'), + 'node') create_types(context, context.modeling.group_types, - context.presentation.get('service_template', 'group_types')) + context.presentation.get('service_template', 'group_types'), + 'group') create_types(context, - context.modeling.capability_types, - context.presentation.get('service_template', 'capability_types')) + context.modeling.policy_types, + context.presentation.get('service_template', 'policy_types'), + 'policy') create_types(context, context.modeling.relationship_types, context.presentation.get('service_template', 'relationship_types'), - create_relationship_type_model) + 'relationship') create_types(context, - context.modeling.policy_types, - context.presentation.get('service_template', 'policy_types'), - create_policy_type_model) - create_types(context, - context.modeling.artifact_types, - context.presentation.get('service_template', 'artifact_types')) + context.modeling.capability_types, + context.presentation.get('service_template', 'capability_types'), + 'capability') create_types(context, context.modeling.interface_types, - context.presentation.get('service_template', 'interface_types')) + context.presentation.get('service_template', 'interface_types'), + 'interface') + create_types(context, + context.modeling.artifact_types, + context.presentation.get('service_template', 'artifact_types'), + 'artifact') # Topology template topology_template = context.presentation.get('service_template', 'topology_template') @@ -77,13 +81,10 @@ def create_service_template_model(context): # pylint: disable=too-many-locals,to create_parameter_models_from_values(model.outputs, topology_template._get_output_values(context)) - # Policy templates - # (We need to do this before node and group templates, because we need plugins populated) + # Plugins policies = context.presentation.get('service_template', 'topology_template', 'policies') if policies: for policy in policies.itervalues(): - model.policy_templates.append(create_policy_template_model(context, policy)) - if context.modeling.policy_types.get_role(policy.type) == 'plugin': model.plugins[policy._name] = create_plugin_model(context, policy) @@ -93,6 +94,8 @@ def create_service_template_model(context): # pylint: disable=too-many-locals,to if node_templates: for node_template in node_templates.itervalues(): model.node_templates.append(create_node_template_model(context, model, node_template)) + for node_template in node_templates.itervalues(): + fix_node_template_model(context, model, node_template) # Group templates groups = context.presentation.get('service_template', 'topology_template', 'groups') @@ -100,77 +103,27 @@ def create_service_template_model(context): # pylint: disable=too-many-locals,to for group in groups.itervalues(): model.group_templates.append(create_group_template_model(context, model, group)) + # Policy templates + policies = context.presentation.get('service_template', 'topology_template', 'policies') + if policies: + for policy in policies.itervalues(): + model.policy_templates.append(create_policy_template_model(context, model, policy)) + # Substitution template substitution_mappings = context.presentation.get('service_template', 'topology_template', 'substitution_mappings') if substitution_mappings: - model.substitution_template = create_substituion_template_model(context, model, - substitution_mappings) - - return model - - -def create_substituion_template_model(context, service_template, substitution_mappings): - model = SubstitutionTemplate(node_type_name=substitution_mappings.node_type) - - capabilities = substitution_mappings.capabilities - if capabilities: - for mapped_capability_name, capability in capabilities.iteritems(): - name = 'capability.' + mapped_capability_name - node_template_model = service_template.get_node_template(capability.node_template) - capability_template_model = \ - node_template_model.capability_templates[capability.capability] - model.mappings[name] = \ - SubstitutionTemplateMapping(name=name, - node_template=node_template_model, - capability_template=capability_template_model) - - requirements = substitution_mappings.requirements - if requirements: - for mapped_requirement_name, requirement in requirements.iteritems(): - name = 'requirement.' + mapped_requirement_name - node_template_model = service_template.get_node_template(requirement.node_template) - requirement_template_model = None - for a_model in node_template_model.requirement_templates: - if a_model.name == requirement.requirement: - requirement_template_model = a_model - break - model.mappings[name] = \ - SubstitutionTemplateMapping(name=name, - node_template=node_template_model, - requirement_template=requirement_template_model) - - return model - - -def create_plugin_model(context, policy): - properties = policy.properties - - def get(name): - prop = properties.get(name) - return prop.value if prop is not None else None - - now = datetime.now() - - model = Plugin(name=policy._name, - archive_name=get('archive_name') or '', - distribution=get('distribution'), - distribution_release=get('distribution_release'), - distribution_version=get('distribution_version'), - package_name=get('package_name') or '', - package_source=get('package_source'), - package_version=get('package_version'), - supported_platform=get('supported_platform'), - supported_py_versions=get('supported_py_versions'), - uploaded_at=now, - wheels=get('wheels') or []) + model.substitution_template = create_substitution_template_model(context, model, + substitution_mappings) return model def create_node_template_model(context, service_template, node_template): node_type = node_template._get_type(context) - model = NodeTemplate(name=node_template._name, type_name=node_type._name) + node_type = context.modeling.node_types.get_descendant(node_type._name) + model = NodeTemplate(name=node_template._name, + type=node_type) model.default_instances = 1 model.min_instances = 0 @@ -189,13 +142,6 @@ def create_node_template_model(context, service_template, node_template): model.artifact_templates[artifact_name] = create_artifact_template_model(context, artifact) - requirements = node_template._get_requirements(context) - if requirements: - for _, requirement in requirements: - model.requirement_templates.append(create_requirement_template_model(context, - service_template, - requirement)) - capabilities = node_template._get_capabilities(context) if capabilities: for capability_name, capability in capabilities.iteritems(): @@ -210,75 +156,63 @@ def create_node_template_model(context, service_template, node_template): return model -def create_interface_template_model(context, service_template, interface): - interface_type = interface._get_type(context) - model = InterfaceTemplate(name=interface._name, type_name=interface_type._name) - - if interface_type.description: - model.description = interface_type.description.value - - inputs = interface.inputs - if inputs: - for input_name, the_input in inputs.iteritems(): - model.inputs[input_name] = Parameter(name=input_name, - type_name=the_input.value.type, - str_value=str(the_input.value.value), - description=the_input.value.description) - - operations = interface.operations - if operations: - for operation_name, operation in operations.iteritems(): - model.operation_templates[operation_name] = \ - create_operation_template_model(context, service_template, operation) - - return model if model.operation_templates else None - +def fix_node_template_model(context, service_template, node_template): + # Requirements have to be created after all node templates have been created, because + # requirements might reference another node template + model = service_template.get_node_template(node_template._name) + requirements = node_template._get_requirements(context) + if requirements: + for _, requirement in requirements: + model.requirement_templates.append(create_requirement_template_model(context, + service_template, + requirement)) -def create_operation_template_model(context, service_template, operation): # pylint: disable=unused-argument - model = OperationTemplate(name=operation._name) - if operation.description: - model.description = operation.description.value +def create_group_template_model(context, service_template, group): + group_type = group._get_type(context) + group_type = context.modeling.group_types.get_descendant(group_type._name) + model = GroupTemplate(name=group._name, + type=group_type) - implementation = operation.implementation - if (implementation is not None) and operation.implementation.primary: - model.plugin, model.implementation = \ - parse_implementation_string(context, service_template, operation.implementation.primary) + if group.description: + model.description = group.description.value - dependencies = implementation.dependencies - if dependencies is not None: - model.dependencies = dependencies + create_parameter_models_from_values(model.properties, group._get_property_values(context)) + create_interface_template_models(context, service_template, model.interface_templates, + group._get_interfaces(context)) - inputs = operation.inputs - if inputs: - for input_name, the_input in inputs.iteritems(): - model.inputs[input_name] = Parameter(name=input_name, - type_name=the_input.value.type, - str_value=str(the_input.value.value), - description=the_input.value.description) + members = group.members + if members: + for member in members: + node_template = service_template.get_node_template(member) + assert node_template + model.node_templates.append(node_template) return model -def create_artifact_template_model(context, artifact): - model = ArtifactTemplate(name=artifact._name, type_name=artifact.type, - source_path=artifact.file) - - if artifact.description: - model.description = artifact.description.value +def create_policy_template_model(context, service_template, policy): + policy_type = policy._get_type(context) + policy_type = context.modeling.policy_types.get_descendant(policy_type._name) + model = PolicyTemplate(name=policy._name, + type=policy_type) - model.target_path = artifact.deploy_path + if policy.description: + model.description = policy.description.value - repository = artifact._get_repository(context) - if repository is not None: - model.repository_url = repository.url - credential = repository._get_credential(context) - if credential: - model.repository_credential = {} - for k, v in credential.iteritems(): - model.repository_credential[k] = v + create_parameter_models_from_values(model.properties, policy._get_property_values(context)) - create_parameter_models_from_values(model.properties, artifact._get_property_values(context)) + node_templates, groups = policy._get_targets(context) + if node_templates: + for target in node_templates: + node_template = service_template.get_node_template(target._name) + assert node_template + model.node_templates.append(node_template) + if groups: + for target in groups: + group_template = service_template.get_group_template(target._name) + assert group_template + model.group_templates.append(group_template) return model @@ -289,9 +223,11 @@ def create_requirement_template_model(context, service_template, requirement): node, node_variant = requirement._get_node(context) if node is not None: if node_variant == 'node_type': - model['target_node_type_name'] = node._name + node_type = context.modeling.node_types.get_descendant(node._name) + model['target_node_type'] = node_type else: - model['target_node_template_name'] = node._name + node_template = service_template.get_node_template(node._name) + model['target_node_template'] = node_template capability, capability_variant = requirement._get_capability(context) if capability is not None: @@ -315,23 +251,19 @@ def create_requirement_template_model(context, service_template, requirement): return model -def create_relationship_type_model(context, relationship_type): # pylint: disable=unused-argument - return RelationshipType(relationship_type._name) - - -def create_policy_type_model(context, policy_type): # pylint: disable=unused-argument - return PolicyType(policy_type._name) - - def create_relationship_template_model(context, service_template, relationship): relationship_type, relationship_type_variant = relationship._get_type(context) if relationship_type_variant == 'relationship_type': - model = RelationshipTemplate(type_name=relationship_type._name) + relationship_type = context.modeling.relationship_types.get_descendant( + relationship_type._name) + model = RelationshipTemplate(type=relationship_type) else: relationship_template = relationship_type relationship_type = relationship_template._get_type(context) - model = RelationshipTemplate(type_name=relationship_type._name, - template_name=relationship_template._name) + relationship_type = context.modeling.relationship_types.get_descendant( + relationship_type._name) + model = RelationshipTemplate(type=relationship_type, + name=relationship_template._name) if relationship_template.description: model.description = relationship_template.description.value @@ -344,7 +276,9 @@ def create_relationship_template_model(context, service_template, relationship): def create_capability_template_model(context, capability): capability_type = capability._get_type(context) - model = CapabilityTemplate(name=capability._name, type_name=capability_type._name) + capability_type = context.modeling.capability_types.get_descendant(capability_type._name) + model = CapabilityTemplate(name=capability._name, + type=capability_type) capability_definition = capability._get_definition(context) if capability_definition.description: @@ -357,51 +291,149 @@ def create_capability_template_model(context, capability): valid_source_types = capability_definition.valid_source_types if valid_source_types: - model.valid_source_node_type_names = valid_source_types + for valid_source_type in valid_source_types: + # TODO: handle shortcut type names + node_type = context.modeling.node_types.get_descendant(valid_source_type) + model.valid_source_node_types.append(node_type) create_parameter_models_from_assignments(model.properties, capability.properties) return model -def create_group_template_model(context, service_template, group): - group_type = group._get_type(context) - model = GroupTemplate(name=group._name, type_name=group_type._name) +def create_interface_template_model(context, service_template, interface): + interface_type = interface._get_type(context) + interface_type = context.modeling.interface_types.get_descendant(interface_type._name) + model = InterfaceTemplate(name=interface._name, + type=interface_type) - if group.description: - model.description = group.description.value + if interface_type.description: + model.description = interface_type.description - create_parameter_models_from_values(model.properties, group._get_property_values(context)) - create_interface_template_models(context, service_template, model.interface_templates, - group._get_interfaces(context)) + inputs = interface.inputs + if inputs: + for input_name, the_input in inputs.iteritems(): + model.inputs[input_name] = Parameter(name=input_name, + type_name=the_input.value.type, + value=the_input.value.value, + description=the_input.value.description) - members = group.members - if members: - model.member_node_template_names = [] - for member in members: - model.member_node_template_names.append(member) + operations = interface.operations + if operations: + for operation_name, operation in operations.iteritems(): + model.operation_templates[operation_name] = \ + create_operation_template_model(context, service_template, operation) + + return model if model.operation_templates else None + + +def create_operation_template_model(context, service_template, operation): # pylint: disable=unused-argument + model = OperationTemplate(name=operation._name) + + if operation.description: + model.description = operation.description.value + + implementation = operation.implementation + if (implementation is not None) and operation.implementation.primary: + model.plugin, model.implementation = \ + parse_implementation_string(context, service_template, operation.implementation.primary) + + dependencies = implementation.dependencies + if dependencies is not None: + model.dependencies = dependencies + + inputs = operation.inputs + if inputs: + for input_name, the_input in inputs.iteritems(): + model.inputs[input_name] = Parameter(name=input_name, + type_name=the_input.value.type, + value=the_input.value.value, + description=the_input.value.description) return model -def create_policy_template_model(context, policy): - policy_type = policy._get_type(context) - model = PolicyTemplate(name=policy._name, type_name=policy_type._name) +def create_artifact_template_model(context, artifact): + artifact_type = artifact._get_type(context) + artifact_type = context.modeling.artifact_types.get_descendant(artifact_type._name) + model = ArtifactTemplate(name=artifact._name, + type=artifact_type, + source_path=artifact.file) - if policy.description: - model.description = policy.description.value + if artifact.description: + model.description = artifact.description.value - create_parameter_models_from_values(model.properties, policy._get_property_values(context)) + model.target_path = artifact.deploy_path - node_templates, groups = policy._get_targets(context) - if node_templates: - model.target_node_template_names = [] - for node_template in node_templates: - model.target_node_template_names.append(node_template._name) - if groups: - model.target_group_template_names = [] - for group in groups: - model.target_group_template_names.append(group._name) + repository = artifact._get_repository(context) + if repository is not None: + model.repository_url = repository.url + credential = repository._get_credential(context) + if credential: + model.repository_credential = {} + for k, v in credential.iteritems(): + model.repository_credential[k] = v + + create_parameter_models_from_values(model.properties, artifact._get_property_values(context)) + + return model + + +def create_substitution_template_model(context, service_template, substitution_mappings): + node_type = context.modeling.node_types.get_descendant(substitution_mappings.node_type) + model = SubstitutionTemplate(node_type=node_type) + + capabilities = substitution_mappings.capabilities + if capabilities: + for mapped_capability_name, capability in capabilities.iteritems(): + name = 'capability.' + mapped_capability_name + node_template_model = service_template.get_node_template(capability.node_template) + capability_template_model = \ + node_template_model.capability_templates[capability.capability] + model.mappings[name] = \ + SubstitutionTemplateMapping(name=name, + node_template=node_template_model, + capability_template=capability_template_model) + + requirements = substitution_mappings.requirements + if requirements: + for mapped_requirement_name, requirement in requirements.iteritems(): + name = 'requirement.' + mapped_requirement_name + node_template_model = service_template.get_node_template(requirement.node_template) + requirement_template_model = None + for a_model in node_template_model.requirement_templates: + if a_model.name == requirement.requirement: + requirement_template_model = a_model + break + model.mappings[name] = \ + SubstitutionTemplateMapping(name=name, + node_template=node_template_model, + requirement_template=requirement_template_model) + + return model + + +def create_plugin_model(context, policy): + properties = policy.properties + + def get(name): + prop = properties.get(name) + return prop.value if prop is not None else None + + now = datetime.now() + + model = Plugin(name=policy._name, + archive_name=get('archive_name') or '', + distribution=get('distribution'), + distribution_release=get('distribution_release'), + distribution_version=get('distribution_version'), + package_name=get('package_name') or '', + package_source=get('package_source'), + package_version=get('package_version'), + supported_platform=get('supported_platform'), + supported_py_versions=get('supported_py_versions'), + uploaded_at=now, + wheels=get('wheels') or []) return model @@ -410,7 +442,7 @@ def create_policy_template_model(context, policy): # Utils # -def create_types(context, root, types, normalize=None): +def create_types(context, root, types, variant): if types is None: return @@ -424,10 +456,8 @@ def create_types(context, root, types, normalize=None): for name, the_type in types.iteritems(): if root.get_descendant(name) is None: parent_type = the_type._get_parent(context) - if normalize: - model = normalize(context, the_type) - else: - model = Type(the_type._name) + model = Type(name=the_type._name, + variant=variant) if the_type.description: model.description = the_type.description.value model.role = the_type._get_extension('role') @@ -444,7 +474,7 @@ def create_parameter_models_from_values(properties, source_properties): for property_name, prop in source_properties.iteritems(): properties[property_name] = Parameter(name=property_name, type_name=prop.type, - str_value=str(prop.value), + value=prop.value, description=prop.description) @@ -453,7 +483,7 @@ def create_parameter_models_from_assignments(properties, source_properties): for property_name, prop in source_properties.iteritems(): properties[property_name] = Parameter(name=property_name, type_name=prop.value.type, - str_value=str(prop.value.value), + value=prop.value.value, description=prop.value.description)