mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 18:58:01 +00:00 
			
		
		
		
	transitioniting rest of the profiles - version 1 - out of realm
Signed-off-by: Dipti <dipti.dhond@candelatech.com>
This commit is contained in:
		
							
								
								
									
										120
									
								
								py-json/dut_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								py-json/dut_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | |||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from LANforge import add_dut | ||||||
|  |  | ||||||
|  | from pprint import pprint | ||||||
|  | import time | ||||||
|  | import pprint | ||||||
|  | import base64 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DUTProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True, _local_realm=local_realm) | ||||||
|  |         self.name = "NA" | ||||||
|  |         self.flags = "NA" | ||||||
|  |         self.img_file = "NA" | ||||||
|  |         self.sw_version = "NA" | ||||||
|  |         self.hw_version = "NA" | ||||||
|  |         self.model_num = "NA" | ||||||
|  |         self.serial_num = "NA" | ||||||
|  |         self.serial_port = "NA" | ||||||
|  |         self.wan_port = "NA" | ||||||
|  |         self.lan_port = "NA" | ||||||
|  |         self.ssid1 = "NA" | ||||||
|  |         self.ssid2 = "NA" | ||||||
|  |         self.ssid3 = "NA" | ||||||
|  |         self.passwd1 = "NA" | ||||||
|  |         self.passwd2 = "NA" | ||||||
|  |         self.passwd3 = "NA" | ||||||
|  |         self.mgt_ip = "NA" | ||||||
|  |         self.api_id = "NA" | ||||||
|  |         self.flags_mask = "NA" | ||||||
|  |         self.antenna_count1 = "NA" | ||||||
|  |         self.antenna_count2 = "NA" | ||||||
|  |         self.antenna_count3 = "NA" | ||||||
|  |         self.bssid1 = "NA" | ||||||
|  |         self.bssid2 = "NA" | ||||||
|  |         self.bssid3 = "NA" | ||||||
|  |         self.top_left_x = "NA" | ||||||
|  |         self.top_left_y = "NA" | ||||||
|  |         self.eap_id = "NA" | ||||||
|  |         self.flags = 0 | ||||||
|  |         self.flags_mask = 0 | ||||||
|  |         self.notes = [] | ||||||
|  |         self.append = [] | ||||||
|  |  | ||||||
|  |     def set_param(self, name, value): | ||||||
|  |         if (name in self.__dict__): | ||||||
|  |             self.__dict__[name] = value | ||||||
|  |  | ||||||
|  |     def create(self, name=None, param_=None, flags=None, flags_mask=None, notes=None): | ||||||
|  |         data = {} | ||||||
|  |         if (name is not None) and (name != ""): | ||||||
|  |             data["name"] = name | ||||||
|  |         elif (self.name is not None) and (self.name != ""): | ||||||
|  |             data["name"] = self.name | ||||||
|  |         else: | ||||||
|  |             raise ValueError("cannot create/update DUT record lacking a name") | ||||||
|  |  | ||||||
|  |         for param in add_dut.dut_params: | ||||||
|  |             if (param.name in self.__dict__): | ||||||
|  |                 if (self.__dict__[param.name] is not None) \ | ||||||
|  |                         and (self.__dict__[param.name] != "NA"): | ||||||
|  |                     data[param.name] = self.__dict__[param.name] | ||||||
|  |             else: | ||||||
|  |                 print("---------------------------------------------------------") | ||||||
|  |                 pprint(self.__dict__[param.name]) | ||||||
|  |                 print("---------------------------------------------------------") | ||||||
|  |                 raise ValueError("parameter %s not in dut_profile" % param) | ||||||
|  |  | ||||||
|  |         if (flags is not None) and (int(flags) > -1): | ||||||
|  |             data["flags"] = flags | ||||||
|  |         elif (self.flags is not None) and (self.flags > -1): | ||||||
|  |             data["flags"] = self.flags | ||||||
|  |  | ||||||
|  |         if (flags_mask is not None) and (int(flags_mask) > -1): | ||||||
|  |             data["flags_mask"] = flags_mask | ||||||
|  |         elif (self.flags_mask is not None) and (int(self.flags_mask) > -1): | ||||||
|  |             data["flags_mask"] = self.flags_mask | ||||||
|  |  | ||||||
|  |         url = "/cli-json/add_dut" | ||||||
|  |         if self.debug: | ||||||
|  |             print("---- DATA -----------------------------------------------") | ||||||
|  |             pprint(data) | ||||||
|  |             pprint(self.notes) | ||||||
|  |             pprint(self.append) | ||||||
|  |             print("---------------------------------------------------------") | ||||||
|  |         self.json_post(url, data, debug_=self.debug) | ||||||
|  |  | ||||||
|  |         if (self.notes is not None) and (len(self.notes) > 0): | ||||||
|  |             self.json_post("/cli-json/add_dut_notes", { | ||||||
|  |                 "dut": self.name, | ||||||
|  |                 "text": "[BLANK]" | ||||||
|  |             }, self.debug) | ||||||
|  |             notebytes = None | ||||||
|  |             for line in self.notes: | ||||||
|  |                 notebytes = base64.b64encode(line.encode('ascii')) | ||||||
|  |                 if self.debug: | ||||||
|  |                     print("------ NOTES ---------------------------------------------------") | ||||||
|  |                     pprint(self.notes) | ||||||
|  |                     pprint(str(notebytes)) | ||||||
|  |                     print("---------------------------------------------------------") | ||||||
|  |                 self.json_post("/cli-json/add_dut_notes", { | ||||||
|  |                     "dut": self.name, | ||||||
|  |                     "text-64": notebytes.decode('ascii') | ||||||
|  |                 }, self.debug) | ||||||
|  |         if (self.append is not None) and (len(self.append) > 0): | ||||||
|  |             notebytes = None | ||||||
|  |             for line in self.append: | ||||||
|  |                 notebytes = base64.b64encode(line.encode('ascii')) | ||||||
|  |                 if self.debug: | ||||||
|  |                     print("----- APPEND ----------------------------------------------------") | ||||||
|  |                     pprint(line) | ||||||
|  |                     pprint(str(notebytes)) | ||||||
|  |                     print("---------------------------------------------------------") | ||||||
|  |                 self.json_post("/cli-json/add_dut_notes", { | ||||||
|  |                     "dut": self.name, | ||||||
|  |                     "text-64": notebytes.decode('ascii') | ||||||
|  |                 }, self.debug) | ||||||
							
								
								
									
										185
									
								
								py-json/fio_endp_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								py-json/fio_endp_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  |  | ||||||
