From 06a212101eb4ad3f30cd8876b443ed687e31eaa7 Mon Sep 17 00:00:00 2001 From: 00184532 Date: Mon, 20 Nov 2017 16:23:52 +0800 Subject: [PATCH] support dpdk Change-Id: If0dc3a869da9fe20513f7005f0c5e072f9e9bbc0 Signed-off-by: 00184532 --- code/daisy/daisy/api/backends/kolla/common.py | 35 +++++++++++++++++++ code/daisy/daisy/api/backends/kolla/config.py | 15 ++++++++ code/daisy/daisy/db/sqlalchemy/api.py | 10 ++++-- .../tests/api/backends/kolla/test_install.py | 25 +++++++++++-- 4 files changed, 80 insertions(+), 5 deletions(-) diff --git a/code/daisy/daisy/api/backends/kolla/common.py b/code/daisy/daisy/api/backends/kolla/common.py index b46db8a7..f0621e4c 100755 --- a/code/daisy/daisy/api/backends/kolla/common.py +++ b/code/daisy/daisy/api/backends/kolla/common.py @@ -29,6 +29,7 @@ from daisy.common import exception import daisy.registry.client.v1.api as registry import daisy.api.backends.common as daisy_cmn from daisy.api.backends.kolla import config as kconfig +import re LOG = logging.getLogger(__name__) _ = i18n._ @@ -334,6 +335,15 @@ def _daisy_conf_mcast_flag(): return daisy_conf_mcast_enabled +def convert_string_to_hex(isocpus): + isocpus_list = re.findall(r"\d+\.?\d*", isocpus.encode()) + isocpus_int = 0 + for i in isocpus_list: + isocpus_int = isocpus_int + 2**int(i) + isocpus_hex = hex(isocpus_int)[2:] + return isocpus_hex + + class MulticastServerTask(object): """ @@ -517,6 +527,7 @@ def get_cluster_kolla_config(req, cluster_id): ext_macname_list = [] sto_macname_list = [] hbt_macname_list = [] + enable_dvs_list = [] vlans_id = {} openstack_version = '3.0.0' docker_namespace = 'kolla' @@ -640,6 +651,29 @@ def get_cluster_kolla_config(req, cluster_id): break storage_ip_list.append(com_host_ip) kolla_config.update({'Storage_ips': storage_ip_list}) + LOG.info("update enable_dvs config") + params = {'cluster_id': cluster_id} + hosts = registry.get_hosts_detail(req.context, **params) + for host in hosts: + host_detail = registry.get_host_metadata(req.context, + host['id']) + enable_dvs = False + isolcpus = '' + for interface in host_detail['interfaces']: + vswitch_type = interface.get("vswitch_type") + if vswitch_type == 'dvs': + enable_dvs = True + isolcpus = host_detail['isolcpus'] + break + enable_dvs_list.append(enable_dvs) + if len(set(enable_dvs_list)) != 1: + msg = (_("hosts interface vswitch type must be same!")) + LOG.error(msg) + raise HTTPForbidden(msg) + else: + isolcpus_hex = convert_string_to_hex(isolcpus) + kolla_config.update({'enable_dvs': enable_dvs}) + kolla_config.update({'ovs_dpdk_pmd_coremask': isolcpus_hex}) return (kolla_config, mgt_ip_list, host_name_ip_list) @@ -654,3 +688,4 @@ def generate_kolla_config_file(req, cluster_id, kolla_config, multicast_flag): kolla_config) kconfig.enable_neutron_backend(req, cluster_id, kolla_config) #kconfig.enable_ceilometer() + kconfig.enable_openvswitch_dpdk(kolla_config) diff --git a/code/daisy/daisy/api/backends/kolla/config.py b/code/daisy/daisy/api/backends/kolla/config.py index c31a4c9f..5f6c3375 100755 --- a/code/daisy/daisy/api/backends/kolla/config.py +++ b/code/daisy/daisy/api/backends/kolla/config.py @@ -302,6 +302,21 @@ def update_globals_yml(config_data, multicast_flag): default_flow_style=False) +def enable_openswitch_dpdk(kolla_config): + if kolla_config['enable_dvs']: + openswitch_dpdk_config = { + 'enable_ovs_dpdk': 'yes', + 'neutron_bridge_name': 'dpdk_bridge', + 'tunnel_interface': 'dpdk_bridge', + 'enable_openvswitch': 'yes', + 'ovs_hugepage_mountpoint': '/mnt/huge_1GB'} + openswitch_dpdk_config['ovs_dpdk_pmd_coremask'] = \ + kolla_config['ovs_dpdk_pmd_coremask'] + update_kolla_globals_yml(openswitch_dpdk_config) + else: + LOG.info(_("no need to config openvswitch dpdk")) + + def update_password_yml(): LOG.info(_("begin to update kolla's passwd.yml file...")) cmd = 'python '\ diff --git a/code/daisy/daisy/db/sqlalchemy/api.py b/code/daisy/daisy/db/sqlalchemy/api.py index 54db988e..71634ead 100755 --- a/code/daisy/daisy/db/sqlalchemy/api.py +++ b/code/daisy/daisy/db/sqlalchemy/api.py @@ -769,18 +769,24 @@ def _host_update(context, values, host_id): for networks_plane in merged_assigned_networks: network_plane_names = \ networks_plane['name'].split(',') + #because EXTERNAL plane will not be assigned ip, + #when EXTERNAL and DATAPLANE with same cidr/vlan, skip EXTERNAL plane + if network_plane_names[0] == 'EXTERNAL' and len(network_plane_names) > 1: + network_plane_name = network_plane_names[1] + else: + network_plane_name = network_plane_names[0] network_plane_ip = networks_plane.get('ip') if network_plane_ip: check_ip_exist( values['cluster'], - network_plane_names[0], + network_plane_name, network_plane_ip, session) else: network_plane_ip = \ according_to_cidr_distribution_ip( values['cluster'], - network_plane_names[0], + network_plane_name, session) if 'MANAGEMENT' in network_plane_names: diff --git a/code/daisy/daisy/tests/api/backends/kolla/test_install.py b/code/daisy/daisy/tests/api/backends/kolla/test_install.py index 2b5931af..cba261d0 100755 --- a/code/daisy/daisy/tests/api/backends/kolla/test_install.py +++ b/code/daisy/daisy/tests/api/backends/kolla/test_install.py @@ -287,6 +287,20 @@ host5_meta = {u'os_version_id': None, u'dvsp_cpus': None, u'deleted_at': None, u'id': u'9423980b-ec76-475a-b45f-558eb4b7dfed', + u'interfaces': [{u'assigned_networks': + [{u'ip': u'127.0.0.1', + u'name': u'MANAGEMENT', + u'type': u'MANAGEMENT'}], + u'host_id': + u'9423980b-ec76-475a-b45f-558eb4b7dfed', + u'id': u'299fc41d-dde5-45ca-be3b-c94693d2b9ce', + u'ip': u'192.168.1.11', u'is_deployment': True, + u'mac': u'4c:09:b4:b2:79:8a', + u'mode': None, u'name': u'enp132s0f0', + u'netmask': u'255.255.255.0', + u'pci': u'0000:84:00.0', u'slave1': None, + u'slave2': None, u'type': u'ether', + u'vswitch_type': 'dvs'}], u'vcpu_pin_set': None, u'dvsv_cpus': None, u'hwm_ip': None, @@ -314,7 +328,8 @@ host5_meta = {u'os_version_id': None, u'root_pwd': u'ossdbg1', u'dvs_high_cpuset': None, u'dvs_cpus': None, - u'root_lv_size': 102400} + u'root_lv_size': 102400, + u'isolcpus': u'1,13'} host6_meta = {u'os_version_id': None, u'config_set_id': None, @@ -437,6 +452,8 @@ class TestInstall(test.TestCase): self.installer = install.KOLLAInstallTask( self.req, '8ad27e36-f3e2-48b4-84b8-5b676c6fabde') + @mock.patch("daisy.registry.client.v1.api.get_host_metadata") + @mock.patch("daisy.registry.client.v1.api.get_hosts_detail") @mock.patch('daisy.api.backends.kolla.common.get_computer_node_cfg') @mock.patch('daisy.api.backends.kolla.common.get_controller_node_cfg') @mock.patch('daisy.api.backends.kolla.common.get_host_detail') @@ -449,7 +466,8 @@ class TestInstall(test.TestCase): mock_do_get_cluster_networks_detail, mock_do_get_roles_detail, mock_do_get_hosts_of_role, mock_do_get_host_detail, - mock_do_get_controller_node_cfg, mock_do_get_computer_node_cfg): + mock_do_get_controller_node_cfg, mock_do_get_computer_node_cfg, + mock_do_get_hosts_detail, mock_get_host_metadata): daisy_kolla_ver_path = '/var/lib/daisy/versionfile/kolla/' cmd = 'mkdir -p %s' % daisy_kolla_ver_path subprocesscall(cmd) @@ -480,7 +498,8 @@ class TestInstall(test.TestCase): 'host_name': u'', 'dat_macname': u'', 'ext_macname': u''} - + mock_do_get_hosts_detail.return_value = [host5_meta] + mock_get_host_metadata.return_value = host5_meta (kolla_config, mgt_ip_list, host_name_ip_list) =\ kcommon.get_cluster_kolla_config( self.req,