Skip to content

Commit 4a0ad8d

Browse files
committed
fix(controller): store limit fields on config
Having a separate "Limit" domain object was getting in our way, when really it represents just an extension of a Config. This moves the two JSON fields "cpu" and "memory" to Config and does away with Limit.
1 parent e44dc1f commit 4a0ad8d

9 files changed

Lines changed: 375 additions & 298 deletions

File tree

client/deis.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,7 +1373,7 @@ def limits_list(self, args):
13731373
app = args.get('--app')
13741374
if not app:
13751375
app = self._session.app
1376-
response = self._dispatch('get', "/api/apps/{}/limits".format(app))
1376+
response = self._dispatch('get', "/api/apps/{}/config".format(app))
13771377
if response.status_code == requests.codes.ok: # @UndefinedVariable
13781378
self._print_limits(app, response.json())
13791379
else:
@@ -1426,7 +1426,7 @@ def limits_set(self, args):
14261426
try:
14271427
progress = TextProgress()
14281428
progress.start()
1429-
response = self._dispatch('post', "/api/apps/{}/limits".format(app), json.dumps(body))
1429+
response = self._dispatch('post', "/api/apps/{}/config".format(app), json.dumps(body))
14301430
finally:
14311431
progress.cancel()
14321432
progress.join()
@@ -1472,7 +1472,7 @@ def limits_unset(self, args):
14721472
try:
14731473
progress = TextProgress()
14741474
progress.start()
1475-
response = self._dispatch('post', "/api/apps/{}/limits".format(app), json.dumps(body))
1475+
response = self._dispatch('post', "/api/apps/{}/config".format(app), json.dumps(body))
14761476
finally:
14771477
progress.cancel()
14781478
progress.join()
@@ -1483,7 +1483,7 @@ def limits_unset(self, args):
14831483
else:
14841484
raise ResponseError(response)
14851485

1486-
def _print_limits(self, app, limit):
1486+
def _print_limits(self, app, config):
14871487
print("=== {} Limits".format(app))
14881488

14891489
def write(d):
@@ -1498,9 +1498,9 @@ def write(d):
14981498
print(("{k:<" + str(width) + "} {v}").format(**locals()))
14991499

15001500
print("\n--- Memory")
1501-
write(json.loads(limit.get('memory', '{}')))
1501+
write(json.loads(config.get('memory', '{}')))
15021502
print("\n--- CPU")
1503-
write(json.loads(limit.get('cpu', '{}')))
1503+
write(json.loads(config.get('cpu', '{}')))
15041504

