def save(self, p_data: str, p_name: str = None): """ :param p_name: :param p_data: :return: """ if p_name is not None: file_name = p_name file_path = os.path.join(self._path, file_name + self._extend) if os.path.exists(file_path): raise OrcFrameworkLibException(0x1, "File %s is already exists.") else: for i in range(10): file_name = time.strftime("%Y%m%d%H%M%S", time.localtime()) file_path = os.path.join(self._path, file_name + self._extend) if not os.path.exists(file_name): break else: raise OrcFrameworkLibException( 0x1, "Generate new file name failed.") with open(file_path, "w") as _file: _file.write(p_data) return {"file": file_name}
def _generate_env_config(self, p_env): """ { group ver1: {cfg, ...} ver2: {cfg, ...} ... } :param p_env: :return: """ def _config(p_flag): """ :param p_flag: :return: """ return self.get_raw_config("system.service.resource.%s" % p_flag, p_env) def _exist(p_flag): """ :param p_flag: :return: """ return self.exists("system.service.resource.%s" % p_flag, p_env) # Get service config result_service = _config("server.%s" % self._flag) # Get group if not result_service or "group" not in result_service or not isinstance( result_service["group"], str): raise OrcFrameworkLibException( 0x01, "Group for %s is wrong." % "server.%s" % self._flag) group_name = result_service["group"] cfg_data = self._arrange(result_service) # Check group config group_exist_result = _exist("group.%s" % group_name) if group_exist_result: # Get group config result_group = _config("group.%s" % group_name) cfg_group = self._arrange(result_group) # Combine data for _ver in cfg_group: if _ver not in cfg_data: cfg_data[_ver] = cfg_group[_ver] continue for _key in cfg_group[_ver]: if _key not in cfg_data[_ver]: cfg_data[_ver][_key] = cfg_group[_ver][_key] cfg_data["group"] = group_name return cfg_data
def _get(self, p_key: str): """ :param p_key: :return: """ if self._flag is None: raise OrcFrameworkLibException(0x1, "Parameter instance is not initialize.") result = self._resource.fetch("get", {"flag": self._flag, "key": p_key}) if 0 != result.code: raise OrcFrameworkLibException(0x1, "Get data %s.%s failed" % (self._flag, p_key)) if 1 != len(result.data): raise OrcFrameworkLibException(0x1, "Data for %s.%s is wrong, %s." % (self._flag, p_key, result.data)) return result[0]
def _set(self, p_key: str, p_value): """ :param p_key: :param p_value: :return: """ if self._flag is None: raise OrcFrameworkLibException(0x1, "Parameter instance is not initialize.") if isinstance(p_value, int): data_type = "INT" elif isinstance(p_value, float): data_type = "FLOAT" elif isinstance(p_value, bool): data_type = "BOOL" elif isinstance(p_value, dict): data_type = "JSON" elif isinstance(p_value, list): data_type = "LIST" else: data_type = "STRING" # Query query_result = self._resource.query({"flag": self._flag, "key": p_key}) if 0 != query_result.code: raise OrcFrameworkLibException(0x1, "Get local parameter for key %s failed." % p_key) if 1 < len(query_result.data): raise OrcFrameworkLibException(0x1, "Too many runtime data[%s.%s] founded." % (self._flag, p_key)) # Data is not exists, add if not query_result.data: update_result = self._resource.add({"flag": self._flag, "key": p_key, "type": data_type, "value": p_value}) # Update else: query_result = query_result.data[0] update_result = self._resource.id(query_result["id"]).update({"type": data_type, "value": p_value}) if 0 != update_result.code: raise OrcFrameworkLibException( 0x1, "Update data {flag: %s, key: %s, value: %s} failed." % (self._flag, p_key, p_value)) return True
def get_section(self, p_section): """ :param p_section: :return: """ try: return self._config_info[p_section] except KeyError: raise OrcFrameworkLibException( 0x1, "Get local config section %s failed." % p_section)
def _arrange(p_data: dict): """ { version: {config, ...} } :param p_data: :return: """ def cfg_len(p_key): if "funcs" == p_key: _data = p_data[p_key] if not _data: return 0 elif isinstance(_data[0], list): return len(_data) else: return 1 return 1 if not isinstance(p_data[p_key], list) else len( p_data[p_key]) temp_data = copy.deepcopy(p_data) if "version" not in p_data: return {} num = cfg_len("version") res_list = [{} for i in range(num)] # One item, data => [data] if 1 == num: temp_data = { _k: [_v] if not isinstance(_v, list) else [_v[0]] for _k, _v in p_data.items() } # Combine config data by version for _key, _value in temp_data.items(): if "group" == _key: continue if num != cfg_len(_key): raise OrcFrameworkLibException( 0x1, "Config %s's length is wrong" % _key) for i in range(num): res_list[i][_key] = _value[i] # Remove version from each config item, version is the key result = {i["version"]: i for i in res_list} for _key, _value in result.items(): _value.pop("version") return result
def get_value(self, p_section, p_key): """ :param p_section: :param p_key: :return: """ try: return self._config_info[p_section][p_key] except KeyError: raise OrcFrameworkLibException( 0x3, "Get local config %s.%s failed." % (p_section, p_key))
def url(self): """ Config url :return: """ try: base_config_info = LocalConfig.get_config_info() return "%s://%s:%s/%s/%s/%s" % \ tuple([base_config_info[key] for key in ("scheme", "host", "port", "group", "version", "source")]) except KeyError: raise OrcFrameworkLibException(0x1, "Config configuration is wrong.")
def _generate_config(self, p_server_flag: str): """ :return: """ # Parameters server_list = p_server_flag.split(".") if 2 != len(server_list): raise OrcFrameworkLibException( 0x1, "Server flag %s is wrong." % p_server_flag) application_name, server_name = server_list current_env = LocalConfig.get_env() # Configurations config_def = { "server_env": { "path": "system.service.%s.%s" % (application_name, server_name), "env": current_env }, "server_default": { "path": "system.service.%s.%s" % (application_name, server_name), "env": "DEFAULT" }, "default_env": { "path": "system.service.%s.default" % application_name, "env": current_env }, "default_default": { "path": "system.service.%s.default" % application_name, "env": "DEFAULT" }, } # Config data config_raw = {} for _key, _value in config_def.items(): config_raw[_key] = self.get_raw_config(_value["path"], _value["env"]) if config_raw[_key] is None: config_raw[_key] = {} # Combine data return self._combine( self._combine(config_raw["server_env"], config_raw["server_default"]), self._combine(config_raw["default_env"], config_raw["default_default"]))