Example #1
0
    def _build_ordered_imports_recursive(_current_parsed_dsl_holder,
                                         _current_import):
        imports_key_holder, imports_value_holder = _current_parsed_dsl_holder.\
            get_item(constants.IMPORTS)
        if not imports_value_holder:
            return

        for another_import in imports_value_holder.restore():
            import_url = _get_resource_location(another_import,
                                                resources_base_url,
                                                _current_import)
            if import_url is None:
                ex = exceptions.DSLParsingLogicException(
                    13, "Import failed: no suitable location found for "
                    "import '{0}'".format(another_import))
                ex.failed_import = another_import
                raise ex
            if import_url in imports_graph:
                imports_graph.add_graph_dependency(import_url,
                                                   location(_current_import))
            else:
                raw_imported_dsl = resolver.fetch_import(import_url)
                imported_dsl_holder = utils.load_yaml(
                    raw_yaml=raw_imported_dsl,
                    error_message="Failed to parse import '{0}' (via '{1}')".
                    format(another_import, import_url),
                    filename=another_import)
                imports_graph.add(import_url, imported_dsl_holder,
                                  location(_current_import))
                _build_ordered_imports_recursive(imported_dsl_holder,
                                                 import_url)
Example #2
0
def _resolve_blueprint_imports(dsl_location, dsl_string, resolver,
                               resources_base_path, validate_version):
    """
    Goes over all the blueprint's imports and constructs a merged blueprint
    from them.
    """
    parsed_dsl_holder = utils.load_yaml(raw_yaml=dsl_string,
                                        error_message='Failed to parse DSL',
                                        filename=dsl_location)
    if not resolver:
        resolver = DefaultImportResolver()
    # validate version schema and extract actual version used
    result = parser.parse(parsed_dsl_holder,
                          element_cls=blueprint.BlueprintVersionExtractor,
                          inputs={'validate_version': validate_version},
                          strict=False)
    version = result['plan_version']
    # handle imports
    result = parser.parse(value=parsed_dsl_holder,
                          inputs={
                              'main_blueprint_holder': parsed_dsl_holder,
                              'resources_base_path': resources_base_path,
                              'blueprint_location': dsl_location,
                              'version': version,
                              'resolver': resolver,
                              'validate_version': validate_version
                          },
                          element_cls=blueprint.BlueprintImporter,
                          strict=False)

    return result['resource_base'],\
        result['merged_blueprint']
Example #3
0
    def build_ordered_imports_recursive(_current_parsed_dsl_holder,
                                        _current_import,
                                        context_namespace=None):
        imports_key_holder, imports_value_holder = _current_parsed_dsl_holder.\
            get_item(constants.IMPORTS)
        if not imports_value_holder:
            return

        for another_import in imports_value_holder.restore():
            namespace, import_url = _extract_import_parts(
                another_import, resources_base_path, _current_import)
            validate_namespace(namespace)
            if context_namespace:
                if namespace:
                    namespace = utils.generate_namespaced_value(
                        context_namespace, namespace)
                else:
                    # In case a namespace was added earlier in the import
                    # chain.
                    namespace = context_namespace
            if import_url is None:
                ex = exceptions.DSLParsingLogicException(
                    13, "Import failed: no suitable location found for "
                    "import '{0}'".format(another_import))
                ex.failed_import = another_import
                raise ex

            if utils.is_blueprint_import(import_url):
                validate_blueprint_import_namespace(namespace, import_url)
                blueprint_id = utils.remove_blueprint_import_prefix(import_url)
                blueprint_imports.add(blueprint_id)
                add_namespace_to_mapping(blueprint_id, namespace)

            import_key = resolve_import_graph_key(import_url, namespace)
            import_context = (location(_current_import), context_namespace)
            if import_key in imports_graph:
                is_cloudify_types = imports_graph[import_key]['cloudify_types']
                validate_import_namespace(namespace, is_cloudify_types,
                                          context_namespace)
                imports_graph.add_graph_dependency(import_url, import_context,
                                                   namespace)
            else:
                imported_dsl = resolver.fetch_import(import_url)
                if not is_parsed_resource(imported_dsl):
                    imported_dsl = utils.load_yaml(
                        raw_yaml=imported_dsl,
                        error_message="Failed to parse import '{0}'"
                        "(via '{1}')".format(another_import, import_url),
                        filename=import_url)
                cloudify_basic_types = is_cloudify_basic_types(imported_dsl)
                validate_import_namespace(namespace, cloudify_basic_types,
                                          context_namespace)
                if cloudify_basic_types:
                    # Remove namespace data from import
                    namespace = None
                imports_graph.add(import_url, imported_dsl,
                                  cloudify_basic_types, import_context,
                                  namespace)
                build_ordered_imports_recursive(imported_dsl, import_url,
                                                namespace)
Example #4
0
    def _build_ordered_imports_recursive(_current_parsed_dsl_holder,
                                         _current_import):
        imports_key_holder, imports_value_holder = _current_parsed_dsl_holder.\
            get_item(constants.IMPORTS)
        if not imports_value_holder:
            return

        for another_import in imports_value_holder.restore():
            import_url = _get_resource_location(another_import,
                                                resources_base_url,
                                                _current_import)
            if import_url is None:
                ex = exceptions.DSLParsingLogicException(
                    13, "Import failed: no suitable location found for "
                        "import '{0}'".format(another_import))
                ex.failed_import = another_import
                raise ex
            if import_url in imports_graph:
                imports_graph.add_graph_dependency(import_url,
                                                   location(_current_import))
            else:
                raw_imported_dsl = resolver.fetch_import(import_url)
                imported_dsl_holder = utils.load_yaml(
                    raw_yaml=raw_imported_dsl,
                    error_message="Failed to parse import '{0}' (via '{1}')"
                                  .format(another_import, import_url),
                    filename=another_import)
                imports_graph.add(import_url, imported_dsl_holder,
                                  location(_current_import))
                _build_ordered_imports_recursive(imported_dsl_holder,
                                                 import_url)
Example #5
0
def _parse(dsl_string, resources_base_url, dsl_location=None):
    parsed_dsl_holder = utils.load_yaml(raw_yaml=dsl_string,
                                        error_message='Failed to parse DSL',
                                        filename=dsl_location)

    # validate version
    result = parser.parse(parsed_dsl_holder,
                          element_cls=blueprint.BlueprintVersionExtractor,
                          strict=False)
    version = result['plan_version']

    # handle imports
    result = parser.parse(
        value=parsed_dsl_holder,
        inputs={
            'main_blueprint_holder': parsed_dsl_holder,
            'resources_base_url': resources_base_url,
            'blueprint_location': dsl_location,
            'version': version
        },
        element_cls=blueprint.BlueprintImporter,
        strict=False)
    resource_base = result['resource_base']
    merged_blueprint_holder = result['merged_blueprint']

    # parse blueprint
    plan = parser.parse(
        value=merged_blueprint_holder,
        inputs={
            'resource_base': resource_base
        },
        element_cls=blueprint.Blueprint)

    functions.validate_functions(plan)
    return plan
def _parse(dsl_string,
           resources_base_path,
           dsl_location=None,
           resolver=None,
           validate_version=True,
           additional_resource_sources=()):
    parsed_dsl_holder = utils.load_yaml(raw_yaml=dsl_string,
                                        error_message='Failed to parse DSL',
                                        filename=dsl_location)

    if not resolver:
        resolver = DefaultImportResolver()

    # validate version schema and extract actual version used
    result = parser.parse(
        parsed_dsl_holder,
        element_cls=blueprint.BlueprintVersionExtractor,
        inputs={
            'validate_version': validate_version
        },
        strict=False)
    version = result['plan_version']

    # handle imports
    result = parser.parse(
        value=parsed_dsl_holder,
        inputs={
            'main_blueprint_holder': parsed_dsl_holder,
            'resources_base_path': resources_base_path,
            'blueprint_location': dsl_location,
            'version': version,
            'resolver': resolver,
            'validate_version': validate_version
        },
        element_cls=blueprint.BlueprintImporter,
        strict=False)
    resource_base = [result['resource_base']]
    if additional_resource_sources:
        resource_base.extend(additional_resource_sources)

    merged_blueprint_holder = result['merged_blueprint']

    # parse blueprint
    plan = parser.parse(
        value=merged_blueprint_holder,
        inputs={
            'resource_base': resource_base,
            'validate_version': validate_version
        },
        element_cls=blueprint.Blueprint)

    functions.validate_functions(plan)
    return plan
Example #7
0
def _parse(dsl_string,
           resources_base_path,
           dsl_location=None,
           resolver=None,
           validate_version=True,
           additional_resource_sources=()):
    parsed_dsl_holder = utils.load_yaml(raw_yaml=dsl_string,
                                        error_message='Failed to parse DSL',
                                        filename=dsl_location)

    if not resolver:
        resolver = DefaultImportResolver()

    # validate version schema and extract actual version used
    result = parser.parse(parsed_dsl_holder,
                          element_cls=blueprint.BlueprintVersionExtractor,
                          inputs={'validate_version': validate_version},
                          strict=False)
    version = result['plan_version']

    # handle imports
    result = parser.parse(value=parsed_dsl_holder,
                          inputs={
                              'main_blueprint_holder': parsed_dsl_holder,
                              'resources_base_path': resources_base_path,
                              'blueprint_location': dsl_location,
                              'version': version,
                              'resolver': resolver,
                              'validate_version': validate_version
                          },
                          element_cls=blueprint.BlueprintImporter,
                          strict=False)
    resource_base = [result['resource_base']]
    if additional_resource_sources:
        resource_base.extend(additional_resource_sources)

    merged_blueprint_holder = result['merged_blueprint']

    # parse blueprint
    plan = parser.parse(value=merged_blueprint_holder,
                        inputs={
                            'resource_base': resource_base,
                            'validate_version': validate_version
                        },
                        element_cls=blueprint.Blueprint)

    functions.validate_functions(plan)
    return plan
