Esempio n. 1
0
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
Esempio n. 2
0
    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
Esempio n. 3
0
    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