blob: 632474503a058f016ddb4a93e68e2beb56a81480 [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()
Srikanth Vavilapalli1dfc9c82016-12-20 02:58:32 +000039 backend_status = ReadOnlyField()
Scott Baker31acc652016-06-23 15:47:56 -070040 service_specific_attribute = ReadOnlyField()
41 ceilometer_url = ReadOnlyField()
42 tenant_list_str = ReadOnlyField()
43 #creator = ReadOnlyField()
44 #instance = ReadOnlyField()
45 provider_service = serializers.PrimaryKeyRelatedField(queryset=CeilometerService.get_service_objects().all(), default=get_default_ceilometer_service)
46
47 humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
48 related = serializers.DictField(required=False)
49
50 #computeNodeName = serializers.SerializerMethodField("getComputeNodeName")
51
52 class Meta:
53 model = MonitoringChannelForAPI
Srikanth Vavilapalli1dfc9c82016-12-20 02:58:32 +000054 fields = ('humanReadableName', 'id', 'backend_status', 'provider_service', 'service_specific_attribute', 'ceilometer_url', 'tenant_list_str', 'related' )
Scott Baker31acc652016-06-23 15:47:56 -070055
56 def getHumanReadableName(self, obj):
57 return obj.__unicode__()
58
59 #def getComputeNodeName(self, obj):
60 # instance = obj.instance
61 # if not instance:
62 # return None
63 # return instance.node.name
64
65class MonitoringChannelSet(XOSViewSet):
66 base_name = "monitoringchannel"
67 method_name = "monitoringchannel"
68 method_kind = "viewset"
69 queryset = MonitoringChannelForAPI.get_tenant_objects().all()
70 serializer_class = MonitoringChannelSerializer
71
72 def get_queryset(self):
73 queryset = MonitoringChannelForAPI.get_tenant_objects().all()
74
75 current_user = self.request.user.username
76 if current_user is not None:
77 ids = [x.id for x in queryset if x.creator.username==current_user]
78 queryset = queryset.filter(id__in=ids)
79
80 return queryset
81
82 def create(self, request):
83 current_user = request.user.username
84 existing_obj = None
85 for obj in MonitoringChannelForAPI.get_tenant_objects().all():
86 if (obj.creator.username == current_user):
87 existing_obj = obj
88 break
89
90 if existing_obj:
91 serializer = MonitoringChannelSerializer(existing_obj)
92 headers = self.get_success_headers(serializer.data)
93 return Response( serializer.data, status=status.HTTP_200_OK )
94
95 return super(MonitoringChannelSet, self).create(request)