Exemple #1
0
    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}
Exemple #2
0
    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
Exemple #3
0
    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]
Exemple #4
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
Exemple #5
0
 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)
Exemple #6
0
    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
Exemple #7
0
 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))
Exemple #8
0
 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.")
Exemple #9
0
    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"]))