blob: e915fbc5ec0f1941048fa4c1ca1b0a29d4ea5dd3 [file] [log] [blame]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -04001from django.db import models
Siobhan Tullycf04fb62014-01-11 11:25:57 -05002from core.models import User, Service, SingletonModel, PlCoreBase
Scott Baker3b5fa5b2015-03-18 17:37:46 -07003from core.models.plcorebase import StrippedCharField
Siobhan Tullybfd11dc2013-09-03 12:59:24 -04004import os
5from django.db import models
6from django.forms.models import model_to_dict
Scott Baker02c51772015-04-02 21:31:50 -07007from django.db.models import Q
Siobhan Tullybfd11dc2013-09-03 12:59:24 -04008
9
10# Create your models here.
11
Scott Baker30350392015-03-13 09:17:33 -070012class HpcService(Service):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040013
14 class Meta:
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040015 app_label = "hpc"
Siobhan Tullycf04fb62014-01-11 11:25:57 -050016 verbose_name = "HPC Service"
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040017
Scott Baker1fa4e642015-03-30 19:14:52 -070018 cmi_hostname = StrippedCharField(max_length=254, null=True, blank=True)
Scott Baker30350392015-03-13 09:17:33 -070019
Siobhan Tullycf04fb62014-01-11 11:25:57 -050020class ServiceProvider(PlCoreBase):
21 class Meta:
22 app_label = "hpc"
Scott Bakere728c892014-01-12 11:41:09 -080023
Scott Baker26910182015-03-31 21:45:14 -070024 hpcService = models.ForeignKey(HpcService)
Scott Bakere728c892014-01-12 11:41:09 -080025 service_provider_id = models.IntegerField(null=True, blank=True)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040026 name = models.CharField(max_length=254,help_text="Service Provider Name")
27 description = models.TextField(max_length=254,null=True, blank=True, help_text="Description of Service Provider")
28 enabled = models.BooleanField(default=True)
29
30 def __unicode__(self): return u'%s' % (self.name)
31
Scott Baker02c51772015-04-02 21:31:50 -070032 @classmethod
Scott Baker0e0d9682015-04-02 21:56:00 -070033 def filter_by_hpcService(cls, qs, hpcService):
Scott Baker02c51772015-04-02 21:31:50 -070034 # This should be overridden by descendant classes that want to perform
35 # filtering of visible objects by user.
Scott Baker0e0d9682015-04-02 21:56:00 -070036 return qs.filter(hpcService=hpcService)
Scott Baker02c51772015-04-02 21:31:50 -070037
Siobhan Tullycf04fb62014-01-11 11:25:57 -050038class ContentProvider(PlCoreBase):
39 class Meta:
40 app_label = "hpc"
Scott Bakere728c892014-01-12 11:41:09 -080041
Scott Baker7a090762014-05-07 09:04:07 -070042 # legacy vicci content providers already have names.
43 CP_TO_ACCOUNT = {"ON.LAB": "onlabcp",
44 "Syndicate": "syndicatecp"}
45
Scott Bakere728c892014-01-12 11:41:09 -080046 content_provider_id = models.IntegerField(null=True, blank=True)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040047 name = models.CharField(max_length=254)
48 enabled = models.BooleanField(default=True)
49 description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Content Provider")
50 serviceProvider = models.ForeignKey(ServiceProvider)
51
52 # Note user relationships are directed not requiring a role.
53 users = models.ManyToManyField(User)
54
55 def __unicode__(self): return u'%s' % (self.name)
56
Scott Baker7a090762014-05-07 09:04:07 -070057 @property
58 def account(self):
59 return self.CP_TO_ACCOUNT.get(self.name, self.name)
60
Scott Baker02c51772015-04-02 21:31:50 -070061 @classmethod
Scott Baker0e0d9682015-04-02 21:56:00 -070062 def filter_by_hpcService(cls, qs, hpcService):
Scott Baker02c51772015-04-02 21:31:50 -070063 # This should be overridden by descendant classes that want to perform
64 # filtering of visible objects by user.
Scott Baker0e0d9682015-04-02 21:56:00 -070065 return qs.filter(serviceProvider__hpcService=hpcService)
Scott Baker02c51772015-04-02 21:31:50 -070066
67
Siobhan Tullycf04fb62014-01-11 11:25:57 -050068class OriginServer(PlCoreBase):
69 class Meta:
70 app_label = "hpc"
Scott Bakere728c892014-01-12 11:41:09 -080071
72 origin_server_id = models.IntegerField(null=True, blank=True)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040073 url = models.URLField()
74 contentProvider = models.ForeignKey(ContentProvider)
75
76 authenticated = models.BooleanField(default=False, help_text="Status for this Site")
77 enabled = models.BooleanField(default=True, help_text="Status for this Site")
78 PROTOCOL_CHOICES = (('http', 'HTTP'),('rtmp', 'RTMP'), ('rtp', 'RTP'),('shout', 'SHOUTcast'))
79 protocol = models.CharField(default="HTTP", max_length = 12, choices=PROTOCOL_CHOICES)
80 redirects = models.BooleanField(default=True, help_text="Indicates whether Origin Server redirects should be used for this Origin Server")
81 description = models.TextField(null=True, blank=True, max_length=255)
82
83 def __unicode__(self): return u'%s' % (self.url)
84
Scott Baker02c51772015-04-02 21:31:50 -070085 @classmethod
Scott Baker0e0d9682015-04-02 21:56:00 -070086 def filter_by_hpcService(cls, qs, hpcService):
Scott Baker02c51772015-04-02 21:31:50 -070087 # This should be overridden by descendant classes that want to perform
88 # filtering of visible objects by user.
Scott Baker0e0d9682015-04-02 21:56:00 -070089 return qs.filter(contentProvider__serviceProvider__hpcService=hpcService)
Scott Baker02c51772015-04-02 21:31:50 -070090
Siobhan Tullycf04fb62014-01-11 11:25:57 -050091class CDNPrefix(PlCoreBase):
92 class Meta:
93 app_label = "hpc"
Scott Bakere728c892014-01-12 11:41:09 -080094
95 cdn_prefix_id = models.IntegerField(null=True, blank=True)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040096 prefix = models.CharField(max_length=200, help_text="Registered Prefix for Domain")
97 contentProvider = models.ForeignKey(ContentProvider)
98 description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Content Provider")
99
Scott Baker9d4b1c32014-08-27 11:20:33 -0700100 defaultOriginServer = models.ForeignKey(OriginServer, blank=True, null=True)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400101 enabled = models.BooleanField(default=True)
102
103 def __unicode__(self): return u'%s' % (self.prefix)
104
Scott Baker02c51772015-04-02 21:31:50 -0700105 @classmethod
Scott Baker0e0d9682015-04-02 21:56:00 -0700106 def filter_by_hpcService(cls, qs, hpcService):
Scott Baker02c51772015-04-02 21:31:50 -0700107 # This should be overridden by descendant classes that want to perform
108 # filtering of visible objects by user.
Scott Baker0e0d9682015-04-02 21:56:00 -0700109 return qs.filter(contentProvider__serviceProvider__hpcService=hpcService)
Scott Baker02c51772015-04-02 21:31:50 -0700110
Scott Baker77bfa222015-03-03 00:06:53 -0800111class AccessMap(PlCoreBase):
112 class Meta:
113 app_label = "hpc"
114
Scott Baker53491082014-03-13 23:15:19 -0700115 contentProvider = models.ForeignKey(ContentProvider)
116 name = models.CharField(max_length=64, help_text="Name of the Access Map")
117 description = models.TextField(null=True, blank=True,max_length=130)
118 map = models.FileField(upload_to="maps/", help_text="specifies which client requests are allowed")
119
120 def __unicode__(self): return self.name
121
Scott Baker77bfa222015-03-03 00:06:53 -0800122class SiteMap(PlCoreBase):
123 class Meta:
124 app_label = "hpc"
125
Scott Baker53491082014-03-13 23:15:19 -0700126 """ can be bound to a ContentProvider, ServiceProvider, or neither """
127 contentProvider = models.ForeignKey(ContentProvider, blank=True, null=True)
128 serviceProvider = models.ForeignKey(ServiceProvider, blank=True, null=True)
Scott Baker77bfa222015-03-03 00:06:53 -0800129 cdnPrefix = models.ForeignKey(CDNPrefix, blank = True, null=True)
Scott Baker30350392015-03-13 09:17:33 -0700130 hpcService = models.ForeignKey(HpcService, blank = True, null=True)
Scott Baker53491082014-03-13 23:15:19 -0700131 name = models.CharField(max_length=64, help_text="Name of the Site Map")
132 description = models.TextField(null=True, blank=True,max_length=130)
133 map = models.FileField(upload_to="maps/", help_text="specifies how to map requests to hpc instances")
Scott Bakeree53c442015-03-09 16:22:56 -0700134 map_id = models.IntegerField(null=True, blank=True)
Scott Baker53491082014-03-13 23:15:19 -0700135
136 def __unicode__(self): return self.name
Scott Baker77bfa222015-03-03 00:06:53 -0800137
138 def save(self, *args, **kwds):
Scott Baker30350392015-03-13 09:17:33 -0700139 if (self.contentProvider) and (self.serviceProvider or self.cdnPrefix or self.hpcService):
140 raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
141 if (self.serviceProvider) and (self.cdnPrefix or self.hpcService):
142 raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
143 if (self.cdnPrefix) and (self.hpcService):
144 raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
Scott Baker77bfa222015-03-03 00:06:53 -0800145
146 super(SiteMap, self).save(*args, **kwds)
Scott Baker3b5fa5b2015-03-18 17:37:46 -0700147
Scott Baker02c51772015-04-02 21:31:50 -0700148 @classmethod
Scott Baker0e0d9682015-04-02 21:56:00 -0700149 def filter_by_hpcService(cls, qs, hpcService):
Scott Baker02c51772015-04-02 21:31:50 -0700150 # This should be overridden by descendant classes that want to perform
151 # filtering of visible objects by user.
Scott Baker0e0d9682015-04-02 21:56:00 -0700152 return qs.filter(Q(hpcService=hpcService) |
Scott Baker02c51772015-04-02 21:31:50 -0700153 Q(serviceProvider__hpcService=hpcService) |
154 Q(contentProvider__serviceProvider__hpcService=hpcService) |
155 Q(cdnPrefix__contentProvider__serviceProvider__hpcService=hpcService))
156
Scott Baker3b5fa5b2015-03-18 17:37:46 -0700157class HpcHealthCheck(PlCoreBase):
158 class Meta:
159 app_label = "hpc"
160
161 KIND_CHOICES = (('dns', 'DNS'), ('http', 'HTTP'))
162
163 hpcService = models.ForeignKey(HpcService, blank = True, null=True)
164 kind = models.CharField(max_length=30, choices=KIND_CHOICES, default="dns")
165 resource_name = StrippedCharField(max_length=1024, blank=False, null=False)
166 result_contains = StrippedCharField(max_length=1024, blank=True, null=True)
167 result_min_size = models.IntegerField(null=True, blank=True)
168 result_max_size = models.IntegerField(null=True, blank=True)
169
170 def __unicode__(self): return self.resource_name
171
Scott Baker02c51772015-04-02 21:31:50 -0700172 @classmethod
Scott Baker0e0d9682015-04-02 21:56:00 -0700173 def filter_by_hpcService(cls, qs, hpcService):
Scott Baker02c51772015-04-02 21:31:50 -0700174 # This should be overridden by descendant classes that want to perform
175 # filtering of visible objects by user.
Scott Baker0e0d9682015-04-02 21:56:00 -0700176 return qs.filter(hpcService=hpcService)
Scott Baker02c51772015-04-02 21:31:50 -0700177
178