mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-11-03 20:27:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			264 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
import sys
 | 
						|
import os
 | 
						|
import importlib
 | 
						|
import argparse
 | 
						|
import logging
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
if sys.version_info[0] != 3:
 | 
						|
    logger.critical("This script requires Python 3")
 | 
						|
    exit(1)
 | 
						|
 | 
						|
sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../")))
 | 
						|
 | 
						|
lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base")
 | 
						|
LFCliBase = lfcli_base.LFCliBase
 | 
						|
LFUtils = importlib.import_module("py-json.LANforge.LFUtils")
 | 
						|
add_file_endp = importlib.import_module("py-json.LANforge.add_file_endp")
 | 
						|
realm = importlib.import_module("py-json.realm")
 | 
						|
Realm = realm.Realm
 | 
						|
lf_logger_config = importlib.import_module("py-scripts.lf_logger_config")
 | 
						|
 | 
						|
 | 
						|
class CreateMacVlan(Realm):
 | 
						|
    def __init__(self, host, port,
 | 
						|
                 upstream_port="eth1",
 | 
						|
                 num_ports=1,
 | 
						|
                 macvlan_parent=None,
 | 
						|
                 first_mvlan_ip=None,
 | 
						|
                 netmask=None,
 | 
						|
                 gateway=None,
 | 
						|
                 dhcp=True,
 | 
						|
                 port_list=None,
 | 
						|
                 ip_list=None,
 | 
						|
                 connections_per_port=1,
 | 
						|
                 _debug_on=False,
 | 
						|
                 _exit_on_error=False,
 | 
						|
                 _exit_on_fail=False):
 | 
						|
        super().__init__(host, port, debug_=_debug_on,
 | 
						|
                         _exit_on_error=_exit_on_error,
 | 
						|
                         _exit_on_fail=_exit_on_fail)
 | 
						|
        self.port = port
 | 
						|
        self.upstream_port = upstream_port
 | 
						|
        self.port_list = []
 | 
						|
        self.connections_per_port = connections_per_port
 | 
						|
        self.ip_list = ip_list
 | 
						|
        self.netmask = netmask
 | 
						|
        self.gateway = gateway
 | 
						|
        self.dhcp = dhcp
 | 
						|
        if macvlan_parent is not None:
 | 
						|
            self.macvlan_parent = macvlan_parent
 | 
						|
            self.port_list = port_list
 | 
						|
 | 
						|
        self.mvlan_profile = self.new_mvlan_profile()
 | 
						|
 | 
						|
        self.mvlan_profile.num_macvlans = int(num_ports)
 | 
						|
        self.mvlan_profile.desired_macvlans = self.port_list
 | 
						|
        self.mvlan_profile.macvlan_parent = self.macvlan_parent[2]
 | 
						|
        self.mvlan_profile.shelf = self.macvlan_parent[0]
 | 
						|
        self.mvlan_profile.resource = self.macvlan_parent[1]
 | 
						|
        self.mvlan_profile.dhcp = dhcp
 | 
						|
        self.mvlan_profile.netmask = netmask
 | 
						|
        self.mvlan_profile.first_ip_addr = first_mvlan_ip
 | 
						|
        self.mvlan_profile.gateway = gateway
 | 
						|
 | 
						|
        self.created_ports = []
 | 
						|
 | 
						|
    def build(self):
 | 
						|
        # Build stations
 | 
						|
        print("Creating MACVLANs")
 | 
						|
        if self.mvlan_profile.create(
 | 
						|
            admin_down=False,
 | 
						|
            sleep_time=0,
 | 
						|
            debug=self.debug):
 | 
						|
            self._pass("MACVLAN build finished")
 | 
						|
            self.created_ports += self.mvlan_profile.created_macvlans
 | 
						|
        else:
 | 
						|
            self._fail("MACVLAN port build failed.")
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    parser = LFCliBase.create_bare_argparse(
 | 
						|
        prog='create_macvlan.py',
 | 
						|
        # formatter_class=argparse.RawDescriptionHelpFormatter,
 | 
						|
        formatter_class=argparse.RawTextHelpFormatter,
 | 
						|
        epilog='''Creates MACVLAN endpoints.''',
 | 
						|
 | 
						|
        description='''\
 | 
						|
create_macvlan.py:
 | 
						|
--------------------
 | 
						|
Generic command layout:
 | 
						|
./create_macvlan.py --macvlan_parent <port> --num_ports <num ports>
 | 
						|
                 --first_mvlan_ip <first ip in series> --netmask <netmask to use> --gateway <gateway ip addr>
 | 
						|
 | 
						|
./create_macvlan.py --macvlan_parent eth2 --num_ports 3 --first_mvlan_ip 192.168.92.13
 | 
						|
                 --netmask 255.255.255.0 --gateway 192.168.92.1
 | 
						|
 | 
						|
./create_macvlan.py --macvlan_parent eth1 --num_ports 3
 | 
						|
                 --use_ports eth1#0,eth1#1,eth1#2 --connections_per_port 2
 | 
						|
 | 
						|
./create_macvlan.py --macvlan_parent eth1 --num_ports 3
 | 
						|
                 --first_mvlan_ip 10.40.3.100 --netmask 255.255.240.0 --gateway 10.40.0.1
 | 
						|
                 --add_to_group test_wo
 | 
						|
 | 
						|
./create_macvlan.py --macvlan_parent eth1 --num_ports 3
 | 
						|
                 --use_ports eth1#0=10.40.3.103,eth1#1,eth1#2 --connections_per_port 2
 | 
						|
                 --netmask 255.255.240.0 --gateway 10.40.0.1
 | 
						|
 | 
						|
                 You can only add MAC-VLANs to Ethernet, Bonding, Redir, and 802.1Q VLAN devices.
 | 
						|
 | 
						|
''')
 | 
						|
    parser.add_argument(
 | 
						|
        '--num_stations',
 | 
						|
        help='Number of stations to create',
 | 
						|
        default=0)
 | 
						|
    parser.add_argument(
 | 
						|
        '-u',
 | 
						|
        '--upstream_port',
 | 
						|
        help='non-station port that generates traffic: <resource>.<port>, e.g: 1.eth1',
 | 
						|
        default='1.eth1')
 | 
						|
    parser.add_argument(
 | 
						|
        '--macvlan_parent',
 | 
						|
        help='specifies parent port for macvlan creation',
 | 
						|
        required=True)
 | 
						|
    parser.add_argument(
 | 
						|
        '--first_port',
 | 
						|
        help='specifies name of first port to be used',
 | 
						|
        default=None)
 | 
						|
    parser.add_argument(
 | 
						|
        '--num_ports',
 | 
						|
        help='number of ports to create',
 | 
						|
        default=1)
 | 
						|
    parser.add_argument(
 | 
						|
        '--connections_per_port',
 | 
						|
        help='specifies number of connections to be used per port',
 | 
						|
        default=1,
 | 
						|
        type=int)
 | 
						|
    parser.add_argument(
 | 
						|
        '--use_ports',
 | 
						|
        help='list of comma separated ports to use with ips, \'=\' separates name and ip'
 | 
						|
        '{ port_name1=ip_addr1,port_name1=ip_addr2 }. '
 | 
						|
        'Ports without ips will be left alone',
 | 
						|
        default=None)
 | 
						|
    parser.add_argument(
 | 
						|
        '--first_mvlan_ip',
 | 
						|
        help='specifies first static ip address to be used or dhcp',
 | 
						|
        default=None)
 | 
						|
    parser.add_argument(
 | 
						|
        '--netmask',
 | 
						|
        help='specifies netmask to be used with static ip addresses',
 | 
						|
        default=None)
 | 
						|
    parser.add_argument(
 | 
						|
        '--gateway',
 | 
						|
        help='specifies default gateway to be used with static addressing',
 | 
						|
        default=None)
 | 
						|
    parser.add_argument(
 | 
						|
        '--cxs',
 | 
						|
        help='list of cxs to add/remove depending on use of --add_to_group or --del_from_group',
 | 
						|
        default=None)
 | 
						|
 | 
						|
    # TODO:  Use lfcli_base for common arguments.
 | 
						|
    parser.add_argument('--log_level',
 | 
						|
                        default=None,
 | 
						|
                        help='Set logging level: debug | info | warning | error | critical')
 | 
						|
    parser.add_argument('--lf_logger_config_json',
 | 
						|
                        help="--lf_logger_config_json <json file> , json configuration of logger")
 | 
						|
    args = parser.parse_args()
 | 
						|
 | 
						|
    logger_config = lf_logger_config.lf_logger_config()
 | 
						|
    # set the logger level to requested value
 | 
						|
    logger_config.set_level(level=args.log_level)
 | 
						|
    logger_config.set_json(json_file=args.lf_logger_config_json)
 | 
						|
 | 
						|
    args.macvlan_parent = LFUtils.name_to_eid(args.macvlan_parent)
 | 
						|
    port_list = []
 | 
						|
    ip_list = []
 | 
						|
    if args.first_port is not None and args.use_ports is not None:
 | 
						|
        if args.first_port.startswith("sta"):
 | 
						|
            if (args.num_ports is not None) and (int(args.num_ports) > 0):
 | 
						|
                start_num = int(args.first_port[3:])
 | 
						|
                num_ports = int(args.num_ports)
 | 
						|
                port_list = LFUtils.port_name_series(
 | 
						|
                    prefix="sta",
 | 
						|
                    start_id=start_num,
 | 
						|
                    end_id=start_num + num_ports - 1,
 | 
						|
                    padding_number=10000)
 | 
						|
        else:
 | 
						|
            if (args.num_ports is not None) and args.macvlan_parent is not None and (
 | 
						|
                    int(args.num_ports) > 0) and args.macvlan_parent[2] in args.first_port:
 | 
						|
                start_num = int(
 | 
						|
                    args.first_port[args.first_port.index('#') + 1:])
 | 
						|
                num_ports = int(args.num_ports)
 | 
						|
                port_list = LFUtils.port_name_series(
 | 
						|
                    prefix=args.macvlan_parent[2] + "#",
 | 
						|
                    start_id=start_num,
 | 
						|
                    end_id=start_num + num_ports - 1,
 | 
						|
                    padding_number=100000)
 | 
						|
            else:
 | 
						|
                raise ValueError(
 | 
						|
                    "Invalid values for num_ports [%s], macvlan_parent [%s], and/or first_port [%s].\n"
 | 
						|
                    "first_port must contain parent port and num_ports must be greater than 0" %
 | 
						|
                    (args.num_ports, args.macvlan_parent, args.first_port))
 | 
						|
    else:
 | 
						|
        if args.use_ports is None:
 | 
						|
            num_ports = int(args.num_ports)
 | 
						|
            port_list = LFUtils.port_name_series(
 | 
						|
                prefix=args.macvlan_parent[2] + "#",
 | 
						|
                start_id=0,
 | 
						|
                end_id=num_ports - 1,
 | 
						|
                padding_number=100000)
 | 
						|
        else:
 | 
						|
            temp_list = args.use_ports.split(',')
 | 
						|
            for port in temp_list:
 | 
						|
                port_list.append(port.split('=')[0])
 | 
						|
                if '=' in port:
 | 
						|
                    ip_list.append(port.split('=')[1])
 | 
						|
                else:
 | 
						|
                    ip_list.append(0)
 | 
						|
 | 
						|
            if len(port_list) != len(ip_list):
 | 
						|
                raise ValueError(
 | 
						|
                    temp_list, " ports must have matching ip addresses!")
 | 
						|
 | 
						|
    if args.first_mvlan_ip is not None:
 | 
						|
        if args.first_mvlan_ip.lower() == "dhcp":
 | 
						|
            dhcp = True
 | 
						|
        else:
 | 
						|
            dhcp = False
 | 
						|
    else:
 | 
						|
        dhcp = True
 | 
						|
    # print(port_list)
 | 
						|
 | 
						|
    # exit(1)
 | 
						|
    ip_test = CreateMacVlan(args.mgr,
 | 
						|
                            args.mgr_port,
 | 
						|
                            port_list=port_list,
 | 
						|
                            ip_list=ip_list,
 | 
						|
                            upstream_port=args.upstream_port,
 | 
						|
                            _debug_on=args.debug,
 | 
						|
                            macvlan_parent=args.macvlan_parent,
 | 
						|
                            first_mvlan_ip=args.first_mvlan_ip,
 | 
						|
                            netmask=args.netmask,
 | 
						|
                            gateway=args.gateway,
 | 
						|
                            dhcp=dhcp,
 | 
						|
                            num_ports=args.num_ports,
 | 
						|
                            connections_per_port=args.connections_per_port,
 | 
						|
                            # want a mount options param
 | 
						|
                            )
 | 
						|
 | 
						|
    ip_test.build()
 | 
						|
 | 
						|
    # TODO:  Cleanup by default, add --no_cleanup option to not do cleanup.
 | 
						|
 | 
						|
    if ip_test.passes():
 | 
						|
        print('Created %s MacVlan connections' % args.num_ports)
 | 
						|
        ip_test.exit_success()
 | 
						|
    else:
 | 
						|
        ip_test.exit_fail()
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |