Skip to content

Feature/auto completion cli #986

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
511 changes: 179 additions & 332 deletions poetry.lock

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ prompt-toolkit = ">2"
pyarrow = "~11.0"
pandas = "~1.5"
PyYAML = "*"
python-nubia = "0.2b5"
uvloop = "*"
networkx = "~2.4"
matplotlib = "~3.7"
Expand All @@ -42,19 +41,20 @@ dateparser = "~1.1"
natsort = "^8.0.0"
colorama = "^0.4.4"
tzlocal = "< 3.0"
pyparsing = ">=2.2.0, <3.0"
pyparsing = ">=3.1, <3.2"
xmltodict = "~0.12.0"
streamlit-aggrid = "~0.2.2"
ciscoconfparse = "~1.6.21"
notebook = "6.4.12"
urllib3 = "~1.26.12"
packaging = "~21.3"
psutil = "~5.9.4"
jellyfish = "~0.10"
jellyfish = ">=1.0,<1.1"
altair = '>3.2, <5.0'
pydantic = '< 2.0'
numpy = '~1.20'
pyvmomi = "^8.0.2.0.1"
nubia-cli = "^0.2.5"

[tool.poetry.dev-dependencies]
pylint = "*"
Expand Down
26 changes: 13 additions & 13 deletions suzieq/cli/sq_nubia_context.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import sys

from nubia import context
from nubia import exceptions
from nubia import eventbus
from nubia import context, exceptions, eventbus

from suzieq.shared.utils import load_sq_config, print_version
from suzieq.shared.schema import Schema
Expand All @@ -16,13 +13,12 @@ def __init__(self):
self.ctxt = None
super().__init__()

def on_connected(self, *args, **kwargs):
async def on_connected(self, *args, **kwargs):
if self._args.V:
print_version()
sys.exit(0)
if self._args.config:
cfg = load_sq_config(validate=True,
config_file=self._args.config)
cfg = load_sq_config(validate=True, config_file=self._args.config)
else:
cfg = load_sq_config(validate=True)

Expand All @@ -31,22 +27,26 @@ def on_connected(self, *args, **kwargs):
print('Create a suzieq-cfg.yml under the homedir or current dir')
print('OR pass a path to the config file via -c argument')
sys.exit(1)

self.ctxt = SqContext(cfg=cfg)
self.ctxt.schemas = Schema(self.ctxt.cfg["schema-directory"])

def on_cli(self, cmd, args):
# dispatch the on connected message
self.registry.dispatch_message(eventbus.Message.CONNECTED)
async def on_cli(self, cmd, args):
await self.registry.dispatch_message(eventbus.Message.CONNECTED)

async def on_interactive(self, args):
cmd = self._registry.find_command("connect")
if not cmd:
raise exceptions.CommandError("Connect command not found")

def on_interactive(self, args):
ret = self._registry.find_command("connect").run_cli(args)
ret = await cmd.run_cli(args)
if ret:
raise exceptions.CommandError("Failed starting interactive mode")
# dispatch the on connected message

def change_engine(self, engine: str):
'''Change the backend engine'''
if engine == self.ctxt.engine:
if self.ctxt and engine == self.ctxt.engine:
return

self.ctxt.engine = engine
4 changes: 3 additions & 1 deletion suzieq/cli/sqcmds/AddressCmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.address import AddressObj
import suzieq.cli.sqcmds.sq_completions as completitions


