summaryrefslogtreecommitdiff
path: root/netconf/RedisNetworkConfigMaster.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-02-24 16:15:01 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-02-24 16:15:01 -0800
commitecffa9f5e719ee3e236b84645c4c6992693bf30a (patch)
treeb041e74ac63b5f5b8e41fcce7b3cb3a4b05fa4ee /netconf/RedisNetworkConfigMaster.cpp
parentb6fba5934a07b719d1b2fb97f1a06c336072ee9d (diff)
downloadinfinitytier-ecffa9f5e719ee3e236b84645c4c6992693bf30a.tar.gz
infinitytier-ecffa9f5e719ee3e236b84645c4c6992693bf30a.zip
Redis network config master work, and the beginnings of some actual unit test code.
Diffstat (limited to 'netconf/RedisNetworkConfigMaster.cpp')
-rw-r--r--netconf/RedisNetworkConfigMaster.cpp37
1 files changed, 31 insertions, 6 deletions
diff --git a/netconf/RedisNetworkConfigMaster.cpp b/netconf/RedisNetworkConfigMaster.cpp
index f7be2698..f6d310dd 100644
--- a/netconf/RedisNetworkConfigMaster.cpp
+++ b/netconf/RedisNetworkConfigMaster.cpp
@@ -87,7 +87,7 @@ NetworkConfigMaster::ResultCode RedisNetworkConfigMaster::doNetworkConfigRequest
// Check to make sure network itself exists and is valid
if (!_hget(nwKey,"id",tmps2)) {
- netconf["error"] = "Redis error retrieving network record";
+ netconf["error"] = "Redis error retrieving network record ID field";
return NetworkConfigMaster::NETCONF_QUERY_INTERNAL_SERVER_ERROR;
}
if (tmps2 != nwids)
@@ -317,6 +317,30 @@ bool RedisNetworkConfigMaster::_get(const char *key,std::string &value)
return true;
}
+bool RedisNetworkConfigMaster::_sadd(const char *key,const char *value)
+{
+ if (!_rc) {
+ if (!_reconnect())
+ return false;
+ }
+
+ redisReply *reply = (redisReply *)redisCommand(_rc,"SADD %s %s",key,value);
+ if (!reply) {
+ if (_reconnect())
+ return _sadd(key,value);
+ return false;
+ }
+
+ if (reply->type == REDIS_REPLY_ERROR) {
+ freeReplyObject(reply);
+ return false;
+ }
+
+ freeReplyObject(reply);
+
+ return true;
+}
+
bool RedisNetworkConfigMaster::_smembers(const char *key,std::vector<std::string> &sdata)
{
if (!_rc) {
@@ -344,13 +368,14 @@ bool RedisNetworkConfigMaster::_smembers(const char *key,std::vector<std::string
bool RedisNetworkConfigMaster::_initNewMember(uint64_t nwid,const Identity &member,const Dictionary &metaData,Dictionary &memberRecord)
{
- char memberKey[256],nwids[24],addrs[16],nwKey[256];
+ char memberKey[128],nwids[24],addrs[16],nwKey[128],membersKey[128];
Dictionary networkRecord;
Utils::snprintf(nwids,sizeof(nwids),"%.16llx",(unsigned long long)nwid);
Utils::snprintf(addrs,sizeof(addrs),"%.10llx",(unsigned long long)member.address().toInt());
Utils::snprintf(memberKey,sizeof(memberKey),"zt1:network:%s:member:%s:~",nwids,addrs);
Utils::snprintf(nwKey,sizeof(nwKey),"zt1:network:%s:~",nwids);
+ Utils::snprintf(membersKey,sizeof(membersKey),"zt1:network:%s:members",nwids);
if (!_hgetall(nwKey,networkRecord)) {
//LOG("netconf: Redis error retrieving %s",nwKey);
@@ -364,14 +389,14 @@ bool RedisNetworkConfigMaster::_initNewMember(uint64_t nwid,const Identity &memb
memberRecord.clear();
memberRecord["id"] = addrs;
memberRecord["nwid"] = nwids;
- memberRecord["authorized"] = (networkRecord.getBoolean("private",true) ? "0" : "1"); // auto-authorize on public networks
+ memberRecord["authorized"] = ((networkRecord.get("private","1") == "0") ? "1" : "0"); // auto-authorize on public networks
memberRecord.set("firstSeen",Utils::now());
memberRecord["identity"] = member.toString(false);
- if (!_hmset(memberKey,memberRecord)) {
- //LOG("netconf: Redis error storing %s for new member %s",memberKey,addrs);
+ if (!_hmset(memberKey,memberRecord))
+ return false;
+ if (!_sadd(membersKey,addrs))
return false;
- }
return true;
}