blob: c0bf44573a1ed88d7357db5fc589ccad8137f5f0 [file] [log] [blame]
Matteo Scandoloede125b2017-08-08 13:05:25 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
Scott Baker25467ff2016-08-04 09:50:22 -070017from django.db import models
Sapan Bhatia71b7af42017-05-19 23:10:52 +020018from core.models import User, Service, SingletonModel, XOSBase
19from core.models.xosbase import StrippedCharField
Scott Baker25467ff2016-08-04 09:50:22 -070020import os
21from django.db import models
22from django.forms.models import model_to_dict
23from django.db.models import Q
24
25
26# Create your models here.
27
28class HpcService(Service):
29
30 class Meta:
31 app_label = "hpc"
32 verbose_name = "HPC Service"
33
34 cmi_hostname = StrippedCharField(max_length=254, null=True, blank=True)
35
36 hpc_port80 = models.BooleanField(default=True, help_text="Enable port 80 for HPC")
37 watcher_hpc_network = StrippedCharField(max_length=254, null=True, blank=True, help_text="Network for hpc_watcher to contact hpc instance")
38 watcher_dnsdemux_network = StrippedCharField(max_length=254, null=True, blank=True, help_text="Network for hpc_watcher to contact dnsdemux instance")
39 watcher_dnsredir_network = StrippedCharField(max_length=254, null=True, blank=True, help_text="Network for hpc_watcher to contact dnsredir instance")
40
41 @property
42 def scale(self):
43 hpc_slices = [x for x in self.slices.all() if "hpc" in x.name]
44 if not hpc_slices:
45 return 0
46 return hpc_slices[0].instances.count()
47
48 @scale.setter
49 def scale(self, value):
50 self.set_scale = value
51
52 def save(self, *args, **kwargs):
53 super(HpcService, self).save(*args, **kwargs)
54
55 # scale up/down
56 scale = getattr(self, "set_scale", None)
57 if scale is not None:
58 exclude_slices = [x for x in self.slices.all() if "cmi" in x.name]
59 self.adjust_scale(slice_hint="hpc", scale=scale, exclusive_slices = exclude_slices, max_per_node=1)
60
Sapan Bhatia71b7af42017-05-19 23:10:52 +020061class ServiceProvider(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -070062 class Meta:
63 app_label = "hpc"
64
65 hpcService = models.ForeignKey(HpcService)
66 service_provider_id = models.IntegerField(null=True, blank=True)
67 name = models.CharField(max_length=254,help_text="Service Provider Name")
68 description = models.TextField(max_length=254,null=True, blank=True, help_text="Description of Service Provider")
69 enabled = models.BooleanField(default=True)
70
71 def __unicode__(self): return u'%s' % (self.name)
72
73 @classmethod
74 def filter_by_hpcService(cls, qs, hpcService):
75 # This should be overridden by descendant classes that want to perform
76 # filtering of visible objects by user.
77 return qs.filter(hpcService=hpcService)
78
Sapan Bhatia71b7af42017-05-19 23:10:52 +020079class ContentProvider(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -070080 class Meta:
81 app_label = "hpc"
82
83 # legacy vicci content providers already have names.
84 CP_TO_ACCOUNT = {"ON.LAB": "onlabcp",
85 "Syndicate": "syndicatecp"}
86
87 content_provider_id = models.IntegerField(null=True, blank=True)
88 name = models.CharField(max_length=254)
89 enabled = models.BooleanField(default=True)
90 description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Content Provider")
91 serviceProvider = models.ForeignKey(ServiceProvider)
92
93 # Note user relationships are directed not requiring a role.
94 users = models.ManyToManyField(User)
95
96 def __unicode__(self): return u'%s' % (self.name)
97
98 @property
99 def account(self):
100 return self.CP_TO_ACCOUNT.get(self.name, self.name)
101
102 @classmethod
103 def filter_by_hpcService(cls, qs, hpcService):
104 # This should be overridden by descendant classes that want to perform
105 # filtering of visible objects by user.
106 return qs.filter(serviceProvider__hpcService=hpcService)
107
108 def can_update(self, user):
109 if super(ContentProvider, self).can_update(user):
110 return True
111
112 if user in self.users.all():
113 return True
114
115 return False
116
Sapan Bhatia71b7af42017-05-19 23:10:52 +0200117class OriginServer(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -0700118 class Meta:
119 app_label = "hpc"
120
121 origin_server_id = models.IntegerField(null=True, blank=True)
122 url = models.CharField(max_length=1024)
123 contentProvider = models.ForeignKey(ContentProvider)
124
125 authenticated = models.BooleanField(default=False, help_text="Status for this Site")
126 enabled = models.BooleanField(default=True, help_text="Status for this Site")
127 PROTOCOL_CHOICES = (('http', 'HTTP'),('rtmp', 'RTMP'), ('rtp', 'RTP'),('shout', 'SHOUTcast'))
128 protocol = models.CharField(default="HTTP", max_length = 12, choices=PROTOCOL_CHOICES)
129 redirects = models.BooleanField(default=True, help_text="Indicates whether Origin Server redirects should be used for this Origin Server")
130 description = models.TextField(null=True, blank=True, max_length=255)
131
132 def __unicode__(self): return u'%s' % (self.url)
133
134 @classmethod
135 def filter_by_hpcService(cls, qs, hpcService):
136 # This should be overridden by descendant classes that want to perform
137 # filtering of visible objects by user.
138 return qs.filter(contentProvider__serviceProvider__hpcService=hpcService)
139
140 def can_update(self, user):
141 if super(OriginServer, self).can_update(user):
142 return True
143
144 if self.contentProvider and self.contentProvider.can_update(user):
145 return True
146
147 return False
148
Sapan Bhatia71b7af42017-05-19 23:10:52 +0200149class CDNPrefix(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -0700150 class Meta:
151 app_label = "hpc"
152
153 cdn_prefix_id = models.IntegerField(null=True, blank=True)
154 prefix = models.CharField(max_length=200, help_text="Registered Prefix for Domain")
155 contentProvider = models.ForeignKey(ContentProvider)
156 description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Content Provider")
157
158 defaultOriginServer = models.ForeignKey(OriginServer, blank=True, null=True)
159 enabled = models.BooleanField(default=True)
160
161 def __unicode__(self): return u'%s' % (self.prefix)
162
163 @classmethod
164 def filter_by_hpcService(cls, qs, hpcService):
165 # This should be overridden by descendant classes that want to perform
166 # filtering of visible objects by user.
167 return qs.filter(contentProvider__serviceProvider__hpcService=hpcService)
168
169 def can_update(self, user):
170 if super(CDNPrefix, self).can_update(user):
171 return True
172
173 if self.contentProvider and self.contentProvider.can_update(user):
174 return True
175
176 return False
177
Sapan Bhatia71b7af42017-05-19 23:10:52 +0200178class AccessMap(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -0700179 class Meta:
180 app_label = "hpc"
181
182 contentProvider = models.ForeignKey(ContentProvider)
183 name = models.CharField(max_length=64, help_text="Name of the Access Map")
184 description = models.TextField(null=True, blank=True,max_length=130)
185 map = models.FileField(upload_to="maps/", help_text="specifies which client requests are allowed")
186
187 def __unicode__(self): return self.name
188
Sapan Bhatia71b7af42017-05-19 23:10:52 +0200189class SiteMap(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -0700190 class Meta:
191 app_label = "hpc"
192
193 """ can be bound to a ContentProvider, ServiceProvider, or neither """
194 contentProvider = models.ForeignKey(ContentProvider, blank=True, null=True)
195 serviceProvider = models.ForeignKey(ServiceProvider, blank=True, null=True)
196 cdnPrefix = models.ForeignKey(CDNPrefix, blank = True, null=True)
197 hpcService = models.ForeignKey(HpcService, blank = True, null=True)
198 name = models.CharField(max_length=64, help_text="Name of the Site Map")
199 description = models.TextField(null=True, blank=True,max_length=130)
200 map = models.FileField(upload_to="maps/", help_text="specifies how to map requests to hpc instances")
201 map_id = models.IntegerField(null=True, blank=True)
202
203 def __unicode__(self): return self.name
204
205 def save(self, *args, **kwds):
206 if (self.contentProvider) and (self.serviceProvider or self.cdnPrefix or self.hpcService):
207 raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
208 if (self.serviceProvider) and (self.cdnPrefix or self.hpcService):
209 raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
210 if (self.cdnPrefix) and (self.hpcService):
211 raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
212
213 super(SiteMap, self).save(*args, **kwds)
214
215 @classmethod
216 def filter_by_hpcService(cls, qs, hpcService):
217 # This should be overridden by descendant classes that want to perform
218 # filtering of visible objects by user.
219 return qs.filter(Q(hpcService=hpcService) |
220 Q(serviceProvider__hpcService=hpcService) |
221 Q(contentProvider__serviceProvider__hpcService=hpcService) |
222 Q(cdnPrefix__contentProvider__serviceProvider__hpcService=hpcService))
223
Sapan Bhatia71b7af42017-05-19 23:10:52 +0200224class HpcHealthCheck(XOSBase):
Scott Baker25467ff2016-08-04 09:50:22 -0700225 class Meta:
226 app_label = "hpc"
227
228 KIND_CHOICES = (('dns', 'DNS'), ('http', 'HTTP'), ('nameserver', 'Name Server'))
229
230 hpcService = models.ForeignKey(HpcService, blank = True, null=True)
231 kind = models.CharField(max_length=30, choices=KIND_CHOICES, default="dns")
232 resource_name = StrippedCharField(max_length=1024, blank=False, null=False)
233 result_contains = StrippedCharField(max_length=1024, blank=True, null=True)
234 result_min_size = models.IntegerField(null=True, blank=True)
235 result_max_size = models.IntegerField(null=True, blank=True)
236
237 def __unicode__(self): return self.resource_name
238
239 @classmethod
240 def filter_by_hpcService(cls, qs, hpcService):
241 # This should be overridden by descendant classes that want to perform
242 # filtering of visible objects by user.
243 return qs.filter(hpcService=hpcService)
244
245