Save port membership for patch interface

Patch interface added to Linux bridge during the control plane
cutover, but not saved to configuration file for persistence.

Add function to add port to bridge's configuration.

Change-Id: If40bebf384b24d6af5e42798fbf6bc2993dc4795
Closes-bug: 1576150
This commit is contained in:
Oleg Gelbukh 2016-06-22 10:11:20 +00:00
parent 6504fb25b6
commit 9912cdc603
2 changed files with 53 additions and 0 deletions

View File

@ -9,10 +9,13 @@
# 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
@ -310,3 +313,27 @@ DEPLOYMENT_INFO_7_0 = {
}]
}
}
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)

View File

@ -11,6 +11,7 @@
# under the License.
import logging
import os
import re
import subprocess
@ -317,6 +318,28 @@ create_port_providers = {
}
def save_port_lnx(node, bridge, port):
ifaces_path = '/etc/network/interfaces.d'
bridge_file = os.path.join(ifaces_path, 'ifcfg-{0}'.format(bridge))
sftp = ssh.sftp(node)
with ssh.update_file(sftp, bridge_file) as (old, new):
found_bridge_port_line = False
for line in old:
if line.startswith('bridge_ports'):
found_bridge_port_line = True
if port['name'] not in line:
option, _, ports = line.rstrip().partition(' ')
line = "{0} {1} {2}\n".format(option, port['name'], ports)
new.write(line)
if not found_bridge_port_line:
new.write('bridge_ports {0}\n'.format(port['name']))
save_port_providers = {
'lnx': save_port_lnx,
}
def create_patch_ports(node, host_config):
for bridge in magic_consts.BRIDGES:
port, provider = ts.get_patch_port_action(host_config, bridge)
@ -324,6 +347,9 @@ def create_patch_ports(node, host_config):
cmds = create_port_cmd(bridge, port)
for cmd in cmds:
ssh.call(cmd, node=node)
save_port_func = save_port_providers.get(provider)
if save_port_func:
save_port_func(node, bridge, port)
def flush_arp(node):