Add api to convert os metadata to ui os metadata

Change-Id: Iad5938a5e34a44506c82afb6cf5f8bea0610105e
This commit is contained in:
Lei Lei 2015-03-26 11:36:20 -07:00
parent 7fa34625ed
commit 8c68fb6f4c
27 changed files with 556 additions and 56 deletions

View File

@ -1334,6 +1334,26 @@ def show_os_metadata(os_id):
)
@app.route("/oses/<int:os_id>/ui_metadata", methods=['GET'])
@log_user_action
@login_required
@update_user_token
def convert_os_metadata(os_id):
"""Convert os metadata to ui os metadata."""
metadatas = metadata_api.get_os_metadata(
os_id, user=current_user
)
configs = util.load_configs(setting.OS_MAPPING_DIR)
metadata = metadatas['os_config']
config = configs[0]['OS_CONFIG_MAPPING']
return utils.make_json_response(
200,
metadata_api.get_ui_metadata(
metadata, config
)
)
@app.route(
"/adapters/<int:adapter_id>/oses/<int:os_id>/metadata",
methods=['GET']

View File

@ -21,6 +21,8 @@ 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.utils import setting_wrapper as setting
from compass.utils import util
RESP_METADATA_FIELDS = [
@ -133,7 +135,7 @@ def get_package_metadata_internal(session, adapter_id):
permission.PERMISSION_LIST_METADATAS
)
@utils.wrap_to_dict(RESP_METADATA_FIELDS)
def get_package_metadata(getter, adapter_id, session=None, **kwargs):
def get_package_metadata(adapter_id, user=None, session=None, **kwargs):
return {
'package_config': get_package_metadata_internal(session, adapter_id)
}
@ -158,18 +160,65 @@ def get_os_metadata_internal(session, os_id):
permission.PERMISSION_LIST_METADATAS
)
@utils.wrap_to_dict(RESP_METADATA_FIELDS)
def get_os_metadata(getter, os_id, session=None, **kwargs):
def get_os_metadata(os_id, user=None, session=None, **kwargs):
"""get os metadatas."""
return {'os_config': get_os_metadata_internal(session, os_id)}
def get_ui_metadata(metadata, config):
"""convert os_metadata to ui os_metadata."""
result_config = {}
result_config[config['mapped_name']] = []
for mapped_child in config['mapped_children']:
data_dict = {}
for config_key, config_value in mapped_child.items():
for key, value in config_value.items():
if 'data' == key:
result_data = []
_get_data(metadata[config_key], value, result_data)
data_dict['data'] = result_data
else:
data_dict[key] = value
result_config[config['mapped_name']].append(data_dict)
return result_config
def _get_data(metadata, config, result_data):
data_dict = {}
for key, config_value in config.items():
if isinstance(config_value, dict):
if key in metadata.keys():
_get_data(metadata[key], config_value, result_data)
else:
_get_data(metadata, config_value, result_data)
elif isinstance(config_value, list):
option_list = []
for item in config_value:
if isinstance(item, dict):
option_list.append(item)
data_dict[key] = option_list
else:
if isinstance(metadata['_self'][item], bool):
data_dict[item] = str(metadata['_self'][item])
else:
data_dict[item] = metadata['_self'][item]
else:
data_dict[key] = config_value
if data_dict:
result_data.append(data_dict)
return result_data
@utils.supported_filters([])
@database.run_in_session()
@user_api.check_user_permission_in_session(
permission.PERMISSION_LIST_METADATAS
)
@utils.wrap_to_dict(RESP_METADATA_FIELDS)
def get_package_os_metadata(getter, adapter_id, os_id, session=None, **kwargs):
def get_package_os_metadata(
adapter_id, os_id,
user=None, session=None, **kwargs
):
from compass.db.api import adapter_holder as adapter_api
adapter = adapter_api.get_adapter_internal(session, adapter_id)
os_ids = [os['os_id'] for os in adapter['supported_oses']]

