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) { checkVersion: function(route) {
return false; return false;
},
list: function(route) {
return _agency.list(route).sort();
} }
}; };
var addLevel = function(base, name, route, functions) { var addLevel = function(base, name, route, functions) {
@ -90,6 +93,8 @@ exports.Communication = function() {
}; };
var target = addLevel(this, "target", "Target"); var target = addLevel(this, "target", "Target");
addLevel(target, "dbServers", "DBServers", ["get", "set", "remove", "checkVersion"]); 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"); var plan = addLevel(this, "plan", "Plan");
addLevel(plan, "dbServers", "DBServers", ["get"]); addLevel(plan, "dbServers", "DBServers", ["get"]);
@ -202,24 +207,23 @@ exports.Communication = function() {
Target = function() { Target = function() {
var DBServers; var DBServers;
var Databases;
var Coordinators;
this.DBServers = function() { var DBServersObject = function() {
if (!DBServers) { this.getList = function() {
//Add DBServer specific functions
DBServers = {
getList: function() {
return cache.getTarget(); return cache.getTarget();
}, };
addPrimary: function(name) { this.addPrimary = function(name) {
return agency.target.dbServers.set(name, "none"); return agency.target.dbServers.set(name, "none");
}, };
addSecondary: function(name, primaryName) { this.addSecondary = function(name, primaryName) {
return agency.target.dbServers.set(primaryName, name); return agency.target.dbServers.set(primaryName, name);
}, };
addPair: function(primaryName, secondaryName) { this.addPair = function(primaryName, secondaryName) {
return agency.target.dbServers.set(primaryName, secondaryName); return agency.target.dbServers.set(primaryName, secondaryName);
}, },
removeServer: function(name) { this.removeServer = function(name) {
var res = -1; var res = -1;
_.each(cache.getTarget(), function(opts, n) { _.each(cache.getTarget(), function(opts, n) {
if (n === name) { if (n === name) {
@ -248,10 +252,44 @@ exports.Communication = function() {
return res; 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) {
DBServers = new DBServersObject();
} }
return DBServers; 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 agencyRoutes;
var setup; var setup;
var teardown; var teardown;
var agencyTargetServers; var dummy;
var plannedServers; var plannedServers;
var registered; var registered;
@ -72,11 +72,19 @@ function runGoodCaseTests(test) {
}; };
resetToDefault = function() { resetToDefault = function() {
agencyTargetServers = createResult([agencyRoutes.target, "DBServers"], { dummy = {};
dummy.target = {};
dummy.target.servers = createResult([agencyRoutes.target, "DBServers"], {
"pavel": "sandro", "pavel": "sandro",
"paul": "sally", "paul": "sally",
"patricia": "sandra" "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"], { plannedServers = createResult([agencyRoutes.plan, "DBServers"], {
"pavel": "sandro", "pavel": "sandro",
"paul": "sally", "paul": "sally",
@ -94,6 +102,7 @@ function runGoodCaseTests(test) {
setup = function() { setup = function() {
resetToDefault(); resetToDefault();
comm = new Communication.Communication();
}; };
teardown = function() { teardown = function() {
@ -106,7 +115,7 @@ function runGoodCaseTests(test) {
switch (parts[0]) { switch (parts[0]) {
case agencyRoutes.target: case agencyRoutes.target:
if (parts[1] === "DBServers" && recursive) { if (parts[1] === "DBServers" && recursive) {
return agencyTargetServers; return dummy.target.servers;
} }
break; break;
case agencyRoutes.plan: case agencyRoutes.plan:
@ -122,14 +131,32 @@ function runGoodCaseTests(test) {
default: default:
fail(); 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() { Communication._createAgency = function() {
return agencyMock; return agencyMock;
}; };
comm = new Communication.Communication();
function VisionSuite() { function VisionSuite() {
return { return {
@ -189,7 +216,7 @@ function runGoodCaseTests(test) {
agencyMock.set = function(route, value) { agencyMock.set = function(route, value) {
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
assertEqual(value, "none"); assertEqual(value, "none");
agencyTargetServers[route] = value; dummy.target.servers[route] = value;
wasCalled = true; wasCalled = true;
return true; return true;
}; };
@ -210,7 +237,7 @@ function runGoodCaseTests(test) {
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
assertEqual(value, "none"); assertEqual(value, "none");
assertFalse(wasCalled, "Set has been called multiple times"); assertFalse(wasCalled, "Set has been called multiple times");
agencyTargetServers[route] = value; dummy.target.servers[route] = value;
wasCalled = true; wasCalled = true;
return true; return true;
}; };
@ -221,7 +248,7 @@ function runGoodCaseTests(test) {
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
assertEqual(value, secName); assertEqual(value, secName);
assertFalse(wasCalled, "Set has been called multiple times"); assertFalse(wasCalled, "Set has been called multiple times");
agencyTargetServers[route] = value; dummy.target.servers[route] = value;
wasCalled = true; wasCalled = true;
return true; return true;
}; };
@ -244,7 +271,7 @@ function runGoodCaseTests(test) {
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
assertEqual(value, secName); assertEqual(value, secName);
assertFalse(wasCalled, "Set has been called multiple times"); assertFalse(wasCalled, "Set has been called multiple times");
agencyTargetServers[route] = value; dummy.target.servers[route] = value;
wasCalled = true; wasCalled = true;
return true; return true;
}; };
@ -266,7 +293,7 @@ function runGoodCaseTests(test) {
assertEqual(route, [agencyRoutes.target, "DBServers", secondaryName].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", secondaryName].join("/"));
assertEqual(value, "none"); assertEqual(value, "none");
assertFalse(setWasCalled, "Set has been called multiple times"); assertFalse(setWasCalled, "Set has been called multiple times");
agencyTargetServers[route] = value; dummy.target.servers[route] = value;
setWasCalled = true; setWasCalled = true;
return true; return true;
}; };
@ -274,7 +301,7 @@ function runGoodCaseTests(test) {
agencyMock.remove = function(route) { agencyMock.remove = function(route) {
assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", name].join("/"));
assertFalse(delWasCalled, "Delete has been called multiple times"); assertFalse(delWasCalled, "Delete has been called multiple times");
delete agencyTargetServers[route]; delete dummy.target.servers[route];
delWasCalled = true; delWasCalled = true;
return true; return true;
}; };
@ -297,7 +324,7 @@ function runGoodCaseTests(test) {
assertEqual(route, [agencyRoutes.target, "DBServers", pName].join("/")); assertEqual(route, [agencyRoutes.target, "DBServers", pName].join("/"));
assertEqual(value, "none"); assertEqual(value, "none");
assertFalse(wasCalled, "Set has been called multiple times"); assertFalse(wasCalled, "Set has been called multiple times");
agencyTargetServers[route] = value; dummy.target.servers[route] = value;
wasCalled = true; wasCalled = true;
return true; return true;
}; };
@ -309,36 +336,110 @@ function runGoodCaseTests(test) {
assertEqual(newList[pName].role, "primary"); assertEqual(newList[pName].role, "primary");
assertUndefined(newList[pName].secondary); assertUndefined(newList[pName].secondary);
} }
};
};
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 TargetShardSuite() { function TargetDataSuite() {
return { return {
setUp: setup, setUp: setup,
tearDown: teardown, tearDown: teardown,
testGetDatabaseList: function() { testGetDatabaseList: function() {
/*
var list = [ var list = [
"_system", "_system",
"a_db", "a_db",
"b_db", "b_db",
"z_db" "z_db"
]; ].sort();
var targetDBs = comm.target.Databases();
assertEqual(targetDBs.getList(), list); assertEqual(targetDBs.getList(), list);
},
/*
testGetCollectionListForDatabase: function() {
var list = [
"_graphs",
"v",
"e"
].sort();
var targetColls = comm.target._system();
assertEqual(targetColls.getList(), list);
}
}
*/ */
assertTrue(true); };
}
}
}; };
// test.run(VisionSuite); // test.run(VisionSuite);
test.run(TargetDBServersSuite); test.run(TargetDBServersSuite);
test.run(TargetShardSuite); test.run(TargetCoordinatorSuite);
test.run(TargetDataSuite);
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------