diff --git a/compass/api/api.py b/compass/api/api.py index 53841ed1..d5c16937 100644 --- a/compass/api/api.py +++ b/compass/api/api.py @@ -1379,12 +1379,11 @@ def convert_flavor_metadata(flavor_id): flavor_id, user=current_user ) metadata = metadatas['flavor_config'] - clusters = cluster_api.list_clusters( + flavor = metadata_api.get_flavor( + flavor_id, user=current_user ) - for cluster in clusters: - if cluster['flavor']['id'] == flavor_id: - flavor_name = cluster['flavor_name'].replace('-', '_') + flavor_name = flavor['name'].replace('-', '_') configs = util.load_configs(setting.FLAVOR_MAPPING_DIR) for item in configs: if flavor_name in item.keys(): diff --git a/compass/db/api/cluster.py b/compass/db/api/cluster.py index 3c586ebe..d377d6e3 100644 --- a/compass/db/api/cluster.py +++ b/compass/db/api/cluster.py @@ -467,8 +467,8 @@ def update_cluster_config(cluster_id, user=None, session=None, **kwargs): ) def package_config_validates(config): - metadata_api.validate_package_config( - session, config, adapter_id=cluster.adapter_id + metadata_api.validate_flavor_config( + session, config, flavor_id=cluster.flavor.id ) @utils.input_validates( @@ -511,8 +511,8 @@ def patch_cluster_config(cluster_id, user=None, session=None, **kwargs): ) def package_config_validates(config): - metadata_api.validate_package_config( - session, config, adapter_id=cluster.adapter_id + metadata_api.validate_flavor_config( + session, config, flavor_id=cluster.flavor.id ) @utils.output_validates( @@ -1081,8 +1081,8 @@ def _update_clusterhost_config(session, user, clusterhost, **kwargs): def package_config_validates(package_config): cluster = clusterhost.cluster is_cluster_editable(session, cluster, user) - metadata_api.validate_package_config( - session, package_config, cluster.adapter_id + metadata_api.validate_flavor_config( + session, package_config, cluster.flavor.id ) @utils.supported_filters( @@ -1241,8 +1241,8 @@ def _patch_clusterhost_config(session, user, clusterhost, **kwargs): def package_config_validates(package_config): cluster = clusterhost.cluster is_cluster_editable(session, cluster, user) - metadata_api.validate_package_config( - session, package_config, cluster.adapter_id + metadata_api.validate_flavor_config( + session, package_config, cluster.flavor.id ) @utils.supported_filters( @@ -1528,8 +1528,8 @@ def review_cluster(cluster_id, review={}, user=None, session=None, **kwargs): cluster=cluster ) if package_config: - metadata_api.validate_package_config( - session, package_config, cluster.adapter_id, True + metadata_api.validate_flavor_config( + session, package_config, cluster.flavor.id, True ) for clusterhost in clusterhosts: clusterhost_package_config = copy.deepcopy( @@ -1542,9 +1542,9 @@ def review_cluster(cluster_id, review={}, user=None, session=None, **kwargs): deployed_package_config = util.merge_dict( package_config, clusterhost_package_config ) - metadata_api.validate_package_config( + metadata_api.validate_flavor_config( session, deployed_package_config, - cluster.adapter_id, True + cluster.flavor.id, True ) validate_clusterhost(session, clusterhost) utils.update_db_object( diff --git a/compass/db/api/metadata_holder.py b/compass/db/api/metadata_holder.py index 87513f04..a91900a0 100644 --- a/compass/db/api/metadata_holder.py +++ b/compass/db/api/metadata_holder.py @@ -21,6 +21,7 @@ from compass.db.api import permission from compass.db.api import user as user_api from compass.db.api import utils from compass.db import exception +from compass.db import models from compass.utils import setting_wrapper as setting from compass.utils import util @@ -28,6 +29,9 @@ from compass.utils import util RESP_METADATA_FIELDS = [ 'os_config', 'package_config', 'flavor_config' ] +RESP_FLAVORS_FIELDS = [ + 'id', 'name', 'display_name', 'template', 'roles' +] @database.run_in_session() @@ -99,6 +103,17 @@ def validate_package_config( ) +def validate_flavor_config( + session, config, flavor_id, whole_check=False, **kwargs +): + if not FLAVOR_METADATA_MAPPING: + load_flavor_metadatas_internal(session) + _validate_config( + config, flavor_id, 'flavor', FLAVOR_METADATA_MAPPING, + whole_check, session=session, **kwargs + ) + + def _filter_metadata(metadata, **kwargs): if not isinstance(metadata, dict): return metadata @@ -176,6 +191,32 @@ def get_flavor_metadata(flavor_id, user=None, session=None, **kwargs): } +@utils.supported_filters([]) +@database.run_in_session() +@user_api.check_user_permission_in_session( + permission.PERMISSION_LIST_METADATAS +) +@utils.wrap_to_dict(RESP_FLAVORS_FIELDS) +def list_flavors(user=None, session=None, **filters): + """List flavors.""" + return utils.list_db_objects( + session, models.AdapterFlavor, **filters + ) + + +@utils.supported_filters([]) +@database.run_in_session() +@user_api.check_user_permission_in_session( + permission.PERMISSION_LIST_METADATAS +) +@utils.wrap_to_dict(RESP_FLAVORS_FIELDS) +def get_flavor(flavor_id, user=None, session=None, **kwargs): + """Get flavor.""" + return utils.get_db_object( + session, models.AdapterFlavor, id=flavor_id + ) + + def get_os_metadata_internal(session, os_id): """get os metadata internal.""" if not OS_METADATA_MAPPING: diff --git a/compass/tests/db/api/test_metadata_holder.py b/compass/tests/db/api/test_metadata_holder.py index 38df5c82..8c3149e8 100644 --- a/compass/tests/db/api/test_metadata_holder.py +++ b/compass/tests/db/api/test_metadata_holder.py @@ -310,6 +310,55 @@ class TestGetPackageOsMetadata(MetadataTestCase): ) +class TestListFlavors(MetadataTestCase): + def setUp(self): + super(TestListFlavors, self).setUp() + + def tesrDown(self): + super(TestListFlavors, self).tearDown() + + def test_list_flavors(self): + """Test list flavors.""" + flavors = metadata.list_flavors( + user=self.user_object + ) + flavor_name = [] + for flavor in flavors: + flavor_name.append(flavor['name']) + expected = [ + 'allinone', + 'multiroles', + 'HA-multinodes', + 'single-contoller-multi-compute' + ] + for expect in expected: + self.assertIn(expect, flavor_name) + + +class TestGetFlavors(MetadataTestCase): + def setUp(self): + super(TestGetFlavors, self).setUp() + + def tearDown(self): + super(TestGetFlavors, self).tearDown() + + def test_get_flavor(self): + """Test get a flavor.""" + flavor = metadata.get_flavor( + self.flavor_id, + user=self.user_object + ) + expected = { + 'display_name': 'Multi-node Cluster with HA', + 'id': 3, + 'template': 'ha_multinodes.tmpl', + 'name': 'HA-multinodes' + } + self.assertTrue( + all(item in flavor.items() for item in expected.items()) + ) + + if __name__ == '__main__': flags.init() logsetting.init() diff --git a/conf/package_metadata/openstack.conf b/conf/package_metadata/openstack.conf index ed90df23..fc44e3dc 100644 --- a/conf/package_metadata/openstack.conf +++ b/conf/package_metadata/openstack.conf @@ -135,15 +135,4 @@ METADATA = { } } }, - 'ha_proxy': { - '_self': { - }, - 'vip': { - '_self': { - 'is_required': True, - 'field': 'general', - 'mapping_to': 'ha_vip' - } - } - } }