Skip to content

Commit 7bb9336

Browse files
committed
fix(dryccpath): enforce replace mode for env variables
1 parent e88ba99 commit 7bb9336

4 files changed

Lines changed: 21 additions & 15 deletions

File tree

rootfs/api/models/build.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,14 @@ def _get_or_create_config(self):
120120
"""
121121
dryccfile to config
122122
"""
123-
config_values, config_values_ref, changed_fields = [], {}, set()
123+
config_values, config_values_ref, changed_fields, replace_groups = [], {}, set(), set()
124124
for group, envs in self.dryccfile.get('config', {}).items():
125125
for key, value in envs.items():
126+
replace_groups.add(group)
126127
config_values.append({"name": key, "group": group, "value": value})
127128
changed_fields.update(["values", "values_refs"])
128129

129-
replace_values_ptypes = set()
130+
replace_ptypes = set()
130131
for pipeline in self.dryccfile.get('pipeline', {}).values():
131132
if 'env' in pipeline or 'config' in pipeline:
132133
for key, value in pipeline.get('env', {}).items():
@@ -136,15 +137,15 @@ def _get_or_create_config(self):
136137
config_values_ref[pipeline['ptype']] = [config_ref]
137138
else:
138139
config_values_ref[pipeline['ptype']].append(config_ref)
139-
replace_values_ptypes.add(pipeline['ptype'])
140+
replace_ptypes.add(pipeline['ptype'])
140141
changed_fields.update(["values", "values_refs"])
141142

142143
old_config = self.app.release_set.filter(failed=False).latest().config
143144
if not changed_fields:
144145
return old_config
145146
config = Config(
146147
owner=self.owner, app=self.app, values=config_values, values_refs=config_values_ref)
147-
config.merge_field("values", old_config, replace_values_ptypes)
148-
config.merge_field("values_refs", old_config, replace_values_ptypes)
148+
config.merge_field("values", old_config, replace_ptypes, replace_groups)
149+
config.merge_field("values_refs", old_config, replace_ptypes)
149150
config.save(ignore_update_fields=changed_fields)
150151
return config

rootfs/api/models/config.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,12 @@ def save(self, ignore_update_fields=None, *args, **kwargs):
139139
self._update_tags(previous_config={'tags': {}})
140140
return super(Config, self).save(*args, **kwargs)
141141

142-
def merge_field(self, field, old_config, replace_ptypes=[]):
142+
def merge_field(self, field, old_config, *args, **kwargs):
143143
getattr(
144144
self,
145145
"_update_%s" % field,
146146
partial(self._update_field, field)
147-
)(old_config, replace_ptypes)
147+
)(old_config, *args, **kwargs)
148148

149149
def _update_field(self, field, previous_config, replace_ptypes=[]):
150150
data = {
@@ -164,10 +164,10 @@ def _update_field(self, field, previous_config, replace_ptypes=[]):
164164
data[key] = self._merge_data(field, data.get(key, {}), value)
165165
setattr(self, field, data)
166166

167-
def _update_values(self, previous_config, replace_ptypes=[]):
167+
def _update_values(self, previous_config, replace_ptypes=[], replace_groups=[]):
168168
data = [
169169
item for item in getattr(previous_config, 'values', []).copy()
170-
if item.get('ptype') not in replace_ptypes
170+
if item.get('ptype') not in replace_ptypes and item.get('group') not in replace_groups
171171
]
172172
new_data = getattr(self, 'values', []).copy()
173173
for new_item in new_data:

rootfs/api/tests/test_config.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,12 @@ def test_config_merge_false_with_empty_values(self, mock_requests):
187187
# replace with empty config using merge='false'
188188
body = {'values': []}
189189
response = self.client.post(f"{url}?merge=false", body)
190-
self.assertEqual(response.status_code, 201, response.data)
190+
self.assertEqual(response.status_code, 409, response.data)
191191

192192
# verify config is empty
193193
response = self.client.get(url)
194194
self.assertEqual(response.status_code, 200, response.data)
195-
self.assertEqual(len(response.data['values']), 0)
195+
self.assertEqual(len(response.data['values']), 1)
196196

197197
def test_config_merge_false_case_insensitive(self, mock_requests):
198198
"""
@@ -970,9 +970,9 @@ def test_config_from_dryccfile(self, mock_requests):
970970
self.assertEqual(
971971
release.config.envs("web"),
972972
{
973-
'GROUP': 'g1', 'DEBUG': 'tr', 'TEST1': 'g1', 'TEST2': 'tr', 'PENV1': 'web',
974-
'PENV2': 'web', "WEBSITE": "www.drycc.cc",
975-
}
973+
'WEBSITE': 'www.drycc.cc', 'GROUP': 'g1', 'DEBUG': 'tr',
974+
'PENV1': 'web', 'PENV2': 'web', 'TEST1': 'g1', 'TEST2': 'tr',
975+
},
976976
)
977977

978978
# test use old config and healthcheck
@@ -1001,5 +1001,5 @@ def test_config_from_dryccfile(self, mock_requests):
10011001
self.assertEqual(response.status_code, 201, response.data)
10021002
release = app.release_set.latest()
10031003
self.assertEqual(release.failed, False)
1004-
self.assertEqual(release.config.envs("web"), {"WEBSITE": "www.drycc.cc"})
1004+
self.assertEqual(release.config.envs("web"), {'WEBSITE': 'www.drycc.cc'})
10051005
self.assertEqual(release.config.values_refs, {})

rootfs/api/views.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,11 @@ def create(self, request, **kwargs):
443443
return super().create(request, **kwargs)
444444
values = self.get_serializer().validate_values(request.data.get('values'))
445445
config = self.model(app=self.get_app(), owner=self.request.user, values=values)
446+
old_config = config.previous()
447+
if old_config and old_config.values:
448+
replace_ptypes = {v['ptype'] for v in config.values if 'ptype' in v}
449+
replace_groups = {v['group'] for v in config.values if 'group' in v}
450+
config.merge_field("values", old_config, replace_ptypes, replace_groups)
446451
config.save(ignore_update_fields=["values"])
447452
self.post_save(config)
448453
return Response(status=status.HTTP_201_CREATED)

0 commit comments

Comments
 (0)