LCOV - code coverage report
Current view: top level - server - qs_args_parser.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.6 % 241 240
Test Date: 2026-08-12 11:05:07 Functions: 100.0 % 24 24

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #include <sstream>
      12              : #include "qs_args_parser.h"
      13              : #include "bqs_util.h"
      14              : #include "bqs_log.h"
      15              : #include "bqs_feature_ctrl.h"
      16              : 
      17              : namespace bqs {
      18           33 : bool ArgsParser::ParseArgs(const int32_t argc, const char_t* const argv[])
      19              : {
      20           33 :     if ((argv == nullptr) || (argc <= 1)) {
      21            1 :         return false;
      22              :     }
      23              : 
      24          262 :     for (uint32_t i = 0; i < static_cast<uint32_t>(argc); ++i) {
      25          478 :         if (!ParseSinglePara(std::string(argv[i]))) {
      26            9 :             return false;
      27              :         }
      28              :     }
      29              : 
      30           23 :     return CheckRequiredParas();
      31              : }
      32              : 
      33            5 : bool ArgsParser::ParseArgs(const std::vector<std::string>& args)
      34              : {
      35           24 :     for (const auto& iter : args) {
      36           20 :         if (!ParseSinglePara(iter)) {
      37            1 :             return false;
      38              :         }
      39              :     }
      40              : 
      41            4 :     return CheckRequiredParas();
      42              : }
      43              : 
      44           27 : bool ArgsParser::CheckRequiredParas() const
      45              : {
      46           27 :     std::unordered_map<std::string, bool> requiredParamsMap;
      47           27 :     requiredParamsMap.insert(std::make_pair(PARAM_DEVICEID, withDeviceId_));
      48           27 :     requiredParamsMap.insert(std::make_pair(PARAM_HOST_PID, withHostPid_));
      49           27 :     if (bqs::GetRunContext() == bqs::RunContext::HOST) {
      50           21 :         requiredParamsMap.insert(std::make_pair(PARAM_GRP_NAME, withGroupName_));
      51              :     }
      52           91 :     for (auto requiredParams : requiredParamsMap) {
      53           69 :         if (!requiredParams.second) {
      54            5 :             BQS_LOG_ERROR("Param error. Must specify param with [%s].", requiredParams.first.c_str());
      55            5 :             return false;
      56              :         }
      57           69 :     }
      58              : 
      59           22 :     std::unordered_map<std::string, bool> requiredParamsWarnMap;
      60           22 :     requiredParamsWarnMap.insert(std::make_pair(PARAM_VFID, withVfId_));
      61           22 :     requiredParamsWarnMap.insert(std::make_pair(PARAM_PIDSIGN, withPidSign_));
      62           66 :     for (auto requiredParamsWarn : requiredParamsWarnMap) {
      63           44 :         if (!requiredParamsWarn.second) {
      64            7 :             BQS_LOG_WARN("param error. Param %s does not exist.", requiredParamsWarn.first.c_str());
      65              :         }
      66           44 :     }
      67              : 
      68           22 :     return true;
      69           27 : }
      70              : 
      71          263 : bool ArgsParser::ParseSinglePara(const std::string& singlePara)
      72              : {
      73          263 :     const std::size_t offset = singlePara.find("=");
      74          263 :     if (offset == std::string::npos) {
      75           35 :         return true;
      76              :     }
      77              : 
      78          228 :     const std::string key = singlePara.substr(0U, offset + 1UL);
      79          228 :     const std::string val = singlePara.substr(offset + 1UL);
      80          228 :     const auto iter = argsParseFuncMap_.find(key);
      81          228 :     if (iter == argsParseFuncMap_.end()) {
      82              :         // Ignore unknown parameter
      83            2 :         BQS_LOG_WARN("unknown input parameter [%s] of function ParseArgs, ignore", key.c_str());
      84            2 :         return true;
      85              :     }
      86              : 
      87          226 :     const bool ret = (this->*(iter->second))(val);
      88          226 :     if (!ret) {
      89           11 :         return false;
      90              :     }
      91              : 
      92          215 :     return true;
      93          228 : }
      94              : 
      95           40 : bool ArgsParser::ParseDeviceId(const std::string& para)
      96              : {
      97           40 :     int32_t val = 0;
      98           40 :     if (!TransStrToInt(para, val)) {
      99            2 :         BQS_LOG_ERROR("Parse deviceId failed, param is %s", para.c_str());
     100            2 :         return false;
     101              :     }
     102              : 
     103           38 :     if ((val < 0) || (val >= QS_FW_CHIP_NUM_MAX)) {
     104            4 :         BQS_LOG_ERROR("DeviceId param[%s] invalided, value is not in [%d, %d)", para.c_str(), 0, QS_FW_CHIP_NUM_MAX);
     105            4 :         return false;
     106              :     }
     107              : 
     108           34 :     deviceId_ = static_cast<uint32_t>(val);
     109           34 :     withDeviceId_ = true;
     110           34 :     return true;
     111              : }
     112              : 
     113           22 : bool ArgsParser::ParseDeviceId(const std::string& para, int32_t& deviceId) const
     114              : {
     115           22 :     int32_t val = 0;
     116           22 :     if (!TransStrToInt(para, val)) {
     117            1 :         BQS_LOG_WARN("Parse deviceId failed, param is %s", para.c_str());
     118            1 :         return false;
     119              :     }
     120              : 
     121           21 :     if ((val < 0) || (val >= QS_FW_CHIP_NUM_MAX)) {
     122            2 :         BQS_LOG_WARN("DeviceId param[%s] invalided, value is not in [%d, %d)", para.c_str(), 0, QS_FW_CHIP_NUM_MAX);
     123            2 :         return false;
     124              :     }
     125              : 
     126           19 :     deviceId = static_cast<uint32_t>(val);
     127           19 :     return true;
     128              : }
     129              : 
     130           34 : bool ArgsParser::ParseHostPid(const std::string& para)
     131              : {
     132           34 :     int32_t val = 0;
     133           34 :     if (!TransStrToInt(para, val)) {
     134            2 :         BQS_LOG_ERROR("Parse pid failed, param is %s", para.c_str());
     135            2 :         return false;
     136              :     }
     137              : 
     138           32 :     if (val <= 0) {
     139            2 :         BQS_LOG_ERROR("Pid param[%s] value invalided", para.c_str());
     140            2 :         return false;
     141              :     }
     142              : 
     143           30 :     hostPid_ = static_cast<uint32_t>(val);
     144           30 :     withHostPid_ = true;
     145           30 :     return true;
     146              : }
     147              : 
     148           30 : bool ArgsParser::ParsePidSign(const std::string& para)
     149              : {
     150           30 :     pidSign_ = para;
     151           30 :     withPidSign_ = true;
     152           30 :     return true;
     153              : }
     154              : 
     155           26 : bool ArgsParser::ParseVfId(const std::string& para)
     156              : {
     157           26 :     int32_t val = 0;
     158           26 :     if (!TransStrToInt(para, val)) {
     159            2 :         BQS_LOG_ERROR("Parse vfId failed, param is %s", para.c_str());
     160            2 :         return false;
     161              :     }
     162              : 
     163           24 :     if ((val < 0) || (val > VF_ID_MAX)) {
     164            2 :         BQS_LOG_ERROR("VfId param[%s] invalided, value is not in [%u, %u]", para.c_str(), 0, VF_ID_MAX);
     165            2 :         return false;
     166              :     }
     167              : 
     168           22 :     vfId_ = static_cast<uint32_t>(val);
     169           22 :     withVfId_ = true;
     170           22 :     return true;
     171              : }
     172              : 
     173           27 : void ArgsParser::SetLogLevel(const int32_t logLevel, const int32_t eventLevel) const
     174              : {
     175           27 :     if (bqs::FeatureCtrl::IsHostQs()) {
     176            1 :         bqs::HostQsLog::GetInstance().DlogSetLevel(logLevel, eventLevel);
     177            1 :         LogAttr dlogAttrInfo = {};
     178            1 :         dlogAttrInfo.type = APPLICATION;
     179            1 :         dlogAttrInfo.pid = hostPid_;
     180            1 :         dlogAttrInfo.deviceId = deviceId_;
     181            1 :         dlogAttrInfo.mode = 0;
     182            1 :         bqs::HostQsLog::GetInstance().DlogSetAttr(dlogAttrInfo);
     183              :     } else {
     184           26 :         if (&dlog_setlevel != nullptr) {
     185           26 :             if (dlog_setlevel(-1, logLevel, eventLevel) != SUCCESS_VALUE) {
     186           24 :                 BQS_LOG_WARN("Set log level failed");
     187              :             }
     188              :         }
     189           26 :         if (&DlogSetAttr != nullptr) {
     190           26 :             LogAttr dlogAttrInfo = {};
     191           26 :             dlogAttrInfo.type = APPLICATION;
     192           26 :             dlogAttrInfo.pid = hostPid_;
     193           26 :             dlogAttrInfo.deviceId = deviceId_;
     194           26 :             dlogAttrInfo.mode = 0;
     195           26 :             if (DlogSetAttr(dlogAttrInfo) != SUCCESS_VALUE) {
     196            2 :                 BQS_LOG_WARN("Set log attr failed");
     197              :             }
     198              :         }
     199              :     }
     200           27 : }
     201              : 
     202            1 : void ArgsParser::SetAicpuLogLevel() const
     203              : {
     204            1 :     if ((aicpulogLevel_ >= DEBUG_LOG) && (aicpulogLevel_ <= ERROR_LOG)) {
     205            1 :         if (bqs::FeatureCtrl::IsHostQs()) {
     206            0 :             bqs::HostQsLog::GetInstance().DlogSetLevel(aicpulogLevel_, eventLevel_);
     207              :         } else {
     208            1 :             if (&dlog_setlevel != nullptr) {
     209            1 :                 if (dlog_setlevel(AICPU, aicpulogLevel_, eventLevel_) != SUCCESS_VALUE) {
     210            1 :                     BQS_LOG_WARN("Set aicpu log level failed");
     211              :                 }
     212              :             }
     213              :         }
     214              :     }
     215            1 : }
     216              : 
     217            8 : bool ArgsParser::ParseLogAndEventLevel(const std::string& para)
     218              : {
     219            8 :     int32_t val = 0;
     220            8 :     if (!TransStrToInt(para, val)) {
     221            1 :         return false;
     222              :     }
     223              : 
     224            7 :     if (val < 0) {
     225            1 :         return false;
     226              :     }
     227              : 
     228            6 :     logLevel_ = val % VALUE_FOR_CALCULATE_LOG_LEVEL;
     229            6 :     eventLevel_ = val / VALUE_FOR_CALCULATE_LOG_LEVEL;
     230            6 :     withLogLevel_ = true;
     231            6 :     SetLogLevel(logLevel_, eventLevel_);
     232            6 :     return true;
     233              : }
     234              : 
     235            2 : bool ArgsParser::ParseAicpuLogLevel(const std::string& para)
     236              : {
     237            2 :     int32_t val = 0;
     238            2 :     if (!TransStrToInt(para, val)) {
     239            1 :         return true;
     240              :     }
     241              : 
     242            1 :     aicpulogLevel_ = val;
     243            1 :     withLogLevel_ = true;
     244            1 :     SetAicpuLogLevel();
     245            1 :     return true;
     246              : }
     247              : 
     248           28 : bool ArgsParser::ParseDeployMode(const std::string& para)
     249              : {
     250           28 :     int32_t val = 0;
     251           28 :     if (!TransStrToInt(para, val)) {
     252            2 :         BQS_LOG_ERROR("Parse deploy mode failed, param is %s", para.c_str());
     253            2 :         return false;
     254              :     }
     255              : 
     256           26 :     if ((val < static_cast<int32_t>(bqs::QueueSchedulerRunMode::SINGLE_PROCESS)) ||
     257           25 :         (val > static_cast<int32_t>(bqs::QueueSchedulerRunMode::MULTI_THREAD))) {
     258            1 :         BQS_LOG_ERROR(
     259              :             "deploy mode param[%s] invalided, value is not in [%u, %u]", para.c_str(),
     260              :             static_cast<uint32_t>(QueueSchedulerRunMode::SINGLE_PROCESS),
     261              :             static_cast<uint32_t>(QueueSchedulerRunMode::MULTI_THREAD));
     262            1 :         return false;
     263              :     }
     264              : 
     265           25 :     deployMode_ = static_cast<QueueSchedulerRunMode>(val);
     266           25 :     return true;
     267              : }
     268              : 
     269              : // ignore error
     270           29 : bool ArgsParser::ParseReschedInterval(const std::string& para)
     271              : {
     272           29 :     int32_t val = 0;
     273           29 :     if (!TransStrToInt(para, val)) {
     274            1 :         BQS_LOG_WARN("Parse resched interval not success, using default value %d ms", reschedInterval_);
     275            1 :         return true;
     276              :     }
     277              : 
     278           28 :     if ((val < RESCHED_INTERVAL_CLOSE) || (val > RESCHED_INTERVAL_MAX)) {
     279            1 :         BQS_LOG_WARN(
     280              :             "resched interval param[%s] invalided, value is not in [%d, %d], using default value[%d] ms", para.c_str(),
     281              :             RESCHED_INTERVAL_CLOSE, RESCHED_INTERVAL_MAX, reschedInterval_);
     282            1 :         return true;
     283              :     }
     284              : 
     285           27 :     reschedInterval_ = val;
     286           27 :     return true;
     287              : }
     288              : 
     289           25 : bool ArgsParser::ParseGroupName(const std::string& para)
     290              : {
     291           25 :     groupName_ = para;
     292           25 :     withGroupName_ = true;
     293           25 :     return true;
     294              : }
     295              : 
     296            2 : bool ArgsParser::ParseSchedPolicy(const std::string& para)
     297              : {
     298            2 :     uint64_t val = 0;
     299            2 :     if (!TransStrToull(para, val)) {
     300            1 :         BQS_LOG_ERROR("Parse SchedPolicy failed, param is %s", para.c_str());
     301            1 :         return false;
     302              :     }
     303              : 
     304            1 :     BQS_LOG_INFO("SchedPolicy is [0x%lx].", val);
     305            1 :     schedPolicy_ = val;
     306            1 :     return true;
     307              : }
     308              : 
     309              : // ignore error
     310            5 : bool ArgsParser::ParseStarter(const std::string& para)
     311              : {
     312            5 :     int32_t val = 0;
     313            5 :     if (!TransStrToInt(para, val)) {
     314            1 :         BQS_LOG_WARN("Parse starter failed, param is %s", para.c_str());
     315            1 :         return true;
     316              :     }
     317              : 
     318            4 :     starter_ = static_cast<bqs::QsStartType>(val);
     319            4 :     withStarter_ = true;
     320            4 :     return true;
     321              : }
     322              : 
     323            1 : bool ArgsParser::ParseProfCfgData(const std::string& para)
     324              : {
     325            1 :     profCfgData_ = para;
     326            1 :     return true;
     327              : }
     328              : 
     329              : // ignore error
     330            3 : bool ArgsParser::ParseProfFlag(const std::string& para)
     331              : {
     332            3 :     int32_t val = 0;
     333            3 :     if (!TransStrToInt(para, val)) {
     334            1 :         BQS_LOG_WARN("Parse prof flag failed, param is %s", para.c_str());
     335            1 :         return true;
     336              :     }
     337              : 
     338            2 :     profFlag_ = (val != 0);
     339            2 :     return true;
     340              : }
     341              : 
     342              : // ignore error
     343            5 : bool ArgsParser::ParseAbnormalInterval(const std::string& para)
     344              : {
     345            5 :     int32_t val = 0;
     346            5 :     if (!TransStrToInt(para, val)) {
     347            1 :         BQS_LOG_INFO("Parse abnormal interval not success, using default value %d", abnormalInterval_);
     348            1 :         return true;
     349              :     }
     350              : 
     351            4 :     if ((val <= ABNORMAL_INTERVAL_MIN) || (val > ABNORMAL_INTERVAL_MAX)) {
     352            1 :         BQS_LOG_WARN(
     353              :             "abnormal interval param[%s] invalided, value is not in [%d, %d], using default value[%d]", para.c_str(),
     354              :             ABNORMAL_INTERVAL_MIN, ABNORMAL_INTERVAL_MAX, abnormalInterval_);
     355            1 :         return true;
     356              :     }
     357              : 
     358            3 :     abnormalInterval_ = val;
     359            3 :     return true;
     360              : }
     361              : 
     362              : // ignore error
     363            9 : bool ArgsParser::ParseResourceList(const std::string& para)
     364              : {
     365            9 :     size_t pos = para.find(",");
     366            9 :     if (pos == std::string::npos) {
     367            1 :         return true;
     368              :     }
     369            8 :     std::string deviceStr0 = para.substr(0, pos);
     370            8 :     std::string deviceStr1 = para.substr(pos + 1, para.length());
     371            8 :     int32_t curId = 0;
     372            8 :     if (!ParseDeviceId(deviceStr0, curId)) {
     373            1 :         return true;
     374              :     }
     375            7 :     resVec_.push_back(curId);
     376              : 
     377            7 :     if (!ParseDeviceId(deviceStr1, curId)) {
     378            1 :         return true;
     379              :     }
     380            6 :     resVec_.push_back(curId);
     381            6 :     return true;
     382            8 : }
     383              : 
     384              : // ignore error
     385            3 : bool ArgsParser::ParseDeviceIdsList(const std::string& para)
     386              : {
     387            3 :     std::istringstream issStr(para);
     388            3 :     std::string idStr;
     389            3 :     int32_t curId = 0;
     390            9 :     while (std::getline(issStr, idStr, ',')) {
     391            7 :         if (!ParseDeviceId(idStr, curId)) {
     392            1 :             return true;
     393              :         }
     394            6 :         devIdVec_.push_back(curId);
     395              :     }
     396            2 :     return true;
     397            3 : }
     398              : 
     399           21 : std::string ArgsParser::GetParaParsedStr()
     400              : {
     401           21 :     std::ostringstream oss;
     402           21 :     oss << "deviceId=" << deviceId_ << ", hostPid=" << hostPid_ << ", pidSign=" << pidSign_ << ", vfId=" << vfId_
     403           21 :         << ", logLevel=" << logLevel_ << ", eventLevel_=" << eventLevel_ << ", aicpulogLevel=" << aicpulogLevel_
     404           21 :         << ", deployMode_=" << static_cast<uint32_t>(deployMode_) << ", reschedInterval_=" << reschedInterval_
     405           21 :         << ", groupName_=" << groupName_ << ", schedPolicy_=" << schedPolicy_
     406           21 :         << ", starter_=" << static_cast<uint32_t>(starter_) << ", profCfgData_=" << profCfgData_
     407           21 :         << ", profFlag_=" << profFlag_ << ", abnormalInterval_=" << abnormalInterval_
     408           21 :         << ", withDeviceId_=" << withDeviceId_ << ", withHostPid_=" << withHostPid_ << ", withPidSign_=" << withPidSign_
     409           21 :         << ", withVfId_=" << withVfId_ << ", withLogLevel_=" << withLogLevel_ << ", withGroupName_=" << withGroupName_
     410           21 :         << ", withStarter_=" << withStarter_;
     411              : 
     412           42 :     return oss.str();
     413           21 : }
     414              : } // namespace bqs
        

Generated by: LCOV version 2.0-1