remove create_bond_and_station logic.

It makes no sense at all to pair a station and a bridge.
Remove the combined test in regression script.

Add option to not clean up bridge and bond interfaces.
Improve bridge and bond to handle multiple resources
(hopefully, that part is not tested)

Signed-off-by: Ben Greear <greearb@candelatech.com>
This commit is contained in:
Ben Greear
2022-01-30 16:54:39 -08:00
committed by shivam
parent 9a63700d99
commit b774389d54
3 changed files with 102 additions and 75 deletions

View File

@@ -37,30 +37,42 @@ class CreateBond(Realm):
def __init__(self, _network_dev_list=None, def __init__(self, _network_dev_list=None,
_host=None, _host=None,
_port=None, _port=None,
_shelf=1, _eid=None,
_resource=1,
_debug_on=False): _debug_on=False):
super().__init__(_host, _port) super().__init__(_host, _port)
self.host = _host self.host = _host
self.shelf = _shelf
self.resource = _resource
self.timeout = 120 self.timeout = 120
self.debug = _debug_on self.debug = _debug_on
self.network_dev_list = _network_dev_list self.network_dev_list = _network_dev_list
eid = self.name_to_eid(_eid)
self.shelf = eid[0]
self.resource = eid[1]
self.bond_name = eid[2]
def build(self): def build(self):
eid = "%s.%s.%s" % (self.shelf, self.resource, self.bond_name)
nd = False
for td in self.network_dev_list.split(","):
e2 = self.name_to_eid(td)
if not nd:
nd = e2[2]
else:
nd += ","
nd += e2[2]
data = { data = {
'shelf': self.shelf, 'shelf': self.shelf,
'resource': self.resource, 'resource': self.resource,
'port': 'bond0000', 'port': self.bond_name,
'network_devs': self.network_dev_list 'network_devs': nd
} }
self.json_post("cli-json/add_bond", data) self.json_post("cli-json/add_bond", data)
#time.sleep(3) #time.sleep(3)
bond_set_port = { bond_set_port = {
"shelf": self.shelf, "shelf": self.shelf,
"resource": self.resource, "resource": self.resource,
"port": "bond0000", "port": self.bond_name,
"current_flags": 0x80000000, "current_flags": 0x80000000,
# (0x2 + 0x4000 + 0x800000) # current, dhcp, down # (0x2 + 0x4000 + 0x800000) # current, dhcp, down
"interest": 0x4000 "interest": 0x4000
@@ -68,16 +80,16 @@ class CreateBond(Realm):
self.json_post("cli-json/set_port", bond_set_port) self.json_post("cli-json/set_port", bond_set_port)
if LFUtils.wait_until_ports_admin_up(base_url=self.lfclient_url, if LFUtils.wait_until_ports_admin_up(base_url=self.lfclient_url,
port_list=["bond0000"], port_list=[eid],
debug_=self.debug): debug_=self.debug):
self._pass("Bond interface went admin up.") self._pass("Bond interface went admin up.")
else: else:
self._fail("Bond interface did NOT go admin up.") self._fail("Bond interface did NOT go admin up.")
def cleanup(self): def cleanup(self):
bond_eid = "%s.%s.%s" % (self.shelf, self.resource, "bond0000") eid = "%s.%s.%s" % (self.shelf, self.resource, self.bond_name)
self.rm_port(bond_eid, check_exists=False, debug_=self.debug) self.rm_port(eid, check_exists=False, debug_=self.debug)
if LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=[bond_eid], debug=self.debug): if LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=[eid], debug=self.debug):
self._pass("Ports successfully cleaned up.") self._pass("Ports successfully cleaned up.")
else: else:
self._fail("Ports NOT successfully cleaned up.") self._fail("Ports NOT successfully cleaned up.")
@@ -95,13 +107,20 @@ def main():
-------------------- --------------------
Command example: Command example:
./create_bond.py ./create_bond.py
--bond_name bond0
--network_dev_list eth0,eth1 --network_dev_list eth0,eth1
--noclean
--debug --debug
''') ''')
required = parser.add_argument_group('required arguments') required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
required.add_argument('--bond_name', help='Name of the bridge to create', required=True)
required.add_argument('--network_dev_list', help='list of network devices in the bond, must be comma separated ' required.add_argument('--network_dev_list', help='list of network devices in the bond, must be comma separated '
'with no spaces', required=True) 'with no spaces', required=True)
optional.add_argument('--noclean', help='Do not remove the bond device before exit',
action='store_true')
args = parser.parse_args() args = parser.parse_args()
@@ -112,14 +131,16 @@ Command example:
create_bond = CreateBond(_host=args.mgr, create_bond = CreateBond(_host=args.mgr,
_port=args.mgr_port, _port=args.mgr_port,
_eid = args.bond_name,
_network_dev_list=args.network_dev_list, _network_dev_list=args.network_dev_list,
_debug_on=args.debug _debug_on=args.debug
) )
create_bond.build() create_bond.build()
sleep(5) if not args.noclean:
sleep(5)
create_bond.cleanup() create_bond.cleanup()
if create_bond.passes(): if create_bond.passes():
create_bond.exit_success() create_bond.exit_success()

