diff options
Diffstat (limited to 'controller')
| -rw-r--r-- | controller/SqliteNetworkController.cpp | 17 | ||||
| -rw-r--r-- | controller/SqliteNetworkController.hpp | 1 | ||||
| -rwxr-xr-x | controller/controller-api-test.sh | 42 | 
3 files changed, 58 insertions, 2 deletions
| diff --git a/controller/SqliteNetworkController.cpp b/controller/SqliteNetworkController.cpp index a2bc5fc3..b9aebbb8 100644 --- a/controller/SqliteNetworkController.cpp +++ b/controller/SqliteNetworkController.cpp @@ -178,6 +178,7 @@ SqliteNetworkController::SqliteNetworkController(const char *dbPath) :  			||(sqlite3_prepare_v2(_db,"INSERT INTO Network (networkId,name,creationTime,revision) VALUES (?,?,?,1)",-1,&_sCreateNetwork,(const char **)0) != SQLITE_OK)  			||(sqlite3_prepare_v2(_db,"UPDATE Network SET ? = ? WHERE networkId = ?",-1,&_sUpdateNetworkField,(const char **)0) != SQLITE_OK)  			||(sqlite3_prepare_v2(_db,"SELECT revision FROM Network WHERE id = ?",-1,&_sGetNetworkRevision,(const char **)0) != SQLITE_OK) +			||(sqlite3_prepare_v2(_db,"UPDATE Network SET revision = ? WHERE id = ?",-1,&_sSetNetworkRevision,(const char **)0) != SQLITE_OK)  			||(sqlite3_prepare_v2(_db,"SELECT ip,ipNetmaskBits,ipVersion FROM IpAssignment WHERE networkId = ? AND nodeId = ?",-1,&_sGetIpAssignmentsForNode2,(const char **)0) != SQLITE_OK)  			||(sqlite3_prepare_v2(_db,"DELETE FROM Relay WHERE networkId = ?",-1,&_sDeleteRelaysForNetwork,(const char **)0) != SQLITE_OK)  			||(sqlite3_prepare_v2(_db,"INSERT INTO Relay (networkId,nodeId,phyAddress) VALUES (?,?,?)",-1,&_sCreateRelay,(const char **)0) != SQLITE_OK) @@ -220,6 +221,7 @@ SqliteNetworkController::~SqliteNetworkController()  		sqlite3_finalize(_sCreateNetwork);  		sqlite3_finalize(_sUpdateNetworkField);  		sqlite3_finalize(_sGetNetworkRevision); +		sqlite3_finalize(_sSetNetworkRevision);  		sqlite3_finalize(_sGetIpAssignmentsForNode2);  		sqlite3_finalize(_sDeleteRelaysForNetwork);  		sqlite3_finalize(_sCreateRelay); @@ -841,11 +843,17 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(  			int64_t revision = 0;  			sqlite3_reset(_sGetNetworkRevision);  			sqlite3_bind_text(_sGetNetworkRevision,1,nwids,16,SQLITE_STATIC); -			if (sqlite3_step(_sGetNetworkRevision) == SQLITE_ROW) +			bool networkExists = false; +			if (sqlite3_step(_sGetNetworkRevision) == SQLITE_ROW) { +				networkExists = true;  				revision = sqlite3_column_int64(_sGetNetworkRevision,0); +			}  			if (path.size() >= 3) { +				if (!networkExists) +					return 404; +  				if ((path.size() == 4)&&(path[2] == "member")&&(path[3].length() == 10)) {  					uint64_t address = Utils::hexStrToU64(path[3].c_str());  					char addrs[24]; @@ -856,7 +864,7 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(  			} else { -				if (revision <= 0) { +				if (!networkExists) {  					sqlite3_reset(_sCreateNetwork);  					sqlite3_bind_text(_sCreateNetwork,1,nwids,16,SQLITE_STATIC);  					sqlite3_bind_text(_sCreateNetwork,2,nwids,16,SQLITE_STATIC); // default name, will be changed below if a name is specified in JSON @@ -1081,6 +1089,11 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(  					json_value_free(j);  				} +				sqlite3_reset(_sSetNetworkRevision); +				sqlite3_bind_int64(_sSetNetworkRevision,1,revision += 1); +				sqlite3_bind_text(_sSetNetworkRevision,2,nwids,16,SQLITE_STATIC); +				sqlite3_step(_sSetNetworkRevision); +  				return handleControlPlaneHttpGET(path,urlArgs,headers,body,responseBody,responseContentType);  			} diff --git a/controller/SqliteNetworkController.hpp b/controller/SqliteNetworkController.hpp index 72f1e203..c61829c3 100644 --- a/controller/SqliteNetworkController.hpp +++ b/controller/SqliteNetworkController.hpp @@ -113,6 +113,7 @@ private:  	sqlite3_stmt *_sCreateNetwork;  	sqlite3_stmt *_sUpdateNetworkField;  	sqlite3_stmt *_sGetNetworkRevision; +	sqlite3_stmt *_sSetNetworkRevision;  	sqlite3_stmt *_sGetIpAssignmentsForNode2;  	sqlite3_stmt *_sDeleteRelaysForNetwork;  	sqlite3_stmt *_sCreateRelay; diff --git a/controller/controller-api-test.sh b/controller/controller-api-test.sh new file mode 100755 index 00000000..934685b3 --- /dev/null +++ b/controller/controller-api-test.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +if [ "$#" -ne "2" ]; then +	echo 'Usage: controller-api-test.sh <network ID to create> <local TCP port for HTTP API>' +	exit 1 +fi + +network_json=$(cat <<EOF +{ +	name: "test network", +	private: true, +	v4AssignMode: "zt", +	v6AssignMode: "none", +	multicastLimit: 100, +	ipAssignmentPools: [ +		{ +			network: "10.1.2.0", +			netmaskBits: 24 +		} +	], +	rules: [ +		{ +			ruleId: 100, +			etherType: 0x0800, +			action: "accept" +		}, +		{ +			ruleId: 200, +			etherType: 0x0806, +			action: "accept" +		}, +		{ +			ruleId: 300, +			etherType: 0x86dd, +			action: "accept" +		} +	] +} +EOF +) + +echo "$network_json" | curl -d - -v "http://127.0.0.1:$2/controller/network/$1" | 
