1
0
Fork 0

Added target Coordinators and DatabaseList to high level agency communication.

This commit is contained in:
Michael Hackstein 2014-01-06 09:18:56 +01:00
parent 5bed79017e
commit 7b745854db
2 changed files with 202 additions and 63 deletions

View File

@ -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;
};
};
// -----------------------------------------------------------------------------

View File

@ -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);
};
// -----------------------------------------------------------------------------