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