blob: cb37ec46ff5805a292d6d2fc412c4a103342d5c2 [file] [log] [blame]
Scott Bakerfb9544a2016-03-25 10:55:03 -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 viewsets
7from rest_framework.decorators import detail_route, list_route
8from rest_framework.views import APIView
9from core.models import *
10from django.forms import widgets
11from django.conf.urls import patterns, url
12from services.cord.models import VOLTTenant, VBNGTenant, CordSubscriberRoot
Scott Baker12d71082016-03-28 13:23:20 -070013from api.xosapi_helpers import PlusSerializerMixin, XOSViewSet, ReadOnlyField
Scott Bakerfb9544a2016-03-25 10:55:03 -070014from django.shortcuts import get_object_or_404
15from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
16from xos.exceptions import *
17import json
18import subprocess
Scott Baker12d71082016-03-28 13:23:20 -070019from django.views.decorators.csrf import ensure_csrf_cookie
Scott Bakerfb9544a2016-03-25 10:55:03 -070020
Scott Baker12d71082016-03-28 13:23:20 -070021class CordSubscriberNew(CordSubscriberRoot):
22 class Meta:
23 proxy = True
24 app_label = "cord"
Scott Bakerfb9544a2016-03-25 10:55:03 -070025
Scott Baker12d71082016-03-28 13:23:20 -070026 def __init__(self, *args, **kwargs):
27 super(CordSubscriberNew, self).__init__(*args, **kwargs)
28
29 def __unicode__(self):
30 return u"cordSubscriber-%s" % str(self.id)
31
32 @property
33 def features(self):
34 return {"cdn": self.cdn_enable,
35 "uplink_speed": self.uplink_speed,
36 "downlink_speed": self.downlink_speed,
37 "uverse": self.enable_uverse,
38 "status": self.status}
39
40 @features.setter
41 def features(self, value):
42 self.cdn_enable = value.get("cdn", self.get_default_attribute("cdn_enable"))
43 self.uplink_speed = value.get("uplink_speed", self.get_default_attribute("uplink_speed"))
44 self.downlink_speed = value.get("downlink_speed", self.get_default_attribute("downlink_speed"))
45 self.enable_uverse = value.get("uverse", self.get_default_attribute("enable_uverse"))
46 self.status = value.get("status", self.get_default_attribute("status"))
47
Scott Bakerc4200f92016-03-28 15:07:36 -070048 def update_features(self, value):
49 d=self.features
50 d.update(value)
51 self.features = d
52
Scott Baker85f2cd32016-03-28 16:23:53 -070053 @property
54 def identity(self):
55 return {"account_num": self.service_specific_id}
56
57 @identity.setter
58 def identity(self, value):
59 self.service_specific_id = value.get("account_num", "")
60
61 def update_identity(self, value):
62 d=self.identity
63 d.update(value)
64 self.identity = d
65
66 @property
67 def related(self):
68 related = {}
69 if self.volt:
70 related["volt_id"] = self.volt.id
71 related["s_tag"] = self.volt.s_tag
72 related["c_tag"] = self.volt.c_tag
73 if self.volt.vcpe:
74 related["vsg_id"] = self.volt.vcpe.id
75 if self.volt.vcpe.instance:
76 related["instance_id"] = self.volt.vcpe.instance.id
77 related["instance_name"] = self.volt.vcpe.instance.name
78 related["wan_container_ip"] = self.volt.vcpe.wan_container_ip
79 return related
80
Scott Baker12d71082016-03-28 13:23:20 -070081 def save(self, *args, **kwargs):
82 super(CordSubscriberNew, self).save(*args, **kwargs)
83
Scott Bakerc4200f92016-03-28 15:07:36 -070084class FeatureSerializer(serializers.Serializer):
85 cdn = serializers.BooleanField(required=False)
86 uplink_speed = serializers.IntegerField(required=False)
87 downlink_speed = serializers.IntegerField(required=False)
88 uverse = serializers.BooleanField(required=False)
89 status = serializers.CharField(required=False)
Scott Baker12d71082016-03-28 13:23:20 -070090
Scott Baker85f2cd32016-03-28 16:23:53 -070091class IdentitySerializer(serializers.Serializer):
92 account_num = serializers.CharField(required=False)
93
Scott Baker12d71082016-03-28 13:23:20 -070094class CordSubscriberSerializer(serializers.ModelSerializer, PlusSerializerMixin):
Scott Bakerfb9544a2016-03-25 10:55:03 -070095 id = ReadOnlyField()
Scott Bakerfb9544a2016-03-25 10:55:03 -070096 humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
Scott Baker85f2cd32016-03-28 16:23:53 -070097 features = FeatureSerializer()
98 identity = IdentitySerializer()
99 related = serializers.DictField(required=False)
Scott Bakerfb9544a2016-03-25 10:55:03 -0700100
101 class Meta:
Scott Baker12d71082016-03-28 13:23:20 -0700102 model = CordSubscriberNew
103 fields = ('humanReadableName',
104 'id',
Scott Baker85f2cd32016-03-28 16:23:53 -0700105 'features',
106 'identity',
107 'related')
Scott Bakerfb9544a2016-03-25 10:55:03 -0700108
109 def getHumanReadableName(self, obj):
110 return obj.__unicode__()
111
Scott Baker12d71082016-03-28 13:23:20 -0700112# @ensure_csrf_cookie
Scott Bakerfb9544a2016-03-25 10:55:03 -0700113class CordSubscriberViewSet(XOSViewSet):
114 base_name = "subscriber"
Scott Bakerd9d55f22016-03-25 13:33:11 -0700115 method_name = "subscriber"
Scott Bakerfb9544a2016-03-25 10:55:03 -0700116 method_kind = "viewset"
Scott Baker12d71082016-03-28 13:23:20 -0700117 queryset = CordSubscriberNew.get_tenant_objects().select_related().all()
118 serializer_class = CordSubscriberSerializer
Scott Bakerfb9544a2016-03-25 10:55:03 -0700119
120 @classmethod
Scott Bakerbca3a1b2016-03-28 13:22:10 -0700121 def get_urlpatterns(self, api_path="^"):
Scott Bakerd9d55f22016-03-25 13:33:11 -0700122 patterns = super(CordSubscriberViewSet, self).get_urlpatterns(api_path=api_path)
Scott Baker12d71082016-03-28 13:23:20 -0700123 patterns.append( self.detail_url("features/$", {"get": "get_features", "put": "set_features"}, "features") )
124 patterns.append( self.detail_url("features/(?P<feature>[a-zA-Z0-9\-_]+)/$", {"get": "get_feature", "put": "set_feature"}, "get_feature") )
Scott Bakerfb9544a2016-03-25 10:55:03 -0700125
Scott Bakerd9d55f22016-03-25 13:33:11 -0700126 patterns.append( url(self.api_path + "subidlookup/(?P<ssid>[0-9\-]+)/$", self.as_view({"get": "ssiddetail"}), name="ssiddetail") )
127 patterns.append( url(self.api_path + "subidlookup/$", self.as_view({"get": "ssidlist"}), name="ssidlist") )
Scott Bakerfb9544a2016-03-25 10:55:03 -0700128
129 return patterns
130
131 def list(self, request):
132 object_list = self.filter_queryset(self.get_queryset())
133
134 serializer = self.get_serializer(object_list, many=True)
135
Scott Bakerc4200f92016-03-28 15:07:36 -0700136 return Response(serializer.data)
Scott Bakerfb9544a2016-03-25 10:55:03 -0700137
Scott Baker12d71082016-03-28 13:23:20 -0700138 def get_features(self, request, pk=None):
Scott Bakerfb9544a2016-03-25 10:55:03 -0700139 subscriber = self.get_object()
Scott Bakerc4200f92016-03-28 15:07:36 -0700140 return Response(FeatureSerializer(subscriber.features).data)
Scott Bakerfb9544a2016-03-25 10:55:03 -0700141
Scott Baker12d71082016-03-28 13:23:20 -0700142 def get_feature(self, request, pk=None, feature=None):
Scott Bakerfb9544a2016-03-25 10:55:03 -0700143 subscriber = self.get_object()
Scott Bakerc4200f92016-03-28 15:07:36 -0700144 return Response({feature: FeatureSerializer(subscriber.features).data[feature]})
Scott Bakerfb9544a2016-03-25 10:55:03 -0700145
Scott Baker12d71082016-03-28 13:23:20 -0700146 def set_feature(self, request, pk=None, feature=None):
Scott Bakerfb9544a2016-03-25 10:55:03 -0700147 subscriber = self.get_object()
Scott Bakerc4200f92016-03-28 15:07:36 -0700148 if [feature] != request.data.keys():
149 raise serializers.ValidationError("feature %s does not match keys in request body (%s)" % (feature, ",".join(request.data.keys())))
150 ser = FeatureSerializer(subscriber.features, data=request.data)
151 ser.is_valid(raise_exception = True)
152 subscriber.update_features(ser.validated_data)
Scott Baker85f2cd32016-03-28 16:23:53 -0700153 return Response({feature: FeatureSerializer(subscriber.features).data[feature]})
Scott Bakerfb9544a2016-03-25 10:55:03 -0700154
Scott Baker12d71082016-03-28 13:23:20 -0700155 def set_features(self, request, pk=None):
Scott Bakerfb9544a2016-03-25 10:55:03 -0700156 subscriber = self.get_object()
Scott Bakerc4200f92016-03-28 15:07:36 -0700157 ser = FeatureSerializer(subscriber.features, data=request.data)
158 ser.is_valid(raise_exception = True)
159 subscriber.update_features(ser.validated_data)
160 subscriber.save()
161 return Response(FeatureSerializer(subscriber.features).data)
Scott Bakerfb9544a2016-03-25 10:55:03 -0700162
163 def ssidlist(self, request):
Scott Baker12d71082016-03-28 13:23:20 -0700164 object_list = CordSubscriberNew.get_tenant_objects().all()
Scott Bakerfb9544a2016-03-25 10:55:03 -0700165
166 ssidmap = [ {"service_specific_id": x.service_specific_id, "subscriber_id": x.id} for x in object_list ]
167
168 return Response({"ssidmap": ssidmap})
169
170 def ssiddetail(self, pk=None, ssid=None):
Scott Baker12d71082016-03-28 13:23:20 -0700171 object_list = CordSubscriberNew.get_tenant_objects().all()
Scott Bakerfb9544a2016-03-25 10:55:03 -0700172
173 ssidmap = [ {"service_specific_id": x.service_specific_id, "subscriber_id": x.id} for x in object_list if str(x.service_specific_id)==str(ssid) ]
174
175 if len(ssidmap)==0:
176 raise XOSNotFound("didn't find ssid %s" % str(ssid))
177
178 return Response( ssidmap[0] )
179