tuning-box/tuning_box/tests/library/test_resource_overrides.py
Alexander Kislitsky 3705aa1526 Fetching effective resource values optimized
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
2016-09-22 14:12:37 +03:00

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)