@argument("vrf",
description="VRF(s), space separated")
description="VRF(s), space separated",
choices=completitions.vrf_completer)
@argument("type", description="Interface type(s), space separated")
@argument("ifname", description="Interface name(s), space separated")
@argument("ipvers",
Expand Down
6 changes: 4 additions & 2 deletions suzieq/cli/sqcmds/BgpCmd.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import time
from datetime import timedelta
from nubia import command

import pandas as pd
from nubia import command

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.bgp import BgpObj


@command("bgp", help="Act on BGP data")
@argument("vrf", description="VRF(s), space separated")
@argument("vrf", description="VRF(s), space separated",
choices=completitions.vrf_completer)
@argument("state", description="status of the session to match",
choices=["Established", "NotEstd", "dynamic"])
@argument("peer",
Expand Down
7 changes: 5 additions & 2 deletions suzieq/cli/sqcmds/EvpnVniCmd.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import time

from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.evpnVni import EvpnvniObj


@command("evpnVni", help="Act on EVPN VNI data")
@argument("vni", description="VNI ID(s), space separated")
@argument("vni", description="VNI ID(s), space separated",
choices=completitions.vni_completer)
@argument("priVtepIp", description="Primary VTEP IP(s), space separated")
class EvpnVniCmd(SqTableCommand):
"""EVPN information such as VNI/VLAN mapping, VTEP IPs etc."""
Expand Down
10 changes: 6 additions & 4 deletions suzieq/cli/sqcmds/InterfaceCmd.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import time

from nubia import command
import pandas as pd
from nubia import command

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.sqobjects import get_sqobject
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects import get_sqobject


@command("interface", help="Act on Interface data")
Expand All @@ -14,7 +15,8 @@
@argument("vrf", description="VRF(s), space separated")
@argument("portmode", description="Portmode(s), space separated")
@argument("vlan", description="Vlan(s), space separated")
@argument("vrf", description="VRF(s), space separated")
@argument("vrf", description="VRF(s), space separated",
choices=completitions.vrf_completer)
@argument("state", description="interface state to qualify show",
choices=["up", "down", "notConnected", "!up", "!down",
"!notConnected"])
Expand Down Expand Up @@ -77,7 +79,7 @@ def __init__(
@argument(
"what",
description="What do you want to assert",
choices=["mtu-value"],
choices=completitions.column_name_completer
)
@argument("value", description="Value to match against")
@argument("result", description="Show only assert that matches this value",
Expand Down
7 changes: 4 additions & 3 deletions suzieq/cli/sqcmds/InventoryCmd.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import re

from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.inventory import InventoryObj


@command("inventory", help="Act on inventory data")
@argument("type", description="Filter by type",
choices=["fan", "power", "xcvr", "supervisor", "port-adapter",
"linecard", "fabric", "midplane", "mx-cb"])
choices=completitions.inv_type_completer)
@argument("status", description="Filter by status",
choices=['present', 'absent'])
@argument("model", description="Filter by model")
Expand Down
4 changes: 3 additions & 1 deletion suzieq/cli/sqcmds/MacCmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.macs import MacsObj
import suzieq.cli.sqcmds.sq_completions as completitions


@command("mac", help="Act on MAC Table data")
@argument("vlan", description="VLAN(s). space separated")
@argument("vlan", description="VLAN(s). space separated",
choices=completitions.vlan_completer)
@argument("macaddr",
description="MAC address(es), in quotes, space separated")
@argument("remoteVtepIp",
Expand Down
6 changes: 4 additions & 2 deletions suzieq/cli/sqcmds/OspfCmd.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import time

from nubia import command
import pandas as pd
from nubia import command

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.ospf import OspfObj
Expand All @@ -13,7 +14,8 @@
"ifname",
description="Interface name(s), space separated"
)
@argument("vrf", description="VRF(s), space separated")
@argument("vrf", description="VRF(s), space separated",
choices=completitions.vrf_completer)
@argument("area", description="Area(s), space separated")
@argument("state", description="Select view based on OSPF state",
choices=["full", "other", "passive", "!full", "!passive",
Expand Down
6 changes: 4 additions & 2 deletions suzieq/cli/sqcmds/PathCmd.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.path import PathObj


@command("path", help="build and act on path data")
@argument("src", description="Source IP address, in quotes")
@argument("dest", description="Destination IP address, in quotes")
@argument("vrf", description="VRF to trace path in")
@argument("vrf", description="VRF to trace path in",
choices=completitions.vrf_completer)
class PathCmd(SqTableCommand):
"""Path trace information including overlay and underlay"""

Expand Down
13 changes: 8 additions & 5 deletions suzieq/cli/sqcmds/RouteCmd.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
import time
import ipaddress
import pandas as pd
import time

import pandas as pd
from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.routes import RoutesObj


@command("route", help="Act on Routes")
@argument("vrf", description="VRF(s), space separated")
@argument("protocol", description="Routing protocol(s), space separated")
@argument("vrf", description="VRF(s), space separated",
choices=completitions.vrf_completer)
@argument("protocol", description="Routing protocol(s), space separated",
choices=completitions.route_proto_completer)
@argument("prefix", description="Prefix(es), in quotes, space separated")
@argument("prefixlen", description="must be of the form "
"[<|<=|>=|>|!] length")
Expand Down
6 changes: 4 additions & 2 deletions suzieq/cli/sqcmds/SqPollerCmd.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.sqPoller import SqPollerObj


@command("sqPoller", help="Act on SqPoller data")
@argument("service", description="Service(s), space separated")
@argument("service", description="Service(s), space separated",
choices=completitions.service_completer)
@argument("status", description="status of service to match",
choices=["all", "pass", "fail"])
@argument('poll_period_exceeded',
Expand Down
12 changes: 7 additions & 5 deletions suzieq/cli/sqcmds/TopologyCmd.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.topology import TopologyObj

Expand All @@ -12,13 +13,14 @@
@argument("via",
description="Protocol(s) via which nodes are connected, "
"space separated")
@argument("vrf", description="VRF(s), space separated")
@argument("vrf", description="VRF(s), space separated",
choices=completitions.vrf_completer)
@argument("asn", description="BGP ASN(s), space separated")
@argument("area", description="OSPF Area(s), space separated")
@argument("afiSafi", description="BGP AFI SAFI lens to filter the topology")
@ argument("peerHostname",
description="Peer hostname(s), space separated, "
"space separated")
@argument("peerHostname",
description="Peer hostname(s), space separated, "
"space separated")
class TopologyCmd(SqTableCommand):
"""Information about the topology constructed from various protocols"""

Expand Down
6 changes: 4 additions & 2 deletions suzieq/cli/sqcmds/VlanCmd.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from nubia import command
from suzieq.cli.nubia_patch import argument

import suzieq.cli.sqcmds.sq_completions as completitions
from suzieq.cli.nubia_patch import argument
from suzieq.cli.sqcmds.command import SqTableCommand
from suzieq.sqobjects.vlan import VlanObj

Expand All @@ -9,7 +10,8 @@
@argument("state", description="State of VLAN to query",
choices=['active', 'suspended'])
@argument("vlan",
description="VLAN(s), space separated, can use <, >, <=, >=, !")
description="VLAN(s), space separated, can use <, >, <=, >=, !",
choices=completitions.vlan_completer)
@argument('vlanName',
description="VLAN name(s), space separated")
class VlanCmd(SqTableCommand):
Expand Down
Loading
Loading