diff --git a/neutron/agent/ovsdb/impl_idl.py b/neutron/agent/ovsdb/impl_idl.py index 51ea96f17a3..5b15472874d 100644 --- a/neutron/agent/ovsdb/impl_idl.py +++ b/neutron/agent/ovsdb/impl_idl.py @@ -23,6 +23,7 @@ from ovs.db import idl from neutron.agent.ovsdb import api from neutron.agent.ovsdb.native import commands as cmd from neutron.agent.ovsdb.native import connection +from neutron.agent.ovsdb.native import helpers from neutron.agent.ovsdb.native import idlutils from neutron.i18n import _LE @@ -122,6 +123,11 @@ class OvsdbIdl(api.API): def __init__(self, context): super(OvsdbIdl, self).__init__(context) + # it's a chicken and egg problem: by default, the manager that + # corresponds to the connection URI is in most cases not enabled in + # local ovsdb, so we still need ovs-vsctl to set it to allow + # connections + helpers.enable_connection_uri(self.ovsdb_connection.connection) OvsdbIdl.ovsdb_connection.start() self.idl = OvsdbIdl.ovsdb_connection.idl diff --git a/neutron/agent/ovsdb/native/helpers.py b/neutron/agent/ovsdb/native/helpers.py new file mode 100644 index 00000000000..0a4e42618cc --- /dev/null +++ b/neutron/agent/ovsdb/native/helpers.py @@ -0,0 +1,29 @@ +# Copyright (c) 2015 Red Hat, Inc. +# +# 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. + +from neutron.agent.common import utils + + +def _connection_to_manager_uri(conn_uri): + proto, addr = conn_uri.split(':', 1) + if ':' in addr: + ip, port = addr.split(':', 1) + return 'p%s:%s:%s' % (proto, port, ip) + else: + return 'p%s:%s' % (proto, addr) + + +def enable_connection_uri(conn_uri): + manager_uri = _connection_to_manager_uri(conn_uri) + utils.execute(['ovs-vsctl', 'set-manager', manager_uri], run_as_root=True) diff --git a/neutron/tests/unit/agent/ovsdb/__init__.py b/neutron/tests/unit/agent/ovsdb/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/neutron/tests/unit/agent/ovsdb/native/__init__.py b/neutron/tests/unit/agent/ovsdb/native/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/neutron/tests/unit/agent/ovsdb/native/test_helpers.py b/neutron/tests/unit/agent/ovsdb/native/test_helpers.py new file mode 100644 index 00000000000..41495e5d159 --- /dev/null +++ b/neutron/tests/unit/agent/ovsdb/native/test_helpers.py @@ -0,0 +1,43 @@ +# Copyright 2015, Red Hat, Inc. +# +# 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 mock + +from neutron.agent.ovsdb.native import helpers +from neutron.tests import base + + +CONNECTION_TO_MANAGER_URI_MAP = ( + ('unix:/path/to/file', 'punix:/path/to/file'), + ('tcp:127.0.0.1:6640', 'ptcp:6640:127.0.0.1'), + ('ssl:192.168.1.1:8080', 'pssl:8080:192.168.1.1')) + + +class TestOVSNativeHelpers(base.BaseTestCase): + + def setUp(self): + super(TestOVSNativeHelpers, self).setUp() + self.execute = mock.patch('neutron.agent.common.utils.execute').start() + + def test__connection_to_manager_uri(self): + for conn_uri, expected in CONNECTION_TO_MANAGER_URI_MAP: + self.assertEqual(expected, + helpers._connection_to_manager_uri(conn_uri)) + + def test_enable_connection_uri(self): + for conn_uri, manager_uri in CONNECTION_TO_MANAGER_URI_MAP: + helpers.enable_connection_uri(conn_uri) + self.execute.assert_called_with( + ['ovs-vsctl', 'set-manager', manager_uri], + run_as_root=True) diff --git a/tools/configure_for_func_testing.sh b/tools/configure_for_func_testing.sh index 3b4e124ac7f..9a9619241c4 100755 --- a/tools/configure_for_func_testing.sh +++ b/tools/configure_for_func_testing.sh @@ -222,9 +222,6 @@ function _install_post_devstack { # NOTE: the package name 'python-openvswitch' is common across # supported distros. install_package python-openvswitch - - # Configure ovs-vsctl to be reachable via the standard ovsdb port. - sudo ovs-vsctl set-manager ptcp:6640:127.0.0.1 }