tuning-box/tuning_box/library/hierarchy_levels.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

103 lines
3.4 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 flask
from flask import current_app as app
import flask_restful
from flask_restful import fields
from tuning_box import db
from tuning_box import errors
def iter_environment_level_values(environment, levels):
app.logger.debug("Getting environment level values. Env: %s, "
"levels: %s", environment.id, levels)
env_levels = db.EnvironmentHierarchyLevel.get_for_environment(environment)
app.logger.debug("Environment levels got. Env: %s, levels: %s",
environment.id, [l.name for l in env_levels])
if len(env_levels) < len(levels):
raise errors.TuningboxNotFound(
"Levels {0} can't be matched with "
"environment {1} levels: {2}".format(
[l[0] for l in levels],
environment.id,
[l.name for l in env_levels]
)
)
level_pairs = zip(env_levels, levels)
for env_level, (level_name, level_value) in level_pairs:
if env_level.name != level_name:
raise errors.TuningboxNotFound(
"Unexpected level name '{0}'. Expected '{1}'.".format(
level_name, env_level.name)
)
level_value_db = db.get_or_create(
db.EnvironmentHierarchyLevelValue,
level=env_level,
value=level_value,
)
yield level_value_db
def get_environment_level_value(environment, levels):
level_value = None
for level_value in iter_environment_level_values(environment, levels):
pass
return level_value
environment_hierarchy_level_fields = {
'name': fields.String,
'environment_id': fields.Integer,
'parent': fields.String(attribute='parent.name')
}
class EnvironmentHierarchyLevelsCollection(flask_restful.Resource):
method_decorators = [
flask_restful.marshal_with(environment_hierarchy_level_fields)
]
def get(self, environment_id):
env = db.get_or_404(db.Environment, environment_id)
return db.EnvironmentHierarchyLevel.get_for_environment(env)
class EnvironmentHierarchyLevels(flask_restful.Resource):
method_decorators = [
flask_restful.marshal_with(environment_hierarchy_level_fields)
]
def get(self, environment_id, level):
level = db.find_or_404(db.EnvironmentHierarchyLevel,
environment_id=environment_id,
name=level)
return level
@db.with_transaction
def _do_update(self, environment_id, level):
level = db.find_or_404(db.EnvironmentHierarchyLevel,
environment_id=environment_id,
name=level)
level.name = flask.request.json.get('name', level.name)
def put(self, environment_id, level):
return self.patch(environment_id, level)
def patch(self, environment_id, level):
self._do_update(environment_id, level)
return None, 204