1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#!/usr/bin/python3 -cimport os, sys; os.execv(os.path.dirname(sys.argv[1]) + "/../common/pywrap", sys.argv)
#
# Copyright (C) 2013 Red Hat, Inc.
# SPDX-License-Identifier: LGPL-2.1-or-later
import json
import netlib
import testlib
@testlib.skipOstree("NetworkManager-team not installed")
@testlib.skipImage("TODO: networkmanager fails on Arch Linux", "arch")
@testlib.skipImage("team not supported", "centos-10*", "rhel-10*")
@testlib.nondestructive
class TestTeam(netlib.NetworkCase):
def testBasic(self):
b = self.browser
self.login_and_go("/network")
b.wait_visible("button:contains('Add team')")
iface1 = "cockpit1"
self.add_veth(iface1, dhcp_cidr="10.111.113.1/24", dhcp_range=['10.111.113.2', '10.111.113.254'])
self.nm_activate_eth(iface1)
iface2 = "cockpit2"
self.add_veth(iface2, dhcp_cidr="10.111.114.1/24", dhcp_range=['10.111.114.2', '10.111.114.254'])
self.nm_activate_eth(iface2)
self.wait_for_iface(iface1)
self.wait_for_iface(iface2)
# team them
b.click("button:contains('Add team')")
b.wait_visible("#network-team-settings-dialog")
# wait until dialog initialized
b.wait_visible("#network-team-settings-dialog button[aria-label=Close]")
b.wait_in_text("#network-team-settings-body", "cockpit2")
b.assert_pixels("#network-team-settings-dialog", "networking-team-settings-dialog")
b.set_input_text("#network-team-settings-interface-name-input", "tteam")
b.set_checked(f"input[data-iface='{iface1}']", val=True)
b.set_checked(f"input[data-iface='{iface2}']", val=True)
b.click("#network-team-settings-dialog button:contains('Add')")
b.wait_not_present("#network-team-settings-dialog")
b.wait_attr("#networking", "data-test-wait", "false")
b.wait(lambda: 'nmcli con show | grep tteam')
b.wait_visible("#networking-interfaces tr[data-interface='tteam']")
# Check that the members are displayed
self.select_iface('tteam')
b.wait_visible("#network-interface")
b.wait_visible(f"#network-interface-members tr[data-interface='{iface1}']")
b.wait_visible(f"#network-interface-members tr[data-interface='{iface2}']")
# Deactivate the team and make sure it is still there after a
# reload.
self.wait_onoff("label[for='interface-switch']", val=True)
self.toggle_onoff("label[for='interface-switch']")
self.wait_for_iface_setting('Status', 'Inactive')
b.reload()
b.enter_page("/network")
b.wait_text("#network-interface-name", "tteam")
b.wait_text("#network-interface-hw", "Team")
b.wait_visible(f"#network-interface-members tr[data-interface='{iface1}']")
b.wait_visible(f"#network-interface-members tr[data-interface='{iface2}']")
# Delete the team
b.click("#network-interface button:contains('Delete')")
b.wait_visible("#networking")
b.wait_not_present("#networking-interfaces tr[data-interface='tteam']")
# Check that the former members are displayed and both On
self.wait_for_iface(iface1)
self.wait_for_iface(iface2)
def testActive(self):
b = self.browser
m = self.machine
self.login_and_go("/network")
b.wait_visible("#networking")
iface = "cockpit1"
self.add_veth(iface, dhcp_cidr="10.111.112.2/20")
self.nm_activate_eth(iface)
self.wait_for_iface(iface)
# Put an active interface into a team. We can't select/copy the MAC, so we can't expect to
# get the same IP as the active interface, but it should get a valid DHCP IP.
b.click("button:contains('Add team')")
b.wait_visible("#network-team-settings-dialog")
b.set_input_text("#network-team-settings-interface-name-input", "tteam")
b.set_checked(f"input[data-iface='{iface}']", val=True)
b.click("#network-team-settings-dialog button:contains('Add')")
b.wait_not_present("#network-team-settings-dialog")
b.wait_attr("#networking", "data-test-wait", "false")
b.wait(lambda: 'nmcli con show | grep tteam')
# Check that it has the interface and the right IP address
self.select_iface('tteam')
b.wait_visible("#network-interface")
b.wait_visible(f"#network-interface-members tr[data-interface='{iface}']")
b.wait_in_text("#network-interface .pf-v6-c-card:contains('tteam')", "10.111")
# Check team port
b.click("#network-interface-members button:contains('cockpit1')")
b.click("#networking-edit-teamport")
b.wait_visible("#network-team-port-settings-dialog")
b.set_input_text("#network-team-port-settings-activebackup-prio-input", "10")
b.set_checked("#network-team-port-settings-activebackup-sticky-input", val=True)
b.click("#network-team-port-settings-save")
b.wait_not_present("#network-team-port-settings-dialog")
b.wait_attr("#network-interface", "data-test-wait", "false")
# Confirm that team port settings are applied
dump_config_cmd = "teamdctl tteam port config dump cockpit1 || true"
b.wait(lambda: "sticky" in m.execute(dump_config_cmd))
cockpit1_config = m.execute(dump_config_cmd)
team_port_config = json.loads(cockpit1_config)
self.assertEqual(team_port_config.get("prio"), "10")
self.assertTrue(team_port_config.get("sticky"))
if __name__ == '__main__':
testlib.test_main()
|