Skip to content

Commit 64b7be6

Browse files
author
Gabriel Monroy
committed
ref(*): deprecate cluster domain object
1 parent 1f6389d commit 64b7be6

34 files changed

Lines changed: 351 additions & 566 deletions

api/admin.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
from .models import App
1313
from .models import Build
14-
from .models import Cluster
1514
from .models import Config
1615
from .models import Container
1716
from .models import Domain
@@ -24,8 +23,8 @@ class AppAdmin(GuardedModelAdmin):
2423
in the Django admin.
2524
"""
2625
date_hierarchy = 'created'
27-
list_display = ('id', 'owner', 'cluster')
28-
list_filter = ('owner', 'cluster')
26+
list_display = ('id', 'owner')
27+
list_filter = ('owner',)
2928
admin.site.register(App, AppAdmin)
3029

3130

@@ -39,16 +38,6 @@ class BuildAdmin(admin.ModelAdmin):
3938
admin.site.register(Build, BuildAdmin)
4039

4140

42-
class ClusterAdmin(admin.ModelAdmin):
43-
"""Set presentation options for :class:`~api.models.Cluster` models
44-
in the Django admin.
45-
"""
46-
date_hierarchy = 'created'
47-
list_display = ('id', 'owner', 'domain')
48-
list_filter = ('owner',)
49-
admin.site.register(Cluster, ClusterAdmin)
50-
51-
5241
class ConfigAdmin(admin.ModelAdmin):
5342
"""Set presentation options for :class:`~api.models.Config` models
5443
in the Django admin.

api/fixtures/dev.json

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,8 @@
3939
"pk": 1,
4040
"model": "sites.site",
4141
"fields": {
42-
"domain": "local.deisapp.com",
43-
"name": "local.deisapp.com"
44-
}
45-
},
46-
{
47-
"pk": "8b196fb8-5774-4512-b3cc-569af8894a6c",
48-
"model": "api.cluster",
49-
"fields": {
50-
"updated": "2014-01-27T23:32:51.173Z",
51-
"created": "2014-01-27T23:32:02.148Z",
52-
"domain": "local.deisapp.com",
53-
"owner": [
54-
"devuser"
55-
],
56-
"hosts": "host1,host2,host3",
57-
"auth": "base64string",
58-
"options": "{}",
59-
"id": "dev"
42+
"domain": "local3.deisapp.com",
43+
"name": "local3.deisapp.com"
6044
}
6145
}
6246
]