View File

@@ -8,9 +8,12 @@ import os
import importlib import importlib
import pprint import pprint
import argparse import argparse
import logging
from time import sleep
logger = logging.getLogger(__name__)
if sys.version_info[0] != 3: if sys.version_info[0] != 3:
print("This script requires Python 3") logger.critical("This script requires Python 3")
exit(1) exit(1)
sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../")))
@@ -20,54 +23,51 @@ LFCliBase = lfcli_base.LFCliBase
LFUtils = importlib.import_module("py-json.LANforge.LFUtils") LFUtils = importlib.import_module("py-json.LANforge.LFUtils")
realm = importlib.import_module("py-json.realm") realm = importlib.import_module("py-json.realm")
Realm = realm.Realm Realm = realm.Realm
lf_logger_config = importlib.import_module("py-scripts.lf_logger_config")
class CreateBridge(Realm): class CreateBridge(Realm):
def __init__(self, sta_list, resource, target_device, radio, def __init__(self, target_device,
_ssid=None,
_security=None,
_password=None,
_host=None, _host=None,
_port=None, _port=None,
_bridge_list=None, _bridge_list=None,
_number_template="00000",
_resource=1,
_debug_on=False): _debug_on=False):
super().__init__(_host, super().__init__(_host,
_port) _port)
self.host = _host self.host = _host
self.port = _port self.port = _port
self.ssid = _ssid
self.security = _security
self.password = _password
self.bridge_list = _bridge_list self.bridge_list = _bridge_list
self.radio = radio
self.timeout = 120
self.number_template = _number_template
self.debug = _debug_on self.debug = _debug_on
self.sta_list = sta_list
self.resource = resource
self.target_device = target_device self.target_device = target_device
if self.debug:
print("----- bridge List ----- ----- ----- ----- ----- ----- \n") eid = self.name_to_eid(self.bridge_list[0])
pprint.pprint(self.sta_list) self.shelf = eid[0]
print("---- ~bridge List ----- ----- ----- ----- ----- ----- \n") self.resource = eid[1]
self.bridge_name = eid[2]
def build(self): def build(self):
# Build bridges # Build bridges
eid_str = "%s.%s.%s" % (1, self.resource, self.bridge_name)
nd = False
for td in self.target_device.split(","):
eid = self.name_to_eid(td)
if not nd:
nd = eid[2]
else:
nd += ","
nd += eid[2]
data = { data = {
"shelf": 1, "shelf": self.shelf,
"resource": self.resource, "resource": self.resource,
"port": "br0", "port": self.bridge_name,
"network_devs": "eth1,%s" % self.target_device "network_devs": nd # eth1,eth2
} }
self.json_post("cli-json/add_br", data) self.json_post("cli-json/add_br", data)
bridge_set_port = { bridge_set_port = {
"shelf": 1, "shelf": self.shelf,
"resource": self.resource, "resource": self.resource,
"port": "br0", "port": self.bridge_name,
"current_flags": 0x80000000, "current_flags": 0x80000000,
# (0x2 + 0x4000 + 0x800000) # current, dhcp, down # (0x2 + 0x4000 + 0x800000) # current, dhcp, down
"interest": 0x4000 "interest": 0x4000
@@ -75,6 +75,21 @@ class CreateBridge(Realm):
self.json_post("cli-json/set_port", bridge_set_port) self.json_post("cli-json/set_port", bridge_set_port)
if LFUtils.wait_until_ports_admin_up(base_url=self.lfclient_url,
port_list=[eid_str],
debug_=self.debug):
self._pass("Bond interface went admin up.")
else:
self._fail("Bond interface did NOT go admin up.")
def cleanup(self):
eid = "%s.%s.%s" % (self.shelf, self.resource, self.bridge_name)
self.rm_port(eid, check_exists=False, debug_=self.debug)
if LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=[eid], debug=self.debug):
self._pass("Ports successfully cleaned up.")
else:
self._fail("Ports NOT successfully cleaned up.")
def main(): def main():
parser = LFCliBase.create_basic_argparse( parser = LFCliBase.create_basic_argparse(
prog='create_bridge.py', prog='create_bridge.py',
@@ -88,56 +103,50 @@ def main():
-------------------- --------------------
Command example: Command example:
./create_bridge.py ./create_bridge.py
--upstream_port eth1 --bridge_name br0
--radio wiphy0 --target_device eth1,eth2
--num_bridges 3
--target_device wlan0
--security open
--ssid netgear
--passwd BLANK
--debug --debug
''') ''')
required = parser.add_argument_group('required arguments') required = parser.add_argument_group('required arguments')
required.add_argument( optional = parser.add_argument_group('optional arguments')
'--target_device', help='Where the bridges should be connecting', required=True)
# required.add_argument('--security', help='WiFi Security protocol: < open | wep | wpa | wpa2 | wpa3 >', required=True) required.add_argument('--bridge_name', help='Name of the bridge to create', required=True)
required.add_argument('--target_device', help='The interfaces the bridge should contain', required=True)
optional.add_argument('--noclean', help='Do not remove the bridge device before exit',
action='store_true')
optional = parser.add_argument_group('optional arguments') optional = parser.add_argument_group('optional arguments')
optional.add_argument(
'--num_bridges', help='Number of bridges to Create', required=False)
args = parser.parse_args() args = parser.parse_args()
# if args.debug: # if args.debug:
# pprint.pprint(args) # pprint.pprint(args)
# time.sleep(5) # time.sleep(5)
if args.radio is None:
raise ValueError("--radio required")
num_bridge = 2 logger_config = lf_logger_config.lf_logger_config()
if (args.num_bridges is not None) and (int(args.num_bridges) > 0): # set the logger level to requested value
num_bridges_converted = int(args.num_bridges) logger_config.set_level(level=args.log_level)
num_bridge = num_bridges_converted logger_config.set_json(json_file=args.lf_logger_config_json)
bridge_list = LFUtils.port_name_series(prefix="bridge", # This code supports creating only single bridge at a time
start_id=0, bridge_list = [args.bridge_name]
end_id=num_bridge - 1,
padding_number=10000,
radio=args.radio)
create_bridge = CreateBridge(_host=args.mgr, create_bridge = CreateBridge(_host=args.mgr,
_port=args.mgr_port, _port=args.mgr_port,
_ssid=args.ssid,
_password=args.passwd,
_security=args.security,
_bridge_list=bridge_list, _bridge_list=bridge_list,
radio=args.radio,
_debug_on=args.debug, _debug_on=args.debug,
sta_list=bridge_list,
resource=1,
target_device=args.target_device) target_device=args.target_device)
create_bridge.build() create_bridge.build()
print('Created %s bridges' % num_bridge) logger.info('Created bridge: %s' % bridge_list[0])
if not args.noclean:
sleep(5)
create_bridge.cleanup()
if create_bridge.passes():
create_bridge.exit_success()
else:
create_bridge.exit_fail()
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -209,10 +209,7 @@ function testgroup_delete_group() {
./testgroup.py --group_name group1 --add_group --add_cx cx0000,cx0001,cx0002 --remove_cx cx0003 ./testgroup.py --group_name group1 --add_group --add_cx cx0000,cx0001,cx0002 --remove_cx cx0003
./testgroup.py --group_name group1--del_group --debug --mgr "$MGR" ./testgroup.py --group_name group1--del_group --debug --mgr "$MGR"
} }
function create_bridge_and_station() {
./create_station.py --radio $RADIO_USED --ssid $SSID_USED --passwd $PASSWD_USED --security $SECURITY --debug --mgr $MGR
./create_bridge.py --radio $RADIO_USED --upstream_port $UPSTREAM --target_device $RESOURCE.sta0000 --debug --mgr $MGR
}
function create_station_and_dataplane() { function create_station_and_dataplane() {
./create_station.py --radio $RADIO_USED --ssid $SSID_USED --passwd $PASSWD_USED --security $SECURITY --debug --mgr $MGR ./create_station.py --radio $RADIO_USED --ssid $SSID_USED --passwd $PASSWD_USED --security $SECURITY --debug --mgr $MGR
./lf_dataplane_test.py --mgr $MGR --lf_user lanforge --lf_password lanforge \ ./lf_dataplane_test.py --mgr $MGR --lf_user lanforge --lf_password lanforge \
@@ -268,8 +265,8 @@ elif [[ ${#REGRESSION_COMMANDS} -gt 0 ]]; then
testCommands=(cat "$REGRESSION_COMMANDS") testCommands=(cat "$REGRESSION_COMMANDS")
else else
testCommands=( testCommands=(
"./create_bond.py --network_dev_list $RESOURCE.eth0,$UPSTREAM --debug --mgr $MGR" "./create_bond.py --network_dev_list $RESOURCE.eth2,$UPSTREAM --bond_name $RESOURCE.bond5 --debug --mgr $MGR"
create_bridge_and_station "./create_bridge.py --target_device $RESOURCE.eth2,$UPSTREAM --bridge_name $RESOURCE.br5 --debug --mgr $MGR"
create_dut_and_chamberview create_dut_and_chamberview
"./create_l3.py --radio $RADIO_USED --ssid $SSID_USED --password $PASSWD_USED --security $SECURITY --debug --mgr $MGR --endp_a wiphy0 --endp_b wiphy1" "./create_l3.py --radio $RADIO_USED --ssid $SSID_USED --password $PASSWD_USED --security $SECURITY --debug --mgr $MGR --endp_a wiphy0 --endp_b wiphy1"
"./create_l3_stations.py --mgr $MGR --radio $RADIO_USED --ssid $SSID_USED --password $PASSWD_USED --security $SECURITY --debug" "./create_l3_stations.py --mgr $MGR --radio $RADIO_USED --ssid $SSID_USED --password $PASSWD_USED --security $SECURITY --debug"