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
This commit is contained in:
Ihar Hrachyshka 2015-06-23 17:33:38 +02:00
parent 6b9fd15072
commit 2e1b0ea403
6 changed files with 78 additions and 3 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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
}