Browse Source

Expose cluster status in /status JSON response.

Adam Ierymenko 9 years ago
parent
commit
debed1ac2d
3 changed files with 35 additions and 5 deletions
  1. 1 1
      include/ZeroTierOne.h
  2. 2 2
      node/Cluster.cpp
  3. 32 2
      service/ControlPlane.cpp

+ 1 - 1
include/ZeroTierOne.h

@@ -953,7 +953,7 @@ typedef struct {
 	/**
 	 * Cluster member statuses
 	 */
-	ZT_ClusterMemberStatus member[ZT_CLUSTER_MAX_MEMBERS];
+	ZT_ClusterMemberStatus members[ZT_CLUSTER_MAX_MEMBERS];
 } ZT_ClusterStatus;
 
 /**

+ 2 - 2
node/Cluster.cpp

@@ -647,7 +647,7 @@ void Cluster::status(ZT_ClusterStatus &status) const
 
 	status.myId = _id;
 
-	ms[_id] = &(status.member[status.clusterSize++]);
+	ms[_id] = &(status.members[status.clusterSize++]);
 	ms[_id]->id = _id;
 	ms[_id]->alive = 1;
 	ms[_id]->x = _x;
@@ -665,7 +665,7 @@ void Cluster::status(ZT_ClusterStatus &status) const
 		for(std::vector<uint16_t>::const_iterator mid(_memberIds.begin());mid!=_memberIds.end();++mid) {
 			if (status.clusterSize >= ZT_CLUSTER_MAX_MEMBERS) // sanity check
 				break;
-			ZT_ClusterMemberStatus *s = ms[*mid] = &(status.member[status.clusterSize++]);
+			ZT_ClusterMemberStatus *s = ms[*mid] = &(status.members[status.clusterSize++]);
 			_Member &m = _members[*mid];
 			Mutex::Lock ml(m.lock);
 

+ 32 - 2
service/ControlPlane.cpp

@@ -354,8 +354,36 @@ unsigned int ControlPlane::handleRequest(
 
 			if (ps[0] == "status") {
 				responseContentType = "application/json";
+
 				ZT_NodeStatus status;
 				_node->status(&status);
+
+				std::string clusterJson;
+#ifdef ZT_ENABLE_CLUSTER
+				{
+					ZT_ClusterStatus cs;
+					_node->clusterStatus(&cs);
+
+					char t[4096];
+					Utils::snprintf(t,sizeof(t),"{\n\t\t\"myId\": %u,\n\t\t\"clusterSize\": %u,\n\t\t\"members: [\n",cs.myId,cs.clusterSize);
+					clusterJson.append(t);
+					for(unsigned int i=0;i<cs.clusterSize;++i) {
+						Utils::snprintf(t,sizeof(t),"\t\t\t{\n\t\t\t\t\"id\": %u,\n\t\t\t\t\"msSinceLastHeartbeat\": %u,\n\t\t\t\t\"alive\": %s,\n\t\t\t\t\"x\": %d,\n\t\t\t\t\"y\": %d,\n\t\t\t\t\"z\": %d,\n\t\t\t\t\"load\": %llu\n\t\t\t\t\"peers\": %llu\n\t\t\t}%s",
+							cs.members[i].id,
+							cs.members[i].msSinceLastHeartbeat,
+							(cs.members[i].alive != 0) ? "true" : "false",
+							cs.members[i].x,
+							cs.members[i].y,
+							cs.members[i].z,
+							cs.members[i].load,
+							cs.members[i].peers,
+							(i == (cs.clusterSize - 1)) ? "," : "");
+						clusterJson.append(t);
+					}
+					clusterJson.append(" ]\n\t\t}");
+				}
+#endif
+
 				Utils::snprintf(json,sizeof(json),
 					"{\n"
 					"\t\"address\": \"%.10llx\",\n"
@@ -368,7 +396,8 @@ unsigned int ControlPlane::handleRequest(
 					"\t\"versionMinor\": %d,\n"
 					"\t\"versionRev\": %d,\n"
 					"\t\"version\": \"%d.%d.%d\",\n"
-					"\t\"clock\": %llu\n"
+					"\t\"clock\": %llu,\n"
+					"\t\"cluster\": %s\n"
 					"}\n",
 					status.address,
 					status.publicIdentity,
@@ -380,7 +409,8 @@ unsigned int ControlPlane::handleRequest(
 					ZEROTIER_ONE_VERSION_MINOR,
 					ZEROTIER_ONE_VERSION_REVISION,
 					ZEROTIER_ONE_VERSION_MAJOR,ZEROTIER_ONE_VERSION_MINOR,ZEROTIER_ONE_VERSION_REVISION,
-					(unsigned long long)OSUtils::now());
+					(unsigned long long)OSUtils::now(),
+					((clusterJson.length() > 0) ? clusterJson.c_str() : "null"));
 				responseBody = json;
 				scode = 200;
 			} else if (ps[0] == "config") {