Skip to content

Commit 2419145

Browse files
authored
[202205][show] Add bgpraw to show run all (sonic-net#2609)
What I did sonic-net#2537 202205 branch doesn't have from sonic_py_common import multi_asic, which results in test failure and build error. The only difference between this PR and original PR is just one line of import. How I did it How to verify it Tested locally on 202205 build and pass the build process.
1 parent 7e6e7ef commit 2419145

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

show/main.py

+25-3
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
import utilities_common.multi_asic as multi_asic_util
1111
from importlib import reload
1212
from natsort import natsorted
13-
from sonic_py_common import device_info
13+
from sonic_py_common import device_info, multi_asic
1414
from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector
1515
from tabulate import tabulate
1616
from utilities_common import util_base
1717
from utilities_common.db import Db
1818
from datetime import datetime
1919
import utilities_common.constants as constants
2020
from utilities_common.general import load_db_config
21+
from json.decoder import JSONDecodeError
2122

2223
# mock the redis for unit test purposes #
2324
try:
@@ -127,6 +128,10 @@ def run_command(command, display_cmd=False, return_cmd=False):
127128
if rc != 0:
128129
sys.exit(rc)
129130

131+
def get_cmd_output(cmd):
132+
proc = subprocess.Popen(cmd, text=True, stdout=subprocess.PIPE)
133+
return proc.communicate()[0], proc.returncode
134+
130135
# Lazy global class instance for SONiC interface name to alias conversion
131136
iface_alias_converter = lazy_object_proxy.Proxy(lambda: clicommon.InterfaceAliasConverter())
132137

@@ -1229,8 +1234,25 @@ def runningconfiguration():
12291234
@click.option('--verbose', is_flag=True, help="Enable verbose output")
12301235
def all(verbose):
12311236
"""Show full running configuration"""
1232-
cmd = "sonic-cfggen -d --print-data"
1233-
run_command(cmd, display_cmd=verbose)
1237+
cmd = ['sonic-cfggen', '-d', '--print-data']
1238+
stdout, rc = get_cmd_output(cmd)
1239+
if rc:
1240+
click.echo("Failed to get cmd output '{}':rc {}".format(cmd, rc))
1241+
raise click.Abort()
1242+
1243+
try:
1244+
output = json.loads(stdout)
1245+
except JSONDecodeError as e:
1246+
click.echo("Failed to load output '{}':{}".format(cmd, e))
1247+
raise click.Abort()
1248+
1249+
if not multi_asic.is_multi_asic():
1250+
bgpraw_cmd = [constants.RVTYSH_COMMAND, '-c', 'show running-config']
1251+
bgpraw, rc = get_cmd_output(bgpraw_cmd)
1252+
if rc:
1253+
bgpraw = ""
1254+
output['bgpraw'] = bgpraw
1255+
click.echo(json.dumps(output, indent=4))
12341256

12351257

12361258
# 'acl' subcommand ("show runningconfiguration acl")

tests/show_test.py

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import os
2+
import sys
3+
import show.main as show
4+
from click.testing import CliRunner
5+
from unittest import mock
6+
from unittest.mock import call, MagicMock
7+
8+
test_path = os.path.dirname(os.path.abspath(__file__))
9+
modules_path = os.path.dirname(test_path)
10+
sys.path.insert(0, test_path)
11+
sys.path.insert(0, modules_path)
12+
13+
14+
class TestShowRunAllCommands(object):
15+
@classmethod
16+
def setup_class(cls):
17+
print("SETUP")
18+
os.environ["UTILITIES_UNIT_TESTING"] = "1"
19+
20+
def test_show_runningconfiguration_all_json_loads_failure(self):
21+
def get_cmd_output_side_effect(*args, **kwargs):
22+
return "", 0
23+
with mock.patch('show.main.get_cmd_output',
24+
mock.MagicMock(side_effect=get_cmd_output_side_effect)) as mock_get_cmd_output:
25+
result = CliRunner().invoke(show.cli.commands['runningconfiguration'].commands['all'], [])
26+
assert result.exit_code != 0
27+
28+
def test_show_runningconfiguration_all_get_cmd_ouput_failure(self):
29+
def get_cmd_output_side_effect(*args, **kwargs):
30+
return "{}", 2
31+
with mock.patch('show.main.get_cmd_output',
32+
mock.MagicMock(side_effect=get_cmd_output_side_effect)) as mock_get_cmd_output:
33+
result = CliRunner().invoke(show.cli.commands['runningconfiguration'].commands['all'], [])
34+
assert result.exit_code != 0
35+
36+
def test_show_runningconfiguration_all(self):
37+
def get_cmd_output_side_effect(*args, **kwargs):
38+
return "{}", 0
39+
with mock.patch('show.main.get_cmd_output',
40+
mock.MagicMock(side_effect=get_cmd_output_side_effect)) as mock_get_cmd_output:
41+
result = CliRunner().invoke(show.cli.commands['runningconfiguration'].commands['all'], [])
42+
assert mock_get_cmd_output.call_count == 2
43+
assert mock_get_cmd_output.call_args_list == [
44+
call(['sonic-cfggen', '-d', '--print-data']),
45+
call(['rvtysh', '-c', 'show running-config'])]
46+
47+
@classmethod
48+
def teardown_class(cls):
49+
print("TEARDOWN")
50+
os.environ["PATH"] = os.pathsep.join(os.environ["PATH"].split(os.pathsep)[:-1])
51+
os.environ["UTILITIES_UNIT_TESTING"] = "0"

0 commit comments

Comments
 (0)