From: Ihar Hrachyshka Date: Tue, 23 Jun 2015 15:33:38 +0000 (+0200) Subject: ovsdb: attempt to enable connection_uri for native impl on startup X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=2e1b0ea4032f05afef16efd451e2eea5df901d97;p=openstack-build%2Fneutron-build.git ovsdb: attempt to enable connection_uri for native impl on startup The port is in most cases disabled, so to use it, we should first enable it, and it means that we should still rely on ovs-vsctl for that initial call. Closes-Bug: #1468259 Change-Id: I097b1c441df1f7f1785b8744f27809617bb21c14 --- diff --git a/neutron/agent/ovsdb/impl_idl.py b/neutron/agent/ovsdb/impl_idl.py index 51ea96f17..5b1547287 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 000000000..0a4e42618 --- /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 000000000..e69de29bb 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 000000000..e69de29bb 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 000000000..41495e5d1 --- /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 3b4e124ac..9a9619241 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 }