/ cabot / rest_urls.py
rest_urls.py
  1  from django.db import models as model_fields
  2  from django.conf import settings
  3  from django.conf.urls import url, include
  4  from django.contrib.auth import models as django_models
  5  
  6  from polymorphic.models import PolymorphicModel
  7  from cabot.cabotapp import models, alert
  8  from rest_framework import routers, serializers, viewsets, mixins
  9  import logging
 10  
 11  logger = logging.getLogger(__name__)
 12  router = routers.DefaultRouter()
 13  
 14  
 15  def create_viewset(arg_model, arg_fields, arg_read_only_fields=(), readonly=False):
 16      arg_read_only_fields = ('id',) + arg_read_only_fields
 17      for field in arg_read_only_fields:
 18          if field not in arg_fields:
 19              arg_fields = arg_fields + (field,)
 20  
 21      class Serializer(serializers.ModelSerializer):
 22          class Meta:
 23              model = arg_model
 24              fields = arg_fields
 25              read_only_fields = arg_read_only_fields
 26  
 27      viewset_class = None
 28      if readonly:
 29          viewset_class = viewsets.ReadOnlyModelViewSet
 30      else:
 31          viewset_class = viewsets.ModelViewSet
 32  
 33      class ViewSet(viewset_class):
 34          queryset = arg_model.objects
 35          serializer_class = Serializer
 36          ordering = ['id']
 37          filter_fields = arg_fields
 38  
 39      return ViewSet
 40  
 41  check_group_mixin_fields = (
 42      'name',
 43      'users_to_notify',
 44      'alerts_enabled',
 45      'status_checks',
 46      'alerts',
 47      'hackpad_id',
 48  )
 49  
 50  router.register(r'services', create_viewset(
 51      arg_model=models.Service,
 52      arg_fields=check_group_mixin_fields + (
 53          'url',
 54          'instances',
 55          'overall_status',
 56          'is_public',
 57      ),
 58  ))
 59  
 60  router.register(r'instances', create_viewset(
 61      arg_model=models.Instance,
 62      arg_fields=check_group_mixin_fields + (
 63          'address',
 64          'overall_status',
 65      ),
 66  ))
 67  
 68  status_check_fields = (
 69      'name',
 70      'active',
 71      'importance',
 72      'frequency',
 73      'debounce',
 74      'calculated_status',
 75  )
 76  
 77  router.register(r'status_checks', create_viewset(
 78      arg_model=models.StatusCheck,
 79      arg_fields=status_check_fields,
 80      readonly=True,
 81  ))
 82  
 83  router.register(r'icmp_checks', create_viewset(
 84      arg_model=models.ICMPStatusCheck,
 85      arg_fields=status_check_fields,
 86  ))
 87  
 88  router.register(r'graphite_checks', create_viewset(
 89      arg_model=models.GraphiteStatusCheck,
 90      arg_fields=status_check_fields + (
 91          'metric',
 92          'check_type',
 93          'value',
 94          'expected_num_hosts',
 95          'allowed_num_failures',
 96      ),
 97  ))
 98  
 99  router.register(r'http_checks', create_viewset(
100      arg_model=models.HttpStatusCheck,
101      arg_fields=status_check_fields + (
102          'endpoint',
103          'username',
104          'password',
105          'text_match',
106          'status_code',
107          'timeout',
108          'verify_ssl_certificate',
109      ),
110  ))
111  
112  router.register(r'jenkins_checks', create_viewset(
113      arg_model=models.JenkinsStatusCheck,
114      arg_fields=status_check_fields + (
115          'max_queued_build_time',
116          'jenkins_config',
117      ),
118  ))
119  
120  # User API is off by default, could expose/allow modifying dangerous fields
121  if settings.EXPOSE_USER_API:
122      router.register(r'users', create_viewset(
123          arg_model=django_models.User,
124          arg_fields=(
125              'password',
126              'is_active',
127              'groups',
128              #'user_permissions', # Doesn't work, removing for now
129              'username',
130              'first_name',
131              'last_name',
132              'email',
133          ),
134      ))
135  
136      router.register(r'user_profiles', create_viewset(
137          arg_model=models.UserProfile,
138          arg_fields=(
139              'user',
140              'fallback_alert_user',
141          ),
142      ))
143  
144  
145  router.register(r'shifts', create_viewset(
146      arg_model=models.Shift,
147      arg_fields=(
148          'start',
149          'end',
150          'user',
151          'uid',
152          'deleted',
153      )
154  ))
155  
156  router.register(r'alertplugins', create_viewset(
157      arg_model=alert.AlertPlugin,
158      arg_fields=(
159              'title',
160          ),
161      readonly=True
162      ))