From 2e1b0ea4032f05afef16efd451e2eea5df901d97 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Tue, 23 Jun 2015 17:33:38 +0200 Subject: [PATCH] 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 --- neutron/agent/ovsdb/impl_idl.py | 6 +++ neutron/agent/ovsdb/native/helpers.py | 29 +++++++++++++ neutron/tests/unit/agent/ovsdb/__init__.py | 0 .../tests/unit/agent/ovsdb/native/__init__.py | 0 .../unit/agent/ovsdb/native/test_helpers.py | 43 +++++++++++++++++++ tools/configure_for_func_testing.sh | 3 -- 6 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 neutron/agent/ovsdb/native/helpers.py create mode 100644 neutron/tests/unit/agent/ovsdb/__init__.py create mode 100644 neutron/tests/unit/agent/ovsdb/native/__init__.py create mode 100644 neutron/tests/unit/agent/ovsdb/native/test_helpers.py 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 }