
Now only required resource values are fetched on calculating effective values. Calculation of effective values optimised to use indexed resource values insead of going throw nested for loop. Test for fetching values and effective values for 500 items (nodes) added. Each resource value contains over than 10000 keys. Logging added to the resource values fetching. Change-Id: Icea7ece8a2bc6957bcb00c9d90d8cf59e5ca1da0 Closes-Bug: #1626147
292 lines
11 KiB
Python
292 lines
11 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import itertools
|
|
|
|
from tuning_box import db
|
|
from tuning_box.tests.test_app import BaseTest
|
|
|
|
|
|
class TestResourceOverrides(BaseTest):
|
|
|
|
object_url = '/environments/{0}/{1}/resources/{2}/overrides'
|
|
object_keys_url = object_url + '/keys/{3}'
|
|
|
|
def test_put_resource_values_overrides_root(self):
|
|
self._fixture()
|
|
res = self.client.put('/environments/9/resources/5/overrides',
|
|
data={'k': 'v'})
|
|
self.assertEqual(res.status_code, 204)
|
|
self.assertEqual(res.data, b'')
|
|
with self.app.app_context():
|
|
resource_values = db.ResourceValues.query.filter_by(
|
|
environment_id=9, resource_definition_id=5).one_or_none()
|
|
self.assertIsNotNone(resource_values)
|
|
self.assertEqual(resource_values.overrides, {'k': 'v'})
|
|
self.assertIsNone(resource_values.level_value)
|
|
|
|
def test_put_resource_values_overrides_deep(self):
|
|
self._fixture()
|
|
res = self.client.put(
|
|
'/environments/9/lvl1/val1/lvl2/val2/resources/5/overrides',
|
|
data={'k': 'v'},
|
|
)
|
|
self.assertEqual(res.status_code, 204)
|
|
self.assertEqual(res.data, b'')
|
|
with self.app.app_context():
|
|
resource_values = db.ResourceValues.query.filter_by(
|
|
environment_id=9, resource_definition_id=5).one_or_none()
|
|
self.assertIsNotNone(resource_values)
|
|
self.assertEqual(resource_values.overrides, {'k': 'v'})
|
|
level_value = resource_values.level_value
|
|
self.assertIsNotNone(level_value)
|
|
self.assertEqual(level_value.level.name, 'lvl2')
|
|
self.assertEqual(level_value.value, 'val2')
|
|
level = level_value.level.parent
|
|
self.assertIsNotNone(level)
|
|
self.assertEqual(level.name, 'lvl1')
|
|
self.assertIsNone(level.parent)
|
|
|
|
def test_get_resource_values_local_override(self):
|
|
self._fixture()
|
|
self.client.put('/environments/9/lvl1/1/resources/5/values',
|
|
data={'key': 'value1'})
|
|
res = self.client.put('/environments/9/lvl1/1/resources/5/overrides',
|
|
data={'key': 'value2'})
|
|
self.assertEqual(res.status_code, 204)
|
|
self.assertEqual(res.data, b'')
|
|
res = self.client.get(
|
|
'/environments/9/lvl1/1/resources/5/values?effective',
|
|
)
|
|
self.assertEqual(res.status_code, 200)
|
|
self.assertEqual(res.json, {'key': 'value2'})
|
|
|
|
def test_get_resource_values_level_override(self):
|
|
self._fixture()
|
|
self.client.put('/environments/9/resources/5/values',
|
|
data={'key': 'value', 'key1': 'value'})
|
|
self.client.put('/environments/9/lvl1/1/resources/5/values',
|
|
data={'key': 'value1'})
|
|
res = self.client.put('/environments/9/lvl1/2/resources/5/values',
|
|
data={'key1': 'value2'})
|
|
self.assertEqual(res.status_code, 204)
|
|
self.assertEqual(res.data, b'')
|
|
res = self.client.get(
|
|
'/environments/9/lvl1/1/resources/5/values?effective',
|
|
)
|
|
self.assertEqual(res.status_code, 200)
|
|
self.assertEqual(res.json, {'key': 'value1', 'key1': 'value'})
|
|
|
|
def test_get_resource_values_level_and_local_override(self):
|
|
self._fixture()
|
|
self.client.put('/environments/9/resources/5/values',
|
|
data={'key': 'value', 'key1': 'value'})
|
|
self.client.put('/environments/9/lvl1/1/resources/5/values',
|
|
data={'key': 'value1'})
|
|
res = self.client.put('/environments/9/lvl1/1/resources/5/overrides',
|
|
data={'key1': 'value2'})
|
|
self.assertEqual(res.status_code, 204)
|
|
self.assertEqual(res.data, b'')
|
|
res = self.client.get(
|
|
'/environments/9/lvl1/1/resources/5/values?effective',
|
|
)
|
|
self.assertEqual(res.status_code, 200)
|
|
self.assertEqual(res.json, {'key': 'value1', 'key1': 'value2'})
|
|
|
|
def test_put_resource_overrides_redirect(self):
|
|
self._fixture()
|
|
res = self.client.put(
|
|
'/environments/9/lvl1/val1/lvl2/val2/resources/resdef1/overrides',
|
|
data={'k': 'v'},
|
|
)
|
|
self.assertEqual(res.status_code, 308)
|
|
self.assertEqual(
|
|
res.headers['Location'],
|
|
'http://localhost'
|
|
'/environments/9/lvl1/val1/lvl2/val2/resources/5/overrides',
|
|
)
|
|
|
|
def test_get_resource_overrides_redirect(self):
|
|
self._fixture()
|
|
self.client.put('/environments/9/resources/5/overrides',
|
|
data={'key': 'value'})
|
|
res = self.client.get(
|
|
'/environments/9/lvl1/val1/lvl2/val2/resources/resdef1/overrides',
|
|
)
|
|
self.assertEqual(res.status_code, 308)
|
|
self.assertEqual(
|
|
res.headers['Location'],
|
|
'http://localhost'
|
|
'/environments/9/lvl1/val1/lvl2/val2/resources/5/overrides',
|
|
)
|
|
|
|
def test_put_resource_overrides_set_operation_error(self):
|
|
self.app.config["PROPAGATE_EXCEPTIONS"] = True
|
|
self._fixture()
|
|
|
|
environment_id = 9
|
|
res_def_id = 5
|
|
levels = (('lvl1', 'val1'), ('lvl2', 'val2'))
|
|
overrides = {'key': 'val_overridden'}
|
|
self._add_resource_overrides(environment_id, res_def_id, levels,
|
|
overrides)
|
|
|
|
data = [['a', 'b', 'c', 'value']]
|
|
obj_keys_url = self.object_keys_url.format(
|
|
environment_id,
|
|
'/'.join(itertools.chain.from_iterable(levels)),
|
|
res_def_id,
|
|
'set'
|
|
)
|
|
|
|
res = self.client.put(obj_keys_url, data=data)
|
|
self.assertEqual(409, res.status_code)
|
|
|
|
def test_put_resource_overrides_set(self):
|
|
self._fixture()
|
|
environment_id = 9
|
|
res_def_id = 5
|
|
levels = (('lvl1', 'val1'), ('lvl2', 'val2'))
|
|
overrides = {'key': 'val_overridden'}
|
|
self._add_resource_overrides(environment_id, res_def_id, levels,
|
|
overrides)
|
|
|
|
obj_url = self.object_url.format(
|
|
environment_id,
|
|
'/'.join(itertools.chain.from_iterable(levels)),
|
|
res_def_id
|
|
)
|
|
obj_keys_url = obj_url + '/keys/set'
|
|
|
|
data = [['key', 'key_over'], ['key_x', 'key_x_over']]
|
|
res = self.client.put(obj_keys_url, data=data)
|
|
self.assertEqual(204, res.status_code)
|
|
|
|
res = self.client.get(obj_url)
|
|
self.assertEqual(200, res.status_code)
|
|
actual = res.json
|
|
self.assertEqual({'key': 'key_over', 'key_x': 'key_x_over'},
|
|
actual)
|
|
|
|
def test_put_resource_overrides_set_no_levels(self):
|
|
self._fixture()
|
|
environment_id = 9
|
|
res_def_id = 5
|
|
values = {'key': 'val'}
|
|
self._add_resource_overrides(environment_id, res_def_id, (), values)
|
|
|
|
obj_url = '/environments/{0}/resources/{1}/overrides'.format(
|
|
environment_id, res_def_id)
|
|
obj_keys_url = obj_url + '/keys/set'
|
|
|
|
data = [['key', 'key_value'], ['key_x', 'key_x_value']]
|
|
res = self.client.put(obj_keys_url, data=data)
|
|
self.assertEqual(204, res.status_code)
|
|
|
|
res = self.client.get(obj_url)
|
|
self.assertEqual(200, res.status_code)
|
|
actual = res.json
|
|
self.assertEqual({'key': 'key_value', 'key_x': 'key_x_value'},
|
|
actual)
|
|
|
|
def test_put_resource_overrides_delete(self):
|
|
self._fixture()
|
|
environment_id = 9
|
|
res_def_id = 5
|
|
levels = (('lvl1', 'val1'), ('lvl2', 'val2'))
|
|
overrides = {'key_0': 'val_0', 'key_1': 'val_1'}
|
|
self._add_resource_overrides(environment_id, res_def_id, levels,
|
|
overrides)
|
|
|
|
obj_url = self.object_url.format(
|
|
environment_id,
|
|
'/'.join(itertools.chain.from_iterable(levels)),
|
|
res_def_id
|
|
)
|
|
obj_keys_url = obj_url + '/keys/delete'
|
|
|
|
data = [['key_0']]
|
|
res = self.client.put(obj_keys_url, data=data)
|
|
self.assertEqual(204, res.status_code)
|
|
|
|
res = self.client.get(obj_url)
|
|
self.assertEqual(200, res.status_code)
|
|
actual = res.json
|
|
self.assertEqual({'key_1': 'val_1'}, actual)
|
|
|
|
def test_put_resource_overrides_delete_operation_error(self):
|
|
self.app.config["PROPAGATE_EXCEPTIONS"] = True
|
|
self._fixture()
|
|
environment_id = 9
|
|
res_def_id = 5
|
|
levels = (('lvl1', 'val1'), ('lvl2', 'val2'))
|
|
overrides = {'key_0': 'val_0', 'key_1': 'val_1'}
|
|
self._add_resource_overrides(environment_id, res_def_id, levels,
|
|
overrides)
|
|
|
|
obj_keys_url = self.object_keys_url.format(
|
|
environment_id,
|
|
'/'.join(itertools.chain.from_iterable(levels)),
|
|
res_def_id,
|
|
'delete'
|
|
)
|
|
data = [['fake_key']]
|
|
res = self.client.put(obj_keys_url, data=data)
|
|
self.assertEqual(409, res.status_code)
|
|
|
|
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',
|
|
query_string={'effective': 1, 'show_lookup': 1}
|
|
)
|
|
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)
|