340 lines
10 KiB
Python
340 lines
10 KiB
Python
# 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 pytest
|
|
import subprocess
|
|
|
|
from mock import call
|
|
from mock import Mock
|
|
from octane.tests import util as test_util
|
|
from octane.util import network
|
|
|
|
|
|
def test_create_overlay_network(mocker):
|
|
node1 = mocker.MagicMock()
|
|
node1.id = 2
|
|
node1.data = {
|
|
'id': node1.id,
|
|
'cluster': 101,
|
|
'roles': ['controller'],
|
|
'ip': '10.10.10.1',
|
|
}
|
|
node2 = mocker.MagicMock()
|
|
node2.id = 3
|
|
node2.data = {
|
|
'id': node2.id,
|
|
'cluster': 101,
|
|
'roles': [],
|
|
'pending_roles': ['controller'],
|
|
'ip': '10.10.10.2',
|
|
}
|
|
env = mocker.MagicMock()
|
|
env.data = {
|
|
'id': 101,
|
|
}
|
|
deployment_info = [{
|
|
'network_scheme': {
|
|
'transformations': [{
|
|
'action': 'add-br',
|
|
'name': 'br-ex',
|
|
'provider': 'ovs',
|
|
}, {
|
|
'action': 'add-br',
|
|
'name': 'br-mgmt',
|
|
}]
|
|
}
|
|
}]
|
|
|
|
mock_ssh = mocker.patch('octane.util.ssh.call')
|
|
mock_ssh.side_effect = [subprocess.CalledProcessError('', ''), None,
|
|
subprocess.CalledProcessError('', ''), None,
|
|
None, None, None, None]
|
|
|
|
expected_args = [
|
|
call(['sh', '-c',
|
|
'ovs-vsctl list-ports br-ex | grep -q br-ex--gre-10.10.10.2'],
|
|
node=node1),
|
|
call(['ovs-vsctl', 'add-port', 'br-ex', 'br-ex--gre-10.10.10.2',
|
|
'--', 'set', 'Interface', 'br-ex--gre-10.10.10.2',
|
|
'type=gre',
|
|
'options:remote_ip=10.10.10.2',
|
|
'options:key=2'],
|
|
node=node1),
|
|
call(['sh', '-c',
|
|
'ip link show dev gre3-3'],
|
|
node=node1),
|
|
call(['ip', 'link', 'add', 'gre3-3',
|
|
'type', 'gretap',
|
|
'remote', '10.10.10.2',
|
|
'local', '10.10.10.1',
|
|
'key', '3'],
|
|
node=node1),
|
|
call(['ip', 'link', 'set', 'up', 'dev', 'gre3-3'],
|
|
node=node1),
|
|
call(['ip', 'link', 'set', 'mtu', '1450', 'dev', 'gre3-3', ],
|
|
node=node1),
|
|
call(['ip', 'link', 'set', 'up', 'dev', 'br-mgmt'], node=node1),
|
|
call(['brctl', 'addif', 'br-mgmt', 'gre3-3'],
|
|
node=node1),
|
|
]
|
|
|
|
network.create_overlay_networks(node1, node2, env, deployment_info,
|
|
node1.id)
|
|
|
|
assert mock_ssh.call_args_list == expected_args
|
|
|
|
|
|
def test_delete_overlay_network(mocker):
|
|
node = Mock()
|
|
deployment_info = {
|
|
'network_scheme': {
|
|
'transformations': [{
|
|
'action': 'add-br',
|
|
'name': 'br-ex',
|
|
'provider': 'ovs',
|
|
}, {
|
|
'action': 'add-br',
|
|
'name': 'br-mgmt',
|
|
}]
|
|
}
|
|
}
|
|
|
|
mock_ssh = mocker.patch('octane.util.ssh.call')
|
|
|
|
mock_ovs_tuns = mocker.patch('octane.util.network.list_tunnels_ovs')
|
|
mock_ovs_tuns.return_value = ['br-ex--gre-10.10.10.2']
|
|
|
|
mock_lnx_tun = mocker.patch('octane.util.network.list_tunnels_lnx')
|
|
mock_lnx_tun.return_value = ['gre3-3']
|
|
|
|
expected_args = [
|
|
call(['ovs-vsctl', 'del-port', 'br-ex', 'br-ex--gre-10.10.10.2'],
|
|
node=node),
|
|
call(['brctl', 'delif', 'br-mgmt', 'gre3-3'], node=node),
|
|
call(['ip', 'link', 'delete', 'gre3-3'], node=node),
|
|
]
|
|
|
|
network.delete_overlay_networks(node, deployment_info)
|
|
|
|
assert mock_ssh.call_args_list == expected_args
|
|
|
|
|
|
def test_delete_patch_ports(mocker):
|
|
node = Mock()
|
|
|
|
mock_ssh = mocker.patch('octane.util.ssh.call')
|
|
|
|
expected_args = [
|
|
call(['ovs-vsctl', 'del-port', 'br-ovs-bond1', 'br-ovs-bond1--br-ex'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'del-port', 'br-ex', 'br-ex--br-ovs-bond1'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'del-port', 'br-ovs-bond2',
|
|
'br-ovs-bond2--br-mgmt'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'del-port', 'br-mgmt', 'br-mgmt--br-ovs-bond2'],
|
|
node=node),
|
|
]
|
|
|
|
network.delete_patch_ports(node, DEPLOYMENT_INFO_5_1)
|
|
|
|
assert mock_ssh.call_args_list == expected_args
|
|
|
|
|
|
def test_delete_lnx_ports(mocker):
|
|
node = Mock()
|
|
|
|
mock_ssh = mocker.patch('octane.util.ssh.call')
|
|
|
|
expected_args = [
|
|
call(['brctl', 'delif', 'br-ex', 'eth0.130'],
|
|
node=node),
|
|
call(['brctl', 'delif', 'br-mgmt', 'eth1.220'],
|
|
node=node),
|
|
]
|
|
|
|
network.delete_patch_ports(node, DEPLOYMENT_INFO_7_0)
|
|
|
|
assert mock_ssh.call_args_list == expected_args
|
|
|
|
|
|
def test_create_patch_ports_5_1(mocker):
|
|
node = Mock()
|
|
|
|
mock_ssh = mocker.patch('octane.util.ssh.call')
|
|
|
|
expected_args = [
|
|
call(['ovs-vsctl', 'add-port', 'br-ex', 'br-ex--br-ovs-bond1',
|
|
'trunks=[0]', '--', 'set', 'interface', 'br-ex--br-ovs-bond1',
|
|
'type=patch', 'options:peer=br-ovs-bond1--br-ex'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'add-port', 'br-ovs-bond1', 'br-ovs-bond1--br-ex',
|
|
'trunks=[0]', '--', 'set', 'interface', 'br-ovs-bond1--br-ex',
|
|
'type=patch', 'options:peer=br-ex--br-ovs-bond1'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'add-port', 'br-mgmt', 'br-mgmt--br-ovs-bond2',
|
|
'--', 'set', 'interface', 'br-mgmt--br-ovs-bond2', 'type=patch',
|
|
'options:peer=br-ovs-bond2--br-mgmt'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'add-port', 'br-ovs-bond2', 'br-ovs-bond2--br-mgmt',
|
|
'tag=102', '--', 'set', 'interface', 'br-ovs-bond2--br-mgmt',
|
|
'type=patch', 'options:peer=br-mgmt--br-ovs-bond2'],
|
|
node=node)
|
|
]
|
|
|
|
network.create_patch_ports(node, DEPLOYMENT_INFO_5_1)
|
|
|
|
assert mock_ssh.call_args_list == expected_args
|
|
|
|
|
|
def test_create_patch_ports_7_0(mocker):
|
|
node = Mock()
|
|
|
|
mock_ssh = mocker.patch('octane.util.ssh.call')
|
|
|
|
expected_args = [
|
|
call(['ovs-vsctl', 'add-port', 'br-ex', 'br-ex--br-ovs-bond1', '--',
|
|
'set', 'interface', 'br-ex--br-ovs-bond1', 'type=patch',
|
|
'options:peer=br-ovs-bond1--br-ex'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'add-port', 'br-ovs-bond1', 'br-ovs-bond1--br-ex',
|
|
'--', 'set', 'interface', 'br-ovs-bond1--br-ex', 'type=patch',
|
|
'options:peer=br-ex--br-ovs-bond1'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'add-port', 'br-mgmt', 'br-mgmt--br-ovs-bond2',
|
|
'--', 'set', 'interface', 'br-mgmt--br-ovs-bond2', 'type=patch',
|
|
'options:peer=br-ovs-bond2--br-mgmt'],
|
|
node=node),
|
|
call(['ovs-vsctl', 'add-port', 'br-ovs-bond2', 'br-ovs-bond2--br-mgmt',
|
|
'tag=102', '--', 'set', 'interface', 'br-ovs-bond2--br-mgmt',
|
|
'type=patch', 'options:peer=br-mgmt--br-ovs-bond2'],
|
|
node=node)
|
|
]
|
|
|
|
network.create_patch_ports(node, DEPLOYMENT_INFO_OVS_7_0)
|
|
|
|
assert mock_ssh.call_args_list == expected_args
|
|
|
|
|
|
DEPLOYMENT_INFO_5_1 = {
|
|
'openstack_version': '2014.1.3-5.1.1',
|
|
'network_scheme': {
|
|
'transformations': [{
|
|
'action': 'add-br',
|
|
'name': 'br-ex',
|
|
}, {
|
|
'action': 'add-patch',
|
|
'bridges': [
|
|
'br-ovs-bond1',
|
|
'br-ex'
|
|
],
|
|
'trunks': [
|
|
0
|
|
]
|
|
}, {
|
|
'action': 'add-patch',
|
|
'bridges': [
|
|
'br-ovs-bond2',
|
|
'br-mgmt'
|
|
],
|
|
'tags': [
|
|
102,
|
|
0
|
|
]
|
|
}, {
|
|
'action': 'add-br',
|
|
'name': 'br-mgmt',
|
|
}]
|
|
}
|
|
}
|
|
|
|
|
|
DEPLOYMENT_INFO_OVS_7_0 = {
|
|
'openstack_version': '2015.1.0-7.0',
|
|
'network_scheme': {
|
|
'transformations': [{
|
|
'action': 'add-br',
|
|
'name': 'br-ex',
|
|
'provider': 'ovs',
|
|
}, {
|
|
'action': 'add-patch',
|
|
'bridges': [
|
|
'br-ovs-bond1',
|
|
'br-ex'
|
|
],
|
|
'vlan_ids': [
|
|
0,
|
|
0
|
|
]
|
|
}, {
|
|
'action': 'add-patch',
|
|
'bridges': [
|
|
'br-ovs-bond2',
|
|
'br-mgmt'
|
|
],
|
|
'vlan_ids': [
|
|
102,
|
|
0
|
|
]
|
|
}, {
|
|
'action': 'add-br',
|
|
'name': 'br-mgmt',
|
|
'provider': 'ovs'
|
|
}]
|
|
}
|
|
}
|
|
|
|
DEPLOYMENT_INFO_7_0 = {
|
|
'openstack_version': '2015.1.0-7.0',
|
|
'network_scheme': {
|
|
'transformations': [{
|
|
'action': 'add-br',
|
|
'name': 'br-ex',
|
|
}, {
|
|
'action': 'add-port',
|
|
'name': 'eth0.130',
|
|
'bridge': 'br-ex'
|
|
}, {
|
|
'action': 'add-br',
|
|
'name': 'br-mgmt',
|
|
}, {
|
|
'action': 'add-port',
|
|
'name': 'eth1.220',
|
|
'bridge': 'br-mgmt'
|
|
}]
|
|
}
|
|
}
|
|
|
|
|
|
IFACE_BASE = b"auto br-ex\niface br-ex inet static\n"
|
|
IFACE_ADDR = b"address 10.109.1.4/24\ngateway 10.109.1.1\n"
|
|
IFACE_SINGLEPORT = IFACE_BASE + b"bridge_ports eth0\n"
|
|
IFACE_DEFAULT = IFACE_SINGLEPORT + IFACE_ADDR
|
|
IFACE_TESTPORT = b"bridge_ports test-iface\n"
|
|
IFACE_MULTIPORT = IFACE_BASE + IFACE_TESTPORT
|
|
IFACE_MULTIPORT_EXPECTED = IFACE_BASE + b"bridge_ports eth0 test-iface\n"
|
|
|
|
|
|
@pytest.mark.parametrize("content,expected_content", [
|
|
(IFACE_BASE, IFACE_SINGLEPORT),
|
|
(IFACE_DEFAULT, IFACE_DEFAULT),
|
|
(IFACE_MULTIPORT, IFACE_MULTIPORT_EXPECTED),
|
|
])
|
|
@pytest.mark.parametrize("bridge,port", [
|
|
('br-ex', {'name': 'eth0'}),
|
|
])
|
|
def test_save_port_lnx(mocker, node, content, expected_content, bridge, port):
|
|
filename = '/etc/network/interfaces.d/ifcfg-{0}'.format(bridge)
|
|
with test_util.mock_update_file(mocker, node, content, expected_content,
|
|
filename):
|
|
network.save_port_lnx(node, bridge, port)
|