# Copyright 2014 Huawei Technologies Co. Ltd # # 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. """Adapter database operations.""" from compass.db import api from compass.db.api import database from compass.db.api.utils import wrap_to_dict from compass.db.exception import RecordNotExists from compass.db.models import Adapter from compass.db.models import OSConfigMetadata # from compass.db.models import PackageConfigMetadata SUPPORTED_FILTERS = ['name'] ERROR_MSG = { 'findNoAdapter': 'Cannot find the Adapter, ID is %d', 'findNoOs': 'Cannot find OS, ID is %d' } @wrap_to_dict() def get_adapter(adapter_id, return_roles=False): with database.session() as session: adapter = _get_adapter(session, adapter_id) info = adapter.to_dict() if return_roles: roles = adapter.roles info = [role.name for role in roles] return info @wrap_to_dict() def get_adapter_config_schema(adapter_id, os_id): with database.session() as session: adapter = _get_adapter(session, adapter_id) os_list = [] if not os_id: os_list = [os.id for os in adapter.support_os] else: os_list = [os_id] schema = _get_adapter_config_schema(session, adapter_id, os_list) return schema @wrap_to_dict() def list_adapters(filters=None): """List all users, optionally filtered by some fields.""" with database.session() as session: adapters = _list_adapters(session, filters) adapters_list = [adapter.to_dict() for adapter in adapters] return adapters_list def _get_adapter(session, adapter_id): """Get the adapter by ID.""" with session.begin(subtransactions=True): adapter = api.model_query(session, Adapter).first() if not adapter: err_msg = ERROR_MSG['findNoAdapter'] % adapter_id raise RecordNotExists(err_msg) return adapter def _list_adapters(session, filters=None): """Get all adapters, optionally filtered by some fields.""" filters = filters or {} with session.begin(subtransactions=True): query = api.model_query(session, Adapter) adapters = api.model_filter(query, Adapter, filters, SUPPORTED_FILTERS).all() return adapters #TODO(Grace): TMP method def _get_adapter_config_schema(session, adapter_id, os_list): output_dict = {} with session.begin(subtransactions=True): os_root = session.query(OSConfigMetadata).filter_by(name="os_config")\ .first() # pk_root = session.query(PackageConfigMetadata\ # .filter_by(name="os_config").first() os_config_list = [] for os_id in os_list: os_config_dict = {"_name": "os_config"} output_dict = {} output_dict["os_config"] = os_config_dict _get_adapter_config_helper(os_root, os_config_dict, output_dict, "os_id", os_id) result = {"os_id": os_id} result.update(output_dict) os_config_list.append(result) """ package_config_dict = {"_name": "package_config"} output_dict = {} output_dict["package_config"] = package_config_dict _get_adapter_config_internal(pk_root, package_config_dict, output_dict, "adapter_id", adapter_id) """ output_dict = {} output_dict["os_config"] = os_config_list return output_dict # A recursive function # This assumes that only leaf nodes have field entry and that # an intermediate node in config_metadata table does not have field entries def _get_adapter_config_helper(node, current_dict, parent_dict, id_name, id_value): children = node.children if children: for c in children: col_value = getattr(c, id_name) if col_value is None or col_value == id_value: child_dict = {"_name": c.name} current_dict[c.name] = child_dict _get_adapter_config_helper(c, child_dict, current_dict, id_name, id_value) del current_dict["_name"] else: fields = node.fields fields_dict = {} for field in fields: info = field.to_dict() name = info['field'] del info['field'] fields_dict[name] = info parent_dict[current_dict["_name"]] = fields_dict