diff --git a/tuning_box/library/resource_values.py b/tuning_box/library/resource_values.py index 687fb9e..fe4d7a1 100644 --- a/tuning_box/library/resource_values.py +++ b/tuning_box/library/resource_values.py @@ -70,16 +70,35 @@ class ResourceValues(flask_restful.Resource): environment, levels)) if 'effective' in flask.request.args: + show_lookup = 'show_lookup' in flask.request.args resource_values = db.ResourceValues.query.filter_by( resource_definition=res_def, environment=environment, ).all() result = {} + lookup_path = '' for level_value in itertools.chain([None], level_values): + if level_value is not None: + name = level_value.level.name + value = level_value.value + lookup_path += name + '/' + value + '/' + else: + lookup_path += '/' + for resource_value in resource_values: if resource_value.level_value == level_value: - result.update(resource_value.values) - result.update(resource_value.overrides) + if show_lookup: + values = {} + for k, v in resource_value.values.items(): + values[k] = (v, lookup_path) + overrides = {} + for k, v in resource_value.overrides.items(): + overrides[k] = (v, lookup_path) + else: + values = resource_value.values + overrides = resource_value.overrides + result.update(values) + result.update(overrides) break return result else: diff --git a/tuning_box/tests/library/test_resource_overrides.py b/tuning_box/tests/library/test_resource_overrides.py index 3f32183..76f4010 100644 --- a/tuning_box/tests/library/test_resource_overrides.py +++ b/tuning_box/tests/library/test_resource_overrides.py @@ -246,3 +246,46 @@ class TestResourceOverrides(BaseTest): data = [['key_0', 'val_0']] res = self.client.put(obj_keys_url, data=data) self.assertEqual(409, res.status_code) + + def test_get_resource_overrides_effective_with_lookup(self): + self._fixture() + res = self.client.put('/environments/9/resources/5/values', + data={'key0': 'root_value_0', + 'key1': 'root_value_1', + 'key2': 'root_value_2', + 'key3': 'root_value_3'}) + self.assertEqual(res.status_code, 204) + res = self.client.put('/environments/9/lvl1/1/resources/5/values', + data={'key0': 'lvl1_value_0'}) + self.assertEqual(res.status_code, 204) + + # Override key0 on level1 + res = self.client.put('/environments/9/lvl1/1/resources/5/overrides', + data={'key0': 'lvl1_overrides_0'}) + self.assertEqual(res.status_code, 204) + + # Override key1 on level1/level2 + res = self.client.put( + '/environments/9/lvl1/1/lvl2/2/resources/5/values', + data={'key1': 'lvl2_value_1', 'key2': 'lvl2_value_2'} + ) + self.assertEqual(res.status_code, 204) + res = self.client.put( + '/environments/9/lvl1/1/lvl2/2/resources/5/overrides', + data={'key1': 'lvl2_overrides_1'} + ) + self.assertEqual(res.status_code, 204) + + # Checking lookup info + res = self.client.get( + '/environments/9/lvl1/1/lvl2/2/resources/5/values?' + 'effective&show_lookup', + ) + self.assertEqual(res.status_code, 200) + expected = { + 'key0': ['lvl1_overrides_0', '/lvl1/1/'], + 'key1': ['lvl2_overrides_1', '/lvl1/1/lvl2/2/'], + 'key2': ['lvl2_value_2', '/lvl1/1/lvl2/2/'], + 'key3': ['root_value_3', '/'] + } + self.assertEqual(expected, res.json) diff --git a/tuning_box/tests/library/test_resource_values.py b/tuning_box/tests/library/test_resource_values.py index 33ebe5a..880ead6 100644 --- a/tuning_box/tests/library/test_resource_values.py +++ b/tuning_box/tests/library/test_resource_values.py @@ -258,3 +258,38 @@ class TestResourceValues(BaseTest): data = [['key_0', 'val_0']] res = self.client.put(obj_keys_url, data=data) self.assertEqual(409, res.status_code) + + def test_get_resource_values_effective_with_lookup(self): + self._fixture() + res = self.client.put('/environments/9/resources/5/values', + data={'key0': 'root_value_0', + 'key1': 'root_value_1', + 'key2': 'root_value_2', + 'key3': 'root_value_3'}) + self.assertEqual(res.status_code, 204) + + # Set key0 value on level1 + res = self.client.put('/environments/9/lvl1/1/resources/5/values', + data={'key0': 'lvl1_value_0'}) + self.assertEqual(res.status_code, 204) + + # Set key1, key2 values on level1/level2 + res = self.client.put( + '/environments/9/lvl1/1/lvl2/2/resources/5/values', + data={'key1': 'lvl2_value_1', 'key2': 'lvl2_value_2'} + ) + self.assertEqual(res.status_code, 204) + + # Checking lookup info + res = self.client.get( + '/environments/9/lvl1/1/lvl2/2/resources/5/values?' + 'effective&show_lookup', + ) + self.assertEqual(res.status_code, 200) + expected = { + 'key0': ['lvl1_value_0', '/lvl1/1/'], + 'key1': ['lvl2_value_1', '/lvl1/1/lvl2/2/'], + 'key2': ['lvl2_value_2', '/lvl1/1/lvl2/2/'], + 'key3': ['root_value_3', '/'] + } + self.assertEqual(expected, res.json)