mirror of https://gitee.com/bigwinds/arangodb
Added target Coordinators and DatabaseList to high level agency communication.
This commit is contained in:
parent
5bed79017e
commit
7b745854db
|
@ -69,6 +69,9 @@ exports.Communication = function() {
|
|||
},
|
||||
checkVersion: function(route) {
|
||||
return false;
|
||||
},
|
||||
list: function(route) {
|
||||
return _agency.list(route).sort();
|
||||
}
|
||||
};
|
||||
var addLevel = function(base, name, route, functions) {
|
||||
|
@ -90,6 +93,8 @@ exports.Communication = function() {
|
|||
};
|
||||
var target = addLevel(this, "target", "Target");
|
||||
addLevel(target, "dbServers", "DBServers", ["get", "set", "remove", "checkVersion"]);
|
||||
addLevel(target, "db", "Collections", ["list"]);
|
||||
addLevel(target, "coordinators", "Coordinators", ["list", "set", "remove", "checkVersion"]);
|
||||
var plan = addLevel(this, "plan", "Plan");
|
||||
addLevel(plan, "dbServers", "DBServers", ["get"]);
|
||||
|
||||
|
@ -202,56 +207,89 @@ exports.Communication = function() {
|
|||
|
||||
Target = function() {
|
||||
var DBServers;
|
||||
var Databases;
|
||||
var Coordinators;
|
||||
|
||||
var DBServersObject = function() {
|
||||
this.getList = function() {
|
||||
return cache.getTarget();
|
||||
};
|
||||
this.addPrimary = function(name) {
|
||||
return agency.target.dbServers.set(name, "none");
|
||||
};
|
||||
this.addSecondary = function(name, primaryName) {
|
||||
return agency.target.dbServers.set(primaryName, name);
|
||||
};
|
||||
this.addPair = function(primaryName, secondaryName) {
|
||||
return agency.target.dbServers.set(primaryName, secondaryName);
|
||||
},
|
||||
this.removeServer = function(name) {
|
||||
var res = -1;
|
||||
_.each(cache.getTarget(), function(opts, n) {
|
||||
if (n === name) {
|
||||
// The removed server is a primary
|
||||
if (opts.role === "primary") {
|
||||
res = agency.target.dbServers.remove(name);
|
||||
if (!res) {
|
||||
res = -1;
|
||||
return;
|
||||
}
|
||||
if (opts.secondary !== "none") {
|
||||
res = agency.target.dbServers.set(opts.secondary, "none");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (opts.role === "primary" && opts.secondary === name) {
|
||||
res = agency.target.dbServers.set(n, "none");
|
||||
return;
|
||||
}
|
||||
});
|
||||
if (res === -1) {
|
||||
//TODO Debug info
|
||||
require("internal").print("Trying to remove a server that is not known");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
};
|
||||
var DatabasesObject = function() {
|
||||
this.getList = function() {
|
||||
return agency.target.db.list();
|
||||
};
|
||||
};
|
||||
var CoordinatorsObject = function() {
|
||||
this.getList = function() {
|
||||
return agency.target.coordinators.list();
|
||||
};
|
||||
this.add = function(name) {
|
||||
return agency.target.coordinators.set(name, true);
|
||||
};
|
||||
this.remove = function(name) {
|
||||
return agency.target.coordinators.remove(name);
|
||||
};
|
||||
};
|
||||
|
||||
this.DBServers = function() {
|
||||
if (!DBServers) {
|
||||
//Add DBServer specific functions
|
||||
DBServers = {
|
||||
getList: function() {
|
||||
return cache.getTarget();
|
||||
},
|
||||
addPrimary: function(name) {
|
||||
return agency.target.dbServers.set(name, "none");
|
||||
},
|
||||
addSecondary: function(name, primaryName) {
|
||||
return agency.target.dbServers.set(primaryName, name);
|
||||
},
|
||||
addPair: function(primaryName, secondaryName) {
|
||||
return agency.target.dbServers.set(primaryName, secondaryName);
|
||||
},
|
||||
removeServer: function(name) {
|
||||
var res = -1;
|
||||
_.each(cache.getTarget(), function(opts, n) {
|
||||
if (n === name) {
|
||||
// The removed server is a primary
|
||||
if (opts.role === "primary") {
|
||||
res = agency.target.dbServers.remove(name);
|
||||
if (!res) {
|
||||
res = -1;
|
||||
return;
|
||||
}
|
||||
if (opts.secondary !== "none") {
|
||||
res = agency.target.dbServers.set(opts.secondary, "none");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (opts.role === "primary" && opts.secondary === name) {
|
||||
res = agency.target.dbServers.set(n, "none");
|
||||
return;
|
||||
}
|
||||
});
|
||||
if (res === -1) {
|
||||
//TODO Debug info
|
||||
require("internal").print("Trying to remove a server that is not known");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
};
|
||||
DBServers = new DBServersObject();
|
||||
}
|
||||
return DBServers;
|
||||
};
|
||||
|
||||
this.Databases = function() {
|
||||
if (!Databases) {
|
||||
Databases = new DatabasesObject();
|
||||
}
|
||||
return Databases;
|
||||
};
|
||||
|
||||
this.Coordinators = function() {
|
||||
if (!Coordinators) {
|
||||
Coordinators = new CoordinatorsObject();
|
||||
}
|
||||
return Coordinators;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
|
@ -59,7 +59,7 @@ function runGoodCaseTests(test) {
|
|||
var agencyRoutes;
|
||||
var setup;
|
||||
var teardown;
|
||||
var agencyTargetServers;
|
||||
var dummy;
|
||||
var plannedServers;
|
||||
var registered;
|
||||
|
||||
|
@ -72,11 +72,19 @@ function runGoodCaseTests(test) {
|
|||
};
|
||||
|
||||
resetToDefault = function() {
|
||||
agencyTargetServers = createResult([agencyRoutes.target, "DBServers"], {
|
||||
dummy = {};
|
||||
dummy.target = {};
|
||||
dummy.target.servers = createResult([agencyRoutes.target, "DBServers"], {
|
||||
"pavel": "sandro",
|
||||
"paul": "sally",
|
||||
"patricia": "sandra"
|
||||
});
|
||||
dummy.target.coordinators = createResult([agencyRoutes.target, "Coordinators"], {
|
||||
"cindy": 2,
|
||||
"carlos": true,
|
||||
"charly": "alice"
|
||||
});
|
||||
dummy.target.databases = ["_system", "z_db", "a_db", "b_db"];
|
||||
plannedServers = createResult([agencyRoutes.plan, "DBServers"], {
|
||||
"pavel": "sandro",
|
||||
"paul": "sally",
|
||||
|
@ -94,6 +102,7 @@ function runGoodCaseTests(test) {
|
|||
|
||||
setup = function() {
|
||||
resetToDefault();
|
||||
comm = new Communication.Communication();
|
||||
};
|
||||
|
||||
teardown = function() {
|
||||
|
@ -106,7 +115,7 @@ function runGoodCaseTests(test) {
|
|||
switch (parts[0]) {
|
||||
case agencyRoutes.target:
|
||||
if (parts[1] === "DBServers" && recursive) {
|
||||
return agencyTargetServers;
|
||||
return dummy.target.servers;
|
||||
}
|
||||
break;
|
||||
case agencyRoutes.plan:
|
||||
|
@ -122,14 +131,32 @@ function runGoodCaseTests(test) {
|
|||
default:
|
||||
fail();
|
||||
}
|
||||
},
|
||||
list: function(route) {
|
||||
var parts = route.split("/");
|
||||
switch (parts[0]) {
|
||||
case agencyRoutes.target:
|
||||
if (parts[1] === "Collections") {
|
||||
return dummy.target.databases;
|
||||
}
|
||||
if (parts[1] === "Coordinators") {
|
||||
return _.map(
|
||||
_.keys(dummy.target.coordinators),
|
||||
function(k) {
|
||||
var splits = k.split("/");
|
||||
return splits[splits.length-1];
|
||||
}
|
||||
);
|
||||
}
|
||||
default:
|
||||
fail();
|
||||
}
|
||||
}
|
||||
};
|
||||
Communication._createAgency = function() {
|
||||
return agencyMock;
|
||||
};
|
||||
|
||||
comm = new Communication.Communication();
|
||||
|
||||
function VisionSuite() {
|
||||
|
||||
return {
|
||||
|
@ -189,7 +216,7 @@ function runGoodCaseTests(test) {
|
|||
agencyMock.set = function(route, value) {
|
||||
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
|
||||
assertEqual(value, "none");
|
||||
agencyTargetServers[route] = value;
|
||||
dummy.target.servers[route] = value;
|
||||
wasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -210,7 +237,7 @@ function runGoodCaseTests(test) {
|
|||
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
|
||||
assertEqual(value, "none");
|
||||
assertFalse(wasCalled, "Set has been called multiple times");
|
||||
agencyTargetServers[route] = value;
|
||||
dummy.target.servers[route] = value;
|
||||
wasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -221,7 +248,7 @@ function runGoodCaseTests(test) {
|
|||
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
|
||||
assertEqual(value, secName);
|
||||
assertFalse(wasCalled, "Set has been called multiple times");
|
||||
agencyTargetServers[route] = value;
|
||||
dummy.target.servers[route] = value;
|
||||
wasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -244,7 +271,7 @@ function runGoodCaseTests(test) {
|
|||
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
|
||||
assertEqual(value, secName);
|
||||
assertFalse(wasCalled, "Set has been called multiple times");
|
||||
agencyTargetServers[route] = value;
|
||||
dummy.target.servers[route] = value;
|
||||
wasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -266,7 +293,7 @@ function runGoodCaseTests(test) {
|
|||
assertEqual(route, [agencyRoutes.target, "DBServers", secondaryName].join("/"));
|
||||
assertEqual(value, "none");
|
||||
assertFalse(setWasCalled, "Set has been called multiple times");
|
||||
agencyTargetServers[route] = value;
|
||||
dummy.target.servers[route] = value;
|
||||
setWasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -274,7 +301,7 @@ function runGoodCaseTests(test) {
|
|||
agencyMock.remove = function(route) {
|
||||
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
|
||||
assertFalse(delWasCalled, "Delete has been called multiple times");
|
||||
delete agencyTargetServers[route];
|
||||
delete dummy.target.servers[route];
|
||||
delWasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -297,7 +324,7 @@ function runGoodCaseTests(test) {
|
|||
assertEqual(route, [agencyRoutes.target, "DBServers", pName].join("/"));
|
||||
assertEqual(value, "none");
|
||||
assertFalse(wasCalled, "Set has been called multiple times");
|
||||
agencyTargetServers[route] = value;
|
||||
dummy.target.servers[route] = value;
|
||||
wasCalled = true;
|
||||
return true;
|
||||
};
|
||||
|
@ -309,36 +336,110 @@ function runGoodCaseTests(test) {
|
|||
assertEqual(newList[pName].role, "primary");
|
||||
assertUndefined(newList[pName].secondary);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
function TargetShardSuite() {
|
||||
function TargetCoordinatorSuite() {
|
||||
var targetCoordinators;
|
||||
|
||||
return {
|
||||
setUp: function() {
|
||||
setup();
|
||||
targetCoordinators = comm.target.Coordinators();
|
||||
},
|
||||
tearDown: teardown,
|
||||
|
||||
testGetCoordinatorList: function() {
|
||||
var list = [
|
||||
"carlos",
|
||||
"charly",
|
||||
"cindy"
|
||||
].sort();
|
||||
assertEqual(targetCoordinators.getList(), list);
|
||||
},
|
||||
|
||||
testAddCoordinator: function() {
|
||||
var name = "carol";
|
||||
var wasCalled = false;
|
||||
agencyMock.set = function(route, value) {
|
||||
assertEqual(route, [agencyRoutes.target, "Coordinators", name].join("/"));
|
||||
assertEqual(value, true);
|
||||
dummy.target.coordinators[route] = value;
|
||||
wasCalled = true;
|
||||
return true;
|
||||
};
|
||||
assertTrue(targetCoordinators.add(name), "Failed to insert a new coordinator.");
|
||||
assertTrue(wasCalled, "Agency has not been informed to insert coordinator.");
|
||||
var list = [
|
||||
"carlos",
|
||||
"charly",
|
||||
"cindy",
|
||||
name
|
||||
].sort();
|
||||
assertEqual(targetCoordinators.getList(), list);
|
||||
},
|
||||
|
||||
testRemoveCoordinator: function() {
|
||||
var name = "cindy";
|
||||
var delWasCalled = false;
|
||||
agencyMock.remove = function(route) {
|
||||
assertEqual(route, [agencyRoutes.target, "Coordinators", name].join("/"));
|
||||
assertFalse(delWasCalled, "Delete has been called multiple times");
|
||||
delete dummy.target.coordinators[route];
|
||||
internal.print(route);
|
||||
internal.print(dummy.target.coordinators);
|
||||
delWasCalled = true;
|
||||
return true;
|
||||
};
|
||||
assertTrue(targetCoordinators.remove(name), "Failed to remove a coordinator.");
|
||||
assertTrue(delWasCalled, "Agency has not been informed to remove a coordinator.");
|
||||
var list = [
|
||||
"carlos",
|
||||
"charly"
|
||||
].sort();
|
||||
assertEqual(targetCoordinators.getList(), list);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
function TargetDataSuite() {
|
||||
|
||||
return {
|
||||
setUp: setup,
|
||||
tearDown: teardown,
|
||||
|
||||
testGetDatabaseList: function() {
|
||||
/*
|
||||
var list = [
|
||||
"_system",
|
||||
"a_db",
|
||||
"b_db",
|
||||
"z_db"
|
||||
];
|
||||
].sort();
|
||||
var targetDBs = comm.target.Databases();
|
||||
assertEqual(targetDBs.getList(), list);
|
||||
*/
|
||||
assertTrue(true);
|
||||
},
|
||||
/*
|
||||
testGetCollectionListForDatabase: function() {
|
||||
var list = [
|
||||
"_graphs",
|
||||
"v",
|
||||
"e"
|
||||
].sort();
|
||||
var targetColls = comm.target._system();
|
||||
assertEqual(targetColls.getList(), list);
|
||||
}
|
||||
}
|
||||
*/
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// test.run(VisionSuite);
|
||||
test.run(TargetDBServersSuite);
|
||||
test.run(TargetShardSuite);
|
||||
test.run(TargetCoordinatorSuite);
|
||||
test.run(TargetDataSuite);
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue