def volumeCreate(volumeName, brickList, replicaCount=0, stripeCount=0, transportList=[], force=False): command = _getGlusterVolCmd() + ["create", volumeName] if stripeCount: command += ["stripe", "%s" % stripeCount] if replicaCount: command += ["replica", "%s" % replicaCount] if transportList: command += ["transport", ','.join(transportList)] command += brickList if force: command.append('force') try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterVolumeCreateFailedException(rc=e.rc, err=e.err) try: return {'uuid': xmltree.find('volCreate/volume/id').text} except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def volumeInfo(volumeName=None, remoteServer=None): """ Returns: {VOLUMENAME: {'brickCount': BRICKCOUNT, 'bricks': [BRICK1, BRICK2, ...], 'options': {OPTION: VALUE, ...}, 'transportType': [TCP,RDMA, ...], 'uuid': UUID, 'volumeName': NAME, 'volumeStatus': STATUS, 'volumeType': TYPE}, ...} """ command = _getGlusterVolCmd() + ["info"] if remoteServer: command += ['--remote-host=%s' % remoteServer] if volumeName: command.append(volumeName) try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterVolumesListFailedException(rc=e.rc, err=e.err) try: return _parseVolumeInfo(xmltree) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def snapshotRestore(snapName): command = _getGlusterSnapshotCmd() + ["restore", snapName] try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterSnapshotRestoreFailedException(rc=e.rc, err=e.err) try: return _parseRestoredSnapshot(xmltree) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def _execGlusterXml(cmd): cmd.append('--xml') rc, out, err = utils.execCmd(cmd) if rc != 0: raise ge.GlusterCmdExecFailedException(rc, out, err) try: tree = etree.fromstring('\n'.join(out)) rv = int(tree.find('opRet').text) msg = tree.find('opErrstr').text except _etreeExceptions: raise ge.GlusterXmlErrorException(err=out) if rv == 0: return tree else: raise ge.GlusterCmdFailedException(rc=rv, err=[msg])
def peerStatus(): """ Returns: [{'hostname': HOSTNAME, 'uuid': UUID, 'status': STATE}, ...] """ command = _getGlusterPeerCmd() + ["status"] try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterHostsListFailedException(rc=e.rc, err=e.err) try: return _parsePeerStatus(xmltree, _getLocalIpAddress() or _getGlusterHostName(), hostUUIDGet(), HostStatus.CONNECTED) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def snapshotCreate(volumeName, snapName, snapDescription=None, force=False): command = _getGlusterSnapshotCmd() + ["create", snapName, volumeName] if snapDescription: command += ['description', snapDescription] if force: command.append('force') try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterSnapshotCreateFailedException(rc=e.rc, err=e.err) try: return {'uuid': xmltree.find('snapCreate/snapshot/uuid').text} except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def volumeGeoRepStatus(volumeName=None, remoteHost=None, remoteVolumeName=None, detail=False): command = _getGlusterVolGeoRepCmd() if volumeName: command.append(volumeName) if remoteHost and remoteVolumeName: command.append("%s::%s" % (remoteHost, remoteVolumeName)) command.append("status") if detail: command.append("detail") try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterGeoRepStatusFailedException(rc=e.rc, err=e.err) try: return _parseGeoRepStatus(xmltree, detail) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def volumeGeoRepConfig(volumeName, remoteHost, remoteVolumeName, optionName=None, optionValue=None): command = _getGlusterVolGeoRepCmd() + [ volumeName, "%s::%s" % (remoteHost, remoteVolumeName), "config" ] if optionName and optionValue: command += [optionName, optionValue] elif optionName: command += ["!%s" % optionName] try: xmltree = _execGlusterXml(command) if optionName: return True except ge.GlusterCmdFailedException as e: raise ge.GlusterGeoRepConfigFailedException(rc=e.rc, err=e.err) try: return _parseVolumeGeoRepConfig(xmltree) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def volumeStatus(volumeName, brick=None, option=None): """ Get volume status Arguments: * VolumeName * brick * option = 'detail' or 'clients' or 'mem' or None Returns: When option=None, {'name': NAME, 'bricks': [{'brick': BRICK, 'hostuuid': UUID, 'port': PORT, 'status': STATUS, 'pid': PID}, ...], 'nfs': [{'hostname': HOST, 'hostuuid': UUID, 'port': PORT, 'status': STATUS, 'pid': PID}, ...], 'shd: [{'hostname': HOST, 'hostuuid': UUID, 'status': STATUS, 'pid': PID}, ...]} When option='detail', {'name': NAME, 'bricks': [{'brick': BRICK, 'hostuuid': UUID, 'sizeTotal': SIZE, 'sizeFree': FREESIZE, 'device': DEVICE, 'blockSize': BLOCKSIZE, 'mntOptions': MOUNTOPTIONS, 'fsName': FSTYPE}, ...]} When option='clients': {'name': NAME, 'bricks': [{'brick': BRICK, 'hostuuid': UUID, 'clientsStatus': [{'hostname': HOST, 'bytesRead': BYTESREAD, 'bytesWrite': BYTESWRITE}, ...]}, ...]} When option='mem': {'name': NAME, 'bricks': [{'brick': BRICK, 'hostuuid': UUID, 'mallinfo': {'arena': int, 'fordblks': int, 'fsmblks': int, 'hblkhd': int, 'hblks': int, 'keepcost': int, 'ordblks': int, 'smblks': int, 'uordblks': int, 'usmblks': int}, 'mempool': [{'allocCount': int, 'coldCount': int, 'hotCount': int, 'maxAlloc': int, 'maxStdAlloc': int, 'name': NAME, 'padddedSizeOf': int, 'poolMisses': int},...]}, ...]} """ command = _getGlusterVolCmd() + ["status", volumeName] if brick: command.append(brick) if option: command.append(option) try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterVolumeStatusFailedException(rc=e.rc, err=e.err) try: if option == 'detail': return _parseVolumeStatusDetail(xmltree) elif option == 'clients': return _parseVolumeStatusClients(xmltree) elif option == 'mem': return _parseVolumeStatusMem(xmltree) else: return _parseVolumeStatus(xmltree) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
def volumeProfileInfo(volumeName, nfs=False): """ Returns: When nfs=True: {'volumeName': VOLUME-NAME, 'nfsServers': [ {'nfs': SERVER-NAME, 'cumulativeStats': {'blockStats': [{'size': int, 'read': int, 'write': int}, ...], 'fopStats': [{'name': FOP-NAME, 'hits': int, 'latencyAvg': float, 'latencyMin': float, 'latencyMax': float}, ...], 'duration': int, 'totalRead': int, 'totalWrite': int}, 'intervalStats': {'blockStats': [{'size': int, 'read': int, 'write': int}, ...], 'fopStats': [{'name': FOP-NAME, 'hits': int, 'latencyAvg': float, 'latencyMin': float, 'latencyMax': float}, ...], 'duration': int, 'totalRead': int, 'totalWrite': int}}, ...]} When nfs=False: {'volumeName': VOLUME-NAME, 'bricks': [ {'brick': BRICK-NAME, 'cumulativeStats': {'blockStats': [{'size': int, 'read': int, 'write': int}, ...], 'fopStats': [{'name': FOP-NAME, 'hits': int, 'latencyAvg': float, 'latencyMin': float, 'latencyMax': float}, ...], 'duration': int, 'totalRead': int, 'totalWrite': int}, 'intervalStats': {'blockStats': [{'size': int, 'read': int, 'write': int}, ...], 'fopStats': [{'name': FOP-NAME, 'hits': int, 'latencyAvg': float, 'latencyMin': float, 'latencyMax': float}, ...], 'duration': int, 'totalRead': int, 'totalWrite': int}}, ...]} """ command = _getGlusterVolCmd() + ["profile", volumeName, "info"] if nfs: command += ["nfs"] try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException as e: raise ge.GlusterVolumeProfileInfoFailedException(rc=e.rc, err=e.err) try: return _parseVolumeProfileInfo(xmltree, nfs) except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)])
@makePublic def volumeRebalanceStart(volumeName, rebalanceType="", force=False): command = _getGlusterVolCmd() + ["rebalance", volumeName] if rebalanceType: command.append(rebalanceType) command.append("start") if force: command.append("force") try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException, e: raise ge.GlusterVolumeRebalanceStartFailedException(rc=e.rc, err=e.err) try: return {'taskId': xmltree.find('volRebalance/task-id').text} except _etreeExceptions: raise ge.GlusterXmlErrorException(err=[etree.tostring(xmltree)]) @makePublic def volumeRebalanceStop(volumeName, force=False): command = _getGlusterVolCmd() + ["rebalance", volumeName, "stop"] if force: command.append('force') try: xmltree = _execGlusterXml(command) except ge.GlusterCmdFailedException, e: raise ge.GlusterVolumeRebalanceStopFailedException(rc=e.rc, err=e.err) try: return _parseVolumeRebalanceRemoveBrickStatus(xmltree, 'rebalance') except _etreeExceptions: