提交 6c24a369 authored 作者: blu's avatar blu

refactor of delta config

上级 56bc22d2
...@@ -124,108 +124,111 @@ private: ...@@ -124,108 +124,111 @@ private:
else { else {
json &data = newConfig["data"]; json &data = newConfig["data"];
// for clusters
for(auto &[k, v]: data.items()) { for(auto &[k, v]: data.items()) {
// TODO: confirm overwrite, take snapshot // TODO: confirm overwrite, take snapshot
if(this->configMap.count(k) != 0) { if(this->configMap.count(k) != 0) {
spdlog::warn("evcloudsvc TODO: key {} already exist, take snapshot for safety", k); spdlog::warn("evcloudsvc TODO: key {} already exist, take snapshot for safety", k);
}else{
spdlog::info("evcloudsvc new config for cluster {}", k);
} }
// this is one evmgr // else {
if(v.count("sn") == 0||v["sn"] != k) { // // calc diff
ret["code"] = 2;
string msg = fmt::format("evcloudsvc invalid value for cluster mgr with sn {} but key: {}", k, string(v["sn"]));
ret["msg"] = msg; // // find all modules
spdlog::error(msg); // if(v.count("ipcs") == 0||v["ipcs"].size() == 0) {
break; // spdlog::error("invalid ipcs in config body");
} // ret["code"] = 3;
else { // break;
// find all modules // }
if(v.count("ipcs") == 0||v["ipcs"].size() == 0) { // else {
spdlog::error("invalid ipcs in config body"); // json &ipcs = v["ipcs"];
ret["code"] = 3; // for(auto &ipc : ipcs) {
break; // if(ipc.count("modules") == 0||ipc["modules"].size() == 0) {
} // spdlog::error("invalid modules in ipcs config body");
else { // ret["code"] = 4;
json &ipcs = v["ipcs"]; // break;
for(auto &ipc : ipcs) { // }
if(ipc.count("modules") == 0||ipc["modules"].size() == 0) { // else {
spdlog::error("invalid modules in ipcs config body"); // json &modules = ipc["modules"];
ret["code"] = 4;
break; // for(auto &[mn, ma]: modules.items()) {
} // for(auto &m:ma) {
else { // if(m.count("sn") != 0 && m["sn"].size() != 0) {
json &modules = ipc["modules"]; // string modKey;
// string sn = m["sn"];
for(auto &[mn, ma]: modules.items()) { // //ml
for(auto &m:ma) { // if(mn == "evml" && m.count("type") != 0 && m["type"].size() != 0) {
if(m.count("sn") != 0 && m["sn"].size() != 0) { // modKey = sn +":evml:" + m["type"].get<string>();
string modKey; // }
string sn = m["sn"]; // else {
//ml // modKey = sn + ":" + mn;
if(mn == "evml" && m.count("type") != 0 && m["type"].size() != 0) { // }
modKey = sn +":evml:" + m["type"].get<string>();
} // // modules
else { // if(this->configMap["sn2mods"].count(sn) == 0) {
modKey = sn + ":" + mn; // this->configMap["sn2mods"][sn] = json();
} // }
// // check exist
// modules // bool hasModKey =false;
if(this->configMap["sn2mods"].count(sn) == 0) { // for(auto &modKey_:this->configMap["sn2mods"][sn]) {
this->configMap["sn2mods"][sn] = json(); // if(modKey_ == modKey) {
} // hasModKey = true;
// check exist // break;
bool hasModKey =false; // }
for(auto &modKey_:this->configMap["sn2mods"][sn]) { // }
if(modKey_ == modKey) {
hasModKey = true; // if(hasModKey) {
break; // //nop
} // }
} // else {
// this->configMap["sn2mods"][sn].push_back(modKey);
if(hasModKey) { // }
//nop
} // // modkey -> sn_of_evmgr
else { // this->configMap["mod2mgr"][modKey] = k;
this->configMap["sn2mods"][sn].push_back(modKey); // }
} // else {
// string msg = "evcloudsvc invalid config: " + data.dump();;
// modkey -> sn_of_evmgr // ret["code"] = -1;
this->configMap["mod2mgr"][modKey] = k; // ret["msg"] = msg;
} // spdlog::error(msg);
else { // break;
string msg = "evcloudsvc invalid config: " + data.dump();; // }
ret["code"] = -1; // }
ret["msg"] = msg; // } // for modules
spdlog::error(msg);
break; // if(ret["code"] != 0) {
} // break;
} // }
} // for modules // } // for ipc
// }
if(ret["code"] != 0) { // }
break;
} // if(ret["code"] != 0) {
} // for ipc // break;
} // }
} // }
// // update evmgr config
if(ret["code"] != 0) { // this->configMap[k] = k;
break;
} // //save
} // iret = LVDB::setLocalConfig(v, k);
// update evmgr config // if(iret < 0) {
this->configMap[k] = k; // string msg = "failed to save config " + k + " -> " + v.dump();
// spdlog::error(msg);
//save // ret["code"] = iret;
iret = LVDB::setLocalConfig(v, k); // ret["msg"] = msg;
if(iret < 0) { // }
string msg = "failed to save config " + k + " -> " + v.dump();
spdlog::error(msg); // calc cluster cfg diff
ret["code"] = iret; if((this->peerData["config"].count(k) == 0 || this->peerData["config"][k].size() == 0) && v.size() == 0){
ret["msg"] = msg; spdlog::warn("evcloudsvc ignore empty cluster config for {}", k);
continue;
} }
// update in memory peerData
if(this->peerData["config"].count(k) != 0) { if(this->peerData["config"].count(k) != 0) {
json diff = json::diff(this->peerData["config"][k], v); json diff = json::diff(this->peerData["config"][k], v);
...@@ -417,6 +420,7 @@ private: ...@@ -417,6 +420,7 @@ private:
return ret; return ret;
} }
/// refer to evcloudsvc.yaml
json getConfigForDevice(string sn) json getConfigForDevice(string sn)
{ {
json ret; json ret;
......
configmap:
- example: |-
```
{
"NMXH73Y2": "NMXH73Y2",
"code": 0,
"mod2mgr": {
"NMXH73Y2:evml:motion": "NMXH73Y2",
"NMXH73Y2:evpuller": "NMXH73Y2",
"NMXH73Y2:evpusher": "NMXH73Y2",
"NMXH73Y2:evslicer": "NMXH73Y2"
},
"sn2mods": {
"NMXH73Y2": [
"NMXH73Y2:evml:motion",
"NMXH73Y2:evpuller",
"NMXH73Y2:evpusher",
"NMXH73Y2:evslicer"
]
}
}
```
structure:
- mgrSn:
- description:
key: mgrSn
value: mgrSn
- sn2mods:
- description: device with sn that runs mods.
key: sn
value:
- key: sn:modName
value: 1
- mod2mgr:
- description: mod connects to mgr
key: modid
value: mgrSn
api:
- get:
- description: get all cluster configurations that has mod runs on this dev
steps:
- 1: get all models runs on sn
2: for each mod, get mgrSn into set S
3: merge cluster configs of S to data
4: return data for sn
add/update:
- description: add, patch
steps:
- 1: for each cluster config of sn in data
- 2: get diff, update sn2mods & md2mgr, mgrSn and send actions to edge
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论