/** * Copyright 2021 Huawei Technologies Co., Ltd * * 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. */ #include "debug/env_config_parser.h" #include #include "nlohmann/json.hpp" #include "utils/log_adapter.h" #include "debug/common.h" #include "utils/ms_context.h" #include "utils/convert_utils_base.h" namespace { constexpr auto kRdrSettings = "rdr"; constexpr auto kPath = "path"; constexpr auto kEnable = "enable"; } // namespace namespace mindspore { bool EnvConfigParser::CheckJsonStringType(const nlohmann::json &content, const std::string &setting_key, const std::string &key) { if (!content.is_string()) { MS_LOG(WARNING) << "Json Parse Failed. The '" << key << "' in '" << setting_key << "' should be string." << " Please check the config file '" << config_file_ << "' set by 'env_config_path' in context."; return false; } return true; } std::optional> EnvConfigParser::CheckJsonKeyExist( const nlohmann::json &content, const std::string &setting_key, const std::string &key) { auto iter = content.find(key); if (iter == content.end()) { MS_LOG(WARNING) << "Check json failed, '" << key << "' not found in '" << setting_key << "'." << " Please check the config file '" << config_file_ << "' set by 'env_config_path' in context."; return std::nullopt; } return iter; } std::string EnvConfigParser::GetIfstreamString(const std::ifstream &ifstream) { std::stringstream buffer; buffer << ifstream.rdbuf(); return buffer.str(); } void EnvConfigParser::Parse() { std::lock_guard guard(lock_); if (already_parsed_) { return; } already_parsed_ = true; auto context = MsContext::GetInstance(); MS_EXCEPTION_IF_NULL(context); auto config_file = context->get_param(MS_CTX_ENV_CONFIG_PATH); if (config_file.empty()) { MS_LOG(INFO) << "The 'env_config_path' in 'mindspore.context.set_context(env_config_path={path})' is empty."; return; } config_file_ = config_file; std::ifstream json_file(config_file_); if (!json_file.is_open()) { MS_LOG(WARNING) << "Env config file:" << config_file_ << " open failed." << " Please check the config file '" << config_file_ << "' set by 'env_config_path' in context."; return; } nlohmann::json j; try { json_file >> j; } catch (nlohmann::json::parse_error &e) { MS_LOG(WARNING) << "Env config json contents '" << GetIfstreamString(json_file) << "' in config file '" << config_file_ << "' set by 'env_config_path' in context."; return; } // convert json to string std::stringstream ss; ss << j; std::string cfg = ss.str(); MS_LOG(INFO) << "Env config json:" << cfg; ParseRdrSetting(j); ConfigToString(); } void EnvConfigParser::ParseRdrSetting(const nlohmann::json &content) { auto rdr_setting = content.find(kRdrSettings); if (rdr_setting == content.end()) { MS_LOG(WARNING) << "The '" << kRdrSettings << "' not exists. Please check the config file '" << config_file_ << "' set by 'env_config_path' in context."; return; } has_rdr_setting_ = true; auto rdr_enable = CheckJsonKeyExist(*rdr_setting, kRdrSettings, kEnable); if (rdr_enable.has_value()) { ParseRdrEnable(**rdr_enable); } auto rdr_path = CheckJsonKeyExist(*rdr_setting, kRdrSettings, kPath); if (rdr_path.has_value()) { ParseRdrPath(**rdr_path); } } void EnvConfigParser::ParseRdrPath(const nlohmann::json &content) { std::string err_msg = "RDR path parse failed. The RDR path will be a default value: '" + rdr_path_ + "'. Please check the settings about '" + kRdrSettings + "' in config file '" + config_file_ + "' set by 'env_config_path' in context."; if (!CheckJsonStringType(content, kRdrSettings, kPath)) { MS_LOG(WARNING) << err_msg; return; } std::string path = content; if (!Common::IsPathValid(path, maxDirectoryLength, err_msg, false)) { return; } if (path.back() != '/') { path += '/'; } rdr_path_ = path; } void EnvConfigParser::ParseRdrEnable(const nlohmann::json &content) { if (!content.is_boolean()) { MS_LOG(WARNING) << "Json parse failed. 'enable' in " << kRdrSettings << " should be boolean." << " Please check the config file '" << config_file_ << "' set by 'env_config_path' in context."; rdr_enabled_ = false; return; } rdr_enabled_ = content; } void EnvConfigParser::ConfigToString() { std::string cur_config; cur_config.append("After parsed, rdr path: "); cur_config.append(rdr_path_); cur_config.append(", rdr_enable: "); cur_config.append(std::to_string(rdr_enabled_)); MS_LOG(INFO) << cur_config; } } // namespace mindspore