|  | import pprint | ||||||
|  | from pprint import pprint | ||||||
|  | import time | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class FIOEndpProfile(LFCliBase): | ||||||
|  |     """ | ||||||
|  |     Very often you will create the FileIO writer profile first so that it creates the data | ||||||
|  |     that a reader profile will subsequently use. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, io_direction="write", debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.fs_type = "fe_nfsv4" | ||||||
|  |         self.min_rw_size = 128 * 1024 | ||||||
|  |         self.max_rw_size = 128 * 1024 | ||||||
|  |         self.min_file_size = 10 * 1024 * 1024 | ||||||
|  |         self.max_file_size = 10 * 1024 * 1024 | ||||||
|  |  | ||||||
|  |         self.min_read_rate_bps = 10 * 1000 * 1000 | ||||||
|  |         self.max_read_rate_bps = 10 * 1000 * 1000 | ||||||
|  |         self.min_write_rate_bps = 1000 * 1000 * 1000 | ||||||
|  |         self.max_write_rate_bps = 1000 * 1000 * 1000 | ||||||
|  |  | ||||||
|  |         self.file_num = 10  # number of files to write | ||||||
|  |         self.directory = None  # directory like /mnt/lf/$endp_name | ||||||
|  |  | ||||||
|  |         # this refers to locally mounted directories presently used for writing | ||||||
|  |         # you would set this when doing read tests simultaneously to write tests | ||||||
|  |         # so like, if your endpoint names are like wo_300GB_001, your Directory value | ||||||
|  |         # defaults to /mnt/lf/wo_300GB_001; but reader enpoint would be named | ||||||
|  |         # /mnt/lf/ro_300GB_001, this overwrites a readers directory name to wo_300GB_001 | ||||||
|  |         self.mount_dir = "AUTO" | ||||||
|  |  | ||||||
|  |         self.server_mount = None  # like cifs://10.0.0.1/bashful or 192.168.1.1:/var/tmp | ||||||
|  |         self.mount_options = None | ||||||
|  |         self.iscsi_vol = None | ||||||
|  |         self.retry_timer_ms = 2000 | ||||||
|  |         self.io_direction = io_direction  # read / write | ||||||
|  |         self.quiesce_ms = 3000 | ||||||
|  |         self.pattern = "increasing" | ||||||
|  |         self.file_prefix = "AUTO"  # defaults to endp_name | ||||||
|  |         self.cx_prefix = "wo_" | ||||||
|  |  | ||||||
|  |         self.created_cx = {} | ||||||
|  |         self.created_endp = [] | ||||||
|  |  | ||||||
|  |     def start_cx(self): | ||||||
|  |         print("Starting CXs...") | ||||||
|  |         for cx_name in self.created_cx.keys(): | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": self.created_cx[cx_name], | ||||||
|  |                 "cx_state": "RUNNING" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def stop_cx(self): | ||||||
|  |         print("Stopping CXs...") | ||||||
|  |         for cx_name in self.created_cx.keys(): | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": self.created_cx[cx_name], | ||||||
|  |                 "cx_state": "STOPPED" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def create_ro_profile(self): | ||||||
|  |         ro_profile = self.local_realm.new_fio_endp_profile() | ||||||
|  |         ro_profile.realm = self.local_realm | ||||||
|  |  | ||||||
|  |         ro_profile.fs_type = self.fs_type | ||||||
|  |         ro_profile.min_read_rate_bps = self.min_write_rate_bps | ||||||
|  |         ro_profile.max_read_rate_bps = self.max_write_rate_bps | ||||||
|  |         ro_profile.min_write_rate_bps = self.min_read_rate_bps | ||||||
|  |         ro_profile.max_write_rate_bps = self.max_read_rate_bps | ||||||
|  |         ro_profile.file_num = self.file_num | ||||||
|  |         ro_profile.directory = self.directory | ||||||
|  |         ro_profile.mount_dir = self.directory | ||||||
|  |         ro_profile.server_mount = self.server_mount | ||||||
|  |         ro_profile.mount_options = self.mount_options | ||||||
|  |         ro_profile.iscsi_vol = self.iscsi_vol | ||||||
|  |         ro_profile.retry_timer_ms = self.retry_timer_ms | ||||||
|  |         ro_profile.io_direction = "read" | ||||||
|  |         ro_profile.quiesce_ms = self.quiesce_ms | ||||||
|  |         ro_profile.pattern = self.pattern | ||||||
|  |         ro_profile.file_prefix = self.file_prefix | ||||||
|  |         ro_profile.cx_prefix = "ro_" | ||||||
|  |         return ro_profile | ||||||
|  |  | ||||||
|  |     def cleanup(self): | ||||||
|  |         print("Cleaning up cxs and endpoints") | ||||||
|  |         if len(self.created_cx) != 0: | ||||||
|  |             for cx_name in self.created_cx.keys(): | ||||||
|  |                 req_url = "cli-json/rm_cx" | ||||||
|  |                 data = { | ||||||
|  |                     "test_mgr": "default_tm", | ||||||
|  |                     "cx_name": self.created_cx[cx_name] | ||||||
|  |                 } | ||||||
|  |                 self.json_post(req_url, data) | ||||||
|  |                 # pprint(data) | ||||||
|  |                 req_url = "cli-json/rm_endp" | ||||||
|  |                 data = { | ||||||
|  |                     "endp_name": cx_name | ||||||
|  |                 } | ||||||
|  |                 self.json_post(req_url, data) | ||||||
|  |                 # pprint(data) | ||||||
|  |  | ||||||
|  |     def create(self, ports=[], connections_per_port=1, sleep_time=.5, debug_=False, suppress_related_commands_=None): | ||||||
|  |         cx_post_data = [] | ||||||
|  |         for port_name in ports: | ||||||
|  |             for num_connection in range(connections_per_port): | ||||||
|  |                 if len(self.local_realm.name_to_eid(port_name)) == 3: | ||||||
|  |                     shelf = self.local_realm.name_to_eid(port_name)[0] | ||||||
|  |                     resource = self.local_realm.name_to_eid(port_name)[1] | ||||||
|  |                     name = self.local_realm.name_to_eid(port_name)[2] | ||||||
|  |                 else: | ||||||
|  |                     raise ValueError("Unexpected name for port_name %s" % port_name) | ||||||
|  |                 if self.directory is None or self.server_mount is None or self.fs_type is None: | ||||||
|  |                     raise ValueError("directory [%s], server_mount [%s], and type [%s] must not be None" % ( | ||||||
|  |                         self.directory, self.server_mount, self.fs_type)) | ||||||
|  |                 endp_data = { | ||||||
|  |                     "alias": self.cx_prefix + name + "_" + str(num_connection) + "_fio", | ||||||
|  |                     "shelf": shelf, | ||||||
|  |                     "resource": resource, | ||||||
|  |                     "port": name, | ||||||
|  |                     "type": self.fs_type, | ||||||
|  |                     "min_read_rate": self.min_read_rate_bps, | ||||||
|  |                     "max_read_rate": self.max_read_rate_bps, | ||||||
|  |                     "min_write_rate": self.min_write_rate_bps, | ||||||
|  |                     "max_write_rate": self.max_write_rate_bps, | ||||||
|  |                     "directory": self.directory, | ||||||
|  |                     "server_mount": self.server_mount, | ||||||
|  |                     "mount_dir": self.mount_dir, | ||||||
|  |                     "prefix": self.file_prefix, | ||||||
|  |                     "payload_pattern": self.pattern, | ||||||
|  |  | ||||||
|  |                 } | ||||||
|  |                 # Read direction is copy of write only directory | ||||||
|  |                 if self.io_direction == "read": | ||||||
|  |                     endp_data["prefix"] = "wo_" + name + "_" + str(num_connection) + "_fio" | ||||||
|  |                     endp_data["directory"] = "/mnt/lf/wo_" + name + "_" + str(num_connection) + "_fio" | ||||||
|  |  | ||||||
|  |                 url = "cli-json/add_file_endp" | ||||||
|  |                 self.local_realm.json_post(url, endp_data, debug_=False, | ||||||
|  |                                            suppress_related_commands_=suppress_related_commands_) | ||||||
|  |                 time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |                 data = { | ||||||
|  |                     "name": self.cx_prefix + name + "_" + str(num_connection) + "_fio", | ||||||
|  |                     "io_direction": self.io_direction, | ||||||
|  |                     "num_files": 5 | ||||||
|  |                 } | ||||||
|  |                 self.local_realm.json_post("cli-json/set_fe_info", data, debug_=debug_, | ||||||
|  |                                            suppress_related_commands_=suppress_related_commands_) | ||||||
|  |  | ||||||
|  |         self.local_realm.json_post("/cli-json/nc_show_endpoints", {"endpoint": "all"}) | ||||||
|  |         for port_name in ports: | ||||||
|  |             for num_connection in range(connections_per_port): | ||||||
|  |                 if len(self.local_realm.name_to_eid(port_name)) == 3: | ||||||
|  |                     shelf = self.local_realm.name_to_eid(port_name)[0] | ||||||
|  |                     resource = self.local_realm.name_to_eid(port_name)[1] | ||||||
|  |                     name = self.local_realm.name_to_eid(port_name)[2] | ||||||
|  |  | ||||||
|  |                 endp_data = { | ||||||
|  |                     "alias": "CX_" + self.cx_prefix + name + "_" + str(num_connection) + "_fio", | ||||||
|  |                     "test_mgr": "default_tm", | ||||||
|  |                     "tx_endp": self.cx_prefix + name + "_" + str(num_connection) + "_fio", | ||||||
|  |                     "rx_endp": "NA" | ||||||
|  |                 } | ||||||
|  |                 cx_post_data.append(endp_data) | ||||||
|  |                 self.created_cx[self.cx_prefix + name + "_" + str( | ||||||
|  |                     num_connection) + "_fio"] = "CX_" + self.cx_prefix + name + "_" + str(num_connection) + "_fio" | ||||||
|  |  | ||||||
|  |         for cx_data in cx_post_data: | ||||||
|  |             url = "/cli-json/add_cx" | ||||||
|  |             self.local_realm.json_post(url, cx_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands_) | ||||||
|  |             time.sleep(sleep_time) | ||||||
							
								
								
									
										199
									
								
								py-json/gen_cxprofile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								py-json/gen_cxprofile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,199 @@ | |||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from pprint import pprint | ||||||
|  | import pprint | ||||||
|  | import time | ||||||
|  |  | ||||||
|  | class GenCXProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.lfclient_host = lfclient_host | ||||||
|  |         self.lfclient_port = lfclient_port | ||||||
|  |         self.lfclient_url = "http://%s:%s" % (lfclient_host, lfclient_port) | ||||||
|  |         self.debug = debug_ | ||||||
|  |         self.type = "lfping" | ||||||
|  |         self.dest = "127.0.0.1" | ||||||
|  |         self.interval = 1 | ||||||
|  |         self.cmd = "" | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.name_prefix = "generic" | ||||||
|  |         self.created_cx = [] | ||||||
|  |         self.created_endp = [] | ||||||
|  |         self.file_output = "/dev/null" | ||||||
|  |         self.loop_count = 1 | ||||||
|  |  | ||||||
|  |     def parse_command(self, sta_name): | ||||||
|  |         if self.type == "lfping": | ||||||
|  |             if ((self.dest is not None) or (self.dest != "")) and ((self.interval is not None) or (self.interval > 0)): | ||||||
|  |                 self.cmd = "%s  -i %s -I %s %s" % (self.type, self.interval, sta_name, self.dest) | ||||||
|  |                 # print(self.cmd) | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Please ensure dest and interval have been set correctly") | ||||||
|  |         elif self.type == "generic": | ||||||
|  |             if self.cmd == "": | ||||||
|  |                 raise ValueError("Please ensure cmd has been set correctly") | ||||||
|  |         elif self.type == "speedtest": | ||||||
|  |             self.cmd = "vrf_exec.bash %s speedtest-cli --json --share" % (sta_name) | ||||||
|  |         elif self.type == "iperf3" and self.dest is not None: | ||||||
|  |             self.cmd = "iperf3 --forceflush --format k --precision 4 -c %s -t 60 --tos 0 -b 1K --bind_dev %s -i 1 " \ | ||||||
|  |                        "--pidfile /tmp/lf_helper_iperf3_test.pid" % (self.dest, sta_name) | ||||||
|  |         elif self.type == "lfcurl": | ||||||
|  |             if self.file_output is not None: | ||||||
|  |                 self.cmd = "./scripts/lf_curl.sh  -p %s -i AUTO -o %s -n %s -d %s" % \ | ||||||
|  |                            (sta_name, self.file_output, self.loop_count, self.dest) | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Please ensure file_output has been set correctly") | ||||||
|  |         else: | ||||||
|  |             raise ValueError("Unknown command type") | ||||||
|  |  | ||||||
|  |     def start_cx(self): | ||||||
|  |         print("Starting CXs...") | ||||||
|  |         # print(self.created_cx) | ||||||
|  |         # print(self.created_endp) | ||||||
|  |         for cx_name in self.created_cx: | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": cx_name, | ||||||
|  |                 "cx_state": "RUNNING" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def stop_cx(self): | ||||||
|  |         print("Stopping CXs...") | ||||||
|  |         for cx_name in self.created_cx: | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": cx_name, | ||||||
|  |                 "cx_state": "STOPPED" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def cleanup(self): | ||||||
|  |         print("Cleaning up cxs and endpoints") | ||||||
|  |         for cx_name in self.created_cx: | ||||||
|  |             req_url = "cli-json/rm_cx" | ||||||
|  |             data = { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": cx_name | ||||||
|  |             } | ||||||
|  |             self.json_post(req_url, data) | ||||||
|  |  | ||||||
|  |         for endp_name in self.created_endp: | ||||||
|  |             req_url = "cli-json/rm_endp" | ||||||
|  |             data = { | ||||||
|  |                 "endp_name": endp_name | ||||||
|  |             } | ||||||
|  |             self.json_post(req_url, data) | ||||||
|  |  | ||||||
|  |     def set_flags(self, endp_name, flag_name, val): | ||||||
|  |         data = { | ||||||
|  |             "name": endp_name, | ||||||
|  |             "flag": flag_name, | ||||||
|  |             "val": val | ||||||
|  |         } | ||||||
|  |         self.json_post("cli-json/set_endp_flag", data, debug_=self.debug) | ||||||
|  |  | ||||||
|  |     def set_cmd(self, endp_name, cmd): | ||||||
|  |         data = { | ||||||
|  |             "name": endp_name, | ||||||
|  |             "command": cmd | ||||||
|  |         } | ||||||
|  |         self.json_post("cli-json/set_gen_cmd", data, debug_=self.debug) | ||||||
|  |  | ||||||
|  |     def create(self, ports=[], sleep_time=.5, debug_=False, suppress_related_commands_=None): | ||||||
|  |         if self.debug: | ||||||
|  |             debug_ = True | ||||||
|  |         post_data = [] | ||||||
|  |         endp_tpls = [] | ||||||
|  |         for port_name in ports: | ||||||
|  |             port_info = self.local_realm.name_to_eid(port_name) | ||||||
|  |             if len(port_info) == 2: | ||||||
|  |                 resource = 1 | ||||||
|  |                 shelf = port_info[0] | ||||||
|  |                 name = port_info[-1] | ||||||
|  |             elif len(port_info) == 3: | ||||||
|  |                 resource = port_info[0] | ||||||
|  |                 shelf = port_info[1] | ||||||
|  |                 name = port_info[-1] | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Unexpected name for port_name %s" % port_name) | ||||||
|  |  | ||||||
|  |             # this naming convention follows what you see when you use | ||||||
|  |             # lf_firemod.pl --action list_endp after creating a generic endpoint | ||||||
|  |             gen_name_a = "%s-%s" % (self.name_prefix, name) | ||||||
|  |             gen_name_b = "D_%s-%s" % (self.name_prefix, name) | ||||||
|  |             endp_tpls.append((shelf, resource, name, gen_name_a, gen_name_b)) | ||||||
|  |  | ||||||
|  |         for endp_tpl in endp_tpls: | ||||||
|  |             shelf = endp_tpl[0] | ||||||
|  |             resource = endp_tpl[1] | ||||||
|  |             name = endp_tpl[2] | ||||||
|  |             gen_name_a = endp_tpl[3] | ||||||
|  |             # gen_name_b  = endp_tpl[3] | ||||||
|  |             # (self, alias=None, shelf=1, resource=1, port=None, type=None) | ||||||
|  |  | ||||||
|  |             data = { | ||||||
|  |                 "alias": gen_name_a, | ||||||
|  |                 "shelf": shelf, | ||||||
|  |                 "resource": resource, | ||||||
|  |                 "port": name, | ||||||
|  |                 "type": "gen_generic" | ||||||
|  |             } | ||||||
|  |             if self.debug: | ||||||
|  |                 pprint(data) | ||||||
|  |  | ||||||
|  |             self.json_post("cli-json/add_gen_endp", data, debug_=self.debug) | ||||||
|  |  | ||||||
|  |         self.local_realm.json_post("/cli-json/nc_show_endpoints", {"endpoint": "all"}) | ||||||
|  |         time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |         for endp_tpl in endp_tpls: | ||||||
|  |             gen_name_a = endp_tpl[3] | ||||||
|  |             gen_name_b = endp_tpl[4] | ||||||
|  |             self.set_flags(gen_name_a, "ClearPortOnStart", 1) | ||||||
|  |         time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |         for endp_tpl in endp_tpls: | ||||||
|  |             name = endp_tpl[2] | ||||||
|  |             gen_name_a = endp_tpl[3] | ||||||
|  |             # gen_name_b  = endp_tpl[4] | ||||||
|  |             self.parse_command(name) | ||||||
|  |             self.set_cmd(gen_name_a, self.cmd) | ||||||
|  |         time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |         for endp_tpl in endp_tpls: | ||||||
|  |             name = endp_tpl[2] | ||||||
|  |             gen_name_a = endp_tpl[3] | ||||||
|  |             gen_name_b = endp_tpl[4] | ||||||
|  |             cx_name = "CX_%s-%s" % (self.name_prefix, name) | ||||||
|  |             data = { | ||||||
|  |                 "alias": cx_name, | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "tx_endp": gen_name_a, | ||||||
|  |                 "rx_endp": gen_name_b | ||||||
|  |             } | ||||||
|  |             post_data.append(data) | ||||||
|  |             self.created_cx.append(cx_name) | ||||||
|  |             self.created_endp.append(gen_name_a) | ||||||
|  |             self.created_endp.append(gen_name_b) | ||||||
|  |  | ||||||
|  |         time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |         for data in post_data: | ||||||
|  |             url = "/cli-json/add_cx" | ||||||
|  |             if self.debug: | ||||||
|  |                 pprint(data) | ||||||
|  |             self.local_realm.json_post(url, data, debug_=debug_, suppress_related_commands_=suppress_related_commands_) | ||||||
|  |             time.sleep(2) | ||||||
|  |         time.sleep(sleep_time) | ||||||
|  |         for data in post_data: | ||||||
|  |             self.local_realm.json_post("/cli-json/show_cx", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cross_connect": data["alias"] | ||||||
|  |             }) | ||||||
|  |         time.sleep(sleep_time) | ||||||
							
								
								
									
										162
									
								
								py-json/http_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								py-json/http_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,162 @@ | |||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from pprint import pprint | ||||||
|  | import pprint | ||||||
|  | import time | ||||||
|  |  | ||||||
|  | class HTTPProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.lfclient_url = "http://%s:%s" % (lfclient_host, lfclient_port) | ||||||
|  |         self.debug = debug_ | ||||||
|  |         self.requests_per_ten = 600 | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.created_cx = {} | ||||||
|  |         self.created_endp = [] | ||||||
|  |         self.ip_map = {} | ||||||
|  |         self.direction = "dl" | ||||||
|  |         self.dest = "/dev/null" | ||||||
|  |         self.port_util = PortUtils(self.local_realm) | ||||||
|  |  | ||||||
|  |     def check_errors(self, debug=False): | ||||||
|  |         fields_list = ["!conn", "acc.+denied", "bad-proto", "bad-url", "other-err", "total-err", "rslv-p", "rslv-h", | ||||||
|  |                        "timeout", "nf+(4xx)", "http-r", "http-p", "http-t", "login-denied"] | ||||||
|  |         endp_list = self.json_get("layer4/list?fields=%s" % ','.join(fields_list)) | ||||||
|  |         debug_info = {} | ||||||
|  |         if endp_list is not None and endp_list['endpoint'] is not None: | ||||||
|  |             endp_list = endp_list['endpoint'] | ||||||
|  |             expected_passes = len(endp_list) | ||||||
|  |             passes = len(endp_list) | ||||||
|  |             for item in range(len(endp_list)): | ||||||
|  |                 for name, info in endp_list[item].items(): | ||||||
|  |                     for field in fields_list: | ||||||
|  |                         if info[field.replace("+", " ")] > 0: | ||||||
|  |                             passes -= 1 | ||||||
|  |                             debug_info[name] = {field: info[field.replace("+", " ")]} | ||||||
|  |             if debug: | ||||||
|  |                 print(debug_info) | ||||||
|  |             if passes == expected_passes: | ||||||
|  |                 return True | ||||||
|  |             else: | ||||||
|  |                 print(list(debug_info), " Endps in this list showed errors getting to its URL")  # %s") % self.url) | ||||||
|  |                 return False | ||||||
|  |  | ||||||
|  |     def start_cx(self): | ||||||
|  |         print("Starting CXs...") | ||||||
|  |         for cx_name in self.created_cx.keys(): | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": self.created_cx[cx_name], | ||||||
|  |                 "cx_state": "RUNNING" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def stop_cx(self): | ||||||
|  |         print("Stopping CXs...") | ||||||
|  |         for cx_name in self.created_cx.keys(): | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": self.created_cx[cx_name], | ||||||
|  |                 "cx_state": "STOPPED" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def cleanup(self): | ||||||
|  |         print("Cleaning up cxs and endpoints") | ||||||
|  |         if len(self.created_cx) != 0: | ||||||
|  |             for cx_name in self.created_cx.keys(): | ||||||
|  |                 req_url = "cli-json/rm_cx" | ||||||
|  |                 data = { | ||||||
|  |                     "test_mgr": "default_tm", | ||||||
|  |                     "cx_name": self.created_cx[cx_name] | ||||||
|  |                 } | ||||||
|  |                 self.json_post(req_url, data) | ||||||
|  |                 # pprint(data) | ||||||
|  |                 req_url = "cli-json/rm_endp" | ||||||
|  |                 data = { | ||||||
|  |                     "endp_name": cx_name | ||||||
|  |                 } | ||||||
|  |                 self.json_post(req_url, data) | ||||||
|  |                 # pprint(data) | ||||||
|  |  | ||||||
|  |     def map_sta_ips(self, sta_list=[]): | ||||||
|  |         for sta_eid in sta_list: | ||||||
|  |             eid = self.local_realm.name_to_eid(sta_eid) | ||||||
|  |             sta_list = self.json_get("/port/%s/%s/%s?fields=alias,ip" % | ||||||
|  |                                      (eid[0], eid[1], eid[2])) | ||||||
|  |             if sta_list['interface'] is not None: | ||||||
|  |                 self.ip_map[sta_list['interface']['alias']] = sta_list['interface']['ip'] | ||||||
|  |  | ||||||
|  |     def create(self, ports=[], sleep_time=.5, debug_=False, suppress_related_commands_=None, http=False, ftp=False, | ||||||
|  |                user=None, passwd=None, source=None): | ||||||
|  |         cx_post_data = [] | ||||||
|  |         self.map_sta_ips(ports) | ||||||
|  |         for i in range(len(list(self.ip_map))): | ||||||
|  |             url = None | ||||||
|  |             if i != len(list(self.ip_map)) - 1: | ||||||
|  |                 port_name = list(self.ip_map)[i] | ||||||
|  |                 ip_addr = self.ip_map[list(self.ip_map)[i + 1]] | ||||||
|  |             else: | ||||||
|  |                 port_name = list(self.ip_map)[i] | ||||||
|  |                 ip_addr = self.ip_map[list(self.ip_map)[0]] | ||||||
|  |  | ||||||
|  |             if (ip_addr is None) or (ip_addr == ""): | ||||||
|  |                 raise ValueError("HTTPProfile::create encountered blank ip/hostname") | ||||||
|  |  | ||||||
|  |             if len(self.local_realm.name_to_eid(port_name)) == 3: | ||||||
|  |                 shelf = self.local_realm.name_to_eid(port_name)[0] | ||||||
|  |                 resource = self.local_realm.name_to_eid(port_name)[1] | ||||||
|  |                 name = self.local_realm.name_to_eid(port_name)[2] | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Unexpected name for port_name %s" % port_name) | ||||||
|  |  | ||||||
|  |             if http: | ||||||
|  |                 self.port_util.set_http(port_name=name, resource=resource, on=True) | ||||||
|  |                 url = "%s http://%s/ %s" % (self.direction, ip_addr, self.dest) | ||||||
|  |             if ftp: | ||||||
|  |                 self.port_util.set_ftp(port_name=name, resource=resource, on=True) | ||||||
|  |                 if user is not None and passwd is not None and source is not None: | ||||||
|  |                     url = "%s ftp://%s:%s@%s%s %s" % (self.direction, user, passwd, ip_addr, source, self.dest) | ||||||
|  |                 else: | ||||||
|  |                     raise ValueError("user: %s, passwd: %s, and source: %s must all be set" % (user, passwd, source)) | ||||||
|  |             if not http and not ftp: | ||||||
|  |                 raise ValueError("Please specify ftp and/or http") | ||||||
|  |  | ||||||
|  |             if (url is None) or (url == ""): | ||||||
|  |                 raise ValueError("HTTPProfile::create: url unset") | ||||||
|  |  | ||||||
|  |             endp_data = { | ||||||
|  |                 "alias": name + "_l4", | ||||||
|  |                 "shelf": shelf, | ||||||
|  |                 "resource": resource, | ||||||
|  |                 "port": name, | ||||||
|  |                 "type": "l4_generic", | ||||||
|  |                 "timeout": 10, | ||||||
|  |                 "url_rate": self.requests_per_ten, | ||||||
|  |                 "url": url, | ||||||
|  |                 "proxy_auth_type": 0x200 | ||||||
|  |             } | ||||||
|  |             url = "cli-json/add_l4_endp" | ||||||
|  |             self.local_realm.json_post(url, endp_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands_) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |             endp_data = { | ||||||
|  |                 "alias": "CX_" + name + "_l4", | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "tx_endp": name + "_l4", | ||||||
|  |                 "rx_endp": "NA" | ||||||
|  |             } | ||||||
|  |             cx_post_data.append(endp_data) | ||||||
|  |             self.created_cx[name + "_l4"] = "CX_" + name + "_l4" | ||||||
|  |  | ||||||
|  |         for cx_data in cx_post_data: | ||||||
|  |             url = "/cli-json/add_cx" | ||||||
|  |             self.local_realm.json_post(url, cx_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands_) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										273
									
								
								py-json/l4_cxprofile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										273
									
								
								py-json/l4_cxprofile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,273 @@ | |||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import re | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from pprint import pprint | ||||||
|  | import pprint | ||||||
|  | import time | ||||||
|  | import datetime | ||||||
|  | import csv | ||||||
|  | import os | ||||||
|  |  | ||||||
|  | class L4CXProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.lfclient_url = "http://%s:%s" % (lfclient_host, lfclient_port) | ||||||
|  |         self.debug = debug_ | ||||||
|  |         self.url = "http://localhost/" | ||||||
|  |         self.requests_per_ten = 600 | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.created_cx = {} | ||||||
|  |         self.created_endp = [] | ||||||
|  |         self.lfclient_port = lfclient_port | ||||||
|  |         self.lfclient_host = lfclient_host | ||||||
|  |  | ||||||
|  |     def check_errors(self, debug=False): | ||||||
|  |         fields_list = ["!conn", "acc.+denied", "bad-proto", "bad-url", "other-err", "total-err", "rslv-p", "rslv-h", | ||||||
|  |                        "timeout", "nf+(4xx)", "http-r", "http-p", "http-t", "login-denied"] | ||||||
|  |         endp_list = self.json_get("layer4/list?fields=%s" % ','.join(fields_list)) | ||||||
|  |         debug_info = {} | ||||||
|  |         if endp_list is not None and endp_list['endpoint'] is not None: | ||||||
|  |             endp_list = endp_list['endpoint'] | ||||||
|  |             expected_passes = len(endp_list) | ||||||
|  |             passes = len(endp_list) | ||||||
|  |             for item in range(len(endp_list)): | ||||||
|  |                 for name, info in endp_list[item].items(): | ||||||
|  |                     for field in fields_list: | ||||||
|  |                         if info[field.replace("+", " ")] > 0: | ||||||
|  |                             passes -= 1 | ||||||
|  |                             debug_info[name] = {field: info[field.replace("+", " ")]} | ||||||
|  |             if debug: | ||||||
|  |                 print(debug_info) | ||||||
|  |             if passes == expected_passes: | ||||||
|  |                 return True | ||||||
|  |             else: | ||||||
|  |                 print(list(debug_info), " Endps in this list showed errors getting to %s " % self.url) | ||||||
|  |                 return False | ||||||
|  |  | ||||||
|  |     def start_cx(self): | ||||||
|  |         print("Starting CXs...") | ||||||
|  |         for cx_name in self.created_cx.keys(): | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": self.created_cx[cx_name], | ||||||
|  |                 "cx_state": "RUNNING" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def stop_cx(self): | ||||||
|  |         print("Stopping CXs...") | ||||||
|  |         for cx_name in self.created_cx.keys(): | ||||||
|  |             self.json_post("/cli-json/set_cx_state", { | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "cx_name": self.created_cx[cx_name], | ||||||
|  |                 "cx_state": "STOPPED" | ||||||
|  |             }, debug_=self.debug) | ||||||
|  |             print(".", end='') | ||||||
|  |         print("") | ||||||
|  |  | ||||||
|  |     def check_request_rate(self): | ||||||
|  |         endp_list = self.json_get("layer4/list?fields=urls/s") | ||||||
|  |         expected_passes = 0 | ||||||
|  |         passes = 0 | ||||||
|  |         # TODO: this might raise a nameerror lower down | ||||||
|  |         #  if self.target_requests_per_ten is None: | ||||||
|  |         #    raise NameError("check request rate: missing self.target_requests_per_ten") | ||||||
|  |         if endp_list is not None and endp_list['endpoint'] is not None: | ||||||
|  |             endp_list = endp_list['endpoint'] | ||||||
|  |             for item in endp_list: | ||||||
|  |                 for name, info in item.items(): | ||||||
|  |                     if name in self.created_cx.keys(): | ||||||
|  |                         expected_passes += 1 | ||||||
|  |                         if info['urls/s'] * self.requests_per_ten >= self.target_requests_per_ten * .9: | ||||||
|  |                             print(name, info['urls/s'], info['urls/s'] * self.requests_per_ten, self.target_requests_per_ten * .9) | ||||||
|  |                             passes += 1 | ||||||
|  |  | ||||||
|  |         return passes == expected_passes | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def cleanup(self): | ||||||
|  |         print("Cleaning up cxs and endpoints") | ||||||
|  |         if len(self.created_cx) != 0: | ||||||
|  |             for cx_name in self.created_cx.keys(): | ||||||
|  |                 req_url = "cli-json/rm_cx" | ||||||
|  |                 data = { | ||||||
|  |                     "test_mgr": "default_tm", | ||||||
|  |                     "cx_name": self.created_cx[cx_name] | ||||||
|  |                 } | ||||||
|  |                 self.json_post(req_url, data) | ||||||
|  |                 # pprint(data) | ||||||
|  |                 req_url = "cli-json/rm_endp" | ||||||
|  |                 data = { | ||||||
|  |                     "endp_name": cx_name | ||||||
|  |                 } | ||||||
|  |                 self.json_post(req_url, data) | ||||||
|  |                 # pprint(data) | ||||||
|  |  | ||||||
|  |     def create(self, ports=[], sleep_time=.5, debug_=False, suppress_related_commands_=None): | ||||||
|  |         cx_post_data = [] | ||||||
|  |         for port_name in ports: | ||||||
|  |             if len(self.local_realm.name_to_eid(port_name)) == 3: | ||||||
|  |                 shelf = self.local_realm.name_to_eid(port_name)[0] | ||||||
|  |                 resource = self.local_realm.name_to_eid(port_name)[1] | ||||||
|  |                 name = self.local_realm.name_to_eid(port_name)[2] | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Unexpected name for port_name %s" % port_name) | ||||||
|  |             endp_data = { | ||||||
|  |                 "alias": name + "_l4", | ||||||
|  |                 "shelf": shelf, | ||||||
|  |                 "resource": resource, | ||||||
|  |                 "port": name, | ||||||
|  |                 "type": "l4_generic", | ||||||
|  |                 "timeout": 10, | ||||||
|  |                 "url_rate": self.requests_per_ten, | ||||||
|  |                 "url": self.url, | ||||||
|  |                 "proxy_auth_type": 0x200 | ||||||
|  |             } | ||||||
|  |             url = "cli-json/add_l4_endp" | ||||||
|  |             self.local_realm.json_post(url, endp_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands_) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |             endp_data = { | ||||||
|  |                 "alias": "CX_" + name + "_l4", | ||||||
|  |                 "test_mgr": "default_tm", | ||||||
|  |                 "tx_endp": name + "_l4", | ||||||
|  |                 "rx_endp": "NA" | ||||||
|  |             } | ||||||
|  |             cx_post_data.append(endp_data) | ||||||
|  |             self.created_cx[name + "_l4"] = "CX_" + name + "_l4" | ||||||
|  |  | ||||||
|  |         for cx_data in cx_post_data: | ||||||
|  |             url = "/cli-json/add_cx" | ||||||
|  |             self.local_realm.json_post(url, cx_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands_) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |     def monitor(self, | ||||||
|  |                 duration_sec=60, | ||||||
|  |                 monitor_interval=1, | ||||||
|  |                 col_names=None, | ||||||
|  |                 created_cx=None, | ||||||
|  |                 monitor=True, | ||||||
|  |                 report_file=None, | ||||||
|  |                 output_format=None, | ||||||
|  |                 script_name=None, | ||||||
|  |                 arguments=None, | ||||||
|  |                 iterations=0, | ||||||
|  |                 debug=False): | ||||||
|  |         try: | ||||||
|  |             duration_sec = Realm.parse_time(duration_sec).seconds | ||||||
|  |         except: | ||||||
|  |             if (duration_sec is None) or (duration_sec <= 1): | ||||||
|  |                 raise ValueError("L4CXProfile::monitor wants duration_sec > 1 second") | ||||||
|  |             if (duration_sec <= monitor_interval): | ||||||
|  |                 raise ValueError("L4CXProfile::monitor wants duration_sec > monitor_interval") | ||||||
|  |         if report_file == None: | ||||||
|  |             raise ValueError("Monitor requires an output file to be defined") | ||||||
|  |         if created_cx == None: | ||||||
|  |             raise ValueError("Monitor needs a list of Layer 4 connections") | ||||||
|  |         if (monitor_interval is None) or (monitor_interval < 1): | ||||||
|  |             raise ValueError("L4CXProfile::monitor wants monitor_interval >= 1 second") | ||||||
|  |         if output_format is not None: | ||||||
|  |             if output_format.lower() != report_file.split('.')[-1]: | ||||||
|  |                 raise ValueError('Filename %s does not match output format %s' % (report_file, output_format)) | ||||||
|  |         else: | ||||||
|  |             output_format = report_file.split('.')[-1] | ||||||
|  |  | ||||||
|  |         # Step 1 - Assign column names  | ||||||
|  |  | ||||||
|  |         if col_names is not None and len(col_names) > 0: | ||||||
|  |             header_row=col_names | ||||||
|  |         else: | ||||||
|  |             header_row=list((list(self.json_get("/layer4/all")['endpoint'][0].values())[0].keys())) | ||||||
|  |         if debug: | ||||||
|  |             print(header_row) | ||||||
|  |  | ||||||
|  |         # Step 2 - Monitor columns | ||||||
|  |  | ||||||
|  |         start_time = datetime.datetime.now() | ||||||
|  |         end_time = start_time + datetime.timedelta(seconds=duration_sec) | ||||||
|  |         sleep_interval =  round(duration_sec // 5) | ||||||
|  |         if debug: | ||||||
|  |             print("Sleep_interval is %s ", sleep_interval) | ||||||
|  |             print("Start time is %s " , start_time) | ||||||
|  |             print("End time is %s " ,end_time) | ||||||
|  |         value_map = dict() | ||||||
|  |         passes = 0 | ||||||
|  |         expected_passes = 0 | ||||||
|  |         timestamps = [] | ||||||
|  |         for test in range(1+iterations): | ||||||
|  |             while datetime.datetime.now() < end_time: | ||||||
|  |                 if col_names is None: | ||||||
|  |                     response = self.json_get("/layer4/all") | ||||||
|  |                 else: | ||||||
|  |                     fields = ",".join(col_names) | ||||||
|  |                     response = self.json_get("/layer4/%s?fields=%s" % (created_cx, fields)) | ||||||
|  |                 if debug: | ||||||
|  |                     print(response) | ||||||
|  |                 if response is None: | ||||||
|  |                     print(response) | ||||||
|  |                     raise ValueError("Cannot find any endpoints") | ||||||
|  |                 if monitor: | ||||||
|  |                     if debug: | ||||||
|  |                         print(response) | ||||||
|  |  | ||||||
|  |                 time.sleep(sleep_interval) | ||||||
|  |                 t = datetime.datetime.now() | ||||||
|  |                 timestamps.append(t) | ||||||
|  |                 value_map[t] = response | ||||||
|  |                 expected_passes += 1 | ||||||
|  |                 if self.check_errors(debug): | ||||||
|  |                     if self.check_request_rate(): | ||||||
|  |                         passes += 1 | ||||||
|  |                     else: | ||||||
|  |                         self._fail("FAIL: Request rate did not exceed 90% target rate") | ||||||
|  |                         self.exit_fail() | ||||||
|  |                 else: | ||||||
|  |                     self._fail("FAIL: Errors found getting to %s " % self.url) | ||||||
|  |                     self.exit_fail() | ||||||
|  |                 time.sleep(monitor_interval) | ||||||
|  |         print(value_map) | ||||||
|  |  | ||||||
|  |     #[further] post-processing data, after test completion | ||||||
|  |         full_test_data_list = [] | ||||||
|  |         for test_timestamp, data in value_map.items(): | ||||||
|  |             #reduce the endpoint data to single dictionary of dictionaries | ||||||
|  |             for datum in data["endpoint"]: | ||||||
|  |                 for endpoint_data in datum.values(): | ||||||
|  |                     if debug: | ||||||
|  |                         print(endpoint_data) | ||||||
|  |                     endpoint_data["Timestamp"] = test_timestamp | ||||||
|  |                     full_test_data_list.append(endpoint_data) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         header_row.append("Timestamp") | ||||||
|  |         header_row.append('Timestamp milliseconds') | ||||||
|  |         df = pd.DataFrame(full_test_data_list) | ||||||
|  |  | ||||||
|  |         df["Timestamp milliseconds"] = [self.get_milliseconds(x) for x in df["Timestamp"]] | ||||||
|  |         #round entire column | ||||||
|  |         df["Timestamp milliseconds"]=df["Timestamp milliseconds"].astype(int) | ||||||
|  |         df["Timestamp"]=df["Timestamp"].apply(lambda x:x.strftime("%m/%d/%Y %I:%M:%S")) | ||||||
|  |         df=df[["Timestamp","Timestamp milliseconds", *header_row[:-2]]] | ||||||
|  |         #compare previous data to current data | ||||||
|  |  | ||||||
|  |         systeminfo = ast.literal_eval(requests.get('http://'+str(self.lfclient_host)+':'+str(self.lfclient_port)).text) | ||||||
|  |  | ||||||
|  |         if output_format == 'hdf': | ||||||
|  |             df.to_hdf(report_file, 'table', append=True) | ||||||
|  |         if output_format == 'parquet': | ||||||
|  |             df.to_parquet(report_file, engine='pyarrow') | ||||||
|  |         if output_format == 'png': | ||||||
|  |             fig = df.plot().get_figure() | ||||||
|  |             fig.savefig(report_file) | ||||||
|  |         if output_format.lower() in ['excel', 'xlsx'] or report_file.split('.')[-1] == 'xlsx': | ||||||
|  |             df.to_excel(report_file, index=False) | ||||||
|  |         if output_format == 'df': | ||||||
|  |             return df | ||||||
|  |         supported_formats = ['csv', 'json', 'stata', 'pickle','html'] | ||||||
|  |         for x in supported_formats: | ||||||
|  |             if output_format.lower() == x or report_file.split('.')[-1] == x: | ||||||
|  |                 exec('df.to_' + x + '("'+report_file+'")') | ||||||
							
								
								
									
										194
									
								
								py-json/mac_vlan_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								py-json/mac_vlan_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,194 @@ | |||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from LANforge import LFRequest | ||||||
|  | from LANforge import LFUtils | ||||||
|  | from LANforge import set_port | ||||||
|  |  | ||||||
|  | from pprint import pprint | ||||||
|  | import pprint | ||||||
|  | import time | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MACVLANProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, | ||||||
|  |                  local_realm, | ||||||
|  |                  macvlan_parent="eth1", | ||||||
|  |                  num_macvlans=1, | ||||||
|  |                  admin_down=False, | ||||||
|  |                  dhcp=False, | ||||||
|  |                  debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.num_macvlans = num_macvlans | ||||||
|  |         self.macvlan_parent = macvlan_parent | ||||||
|  |         self.resource = 1 | ||||||
|  |         self.shelf = 1 | ||||||
|  |         self.desired_macvlans = [] | ||||||
|  |         self.created_macvlans = [] | ||||||
|  |         self.dhcp = dhcp | ||||||
|  |         self.netmask = None | ||||||
|  |         self.first_ip_addr = None | ||||||
|  |         self.gateway = None | ||||||
|  |         self.ip_list = [] | ||||||
|  |         self.COMMANDS = ["set_port"] | ||||||
|  |         self.desired_set_port_cmd_flags = [] | ||||||
|  |         self.desired_set_port_current_flags = []  # do not default down, "if_down" | ||||||
|  |         self.desired_set_port_interest_flags = ["current_flags"]  # do not default down, "ifdown" | ||||||
|  |         self.set_port_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": None, | ||||||
|  |             "current_flags": 0, | ||||||
|  |             "interest": 0,  # (0x2 + 0x4000 + 0x800000)  # current, dhcp, down, | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     def add_named_flags(self, desired_list, command_ref): | ||||||
|  |         if desired_list is None: | ||||||
|  |             raise ValueError("addNamedFlags wants a list of desired flag names") | ||||||
|  |         if len(desired_list) < 1: | ||||||
|  |             print("addNamedFlags: empty desired list") | ||||||
|  |             return 0 | ||||||
|  |         if (command_ref is None) or (len(command_ref) < 1): | ||||||
|  |             raise ValueError("addNamedFlags wants a maps of flag values") | ||||||
|  |  | ||||||
|  |         result = 0 | ||||||
|  |         for name in desired_list: | ||||||
|  |             if (name is None) or (name == ""): | ||||||
|  |                 continue | ||||||
|  |             if name not in command_ref: | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(command_ref) | ||||||
|  |                 raise ValueError("flag %s not in map" % name) | ||||||
|  |             result += command_ref[name] | ||||||
|  |  | ||||||
|  |         return result | ||||||
|  |  | ||||||
|  |     def set_command_param(self, command_name, param_name, param_value): | ||||||
|  |         # we have to check what the param name is | ||||||
|  |         if (command_name is None) or (command_name == ""): | ||||||
|  |             return | ||||||
|  |         if (param_name is None) or (param_name == ""): | ||||||
|  |             return | ||||||
|  |         if command_name not in self.COMMANDS: | ||||||
|  |             raise ValueError("Command name name [%s] not defined in %s" % (command_name, self.COMMANDS)) | ||||||
|  |             # return | ||||||
|  |         if command_name == "set_port": | ||||||
|  |             self.set_port_data[param_name] = param_value | ||||||
|  |  | ||||||
|  |     def set_command_flag(self, command_name, param_name, value): | ||||||
|  |         # we have to check what the param name is | ||||||
|  |         if (command_name is None) or (command_name == ""): | ||||||
|  |             return | ||||||
|  |         if (param_name is None) or (param_name == ""): | ||||||
|  |             return | ||||||
|  |         if command_name not in self.COMMANDS: | ||||||
|  |             print("Command name name [%s] not defined in %s" % (command_name, self.COMMANDS)) | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         elif command_name == "set_port": | ||||||
|  |             if (param_name not in set_port.set_port_current_flags) and ( | ||||||
|  |                     param_name not in set_port.set_port_cmd_flags) and ( | ||||||
|  |                     param_name not in set_port.set_port_interest_flags): | ||||||
|  |                 print("Parameter name [%s] not defined in set_port.py" % param_name) | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(set_port.set_port_cmd_flags) | ||||||
|  |                     pprint(set_port.set_port_current_flags) | ||||||
|  |                     pprint(set_port.set_port_interest_flags) | ||||||
|  |                 return | ||||||
|  |             if (param_name in set_port.set_port_cmd_flags): | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_cmd_flags): | ||||||
|  |                     self.desired_set_port_cmd_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_cmd_flags.remove(param_name) | ||||||
|  |             elif (param_name in set_port.set_port_current_flags): | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_current_flags): | ||||||
|  |                     self.desired_set_port_current_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_current_flags.remove(param_name) | ||||||
|  |             elif (param_name in set_port.set_port_interest_flags): | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_interest_flags): | ||||||
|  |                     self.desired_set_port_interest_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_interest_flags.remove(param_name) | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Unknown param name: " + param_name) | ||||||
|  |  | ||||||
|  |     def create(self, admin_down=False, debug=False, sleep_time=1): | ||||||
|  |         print("Creating MACVLANs...") | ||||||
|  |         req_url = "/cli-json/add_mvlan" | ||||||
|  |  | ||||||
|  |         if not self.dhcp and self.first_ip_addr is not None and self.netmask is not None and self.gateway is not None: | ||||||
|  |             self.desired_set_port_interest_flags.append("ip_address") | ||||||
|  |             self.desired_set_port_interest_flags.append("ip_Mask") | ||||||
|  |             self.desired_set_port_interest_flags.append("ip_gateway") | ||||||
|  |             self.ip_list = LFUtils.gen_ip_series(ip_addr=self.first_ip_addr, netmask=self.netmask, | ||||||
|  |                                                  num_ips=self.num_macvlans) | ||||||
|  |  | ||||||
|  |         self.set_port_data["current_flags"] = self.add_named_flags(self.desired_set_port_current_flags, | ||||||
|  |                                                                    set_port.set_port_current_flags) | ||||||
|  |         self.set_port_data["interest"] = self.add_named_flags(self.desired_set_port_interest_flags, | ||||||
|  |                                                               set_port.set_port_interest_flags) | ||||||
|  |         set_port_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_port") | ||||||
|  |  | ||||||
|  |         if self.dhcp: | ||||||
|  |             print("Using DHCP") | ||||||
|  |             self.desired_set_port_current_flags.append("use_dhcp") | ||||||
|  |             self.desired_set_port_interest_flags.append("dhcp") | ||||||
|  |  | ||||||
|  |         for i in range(len(self.desired_macvlans)): | ||||||
|  |             data = { | ||||||
|  |                 "shelf": self.shelf, | ||||||
|  |                 "resource": self.resource, | ||||||
|  |                 "mac": "xx:xx:xx:*:*:xx", | ||||||
|  |                 "port": self.local_realm.name_to_eid(self.macvlan_parent)[2], | ||||||
|  |                 "index": int(self.desired_macvlans[i][self.desired_macvlans[i].index('#') + 1:]), | ||||||
|  |                 "flags": None | ||||||
|  |             } | ||||||
|  |             if admin_down: | ||||||
|  |                 data["flags"] = 1 | ||||||
|  |             else: | ||||||
|  |                 data["flags"] = 0 | ||||||
|  |             self.created_macvlans.append("%s.%s.%s#%d" % (self.shelf, self.resource, | ||||||
|  |                                                           self.macvlan_parent, int( | ||||||
|  |                 self.desired_macvlans[i][self.desired_macvlans[i].index('#') + 1:]))) | ||||||
|  |             self.local_realm.json_post(req_url, data) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |         LFUtils.wait_until_ports_appear(base_url=self.lfclient_url, port_list=self.created_macvlans) | ||||||
|  |         print(self.created_macvlans) | ||||||
|  |  | ||||||
|  |         time.sleep(5) | ||||||
|  |  | ||||||
|  |         for i in range(len(self.created_macvlans)): | ||||||
|  |             eid = self.local_realm.name_to_eid(self.created_macvlans[i]) | ||||||
|  |             name = eid[2] | ||||||
|  |             self.set_port_data["port"] = name  # for set_port calls. | ||||||
|  |             if not self.dhcp and self.first_ip_addr is not None and self.netmask is not None \ | ||||||
|  |                     and self.gateway is not None: | ||||||
|  |                 self.set_port_data["ip_addr"] = self.ip_list[i] | ||||||
|  |                 self.set_port_data["netmask"] = self.netmask | ||||||
|  |                 self.set_port_data["gateway"] = self.gateway | ||||||
|  |             set_port_r.addPostData(self.set_port_data) | ||||||
|  |             json_response = set_port_r.jsonPost(debug) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |     def cleanup(self): | ||||||
|  |         print("Cleaning up MACVLANs...") | ||||||
|  |         print(self.created_macvlans) | ||||||
|  |         for port_eid in self.created_macvlans: | ||||||
|  |             self.local_realm.rm_port(port_eid, check_exists=True) | ||||||
|  |             time.sleep(.02) | ||||||
|  |         # And now see if they are gone | ||||||
|  |         LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=self.created_macvlans) | ||||||
|  |  | ||||||
|  |     def admin_up(self): | ||||||
|  |         for macvlan in self.created_macvlans: | ||||||
|  |             self.local_realm.admin_up(macvlan) | ||||||
|  |  | ||||||
|  |     def admin_down(self): | ||||||
|  |         for macvlan in self.created_macvlans: | ||||||
|  |             self.local_realm.admin_down(macvlan) | ||||||
							
								
								
									
										193
									
								
								py-json/multicast_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								py-json/multicast_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import re | ||||||
|  | import time | ||||||
|  | import pprint | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | import csv | ||||||
|  | import pandas as pd | ||||||
|  | import os | ||||||
|  | from pprint import pprint | ||||||
|  | import time | ||||||
|  | import random | ||||||
|  | import string | ||||||
|  | import datetime | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MULTICASTProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, | ||||||
|  |                  report_timer_=3000, name_prefix_="Unset", number_template_="00000", debug_=False): | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         :param lfclient_host: | ||||||
|  |         :param lfclient_port: | ||||||
|  |         :param local_realm: | ||||||
|  |         :param name_prefix_: prefix string for connection | ||||||
|  |         :param number_template_: how many zeros wide we padd, possibly a starting integer with left padding | ||||||
|  |         :param debug_: | ||||||
|  |         """ | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.lfclient_url = "http://%s:%s" % (lfclient_host, lfclient_port) | ||||||
|  |         self.debug = debug_ | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.report_timer = report_timer_ | ||||||
|  |         self.created_mc = {} | ||||||
|  |         self.name_prefix = name_prefix_ | ||||||
|  |         self.number_template = number_template_ | ||||||
|  |  | ||||||
|  |     def get_mc_names(self): | ||||||
|  |         return self.created_mc.keys() | ||||||
|  |  | ||||||
|  |     def refresh_mc(self, debug_=False): | ||||||
|  |         for endp_name in self.get_mc_names(): | ||||||
|  |             self.json_post("/cli-json/show_endpoints", { | ||||||
|  |                 "endpoint": endp_name | ||||||
|  |             }, debug_=debug_) | ||||||
|  |  | ||||||
|  |     def start_mc(self, suppress_related_commands=None, debug_=False): | ||||||
|  |         if self.debug: | ||||||
|  |             debug_ = True | ||||||
|  |  | ||||||
|  |         for endp_name in self.get_mc_names(): | ||||||
|  |             print("Starting mcast endpoint: %s" % (endp_name)) | ||||||
|  |             json_data = { | ||||||
|  |                 "endp_name": endp_name | ||||||
|  |             } | ||||||
|  |             url = "cli-json/start_endp" | ||||||
|  |             self.local_realm.json_post(url, json_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def stop_mc(self, suppress_related_commands=None, debug_=False): | ||||||
|  |         if self.debug: | ||||||
|  |             debug_ = True | ||||||
|  |         for endp_name in self.get_mc_names(): | ||||||
|  |             json_data = { | ||||||
|  |                 "endp_name": endp_name | ||||||
|  |             } | ||||||
|  |             url = "cli-json/stop_endp" | ||||||
|  |             self.local_realm.json_post(url, json_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def cleanup_prefix(self): | ||||||
|  |         self.local_realm.cleanup_cxe_prefix(self.name_prefix) | ||||||
|  |  | ||||||
|  |     def cleanup(self, suppress_related_commands=None, debug_ = False): | ||||||
|  |         if self.debug: | ||||||
|  |             debug_ = True | ||||||
|  |  | ||||||
|  |         for endp_name in self.get_mc_names(): | ||||||
|  |             self.local_realm.rm_endp(endp_name, debug_=debug_, suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |     def create_mc_tx(self, endp_type, side_tx, suppress_related_commands=None, debug_=False): | ||||||
|  |         if self.debug: | ||||||
|  |             debug_ = True | ||||||
|  |  | ||||||
|  |         side_tx_info = self.local_realm.name_to_eid(side_tx) | ||||||
|  |         side_tx_shelf = side_tx_info[0] | ||||||
|  |         side_tx_resource = side_tx_info[1] | ||||||
|  |         side_tx_port = side_tx_info[2] | ||||||
|  |         side_tx_name = "%smtx-%s-%i" % (self.name_prefix, side_tx_port, len(self.created_mc)) | ||||||
|  |  | ||||||
|  |         json_data = [] | ||||||
|  |  | ||||||
|  |         # add_endp mcast-xmit-sta 1 1 side_tx mc_udp -1 NO 4000000 0 NO 1472 0 INCREASING NO 32 0 0 | ||||||
|  |         json_data = { | ||||||
|  |             'alias': side_tx_name, | ||||||
|  |             'shelf': side_tx_shelf, | ||||||
|  |             'resource': side_tx_resource, | ||||||
|  |             'port': side_tx_port, | ||||||
|  |             'type': endp_type, | ||||||
|  |             'ip_port': -1, | ||||||
|  |             'is_rate_bursty': | ||||||
|  |                 'NO', 'min_rate': 256000, | ||||||
|  |             'max_rate': 0, | ||||||
|  |             'is_pkt_sz_random': 'NO', | ||||||
|  |             'min_pkt': 1472, | ||||||
|  |             'max_pkt': 0, | ||||||
|  |             'payload_pattern': 'INCREASING', | ||||||
|  |             'use_checksum': 'NO', | ||||||
|  |             'ttl': 32, | ||||||
|  |             'send_bad_crc_per_million': 0, | ||||||
|  |             'multi_conn': 0 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         url = "/cli-json/add_endp" | ||||||
|  |         self.local_realm.json_post(url, json_data, debug_=debug_, suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |         # set_mc_endp mcast-xmit-sta 32 224.9.9.9 9999 No  # critical | ||||||
|  |         json_data = { | ||||||
|  |             'name': side_tx_name, | ||||||
|  |             'ttl': 32, | ||||||
|  |             'mcast_group': '224.9.9.9', | ||||||
|  |             'mcast_dest_port': 9999, | ||||||
|  |             'rcv_mcast': 'No' | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         url = "cli-json/set_mc_endp" | ||||||
|  |         self.local_realm.json_post(url, json_data, debug_=debug_, suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |         self.created_mc[side_tx_name] = side_tx_name | ||||||
|  |  | ||||||
|  |         these_endp = [side_tx_name] | ||||||
|  |         self.local_realm.wait_until_endps_appear(these_endp, debug=debug_) | ||||||
|  |  | ||||||
|  |     def create_mc_rx(self, endp_type, side_rx, suppress_related_commands=None, debug_=False): | ||||||
|  |         if self.debug: | ||||||
|  |             debug_ = True | ||||||
|  |  | ||||||
|  |         these_endp = [] | ||||||
|  |  | ||||||
|  |         for port_name in side_rx: | ||||||
|  |             side_rx_info = self.local_realm.name_to_eid(port_name) | ||||||
|  |             side_rx_shelf = side_rx_info[0] | ||||||
|  |             side_rx_resource = side_rx_info[1] | ||||||
|  |             side_rx_port = side_rx_info[2] | ||||||
|  |             side_rx_name = "%smrx-%s-%i" % (self.name_prefix, side_rx_port, len(self.created_mc)) | ||||||
|  |             # add_endp mcast-rcv-sta-001 1 1 sta0002 mc_udp 9999 NO 0 0 NO 1472 0 INCREASING NO 32 0 0 | ||||||
|  |             json_data = { | ||||||
|  |                 'alias': side_rx_name, | ||||||
|  |                 'shelf': side_rx_shelf, | ||||||
|  |                 'resource': side_rx_resource, | ||||||
|  |                 'port': side_rx_port, | ||||||
|  |                 'type': endp_type, | ||||||
|  |                 'ip_port': 9999, | ||||||
|  |                 'is_rate_bursty': 'NO', | ||||||
|  |                 'min_rate': 0, | ||||||
|  |                 'max_rate': 0, | ||||||
|  |                 'is_pkt_sz_random': 'NO', | ||||||
|  |                 'min_pkt': 1472, | ||||||
|  |                 'max_pkt': 0, | ||||||
|  |                 'payload_pattern': 'INCREASING', | ||||||
|  |                 'use_checksum': 'NO', | ||||||
|  |                 'ttl': 32, | ||||||
|  |                 'send_bad_crc_per_million': 0, | ||||||
|  |                 'multi_conn': 0 | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             url = "cli-json/add_endp" | ||||||
|  |             self.local_realm.json_post(url, json_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |             json_data = { | ||||||
|  |                 'name': side_rx_name, | ||||||
|  |                 'ttl': 32, | ||||||
|  |                 'mcast_group': '224.9.9.9', | ||||||
|  |                 'mcast_dest_port': 9999, | ||||||
|  |                 'rcv_mcast': 'Yes' | ||||||
|  |             } | ||||||
|  |             url = "cli-json/set_mc_endp" | ||||||
|  |             self.local_realm.json_post(url, json_data, debug_=debug_, | ||||||
|  |                                        suppress_related_commands_=suppress_related_commands) | ||||||
|  |  | ||||||
|  |             self.created_mc[side_rx_name] = side_rx_name | ||||||
|  |             these_endp.append(side_rx_name) | ||||||
|  |  | ||||||
|  |         self.local_realm.wait_until_endps_appear(these_endp, debug=debug_) | ||||||
|  |  | ||||||
|  |     def to_string(self): | ||||||
|  |         pprint.pprint(self) | ||||||
							
								
								
									
										483
									
								
								py-json/station_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										483
									
								
								py-json/station_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,483 @@ | |||||||
|  |  | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from LANforge import LFRequest | ||||||
|  | from LANforge import LFUtils | ||||||
|  | from LANforge import set_port | ||||||
|  | from LANforge import add_sta | ||||||
|  |  | ||||||
|  | from pprint import pprint | ||||||
|  | import time | ||||||
|  | import pprint | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # use the station profile to set the combination of features you want on your stations | ||||||
|  | # once this combination is configured, build the stations with the build(resource, radio, number) call | ||||||
|  | # build() calls will fail if the station already exists. Please survey and clean your resource | ||||||
|  | # before calling build() | ||||||
|  | #       survey = Realm.findStations(resource=1) | ||||||
|  | #       Realm.removeStations(survey) | ||||||
|  | #       profile = Realm.newStationProfile() | ||||||
|  | #       profile.set... | ||||||
|  | #       profile.build(resource, radio, 64) | ||||||
|  | # | ||||||
|  | class StationProfile: | ||||||
|  |     def __init__(self, lfclient_url, local_realm, | ||||||
|  |                  ssid="NA", | ||||||
|  |                  ssid_pass="NA", | ||||||
|  |                  security="open", | ||||||
|  |                  number_template_="00000", | ||||||
|  |                  mode=0, | ||||||
|  |                  up=True, | ||||||
|  |                  resource=1, | ||||||
|  |                  shelf=1, | ||||||
|  |                  dhcp=True, | ||||||
|  |                  debug_=False, | ||||||
|  |                  use_ht160=False): | ||||||
|  |         self.debug = debug_ | ||||||
|  |         self.lfclient_url = lfclient_url | ||||||
|  |         self.ssid = ssid | ||||||
|  |         self.ssid_pass = ssid_pass | ||||||
|  |         self.mode = mode | ||||||
|  |         self.up = up | ||||||
|  |         self.resource = resource | ||||||
|  |         self.shelf = shelf | ||||||
|  |         self.dhcp = dhcp | ||||||
|  |         self.security = security | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.use_ht160 = use_ht160 | ||||||
|  |         self.COMMANDS = ["add_sta", "set_port"] | ||||||
|  |         self.desired_add_sta_flags = ["wpa2_enable", "80211u_enable", "create_admin_down"] | ||||||
|  |         self.desired_add_sta_flags_mask = ["wpa2_enable", "80211u_enable", "create_admin_down"] | ||||||
|  |         self.number_template = number_template_ | ||||||
|  |         self.station_names = []  # eids, these are created station names | ||||||
|  |         self.add_sta_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "radio": None, | ||||||
|  |             "sta_name": None, | ||||||
|  |             "ssid": None, | ||||||
|  |             "key": None, | ||||||
|  |             "mode": 0, | ||||||
|  |             "mac": "xx:xx:xx:xx:*:xx", | ||||||
|  |             "flags": 0,  # (0x400 + 0x20000 + 0x1000000000)  # create admin down | ||||||
|  |         } | ||||||
|  |         self.desired_set_port_cmd_flags = [] | ||||||
|  |         self.desired_set_port_current_flags = ["if_down"] | ||||||
|  |         self.desired_set_port_interest_flags = ["current_flags", "ifdown"] | ||||||
|  |         if self.dhcp: | ||||||
|  |             self.desired_set_port_current_flags.append("use_dhcp") | ||||||
|  |             self.desired_set_port_interest_flags.append("dhcp") | ||||||
|  |  | ||||||
|  |         self.set_port_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": None, | ||||||
|  |             "current_flags": 0, | ||||||
|  |             "interest": 0,  # (0x2 + 0x4000 + 0x800000)  # current, dhcp, down, | ||||||
|  |         } | ||||||
|  |         self.wifi_extra_data_modified = False | ||||||
|  |         self.wifi_extra_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": None, | ||||||
|  |             "key_mgmt": None, | ||||||
|  |             "eap": None, | ||||||
|  |             "hessid": None, | ||||||
|  |             "identity": None, | ||||||
|  |             "password": None, | ||||||
|  |             "realm": None, | ||||||
|  |             "domain": None | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         self.reset_port_extra_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": None, | ||||||
|  |             "test_duration": 0, | ||||||
|  |             "reset_port_enable": False, | ||||||
|  |             "reset_port_time_min": 0, | ||||||
|  |             "reset_port_time_max": 0, | ||||||
|  |             "reset_port_timer_started": False, | ||||||
|  |             "port_to_reset": 0, | ||||||
|  |             "seconds_till_reset": 0 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     def set_wifi_extra(self, key_mgmt="WPA-EAP", | ||||||
|  |                        pairwise="CCMP TKIP", | ||||||
|  |                        group="CCMP TKIP", | ||||||
|  |                        psk="[BLANK]", | ||||||
|  |                        wep_key="[BLANK]",  # wep key | ||||||
|  |                        ca_cert="[BLANK]", | ||||||
|  |                        eap="TTLS", | ||||||
|  |                        identity="testuser", | ||||||
|  |                        anonymous_identity="[BLANK]", | ||||||
|  |                        phase1="NA",  # outter auth | ||||||
|  |                        phase2="NA",  # inner auth | ||||||
|  |                        passwd="testpasswd",  # eap passphrase | ||||||
|  |                        pin="NA", | ||||||
|  |                        pac_file="NA", | ||||||
|  |                        private_key="NA", | ||||||
|  |                        pk_password="NA",  # priv key password | ||||||
|  |                        hessid="00:00:00:00:00:01", | ||||||
|  |                        realm="localhost.localdomain", | ||||||
|  |                        client_cert="NA", | ||||||
|  |                        imsi="NA", | ||||||
|  |                        milenage="NA", | ||||||
|  |                        domain="localhost.localdomain", | ||||||
|  |                        roaming_consortium="NA", | ||||||
|  |                        venue_group="NA", | ||||||
|  |                        network_type="NA", | ||||||
|  |                        ipaddr_type_avail="NA", | ||||||
|  |                        network_auth_type="NA", | ||||||
|  |                        anqp_3gpp_cell_net="NA" | ||||||
|  |                        ): | ||||||
|  |         self.wifi_extra_data_modified = True | ||||||
|  |         self.wifi_extra_data["key_mgmt"] = key_mgmt | ||||||
|  |         self.wifi_extra_data["pairwise"] = pairwise | ||||||
|  |         self.wifi_extra_data["group"] = group | ||||||
|  |         self.wifi_extra_data["psk"] = psk | ||||||
|  |         self.wifi_extra_data["key"] = wep_key | ||||||
|  |         self.wifi_extra_data["ca_cert"] = ca_cert | ||||||
|  |         self.wifi_extra_data["eap"] = eap | ||||||
|  |         self.wifi_extra_data["identity"] = identity | ||||||
|  |         self.wifi_extra_data["anonymous_identity"] = anonymous_identity | ||||||
|  |         self.wifi_extra_data["phase1"] = phase1 | ||||||
|  |         self.wifi_extra_data["phase2"] = phase2 | ||||||
|  |         self.wifi_extra_data["password"] = passwd | ||||||
|  |         self.wifi_extra_data["pin"] = pin | ||||||
|  |         self.wifi_extra_data["pac_file"] = pac_file | ||||||
|  |         self.wifi_extra_data["private_key"] = private_key | ||||||
|  |         self.wifi_extra_data["pk_passwd"] = pk_password | ||||||
|  |         self.wifi_extra_data["hessid"] = hessid | ||||||
|  |         self.wifi_extra_data["realm"] = realm | ||||||
|  |         self.wifi_extra_data["client_cert"] = client_cert | ||||||
|  |         self.wifi_extra_data["imsi"] = imsi | ||||||
|  |         self.wifi_extra_data["milenage"] = milenage | ||||||
|  |         self.wifi_extra_data["domain"] = domain | ||||||
|  |         self.wifi_extra_data["roaming_consortium"] = roaming_consortium | ||||||
|  |         self.wifi_extra_data["venue_group"] = venue_group | ||||||
|  |         self.wifi_extra_data["network_type"] = network_type | ||||||
|  |         self.wifi_extra_data["ipaddr_type_avail"] = ipaddr_type_avail | ||||||
|  |         self.wifi_extra_data["network_auth_type"] = network_auth_type | ||||||
|  |         self.wifi_extra_data["anqp_3gpp_cell_net"] = anqp_3gpp_cell_net | ||||||
|  |  | ||||||
|  |     def set_reset_extra(self, reset_port_enable=False, test_duration=0, reset_port_min_time=0, reset_port_max_time=0, | ||||||
|  |                         reset_port_timer_start=False, port_to_reset=0, time_till_reset=0): | ||||||
|  |         self.reset_port_extra_data["reset_port_enable"] = reset_port_enable | ||||||
|  |         self.reset_port_extra_data["test_duration"] = test_duration | ||||||
|  |         self.reset_port_extra_data["reset_port_time_min"] = reset_port_min_time | ||||||
|  |         self.reset_port_extra_data["reset_port_time_max"] = reset_port_max_time | ||||||
|  |  | ||||||
|  |     def use_security(self, security_type, ssid=None, passwd=None): | ||||||
|  |         types = {"wep": "wep_enable", "wpa": "wpa_enable", "wpa2": "wpa2_enable", "wpa3": "use-wpa3", "open": "[BLANK]"} | ||||||
|  |         self.add_sta_data["ssid"] = ssid | ||||||
|  |         if security_type in types.keys(): | ||||||
|  |             if (ssid is None) or (ssid == ""): | ||||||
|  |                 raise ValueError("use_security: %s requires ssid" % security_type) | ||||||
|  |             if (passwd is None) or (passwd == ""): | ||||||
|  |                 raise ValueError("use_security: %s requires passphrase or [BLANK]" % security_type) | ||||||
|  |             for name in types.values(): | ||||||
|  |                 if name in self.desired_add_sta_flags and name in self.desired_add_sta_flags_mask: | ||||||
|  |                     self.desired_add_sta_flags.remove(name) | ||||||
|  |                     self.desired_add_sta_flags_mask.remove(name) | ||||||
|  |             if security_type != "open": | ||||||
|  |                 self.desired_add_sta_flags.append(types[security_type]) | ||||||
|  |                 # self.set_command_flag("add_sta", types[security_type], 1) | ||||||
|  |                 self.desired_add_sta_flags_mask.append(types[security_type]) | ||||||
|  |             else: | ||||||
|  |                 passwd = "[BLANK]" | ||||||
|  |             self.set_command_param("add_sta", "ssid", ssid) | ||||||
|  |             self.set_command_param("add_sta", "key", passwd) | ||||||
|  |             # unset any other security flag before setting our present flags | ||||||
|  |             if security_type == "wpa3": | ||||||
|  |                 self.set_command_param("add_sta", "ieee80211w", 2) | ||||||
|  |  | ||||||
|  |             # self.add_sta_data["key"] = passwd | ||||||
|  |  | ||||||
|  |     def set_command_param(self, command_name, param_name, param_value): | ||||||
|  |         # we have to check what the param name is | ||||||
|  |         if (command_name is None) or (command_name == ""): | ||||||
|  |             return | ||||||
|  |         if (param_name is None) or (param_name == ""): | ||||||
|  |             return | ||||||
|  |         if command_name not in self.COMMANDS: | ||||||
|  |             raise ValueError("Command name name [%s] not defined in %s" % (command_name, self.COMMANDS)) | ||||||
|  |             # return | ||||||
|  |         if command_name == "add_sta": | ||||||
|  |             self.add_sta_data[param_name] = param_value | ||||||
|  |         elif command_name == "set_port": | ||||||
|  |             self.set_port_data[param_name] = param_value | ||||||
|  |  | ||||||
|  |     def set_command_flag(self, command_name, param_name, value): | ||||||
|  |         # we have to check what the param name is | ||||||
|  |         if (command_name is None) or (command_name == ""): | ||||||
|  |             return | ||||||
|  |         if (param_name is None) or (param_name == ""): | ||||||
|  |             return | ||||||
|  |         if command_name not in self.COMMANDS: | ||||||
|  |             print("Command name name [%s] not defined in %s" % (command_name, self.COMMANDS)) | ||||||
|  |             return | ||||||
|  |         if command_name == "add_sta": | ||||||
|  |             if (param_name not in add_sta.add_sta_flags) and (param_name not in add_sta.add_sta_modes): | ||||||
|  |                 print("Parameter name [%s] not defined in add_sta.py" % param_name) | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(add_sta.add_sta_flags) | ||||||
|  |                 return | ||||||
|  |             if (value == 1) and (param_name not in self.desired_add_sta_flags): | ||||||
|  |                 self.desired_add_sta_flags.append(param_name) | ||||||
|  |                 self.desired_add_sta_flags_mask.append(param_name) | ||||||
|  |             elif value == 0: | ||||||
|  |                 self.desired_add_sta_flags.remove(param_name) | ||||||
|  |                 self.desired_add_sta_flags_mask.append(param_name) | ||||||
|  |  | ||||||
|  |         elif command_name == "set_port": | ||||||
|  |             if (param_name not in set_port.set_port_current_flags) and ( | ||||||
|  |                     param_name not in set_port.set_port_cmd_flags) and ( | ||||||
|  |                     param_name not in set_port.set_port_interest_flags): | ||||||
|  |                 print("Parameter name [%s] not defined in set_port.py" % param_name) | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(set_port.set_port_cmd_flags) | ||||||
|  |                     pprint(set_port.set_port_current_flags) | ||||||
|  |                     pprint(set_port.set_port_interest_flags) | ||||||
|  |                 return | ||||||
|  |             if (param_name in set_port.set_port_cmd_flags): | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_cmd_flags): | ||||||
|  |                     self.desired_set_port_cmd_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_cmd_flags.remove(param_name) | ||||||
|  |             elif (param_name in set_port.set_port_current_flags): | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_current_flags): | ||||||
|  |                     self.desired_set_port_current_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_current_flags.remove(param_name) | ||||||
|  |             elif (param_name in set_port.set_port_interest_flags): | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_interest_flags): | ||||||
|  |                     self.desired_set_port_interest_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_interest_flags.remove(param_name) | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Unknown param name: " + param_name) | ||||||
|  |  | ||||||
|  |     # use this for hinting station name; stations begin with 'sta', the | ||||||
|  |     # stations created with a prefix '0100' indicate value 10100 + n with | ||||||
|  |     # resulting substring(1,) applied; station 900 becomes 'sta1000' | ||||||
|  |     def set_number_template(self, pref): | ||||||
|  |         self.number_template = pref | ||||||
|  |  | ||||||
|  |     def add_named_flags(self, desired_list, command_ref): | ||||||
|  |         if desired_list is None: | ||||||
|  |             raise ValueError("addNamedFlags wants a list of desired flag names") | ||||||
|  |         if len(desired_list) < 1: | ||||||
|  |             print("addNamedFlags: empty desired list") | ||||||
|  |             return 0 | ||||||
|  |         if (command_ref is None) or (len(command_ref) < 1): | ||||||
|  |             raise ValueError("addNamedFlags wants a maps of flag values") | ||||||
|  |  | ||||||
|  |         result = 0 | ||||||
|  |         for name in desired_list: | ||||||
|  |             if (name is None) or (name == ""): | ||||||
|  |                 continue | ||||||
|  |             if name not in command_ref: | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(command_ref) | ||||||
|  |                 raise ValueError("flag %s not in map" % name) | ||||||
|  |             result += command_ref[name] | ||||||
|  |  | ||||||
|  |         return result | ||||||
|  |  | ||||||
|  |     def admin_up(self): | ||||||
|  |         for eid in self.station_names: | ||||||
|  |             # print("3139: admin_up sta "+eid) | ||||||
|  |             # time.sleep(2) | ||||||
|  |             self.local_realm.admin_up(eid) | ||||||
|  |             time.sleep(0.005) | ||||||
|  |  | ||||||
|  |     def admin_down(self): | ||||||
|  |         for sta_name in self.station_names: | ||||||
|  |             self.local_realm.admin_down(sta_name) | ||||||
|  |  | ||||||
|  |     def cleanup(self, desired_stations=None, delay=0.03, debug_=False): | ||||||
|  |         print("Cleaning up stations") | ||||||
|  |  | ||||||
|  |         if (desired_stations is None): | ||||||
|  |             desired_stations = self.station_names | ||||||
|  |  | ||||||
|  |         if len(desired_stations) < 1: | ||||||
|  |             print("ERROR:  StationProfile cleanup, list is empty") | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         # First, request remove on the list. | ||||||
|  |         for port_eid in desired_stations: | ||||||
|  |             self.local_realm.rm_port(port_eid, check_exists=True, debug_=debug_) | ||||||
|  |             time.sleep(delay) | ||||||
|  |         # And now see if they are gone | ||||||
|  |         LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=desired_stations) | ||||||
|  |  | ||||||
|  |     # Checks for errors in initialization values and creates specified number of stations using init parameters | ||||||
|  |     def create(self, radio, | ||||||
|  |                num_stations=0, | ||||||
|  |                sta_names_=None, | ||||||
|  |                dry_run=False, | ||||||
|  |                up_=None, | ||||||
|  |                debug=False, | ||||||
|  |                suppress_related_commands_=True, | ||||||
|  |                use_radius=False, | ||||||
|  |                hs20_enable=False, | ||||||
|  |                sleep_time=0.02): | ||||||
|  |         if (radio is None) or (radio == ""): | ||||||
|  |             raise ValueError("station_profile.create: will not create stations without radio") | ||||||
|  |         radio_eid = self.local_realm.name_to_eid(radio) | ||||||
|  |         radio_shelf = radio_eid[0] | ||||||
|  |         radio_resource = radio_eid[1] | ||||||
|  |         radio_port = radio_eid[2] | ||||||
|  |  | ||||||
|  |         if self.use_ht160: | ||||||
|  |             self.desired_add_sta_flags.append("ht160_enable") | ||||||
|  |             self.desired_add_sta_flags_mask.append("ht160_enable") | ||||||
|  |         if self.mode is not None: | ||||||
|  |             self.add_sta_data["mode"] = self.mode | ||||||
|  |         if use_radius: | ||||||
|  |             self.desired_add_sta_flags.append("8021x_radius") | ||||||
|  |             self.desired_add_sta_flags_mask.append("8021x_radius") | ||||||
|  |         if hs20_enable: | ||||||
|  |             self.desired_add_sta_flags.append("hs20_enable") | ||||||
|  |             self.desired_add_sta_flags_mask.append("hs20_enable") | ||||||
|  |         if up_ is not None: | ||||||
|  |             self.up = up_ | ||||||
|  |  | ||||||
|  |         if (sta_names_ is None) and (num_stations == 0): | ||||||
|  |             raise ValueError("StationProfile.create needs either num_stations= or sta_names_= specified") | ||||||
|  |  | ||||||
|  |         if self.up: | ||||||
|  |             if "create_admin_down" in self.desired_add_sta_flags: | ||||||
|  |                 del self.desired_add_sta_flags[self.desired_add_sta_flags.index("create_admin_down")] | ||||||
|  |         elif "create_admin_down" not in self.desired_add_sta_flags: | ||||||
|  |             self.desired_add_sta_flags.append("create_admin_down") | ||||||
|  |  | ||||||
|  |         # create stations down, do set_port on them, then set stations up | ||||||
|  |         self.add_sta_data["flags"] = self.add_named_flags(self.desired_add_sta_flags, add_sta.add_sta_flags) | ||||||
|  |         self.add_sta_data["flags_mask"] = self.add_named_flags(self.desired_add_sta_flags_mask, add_sta.add_sta_flags) | ||||||
|  |         self.add_sta_data["radio"] = radio_port | ||||||
|  |  | ||||||
|  |         self.add_sta_data["resource"] = radio_resource | ||||||
|  |         self.add_sta_data["shelf"] = radio_shelf | ||||||
|  |         self.set_port_data["resource"] = radio_resource | ||||||
|  |         self.set_port_data["shelf"] = radio_shelf | ||||||
|  |         self.set_port_data["current_flags"] = self.add_named_flags(self.desired_set_port_current_flags, | ||||||
|  |                                                                    set_port.set_port_current_flags) | ||||||
|  |         self.set_port_data["interest"] = self.add_named_flags(self.desired_set_port_interest_flags, | ||||||
|  |                                                               set_port.set_port_interest_flags) | ||||||
|  |         self.wifi_extra_data["resource"] = radio_resource | ||||||
|  |         self.wifi_extra_data["shelf"] = radio_shelf | ||||||
|  |         self.reset_port_extra_data["resource"] = radio_resource | ||||||
|  |         self.reset_port_extra_data["shelf"] = radio_shelf | ||||||
|  |  | ||||||
|  |         # these are unactivated LFRequest objects that we can modify and | ||||||
|  |         # re-use inside a loop, reducing the number of object creations | ||||||
|  |         add_sta_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/add_sta", debug_=debug) | ||||||
|  |         set_port_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_port", debug_=debug) | ||||||
|  |         wifi_extra_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_wifi_extra", debug_=debug) | ||||||
|  |         my_sta_names = [] | ||||||
|  |         # add radio here | ||||||
|  |         if (num_stations > 0) and (len(sta_names_) < 1): | ||||||
|  |             # print("CREATING MORE STA NAMES == == == == == == == == == == == == == == == == == == == == == == == ==") | ||||||
|  |             my_sta_names = LFUtils.portNameSeries("sta", 0, num_stations - 1, int("1" + self.number_template)) | ||||||
|  |             # print("CREATING MORE STA NAMES == == == == == == == == == == == == == == == == == == == == == == == ==") | ||||||
|  |         else: | ||||||
|  |             my_sta_names = sta_names_ | ||||||
|  |  | ||||||
|  |         if (len(my_sta_names) >= 15) or (suppress_related_commands_ == True): | ||||||
|  |             self.add_sta_data["suppress_preexec_cli"] = "yes" | ||||||
|  |             self.add_sta_data["suppress_preexec_method"] = 1 | ||||||
|  |             self.set_port_data["suppress_preexec_cli"] = "yes" | ||||||
|  |             self.set_port_data["suppress_preexec_method"] = 1 | ||||||
|  |  | ||||||
|  |         num = 0 | ||||||
|  |         if debug: | ||||||
|  |             print("== == Created STA names == == == == == == == == == == == == == == == == == == == == == == == ==") | ||||||
|  |             pprint(self.station_names) | ||||||
|  |             print("== == vs Pending STA names == ==") | ||||||
|  |             pprint(my_sta_names) | ||||||
|  |             print("== == == == == == == == == == == == == == == == == == == == == == == == == ==") | ||||||
|  |  | ||||||
|  |         # track the names of stations in case we have stations added multiple times | ||||||
|  |         finished_sta = [] | ||||||
|  |  | ||||||
|  |         for eidn in my_sta_names: | ||||||
|  |             if eidn in self.station_names: | ||||||
|  |                 print("Station %s already created, skipping." % eidn) | ||||||
|  |                 continue | ||||||
|  |  | ||||||
|  |             # print (" EIDN "+eidn); | ||||||
|  |             if eidn in finished_sta: | ||||||
|  |                 # pprint(my_sta_names) | ||||||
|  |                 # raise ValueError("************ duplicate ****************** "+eidn) | ||||||
|  |                 if self.debug: | ||||||
|  |                     print("Station %s already created" % eidn) | ||||||
|  |                 continue | ||||||
|  |  | ||||||
|  |             eid = self.local_realm.name_to_eid(eidn) | ||||||
|  |             name = eid[2] | ||||||
|  |             num += 1 | ||||||
|  |             self.add_sta_data["shelf"] = radio_shelf | ||||||
|  |             self.add_sta_data["resource"] = radio_resource | ||||||
|  |             self.add_sta_data["radio"] = radio_port | ||||||
|  |             self.add_sta_data["sta_name"] = name  # for create station calls | ||||||
|  |             self.set_port_data["port"] = name  # for set_port calls. | ||||||
|  |             self.set_port_data["shelf"] = radio_shelf | ||||||
|  |             self.set_port_data["resource"] = radio_resource | ||||||
|  |  | ||||||
|  |             add_sta_r.addPostData(self.add_sta_data) | ||||||
|  |             if debug: | ||||||
|  |                 print("- 3254 - %s- - - - - - - - - - - - - - - - - - " % eidn) | ||||||
|  |                 pprint(add_sta_r.requested_url) | ||||||
|  |                 pprint(add_sta_r.proxies) | ||||||
|  |                 pprint(self.add_sta_data) | ||||||
|  |                 pprint(self.set_port_data) | ||||||
|  |                 print("- ~3254 - - - - - - - - - - - - - - - - - - - ") | ||||||
|  |             if dry_run: | ||||||
|  |                 print("dry run: not creating " + eidn) | ||||||
|  |                 continue | ||||||
|  |  | ||||||
|  |             # print("- 3264 - ## %s ##  add_sta_r.jsonPost - - - - - - - - - - - - - - - - - - "%eidn) | ||||||
|  |             json_response = add_sta_r.jsonPost(debug=self.debug) | ||||||
|  |             finished_sta.append(eidn) | ||||||
|  |             # print("- ~3264 - %s - add_sta_r.jsonPost - - - - - - - - - - - - - - - - - - "%eidn) | ||||||
|  |             time.sleep(0.01) | ||||||
|  |             set_port_r.addPostData(self.set_port_data) | ||||||
|  |             # print("- 3270 -- %s --  set_port_r.jsonPost - - - - - - - - - - - - - - - - - - "%eidn) | ||||||
|  |             json_response = set_port_r.jsonPost(debug) | ||||||
|  |             # print("- ~3270 - %s - set_port_r.jsonPost - - - - - - - - - - - - - - - - - - "%eidn) | ||||||
|  |             time.sleep(0.01) | ||||||
|  |  | ||||||
|  |             self.wifi_extra_data["resource"] = radio_resource | ||||||
|  |             self.wifi_extra_data["port"] = name | ||||||
|  |             if self.wifi_extra_data_modified: | ||||||
|  |                 wifi_extra_r.addPostData(self.wifi_extra_data) | ||||||
|  |                 json_response = wifi_extra_r.jsonPost(debug) | ||||||
|  |  | ||||||
|  |             # append created stations to self.station_names | ||||||
|  |             self.station_names.append("%s.%s.%s" % (radio_shelf, radio_resource, name)) | ||||||
|  |             time.sleep(sleep_time) | ||||||
|  |  | ||||||
|  |         # print("- ~3287 - waitUntilPortsAppear - - - - - - - - - - - - - - - - - - "%eidn) | ||||||
|  |         LFUtils.wait_until_ports_appear(self.lfclient_url, my_sta_names) | ||||||
|  |  | ||||||
|  |         # and set ports up | ||||||
|  |         if dry_run: | ||||||
|  |             return | ||||||
|  |         if (self.up): | ||||||
|  |             self.admin_up() | ||||||
|  |  | ||||||
|  |         # for sta_name in self.station_names: | ||||||
|  |         #     req = LFUtils.portUpRequest(resource, sta_name, debug_on=False) | ||||||
|  |         #     set_port_r.addPostData(req) | ||||||
|  |         #     json_response = set_port_r.jsonPost(debug) | ||||||
|  |         #     time.sleep(0.03) | ||||||
|  |         if self.debug: | ||||||
|  |             print("created %s stations" % num) | ||||||
|  |  | ||||||
|  | # | ||||||
							
								
								
									
										82
									
								
								py-json/test_group_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								py-json/test_group_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  |  | ||||||
|  | from pprint import pprint | ||||||
|  | import time | ||||||
|  | import pprint | ||||||
|  |  | ||||||
|  | class TestGroupProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, test_group_name=None, debug_=False): | ||||||
|  |         super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True) | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.group_name = test_group_name | ||||||
|  |         self.cx_list = [] | ||||||
|  |  | ||||||
|  |     def start_group(self): | ||||||
|  |         if self.group_name is not None: | ||||||
|  |             self.local_realm.json_post("/cli-json/start_group", {"name": self.group_name}) | ||||||
|  |         else: | ||||||
|  |             raise ValueError("test_group name must be set.") | ||||||
|  |  | ||||||
|  |     def quiesce_group(self): | ||||||
|  |         if self.group_name is not None: | ||||||
|  |             self.local_realm.json_post("/cli-json/quiesce_group", {"name": self.group_name}) | ||||||
|  |         else: | ||||||
|  |             raise ValueError("test_group name must be set.") | ||||||
|  |  | ||||||
|  |     def stop_group(self): | ||||||
|  |         if self.group_name is not None: | ||||||
|  |             self.local_realm.json_post("/cli-json/stop_group", {"name": self.group_name}) | ||||||
|  |         else: | ||||||
|  |             raise ValueError("test_group name must be set.") | ||||||
|  |  | ||||||
|  |     def create_group(self): | ||||||
|  |         if self.group_name is not None: | ||||||
|  |             self.local_realm.json_post("/cli-json/add_group", {"name": self.group_name}) | ||||||
|  |         else: | ||||||
|  |             raise ValueError("test_group name must be set.") | ||||||
|  |  | ||||||
|  |     def rm_group(self): | ||||||
|  |         if self.group_name is not None: | ||||||
|  |             self.local_realm.json_post("/cli-json/rm_group", {"name": self.group_name}) | ||||||
|  |         else: | ||||||
|  |             raise ValueError("test_group name must be set.") | ||||||
|  |  | ||||||
|  |     def add_cx(self, cx_name): | ||||||
|  |         self.local_realm.json_post("/cli-json/add_tgcx", {"tgname": self.group_name, "cxname": cx_name}) | ||||||
|  |  | ||||||
|  |     def rm_cx(self, cx_name): | ||||||
|  |         self.local_realm.json_post("/cli-json/rm_tgcx", {"tgname": self.group_name, "cxname": cx_name}) | ||||||
|  |  | ||||||
|  |     def check_group_exists(self): | ||||||
|  |         test_groups = self.local_realm.json_get("/testgroups/all") | ||||||
|  |         if test_groups is not None and "groups" in test_groups: | ||||||
|  |             test_groups = test_groups["groups"] | ||||||
|  |             for group in test_groups: | ||||||
|  |                 for k, v in group.items(): | ||||||
|  |                     if v['name'] == self.group_name: | ||||||
|  |                         return True | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |     def list_groups(self): | ||||||
|  |         test_groups = self.local_realm.json_get("/testgroups/all") | ||||||
|  |         tg_list = [] | ||||||
|  |         if test_groups is not None: | ||||||
|  |             test_groups = test_groups["groups"] | ||||||
|  |             for group in test_groups: | ||||||
|  |                 for k, v in group.items(): | ||||||
|  |                     tg_list.append(v['name']) | ||||||
|  |         return tg_list | ||||||
|  |  | ||||||
|  |     def list_cxs(self): | ||||||
|  |         test_groups = self.local_realm.json_get("/testgroups/all") | ||||||
|  |         if test_groups is not None: | ||||||
|  |             test_groups = test_groups["groups"] | ||||||
|  |             for group in test_groups: | ||||||
|  |                 for k, v in group.items(): | ||||||
|  |                     if v['name'] == self.group_name: | ||||||
|  |                         return v['cross connects'] | ||||||
|  |  | ||||||
|  |         else: | ||||||
|  |             return [] | ||||||
							
								
								
									
										364
									
								
								py-json/vap_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								py-json/vap_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,364 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from LANforge import LFRequest | ||||||
|  | from LANforge import add_vap | ||||||
|  | from LANforge import set_port | ||||||
|  | from LANforge import LFUtils | ||||||
|  |  | ||||||
|  | from pprint import pprint | ||||||
|  |  | ||||||
|  | import time | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class VAPProfile(LFCliBase): | ||||||
|  |     def __init__(self, lfclient_host, lfclient_port, local_realm, | ||||||
|  |                  vap_name="", | ||||||
|  |                  ssid="NA", | ||||||
|  |                  ssid_pass="NA", | ||||||
|  |                  mode=0, | ||||||
|  |                  debug_=False): | ||||||
|  |         super().__init__(_lfjson_host=lfclient_host, _lfjson_port=lfclient_port, _debug=debug_) | ||||||
|  |         self.debug = debug_ | ||||||
|  |         # self.lfclient_url = lfclient_url # done in super() | ||||||
|  |         self.ssid = ssid | ||||||
|  |         self.ssid_pass = ssid_pass | ||||||
|  |         self.mode = mode | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.vap_name = vap_name | ||||||
|  |         self.COMMANDS = ["add_vap", "set_port"] | ||||||
|  |         self.desired_add_vap_flags = ["wpa2_enable", "80211u_enable", "create_admin_down"] | ||||||
|  |         self.desired_add_vap_flags_mask = ["wpa2_enable", "80211u_enable", "create_admin_down"] | ||||||
|  |  | ||||||
|  |         self.add_vap_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "radio": None, | ||||||
|  |             "ap_name": None, | ||||||
|  |             "flags": 0, | ||||||
|  |             "flags_mask": 0, | ||||||
|  |             "mode": 0, | ||||||
|  |             "ssid": None, | ||||||
|  |             "key": None, | ||||||
|  |             "mac": "xx:xx:xx:xx:*:xx" | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         self.desired_set_port_cmd_flags = [] | ||||||
|  |         self.desired_set_port_current_flags = ["if_down"] | ||||||
|  |         self.desired_set_port_interest_flags = ["current_flags", "ifdown"] | ||||||
|  |         self.set_port_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": None, | ||||||
|  |             "current_flags": 0, | ||||||
|  |             "interest": 0,  # (0x2 + 0x4000 + 0x800000)  # current, dhcp, down | ||||||
|  |         } | ||||||
|  |         self.wifi_extra_data_modified = False | ||||||
|  |         self.wifi_extra_data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": None, | ||||||
|  |             "key_mgmt": None, | ||||||
|  |             "eap": None, | ||||||
|  |             "hessid": None, | ||||||
|  |             "identity": None, | ||||||
|  |             "password": None, | ||||||
|  |             "realm": None, | ||||||
|  |             "domain": None | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     def set_wifi_extra(self, | ||||||
|  |                        key_mgmt="WPA-EAP", | ||||||
|  |                        pairwise="DEFAULT", | ||||||
|  |                        group="DEFAULT", | ||||||
|  |                        psk="[BLANK]", | ||||||
|  |                        eap="TTLS", | ||||||
|  |                        identity="testuser", | ||||||
|  |                        passwd="testpasswd", | ||||||
|  |                        realm="localhost.localdomain", | ||||||
|  |                        domain="localhost.localdomain", | ||||||
|  |                        hessid="00:00:00:00:00:01"): | ||||||
|  |         self.wifi_extra_data_modified = True | ||||||
|  |         self.wifi_extra_data["key_mgmt"] = key_mgmt | ||||||
|  |         self.wifi_extra_data["eap"] = eap | ||||||
|  |         self.wifi_extra_data["identity"] = identity | ||||||
|  |         self.wifi_extra_data["password"] = passwd | ||||||
|  |         self.wifi_extra_data["realm"] = realm | ||||||
|  |         self.wifi_extra_data["domain"] = domain | ||||||
|  |         self.wifi_extra_data["hessid"] = hessid | ||||||
|  |  | ||||||
|  |     def admin_up(self, resource): | ||||||
|  |         set_port_r = LFRequest.LFRequest(self.lfclient_url, "/cli-json/set_port", debug_=self.debug) | ||||||
|  |         req_json = LFUtils.portUpRequest(resource, None, debug_on=self.debug) | ||||||
|  |         req_json["port"] = self.vap_name | ||||||
|  |         set_port_r.addPostData(req_json) | ||||||
|  |         json_response = set_port_r.jsonPost(self.debug) | ||||||
|  |         time.sleep(0.03) | ||||||
|  |  | ||||||
|  |     def admin_down(self, resource): | ||||||
|  |         set_port_r = LFRequest.LFRequest(self.lfclient_url, "/cli-json/set_port", debug_=self.debug) | ||||||
|  |         req_json = LFUtils.port_down_request(resource, None, debug_on=self.debug) | ||||||
|  |         req_json["port"] = self.vap_name | ||||||
|  |         set_port_r.addPostData(req_json) | ||||||
|  |         json_response = set_port_r.jsonPost(self.debug) | ||||||
|  |         time.sleep(0.03) | ||||||
|  |  | ||||||
|  |     def use_security(self, security_type, ssid=None, passwd=None): | ||||||
|  |         types = {"wep": "wep_enable", "wpa": "wpa_enable", "wpa2": "wpa2_enable", "wpa3": "use-wpa3", "open": "[BLANK]"} | ||||||
|  |         self.add_vap_data["ssid"] = ssid | ||||||
|  |         if security_type in types.keys(): | ||||||
|  |             if (ssid is None) or (ssid == ""): | ||||||
|  |                 raise ValueError("use_security: %s requires ssid" % security_type) | ||||||
|  |             if (passwd is None) or (passwd == ""): | ||||||
|  |                 raise ValueError("use_security: %s requires passphrase or [BLANK]" % security_type) | ||||||
|  |             for name in types.values(): | ||||||
|  |                 if name in self.desired_add_vap_flags and name in self.desired_add_vap_flags_mask: | ||||||
|  |                     self.desired_add_vap_flags.remove(name) | ||||||
|  |                     self.desired_add_vap_flags_mask.remove(name) | ||||||
|  |             if security_type != "open": | ||||||
|  |                 self.desired_add_vap_flags.append(types[security_type]) | ||||||
|  |                 self.desired_add_vap_flags_mask.append(types[security_type]) | ||||||
|  |             else: | ||||||
|  |                 passwd = "[BLANK]" | ||||||
|  |             self.set_command_param("add_vap", "ssid", ssid) | ||||||
|  |             self.set_command_param("add_vap", "key", passwd) | ||||||
|  |             # unset any other security flag before setting our present flags | ||||||
|  |             if security_type == "wpa3": | ||||||
|  |                 self.set_command_param("add_vap", "ieee80211w", 2) | ||||||
|  |  | ||||||
|  |     def set_command_flag(self, command_name, param_name, value): | ||||||
|  |         # we have to check what the param name is | ||||||
|  |         if (command_name is None) or (command_name == ""): | ||||||
|  |             return | ||||||
|  |         if (param_name is None) or (param_name == ""): | ||||||
|  |             return | ||||||
|  |         if command_name not in self.COMMANDS: | ||||||
|  |             print("Command name name [%s] not defined in %s" % (command_name, self.COMMANDS)) | ||||||
|  |             return | ||||||
|  |         if command_name == "add_vap": | ||||||
|  |             if (param_name not in add_vap.add_vap_flags): | ||||||
|  |                 print("Parameter name [%s] not defined in add_vap.py" % param_name) | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(add_vap.add_vap_flags) | ||||||
|  |                 return | ||||||
|  |             if (value == 1) and (param_name not in self.desired_add_vap_flags): | ||||||
|  |                 self.desired_add_vap_flags.append(param_name) | ||||||
|  |                 self.desired_add_vap_flags_mask.append(param_name) | ||||||
|  |             elif value == 0: | ||||||
|  |                 self.desired_add_vap_flags.remove(param_name) | ||||||
|  |                 self.desired_add_vap_flags_mask.append(param_name) | ||||||
|  |  | ||||||
|  |         elif command_name == "set_port": | ||||||
|  |             if (param_name not in set_port.set_port_current_flags) and ( | ||||||
|  |                     param_name not in set_port.set_port_cmd_flags) and ( | ||||||
|  |                     param_name not in set_port.set_port_interest_flags): | ||||||
|  |                 print("Parameter name [%s] not defined in set_port.py" % param_name) | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(set_port.set_port_cmd_flags) | ||||||
|  |                     pprint(set_port.set_port_current_flags) | ||||||
|  |                     pprint(set_port.set_port_interest_flags) | ||||||
|  |                 return | ||||||
|  |             if param_name in set_port.set_port_cmd_flags: | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_cmd_flags): | ||||||
|  |                     self.desired_set_port_cmd_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_cmd_flags.remove(param_name) | ||||||
|  |             elif param_name in set_port.set_port_current_flags: | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_current_flags): | ||||||
|  |                     self.desired_set_port_current_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_current_flags.remove(param_name) | ||||||
|  |             elif param_name in set_port.set_port_interest_flags: | ||||||
|  |                 if (value == 1) and (param_name not in self.desired_set_port_interest_flags): | ||||||
|  |                     self.desired_set_port_interest_flags.append(param_name) | ||||||
|  |                 elif value == 0: | ||||||
|  |                     self.desired_set_port_interest_flags.remove(param_name) | ||||||
|  |             else: | ||||||
|  |                 raise ValueError("Unknown param name: " + param_name) | ||||||
|  |  | ||||||
|  |     def set_command_param(self, command_name, param_name, param_value): | ||||||
|  |         # we have to check what the param name is | ||||||
|  |         if (command_name is None) or (command_name == ""): | ||||||
|  |             return | ||||||
|  |         if (param_name is None) or (param_name == ""): | ||||||
|  |             return | ||||||
|  |         if command_name not in self.COMMANDS: | ||||||
|  |             self.error("Command name name [%s] not defined in %s" % (command_name, self.COMMANDS)) | ||||||
|  |             return | ||||||
|  |         if command_name == "add_vap": | ||||||
|  |             self.add_vap_data[param_name] = param_value | ||||||
|  |         elif command_name == "set_port": | ||||||
|  |             self.set_port_data[param_name] = param_value | ||||||
|  |  | ||||||
|  |     def add_named_flags(self, desired_list, command_ref): | ||||||
|  |         if desired_list is None: | ||||||
|  |             raise ValueError("addNamedFlags wants a list of desired flag names") | ||||||
|  |         if len(desired_list) < 1: | ||||||
|  |             print("addNamedFlags: empty desired list") | ||||||
|  |             return 0 | ||||||
|  |         if (command_ref is None) or (len(command_ref) < 1): | ||||||
|  |             raise ValueError("addNamedFlags wants a maps of flag values") | ||||||
|  |  | ||||||
|  |         result = 0 | ||||||
|  |         for name in desired_list: | ||||||
|  |             if (name is None) or (name == ""): | ||||||
|  |                 continue | ||||||
|  |             if name not in command_ref: | ||||||
|  |                 if self.debug: | ||||||
|  |                     pprint(command_ref) | ||||||
|  |                 raise ValueError("flag %s not in map" % name) | ||||||
|  |             # print("add-named-flags: %s  %i"%(name, command_ref[name])) | ||||||
|  |             result |= command_ref[name] | ||||||
|  |  | ||||||
|  |         return result | ||||||
|  |  | ||||||
|  |     def create(self, resource, radio, channel=None, up_=None, debug=False, use_ht40=True, use_ht80=True, | ||||||
|  |                use_ht160=False, | ||||||
|  |                suppress_related_commands_=True, use_radius=False, hs20_enable=False): | ||||||
|  |         port_list = self.local_realm.json_get("port/1/1/list") | ||||||
|  |         if port_list is not None: | ||||||
|  |             port_list = port_list['interfaces'] | ||||||
|  |             for port in port_list: | ||||||
|  |                 for k, v in port.items(): | ||||||
|  |                     if v['alias'] == self.vap_name: | ||||||
|  |                         self.local_realm.rm_port(k, check_exists=True) | ||||||
|  |         if use_ht160: | ||||||
|  |             self.desired_add_vap_flags.append("enable_80211d") | ||||||
|  |             self.desired_add_vap_flags_mask.append("enable_80211d") | ||||||
|  |             self.desired_add_vap_flags.append("80211h_enable") | ||||||
|  |             self.desired_add_vap_flags_mask.append("80211h_enable") | ||||||
|  |             self.desired_add_vap_flags.append("ht160_enable") | ||||||
|  |             self.desired_add_vap_flags_mask.append("ht160_enable") | ||||||
|  |         if not use_ht40: | ||||||
|  |             self.desired_add_vap_flags.append("disable_ht40") | ||||||
|  |             self.desired_add_vap_flags_mask.append("disable_ht40") | ||||||
|  |         if not use_ht80: | ||||||
|  |             self.desired_add_vap_flags.append("disable_ht80") | ||||||
|  |             self.desired_add_vap_flags_mask.append("disable_ht80") | ||||||
|  |         if use_radius: | ||||||
|  |             self.desired_add_vap_flags.append("8021x_radius") | ||||||
|  |             self.desired_add_vap_flags_mask.append("8021x_radius") | ||||||
|  |         if hs20_enable: | ||||||
|  |             self.desired_add_vap_flags.append("hs20_enable") | ||||||
|  |             self.desired_add_vap_flags_mask.append("hs20_enable") | ||||||
|  |  | ||||||
|  |         # print("MODE ========= ", self.mode) | ||||||
|  |  | ||||||
|  |         jr = self.local_realm.json_get("/radiostatus/1/%s/%s?fields=channel,frequency,country" % (resource, radio), | ||||||
|  |                                        debug_=self.debug) | ||||||
|  |         if jr is None: | ||||||
|  |             raise ValueError("No radio %s.%s found" % (resource, radio)) | ||||||
|  |  | ||||||
|  |         eid = "1.%s.%s" % (resource, radio) | ||||||
|  |         frequency = 0 | ||||||
|  |         country = 0 | ||||||
|  |         if eid in jr: | ||||||
|  |             country = jr[eid]["country"] | ||||||
|  |  | ||||||
|  |         data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": resource, | ||||||
|  |             "radio": radio, | ||||||
|  |             "mode": self.mode,  # "NA", #0 for AUTO or "NA" | ||||||
|  |             "channel": channel, | ||||||
|  |             "country": country, | ||||||
|  |             "frequency": self.local_realm.channel_freq(channel_=channel) | ||||||
|  |         } | ||||||
|  |         self.local_realm.json_post("/cli-json/set_wifi_radio", _data=data) | ||||||
|  |         if up_ is not None: | ||||||
|  |             self.up = up_ | ||||||
|  |         if self.up: | ||||||
|  |             if "create_admin_down" in self.desired_add_vap_flags: | ||||||
|  |                 del self.desired_add_vap_flags[self.desired_add_vap_flags.index("create_admin_down")] | ||||||
|  |         elif "create_admin_down" not in self.desired_add_vap_flags: | ||||||
|  |             self.desired_add_vap_flags.append("create_admin_down") | ||||||
|  |  | ||||||
|  |         # create vaps down, do set_port on them, then set vaps up | ||||||
|  |         self.add_vap_data["mode"] = self.mode | ||||||
|  |         self.add_vap_data["flags"] = self.add_named_flags(self.desired_add_vap_flags, add_vap.add_vap_flags) | ||||||
|  |         self.add_vap_data["flags_mask"] = self.add_named_flags(self.desired_add_vap_flags_mask, add_vap.add_vap_flags) | ||||||
|  |         self.add_vap_data["radio"] = radio | ||||||
|  |  | ||||||
|  |         self.add_vap_data["resource"] = resource | ||||||
|  |         self.set_port_data["current_flags"] = self.add_named_flags(self.desired_set_port_current_flags, | ||||||
|  |                                                                    set_port.set_port_current_flags) | ||||||
|  |         self.set_port_data["interest"] = self.add_named_flags(self.desired_set_port_interest_flags, | ||||||
|  |                                                               set_port.set_port_interest_flags) | ||||||
|  |         # these are unactivated LFRequest objects that we can modify and | ||||||
|  |         # re-use inside a loop, reducing the number of object creations | ||||||
|  |         add_vap_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/add_vap") | ||||||
|  |         set_port_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_port") | ||||||
|  |         wifi_extra_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_wifi_extra") | ||||||
|  |         if suppress_related_commands_: | ||||||
|  |             self.add_vap_data["suppress_preexec_cli"] = "yes" | ||||||
|  |             self.add_vap_data["suppress_preexec_method"] = 1 | ||||||
|  |             self.set_port_data["suppress_preexec_cli"] = "yes" | ||||||
|  |             self.set_port_data["suppress_preexec_method"] = 1 | ||||||
|  |  | ||||||
|  |         # pprint(self.station_names) | ||||||
|  |         # exit(1) | ||||||
|  |         self.set_port_data["port"] = self.vap_name | ||||||
|  |         self.add_vap_data["ap_name"] = self.vap_name | ||||||
|  |         add_vap_r.addPostData(self.add_vap_data) | ||||||
|  |         if debug: | ||||||
|  |             print("- 1502 - %s- - - - - - - - - - - - - - - - - - " % self.vap_name) | ||||||
|  |             pprint(self.add_vap_data) | ||||||
|  |             pprint(self.set_port_data) | ||||||
|  |             pprint(add_vap_r) | ||||||
|  |             print("- ~1502 - - - - - - - - - - - - - - - - - - - ") | ||||||
|  |  | ||||||
|  |         json_response = add_vap_r.jsonPost(debug) | ||||||
|  |         # time.sleep(0.03) | ||||||
|  |         time.sleep(2) | ||||||
|  |         set_port_r.addPostData(self.set_port_data) | ||||||
|  |         json_response = set_port_r.jsonPost(debug) | ||||||
|  |         time.sleep(0.03) | ||||||
|  |  | ||||||
|  |         self.wifi_extra_data["resource"] = resource | ||||||
|  |         self.wifi_extra_data["port"] = self.vap_name | ||||||
|  |         if self.wifi_extra_data_modified: | ||||||
|  |             wifi_extra_r.addPostData(self.wifi_extra_data) | ||||||
|  |             json_response = wifi_extra_r.jsonPost(debug) | ||||||
|  |  | ||||||
|  |         port_list = self.local_realm.json_get("port/1/1/list") | ||||||
|  |         if port_list is not None: | ||||||
|  |             port_list = port_list['interfaces'] | ||||||
|  |             for port in port_list: | ||||||
|  |                 for k, v in port.items(): | ||||||
|  |                     if v['alias'] == 'br0': | ||||||
|  |                         self.local_realm.rm_port(k, check_exists=True) | ||||||
|  |                         time.sleep(5) | ||||||
|  |  | ||||||
|  |         # create bridge | ||||||
|  |         data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": resource, | ||||||
|  |             "port": "br0", | ||||||
|  |             "network_devs": "eth1,%s" % self.vap_name | ||||||
|  |         } | ||||||
|  |         self.local_realm.json_post("cli-json/add_br", data) | ||||||
|  |  | ||||||
|  |         bridge_set_port = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": "br0", | ||||||
|  |             "current_flags": 0x80000000, | ||||||
|  |             "interest": 0x4000  # (0x2 + 0x4000 + 0x800000)  # current, dhcp, down | ||||||
|  |         } | ||||||
|  |         self.local_realm.json_post("cli-json/set_port", bridge_set_port) | ||||||
|  |  | ||||||
|  |         if (self.up): | ||||||
|  |             self.admin_up(1) | ||||||
|  |  | ||||||
|  |     def cleanup(self, resource, delay=0.03): | ||||||
|  |         print("Cleaning up VAPs") | ||||||
|  |         desired_ports = ["1.%s.%s" % (resource, self.vap_name), "1.%s.br0" % resource] | ||||||
|  |  | ||||||
|  |         del_count = len(desired_ports) | ||||||
|  |  | ||||||
|  |         # First, request remove on the list. | ||||||
|  |         for port_eid in desired_ports: | ||||||
|  |             self.local_realm.rm_port(port_eid, check_exists=True) | ||||||
|  |  | ||||||
|  |         # And now see if they are gone | ||||||
|  |         LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=desired_ports) | ||||||
							
								
								
									
										129
									
								
								py-json/wifi_monitor_profile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								py-json/wifi_monitor_profile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | from LANforge.lfcli_base import LFCliBase | ||||||
