Skip to content

Commit e9d6ae5

Browse files
author
Martin Roy
committed
Use a page reader for every "show" commands on dell powerconnect
Any show command can have pagination so now they will all be run in a page reader that abstracts the pagination Fixes #178
1 parent 0eefb3e commit e9d6ae5

File tree

4 files changed

+178
-225
lines changed

4 files changed

+178
-225
lines changed

netman/adapters/switches/dell.py

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515

1616
from netman.adapters.shell.ssh import SshClient
1717
from netman.adapters.shell.telnet import TelnetClient
18-
from netman.core.objects.interface_states import OFF, ON
18+
from netman.core.objects.interface_states import OFF
1919
from netman.core.objects.port_modes import TRUNK
2020
from netman.core.objects.port_modes import ACCESS
2121
from netman.core.objects.interface import Interface
2222
from netman.adapters.switches.cisco import parse_vlan_ranges
2323
from netman.core.objects.vlan import Vlan
2424
from netman import regex
2525
from netman.core.objects.switch_transactional import FlowControlSwitch
26-
from netman.adapters.switches.util import SubShell, no_output, ResultChecker
26+
from netman.adapters.switches.util import SubShell, no_output, ResultChecker, PageReader
2727
from netman.core.objects.exceptions import UnknownInterface, BadVlanName, \
2828
BadVlanNumber, UnknownVlan, InterfaceInWrongPortMode, NativeVlanNotSet, TrunkVlanNotSet, BadInterfaceDescription, \
2929
VlanAlreadyExist, UnknownBond, InvalidMtuSize, InterfaceResetIncomplete
@@ -55,6 +55,12 @@ def __init__(self, switch_descriptor, shell_factory):
5555
self.shell = None
5656
self.shell_factory = shell_factory
5757

58+
self.page_reader = PageReader(
59+
read_while="--More-- or (q)uit",
60+
and_press="m",
61+
unless_prompt="#"
62+
)
63+
5864
def _connect(self):
5965
params = dict(
6066
host=self.switch_descriptor.hostname,
@@ -92,17 +98,13 @@ def set_interface_state(self, interface_id, state):
9298
self.shell.do('shutdown' if state is OFF else 'no shutdown')
9399

94100
def get_vlans(self):
95-
result = self.shell.do('show vlan', wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
96-
while len(result) > 0 and "--More--" in result[-1]:
97-
result += self.shell.send_key("m", wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
98-
101+
result = self.page_reader.do(self.shell, "show vlan")
99102
vlans = parse_vlan_list(result)
100103
return vlans
101104

102105
def get_vlan(self, vlan_number):
103-
result = self.shell.do("show vlan id {}".format(vlan_number), wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
104-
while len(result) > 0 and "--More--" in result[-1]:
105-
result += self.shell.send_key("m", wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
106+
result = self.page_reader.do(self.shell, "show vlan id {}".format(vlan_number))
107+
106108
if regex.match(".*\^.*", result[0]):
107109
raise BadVlanNumber()
108110
elif regex.match("^ERROR", result[0]):
@@ -111,9 +113,8 @@ def get_vlan(self, vlan_number):
111113
return vlan
112114

113115
def get_vlan_interfaces(self, vlan_number):
114-
result = self.shell.do("show vlan id {}".format(vlan_number), wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
115-
while len(result) > 0 and "--More--" in result[-1]:
116-
result += self.shell.send_key("m", wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
116+
result = self.page_reader.do(self.shell, "show vlan id {}".format(vlan_number))
117+
117118
if regex.match(".*\^.*", result[0]):
118119
raise BadVlanNumber()
119120
elif regex.match("^ERROR", result[0]):
@@ -125,17 +126,12 @@ def get_interface(self, interface_id):
125126
return self.read_interface(interface_id)
126127

127128
def get_interfaces(self):
128-
result = self.shell.do('show interfaces status', wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
129-
name_list = self.parse_interface_names(result)
130-
131-
while len(result) > 0 and "--More--" in result[-1]:
132-
result = self.shell.send_key("m", wait_for=("--More-- or (q)uit", "#"), include_last_line=True)
133-
name_list += self.parse_interface_names(result)
129+
result = self.page_reader.do(self.shell, 'show interfaces status')
134130

135-
return [self.read_interface(name) for name in name_list]
131+
return [self.read_interface(name) for name in self.parse_interface_names(result)]
136132

137133
def add_vlan(self, number, name=None):
138-
result = self.shell.do("show vlan id {}".format(number))
134+
result = self.page_reader.do(self.shell, "show vlan id {}".format(number))
139135
if regex.match(".*\^.*", result[0]):
140136
raise BadVlanNumber()
141137
elif regex.match("^VLAN", result[0]):
@@ -306,7 +302,7 @@ def set(self, command, *arguments):
306302
return ResultChecker(result)
307303

308304
def get_interface_data(self, interface_id):
309-
interface_data = self.shell.do("show running-config interface {}".format(interface_id))
305+
interface_data = self.page_reader.do(self.shell, "show running-config interface {}".format(interface_id))
310306
if any(["Invalid input" in line or regex.match("ERROR.*", line) for line in interface_data]):
311307
raise UnknownInterface(interface_id)
312308
return interface_data

netman/adapters/switches/util.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,22 @@ def on_result_matching(self, matcher, exception, *args, **kwargs):
8686
if regex.match(matcher, "\n".join(self.result), flags=re.DOTALL):
8787
raise exception(*args, **kwargs)
8888
return self
89+
90+
91+
class PageReader(object):
92+
def __init__(self, read_while, and_press, unless_prompt):
93+
self.next_page_indicator = read_while
94+
self.continue_key = and_press
95+
self.prompt = unless_prompt
96+
97+
def do(self, shell, command):
98+
result = shell.do(command,
99+
wait_for=(self.next_page_indicator, self.prompt),
100+
include_last_line=True)
101+
102+
while len(result) > 0 and self.next_page_indicator in result[-1]:
103+
result = result[:-1] + shell.send_key(self.continue_key,
104+
wait_for=(self.next_page_indicator, self.prompt),
105+
include_last_line=True)
106+
107+
return result[:-1]

0 commit comments

Comments
 (0)