From e2d0eb6ad89b41eab4e40e24e53884de368a80a4 Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Sun, 8 Jul 2012 08:05:46 -0400 Subject: [PATCH] Enable quantum agents to work with global cfg.CONF This implements blueprint global-config-support A common configuration parse function is used by the service and the agent. In the case of the service, when loading the plugin, the configuration file will be appended to the existing cfg.CONF (this was originally created when quantum.conf was loaded). In the case of the agent a global cfg.CONF will be created. This task is a prerequisite for the RPC integration into Quantum. Change-Id: I24ef4a804578502bcce484f44dc55c8fe2aa913e --- quantum/plugins/linuxbridge/common/config.py | 8 +- quantum/plugins/openvswitch/common/config.py | 8 +- quantum/plugins/ryu/common/config.py | 8 +- quantum/tests/unit/test_lb_config.py | 81 +++++++++++++++++++ quantum/tests/unit/test_ovs_config.py | 18 ++++- quantum/tests/unit/test_ryu_config.py | 85 ++++++++++++++++++++ 6 files changed, 200 insertions(+), 8 deletions(-) create mode 100644 quantum/tests/unit/test_lb_config.py create mode 100644 quantum/tests/unit/test_ryu_config.py diff --git a/quantum/plugins/linuxbridge/common/config.py b/quantum/plugins/linuxbridge/common/config.py index 7e77147f4..7be75b028 100644 --- a/quantum/plugins/linuxbridge/common/config.py +++ b/quantum/plugins/linuxbridge/common/config.py @@ -42,8 +42,12 @@ agent_opts = [ def parse(config_file): - conf = cfg.ConfigOpts() - conf(args=[], default_config_files=[config_file]) + conf = cfg.CONF + if 'config_file' in conf: + conf.config_file.append(config_file) + else: + conf.config_file = [config_file] + conf(args=[], default_config_files=conf.config_file) conf.register_opts(vlan_opts, "VLANS") conf.register_opts(database_opts, "DATABASE") conf.register_opts(bridge_opts, "LINUX_BRIDGE") diff --git a/quantum/plugins/openvswitch/common/config.py b/quantum/plugins/openvswitch/common/config.py index 9774b82de..f73a53852 100644 --- a/quantum/plugins/openvswitch/common/config.py +++ b/quantum/plugins/openvswitch/common/config.py @@ -40,8 +40,12 @@ agent_opts = [ def parse(config_file): - conf = cfg.ConfigOpts() - conf(args=[], default_config_files=[config_file]) + conf = cfg.CONF + if 'config_file' in conf: + conf.config_file.append(config_file) + else: + conf.config_file = [config_file] + conf(args=[], default_config_files=conf.config_file) conf.register_opts(database_opts, "DATABASE") conf.register_opts(ovs_opts, "OVS") conf.register_opts(agent_opts, "AGENT") diff --git a/quantum/plugins/ryu/common/config.py b/quantum/plugins/ryu/common/config.py index 871ef54e3..a18097924 100644 --- a/quantum/plugins/ryu/common/config.py +++ b/quantum/plugins/ryu/common/config.py @@ -35,8 +35,12 @@ agent_opts = [ def parse(config_file): - conf = cfg.ConfigOpts() - conf(args=[], default_config_files=[config_file]) + conf = cfg.CONF + if 'config_file' in conf: + conf.config_file.append(config_file) + else: + conf.config_file = [config_file] + conf(args=[], default_config_files=conf.config_file) conf.register_opts(database_opts, "DATABASE") conf.register_opts(ovs_opts, "OVS") conf.register_opts(agent_opts, "AGENT") diff --git a/quantum/tests/unit/test_lb_config.py b/quantum/tests/unit/test_lb_config.py new file mode 100644 index 000000000..f3140402f --- /dev/null +++ b/quantum/tests/unit/test_lb_config.py @@ -0,0 +1,81 @@ +# Copyright (c) 2012 OpenStack, LLC. +# +# 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 os +import tempfile +import unittest + +from quantum.openstack.common import cfg +from quantum.plugins.linuxbridge.common import config + + +class LinuxBridgeConfigTestCase(unittest.TestCase): + def test_dummy(self): + configs = """[DATABASE] +sql_connection = testlink +reconnect_interval=100 +[AGENT] +root_helper = mysudo +polling_interval=50 +""" + + (fd, path) = tempfile.mkstemp(prefix='lb_config', suffix='.ini') + + try: + os.write(fd, configs) + os.close(fd) + + conf = config.parse(path) + self.assertEqual('testlink', conf.DATABASE.sql_connection) + self.assertEqual(100, conf.DATABASE.reconnect_interval) + self.assertEqual(50, conf.AGENT.polling_interval) + self.assertEqual('mysudo', conf.AGENT.root_helper) + self.assertEqual(conf.AGENT.polling_interval, + cfg.CONF.AGENT.polling_interval) + finally: + os.remove(path) + + def test_defaults(self): + configs = """ +""" + + (fd, path) = tempfile.mkstemp(prefix='lb_config', suffix='.ini') + + try: + os.write(fd, configs) + os.close(fd) + + conf = config.parse(path) + self.assertEqual('sqlite://', conf.DATABASE.sql_connection) + self.assertEqual(2, conf.DATABASE.reconnect_interval) + self.assertEqual(2, conf.AGENT.polling_interval) + self.assertEqual('sudo', conf.AGENT.root_helper) + self.assertEqual(1000, conf.VLANS.vlan_start) + self.assertEqual(3000, conf.VLANS.vlan_end) + self.assertEqual('eth1', conf.LINUX_BRIDGE.physical_interface) + self.assertEqual(conf.DATABASE.sql_connection, + cfg.CONF.DATABASE.sql_connection) + self.assertEqual(conf.AGENT.root_helper, + cfg.CONF.AGENT.root_helper) + finally: + os.remove(path) + + def tearDown(self): + """Clear the test environment""" + cfg.CONF.reset() + cfg.CONF.unregister_opts(config.vlan_opts, "VLANS") + cfg.CONF.unregister_opts(config.database_opts, "DATABASE") + cfg.CONF.unregister_opts(config.bridge_opts, "LINUX_BRIDGE") + cfg.CONF.unregister_opts(config.agent_opts, "AGENT") diff --git a/quantum/tests/unit/test_ovs_config.py b/quantum/tests/unit/test_ovs_config.py index 6603022de..624fa0903 100644 --- a/quantum/tests/unit/test_ovs_config.py +++ b/quantum/tests/unit/test_ovs_config.py @@ -21,7 +21,7 @@ import os import tempfile import unittest -from quantum.openstack.common.cfg import ConfigFileValueError +from quantum.openstack.common import cfg from quantum.plugins.openvswitch.common import config @@ -54,6 +54,8 @@ polling_interval=50 self.assertEqual(100, conf.DATABASE.reconnect_interval) self.assertEqual(50, conf.AGENT.polling_interval) self.assertEqual('mysudo', conf.AGENT.root_helper) + self.assertEqual(conf.OVS.integration_bridge, + cfg.CONF.OVS.integration_bridge) finally: os.remove(path) @@ -75,6 +77,10 @@ polling_interval=50 self.assertEqual(2, conf.DATABASE.reconnect_interval) self.assertEqual(2, conf.AGENT.polling_interval) self.assertEqual('sudo', conf.AGENT.root_helper) + self.assertEqual(conf.DATABASE.sql_connection, + cfg.CONF.DATABASE.sql_connection) + self.assertEqual(conf.AGENT.root_helper, + cfg.CONF.AGENT.root_helper) finally: os.remove(path) @@ -106,12 +112,20 @@ enable_tunneling = notbool try: os.write(fd, configs) os.close(fd) + conf = config.parse(path) exception_raised = False try: tunnel = conf.OVS.enable_tunneling - except ConfigFileValueError: + except cfg.ConfigFileValueError: exception_raised = True self.assertTrue(exception_raised) finally: os.remove(path) + + def tearDown(self): + """Clear the test environment""" + cfg.CONF.reset() + cfg.CONF.unregister_opts(config.database_opts, "DATABASE") + cfg.CONF.unregister_opts(config.ovs_opts, "OVS") + cfg.CONF.unregister_opts(config.agent_opts, "AGENT") diff --git a/quantum/tests/unit/test_ryu_config.py b/quantum/tests/unit/test_ryu_config.py new file mode 100644 index 000000000..1a375c179 --- /dev/null +++ b/quantum/tests/unit/test_ryu_config.py @@ -0,0 +1,85 @@ +# Copyright (c) 2012 OpenStack, LLC. +# +# 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 os +import tempfile +import unittest + +from quantum.openstack.common import cfg +from quantum.plugins.ryu.common import config + + +class RyuConfigTestCase(unittest.TestCase): + def test_config(self): + configs = """[DATABASE] +sql_connection = testlink +reconnect_interval=100 +[OVS] +enable_tunneling = True +integration_bridge = mybrint +local_ip = 10.0.0.3 +[AGENT] +root_helper = mysudo +polling_interval=50 +""" + + (fd, path) = tempfile.mkstemp(prefix='ryu_config', suffix='.ini') + + try: + os.write(fd, configs) + os.close(fd) + + conf = config.parse(path) + self.assertEqual('mybrint', conf.OVS.integration_bridge) + self.assertEqual('testlink', conf.DATABASE.sql_connection) + self.assertEqual(100, conf.DATABASE.reconnect_interval) + self.assertEqual(50, conf.AGENT.polling_interval) + self.assertEqual('mysudo', conf.AGENT.root_helper) + self.assertEqual(conf.OVS.integration_bridge, + cfg.CONF.OVS.integration_bridge) + finally: + os.remove(path) + + def test_defaults(self): + configs = """ +""" + + (fd, path) = tempfile.mkstemp(prefix='ryu_config', suffix='.ini') + + try: + os.write(fd, configs) + os.close(fd) + + conf = config.parse(path) + self.assertEqual('br-int', conf.OVS.integration_bridge) + self.assertEqual('sqlite://', conf.DATABASE.sql_connection) + self.assertEqual(2, conf.DATABASE.reconnect_interval) + self.assertEqual(2, conf.AGENT.polling_interval) + self.assertEqual('sudo', conf.AGENT.root_helper) + self.assertEqual('127.0.0.1:6633', conf.OVS.openflow_controller) + self.assertEqual('127.0.0.1:8080', conf.OVS.openflow_rest_api) + self.assertEqual(conf.DATABASE.sql_connection, + cfg.CONF.DATABASE.sql_connection) + self.assertEqual(conf.AGENT.root_helper, + cfg.CONF.AGENT.root_helper) + finally: + os.remove(path) + + def tearDown(self): + """Clear the test environment""" + cfg.CONF.reset() + cfg.CONF.unregister_opts(config.database_opts, "DATABASE") + cfg.CONF.unregister_opts(config.ovs_opts, "OVS") + cfg.CONF.unregister_opts(config.agent_opts, "AGENT") -- 2.45.2