Example #8
0
def _parse(dsl_string, resources_base_url, dsl_location=None, resolver=None, validate_version=True):
    parsed_dsl_holder = utils.load_yaml(raw_yaml=dsl_string, error_message="Failed to parse DSL", filename=dsl_location)

    if not resolver:
        resolver = DefaultImportResolver()

    # validate version schema and extract actual version used
    result = parser.parse(
        parsed_dsl_holder,
        element_cls=blueprint.BlueprintVersionExtractor,
        inputs={"validate_version": validate_version},
        strict=False,
    )
    version = result["plan_version"]

    # handle imports
    result = parser.parse(
        value=parsed_dsl_holder,
        inputs={
            "main_blueprint_holder": parsed_dsl_holder,
            "resources_base_url": resources_base_url,
            "blueprint_location": dsl_location,
            "version": version,
            "resolver": resolver,
            "validate_version": validate_version,
        },
        element_cls=blueprint.BlueprintImporter,
        strict=False,
    )
    resource_base = result["resource_base"]
    merged_blueprint_holder = result["merged_blueprint"]

    # parse blueprint
    plan = parser.parse(
        value=merged_blueprint_holder,
        inputs={"resource_base": resource_base, "validate_version": validate_version},
        element_cls=blueprint.Blueprint,
    )

    functions.validate_functions(plan)
    return plan
Example #9
0
    def build_ordered_imports_recursive(_current_parsed_dsl_holder,
                                        _current_import,
                                        context_namespace=None,
                                        dsl_version=None):
        imports_key_holder, imports_value_holder = _current_parsed_dsl_holder.\
            get_item(constants.IMPORTS)
        if not imports_value_holder:
            return

        for another_import in imports_value_holder.restore():
            namespace, import_url = _extract_import_parts(
                another_import, resources_base_path, _current_import,
                dsl_version)
            validate_namespace(namespace)
            if context_namespace:
                if namespace:
                    namespace = utils.generate_namespaced_value(
                        context_namespace, namespace)
                else:
                    # In case a namespace was added earlier in the import
                    # chain.
                    namespace = context_namespace
            if import_url is None:
                ex = exceptions.DSLParsingLogicException(
                    13, "Import failed: no suitable location found for "
                    "import '{0}'".format(another_import))
                ex.failed_import = another_import
                raise ex

            if utils.is_blueprint_import(import_url):
                validate_blueprint_import_namespace(namespace, import_url)
                blueprint_id = utils.remove_blueprint_import_prefix(import_url)
                blueprint_imports.add(blueprint_id)
                add_namespace_to_mapping(blueprint_id, namespace)

            import_key = resolve_import_graph_key(import_url, namespace)
            import_context = (location(_current_import), context_namespace)
            if import_key in imports_graph:
                is_cloudify_types = imports_graph[import_key]['cloudify_types']
                validate_import_namespace(namespace, is_cloudify_types,
                                          context_namespace)
                imports_graph.add_graph_dependency(import_url, import_context,
                                                   namespace)
            else:
                imported_dsl = resolver.fetch_import(import_url,
                                                     dsl_version=dsl_version)
                if not is_parsed_resource(imported_dsl):
                    imported_dsl = utils.load_yaml(
                        raw_yaml=imported_dsl,
                        error_message="Failed to parse import '{0}'"
                        "(via '{1}')".format(another_import, import_url),
                        filename=import_url)
                try:
                    plugin = resolver.retrieve_plugin(import_url)
                except InvalidBlueprintImport:
                    plugin = None
                if plugin:
                    # If it is a plugin, then use labels and tags from the DB
                    utils.remove_dsl_keys(
                        imported_dsl, constants.PLUGIN_DSL_KEYS_NOT_FROM_YAML)
                    for key in constants.PLUGIN_DSL_KEYS_READ_FROM_DB:
                        if not plugin.get(key):
                            continue
                        value = plugin[key]
                        if key in constants.PLUGIN_DSL_KEYS_ADD_VALUES_NODE:
                            value = utils.add_values_node_description(value)
                        _merge_into_dict_or_throw_on_duplicate(
                            Holder.of({key: value}), imported_dsl, key,
                            namespace)
                cloudify_basic_types = is_cloudify_basic_types(imported_dsl)
                validate_import_namespace(namespace, cloudify_basic_types,
                                          context_namespace)
                if cloudify_basic_types:
                    # Remove namespace data from import
                    namespace = None
                imports_graph.add(import_url, imported_dsl,
                                  cloudify_basic_types, import_context,
                                  namespace)
                build_ordered_imports_recursive(imported_dsl, import_url,
                                                namespace, dsl_version)