def _poll_switch(ip_addr, credentials, req_obj='mac', oper="SCAN"): """Poll switch by ip addr. Args: ip_addr: ip addr of the switch. credentials: credentials of the switch. Returns: switch attributes dict and list of machine attributes dict. """ under_monitoring = 'under_monitoring' unreachable = 'unreachable' polling_error = 'error' hdmanager = HDManager() vendor, state, err_msg = hdmanager.get_vendor(ip_addr, credentials) if not vendor: logging.info("*****error_msg: %s****", err_msg) logging.error('no vendor found or match switch %s', ip_addr) return ({'vendor': vendor, 'state': state, 'err_msg': err_msg}, {}) logging.debug('hdmanager learn switch from %s', ip_addr) results = [] try: results = hdmanager.learn(ip_addr, credentials, vendor, req_obj, oper) except Exception as error: logging.exception(error) state = unreachable err_msg = ('SNMP walk for querying MAC addresses timedout') return ({'vendor': vendor, 'state': state, 'err_msg': err_msg}, {}) logging.info("pollswitch %s result: %s", ip_addr, results) if not results: logging.error('no result learned from %s', ip_addr) state = polling_error err_msg = 'No result learned from SNMP walk' return ({'vendor': vendor, 'state': state, 'err_msg': err_msg}, {}) logging.info('poll switch result: %s' % str(results)) machine_dicts = {} for machine in results: mac = machine['mac'] port = machine['port'] vlan = int(machine['vlan']) if vlan: vlans = [vlan] else: vlans = [] if mac not in machine_dicts: machine_dicts[mac] = {'mac': mac, 'port': port, 'vlans': vlans} else: machine_dicts[mac]['port'] = port machine_dicts[mac]['vlans'].extend(vlans) logging.debug('update switch %s state to under monitoring', ip_addr) state = under_monitoring return ({ 'vendor': vendor, 'state': state, 'err_msg': err_msg }, machine_dicts.values())
def setUp(self): super(HDManagerTest, self).setUp() logsetting.init() self.manager = HDManager() self.correct_host = '33.33.33.1' self.correct_host_2 = '127.0.0.1' self.correct_credential = {'version': '2c', 'community': 'public'}
def poll_switch(ip_addr, req_obj='mac', oper="SCAN"): """ Query switch and return expected result :param str ip_addr: switch ip address :param str req_obj: the object requested to query from switch :param str oper : the operation to query the switch(SCAN, GET, SET) """ if not ip_addr: logging.error('No switch IP address is provided!') return #Retrieve vendor info from switch table session = database.current_session() switch = session.query(Switch).filter_by(ip=ip_addr).first() logging.info("pollswitch: %s", switch) if not switch: logging.error('no switch found for %s', ip_addr) return credential = switch.credential logging.error("pollswitch: credential %r", credential) vendor = switch.vendor hdmanager = HDManager() if not vendor or not hdmanager.is_valid_vendor(ip_addr, credential, vendor): # No vendor found or vendor doesn't match queried switch. logging.debug('no vendor or vendor had been changed for switch %s', switch) vendor = hdmanager.get_vendor(ip_addr, credential) logging.debug('[pollswitch] credential %r', credential) if not vendor: logging.error('no vendor found or match switch %s', switch) return switch.vendor = vendor # Start to poll switch's mac address..... logging.debug('hdmanager learn switch from %s %s %s %s %s', ip_addr, credential, vendor, req_obj, oper) results = hdmanager.learn(ip_addr, credential, vendor, req_obj, oper) logging.info("pollswitch %s result: %s", switch, results) if not results: logging.error('no result learned from %s %s %s %s %s', ip_addr, credential, vendor, req_obj, oper) return for entry in results: mac = entry['mac'] machine = session.query(Machine).filter_by(mac=mac).first() if not machine: machine = Machine(mac=mac) machine.port = entry['port'] machine.vlan = entry['vlan'] machine.switch = switch logging.debug('update switch %s state to under monitoring', switch) switch.state = 'under_monitoring'
def poll_switch(ip_addr, req_obj='mac', oper="SCAN"): """Query switch and return expected result .. note:: When polling switch succeeds, for each mac it got from polling switch, A Machine record associated with the switch is added to the database. :param ip_addr: switch ip address. :type ip_addr: str :param req_obj: the object requested to query from switch. :type req_obj: str :param oper: the operation to query the switch. :type oper: str, should be one of ['SCAN', 'GET', 'SET'] .. note:: The function should be called out of database session scope. """ under_monitoring = 'under_monitoring' unreachable = 'unreachable' if not ip_addr: logging.error('No switch IP address is provided!') return with database.session() as session: #Retrieve vendor info from switch table switch = session.query(Switch).filter_by(ip=ip_addr).first() logging.info("pollswitch: %s", switch) if not switch: logging.error('no switch found for %s', ip_addr) return credential = switch.credential logging.info("pollswitch: credential %r", credential) vendor = switch.vendor prev_state = switch.state hdmanager = HDManager() vendor, vstate, err_msg = hdmanager.get_vendor(ip_addr, credential) if not vendor: switch.state = vstate switch.err_msg = err_msg logging.info("*****error_msg: %s****", switch.err_msg) logging.error('no vendor found or match switch %s', switch) return switch.vendor = vendor # Start to poll switch's mac address..... logging.debug('hdmanager learn switch from %s %s %s %s %s', ip_addr, credential, vendor, req_obj, oper) results = [] try: results = hdmanager.learn(ip_addr, credential, vendor, req_obj, oper) except Exception as error: logging.exception(error) switch.state = unreachable switch.err_msg = "SNMP walk for querying MAC addresses timedout" return logging.info("pollswitch %s result: %s", switch, results) if not results: logging.error('no result learned from %s %s %s %s %s', ip_addr, credential, vendor, req_obj, oper) return switch_id = switch.id filter_ports = session.query(SwitchConfig.filter_port).filter( SwitchConfig.ip == Switch.ip).filter(Switch.id == switch_id).all() logging.info("***********filter posts are %s********", filter_ports) if filter_ports: #Get all ports from tuples into list filter_ports = [i[0] for i in filter_ports] for entry in results: mac = entry['mac'] port = entry['port'] vlan = entry['vlan'] if port in filter_ports: continue machine = session.query(Machine).filter_by( mac=mac, switch_id=switch_id).first() if not machine: machine = Machine(mac=mac, port=port, vlan=vlan, switch_id=switch_id) session.add(machine) else: machine.port = port machine.vlan = vlan logging.debug('update switch %s state to under monitoring', switch) if prev_state != under_monitoring: #Update error message in db switch.err_msg = "" switch.state = under_monitoring
def poll_switch(ip_addr, req_obj='mac', oper="SCAN"): """Query switch and return expected result .. note:: When polling switch succeeds, for each mac it got from polling switch, A Machine record associated with the switch is added to the database. :param ip_addr: switch ip address. :type ip_addr: str :param req_obj: the object requested to query from switch. :type req_obj: str :param oper: the operation to query the switch. :type oper: str, should be one of ['SCAN', 'GET', 'SET'] .. note:: The function should be called inside database session scope. """ if not ip_addr: logging.error('No switch IP address is provided!') return #Retrieve vendor info from switch table session = database.current_session() switch = session.query(Switch).filter_by(ip=ip_addr).first() logging.info("pollswitch: %s", switch) if not switch: logging.error('no switch found for %s', ip_addr) return credential = switch.credential logging.error("pollswitch: credential %r", credential) vendor = switch.vendor hdmanager = HDManager() if not vendor or not hdmanager.is_valid_vendor(ip_addr, credential, vendor): # No vendor found or vendor doesn't match queried switch. logging.debug('no vendor or vendor had been changed for switch %s', switch) vendor = hdmanager.get_vendor(ip_addr, credential) logging.debug('[pollswitch] credential %r', credential) if not vendor: logging.error('no vendor found or match switch %s', switch) return switch.vendor = vendor # Start to poll switch's mac address..... logging.debug('hdmanager learn switch from %s %s %s %s %s', ip_addr, credential, vendor, req_obj, oper) results = hdmanager.learn(ip_addr, credential, vendor, req_obj, oper) logging.info("pollswitch %s result: %s", switch, results) if not results: logging.error('no result learned from %s %s %s %s %s', ip_addr, credential, vendor, req_obj, oper) return for entry in results: mac = entry['mac'] machine = session.query(Machine).filter_by(mac=mac).first() if not machine: machine = Machine(mac=mac) machine.port = entry['port'] machine.vlan = entry['vlan'] machine.switch = switch logging.debug('update switch %s state to under monitoring', switch) switch.state = 'under_monitoring'