api/fixtures/test_sharing.json

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,12 @@
5353
"date_joined": "2013-11-25T21:59:30.760Z"
5454
}
5555
},
56-
{
57-
"pk": "80e9db5a-d394-41c7-b153-3ea0314dc8ca",
58-
"model": "api.cluster",
59-
"fields": {
60-
"updated": "2013-11-25T22:09:36.726Z",
61-
"created": "2013-11-25T22:09:36.726Z",
62-
"domain": "autotest.local",
63-
"owner": 2,
64-
"hosts": "host1,host2,host3",
65-
"auth": "base64string",
66-
"options": "{}",
67-
"id": "autotest-1"
68-
}
69-
},
7056
{
7157
"pk": "5a09a1e0-a27e-4839-928b-449310ed90f0",
7258
"model": "api.app",
7359
"fields": {
7460
"updated": "2013-11-25T22:09:36.726Z",
7561
"created": "2013-11-25T22:09:36.726Z",
76-
"cluster": "80e9db5a-d394-41c7-b153-3ea0314dc8ca",
7762
"owner": 2,
7863
"id": "autotest-1-app"
7964
}
@@ -84,7 +69,6 @@
8469
"fields": {
8570
"updated": "2013-11-25T22:09:36.726Z",
8671
"created": "2013-11-25T22:09:36.726Z",
87-
"cluster": "80e9db5a-d394-41c7-b153-3ea0314dc8ca",
8872
"owner": 3,
8973
"id": "autotest-2-app"
9074
}

api/models.py

Lines changed: 19 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -88,49 +88,6 @@ class Meta:
8888
abstract = True
8989

9090

91-
@python_2_unicode_compatible
92-
class Cluster(UuidAuditedModel):
93-
"""
94-
Cluster used to run jobs
95-
"""
96-
97-
CLUSTER_TYPES = (('mock', 'Mock Cluster'),
98-
('coreos', 'CoreOS Cluster'),
99-
('chaos', 'Chaos Cluster'))
100-
101-
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
102-
id = models.CharField(max_length=128, unique=True)
103-
type = models.CharField(max_length=16, choices=CLUSTER_TYPES, default='coreos')
104-
105-
domain = models.CharField(max_length=128, validators=[validate_domain])
106-
hosts = models.CharField(max_length=256, validators=[validate_comma_separated])
107-
auth = models.TextField()
108-
options = JSONField(default={}, blank=True)
109-
110-
def __str__(self):
111-
return self.id
112-
113-
def _get_scheduler(self, *args, **kwargs):
114-
module_name = 'scheduler.' + self.type
115-
mod = importlib.import_module(module_name)
116-
return mod.SchedulerClient(self.id, self.hosts, self.auth,
117-
self.domain, self.options)
118-
119-
_scheduler = property(_get_scheduler)
120-
121-
def create(self):
122-
"""
123-
Initialize a cluster's router and log aggregator
124-
"""
125-
return self._scheduler.setUp()
126-
127-
def destroy(self):
128-
"""
129-
Destroy a cluster's router and log aggregator
130-
"""
131-
return self._scheduler.tearDown()
132-
133-
13491
@python_2_unicode_compatible
13592
class App(UuidAuditedModel):
13693
"""
@@ -139,7 +96,6 @@ class App(UuidAuditedModel):
13996

14097
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
14198
id = models.SlugField(max_length=64, unique=True)
142-
cluster = models.ForeignKey('Cluster')
14399
structure = JSONField(default={}, blank=True, validators=[validate_app_structure])
144100

145101
class Meta:
@@ -148,9 +104,20 @@ class Meta:
148104
def __str__(self):
149105
return self.id
150106

107+
def _get_scheduler(self, *args, **kwargs):
108+
module_name = 'scheduler.' + settings.SCHEDULER_MODULE
109+
mod = importlib.import_module(module_name)
110+
111+
return mod.SchedulerClient(settings.SCHEDULER_TARGET,
112+
settings.SCHEDULER_AUTH,
113+
settings.SCHEDULER_OPTIONS,
114+
settings.SSH_PRIVATE_KEY)
115+
116+
_scheduler = property(_get_scheduler)
117+
151118
@property
152119
def url(self):
153-
return self.id + '.' + self.cluster.domain
120+
return self.id + '.' + settings.DEIS_DOMAIN
154121

155122
def log(self, message):
156123
"""Logs a message to the application's log file.
@@ -341,6 +308,12 @@ def logs(self):
341308

342309
def run(self, user, command):
343310
"""Run a one-off command in an ephemeral app container."""
311+
312+
# FIXME: remove the need for SSH private keys by using
313+
# a scheduler that supports one-off admin tasks natively
314+
if not settings.SSH_PRIVATE_KEY:
315+
raise EnvironmentError('Support for admin commands is not configured')
316+
344317
# TODO: add support for interactive shell
345318
msg = "{} runs '{}'".format(user.username, command)
346319
log_event(self, msg)
@@ -420,7 +393,7 @@ def _get_job_id(self):
420393
_job_id = property(_get_job_id)
421394

422395
def _get_scheduler(self):
423-
return self.app.cluster._scheduler
396+
return self.app._scheduler
424397

425398
_scheduler = property(_get_scheduler)
426399

api/serializers.py

Lines changed: 28 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -73,40 +73,32 @@ class Meta:
7373
read_only_fields = ('username',)
7474

7575

76-
class ClusterSerializer(serializers.ModelSerializer):
77-
"""Serialize a :class:`~api.models.Cluster` model."""
76+
class AppSerializer(serializers.ModelSerializer):
77+
"""Serialize a :class:`~api.models.App` model."""
7878

7979
owner = serializers.Field(source='owner.username')
80-
options = JSONFieldSerializer(source='options', required=False)
80+
id = serializers.SlugField(default=utils.generate_app_name)
81+
url = serializers.Field(source='url')
82+
structure = JSONFieldSerializer(source='structure', required=False)
8183

8284
class Meta:
83-
"""Metadata options for a :class:`ClusterSerializer`."""
84-
model = models.Cluster
85+
"""Metadata options for a :class:`AppSerializer`."""
86+
model = models.App
8587
read_only_fields = ('created', 'updated')
8688

87-
def validate_domain(self, attrs, source):
88-
value = attrs[source]
89-
models.validate_domain(value)
90-
return attrs
91-
92-
def validate_hosts(self, attrs, source):
89+
def validate_id(self, attrs, source):
90+
"""
91+
Check that the ID is all lowercase and not 'deis'
92+
"""
9393
value = attrs[source]
94-
models.validate_comma_separated(value)
94+
match = re.match(r'^[a-z0-9-]+$', value)
95+
if not match:
96+
raise serializers.ValidationError("App IDs can only contain [a-z0-9-]")
97+
if value == 'deis':
98+
raise serializers.ValidationError("App IDs cannot be 'deis'")
9599
return attrs
96100

97101

98-
class PushSerializer(serializers.ModelSerializer):
99-
"""Serialize a :class:`~api.models.Push` model."""
100-
101-
owner = serializers.Field(source='owner.username')
102-
app = serializers.SlugRelatedField(slug_field='id')
103-
104-
class Meta:
105-
"""Metadata options for a :class:`PushSerializer`."""
106-
model = models.Push
107-
read_only_fields = ('uuid', 'created', 'updated')
108-
109-
110102
class BuildSerializer(serializers.ModelSerializer):
111103
"""Serialize a :class:`~api.models.Build` model."""
112104

@@ -189,33 +181,6 @@ class Meta:
189181
read_only_fields = ('uuid', 'created', 'updated')
190182

191183

192-
class AppSerializer(serializers.ModelSerializer):
193-
"""Serialize a :class:`~api.models.App` model."""
194-
195-
owner = serializers.Field(source='owner.username')
196-
id = serializers.SlugField(default=utils.generate_app_name)
197-
cluster = serializers.SlugRelatedField(slug_field='id')
198-
url = serializers.Field(source='url')
199-
structure = JSONFieldSerializer(source='structure', required=False)
200-
201-
class Meta:
202-
"""Metadata options for a :class:`AppSerializer`."""
203-
model = models.App
204-
read_only_fields = ('created', 'updated')
205-
206-
def validate_id(self, attrs, source):
207-
"""
208-
Check that the ID is all lowercase and not 'deis'
209-
"""
210-
value = attrs[source]
211-
match = re.match(r'^[a-z0-9-]+$', value)
212-
if not match:
213-
raise serializers.ValidationError("App IDs can only contain [a-z0-9-]")
214-
if value == 'deis':
215-
raise serializers.ValidationError("App IDs cannot be 'deis'")
216-
return attrs
217-
218-
219184
class ContainerSerializer(serializers.ModelSerializer):
220185
"""Serialize a :class:`~api.models.Container` model."""
221186

@@ -278,3 +243,15 @@ def validate_domain(self, attrs, source):
278243
"Adding a wildcard subdomain is currently not supported".format(value))
279244

280245
return attrs
246+
247+
248+
class PushSerializer(serializers.ModelSerializer):
249+
"""Serialize a :class:`~api.models.Push` model."""
250+
251+
owner = serializers.Field(source='owner.username')
252+
app = serializers.SlugRelatedField(slug_field='id')
253+
254+
class Meta:
255+
"""Metadata options for a :class:`PushSerializer`."""
256+
model = models.Push
257+
read_only_fields = ('uuid', 'created', 'updated')

0 commit comments

Comments
 (0)