提交 1951e662 authored 作者: blu's avatar blu

refactor of delta config

上级 6c24a369
......@@ -109,13 +109,16 @@ private:
json ret;
int iret;
json oldConfigMap = this->configMap;
json oldPeerData = this->peerData;
ret["code"] = 0;
ret["msg"] = "ok";
ret["time"] = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
spdlog::info("evcloudsvc POST config:{}",newConfig.dump());
spdlog::info("evcloudsvc config:{}",newConfig.dump());
string msg;
bool bInvalidCfg = false;
try {
json deltaCfg = json();
if(newConfig.count("data") == 0|| newConfig["dsata"].size() == 0) {
// json deltaCfg = json();
if(newConfig.count("data") == 0|| newConfig["data"].size() == 0) {
string msg = fmt::format("evcloudsvc invalid configuratin body received - empty or no data field: {}", newConfig.dump());
ret["code"] = 1;
ret["msg"] = msg;
......@@ -123,133 +126,134 @@ private:
}
else {
json &data = newConfig["data"];
// for clusters
// for edge clusters, those are mgrs
for(auto &[k, v]: data.items()) {
// TODO: confirm overwrite, take snapshot
if(this->configMap.count(k) != 0) {
spdlog::warn("evcloudsvc TODO: key {} already exist, take snapshot for safety", k);
}else{
spdlog::info("evcloudsvc new config for cluster {}", k);
if(this->configMap.count(k) != 0 && this->peerData["config"].count(k) != 0) {
spdlog::warn("evcloudsvc info: cluster config for {} exists, will do comparison", k);
}
if(this->configMap.count(k) ^ this->peerData["config"].count(k)) {
spdlog::error("evcloudsvc inconsistent configuration for cluster {}", k);
// TODO: handle this situation gracefully.
}
else {
if(this->configMap.count(k) == 0) {
// both not exist, fresh new
if(v.size() == 0) {
// ignore
continue;
}
else {
// construct sn2mods, mod2mgr
if(v.count("ipcs") == 0||v["ipcs"].size() == 0) {
spdlog::warn("evcloudsvc edge cluster {} has no ipcs");
}
else {
json &ipcs = v["ipcs"];
int ipcIdx = 0;
for(auto &ipc : ipcs) {
if(ipc.count("modules") == 0||ipc["modules"].size() == 0) {
spdlog::warn("evcloudsvc edge cluster {} has no modules for ipc {}", k, ipcIdx);
}
else {
json &modules = ipc["modules"];
for(auto &[mn, ma]: modules.items()) {
for(auto &m:ma) {
if(m.count("sn") != 0 && m["sn"].size() != 0) {
string modKey;
string sn = m["sn"];
//ml
if(mn == "evml" && m.count("type") != 0 && m["type"].size() != 0) {
modKey = sn +":evml:" + m["type"].get<string>();
}
else {
modKey = sn + ":" + mn;
}
// else {
// // calc diff
// modules
if(this->configMap["sn2mods"].count(sn) == 0) {
this->configMap["sn2mods"][sn] = json();
}
// check exist
bool hasModKey =false;
for(auto &modKey_:this->configMap["sn2mods"][sn]) {
if(modKey_ == modKey) {
hasModKey = true;
break;
}
}
if(hasModKey) {
//nop
}
else {
this->configMap["sn2mods"][sn].push_back(modKey);
}
// // find all modules
// if(v.count("ipcs") == 0||v["ipcs"].size() == 0) {
// spdlog::error("invalid ipcs in config body");
// ret["code"] = 3;
// break;
// }
// else {
// json &ipcs = v["ipcs"];
// for(auto &ipc : ipcs) {
// if(ipc.count("modules") == 0||ipc["modules"].size() == 0) {
// spdlog::error("invalid modules in ipcs config body");
// ret["code"] = 4;
// break;
// }
// else {
// json &modules = ipc["modules"];
// for(auto &[mn, ma]: modules.items()) {
// for(auto &m:ma) {
// if(m.count("sn") != 0 && m["sn"].size() != 0) {
// string modKey;
// string sn = m["sn"];
// //ml
// if(mn == "evml" && m.count("type") != 0 && m["type"].size() != 0) {
// modKey = sn +":evml:" + m["type"].get<string>();
// }
// else {
// modKey = sn + ":" + mn;
// }
// modkey -> sn_of_evmgr
this->configMap["mod2mgr"][modKey] = k;
}
else {
string msg = "evcloudsvc invalid config: " + data.dump();;
ret["code"] = -1;
ret["msg"] = msg;
spdlog::error(msg);
break;
}
}// for mod
} // for modules
}
ipcIdx++;
}// for ipc
}
// // modules
// if(this->configMap["sn2mods"].count(sn) == 0) {
// this->configMap["sn2mods"][sn] = json();
// }
// // check exist
// bool hasModKey =false;
// for(auto &modKey_:this->configMap["sn2mods"][sn]) {
// if(modKey_ == modKey) {
// hasModKey = true;
// break;
// }
// }
this->configMap[k] = k;
iret = LVDB::setLocalConfig(v, k);
if(iret < 0) {
string msg = "failed to save config " + k + " -> " + v.dump();
spdlog::error(msg);
ret["code"] = iret;
ret["msg"] = msg;
}
// if(hasModKey) {
// //nop
// }
// else {
// this->configMap["sn2mods"][sn].push_back(modKey);
// }
}
// // modkey -> sn_of_evmgr
// this->configMap["mod2mgr"][modKey] = k;
// }
// else {
// string msg = "evcloudsvc invalid config: " + data.dump();;
// ret["code"] = -1;
// ret["msg"] = msg;
// spdlog::error(msg);
// break;
// }
// }
// } // for modules
}
else {
// both exist
// calc diff
json diff = json::diff(this->peerData["config"][k], v);
// if(ret["code"] != 0) {
// break;
// }
// } // for ipc
// }
}
}
// // calc cluster cfg diff
// if((this->peerData["config"].count(k) == 0 || this->peerData["config"][k].size() == 0) && v.size() == 0) {
// spdlog::warn("evcloudsvc ignore empty cluster config for {}", k);
// continue;
// }
// if(ret["code"] != 0) {
// break;
// if(this->peerData["config"].count(k) != 0) {
// json diff = json::diff(this->peerData["config"][k], v);
// if(diff.size()!=0) {
// // send config
// deltaCfg[k] = 1;
// this->peerData["config"][k] = v;
// spdlog::info("evcloudsvc peer {} config diff:\n{}\norigin:\n{}", k, diff.dump(), this->peerData["config"][k].dump());
// }
// else {
// spdlog::info("evcloudsvc peer {} config no diff. ignored:\n{}", k, this->peerData["config"][k].dump());
// }
// // update evmgr config
// this->configMap[k] = k;
// //save
// iret = LVDB::setLocalConfig(v, k);
// if(iret < 0) {
// string msg = "failed to save config " + k + " -> " + v.dump();
// spdlog::error(msg);
// ret["code"] = iret;
// ret["msg"] = msg;
// }
// else {
// this->peerData["config"][k] = v;
// }
// // TODO: important! always send config in case edge config is corrupted.
// deltaCfg[k] = 1;
// calc cluster cfg diff
if((this->peerData["config"].count(k) == 0 || this->peerData["config"][k].size() == 0) && v.size() == 0){
spdlog::warn("evcloudsvc ignore empty cluster config for {}", k);
continue;
}
if(this->peerData["config"].count(k) != 0) {
json diff = json::diff(this->peerData["config"][k], v);
if(diff.size()!=0) {
// send config
deltaCfg[k] = 1;
this->peerData["config"][k] = v;
spdlog::info("evcloudsvc peer {} config diff:\n{}\norigin:\n{}", k, diff.dump(), this->peerData["config"][k].dump());
}
else {
spdlog::info("evcloudsvc peer {} config no diff. ignored:\n{}", k, this->peerData["config"][k].dump());
}
}
else {
this->peerData["config"][k] = v;
}
// TODO: important! always send config in case edge config is corrupted.
deltaCfg[k] = 1;
// TODO: trigger msg
} // for evmgr
} // for clusters
// save configmap
if(ret["code"] == 0) {
......@@ -284,7 +288,6 @@ private:
spdlog::error("evcloudsvc exception: {}", e.what());
}
return ret;
}
......@@ -561,7 +564,8 @@ public:
if(ret.count("data") == 0 || ret["data"].size() == 0) {
spdlog::error("evcloudsvc no existing valid configuration for {}. abort patching", _sn);
ret["msg"] = string("evcloudsvc no existing valid configuration,abort patching for ") + _sn;
}else{
}
else {
ret["data"] = ret["data"].patch(cfg);
spdlog::info("evcloudsvc merged {}: {} \n\t{}", _sn, cfg.dump(), ret["data"].dump());
ret = this->config(ret);
......
......@@ -11,12 +11,12 @@ configmap:
"NMXH73Y2:evslicer": "NMXH73Y2"
},
"sn2mods": {
"NMXH73Y2": [
"NMXH73Y2:evml:motion",
"NMXH73Y2:evpuller",
"NMXH73Y2:evpusher",
"NMXH73Y2:evslicer"
]
"NMXH73Y2": {
"NMXH73Y2:evml:motion": 1,
"NMXH73Y2:evpuller": 1,
"NMXH73Y2:evpusher": 1,
"NMXH73Y2:evslicer": 1
}
}
}
```
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论