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