From 0a8c0aa1df2c1a26841f5150eff640c68d777481 Mon Sep 17 00:00:00 2001 From: Thanathip Limna Date: Thu, 7 Aug 2014 15:04:41 +0700 Subject: [PATCH] add processor resource monitor --- nokkhumapi/routing.py | 2 + nokkhumapi/views/admin/processors.py | 93 +++++++++++++++++++--------- setup.py | 3 +- 3 files changed, 67 insertions(+), 31 deletions(-) diff --git a/nokkhumapi/routing.py b/nokkhumapi/routing.py index d084c2f..1e01765 100644 --- a/nokkhumapi/routing.py +++ b/nokkhumapi/routing.py @@ -26,6 +26,8 @@ def admin_include(config): '/processors/{processor_id}') config.add_route('admin.processors.operating', '/processors/{processor_id}/operating') + config.add_route('admin.processors.resources', + '/processors/{processor_id}/resources') config.add_route('admin.processor_commands.list', '/processor_commands') diff --git a/nokkhumapi/views/admin/processors.py b/nokkhumapi/views/admin/processors.py index 0adbdc4..7e4aa68 100644 --- a/nokkhumapi/views/admin/processors.py +++ b/nokkhumapi/views/admin/processors.py @@ -5,18 +5,22 @@ ''' from pyramid.view import view_defaults from pyramid.view import view_config +from dateutil import tz from nokkhumapi import models -@view_defaults(route_name='admin.processors', permission='role:admin', renderer='json') + +@view_defaults(route_name='admin.processors', + permission='role:admin', + renderer='json') class Processor: def __init__(self, request): self.request = request - + def build_result(self, processor): if processor is None: return None - + processor_operating=dict( user_command=processor.operating.user_command, status=processor.operating.status, @@ -33,27 +37,27 @@ def build_result(self, processor): processor_operating['compute_node']['name'] = 'Unavailable' result = dict( - id=processor.id, - name=processor.name, - storage_period=processor.storage_period, - image_processors=processor.image_processors, - created_date=processor.created_date, - updated_date=processor.updated_date, - status=processor.status, - project=dict( - id=processor.project.id, - name=processor.project.name - ), - owner=dict( - id=processor.owner.id, -# email=processor.owner.email - ), - cameras=[dict(id=camera.id, name=camera.name) for camera in processor.cameras], - processor_operating=processor_operating - ) + id=processor.id, + name=processor.name, + storage_period=processor.storage_period, + image_processors=processor.image_processors, + created_date=processor.created_date, + updated_date=processor.updated_date, + status=processor.status, + project=dict( + id=processor.project.id, + name=processor.project.name + ), + owner=dict( + id=processor.owner.id, + # email=processor.owner.email + ), + cameras=[dict(id=camera.id, name=camera.name) for camera in processor.cameras], + processor_operating=processor_operating + ) # print('result:', result) return result - + @view_config(route_name='admin.processors.list', request_method='GET') def list_processor(self): if 'user_id' in self.request.GET: @@ -61,22 +65,51 @@ def list_processor(self): processors = models.Processor.objects(owner=user, status='active').order_by('-operating__updated_date').all() else: processors = models.Processor.objects(status='active').order_by('-operating__updated_date').all() - + result = dict( processors=[ self.build_result(processor) for processor in processors - ] + ] ) - + return result - + @view_config(request_method='GET') def get(self): processor_id = self.request.matchdict['processor_id'] processor = models.Processor.objects().with_id(processor_id) - + result = dict( - processor=self.build_result(processor) + processor=self.build_result(processor) ) - - return result \ No newline at end of file + + return result + + @view_config(route_name='admin.processors.resources', + permission='admin', + request_method='GET') + def get_resources(self): + matchdict = self.request.matchdict + processor_id = matchdict['processor_id'] + + processor = models.Processor.objects.with_id(processor_id) + + processor_status = models.ProcessorStatus.objects(processor=processor)\ + .order_by('-id')\ + .limit(30) + + ctz = tz.tzlocal() + resources = [ + dict( + cpu=p.cpu, + memory=p.memory, + threads=p.threads, + reported_date=p.reported_date.replace(tzinfo=ctz) + ) for p in processor_status + ] + + resources.reverse() + + return dict( + resources=resources + ) \ No newline at end of file diff --git a/setup.py b/setup.py index 9100baa..93f385f 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,8 @@ 'waitress', 'mongoengine', 'pycrypto', - 'boto' + 'boto', + 'dateutils' ] setup(name='nokkhum-api',