View File

@ -322,7 +322,7 @@ class FieldMixin(HelperMixin):
Enum(
'checkbox', 'radio', 'select',
'multiselect', 'combobox', 'text',
'multitext', 'password'
'multitext', 'password', 'dropdown'
),
ColumnDefault('text')
)

View File

@ -0,0 +1,2 @@
NAME = 'domain'
VALIDATOR = is_valid_domain

View File

@ -1 +1,2 @@
NAME = 'general'
DISPLAY_TYPE = 'dropdown'

View File

@ -1,2 +1,3 @@
NAME = 'general_list'
FIELD_TYPE = list
DISPLAY_TYPE = 'multitext'

View File

@ -0,0 +1,4 @@
NAME = 'ip_list'
FIELD_TYPE = list
VALIDATOR = is_valid_ip
DISPLAY_TYPE = 'multitext'

View File

@ -1,3 +1,4 @@
NAME = 'password'
VALIDATOR = is_valid_password
DESCRIPTION = 'password'
DISPLAY_TYPE = 'password'

View File

@ -0,0 +1,2 @@
NAME = 'url'
VALIDATOR = is_valid_url

View File

@ -0,0 +1,129 @@
OS_CONFIG_MAPPING = {
"mapped_name": "os_global_config",
"mapped_children": [{
"server_credentials":{
"name": "sever_credentials",
"title": "Server Credentials",
"data": {
"username": {
"placeholder": "Username",
"display_name": "User name",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"password": {
"placeholder": "Password",
"display_name": "Password",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"confirm_password": {
"placeholder": "Confirm Password",
"name": "confirmPassword",
"placeholder": "Confirm Password",
"display_type": "password",
"required": "true",
"default_value": "huawei"
}
}
}
},{
"general": {
"name": "general",
"title": "",
"data": {
"language": {
"display_name": "Language",
"option": [{
"name": "English",
"value": "en"
},{
"name": "Chinese",
"value": "cn"
}],
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"timezone": {
"display_name": "Timezone",
"option": [{
"name": "Los Angeles",
"value": "Los Angeles"
},{
"name": "Chicago",
"value": "Chicago"
}],
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"http_proxy": {
"placeholder": "HTTP Proxy",
"display_name": "HTTP Proxy",
"mapped_key": [
"name", "is_required", "display_type"
]
},
"https_proxy": {
"placeholder": "HTTPS Proxy",
"display_name": "HTTPS Proxy",
"mapped_key": [
"name", "is_required", "display_type"
]
},
"no_proxy": {
"placeholder": "No Proxy",
"display_name": "No Proxy",
"mapped_key": [
"name", "is_required", "display_type"
]
},
"ntp_server": {
"placeholder": "NTP Server",
"display_name": "NTP Server",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"dns_server": {
"placeholder": "DNS Server",
"display_name": "DNS Server",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"search_path": {
"placeholder": "Search Path",
"display_name": "DNS Servers",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"domain": {
"placeholder": "Domain",
"display_name": "Domain",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"default_gateway": {
"placeholder": "Gateway",
"display_name": "Default Gateway",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"local_repo": {
"placeholder": "Local Repo",
"display_name": "Local Repository",
"mapped_key": [
"name", "is_required", "display_type"
]
}
}
}
}]
}

View File

@ -1004,6 +1004,22 @@ class TestSwitchMachines(ApiTestCase):
self.assertEqual(return_value.status_code, 200)
class TestMetadataAPI(ApiTestCase):
"""Test metadata api."""
def setUp(self):
super(TestMetadataAPI, self).setUp()
def tearDown(self):
super(TestMetadataAPI, self).tearDown()
def test_get_os_ui_metadata(self):
url = '/oses/1/ui_metadata'
return_value = self.get(url)
self.assertEqual(return_value.status_code, 200)
self.assertIn('os_global_config', return_value.get_data())
if __name__ == '__main__':
flags.init()
logsetting.init()

View File

@ -0,0 +1,2 @@
NAME = 'domain'
VALIDATOR = is_valid_domain

View File

@ -1 +1,2 @@
NAME = 'general'
DISPLAY_TYPE = 'dropdown'

View File

@ -1,2 +1,3 @@
NAME = 'general_list'
FIELD_TYPE = list
DISPLAY_TYPE = 'multitext'

View File

@ -0,0 +1,4 @@
NAME = 'ip_list'
FIELD_TYPE = list
VALIDATOR = is_valid_ip
DISPLAY_TYPE = 'multitext'

View File

@ -1,3 +1,4 @@
NAME = 'password'
VALIDATOR = is_valid_password
DESCRIPTION = 'password'
DISPLAY_TYPE = 'password'

View File

@ -0,0 +1,2 @@
NAME = 'url'
VALIDATOR = is_valid_url

View File

@ -0,0 +1,119 @@
OS_CONFIG_MAPPING = {
"mapped_name": "os_global_config",
"mapped_children": [{
"server_credentials":{
"name": "sever_credentials",
"title": "Server Credentials",
"data": {
"username": {
"placeholder": "Username",
"display_name": "User name",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"password": {
"placeholder": "Password",
"display_name": "Password",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"confirm_password": {
"placeholder": "Confirm Password",
"name": "confirmPassword",
"placeholder": "Confirm Password",
"display_type": "password",
"required": "true",
"default_value": "huawei"
}
}
}
},{
"general": {
"name": "general",
"title": "",
"data": {
"language": {
"display_name": "Language",
"mapped_key": [
"name", "is_required", "display_type", "default_value", "options"
]
},
"timezone": {
"display_name": "Timezone",
"mapped_key": [
"name", "is_required", "display_type", "default_value", "options"
]
},
"http_proxy": {
"placeholder": "HTTP Proxy",
"display_name": "HTTP Proxy",
"mapped_key": [
"name", "is_required", "display_type"
]
},
"https_proxy": {
"placeholder": "HTTPS Proxy",
"display_name": "HTTPS Proxy",
"mapped_key": [
"name", "is_required", "display_type"
]
},
"no_proxy": {
"placeholder": "No Proxy",
"display_name": "No Proxy",
"validation": "maxLength",
"validationResponse":[],
"mapped_key": [
"name", "is_required", "display_type"
]
},
"ntp_server": {
"placeholder": "NTP Server",
"display_name": "NTP Server",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"dns_server": {
"placeholder": "DNS Server",
"display_name": "DNS Server",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"search_path": {
"placeholder": "Search Path",
"display_name": "DNS Servers",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"domain": {
"placeholder": "Domain",
"display_name": "Domain",
"validation":"isNumber",
"validationResponse":{},
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"default_gateway": {
"placeholder": "Gateway",
"display_name": "Default Gateway",
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"local_repo": {
"placeholder": "Local Repo",
"display_name": "Local Repository",
"mapped_key": [
"name", "is_required", "display_type"
]
}
}
}
}]
}

View File

@ -29,77 +29,60 @@ METADATA = {
},
'http_proxy': {
'_self': {
'field': 'general',
'default_value': 'http://127.0.0.1:3128',
'options': [
'http://127.0.0.1:3128'
],
'field': 'url',
'default_callback': default_proxy,
'options_callback': proxy_options,
'mapping_to': 'http_proxy'
}
},
'https_proxy': {
'_self': {
'field': 'general',
'default_value': 'http://127.0.0.1:3128',
'options': [
'http://127.0.0.1:3128'
],
'field': 'url',
'default_callback': default_proxy,
'options_callback': proxy_options,
'mapping_to': 'https_proxy'
}
},
'no_proxy': {
'_self': {
'field': 'general_list',
'default_value': [
'127.0.0.1',
'compass'
],
'options': [
'127.0.0.1',
'compass'
],
'default_callback': default_noproxy,
'options_callback': noproxy_options,
'autofill_callback': autofill_no_proxy,
'mapping_to': 'no_proxy'
}
},
'ntp_server': {
'_self': {
'is_required': True,
'field': 'general',
'default_value': '127.0.0.1',
'options': [
'127.0.0.1'
],
'field': 'ip',
'default_callback': default_ntp_server,
'options_callback': ntp_server_options,
'mapping_to': 'ntp_server'
}
},
'dns_servers': {
'_self': {
'is_required': True,
'field': 'general_list',
'default_value': [
'127.0.0.1',
],
'options': [
'127.0.0.1'
],
'field': 'ip_list',
'default_callback': default_dns_servers,
'options_callback': dns_servers_options,
'mapping_to': 'nameservers'
}
},
'domain': {
'_self': {
'field': 'general',
'field': 'domain',
'is_required' : True,
'default_value': 'ods.com',
'options': ['ods.com'],
'default_callback': default_domain,
'options_callback': domain_options,
}
},
'search_path': {
'_self': {
'field': 'general_list',
'default_value': [
'ods.com'
],
'options': ['ods.com'],
'default_callback': default_search_path,
'options_callback': search_path_options,
'mapping_to': 'search_path'
}
},
@ -107,9 +90,16 @@ METADATA = {
'_self': {
'is_required': True,
'field': 'ip',
'default_value': '127.0.0.1',
'default_callback': default_gateway,
'mapping_to': 'gateway'
}
},
'local_repo': {
'_self': {
'field': 'url',
'default_callback': default_localrepo,
'mapping_to': 'local_repo'
}
}
},
'server_credentials': {
@ -142,7 +132,8 @@ METADATA = {
},
'$partition': {
'_self': {
'validator': is_valid_partition
'validator': is_valid_partition,
'mapping_to': '$partition'
},
'max_size': {
'_self': {

View File

@ -138,8 +138,8 @@ class TestGetPackageMetadata(MetadataTestCase):
def test_get_package_metadata(self):
"""Test get package metadata."""
package_metadata = metadata.get_package_metadata(
self.user_object,
self.adapter_id
self.adapter_id,
user=self.user_object
)
expected = []
for k, v in package_metadata['package_config'].iteritems():
@ -152,8 +152,8 @@ class TestGetPackageMetadata(MetadataTestCase):
self.assertRaises(
exception.RecordNotExists,
metadata.get_package_metadata,
self.user_object,
99
99,
user=self.user_object
)
@ -216,8 +216,8 @@ class TestGetOsMetadata(MetadataTestCase):
def test_get_os_metadata(self):
"""Test get os metadata."""
os_metadata = metadata.get_os_metadata(
self.user_object,
self.os_id
self.os_id,
user=self.user_object
)
expected = []
for k, v in os_metadata['os_config'].iteritems():
@ -230,8 +230,8 @@ class TestGetOsMetadata(MetadataTestCase):
self.assertRaises(
exception.RecordNotExists,
metadata.get_os_metadata,
self.user_object,
99
99,
user=self.user_object
)
@ -245,9 +245,9 @@ class TestGetPackageOsMetadata(MetadataTestCase):
def test_get_package_os_metadata(self):
"""Test get package and os metadata."""
package_os_metadata = metadata.get_package_os_metadata(
self.user_object,
self.adapter_id,
self.os_id
self.os_id,
user=self.user_object
)
self.assertIsNotNone(package_os_metadata)
@ -256,9 +256,9 @@ class TestGetPackageOsMetadata(MetadataTestCase):
self.assertRaises(
exception.InvalidParameter,
metadata.get_package_os_metadata,
self.user_object,
self.adapter_id,
99
99,
user=self.user_object
)

View File

@ -124,6 +124,9 @@ MACHINE_LIST_DIR = lazypy.delay(
PROGRESS_CALCULATOR_DIR = lazypy.delay(
lambda: os.path.join(CONFIG_DIR, 'progress_calculator')
)
OS_MAPPING_DIR = lazypy.delay(
lambda: os.path.join(CONFIG_DIR, 'os_mapping')
)
PROXY_URL_PREFIX = 'http://10.145.81.205:5000'
if (

View File

@ -1 +1,2 @@
NAME = 'general'
DISPLAY_TYPE = 'dropdown'

View File

@ -1,2 +1,3 @@
NAME = 'general_list'
FIELD_TYPE = list
DISPLAY_TYPE = 'multitext'

View File

@ -1,3 +1,4 @@
NAME = 'ip_list'
FIELD_TYPE = list
VALIDATOR = is_valid_ip
DISPLAY_TYPE = 'multitext'

View File

@ -1,3 +1,4 @@
NAME = 'password'
VALIDATOR = is_valid_password
DESCRIPTION = 'password'
DISPLAY_TYPE = 'password'

View File

@ -0,0 +1,147 @@
OS_CONFIG_MAPPING = {
"mapped_name": "os_global_config",
"mapped_children": [{
"server_credentials":{
"name": "sever_credentials",
"title": "Server Credentials",
"order": 1,
"data": {
"username": {
"placeholder": "Username",
"display_name": "User name",
"order": 1,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"password": {
"placeholder": "Password",
"display_name": "Password",
"order": 2,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"confirm_password": {
"placeholder": "Confirm Password",
"name": "confirmPassword",
"placeholder": "Confirm Password",
"display_type": "password",
"is_required": "True",
"default_value": "huawei",
"order": 3
}
}
}
},{
"general": {
"name": "general",
"title": "",
"order": 2,
"data": {
"language": {
"display_name": "Language",
"order": 1,
"default_value": "en",
"mapped_key": [
"name", "is_required", "display_type"
],
"options": [{
"name": "English",
"value": "en"
},{
"name": "Chinese",
"value": "cn"
}],
},
"timezone": {
"display_name": "Timezone",
"order": 2,
"default_value": "Los Angeles",
"mapped_key": [
"name", "is_required", "display_type"
],
"options": [{
"name": "Los Angeles",
"value": "Los Angeles"
},{
"name": "Chicago",
"value": "Chicago"
}],
},
"http_proxy": {
"placeholder": "HTTP Proxy",
"display_name": "HTTP Proxy",
"order": 3,
"mapped_key": [
"name", "is_required", "display_type"
]
},
"https_proxy": {
"placeholder": "HTTPS Proxy",
"display_name": "HTTPS Proxy",
"order": 4,
"mapped_key": [
"name", "is_required", "display_type"
]
},
"no_proxy": {
"placeholder": "No Proxy",
"display_name": "No Proxy",
"order": 5,
"mapped_key": [
"name", "is_required", "display_type"
]
},
"ntp_server": {
"placeholder": "NTP Server",
"display_name": "NTP Server",
"order": 6,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"dns_servers": {
"placeholder": "DNS Server",
"display_name": "DNS Server",
"order": 7,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"search_path": {
"placeholder": "Search Path",
"display_name": "Search Path",
"order": 8,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"domain": {
"placeholder": "Domain",
"display_name": "Domain",
"order": 9,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"default_gateway": {
"placeholder": "Gateway",
"display_name": "Default Gateway",
"order": 10,
"mapped_key": [
"name", "is_required", "display_type", "default_value"
]
},
"local_repo": {
"placeholder": "Local Repo",
"display_name": "Local Repository",
"order": 11,
"mapped_key": [
"name", "is_required", "display_type"
]
}
}
}
}]
}

View File

@ -1,7 +1,7 @@
amqplib
argparse
celery
Markdown==2.6.1
Markdown<2.5
Cheetah<=2.4.1
daemon
Flask