def test_ChunkServer(): print ' test begin '.center(100,'-') print server=ChunkServer() logging.basicConfig(level=logging.DEBUG) # mock the newchunk request from client req_newchunk=msg.NewChunk_Request() req_newchunk.size=32 req_newchunk.count=1 ret_newchunk = server.NewChunk(req_newchunk) # mock the assemblevolume request from client req_assemblevolume=msg.AssembleVolume_Request() Guid.assign(req_assemblevolume.volume.guid, ret_newchunk.guids[-1]) req_assemblevolume.volume.size=32 ret_assemblevolume = server.AssembleVolume(req_assemblevolume) # # mock req_disassemblevolume req_disassemblevolume = msg.DisassembleVolume_Request() req_disassemblevolume.access_point = ret_assemblevolume.access_point ret_disassemblevolume = server.DisassembleVolume(req_disassemblevolume) # mock the delchunk request from client req_delchunk = msg.DeleteChunk_Request() for a_guid in ret_newchunk.guids: t=req_delchunk.guids.add() Guid.assign(t, a_guid) ret_delchunk = server.DeleteChunk(req_delchunk) print print ' test end '.center(100,'-')
def test_ChunkServer(): print " test begin ".center(100, "-") print server = ChunkServer() logging.basicConfig(level=logging.DEBUG) # mock the newchunk request from client req_newchunk = msg.NewChunk_Request() req_newchunk.size = 32 req_newchunk.count = 1 ret_newchunk = server.NewChunk(req_newchunk) # mock the assemblevolume request from client req_assemblevolume = msg.AssembleVolume_Request() Guid.assign(req_assemblevolume.volume.guid, ret_newchunk.guids[-1]) req_assemblevolume.volume.size = 32 ret_assemblevolume = server.AssembleVolume(req_assemblevolume) # # mock req_disassemblevolume req_disassemblevolume = msg.DisassembleVolume_Request() req_disassemblevolume.access_point = ret_assemblevolume.access_point ret_disassemblevolume = server.DisassembleVolume(req_disassemblevolume) # mock the delchunk request from client req_delchunk = msg.DeleteChunk_Request() for a_guid in ret_newchunk.guids: t = req_delchunk.guids.add() Guid.assign(t, a_guid) ret_delchunk = server.DeleteChunk(req_delchunk) print print " test end ".center(100, "-")
def DeleteChunk(self, arg): print type(arg) ret = msg.DeleteChunk_Response() for x in arg.guids: ret.guids.add() y = ret.guids[-1] Guid.assign(y, x) return ret
def DeleteChunk(self, volumes): stub = self.getStub() arg = msg.DeleteChunk_Request() if not isinstance(volumes, list): volumes = [volumes] for volume in volumes: t = arg.guids.add() volguid = Guid.fromStr(volume.guid) Guid.assign(t, volguid) ret = stub.callMethod('DeleteChunk', arg)
def __ForwardNewChunk__(self, arg, target, aresponse): self.stub.socket.connect((target.ServiceAddress, target.ServicePort)) ret0=self.stub.callMethod('NewChunk', arg) self.stub.socket.close() if aresponse: for guid in ret0.guids: t=aresponse.guids.add() Guid.assign(t, guid) if ret0.error: t=[group[0].guid, group[0].ServiceAddress, group[0].ServicePort, ret0.error] aresponse.error="error from chunk server {0} @ ({1}:{2}):\n{3}".format(*t) return ret0
def doHeartBeat(self, serviceport, stub): serviceip=stub.socket.getsockname()[0] while True: info=msg.ChunkServerInfo() info.ServiceAddress=serviceip info.ServicePort=serviceport self.lvm.reload_softsan_lvs() for lv in self.lvm.softsan_lvs: chk=info.chunks.add() name4guid = lv.name.split(self.prefix_vol)[1] Guid.assign(chk.guid, Guid.fromStr(name4guid)) chk.size = int(lv.get_sizes(lv.total_extents)[2]) stub.callMethod('ChunkServerInfo', info) print 'for test--------------------------------', random.randint(0,100) gevent.sleep(1)
def DeleteChunk(self, req): self.lvm.reload() ret = msg.DeleteChunk_Response() print 'ChunkServer: DeleteChunk' for a_guid in req.guids: str_guid=Guid.toStr(a_guid) lv_name = self.prefix_vol+str_guid lv_path = '/dev/'+self.vgname+'/'+lv_name output = self.lvm.lv_remove(lv_path) if output!=None: ret.error = "Unable to delete chunk {0}:\n{1}".format(str_guid, output) break t=ret.guids.add() Guid.assign(t, a_guid) return ret
def doHeartBeat(self, serviceport, stub): serviceip = stub.socket.getsockname()[0] while True: info = msg.ChunkServerInfo() info.ServiceAddress = serviceip info.ServicePort = serviceport self.lvm.reload_softsan_lvs() for lv in self.lvm.softsan_lvs: chk = info.chunks.add() name4guid = lv.name.split(self.prefix_vol)[1] Guid.assign(chk.guid, Guid.fromStr(name4guid)) chk.size = int(lv.get_sizes(lv.total_extents)[2]) stub.callMethod("ChunkServerInfo", info) print "for test--------------------------------", random.randint(0, 100) gevent.sleep(1)
def DeleteChunk(self, req): self.lvm.reload() ret = msg.DeleteChunk_Response() print "ChunkServer: DeleteChunk" for a_guid in req.guids: str_guid = Guid.toStr(a_guid) lv_name = self.prefix_vol + str_guid lv_path = "/dev/" + self.vgname + "/" + lv_name output = self.lvm.lv_remove(lv_path) if output != None: ret.error = "Unable to delete chunk {0}:\n{1}".format(str_guid, output) break t = ret.guids.add() Guid.assign(t, a_guid) return ret
def NewChunk(self, req): self.lvm.reload() ret = msg.NewChunk_Response() size = str(req.size) + "M" for i in range(req.count): a_guid = Guid.generate() lv_name = self.prefix_vol + Guid.toStr(a_guid) lv_size = size output = self.lvm.lv_create(self.vgname, lv_name, lv_size) if output != None: ret.error = str(i) + ":" + output + " " break t = ret.guids.add() Guid.assign(t, a_guid) return ret
def NewChunk(self, req): self.lvm.reload() ret = msg.NewChunk_Response() size = str(req.size)+'M' for i in range(req.count): a_guid = Guid.generate() lv_name = self.prefix_vol+Guid.toStr(a_guid) lv_size = size output = self.lvm.lv_create(self.vgname, lv_name, lv_size) if output!=None: ret.error = str(i) + ':' + output + ' ' break t=ret.guids.add() Guid.assign(t, a_guid) return ret
def __ForwardNewChunk__(self, arg, target, aresponse): self.stub.socket.connect((target.ServiceAddress, target.ServicePort)) ret0 = self.stub.callMethod('NewChunk', arg) self.stub.socket.close() if aresponse: for guid in ret0.guids: t = aresponse.guids.add() Guid.assign(t, guid) if ret0.error: t = [ group[0].guid, group[0].ServiceAddress, group[0].ServicePort, ret0.error ] aresponse.error = "error from chunk server {0} @ ({1}:{2}):\n{3}".format( *t) return ret0
def object2message(object, message): import guid as Guid, messages_pb2 as msg d = object if isinstance(object, dict) else object.__dict__ for key in d: if key.startswith('_'): continue value = d[key] if isinstance(value, list): mfield = getattr(message, key) appender = (lambda x : mfield.append(x)) if hasattr(mfield, 'append') \ else (lambda x : object2message(x, mfield.add())) for item in value: appender(item) else: try: if key == 'guid': value = Guid.fromStr(value) Guid.assign(message.guid, value) else: setattr(message, key, value) except: print 'exception occured' pass
def object2message(object, message): import guid as Guid, messages_pb2 as msg d = object if isinstance(object, dict) else object.__dict__ for key in d: if key.startswith('_'): continue value=d[key] if isinstance(value, list): mfield=getattr(message, key) appender = (lambda x : mfield.append(x)) if hasattr(mfield, 'append') \ else (lambda x : object2message(x, mfield.add())) for item in value: appender(item) else: try: if key == 'guid': value=Guid.fromStr(value) Guid.assign(message.guid, value) else: setattr(message, key, value) except: print 'exception occured' pass
def test(): global PARAM logging.basicConfig(level=logging.DEBUG) socket=gevent.socket.socket() socket.connect((PARAM.MDS_IP, int(PARAM.MDS_PORT))) guid=msg.Guid() guid.a=10 guid.b=22 guid.c=30 guid.d=40 stub=rpc.RpcStub(guid, socket, mds.MDS) arg=msg.GetChunkServers_Request() ret=stub.callMethod('GetChunkServers', arg) s2=gevent.socket.socket() s2.connect((ret.random[0].ServiceAddress, ret.random[0].ServicePort)) stub2=rpc.RpcStub(guid, s2, ChunkServer.ChunkServer) if raw_input('you want to NewChunk ? ')=='y': arg2=msg.NewChunk_Request() arg2.size=32 arg2.count=2 ret2=stub2.callMethod('NewChunk', arg2) print ret2.guids if raw_input('you want to assembleVolume ? ')=='y': req_assemble = msg.AssembleVolume_Request() req_assemble.volume.size = 32 Guid.assign(req_assemble.volume.guid,ret2.guids[-1]) res_assemble = stub2.callMethod('AssembleVolume', req_assemble) print 'access_point:', res_assemble.access_point if raw_input('you want to DisassembleVolume ? ')=='y': req_disassemble = msg.DisassembleVolume_Request() req_disassemble.access_point = res_assemble.access_point print 'req_disassemble.access_point:', req_disassemble.access_point stub2.callMethod('DisassembleVolume', req_disassemble) if raw_input('you want to DeleteChunk ? ')=='y': arg3=msg.DeleteChunk_Request() t = arg3.guids.add() Guid.assign(t, ret2.guids[0]) t = arg3.guids.add() Guid.assign(t, ret2.guids[1]) ret_Del=stub2.callMethod('DeleteChunk', arg3)
def test(): global PARAM logging.basicConfig(level=logging.DEBUG) socket = gevent.socket.socket() socket.connect((PARAM.MDS_IP, int(PARAM.MDS_PORT))) guid = msg.Guid() guid.a = 10 guid.b = 22 guid.c = 30 guid.d = 40 stub = rpc.RpcStub(guid, socket, mds.MDS) arg = msg.GetChunkServers_Request() ret = stub.callMethod('GetChunkServers', arg) s2 = gevent.socket.socket() s2.connect((ret.random[0].ServiceAddress, ret.random[0].ServicePort)) stub2 = rpc.RpcStub(guid, s2, ChunkServer.ChunkServer) if raw_input('you want to NewChunk ? ') == 'y': arg2 = msg.NewChunk_Request() arg2.size = 32 arg2.count = 2 ret2 = stub2.callMethod('NewChunk', arg2) print ret2.guids if raw_input('you want to assembleVolume ? ') == 'y': req_assemble = msg.AssembleVolume_Request() req_assemble.volume.size = 32 Guid.assign(req_assemble.volume.guid, ret2.guids[-1]) res_assemble = stub2.callMethod('AssembleVolume', req_assemble) print 'access_point:', res_assemble.access_point if raw_input('you want to DisassembleVolume ? ') == 'y': req_disassemble = msg.DisassembleVolume_Request() req_disassemble.access_point = res_assemble.access_point print 'req_disassemble.access_point:', req_disassemble.access_point stub2.callMethod('DisassembleVolume', req_disassemble) if raw_input('you want to DeleteChunk ? ') == 'y': arg3 = msg.DeleteChunk_Request() t = arg3.guids.add() Guid.assign(t, ret2.guids[0]) t = arg3.guids.add() Guid.assign(t, ret2.guids[1]) ret_Del = stub2.callMethod('DeleteChunk', arg3)