Reputation: 11
I'm creating a class to hold functions that all have a similar goal and as I'm typing this out I realize that all of the functions will need to use the same 80% of their code, which involves connecting to the networking devices first.
What would be the most efficient way to run the Netmiko(**device) function below and only type it out in my code once? After connecting I would need to continue on to the specific function that held the command. Maybe there is an even more effective method using a switch case? I don't know classes very well though, so I was curious if there was a nice way to do this within the class functions.
class DisplayDeviceInfo:
# Each function will need to run net_connect = Netmiko(**device), to connect to the network device. Is there a clean way of grabbing the 'networkdevice' variable I'm passing and connect here and then continue on to the original function that was called?
#I was thinking doing it here but this area is only read once when the class is created.
def int_status(networkdevice):
try:
device = {
'host': networkdevice[1],
'username': username,
'password': password,
'device_type': 'cisco_ios',
}
net_connect = Netmiko(**device)
output = net_connect.send_command('show interface status')
print(output)
except (NetMikoTimeoutException, NetMikoAuthenticationException):
print('Unable to connect to the device :(')
def err_disabled(networkdevice):
try:
device = {
'host': networkdevice[1],
'username': username,
'password': password,
'device_type': 'cisco_ios',
}
net_connect = Netmiko(**device)
output = net_connect.send_command('show interfaces status err-disabled')
if(len(output) == 0):
print()
print('This switch has no ports in an err-disabled state.')
print()
else:
print(output)
except (NetMikoTimeoutException, NetMikoAuthenticationException):
print('Unable to connect to the device :(')
Upvotes: 1
Views: 109
Reputation: 357
You're using your class as a "pure class". You need to create instances instead.
class NetDevice(object):
def __init__(self, address, username, password, device_type = "cisco_ios"):
self.address = address
self.username = username
self.password = password
self.device_type = device_type
self.session = None
@property
def netmiko_params(self) -> dict:
return {
'host': self.address,
'username': self.username,
'password': self.password,
'device_type': self.device_type,
}
def connect(self):
self.session = Netmiko(**self.netmiko_params)
def err_disable(self):
# Simply use self.session where you were using net_connect
s = self.session.command("show interfaces")
...
return results
Usage:
device = NetDevice("10.1.0.1", "bob", "cisco", "cisco_ios")
device.connect()
device.err_disable()
username = "bob"
password = "cisco"
device_type = "cisco_ios"
for address in addresses:
device = NetDevice(address, username, password, device_type)
device.connect()
device.err_disable()
Upvotes: 2