def main(): parser = argparse.ArgumentParser(description='Start Squirrel Daemon as Leader, Worker or Client...') parser.add_argument('--mode',nargs=2, choices=['client', 'leader', 'worker','sqd', 'start', 'stop', 'restart'], help='Primary operations: start or stop management daemon') # choices=['client', 'worker', 'add', 'remove'] parser.add_argument('--leader',nargs=3, help='Secondary operations for leader: client/worker ip add/remove') parser.add_argument('--sample',nargs=1, choices=['set'], help='Secondary operations for leader: client/worker ip add/remove') parser.add_argument('--status', choices=['full', 'mode']) args = parser.parse_args() cli = msgClient("172.16.0.166","6667") if args.mode != None: if args.mode[0] == "sqd": if args.mode[1]=="start": pass else: msg = u.createCliMsg("mode",(args.mode[0],args.mode[1])) print msg cli.send(msg) if args.status != None: msg = u.createCliMsg("status",(args.status,)) # cli.send(msg) print msg if args.leader != None: if args.leader[0] in ["client","worker"] \ and args.leader[2] in ["add", "remove"]: msg = u.createCliMsg("leader",(args.leader[0],args.leader[1], args.leader[2])) print msg cli.send(msg) print "MODE: ", args.mode print "status: ", args.status
def addWorker(self, ip): # adding worker to cluster # --- print "Adding worker: " + ip existingWorkersInConfig = self.leaderConfig["leader"]["workers"] if ip not in existingWorkersInConfig: self.leaderConfig["leader"]["workers"].append(ip) #update config utils.writeJSON(os.path.join(self.configDir, self.configFile), self.leaderConfig) existingWorkersInServer = self.workers.keys() if ip not in existingWorkersInServer: print "Starting new msgClient for: ", ip self.workers[ip] = msgClient(ip) self.workers[ip].run() # Response handler for new worker coming in # If workers name print "checking worker: ", ip ret = self.checkWorker(ip) print "Found: ", str(ret) pass
def addClient(self, clientIp): # adding client to cluster # --- print "Adding client: " + clientIp existingClientsInConfig = self.leaderConfig["leader"]["clients"] if clientIp not in existingClientsInConfig: self.leaderConfig["leader"]["clients"].append(clientIp) #update config utils.writeJSON(os.path.join(self.configDir, self.configFile), self.leaderConfig) existingClientsInServer = self.clients.keys() if clientIp not in existingClientsInServer: self.clients[clientIp] = msgClient(clientIp) self.clients[clientIp].run() # Check for client print "Checking Client..." ret = None msgId = u.genNewId() type = "R" sName = "sqdL/addClient" rName = "sqdC" now = datetime.now() opName = "iamClient" # [TODO] for now always the last worker ip is send for testing purposes. # it should be same worker on which addClient is envoked after getting infor from client workerIp = self.leaderConfig["leader"]["workers"][-1] args = (self.leaderConfig["leader"]["host"], self.leaderConfig["leader"]["cluster"], workerIp) msg = u.createMsg(msgId, type, sName, rName, now, opName, args) if clientIp not in self.clients.keys(): print "Client (%s) not available..." % (clientIp,) else: id, M = u.resolveMsg(msg) self.clients[clientIp].outbox[id] = M self.clients[clientIp].send(msg) print "checkClient: " + msg for i in range(1,40): if id in self.clients[clientIp].inbox.keys(): ret = self.clients[clientIp].inbox[id] self.clients[clientIp].inbox.pop(id,0) self.clients[clientIp].outbox.pop(id,0) print "Info from Client..", str(ret["args"]) break else: time.sleep(2) # if got the necessary info from client # pass it on to worker if ret != None and len(ret["args"]) == 3: argsToWorker = ret["args"] ret = None idW = u.genNewId() type = "R" sName = "sqdL/addClient" rName = "sqdW" now = datetime.now() opName = "addClient" msg = u.createMsg(idW, type, sName, rName, now, opName, argsToWorker) print "keeping the message content in outbox..." curId, M = u.resolveMsg(msg) self.workers[workerIp].outbox[id] = M self.workers[workerIp].send(msg) print "Sending back to worker : ", msg for i in range(1,30): if id in self.workers[workerIp].inbox.keys(): ret = self.workers[workerIp].inbox[id] self.workers[workerIp].inbox.pop(id,0) self.workers[workerIp].outbox.pop(id,0) print "Worker sent: ", ret if ret == 1: self.leaderConfig["leader"]["relation"][clientIp] = workerIp #update config utils.writeJSON(os.path.join(self.configDir, self.configFile), self.leaderConfig) return ret else: time.sleep(2) else: print "Something went wrong while sending to worker..." return ret # Response handler for new worker coming in # If workers name pass