File: check-networkmanager-team

package info (click to toggle)
cockpit 356-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 317,176 kB
  • sloc: javascript: 775,374; python: 41,133; ansic: 33,875; cpp: 11,141; sh: 3,534; makefile: 581; xml: 262
file content (133 lines) | stat: -rwxr-xr-x 5,593 bytes parent folder | download | duplicates (2)
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()