Why and Who is this POST for?
There can be situations where QA or Developers need real hardware devices for suppose when developers need to test their code or when QA has to do end to end testing with it. I am one of those QA’s who was wondering how to simulate the hardware devices like linux machine, cisco routers and some switches with SNMP configuration for my end to end testing. I thought sharing this experience could help people like me out there.
I have used following python Modules to simulate the snmp devices / switches
- snmpsim Installation
$ virtualenv -p /usr/bin/python3 devices $ source devices/bin/activate $ pip install snmpsim
please note that snmpsim installation would get a sample simulation data file under the data directory and it is stored in simple plaint-text files having OID|TYPE|VALUE format
- Run snmp simulators
We can use snmpsim-command-responder daemon or snmpsimd.py tool to run simulators and this tool can run multiple individual daemons at a time
$ snmpsimd.py --data-dir=./data --agent-udpv4-endpoint=127.0.0.1:8089 &
$ snmpsim-command-responder --data-dir=./data --agent-udpv4-endpoint=127.0.0.1:8089 &
If snmpsim commands are not working, then try to pip install
- check if simulated devices/agents are up and running
snmpwalk is the application that can be used to query the snmp simulators , you will see no response if the device is not up else it would return snmp data in the response
$ snmpwalk -v1 -c public 127.0.0.1:8089
- Below is the python code snippet to run simulated devices on linux system
"""Run n number of snmp simulated devices on linux""" import os import argparse from faker import Faker import socket def parse_args(): #set detault balues for the optional arguments hostname = socket.gethostname() localhost_ip = socket.gethostbyname(hostname) parser = argparse.ArgumentParser(description="simulate SNMP devices") parser.add_argument('-d',"--no_of_devices",type=int,help="number of snmp devices") args = parser.parse_args() return args def create_snmp(**kwargs): num_devices = kwargs.get('no_of_devices') faker = Faker() port_list =  for i in range(num_devices): try: port = get_open_port(host="127.0.0.1") port_list.append(port) os.system("snmpsimd.py --data-dir=./data --agent-udpv4-endpoint=127.0.0.1:%s &"%(port)) except: raise ValueError("error in running the snmp device 'snmpsimd.py' command") #ip_list = [faker.ipv4() for port in port_list] #self.update_iptables(port_list,ip_list) return port_list def get_open_port(host): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host,0)) s.listen(1) port = s.getsockname() s.close() return port def update_iptables(self,port_list,ip_list): for port,ip in zip(port_list,ip_list): try: os.system("sudo iptables -t nat -A OUTPUT -p udp -d %s --dport 1:65535 -j DNAT --to-destination 127.0.0.1:%s &"%(ip,port)) os.system("sudo iptables -t nat -A OUTPUT -p icmp -d %s --icmp-type echo-request -j DNAT --to-destination 127.0.0.1:%s &"%(ip,port)) os.system("sudo iptables -t nat -A OUTPUT -p tcp -d %s --dport 22 -j DNAT --to-destination 127.0.0.1:%s &"%(ip,port)) except OSError: raise ValueError('error in running the iptable update commands') if __name__=="__main__": args = parse_args() print("Creating SNMP simulated devices................") port_list = create_snmp(no_of_devices=args.no_of_devices) print("snmp devices are being run on these ports:",port_list)
- fake-switches Installation
$pip install fake-switches
- Run fake-switches
$fake-switches --model cisco_2960_24TT_L --hostname 127.0.0.1 --username root --password root --listen-port 8087 &
Please note these fake switches are not SNMP agent installed by default
Following are some references for more details on snmp-simulator & fake-switches modules
If you would like to assign a fake IP address for the simulated devices with in the local host , then refer this blog
I have around 10 years of experience in QA , working at USA for about 3 years with different clients directly as onsite coordinator added great experience to my QA career . It was great opportunity to work with reputed clients like E*Trade financial services , Bank of Newyork Mellon , Key Bank , Thomson Reuters & Pascal metrics.
Besides to experience in functional/automation/performance/API & Database testing with good understanding on QA tools, process and methodologies, working as a QA helped me gaining domain experience in trading , banking & investments and health care.
My prior experience is with large companies like cognizant & HCL as a QA lead. I’m glad chose to work for start up because of learning curve ,flat structure that gives freedom to closely work with higher level management and an opportunity to see higher level management thinking patterns and work culture .
My strengths are analysis, have keen eye for attention to details & very fast learner . On a personal note my hobbies are listening to music , organic farming and taking care of cats & dogs.