def __init__(self, config, test, device=os.environ['device']): self.config = config try: self.get_config = Device.Device.getDeviceObject(os.environ['device']) except Exception as err: print err raise pass self.differ = TextDiffer() self.test = test self.s1 = {} self.s2 = {} self.s3 = {} self.device_results_test_dir = None
class DeviceVerifier: def __init__(self, config, test, device=os.environ['device']): self.config = config try: self.get_config = Device.Device.getDeviceObject(os.environ['device']) except Exception as err: print err raise pass self.differ = TextDiffer() self.test = test self.s1 = {} self.s2 = {} self.s3 = {} self.device_results_test_dir = None def _log_snapshot(self, name, snapshot): self.device_results_test_dir = os.path.join(self.config.device_verification_dir, self.test.current_test_id) if not os.path.isdir(self.device_results_test_dir): os.makedirs(self.device_results_test_dir) if os.environ['device'] != 'IAP_1' and os.environ['device'] != 'Switch_1': f = open(os.path.join(self.device_results_test_dir, "%s_%s.txt" % (name, os.environ['device'])), "w") else: f = open(os.path.join(self.device_results_test_dir, "%s.txt" % name), "w") f.write(snapshot) f.close() def _take_snapshot(self, type, extra_command = None): #config = self.get_config.get_running_config(extra_command) config = Device.Device.getDeviceObject(os.environ['device']).get_running_config(extra_command) config_string = config lines = config_string.split('\n') pseudo_snapshot = [] for line in lines: if not(line.startswith(" index ") or line.startswith(" wpa-passphrase") or line.startswith("version ") or line.lower().find("more")!=-1): words = line.split(" ") for word in words: result1 = re.match("[^-_:]{32}", word) if not result1 == None: line = line.replace(word, "") result2 = re.match("(([A-Z][0-9]|[A-Z][A-Z]|[0-9][A-Z]|[0-9][0-9]):){2,6}", word, re.I) if not result2 == None: line = line.replace(word, "") if (line.startswith("name ") and ('Instant-' in line)): name_parts = line.split('-') name_parts[1] = "" line = "".join(name_parts) pseudo_snapshot.append(line) snapshot = '\n'.join(pseudo_snapshot) self._log_snapshot(type, snapshot) return snapshot def take_s1_snapshot(self, extra_command = None): if not self.config.options.ignore_device: self.clear(os.environ['device']) if not self.config.options.switch: time.sleep(devices.CONFIG_CHANGE_WAIT_TIME) # setattr(self, "s1_%s" %os.environ["device"], self._take_snapshot("s1", extra_command)) self.s1[os.environ['device']] = self._take_snapshot("s1", extra_command) # self.s1 = self._take_snapshot("s1", extra_command) def take_s2_snapshot(self, extra_command = None): if not self.config.options.ignore_device: if not self.config.options.switch: time.sleep(devices.CONFIG_CHANGE_WAIT_TIME) # setattr(self, "s2_%s" %os.environ["device"], self._take_snapshot("s2", extra_command)) self.s2[os.environ['device']] = self._take_snapshot("s2", extra_command) # self.s2 = self._take_snapshot("s2", extra_command) def take_s3_snapshot(self, extra_command = None): if not self.config.options.ignore_device: if not self.config.options.switch: time.sleep(devices.CONFIG_CHANGE_WAIT_TIME) # setattr(self, "s3_%s" %os.environ["device"], self._take_snapshot("s3", extra_command)) self.s3[os.environ['device']] = self._take_snapshot("s3", extra_command) # self.s3 = self._take_snapshot("s3", extra_command) def _get_test_diff(self, num_of_context_lines): expected_config_diff = None import os print os.environ['device'] device = os.environ['device'] # raw_input('device') version = None exec("version = devices.%s.version"%device) print version # raw_input('version') if self.config.options.switch: diff_file_path = os.path.join(fwork.DEVICE_VERIFICATION_DIR+"\%s"%self.get_config.get('type') , "%s_s1_s2_diff.txt") % self.test.current_test_id else: diff_file_path = os.path.join(fwork.DEVICE_VERIFICATION_DIR+"\%s"%self.get_config.get('type') +"\%s"%version, "%s_s1_s2_diff.txt") % self.test.current_test_id print diff_file_path # raw_input('path') if os.path.isfile(diff_file_path): diff_handle = open(diff_file_path, "r") expected_config_diff_list = diff_handle.readlines() expected_config_diff = ''.join(expected_config_diff_list) diff_handle.close() else: # To be used during script development only try: left_file = os.path.join(fwork.DEVICE_VERIFICATION_DIR, "%s_base.txt") % self.test.current_test_id right_file = os.path.join(fwork.DEVICE_VERIFICATION_DIR, "%s_final.txt") % self.test.current_test_id if os.path.isfile(left_file) and os.path.isfile(right_file): expected_config_diff = self.differ.get_difference(left_file, right_file, num_of_context_lines) else: raise Exception("'%s_s1_s2_diff.txt' file not found in dir '%s'" % (self.test.current_test_id, fwork.DEVICE_VERIFICATION_DIR)) except Exception as e: logger.debug("deviceverifier: caught exception:: %s" % str(e)) raise expected_config_diff = expected_config_diff % self.test.get_all_config_dict() f = open(os.path.join(self.device_results_test_dir, "s1_s2_expected_diff.txt"), "w") f.write(expected_config_diff) f.close() return expected_config_diff def _check_diff_equality(self, left_diff, right_diff): if self.differ.get_difference(left_diff, right_diff, 0) != "": return False else: return True #return left_diff == right_diff def _get_snapshot_diff(self, type, left_snapshot, right_snapshot, num_of_context_lines): import os actual_config_diff = self.differ.get_difference(left_snapshot, right_snapshot, num_of_context_lines) print "The device used for Snapshot" print os.environ['device'] f = open(os.path.join(self.device_results_test_dir, "%s_%s_actual_diff.txt" % (type,os.environ['device'])), "w") f.write(actual_config_diff) f.close() return actual_config_diff def check_s1_s2_diff(self , num_of_context_lines): if not self.config.options.ignore_device: print "The snapshot key is:", os.environ['device'] print self.s1[os.environ['device']] print self.s1[os.environ['device']] print self.s2[os.environ['device']] calculated_diff = self._get_snapshot_diff("s1_s2",self.s1[os.environ['device']], self.s2[os.environ['device']], num_of_context_lines) test_reference_diff = self._get_test_diff(num_of_context_lines) return self._check_diff_equality(calculated_diff, test_reference_diff) else: return True def check_s1_s3_diff(self): if not self.config.options.ignore_device: calculated_diff = self._get_snapshot_diff("s1_s3", self.s1[os.environ['device']], self.s3[os.environ['device']], None) return self._check_diff_equality(calculated_diff, "") else: return True def clear(self, device): if not self.config.options.ignore_device: #self.s1.clear() self.s1[device] = "" #self.s2.clear() self.s2[device] = "" self.s3[device] = "" #self.s3.clear() def get_device_current_status(self,device=None): if self.config.options.switch: logger.debug("Switch Device status") device ='switch' else: device = 'ap' if not self.config.options.ignore_device: return self.get_config.get_device_status() def connect_device(self): if not self.config.options.ignore_device: time.sleep(devices.CONNECTION_WAIT_TIME) self.get_config.connect_device_to_server() time.sleep(devices.CONFIG_CHANGE_WAIT_TIME) time.sleep(devices.CONFIG_CHANGE_WAIT_TIME) if not self.get_device_current_status(): logger.info("*** DEVICE IS NOT UP. ABORTING TEST EXECUTION. ***") import sys sys.exit(1)