Skip to content

Commit bc0f5f8

Browse files
authored
Merge pull request #179 from lindycoder/use_page_reader
Use a page reader for every "show" commands on dell powerconnect
2 parents 0eefb3e + b812219 commit bc0f5f8

File tree

6 files changed

+190
-227
lines changed

6 files changed

+190
-227
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/dell10g.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ def get_vlan(self, number):
6464
else:
6565
return parse_vlan_list(result)[0]
6666

67+
def get_vlan_interfaces(self, vlan_number):
68+
result = self.shell.do("show vlan id {}".format(vlan_number))
69+
70+
if regex.match(".*\^.*", result[0]):
71+
raise BadVlanNumber()
72+
elif regex.match("^ERROR", result[0]):
73+
raise UnknownVlan(vlan_number)
74+
75+
return self.parse_interface_from_vlan_list(vlan_number, result)
76+
6777
def get_interfaces(self):
6878
result = self.shell.do('show interfaces status')
6979
return [self.read_interface(name) for name in parse_interface_names(result)]

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]

tests/adapters/switches/dell10g_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ def test_get_vlan_with_unknown_number(self):
284284
assert_that(str(expect.exception), equal_to("Vlan 1210 not found"))
285285

286286
def test_get_vlan_interfaces(self):
287-
self.mocked_ssh_client.should_receive("do").with_args("show vlan id 1000", wait_for=("--More-- or (q)uit", "#"), include_last_line=True).once().ordered().and_return([
287+
self.mocked_ssh_client.should_receive("do").with_args("show vlan id 1000").once().ordered().and_return([
288288
"VLAN Name Ports Type Authorization",
289289
"----- --------------- ------------- ----- -------------",
290290
"1000 MyVlanName Po2-3,Po5-7, Static Required",
@@ -296,7 +296,7 @@ def test_get_vlan_interfaces(self):
296296
assert_that(vlan_interfaces, equal_to(['port-channel 2', 'port-channel 3', 'port-channel 5', 'port-channel 6', 'port-channel 7', 'tengigabitethernet 0/0/1', 'tengigabitethernet 0/0/2']))
297297

298298
def test_get_vlan_interfaces_with_unknown_vlan_raises(self):
299-
self.mocked_ssh_client.should_receive("do").with_args("show vlan id 2019", wait_for=("--More-- or (q)uit", "#"), include_last_line=True).once().ordered().and_return([
299+
self.mocked_ssh_client.should_receive("do").with_args("show vlan id 2019").once().ordered().and_return([
300300
"ERROR: This VLAN does not exist."
301301
])
302302

0 commit comments

Comments
 (0)