|  | from LANforge import add_monitor | ||||||
|  | from LANforge.add_monitor import * | ||||||
|  | from LANforge import LFUtils | ||||||
|  |  | ||||||
|  | from pprint import pprint | ||||||
|  | import pprint | ||||||
|  | import time | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class WifiMonitor: | ||||||
|  |     def __init__(self, lfclient_url, local_realm, up=True, debug_=False, resource_=1): | ||||||
|  |         self.debug = debug_ | ||||||
|  |         self.lfclient_url = lfclient_url | ||||||
|  |         self.up = up | ||||||
|  |         self.local_realm = local_realm | ||||||
|  |         self.monitor_name = None | ||||||
|  |         self.resource = resource_ | ||||||
|  |         self.flag_names = [] | ||||||
|  |         self.flag_mask_names = [] | ||||||
|  |         self.flags_mask = add_monitor.default_flags_mask | ||||||
|  |         self.aid = "NA"  # used when sniffing /ax radios | ||||||
|  |         self.bsssid = "00:00:00:00:00:00"  # used when sniffing on /ax radios | ||||||
|  |  | ||||||
|  |     def create(self, resource_=1, channel=None, radio_="wiphy0", name_="moni0"): | ||||||
|  |         print("Creating monitor " + name_) | ||||||
|  |         self.monitor_name = name_ | ||||||
|  |         computed_flags = 0 | ||||||
|  |         for flag_n in self.flag_names: | ||||||
|  |             computed_flags += add_monitor.flags[flag_n] | ||||||
|  |  | ||||||
|  |         # we want to query the existing country code of the radio | ||||||
|  |         # there's no reason to change it but we get hollering from server | ||||||
|  |         # if we don't provide a value for the parameter | ||||||
|  |         jr = self.local_realm.json_get("/radiostatus/1/%s/%s?fields=channel,frequency,country" % (resource_, radio_), | ||||||
|  |                                        debug_=self.debug) | ||||||
|  |         if jr is None: | ||||||
|  |             raise ValueError("No radio %s.%s found" % (resource_, radio_)) | ||||||
|  |  | ||||||
|  |         eid = "1.%s.%s" % (resource_, radio_) | ||||||
|  |         #frequency = 0 | ||||||
|  |         country = 0 | ||||||
|  |         if eid in jr: | ||||||
|  |             country = jr[eid]["country"] | ||||||
|  |  | ||||||
|  |         data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": resource_, | ||||||
|  |             "radio": radio_, | ||||||
|  |             "mode": 0,  # "NA", #0 for AUTO or "NA" | ||||||
|  |             "channel": channel, | ||||||
|  |             "country": country, | ||||||
|  |             "frequency": self.local_realm.channel_freq(channel_=channel) | ||||||
|  |         } | ||||||
|  |         self.local_realm.json_post("/cli-json/set_wifi_radio", _data=data) | ||||||
|  |         time.sleep(1) | ||||||
|  |         self.local_realm.json_post("/cli-json/add_monitor", { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": resource_, | ||||||
|  |             "radio": radio_, | ||||||
|  |             "ap_name": self.monitor_name, | ||||||
|  |             "flags": computed_flags, | ||||||
|  |             "flags_mask": self.flags_mask | ||||||
|  |         }) | ||||||
|  |  | ||||||
|  |     def set_flag(self, param_name, value): | ||||||
|  |         if (param_name not in add_monitor.flags): | ||||||
|  |             raise ValueError("Flag '%s' does not exist for add_monitor, consult add_monitor.py" % param_name) | ||||||
|  |         if (value == 1) and (param_name not in self.flag_names): | ||||||
|  |             self.flag_names.append(param_name) | ||||||
|  |         elif (value == 0) and (param_name in self.flag_names): | ||||||
|  |             del self.flag_names[param_name] | ||||||
|  |             self.flags_mask |= add_monitor.flags[param_name] | ||||||
|  |  | ||||||
|  |     def cleanup(self, resource_=1, desired_ports=None): | ||||||
|  |         print("Cleaning up monitors") | ||||||
|  |         if (desired_ports is None) or (len(desired_ports) < 1): | ||||||
|  |             if (self.monitor_name is None) or (self.monitor_name == ""): | ||||||
|  |                 print("No monitor name set to delete") | ||||||
|  |                 return | ||||||
|  |             LFUtils.removePort(resource=resource_, | ||||||
|  |                                port_name=self.monitor_name, | ||||||
|  |                                baseurl=self.lfclient_url, | ||||||
|  |                                debug=self.debug) | ||||||
|  |         else: | ||||||
|  |             names = ",".join(desired_ports) | ||||||
|  |             existing_ports = self.local_realm.json_get("/port/1/%d/%s?fields=alias" % (resource_, names), debug_=False) | ||||||
|  |             if (existing_ports is None) or ("interfaces" not in existing_ports) or ("interface" not in existing_ports): | ||||||
|  |                 print("No monitor names found to delete") | ||||||
|  |                 return | ||||||
|  |             if ("interfaces" in existing_ports): | ||||||
|  |                 for eid, info in existing_ports["interfaces"].items(): | ||||||
|  |                     LFUtils.removePort(resource=resource_, | ||||||
|  |                                        port_name=info["alias"], | ||||||
|  |                                        baseurl=self.lfclient_url, | ||||||
|  |                                        debug=self.debug) | ||||||
|  |             if ("interface" in existing_ports): | ||||||
|  |                 for eid, info in existing_ports["interface"].items(): | ||||||
|  |                     LFUtils.removePort(resource=resource_, | ||||||
|  |                                        port_name=info["alias"], | ||||||
|  |                                        baseurl=self.lfclient_url, | ||||||
|  |                                        debug=self.debug) | ||||||
|  |  | ||||||
|  |     def admin_up(self): | ||||||
|  |         up_request = LFUtils.port_up_request(resource_id=self.resource, port_name=self.monitor_name) | ||||||
|  |         self.local_realm.json_post("/cli-json/set_port", up_request) | ||||||
|  |  | ||||||
|  |     def admin_down(self): | ||||||
|  |         down_request = LFUtils.portDownRequest(resource_id=self.resource, port_name=self.monitor_name) | ||||||
|  |         self.local_realm.json_post("/cli-json/set_port", down_request) | ||||||
|  |  | ||||||
|  |     def start_sniff(self, capname=None, duration_sec=60): | ||||||
|  |         if capname is None: | ||||||
|  |             raise ValueError("Need a capture file name") | ||||||
|  |         data = { | ||||||
|  |             "shelf": 1, | ||||||
|  |             "resource": 1, | ||||||
|  |             "port": self.monitor_name, | ||||||
|  |             "display": "NA", | ||||||
|  |             "flags": 0x2, | ||||||
|  |             "outfile": capname, | ||||||
|  |             "duration": duration_sec | ||||||
|  |         } | ||||||
|  |         self.local_realm.json_post("/cli-json/sniff_port", _data=data) | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Dipti
					Dipti