# # Copyright 2019 The FATE Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # from pathlib import Path from ruamel import yaml from pipeline.constant import JobStatus __all__ = ["JobStatus", "VERSION", "SERVER_VERSION", "TIME_QUERY_FREQS", "Role", "StatusCode", "LogPath", "LogFormat", "IODataType", "PipelineConfig"] VERSION = 2 SERVER_VERSION = "v1" TIME_QUERY_FREQS = 1 MAX_RETRY = 3 def get_default_config() -> dict: with (Path(__file__).parent.parent / "config.yaml").open(encoding="utf-8") as f: return yaml.safe_load(f) class Role(object): LOCAL = "local" GUEST = "guest" HOST = "host" ARBITER = "arbiter" @classmethod def support_roles(cls): roles = set() for role_key, role in cls.__dict__.items(): if role_key.startswith("__") and isinstance(role_key, str): continue roles.add(role) return roles class StatusCode(object): SUCCESS = 0 FAIL = 1 CANCELED = 2 class IODataType: SINGLE = "data" TRAIN = "train_data" VALIDATE = "validate_data" TEST = "test_data" class PipelineConfigMeta(type): def __getattr__(cls, name): if name not in cls._keys: raise AttributeError(f"type object '{cls.__name__}' has no attribute '{name}'") if cls._conf is None: cls._conf = get_default_config() value = cls._conf.get(name.lower()) if value is not None: return value if name in {"IP", "PORT"}: raise ValueError( f"{name} not configured. " "Please use command line tool `pipeline init` to set it." ) return cls._defaults.get(name) class PipelineConfig(metaclass=PipelineConfigMeta): _conf = None _keys = {"IP", "PORT", "APP_KEY", "SECRET_KEY", "CONSOLE_DISPLAY_LOG", "SYSTEM_SETTING"} _defaults = { "CONSOLE_DISPLAY_LOG": True, "SYSTEM_SETTING": {"role": None}, } class LogPath(object): @classmethod def log_directory(cls): conf = get_default_config() # log_directory = os.environ.get("FATE_PIPELINE_LOG", "") log_directory = conf.get("log_directory") if log_directory: log_directory = Path(log_directory).resolve() else: log_directory = Path(__file__).parent.parent.joinpath("logs") try: log_directory.mkdir(parents=True, exist_ok=True) except Exception as e: raise RuntimeError(f"can't create log directory for pipeline: {log_directory}") from e if not Path(log_directory).resolve().is_dir(): raise NotADirectoryError(f"provided log directory {log_directory} is not a directory.") return log_directory DEBUG = 'DEBUG.log' INFO = 'INFO.log' ERROR = 'ERROR.log' class LogFormat(object): SIMPLE = '[{time:HH:mm:ss}]{message}' NORMAL = '{time:YYYY-MM-DD HH:mm:ss} | ' \ '{function}:{line} - {message}'