From db7cfe193608ba3c1e45c1d5eb47e1f90b35384e Mon Sep 17 00:00:00 2001 From: Jorrit Schaap <schaap@astron.nl> Date: Fri, 24 Jun 2016 10:26:44 +0000 Subject: [PATCH] Task #9350: factored out diskusage in seperate module --- .gitattributes | 1 + .../StorageQueryService/CMakeLists.txt | 1 + .../StorageQueryService/diskusage.py | 79 +++++++++++++++++++ SAS/DataManagement/StorageQueryService/rpc.py | 13 ++- .../StorageQueryService/service.py | 44 +---------- 5 files changed, 93 insertions(+), 45 deletions(-) create mode 100644 SAS/DataManagement/StorageQueryService/diskusage.py diff --git a/.gitattributes b/.gitattributes index 914ea2e774d..404af8e4163 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4750,6 +4750,7 @@ SAS/DataManagement/DataManagementCommon/path.py -text SAS/DataManagement/StorageQueryService/CMakeLists.txt -text SAS/DataManagement/StorageQueryService/__init__.py -text SAS/DataManagement/StorageQueryService/config.py -text +SAS/DataManagement/StorageQueryService/diskusage.py -text SAS/DataManagement/StorageQueryService/rpc.py -text SAS/DataManagement/StorageQueryService/service.py -text SAS/DataManagement/StorageQueryService/storagequery -text diff --git a/SAS/DataManagement/StorageQueryService/CMakeLists.txt b/SAS/DataManagement/StorageQueryService/CMakeLists.txt index 1bf03b6fb94..a7f354d838c 100644 --- a/SAS/DataManagement/StorageQueryService/CMakeLists.txt +++ b/SAS/DataManagement/StorageQueryService/CMakeLists.txt @@ -10,6 +10,7 @@ set(_py_files config.py rpc.py service.py + diskusage.py ) python_install(${_py_files} DESTINATION lofar/sas/datamanagement/storagequery) diff --git a/SAS/DataManagement/StorageQueryService/diskusage.py b/SAS/DataManagement/StorageQueryService/diskusage.py new file mode 100644 index 00000000000..5d4abb47bfc --- /dev/null +++ b/SAS/DataManagement/StorageQueryService/diskusage.py @@ -0,0 +1,79 @@ +#!/usr/bin/python +# $Id$ + +import logging +import subprocess +import socket +from optparse import OptionParser +from lofar.common.util import humanreadablesize + +logger = logging.getLogger(__name__) + +def getDiskUsageForPath(path): + cmd = ['rbh-du', '-bd', path] + hostname = socket.gethostname() + if not 'mgmt0' in hostname: + cmd = ['ssh', '-AXt', 'lofarsys@mgmt01.cep4.control.lofar'] + cmd + logger.info(' '.join(cmd)) + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = proc.communicate() + + logger.info(out) + + if proc.returncode != 0: + logger.error(out) + return {'found': False, 'path': path, 'message': out} + + # example of out + # Using config file '/etc/robinhood.d/tmpfs/tmp_fs_mgr_basic.conf'. + # /data/projects/2016LOFAROBS/L522380 + # dir count:3906, size:16048128, spc_used:16052224 + # file count:17568, size:42274164368, spc_used:42327519232 + + #parse out + lines = [l.strip() for l in out.split('\n')] + file_line = next(l for l in lines if 'file count' in l) + if file_line: + parts = [p.strip() for p in file_line.split(',')] + partsDict = {p.split(':')[0].strip():p.split(':')[1].strip() for p in parts} + + result = {'found': True, 'disk_usage': None, 'path': path} + + if 'size' in partsDict: + result['disk_usage'] = int(partsDict['size']) + + if 'file count' in partsDict: + result['nr_of_files'] = int(partsDict['file count']) + + result['disk_usage_readable'] = humanreadablesize(result['disk_usage']) + logger.info('returning: %s' % result) + return result + + result = {'found': False, 'path': path } + +def main(): + # Check the invocation arguments + parser = OptionParser("%prog [options] <path>", + description='get disk usage for (cep4) path') + parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') + (options, args) = parser.parse_args() + + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', + level=logging.INFO if options.verbose else logging.WARN) + + if len(args) == 0: + parser.print_help() + exit(1) + + result = getDiskUsageForPath(args[0]) + + if result['found']: + print 'path %s' % result['path'] + print 'disk_usage %s %s' % (result['disk_usage'], result['disk_usage_readbale']) + print 'nr_of_files %s' % result['nr_of_files'] + else: + print result['message'] + exit(1) + +if __name__ == '__main__': + main() diff --git a/SAS/DataManagement/StorageQueryService/rpc.py b/SAS/DataManagement/StorageQueryService/rpc.py index 4839501c7d2..c96071c843a 100644 --- a/SAS/DataManagement/StorageQueryService/rpc.py +++ b/SAS/DataManagement/StorageQueryService/rpc.py @@ -41,6 +41,13 @@ def main(): with StorageQueryRPC(busname=options.busname, servicename=options.servicename, broker=options.broker) as rpc: result = rpc.getDiskUsageForOTDBId(options.otdb_id) - if 'disk_usage' in result: - result['disk_usage_readable'] = humanreadablesize(result['disk_usage']) - print result + if result['found']: + print 'path %s' % result['path'] + print 'disk_usage %s %s' % (result['disk_usage'], result['disk_usage_readable']) + print 'nr_of_files %s' % result['nr_of_files'] + else: + print result['message'] + exit(1) + +if __name__ == '__main__': + main() diff --git a/SAS/DataManagement/StorageQueryService/service.py b/SAS/DataManagement/StorageQueryService/service.py index 4424d48c850..497a82cea40 100644 --- a/SAS/DataManagement/StorageQueryService/service.py +++ b/SAS/DataManagement/StorageQueryService/service.py @@ -11,6 +11,7 @@ from lofar.common.util import waitForInterrupt from lofar.sas.datamanagement.common.messagehandler import MessageHandler from lofar.sas.datamanagement.common.config import CEP4_DATA_MOUNTPOINT +from lofar.sas.datamanagement.storagequery.diskusage import getDiskUsageForPath from lofar.sas.datamanagement.storagequery.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as RADB_BUSNAME from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as RADB_SERVICENAME @@ -41,51 +42,10 @@ class StorageQueryHandler(MessageHandler): def prepare_loop(self): pass - def getDiskUsageForPath(self, path): - cmd = ['rbh-du', '-bd', path] - hostname = socket.gethostname() - if not 'mgmt0' in hostname: - cmd = ['ssh', '-AXt', 'lofarsys@mgmt01.cep4.control.lofar'] + cmd - logger.info(' '.join(cmd)) - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = proc.communicate() - - logger.info(out) - - if proc.returncode != 0: - logger.error(err) - return {'found': False, 'path': path, 'message': err} - - # example of out - # Using config file '/etc/robinhood.d/tmpfs/tmp_fs_mgr_basic.conf'. - # /data/projects/2016LOFAROBS/L522380 - # dir count:3906, size:16048128, spc_used:16052224 - # file count:17568, size:42274164368, spc_used:42327519232 - - #parse out - lines = [l.strip() for l in out.split('\n')] - file_line = next(l for l in lines if 'file count' in l) - if file_line: - parts = [p.strip() for p in file_line.split(',')] - partsDict = {p.split(':')[0].strip():p.split(':')[1].strip() for p in parts} - - results = {'found': True, 'disk_usage': None, 'path': path} - - if 'size' in partsDict: - results['disk_usage'] = int(partsDict['size']) - - if 'file count' in partsDict: - results['nr_of_files'] = int(partsDict['file count']) - - logger.info('returning: %s' % results) - return results - - results = {'found': False, 'path': path } - def getDiskUsageForOTDBId(self, otdb_id): result = self.path_resolver.getPathForOTDBId(otdb_id) if result['found']: - return self.getDiskUsageForPath(result['path']) + return getDiskUsageForPath(result['path']) return {'found': False, 'path': result['path']} -- GitLab