blob: 8385c400d4b5b534711400d77e4d4e607a3ad607 [file] [log] [blame]
Scott Baker31acc652016-06-23 15:47:56 -07001from rest_framework.decorators import api_view
2from rest_framework.response import Response
3from rest_framework.reverse import reverse
4from rest_framework import serializers
5from rest_framework import generics
6from rest_framework import status
7from core.models import *
8from django.forms import widgets
9from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
10from api.xosapi_helpers import PlusModelSerializer, XOSViewSet, ReadOnlyField
11
Srikanth Vavilapallid84b7b72016-06-28 00:19:07 +000012from services.monitoring.models import MonitoringChannel, CeilometerService
Scott Baker31acc652016-06-23 15:47:56 -070013
14def get_default_ceilometer_service():
15 ceilometer_services = CeilometerService.get_service_objects().all()
16 if ceilometer_services:
17 return ceilometer_services[0].id
18 return None
19
20class MonitoringChannelForAPI(MonitoringChannel):
21 class Meta:
22 proxy = True
23 app_label = "ceilometer"
24
25 @property
26 def related(self):
27 related = {}
28 if self.creator:
29 related["creator"] = self.creator.username
30 if self.instance:
31 related["instance_id"] = self.instance.id
32 related["instance_name"] = self.instance.name
33 if self.instance.node:
34 related["compute_node_name"] = self.instance.node.name
35 return related
36
37class MonitoringChannelSerializer(PlusModelSerializer):
38 id = ReadOnlyField()
39 service_specific_attribute = ReadOnlyField()
40 ceilometer_url = ReadOnlyField()
41 tenant_list_str = ReadOnlyField()
42 #creator = ReadOnlyField()
43 #instance = ReadOnlyField()
44 provider_service = serializers.PrimaryKeyRelatedField(queryset=CeilometerService.get_service_objects().all(), default=get_default_ceilometer_service)
45
46 humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
47 related = serializers.DictField(required=False)
48
49 #computeNodeName = serializers.SerializerMethodField("getComputeNodeName")
50
51 class Meta:
52 model = MonitoringChannelForAPI
53 fields = ('humanReadableName', 'id', 'provider_service', 'service_specific_attribute', 'ceilometer_url', 'tenant_list_str', 'related' )
54
55 def getHumanReadableName(self, obj):
56 return obj.__unicode__()
57
58 #def getComputeNodeName(self, obj):
59 # instance = obj.instance
60 # if not instance:
61 # return None
62 # return instance.node.name
63
64class MonitoringChannelSet(XOSViewSet):
65 base_name = "monitoringchannel"
66 method_name = "monitoringchannel"
67 method_kind = "viewset"
68 queryset = MonitoringChannelForAPI.get_tenant_objects().all()
69 serializer_class = MonitoringChannelSerializer
70
71 def get_queryset(self):
72 queryset = MonitoringChannelForAPI.get_tenant_objects().all()
73
74 current_user = self.request.user.username
75 if current_user is not None:
76 ids = [x.id for x in queryset if x.creator.username==current_user]
77 queryset = queryset.filter(id__in=ids)
78
79 return queryset
80
81 def create(self, request):
82 current_user = request.user.username
83 existing_obj = None
84 for obj in MonitoringChannelForAPI.get_tenant_objects().all():
85 if (obj.creator.username == current_user):
86 existing_obj = obj
87 break
88
89 if existing_obj:
90 serializer = MonitoringChannelSerializer(existing_obj)
91 headers = self.get_success_headers(serializer.data)
92 return Response( serializer.data, status=status.HTTP_200_OK )
93
94 return super(MonitoringChannelSet, self).create(request)