def operationCluster(clusterName): try: cluster_id_info = db.select('cluster_info',where='name=$clusterName' ,what="id",vars=locals()) if len(cluster_id_info) == 0: code, reval = "20200", "Error ["+clusterName+"] not existed" else: data = web.input() operation = data.operation status,local_IP = Utils.getLocal_IP() localIP = local_IP.strip() cluster_id = cluster_id_info[0].id server_name_info = db.select('server_info',where='cluster_id=$cluster_id' ,what="name",vars=locals()) if operation == "mount": for server in server_name_info: serverName = server.name commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_setup.sh " + serverName status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21015", "Error when operation[mount] cluster[" + clusterName + "]: mount failure on server[" + serverName + "]" break if status == 0: logger.info("Operation[mount] cluster[" + clusterName + "] successfully!") return '' elif operation == "umount": for server in server_name_info: serverName = server.name commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_teardown.sh " + serverName status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21015", "Error when operation[umount] cluster[" + clusterName + "]: umount failure on server[" + serverName + "]" break if status == 0: logger.info("Operation[umount] cluster[" + clusterName + "] successfully!") return '' elif operation == "remount": for server in server_name_info: serverName = server.name commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_teardown.sh " + serverName status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21015", "Error when operation[remount] cluster[" + clusterName + "]: umount failure on server[" + serverName + "]" break commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_setup.sh " + serverName status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21015", "Error when operation[remount] cluster[" + clusterName + "]: mount failure on server[" + serverName + "]" break if status == 0: logger.info("Operation[remount] cluster[" + clusterName + "] successfully!") return '' else: code, reval = "21014", "Error when operation cluster[" + clusterName + "]: no such operation on cluster" except Exception, e: code, reval = "21015", "Error when operation a cluster:" + str(e)
def getServersInfo(serverNameInfo,clusterName): sum = 0 online = 0 serversInfo = [] servers = [] sum = len(serverNameInfo) totalSpace = Decimal("0.0") usedSpace = Decimal("0.0") strs = str(clusterName) + "_servers" message = Globals.mc.get(strs) if message is not None: serversInfo = message else: for server in serverNameInfo: serverName = str(server.name) servers.append(serverName) if Utils.isOnline(serverName) == True: cmd = 'python ' + Globals.BACKEND_SCRIPT + 'get_server_bricks.py' status,message = Utils.executeOnServer(serverName, cmd) if status == 0: if message.strip() != '[]': message = message.replace("['",'') message = message.replace("']",'') info = message.split(':') usedSpace = usedSpace + Decimal(info[2]) totalSpace = totalSpace + Decimal(info[3]) online = online + 1 serversInfo.append(online) serversInfo.append(sum) serversInfo.append(usedSpace) serversInfo.append(totalSpace) serversInfo.append(servers) return serversInfo
def getNeofsStatus(clusterName, serverName): code = None reval = None params = [] params.append(clusterName) params.append(serverName) status, clusterid, server_id = get_server(clusterName, serverName) if status == "-1": code, reval = "20052", "No cluster " + clusterName + "." elif status == "-2": code, reval = "20054", "server " + serverName + " is not in cluster " + clusterName + "." elif Utils.isOnline(serverName) == False: code, reval = "22008", "Server " + serverName + " is not online." if code is not None: result = Utils.errorCode(code, reval, params) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result) try: commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_status.sh" status, message = Utils.executeOnServer(serverName, commandWithArgs) responseDom = XmlHandler.ResponseXml() tasksTag = responseDom.appendTagRoute("responseStatus") tasksTag.appendChild(responseDom.createTag("status", message)) logger.info("Get neofs mount status: " + message) return tasksTag.toxml() except Exception, e: code, reval = "22202", "Error when get neofs status on server:" + str(e)
def removeServerFromCluster(clusterName, serverName): code = None reval = None params = [] params.append(clusterName) params.append(serverName) status, clusterid, server_id = get_server(clusterName, serverName) if status == "-1": code, reval = "20052", "No cluster " + clusterName + "." elif status == "-2": code, reval = "20054", "server " + serverName + " is not in cluster " + clusterName elif Utils.isOnline(serverName) == False: code, reval = "22008", "Server " + serverName + " is not online" if code is not None: result = Utils.errorCode(code, reval, params) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result) try: servers = Globals.db.select("server_info", what="*", where="cluster_id=$clusterid", vars=locals()) if len(servers) == 0: logger.info("This server[" + serverName + "] not contained in table server_info") return "" if len(servers) == 1: Globals.db.delete("server_info", where="id=$server_id", vars=locals()) logger.info("delete server[" + serverName + "] from table server_info") return "" for server in servers: if (Utils.getIPByName(server.name) != Utils.getIPByName(serverName)) and ( server.name.strip() != serverName ): break if Utils.isLocalHost(serverName): status, ip = Utils.getLocal_IP() else: ip = Utils.getIPByName(serverName) status, msg = Utils.executeOnServer(server.name, "gluster --mode=script peer detach " + ip) if status == -1: code, reval = ( "26104", "error when connecting to remote host " + serverName + " from localhost " + server.name + "." + msg, ) elif status == -2: code, reval = "26059", "Error when using pub key to connect remote server " + serverName + "." + msg elif status == 1: code, reval = "22014", 'Error when executing "gluster --mode=script peer detach ' + ip + '"' + msg if code is not None: result = Utils.errorCode(code, reval, params) web.HTTPError(status="400 Bad Request", data="") logger.error(reval) return result Globals.db.delete("server_info", where="id=$server_id", vars=locals()) return "" except Exception, e: code, reval = "22101", "failed to remove server " + serverName + "." + str(e) logger.error(reval) result = Utils.errorCode(code, reval, params) raise web.HTTPError(status="400 Bad Request", data=result)
def get_disk_info(self, reference): server_disk = reference.split(':') chkcmd = 'python '+ Globals.BACKEND_SCRIPT + '/get_format_device_status.py ' + server_disk[1] hostName = os.popen('hostname').read() if Utils.isLocalHost(server_disk[1].strip()): (status, output) = commands.getstatusoutput(chkcmd) else: (status, output) = Utils.executeOnServer(server_disk[0].strip(), chkcmd) return status,output
def getDiskStatus(reference): server_disk = reference.split(":") chkcmd = "python " + Globals.BACKEND_SCRIPT + "get_format_device_status.py " + server_disk[1] if Utils.isLocalHost(server_disk[0].strip()): (status, output) = commands.getstatusoutput(chkcmd) else: (status, output) = Utils.executeOnServer(server_disk[0].strip(), chkcmd) return (status, output)
def getVolumesInfo(clusterName): strs = str(clusterName) + "_volumes" message = Globals.mc.get(strs) if message is not None: return message onlineNum = 0 totalNum = 0 volumes = [] cluster_info = Globals.db.select('cluster_info',where='name=$clusterName',what='*',vars=locals()) clusterid = cluster_info[0].id server_info = Globals.db.select('server_info', where='cluster_id=$clusterid',vars=locals()) for server in server_info: if Utils.isOnline(str(server.name)) == False: continue status, message = Utils.executeOnServer(str(server.name), 'gluster volume list') if message.strip() != 'No volumes present in cluster': volumeList = message.split('\n') if len(volumeList) != 0: onlineNum = 0 totalNum = 0 volumes = [] for v in volumeList: if v.strip() != '': cmd = "python " + Globals.BACKEND_SCRIPT + "get_volumes.py " + v status,message = Utils.executeOnServer(str(server.name), cmd) totalNum += 1 volumes.append(v) if status == 0: weblog = xml.etree.ElementTree.fromstring(message) for entry in weblog.findall('status'): status = entry.text if status.strip().lower() == 'online': onlineNum += 1 clusterVolumeInfo = [] clusterVolumeInfo.append(onlineNum) clusterVolumeInfo.append(totalNum) clusterVolumeInfo.append(volumes) return clusterVolumeInfo
def operationServer(clusterName, serverName): code = None reval = None params = [] params.append(clusterName) params.append(serverName) status, clusterid, server_id = get_server(clusterName, serverName) if status == "-1": code, reval = "20052", "No cluster " + clusterName + "." elif status == "-2": code, reval = "20054", "server " + serverName + " is not in cluster " + clusterName elif Utils.isOnline(serverName) == False: code, reval = "22008", "Server " + serverName + " is not online" if code is not None: result = Utils.errorCode(code, reval, params) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result) try: data = web.input() operationName = data.operation if operationName == "mount": commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_setup.sh " + serverName status, message = Utils.executeOnServer(serverName, commandWithArgs) return "" elif operationName == "umount": commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_teardown.sh " + serverName status, message = Utils.executeOnServer(serverName, commandWithArgs) return "" elif operationName == "remount": commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_teardown.sh " + serverName status, message = Utils.executeOnServer(serverName, commandWithArgs) commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_setup.sh " + serverName status, message = Utils.executeOnServer(serverName, commandWithArgs) return "" else: return "22200", "Error no such operation on server" except Exception, e: code, reval = "22201", "Error when operation a cluster:" + str(e)
def addBrick(clusterName, volumeName): try: data = web.input() serverName, code, reval = isPathExist(clusterName, volumeName, data) if code == 0: bricks = data.bricks bricks = bricks.replace(" ", ",") brickList = bricks.split(",") brickList = VolumeUtils.convertToIPAddr(brickList) bricks = "" for brick in brickList: bricks += brick + " " commandWithArgs = "gluster volume add-brick " + volumeName + " " + bricks status, message = Utils.executeOnServer(serverName, commandWithArgs) if status == 0: logger.info("Add bricks to volume[" + volumeName + "]") return "" else: code, reval = "23011", "Error when add a brick: " + message except Exception, e: code, reval = "23011", "Error when add a brick: " + str(e)
def getServer(clusterName, serverName): status, cluster_info, server_info = get_server(clusterName, serverName) code = None reval = None if status == "-1": code, reval = "20052", "No cluster " + clusterName elif status == "-2": code, reval = "20054", "No server " + serverName + " in cluster " + clusterName elif Utils.isOnline(serverName) == False: code, reval = "22008", "Server " + serverName + " is not online" if code is not None: result = Utils.errorCode(code, reval, []) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result) try: serverName = str(serverName) message = Globals.mc.get(serverName + "_server") if message is not None: logger.info("Get server[" + serverName + "]'s details from memcache:" + message) return message cmd = "python " + Globals.BACKEND_SCRIPT + "get_server_details.py" status, message = Utils.executeOnServer(serverName, cmd) if status == -1: code, reval = "26104", message elif status == -2: code, reval = "26059", "Error when using pub key to connect remote server " + serverName + "." + message elif status == 1: code, reval = "22002", "error when getting details from server " + serverName + "." + message if code is not None: result = Utils.errorCode(code, reval, []) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result) logger.info("Get server[" + serverName + "]'s details by executing get_server_details.py:" + message) return message except Exception, e: code, reval = "22002", "Error when getting servers list:" + str(e) result = Utils.errorCode(code, reval, []) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result)
def migrateBrick(clusterName, volumeName): autoCommit = False try: data = web.input() serverName, code, reval = isPathExist(clusterName, volumeName, data) if code == 0: source = data.source target = data.target server_dir = target.split(":") target = Utils.getIPByName(server_dir[0].strip()) + ":" + server_dir[1] commandWithArgs = "gluster volume replace-brick " + volumeName + " " + source + " " + target + " start" status, message = Utils.executeOnServer(serverName, commandWithArgs) if status != 0: code, reval = "23012", "Error when migrate a brick:" + message else: description = "Brick Migration on volume [" + volumeName + "] from [" + source + "] to [" + target + "]" reference = volumeName + "#" + source + "#" + target operation_id = 2 db.insert( "task_info", description=description, reference=reference, operation_id=operation_id, cluster_name=clusterName, ) autoCommit_str = data.autoCommit if autoCommit_str is not None: if autoCommit_str == "true": autoCommit = True else: autoCommit = False logger.info(description) return "" except Exception, e: if str(e) == "'autoCommit'": return "" code, reval = "23012", "Error when migrate a brick:" + str(e)
def isVolumeExist(serverName, volumeName): commandWithArgs = "gluster volume info " + volumeName status, message = Utils.executeOnServer(serverName, commandWithArgs) if status == 0: return True return False
def removeBrick(clusterName, volumeName): try: data = web.input() serverName, code, reval = isPathExist(clusterName, volumeName, data) dataLen = len(data) if code == 0: if dataLen == 1: bricks = data.bricks bricks = bricks.replace(",", " ") commandWithArgs = ( "gluster --mode=script volume remove-brick " + volumeName + " " + bricks + " " + " force" ) status, message = Utils.executeOnServer(serverName, commandWithArgs) if status != 0: code, reval = "23013", "Error where delete a brick" + message else: return "" elif dataLen == 2: deleteData = data.deleteData bricksInfo = data.bricks bricks = bricksInfo.replace(",", " ") commandWithArgs = ( "gluster --mode=script volume remove-brick " + volumeName + " " + bricks + " " + " force" ) status, message = Utils.executeOnServer(serverName, commandWithArgs) if status != 0: code, reval = "23013", "Error where delete a brick: " + message else: if deleteData == "true": bricks = bricksInfo.split(",") for brick in bricks: brickSplit = brick.split(":") brickServer = brickSplit[0] brickDir = brickSplit[1] commandWithArgs = "rm -rf " + brickDir status, message = Utils.executeOnServer(brickServer, commandWithArgs) if status != 0: code, reval = "23013", "Error where delete a brick: " + message break if status == 0: return "" else: return "" elif dataLen == 3: deleteData = data.deleteData bricksInfo = data.bricks bricks = bricksInfo.replace(",", " ") commandWithArgs = ( "gluster --mode=script volume remove-brick " + volumeName + " " + bricks + " " + " force" ) status, message = Utils.executeOnServer(serverName, commandWithArgs) if status != 0: code, reval = "23013", "Error where delete a brick: " + message else: if deleteData == "true": bricks = bricksInfo.split(",") for brick in bricks: brickSplit = brick.split(":") brickServer = brickSplit[0] brickDir = brickSplit[1] commandWithArgs = "rm -rf " + brickDir status, message = Utils.executeOnServer(brickServer, commandWithArgs) if status != 0: code, reval = "23013", "Error where delete a brick: " + message break if status == 0: return "" else: return "" else: code, reval = "30002", "Input data is too long " except Exception, e: code, reval = "23013", "Error where delete a brick: " + str(e)
def initCluster(clusterName): try: images = "" vms = "" vars = "" params = [] params.append(clusterName) cluster_id_info = db.select('cluster_info',where='name=$clusterName' ,what="id",vars=locals()) if len(cluster_id_info) == 0: code, reval = "20200", "Error "+clusterName+" not existed" raise ClusterException(code,reval,params) data = web.input() dirs = data.dirs data_info = dirs.split(',') count = 0 for dir in data_info: mkdir = dir.split(':') commandWithArgs = "mkdir -p " + mkdir[1] status,message = Utils.executeOnServer(mkdir[0],commandWithArgs) images = images + dir + "/neofs-images " vms = vms + dir + "/neofs-vms " vars = vars + dir + "/var-images " count = count + 1 if count % 2 != 0: code, reval = "21006", "the number of dirs is must be a multiple of 2" raise ClusterException(code,reval,params) cluster_id = cluster_id_info[0].id servers = getOnlineServer(cluster_id) serverName = servers[0] commandWithArgs = "gluster volume --mode=script create neofs-images replica 2 " + images status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21007", "Error when create volume [neofs-images]: "+message raise ClusterException(code,reval,params) db.insert('volume_info',name="neofs-images",cluster_id=cluster_id) commandWithArgs = "gluster volume --mode=script create neofs-vms replica 2 " + vms status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21008", "Error when create volume [neofs-vms]: "+message raise ClusterException(code,reval,params) db.insert('volume_info',name="neofs-vms",cluster_id=cluster_id) commandWithArgs = "gluster volume --mode=script create var-images replica 2 " + vars status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21009", "Error when create volume [var-images]: "+message raise ClusterException(code,reval,params) db.insert('volume_info',name="var-images",cluster_id=cluster_id) commandWithArgs = "gluster volume --mode=script start neofs-images " status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21010", "Error when start volume [neofs-images]: "+message raise ClusterException(code,reval,params) commandWithArgs = "gluster volume --mode=script start neofs-vms " status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21011", "Error when start volume [neofs-vms]: "+message raise ClusterException(code,reval,params) commandWithArgs = "gluster volume --mode=script start var-images " status,message = Utils.executeOnServer(serverName,commandWithArgs) if status != 0: code, reval = "21012", "Error when start volume [var-images]: "+message raise ClusterException(code,reval,params) server_name_info = db.select('server_info',where='cluster_id=$cluster_id' ,what="name",vars=locals()) for server in server_name_info: serverName = server.name commandWithArgs = "sh " + Globals.BACKEND_SCRIPT + "neofs_setup.sh " + serverName status,message = Utils.executeOnServer(serverName,commandWithArgs) db.update('cluster_info', where="name = $clusterName", init = '1' ,vars=locals()) logger.info("Init cluster[" + clusterName + "] successfully!") return '' except ClusterException,e: logger.error(e.reval) errorreturn (e.code,e.reval,e.params)
def getServers(clusterName, details="true"): code = None reval = None status, cluster_info, server_info = get_servers(clusterName) if status == "-1": code, reval = "20052", "No cluster " + clusterName + "." result = Utils.errorCode(code, reval, []) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result) if status == "-2": web.HTTPError(status="200 OK") logger.info("Servers list is None") return "<servers></servers>" try: responseDom = XmlHandler.ResponseXml() serversTag = responseDom.appendTagRoute("servers") if details.lower() != "true": for server in server_info: glusterServerTag = responseDom.createTag("glusterServer") glusterServerTag.appendChild(responseDom.createTag("name", server.name)) glusterServerTag.appendChild(responseDom.createTag("id", server.id)) serversTag.appendChild(glusterServerTag) web.HTTPError(status="200 OK") logger.info("Get servers's name list - 200 OK") return serversTag.toxml() else: retval = "" cmd = "python " + Globals.BACKEND_SCRIPT + "get_server_details.py 2>/dev/null" offline = [] for server in server_info: if Utils.isOnline(server.name) == False: offline.append(server.name) else: serverName = str(server.name) message = Globals.mc.get(serverName + "_server") if message is not None: retval += message else: status, message = Utils.executeOnServer(server.name, cmd) if status == -1: code, reval = "26104", message elif status == -2: code, reval = ( "26059", "Error when using pub key to connect remote server " + server.name + "." + message, ) elif status == 1: code, reval = ( "22002", "error when getting details from server " + server.name + "." + message, ) if code is not None: result = Utils.errorCode(code, reval, []) web.HTTPError(status="400 Bad Request", data="") logger.error(reval) return result retval += message result = "" if len(offline): for server in offline: serverxml = "<glusterServer><name>" + server + "</name><status>OFFLINE</status></glusterServer>" result += serverxml retval += result if (retval is not None) and (retval.strip() is not ""): web.HTTPError(status="200 OK") logger.info("Get servers's details info:" + retval) return "<servers>" + retval + "</servers>" except Exception, e: code, reval = "22002", "Error when getting servers list:" + str(e) result = Utils.errorCode(code, reval, []) logger.error(reval) raise web.HTTPError(status="400 Bad Request", data=result)
except: pass Globals.db.insert("server_info", name=serverName, cluster_id=clusterid) if status is not "0": web.HTTPError(status="400 Bad Request", data="") logger.error("Error when installing pubKey on server[" + serverName + "]: " + output) return Utils.errorCode(status, output, []) logger.info("Add the first server[" + serverName + "] to cluster[" + clusterName + "] successfully!") return "" status, output = Utils.installPubKey(serverName) if status is not "0": web.HTTPError(status="400 Bad Request", data="") logger.error("Error when installing pubKey on server[" + serverName + "]: " + output) return Utils.errorCode(status, output, []) server = server_info[0] status, output = Utils.executeOnServer(server.name, "gluster peer probe " + Utils.getIPByName(serverName)) if status == -1: code, reval = ( "26104", "error when connecting to remote host " + serverName + " from localhost " + server.name + "." + output, ) elif status == -2: code, reval = "26059", "Error when using pub key to connect remote server " + serverName + "." + output elif status == 1: code, reval = ( "22013", 'Error when executing "gluster peer probe ' + Utils.getIPByName(serverName) + '"' + output, ) if code is not None: params = [] params.append(clusterName)