def _fetch_configs(paths): """Fetches a bunch of config files in parallel and validates them. Returns: dict {path -> (Revision tuple, <config>)}. Raises: CannotLoadConfigError if some config is missing or invalid. """ paths = sorted(paths) futures = [ config.get_self_config_async( p, dest_type=_CONFIG_SCHEMAS[p]['proto_class'], store_last_good=False) for p in paths ] configs_url = _get_configs_url() ndb.Future.wait_all(futures) out = {} for path, future in zip(paths, futures): rev, conf = future.get_result() if conf is None: raise CannotLoadConfigError('Config %s is missing' % path) try: validation.validate(config.self_config_set(), path, conf) except ValueError as exc: raise CannotLoadConfigError( 'Config %s at rev %s failed to pass validation: %s' % (path, rev, exc)) out[path] = (Revision(rev, _gitiles_url(configs_url, rev, path)), conf) return out
def _fetch_configs(paths): """Fetches a bunch of config files in parallel and validates them. Returns: dict {path -> (Revision tuple, <config>)}. Raises: CannotLoadConfigError if some config is missing or invalid. """ paths = sorted(paths) configs_url = _get_configs_url() out = {} configs = utils.async_apply( paths, lambda p: config.get_self_config_async( p, dest_type=_CONFIG_SCHEMAS[p]['proto_class'], store_last_good=False)) for path, (rev, conf) in configs: if conf is None: default = _CONFIG_SCHEMAS[path].get('default') if default is None: raise CannotLoadConfigError('Config %s is missing' % path) rev, conf = '0' * 40, default try: validation.validate(config.self_config_set(), path, conf) except ValueError as exc: raise CannotLoadConfigError( 'Config %s at rev %s failed to pass validation: %s' % (path, rev, exc)) out[path] = (Revision(rev, _gitiles_url(configs_url, rev, path)), conf) return out
def _fetch_configs(paths): """Fetches a bunch of config files in parallel and validates them. Returns: dict {path -> (Revision tuple, <config>)}. Raises: CannotLoadConfigError if some config is missing or invalid. """ paths = sorted(paths) futures = [ config.get_self_config_async( p, dest_type=_CONFIG_SCHEMAS[p]['proto_class'], store_last_good=False) for p in paths ] configs_url = _get_configs_url() out = {} for path, future in zip(paths, futures): rev, conf = future.get_result() try: validation.validate(config.self_config_set(), path, conf) except ValueError as exc: raise config.CannotLoadConfigError( 'Config %s at rev %s failed to pass validation: %s' % (path, rev, exc)) out[path] = (Revision(rev, _gitiles_url(configs_url, rev, path)), conf) return out
def validate_config_async(config_set, path, content, ctx=None): """Validates a config against built-in and external validators. External validators are defined in validation.cfg, see proto/service_config.proto. Returns: components.config.validation_context.Result. """ ctx = ctx or validation.Context() # Check the config against built-in validators, # defined using validation.self_rule. validation.validate(config_set, path, content, ctx=ctx) all_services = yield services.get_services_async() futures = [] for service in all_services: futures.append(_validate_by_service_async(service, config_set, path, content, ctx)) yield futures raise ndb.Return(ctx.result())
def validate_config_async(config_set, path, content, ctx=None): """Validates a config against built-in and external validators. External validators are defined in validation.cfg, see proto/service_config.proto. Returns: components.config.validation_context.Result. """ ctx = ctx or validation.Context() # Check the config against built-in validators, # defined using validation.self_rule. validation.validate(config_set, path, content, ctx=ctx) all_services = yield services.get_services_async() futures = [] for service in all_services: futures.append( _validate_by_service_async(service, config_set, path, content, ctx)) yield futures raise ndb.Return(ctx.result())