diff --git a/etc/neutron/plugins/nec/nec.ini b/etc/neutron/plugins/nec/nec.ini index 878f9e17a1..bac5967d9d 100644 --- a/etc/neutron/plugins/nec/nec.ini +++ b/etc/neutron/plugins/nec/nec.ini @@ -21,6 +21,10 @@ firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewal # host = 127.0.0.1 # port = 8888 +# Base URL of OpenFlow Controller REST API. +# It is prepended to a path of each API request. +# path_prefix = + # Drivers are in neutron/plugins/nec/drivers/ . # driver = trema diff --git a/neutron/plugins/nec/common/config.py b/neutron/plugins/nec/common/config.py index 3717468a2f..21c5e18246 100644 --- a/neutron/plugins/nec/common/config.py +++ b/neutron/plugins/nec/common/config.py @@ -36,6 +36,9 @@ agent_opts = [ ofc_opts = [ cfg.StrOpt('host', default='127.0.0.1', help=_("Host to connect to")), + cfg.StrOpt('path_prefix', default='', + help=_("Base URL of OFC REST API. " + "It is prepended to each API request.")), cfg.StrOpt('port', default='8888', help=_("Port to connect to")), cfg.StrOpt('driver', default='trema', diff --git a/neutron/plugins/nec/common/ofc_client.py b/neutron/plugins/nec/common/ofc_client.py index 55b128562b..957f24483a 100644 --- a/neutron/plugins/nec/common/ofc_client.py +++ b/neutron/plugins/nec/common/ofc_client.py @@ -71,6 +71,7 @@ class OFCClient(object): {'status': status, 'msg': detail}) def do_single_request(self, method, action, body=None): + action = config.OFC.path_prefix + action LOG.debug(_("Client request: %(host)s:%(port)s " "%(method)s %(action)s [%(body)s]"), {'host': self.host, 'port': self.port, diff --git a/neutron/tests/unit/nec/test_config.py b/neutron/tests/unit/nec/test_config.py index 907c33dfe7..9d9fad521b 100644 --- a/neutron/tests/unit/nec/test_config.py +++ b/neutron/tests/unit/nec/test_config.py @@ -28,6 +28,8 @@ class ConfigurationTest(base.BaseTestCase): self.assertEqual('127.0.0.1', config.CONF.OFC.host) self.assertEqual('8888', config.CONF.OFC.port) + # Check path_prefix is an empty string explicitly. + self.assertEqual('', config.CONF.OFC.path_prefix) self.assertEqual('trema', config.CONF.OFC.driver) self.assertTrue(config.CONF.OFC.enable_packet_filter) self.assertFalse(config.CONF.OFC.use_ssl) diff --git a/neutron/tests/unit/nec/test_ofc_client.py b/neutron/tests/unit/nec/test_ofc_client.py index 101cca8417..68668d4d48 100644 --- a/neutron/tests/unit/nec/test_ofc_client.py +++ b/neutron/tests/unit/nec/test_ofc_client.py @@ -22,6 +22,7 @@ import socket import mock from oslo.config import cfg +from neutron.plugins.nec.common import config from neutron.plugins.nec.common import exceptions as nexc from neutron.plugins.nec.common import ofc_client from neutron.tests import base @@ -29,8 +30,8 @@ from neutron.tests import base class OFCClientTest(base.BaseTestCase): - def _test_do_request(self, status, resbody, data, exctype=None, - exc_checks=None): + def _test_do_request(self, status, resbody, expected_data, exctype=None, + exc_checks=None, path_prefix=None): res = mock.Mock() res.status = status res.read.return_value = resbody @@ -41,21 +42,22 @@ class OFCClientTest(base.BaseTestCase): with mock.patch.object(ofc_client.OFCClient, 'get_connection', return_value=conn): client = ofc_client.OFCClient() - + path = '/somewhere' + realpath = path_prefix + path if path_prefix else path if exctype: e = self.assertRaises(exctype, client.do_request, - 'GET', '/somewhere', body={}) - self.assertEqual(data, str(e)) + 'GET', path, body={}) + self.assertEqual(expected_data, str(e)) if exc_checks: for k, v in exc_checks.items(): self.assertEqual(v, getattr(e, k)) else: - response = client.do_request('GET', '/somewhere', body={}) - self.assertEqual(response, data) + response = client.do_request('GET', path, body={}) + self.assertEqual(response, expected_data) headers = {"Content-Type": "application/json"} expected = [ - mock.call.request('GET', '/somewhere', '{}', headers), + mock.call.request('GET', realpath, '{}', headers), mock.call.getresponse(), ] conn.assert_has_calls(expected) @@ -73,6 +75,11 @@ class OFCClientTest(base.BaseTestCase): for status in [201, 202, 204]: self._test_do_request(status, None, None) + def test_do_request_with_path_prefix(self): + config.CONF.set_override('path_prefix', '/dummy', group='OFC') + self._test_do_request(200, json.dumps([1, 2, 3]), [1, 2, 3], + path_prefix='/dummy') + def test_do_request_returns_404(self): resbody = '' errmsg = _("The specified OFC resource (/somewhere) is not found.")