dashboard: refactor VmGraphView
Showing
| ... | ... | @@ -158,6 +158,7 @@ class VmDetailView(CheckedDetailView): |
| 'port': port}, | ||
| key=getenv("PROXY_SECRET", 'asdasd')), | ||
| context.update({ | ||
| 'graphite_enabled': VmGraphView.get_graphite_url() is not None, | ||
| 'vnc_url': '%s' % value | ||
| }) | ||
| ... | ... | @@ -1569,45 +1570,70 @@ class TransferOwnershipConfirmView(LoginRequiredMixin, View): |
| return (instance, new_owner) | ||
| class VmGraphView(LoginRequiredMixin, View): | ||
| def get(self, request, pk, metric, time, *args, **kwargs): | ||
| class GraphViewBase(LoginRequiredMixin, View): | ||
| metrics = { | ||
| 'cpu': ('cactiStyle(alias(derivative(%s.cpu.usage),' | ||
| '"cpu usage (%%)"))'), | ||
| 'memory': ('cactiStyle(alias(%s.memory.usage,' | ||
| '"memory usage (%%)"))'), | ||
| 'network': ('cactiStyle(aliasByMetric(' | ||
| 'derivative(%s.network.bytes_*)))'), | ||
| } | ||
| @staticmethod | ||
| def get_graphite_url(): | ||
| graphite_host = getenv("GRAPHITE_HOST", None) | ||
| graphite_port = getenv("GRAPHITE_PORT", None) | ||
| if (graphite_host in ['', None] or graphite_port in ['', None]): | ||
Please
register
or
sign in
to reply
|
||
| logger.debug('GRAPHITE_HOST is empty.') | ||
| return None | ||
| return 'http://%s:%s' % (graphite_host, graphite_port) | ||
|
||
| def get(self, request, pk, metric, time, *args, **kwargs): | ||
| graphite_url = GraphViewBase.get_graphite_url() | ||
| if graphite_url is None: | ||
| raise Http404() | ||
| if metric not in ['cpu', 'memory', 'network']: | ||
| if metric not in self.metrics.keys(): | ||
| raise SuspiciousOperation() | ||
| try: | ||
| instance = Instance.objects.get(id=pk) | ||
| except Instance.DoesNotExist: | ||
| instance = self.get_object(request, pk) | ||
| except self.model.DoesNotExist: | ||
| raise Http404() | ||
| if not instance.has_level(request.user, 'user'): | ||
| raise PermissionDenied() | ||
| targets = { | ||
| 'cpu': ('cactiStyle(alias(derivative(%s.cpu.usage),' | ||
| '"cpu usage (%%)"))'), | ||
| 'memory': ('cactiStyle(alias(%s.memory.usage,' | ||
| '"memory usage (%%)"))'), | ||
| 'network': ('cactiStyle(aliasByMetric(' | ||
| 'derivative(%s.network.bytes_*)))'), | ||
| } | ||
| if metric not in targets.keys(): | ||
| raise SuspiciousOperation() | ||
| prefix = 'vm.%s' % instance.vm_name | ||
| target = targets[metric] % prefix | ||
| title = '%s (%s) - %s' % (instance.name, instance.vm_name, metric) | ||
| prefix = self.get_prefix(instance) | ||
| target = self.metrics[metric] % prefix | ||
| title = self.get_title(instance, metric) | ||
| params = {'target': target, | ||
| 'from': '-%s' % time, | ||
| 'title': title.encode('UTF-8'), | ||
| 'width': '500', | ||
| 'height': '200'} | ||
| url = ('http://%s:%s/render/?%s' % (graphite_host, graphite_port, | ||
| params)) | ||
| response = requests.post(url, data=params) | ||
| response = requests.post('%s/render/' % graphite_url, data=params) | ||
| return HttpResponse(response.content, mimetype="image/png") | ||
| def get_prefix(self, instance): | ||
| raise NotImplementedError("Subclass must implement abstract method") | ||
| def get_title(self, instance, metric): | ||
| raise NotImplementedError("Subclass must implement abstract method") | ||
| def get_object(self, request, pk): | ||
| instance = self.model.objects.get(id=pk) | ||
| if not instance.has_level(request.user, 'user'): | ||
| raise PermissionDenied() | ||
| return instance | ||
| class VmGraphView(GraphViewBase): | ||
| model = Instance | ||
| def get_prefix(self, instance): | ||
| return 'vm.%s' % instance.vm_name | ||
| def get_title(self, instance, metric): | ||
| return '%s (%s) - %s' % (instance.name, instance.vm_name, metric) | ||