
Referecne to level values added to DB model and level marshalling. Fuel2 commands lvl show, lvl list added. Change-Id: I11fb465c00c411464d75229fc2f8bffdbb8dcc53 Closes-Bug: #1642326
111 lines
3.8 KiB
Python
111 lines
3.8 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 = {
|
|
'id': fields.Integer,
|
|
'name': fields.String,
|
|
'environment_id': fields.Integer,
|
|
'parent': fields.String(attribute='parent.name'),
|
|
'values': fields.List(fields.String(attribute='value'))
|
|
}
|
|
|
|
|
|
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_query_params(self, environment_id, id_or_name):
|
|
params = {'environment_id': environment_id}
|
|
if isinstance(id_or_name, int):
|
|
params['id'] = id_or_name
|
|
else:
|
|
params['name'] = id_or_name
|
|
return params
|
|
|
|
def get(self, environment_id, id_or_name):
|
|
params = self._get_query_params(environment_id, id_or_name)
|
|
level = db.find_or_404(db.EnvironmentHierarchyLevel, **params)
|
|
return level
|
|
|
|
@db.with_transaction
|
|
def _do_update(self, environment_id, id_or_name):
|
|
params = self._get_query_params(environment_id, id_or_name)
|
|
level = db.find_or_404(db.EnvironmentHierarchyLevel, **params)
|
|
level.name = flask.request.json.get('name', level.name)
|
|
|
|
def put(self, environment_id, id_or_name):
|
|
return self.patch(environment_id, id_or_name)
|
|
|
|
def patch(self, environment_id, id_or_name):
|
|
self._do_update(environment_id, id_or_name)
|
|
return None, 204
|