LCOV - code coverage report
Current view: top level - server - qs_args_parser.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.6 % 242 241
Test Date: 2026-07-28 10:54:05 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)",
     105              :                           para.c_str(), 0, QS_FW_CHIP_NUM_MAX);
     106            4 :             return false;
     107              :         }
     108              : 
     109           34 :         deviceId_ = static_cast<uint32_t>(val);
     110           34 :         withDeviceId_ = true;
     111           34 :         return true;
     112              :     }
     113              : 
     114           22 :     bool ArgsParser::ParseDeviceId(const std::string &para, int32_t &deviceId) const
     115              :     {
     116           22 :         int32_t val = 0;
     117           22 :         if (!TransStrToInt(para, val)) {
     118            1 :             BQS_LOG_WARN("Parse deviceId failed, param is %s", para.c_str());
     119            1 :             return false;
     120              :         }
     121              : 
     122           21 :         if ((val < 0) || (val >= QS_FW_CHIP_NUM_MAX)) {
     123            2 :             BQS_LOG_WARN("DeviceId param[%s] invalided, value is not in [%d, %d)",
     124              :                          para.c_str(), 0, QS_FW_CHIP_NUM_MAX);
     125            2 :             return false;
     126              :         }
     127              : 
     128           19 :         deviceId = static_cast<uint32_t>(val);
     129           19 :         return true;
     130              :     }
     131              : 
     132           34 :     bool ArgsParser::ParseHostPid(const std::string &para)
     133              :     {
     134           34 :         int32_t val = 0;
     135           34 :         if (!TransStrToInt(para, val)) {
     136            2 :             BQS_LOG_ERROR("Parse pid failed, param is %s", para.c_str());
     137            2 :             return false;
     138              :         }
     139              : 
     140           32 :         if (val <= 0) {
     141            2 :             BQS_LOG_ERROR("Pid param[%s] value invalided", para.c_str());
     142            2 :             return false;
     143              :         }
     144              : 
     145           30 :         hostPid_ = static_cast<uint32_t>(val);
     146           30 :         withHostPid_ = true;
     147           30 :         return true;
     148              :     }
     149              : 
     150           30 :     bool ArgsParser::ParsePidSign(const std::string &para)
     151              :     {
     152           30 :         pidSign_ = para;
     153           30 :         withPidSign_ = true;
     154           30 :         return true;
     155              :     }
     156              : 
     157           26 :     bool ArgsParser::ParseVfId(const std::string &para)
     158              :     {
     159           26 :         int32_t val = 0;
     160           26 :         if (!TransStrToInt(para, val)) {
     161            2 :             BQS_LOG_ERROR("Parse vfId failed, param is %s", para.c_str());
     162            2 :             return false;
     163              :         }
     164              : 
     165           24 :         if ((val < 0) || (val > VF_ID_MAX)) {
     166            2 :             BQS_LOG_ERROR("VfId param[%s] invalided, value is not in [%u, %u]",
     167              :                           para.c_str(), 0, VF_ID_MAX);
     168            2 :             return false;
     169              :         }
     170              : 
     171           22 :         vfId_ = static_cast<uint32_t>(val);
     172           22 :         withVfId_ = true;
     173           22 :         return true;
     174              :     }
     175              : 
     176           27 :     void ArgsParser::SetLogLevel(const int32_t logLevel, const int32_t eventLevel) const
     177              :     {
     178           27 :         if (bqs::FeatureCtrl::IsHostQs()) {
     179            1 :             bqs::HostQsLog::GetInstance().DlogSetLevel(logLevel, eventLevel);
     180            1 :             LogAttr dlogAttrInfo = {};
     181            1 :             dlogAttrInfo.type = APPLICATION;
     182            1 :             dlogAttrInfo.pid = hostPid_;
     183            1 :             dlogAttrInfo.deviceId = deviceId_;
     184            1 :             dlogAttrInfo.mode = 0;
     185            1 :             bqs::HostQsLog::GetInstance().DlogSetAttr(dlogAttrInfo);
     186              :         } else {
     187           26 :             if (&dlog_setlevel != nullptr) {
     188           26 :                 if (dlog_setlevel(-1, logLevel, eventLevel) != SUCCESS_VALUE) {
     189           24 :                     BQS_LOG_WARN("Set log level failed");
     190              :                 }
     191              :             }
     192           26 :             if (&DlogSetAttr != nullptr) {
     193           26 :                 LogAttr dlogAttrInfo = {};
     194           26 :                 dlogAttrInfo.type = APPLICATION;
     195           26 :                 dlogAttrInfo.pid = hostPid_;
     196           26 :                 dlogAttrInfo.deviceId = deviceId_;
     197           26 :                 dlogAttrInfo.mode = 0;
     198           26 :                 if (DlogSetAttr(dlogAttrInfo) != SUCCESS_VALUE) {
     199            2 :                     BQS_LOG_WARN("Set log attr failed");
     200              :                 }
     201              :             }
     202              :         }
     203           27 :     }
     204              : 
     205            1 :     void ArgsParser::SetAicpuLogLevel() const
     206              :     {
     207            1 :         if ((aicpulogLevel_ >= DEBUG_LOG) && (aicpulogLevel_ <= ERROR_LOG)) {
     208            1 :             if (bqs::FeatureCtrl::IsHostQs()) {
     209            0 :                 bqs::HostQsLog::GetInstance().DlogSetLevel(aicpulogLevel_, eventLevel_);
     210              :             } else {
     211            1 :                 if (&dlog_setlevel != nullptr) {
     212            1 :                     if (dlog_setlevel(AICPU, aicpulogLevel_, eventLevel_) != SUCCESS_VALUE) {
     213            1 :                         BQS_LOG_WARN("Set aicpu log level failed");
     214              :                     }
     215              :                 }
     216              :             }
     217              :         }
     218            1 :     }
     219              : 
     220            8 :     bool ArgsParser::ParseLogAndEventLevel(const std::string &para)
     221              :     {
     222            8 :         int32_t val = 0;
     223            8 :         if (!TransStrToInt(para, val)) {
     224            1 :             return false;
     225              :         }
     226              : 
     227            7 :         if (val < 0) {
     228            1 :             return false;
     229              :         }
     230              : 
     231            6 :         logLevel_ = val % VALUE_FOR_CALCULATE_LOG_LEVEL;
     232            6 :         eventLevel_ = val / VALUE_FOR_CALCULATE_LOG_LEVEL;
     233            6 :         withLogLevel_ = true;
     234            6 :         SetLogLevel(logLevel_, eventLevel_);
     235            6 :         return true;
     236              :     }
     237              : 
     238            2 :     bool ArgsParser::ParseAicpuLogLevel(const std::string &para)
     239              :     {
     240            2 :         int32_t val = 0;
     241            2 :         if (!TransStrToInt(para, val)) {
     242            1 :             return true;
     243              :         }
     244              : 
     245            1 :         aicpulogLevel_ = val;
     246            1 :         withLogLevel_ = true;
     247            1 :         SetAicpuLogLevel();
     248            1 :         return true;
     249              :     }
     250              : 
     251           28 :     bool ArgsParser::ParseDeployMode(const std::string &para)
     252              :     {
     253           28 :         int32_t val = 0;
     254           28 :         if (!TransStrToInt(para, val)) {
     255            2 :             BQS_LOG_ERROR("Parse deploy mode failed, param is %s", para.c_str());
     256            2 :             return false;
     257              :         }
     258              : 
     259           26 :         if ((val < static_cast<int32_t>(bqs::QueueSchedulerRunMode::SINGLE_PROCESS)) ||
     260           25 :             (val > static_cast<int32_t>(bqs::QueueSchedulerRunMode::MULTI_THREAD))) {
     261            1 :             BQS_LOG_ERROR("deploy mode param[%s] invalided, value is not in [%u, %u]", para.c_str(),
     262              :                           static_cast<uint32_t>(QueueSchedulerRunMode::SINGLE_PROCESS),
     263              :                           static_cast<uint32_t>(QueueSchedulerRunMode::MULTI_THREAD));
     264            1 :              return false;
     265              :         }
     266              : 
     267           25 :         deployMode_ = static_cast<QueueSchedulerRunMode>(val);
     268           25 :         return true;
     269              :     }
     270              : 
     271              :     // ignore error
     272           29 :     bool ArgsParser::ParseReschedInterval(const std::string &para)
     273              :     {
     274           29 :         int32_t val = 0;
     275           29 :         if (!TransStrToInt(para, val)) {
     276            1 :             BQS_LOG_WARN("Parse resched interval not success, using default value %d ms", reschedInterval_);
     277            1 :             return true;
     278              :         }
     279              : 
     280           28 :         if ((val < RESCHED_INTERVAL_CLOSE) || (val > RESCHED_INTERVAL_MAX)) {
     281            1 :             BQS_LOG_WARN("resched interval param[%s] invalided, value is not in [%d, %d], using default value[%d] ms",
     282              :                          para.c_str(), RESCHED_INTERVAL_CLOSE, RESCHED_INTERVAL_MAX, reschedInterval_);
     283            1 :             return true;
     284              :         }
     285              : 
     286           27 :         reschedInterval_ = val;
     287           27 :         return true;
     288              :     }
     289              : 
     290              : 
     291           25 :     bool ArgsParser::ParseGroupName(const std::string &para)
     292              :     {
     293           25 :         groupName_ = para;
     294           25 :         withGroupName_ = true;
     295           25 :         return true;
     296              :     }
     297              : 
     298            2 :     bool ArgsParser::ParseSchedPolicy(const std::string &para)
     299              :     {
     300            2 :         uint64_t val = 0;
     301            2 :         if (!TransStrToull(para, val)) {
     302            1 :             BQS_LOG_ERROR("Parse SchedPolicy failed, param is %s", para.c_str());
     303            1 :             return false;
     304              :         }
     305              : 
     306            1 :         BQS_LOG_INFO("SchedPolicy is [0x%lx].", val);
     307            1 :         schedPolicy_ = val;
     308            1 :         return true;
     309              :     }
     310              : 
     311              :     // ignore error
     312            5 :     bool ArgsParser::ParseStarter(const std::string &para)
     313              :     {
     314            5 :         int32_t val = 0;
     315            5 :         if (!TransStrToInt(para, val)) {
     316            1 :             BQS_LOG_WARN("Parse starter failed, param is %s", para.c_str());
     317            1 :             return true;
     318              :         }
     319              : 
     320            4 :         starter_ = static_cast<bqs::QsStartType>(val);
     321            4 :         withStarter_ = true;
     322            4 :         return true;
     323              :     }
     324              : 
     325            1 :     bool ArgsParser::ParseProfCfgData(const std::string &para)
     326              :     {
     327            1 :         profCfgData_ = para;
     328            1 :         return true;
     329              :     }
     330              : 
     331              :     // ignore error
     332            3 :     bool ArgsParser::ParseProfFlag(const std::string &para)
     333              :     {
     334            3 :         int32_t val = 0;
     335            3 :         if (!TransStrToInt(para, val)) {
     336            1 :             BQS_LOG_WARN("Parse prof flag failed, param is %s", para.c_str());
     337            1 :             return true;
     338              :         }
     339              : 
     340            2 :         profFlag_ = (val != 0);
     341            2 :         return true;
     342              :     }
     343              : 
     344              :     // ignore error
     345            5 :     bool ArgsParser::ParseAbnormalInterval(const std::string &para)
     346              :     {
     347            5 :         int32_t val = 0;
     348            5 :         if (!TransStrToInt(para, val)) {
     349            1 :             BQS_LOG_INFO("Parse abnormal interval not success, using default value %d", abnormalInterval_);
     350            1 :             return true;
     351              :         }
     352              : 
     353            4 :         if ((val <= ABNORMAL_INTERVAL_MIN) || (val > ABNORMAL_INTERVAL_MAX)) {
     354            1 :             BQS_LOG_WARN("abnormal interval param[%s] invalided, value is not in [%d, %d], using default value[%d]",
     355              :                          para.c_str(), ABNORMAL_INTERVAL_MIN, ABNORMAL_INTERVAL_MAX, abnormalInterval_);
     356            1 :             return true;
     357              :         }
     358              : 
     359            3 :         abnormalInterval_ = val;
     360            3 :         return true;
     361              :     }
     362              : 
     363              :     // ignore error
     364            9 :     bool ArgsParser::ParseResourceList(const std::string &para)
     365              :     {
     366            9 :         size_t pos = para.find(",");
     367            9 :         if (pos == std::string::npos) {
     368            1 :             return true;
     369              :         }
     370            8 :         std::string deviceStr0 = para.substr(0, pos);
     371            8 :         std::string deviceStr1 = para.substr(pos + 1, para.length());
     372            8 :         int32_t curId = 0;
     373            8 :         if (!ParseDeviceId(deviceStr0, curId)) {
     374            1 :             return true;
     375              :         }
     376            7 :         resVec_.push_back(curId);
     377              :             
     378            7 :         if (!ParseDeviceId(deviceStr1, curId)) {
     379            1 :             return true;
     380              :         }
     381            6 :         resVec_.push_back(curId);
     382            6 :         return true;
     383            8 :     }
     384              : 
     385              :     // ignore error
     386            3 :     bool ArgsParser::ParseDeviceIdsList(const std::string &para)
     387              :     {
     388            3 :         std::istringstream issStr(para);
     389            3 :         std::string idStr;
     390            3 :         int32_t curId = 0;
     391            9 :         while (std::getline(issStr, idStr, ',')) {
     392            7 :             if (!ParseDeviceId(idStr, curId)) {
     393            1 :                 return true;
     394              :             }
     395            6 :             devIdVec_.push_back(curId);
     396              :         }
     397            2 :         return true;
     398            3 :     }
     399              : 
     400           21 :     std::string ArgsParser::GetParaParsedStr()
     401              :     {
     402           21 :         std::ostringstream oss;
     403           21 :         oss << "deviceId=" <<  deviceId_ << ", hostPid=" << hostPid_ << ", pidSign=" << pidSign_
     404           21 :             << ", vfId=" << vfId_ << ", logLevel=" << logLevel_ << ", eventLevel_=" << eventLevel_
     405           21 :             << ", aicpulogLevel=" << aicpulogLevel_ << ", deployMode_=" << static_cast<uint32_t>(deployMode_)
     406           21 :             << ", reschedInterval_=" << reschedInterval_ << ", groupName_=" << groupName_
     407           21 :             << ", schedPolicy_=" << schedPolicy_ << ", starter_=" << static_cast<uint32_t>(starter_)
     408           21 :             << ", profCfgData_=" << profCfgData_ << ", profFlag_=" << profFlag_
     409           21 :             << ", abnormalInterval_=" << abnormalInterval_ << ", withDeviceId_=" << withDeviceId_
     410           21 :             << ", withHostPid_=" << withHostPid_ << ", withPidSign_=" << withPidSign_
     411           21 :             << ", withVfId_=" << withVfId_ << ", withLogLevel_=" << withLogLevel_
     412           21 :             << ", withGroupName_=" << withGroupName_ << ", withStarter_=" << withStarter_;
     413              : 
     414           42 :         return oss.str();
     415           21 :     }
     416              : }
        

Generated by: LCOV version 2.0-1