提交 10e31318 authored 作者: blu's avatar blu

refactor of delta config

上级 e9b8d264
{ {
"data":{ "data":{
"PSBV7GKN":{ "W2E0VFN1":{
"addr":"127.0.0.1", "addr":"127.0.0.1",
"api-cloud":"http://127.0.0.1:8089", "api-cloud":"http://127.0.0.1:8089",
"ipcs":[ "ipcs":[
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
"iid":1, "iid":1,
"post":30, "post":30,
"pre":3, "pre":3,
"sn":"PSBV7GKN", "sn":"W2E0VFN1",
"thresh":30, "thresh":30,
"entropy": 0.3, "entropy": 0.3,
"type":"motion" "type":"motion"
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
"iid":1, "iid":1,
"enabled": 1, "enabled": 1,
"port-pub":5556, "port-pub":5556,
"sn":"PSBV7GKN" "sn":"W2E0VFN1"
} }
], ],
"evpusher":[ "evpusher":[
...@@ -34,9 +34,9 @@ ...@@ -34,9 +34,9 @@
"enabled":0, "enabled":0,
"iid":1, "iid":1,
"password":"", "password":"",
"sn":"PSBV7GKN", "sn":"W2E0VFN1",
"token":"", "token":"",
"urlDest":"rtsp://40.73.41.176/PSBV7GKN", "urlDest":"rtsp://40.73.41.176/W2E0VFN1",
"user":"" "user":""
} }
], ],
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
"enabled":1, "enabled":1,
"iid":1, "iid":1,
"path":"slices", "path":"slices",
"sn":"PSBV7GKN", "sn":"W2E0VFN1",
"video-server-addr": "http://40.73.41.176:10009/upload/evtvideos/" "video-server-addr": "http://40.73.41.176:10009/upload/evtvideos/"
} }
] ]
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
"port-cloud":5556, "port-cloud":5556,
"port-router":5550, "port-router":5550,
"proto":"zmq", "proto":"zmq",
"sn":"PSBV7GKN" "sn":"W2E0VFN1"
} }
}, },
"lastupdated":1567669674 "lastupdated":1567669674
......
...@@ -113,7 +113,7 @@ private: ...@@ -113,7 +113,7 @@ private:
string msg = "evcloudsvc may gracefully or strictly handled below issues for you. please correct them:\n"; string msg = "evcloudsvc may gracefully or strictly handled below issues for you. please correct them:\n";
bool hasError = false; bool hasError = false;
try{ try {
// construct sn2mods, mod2mgr // construct sn2mods, mod2mgr
if(v.count("ipcs") == 0||v["ipcs"].size() == 0 || v.count("sn") == 0 || v["sn"] != k) { if(v.count("ipcs") == 0||v["ipcs"].size() == 0 || v.count("sn") == 0 || v["sn"] != k) {
msg += fmt::format("\t\tedge cluster {} has no sn/ipcs: {}.", k, v.dump()); msg += fmt::format("\t\tedge cluster {} has no sn/ipcs: {}.", k, v.dump());
...@@ -187,7 +187,8 @@ private: ...@@ -187,7 +187,8 @@ private:
ipcIdx++; ipcIdx++;
}// for ipc }// for ipc
} }
}catch(exception &e) { }
catch(exception &e) {
msg = fmt::format("evcloudsvc applyClusterCfg exception: {}", e.what()); msg = fmt::format("evcloudsvc applyClusterCfg exception: {}", e.what());
ret["msg"] = msg; ret["msg"] = msg;
spdlog::error(msg); spdlog::error(msg);
...@@ -234,54 +235,54 @@ private: ...@@ -234,54 +235,54 @@ private:
this->configMap.erase(k); this->configMap.erase(k);
this->peerData["config"].erase(k); this->peerData["config"].erase(k);
} }
if(v.size() == 0) {
// ignore
continue;
}
if(this->configMap.count(k) == 0) {
// both not exist, fresh new
this->configMap[k] = k;
this->peerData["config"][k] = json();
}
// both exist, calc diff
json srcJson, targetJson;
srcJson[k] = this->peerData["config"][k];
targetJson[k] = v;
json diff = json::diff(srcJson, targetJson);
if(diff.size() == 0) {
spdlog::info("evcloudsvc no diffrence for cluster {}, ignore it.", k);
}
else {
auto gids = cfgutils::getModulesOperFromConfDiff(srcJson, targetJson, diff, "");
spdlog::info("dump gids: {}", gids.dump());
if(gids["code"] != 0) {
hasError = true;
msg = gids["msg"];
break;
}
if(gids["msg"] != "ok") {
ret["msg"] = gids["msg"];
}
for(auto &[a,b]: gids["data"].items()) { if(v.size() == 0) {
string devSn = strutils::split(a, ':')[0]; // ignore
deltaCfg[devSn] = 1; continue;
} }
} if(this->configMap.count(k) == 0) {
// both not exist, fresh new
this->configMap[k] = k;
this->peerData["config"][k] = json();
}
auto r = applyClusterCfg(k,v); // both exist, calc diff
if(r["code"] != 0) { json srcJson, targetJson;
srcJson[k] = this->peerData["config"][k];
targetJson[k] = v;
json diff = json::diff(srcJson, targetJson);
if(diff.size() == 0) {
spdlog::info("evcloudsvc no diffrence for cluster {}, ignore it.", k);
}
else {
auto gids = cfgutils::getModulesOperFromConfDiff(srcJson, targetJson, diff, "");
spdlog::info("dump gids: {}", gids.dump());
if(gids["code"] != 0) {
hasError = true; hasError = true;
msg = r["msg"]; msg = gids["msg"];
break; break;
} }
if(gids["msg"] != "ok") {
ret["msg"] = gids["msg"];
}
if(r["msg"] != "ok") { for(auto &[a,b]: gids["data"].items()) {
ret["msg"] = r["msg"]; string devSn = strutils::split(a, ':')[0];
deltaCfg[devSn] = 1;
} }
}
auto r = applyClusterCfg(k,v);
if(r["code"] != 0) {
hasError = true;
msg = r["msg"];
break;
}
if(r["msg"] != "ok") {
ret["msg"] = r["msg"];
}
// update configmap for cluster config // update configmap for cluster config
this->configMap[k] = k; this->configMap[k] = k;
...@@ -611,12 +612,13 @@ public: ...@@ -611,12 +612,13 @@ public:
ret["msg"] = string("evcloudsvc no existing valid configuration,abort patching for ") + _sn; ret["msg"] = string("evcloudsvc no existing valid configuration,abort patching for ") + _sn;
} }
else { else {
try{ try {
json patched = ret["data"].patch(cfg); json patched = ret["data"].patch(cfg);
ret["data"] = patched; ret["data"] = patched;
spdlog::info("evcloudsvc merged {}: {} \n\t{}", _sn, cfg.dump(), patched["data"].dump()); spdlog::info("evcloudsvc merged {}: {} \n\t{}", _sn, cfg.dump(), patched["data"].dump());
ret = this->config(ret); ret = this->config(ret);
}catch(exception &e){ }
catch(exception &e) {
string msg = fmt::format("evclousvc exception when patching {} with {}: {}", ret["data"].dump(), cfg.dump(), e.what()); string msg = fmt::format("evclousvc exception when patching {} with {}: {}", ret["data"].dump(), cfg.dump(), e.what());
spdlog::error(msg); spdlog::error(msg);
ret["code"] = 3; ret["code"] = 3;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论