15051505
def ps(self, args):
15061506
"""

controller/api/models.py

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,8 @@ def _command_announceable(self):
308308
@transition(field=state, source=INITIALIZED, target=CREATED)
309309
def create(self):
310310
image = self.release.image
311-
kwargs = {}
312-
if self.release.config.limit is not None:
313-
kwargs = {'memory': self.release.config.limit.memory,
314-
'cpu': self.release.config.limit.cpu}
311+
kwargs = {'memory': self.release.config.memory,
312+
'cpu': self.release.config.cpu}
315313
self._scheduler.create(name=self._job_id,
316314
image=image,
317315
command=self._command,
@@ -339,10 +337,8 @@ def deploy(self, release):
339337
new_job_id = self._job_id
340338
image = self.release.image
341339
c_type = self.type
342-
kwargs = {}
343-
if self.release.config.limit is not None:
344-
kwargs = {'memory': self.release.config.limit.memory,
345-
'cpu': self.release.config.limit.cpu}
340+
kwargs = {'memory': self.release.config.memory,
341+
'cpu': self.release.config.cpu}
346342
self._scheduler.create(name=new_job_id,
347343
image=image,
348344
command=self._command.format(**locals()),
@@ -433,26 +429,6 @@ class Config(UuidAuditedModel):
433429
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
434430
app = models.ForeignKey('App')
435431
values = fields.JSONField(default='{}', blank=True)
436-
limit = models.ForeignKey('Limit', null=True)
437-
438-
class Meta:
439-
get_latest_by = 'created'
440-
ordering = ['-created']
441-
unique_together = (('app', 'uuid'),)
442-
443-
def __str__(self):
444-
return "{}-{}".format(self.app.id, self.uuid[:7])
445-
446-
447-
@python_2_unicode_compatible
448-
class Limit(UuidAuditedModel):
449-
"""
450-
Set of resource limits applied by the scheduler
451-
during runtime execution of the Application.
452-
"""
453-
454-
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
455-
app = models.ForeignKey('App')
456432
memory = fields.JSONField(default='{}', blank=True)
457433
cpu = fields.JSONField(default='{}', blank=True)
458434

@@ -553,7 +529,6 @@ def save(self, *args, **kwargs): # noqa
553529
# compare this build to the previous build
554530
old_build = prev_release.build if prev_release else None
555531
old_config = prev_release.config if prev_release else None
556-
old_limit = prev_release.config.limit if prev_release else None
557532
# if the build changed, log it and who pushed it
558533
if self.version == 1:
559534
self.summary += "{} created initial release".format(self.app.owner)
@@ -579,15 +554,14 @@ def save(self, *args, **kwargs): # noqa
579554
if self.summary:
580555
self.summary += ' and '
581556
self.summary += "{} {}".format(self.config.owner, changes)
582-
# if the limit changes, log the dict diff
583-
if self.config.limit != old_limit:
557+
# if the limits changed (memory or cpu), log the dict diff
584558
changes = []
585-
old_mem = old_limit.memory if old_limit else {}
586-
diff = dict_diff(self.config.limit.memory, old_mem)
559+
old_mem = old_config.memory if old_config else {}
560+
diff = dict_diff(self.config.memory, old_mem)
587561
if diff.get('added') or diff.get('changed') or diff.get('deleted'):
588562
changes.append('memory')
589-
old_cpu = old_limit.cpu if old_limit else {}
590-
diff = dict_diff(self.config.limit.cpu, old_cpu)
563+
old_cpu = old_config.cpu if old_config else {}
564+
diff = dict_diff(self.config.cpu, old_cpu)
591565
if diff.get('added') or diff.get('changed') or diff.get('deleted'):
592566
changes.append('cpu')
593567
if changes:

controller/api/serializers.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -100,26 +100,14 @@ class ConfigSerializer(serializers.ModelSerializer):
100100
app = serializers.SlugRelatedField(slug_field='id')
101101
values = serializers.ModelField(
102102
model_field=models.Config()._meta.get_field('values'), required=False)
103-
104-
class Meta:
105-
"""Metadata options for a :class:`ConfigSerializer`."""
106-
model = models.Config
107-
read_only_fields = ('uuid', 'created', 'updated')
108-
109-
110-
class LimitSerializer(serializers.ModelSerializer):
111-
"""Serialize a :class:`~api.models.Limit` model."""
112-
113-
owner = serializers.Field(source='owner.username')
114-
app = serializers.SlugRelatedField(slug_field='id')
115103
memory = serializers.ModelField(
116-
model_field=models.Limit()._meta.get_field('memory'), required=False)
104+
model_field=models.Config()._meta.get_field('memory'), required=False)
117105
cpu = serializers.ModelField(
118-
model_field=models.Limit()._meta.get_field('cpu'), required=False)
106+
model_field=models.Config()._meta.get_field('cpu'), required=False)
119107

120108
class Meta:
121-
"""Metadata options for a :class:`LimitSerializer`."""
122-
model = models.Limit
109+
"""Metadata options for a :class:`ConfigSerializer`."""
110+
model = models.Config
123111
read_only_fields = ('uuid', 'created', 'updated')
124112

125113
def validate_memory(self, attrs, source):

0 commit comments

Comments
 (0)