def create_from_yaml(paths, debug=False): """ Create tree structure from yaml-like file :param fileobj: File object to be processed :raise SyntaxError: When yaml-file is corrupted :return: Root of the created tree structure """ def _merge(data, path): """ Normal run """ tmp = _create_from_yaml(path) if tmp: data.merge(tmp) def _merge_debug(data, path): """ Use NamedTreeNodeDebug magic """ node_cls = tree.get_named_tree_cls(path, mux.MuxTreeNodeDebug) tmp = _create_from_yaml(path, node_cls) if tmp: data.merge(tmp) if not debug: data = mux.MuxTreeNode() merge = _merge else: data = mux.MuxTreeNodeDebug() merge = _merge_debug path = None try: for path in paths: merge(data, path) # Yaml can raise IndexError on some files except (yaml.YAMLError, IndexError) as details: if 'mapping values are not allowed in this context' in str(details): details = ("%s\nMake sure !tags and colons are separated by a " "space (eg. !include :)" % details) msg = "Invalid multiplex file '%s': %s" % (path, details) raise IOError(2, msg, path) return data
def initialize(self, args): # Deprecated filters only = getattr(args, "filter_only", None) if only: self._log_deprecation_msg("--filter-only", "--mux-filter-only") mux_filter_only = getattr(args, "mux_filter_only") if mux_filter_only: args.mux_filter_only = mux_filter_only + only else: args.mux_filter_only = only out = getattr(args, "filter_out", None) if out: self._log_deprecation_msg("--filter-out", "--mux-filter-out") mux_filter_out = getattr(args, "mux_filter_out") if mux_filter_out: args.mux_filter_out = mux_filter_out + out else: args.mux_filter_out = out if args.avocado_variants.debug: data = mux.MuxTreeNodeDebug() else: data = mux.MuxTreeNode() debug = getattr(args, "mux_debug", False) # Merge the multiplex multiplex_files = getattr(args, "mux_yaml", None) if multiplex_files: try: data.merge(create_from_yaml(multiplex_files, debug)) except IOError as details: error_msg = "%s : %s" % (details.strerror, details.filename) logging.getLogger("avocado.app").error(error_msg) if args.subcommand == 'run': sys.exit(exit_codes.AVOCADO_JOB_FAIL) else: sys.exit(exit_codes.AVOCADO_FAIL) # Deprecated --multiplex option multiplex_files = getattr(args, "multiplex", None) if multiplex_files: self._log_deprecation_msg("--multiplex", "--mux-yaml") try: data.merge(create_from_yaml(multiplex_files, debug)) from_yaml = create_from_yaml(multiplex_files, debug) args.avocado_variants.data_merge(from_yaml) except IOError as details: error_msg = "%s : %s" % (details.strerror, details.filename) logging.getLogger("avocado.app").error(error_msg) if args.subcommand == 'run': sys.exit(exit_codes.AVOCADO_JOB_FAIL) else: sys.exit(exit_codes.AVOCADO_FAIL) # Extend default multiplex tree of --mux-inject values for inject in getattr(args, "mux_inject", []): entry = inject.split(':', 3) if len(entry) < 2: raise ValueError("key:entry pairs required, found only %s" % (entry)) elif len(entry) == 2: # key, entry entry.insert(0, '') # add path='' (root) data.get_node(entry[0], True).value[entry[1]] = entry[2] mux_filter_only = getattr(args, 'mux_filter_only', None) mux_filter_out = getattr(args, 'mux_filter_out', None) data = mux.apply_filters(data, mux_filter_only, mux_filter_out) if data != mux.MuxTreeNode(): mux_path = getattr(args, "mux_path", ["/run/*"]) if mux_path is None: mux_path = ["/run/*"] self.initialize_mux(data, mux_path, debug)