Skip to content

Commit 91705da

Browse files
authored
Merge pull request #1144 from zinuzoid/new-label-cmd
feat(label-cmd): support new label cmd
2 parents 06211a2 + 92a0f8e commit 91705da

4 files changed

Lines changed: 108 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.2 on 2016-11-19 16:11
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import jsonfield.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('api', '0020_release_failed'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='appsettings',
18+
name='label',
19+
field=jsonfield.fields.JSONField(blank=True, default={}),
20+
),
21+
]

rootfs/api/models/appsettings.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class AppSettings(UuidAuditedModel):
2323
# and user just updating other fields meaning the values needs to be copied from prev release
2424
whitelist = ArrayField(models.CharField(max_length=50), default=None)
2525
autoscale = JSONField(default={}, blank=True)
26+
label = JSONField(default={}, blank=True)
2627

2728
class Meta:
2829
get_latest_by = 'created'
@@ -133,6 +134,38 @@ def update_autoscale(self, previous_settings):
133134
if changes:
134135
self.summary += ["{} {}".format(self.owner, changes)]
135136

137+
def update_label(self, previous_settings):
138+
data = getattr(previous_settings, 'label', {}).copy()
139+
new = getattr(self, 'label', {}).copy()
140+
if not previous_settings:
141+
return
142+
143+
# if nothing changed copy the settings from previous
144+
if not new and data:
145+
setattr(self, 'label', data)
146+
elif data != new:
147+
for k, v in new.items():
148+
if v is not None:
149+
data[k] = v
150+
else:
151+
if k not in data:
152+
raise UnprocessableEntity('{} does not exist under {}'.format(k, 'label')) # noqa
153+
del data[k]
154+
setattr(self, 'label', data)
155+
156+
diff = dict_diff(self.label, getattr(previous_settings, 'label', {}))
157+
added = ', '.join(list(map(lambda x: 'default' if x == '' else x, [k for k in diff.get('added', {})]))) # noqa
158+
added = 'added label ' + added if added else ''
159+
changed = ', '.join(list(map(lambda x: 'default' if x == '' else x, [k for k in diff.get('changed', {})]))) # noqa
160+
changed = 'changed label ' + changed if changed else ''
161+
deleted = ', '.join(list(map(lambda x: 'default' if x == '' else x, [k for k in diff.get('deleted', {})]))) # noqa
162+
deleted = 'deleted label ' + deleted if deleted else ''
163+
changes = ', '.join(i for i in (added, changed, deleted) if i)
164+
if changes:
165+
if self.summary:
166+
self.summary += ' and '
167+
self.summary += ["{} {}".format(self.owner, changes)]
168+
136169
def save(self, *args, **kwargs):
137170
self.summary = []
138171
previous_settings = None
@@ -146,6 +179,7 @@ def save(self, *args, **kwargs):
146179
self.update_routable(previous_settings)
147180
self.update_whitelist(previous_settings)
148181
self.update_autoscale(previous_settings)
182+
self.update_label(previous_settings)
149183
except (UnprocessableEntity, NotFound):
150184
raise
151185
except Exception as e:

rootfs/api/serializers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,7 @@ class AppSettingsSerializer(serializers.ModelSerializer):
489489
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
490490
owner = serializers.ReadOnlyField(source='owner.username')
491491
autoscale = JSONFieldSerializer(convert_to_str=False, required=False, binary=True)
492+
label = JSONFieldSerializer(convert_to_str=False, required=False, binary=True)
492493

493494
class Meta:
494495
"""Metadata options for a :class:`AppSettingsSerializer`."""

rootfs/api/tests/test_app_settings.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,55 @@ def test_autoscale_validations(self, mock_requests):
265265
{'autoscale': {'cmd': {'min': 4, 'cpu_percent': 45}}}
266266
)
267267
self.assertEqual(response.status_code, 400, response.data)
268+
269+
def test_settings_labels(self, mock_requests):
270+
"""
271+
Test that labels can be applied
272+
"""
273+
app_id = self.create_app()
274+
275+
# create
276+
base_labels = {
277+
'label':
278+
{
279+
'git_repo': 'https://github.com/deis/controller',
280+
'team': 'frontend',
281+
'empty': ''
282+
}
283+
}
284+
response = self.client.post(
285+
'/v2/apps/{app_id}/settings'.format(**locals()),
286+
base_labels
287+
)
288+
self.assertEqual(response.status_code, 201, response.data)
289+
self.assertEqual(response.data['label'], base_labels['label'])
290+
291+
# update
292+
labels = {'label': {'team': 'backend'}}
293+
response = self.client.post(
294+
'/v2/apps/{app_id}/settings'.format(**locals()),
295+
labels
296+
)
297+
self.assertEqual(response.status_code, 201, response.data)
298+
self.assertEqual(response.data['label']['team'], labels['label']['team'])
299+
self.assertEqual(response.data['label']['git_repo'], base_labels['label']['git_repo'])
300+
self.assertEqual(response.data['label']['empty'], base_labels['label']['empty'])
301+
302+
# remove
303+
labels = {'label': {'git_repo': None}}
304+
response = self.client.post(
305+
'/v2/apps/{app_id}/settings'.format(**locals()),
306+
labels
307+
)
308+
self.assertEqual(response.status_code, 201, response.data)
309+
self.assertEqual(response.data['label']['team'], 'backend')
310+
self.assertFalse('git_repo' in response.data['label'])
311+
self.assertEqual(response.data['label']['empty'], base_labels['label']['empty'])
312+
313+
# error on remove non-exist label
314+
labels = {'label': {'git_repo': None}}
315+
response = self.client.post(
316+
'/v2/apps/{app_id}/settings'.format(**locals()),
317+
labels
318+
)
319+
self.assertEqual(response.status_code, 422, response.data)

0 commit comments

Comments
 (0)