From da263874e8ead286cb7e4efb2f61d3d33b1bae55 Mon Sep 17 00:00:00 2001 From: ttafsir Date: Fri, 14 Jan 2022 15:12:44 -0500 Subject: [PATCH] 0.2.0 * add flake8 and editor configs * adds pytest config * cleanup / reformat with Black * Initial documentation * removes extraneous methods and interface(s) (#43) * create requirements files and move from poetry (#44) * create requirements files and move from poetry * Adds pre-commit * Issue 46 update api module to use updated client * Add API object on Client Init * clean up and refactor * Fix upload test * Fix linting * get_node_by_name not working Fixes #48 (#49) Fixes #48 * provides more meaning messages in Exceptions based on returned JSON messages * pulls response data from `data` key for node search * refactors p2p & network links for topology builder (#51) * Add missing `port` option to client. (#54) Fixes #53 * Issue55-fix-lab_commands (#56) * clean up * fix api responses for lab commands * fix lab export command * remove inventory command * Fix Linting * Issue55 fix lab commands (#57) * clean up * fix api responses for lab commands * fix lab export command * remove inventory command * Fix Linting * clean up print statement * clean up * Adds overides for create-issue-branch (#60) * Issue 61 fix node commands (#64) * refactor api response parsing to list labs * rename nodes -> node and fix api response parsing * fix missing delete_node method * lint: remove unused import * Ttafsir/issue65_fix-system-commands (#66) * fix system commands * Adds tests * fix failing tests (#68) Fixes #67 * refactor-text-based-output * update requirements * Adds console module to manage cli output * refactor text based cli output * Adds import lab feature * refactor-table-based-output * update table display to use rich table * update CLI commands for updated table display * Add error handling for empty node list * Add topology schema * Adds jsonschema * Adds initial topology schema * Adds Topology File builder * Adds `configuration` to node schema * Adds topology builder * Adds startup-config retrieval * Adds status for long running commands * update docs and build scripts * Updates setup scripts and update docs * Adds publish workflow --- .editorconfig | 4 +- .github/issue-branch.yml | 11 + .github/workflows/publish.yml | 32 ++ MANIFEST.in | 3 + README.md | 362 +++++++++++-- cli-output.png | Bin 0 -> 490350 bytes docs/conf.py | 4 +- examples/configs/test_leaf01.cfg | 2 + examples/data/leaf03.yml | 3 + examples/templates/base.j2 | 34 ++ examples/test_topology.yml | 74 +++ requirements-dev.txt | 72 ++- requirements.in | 3 +- requirements.txt | 40 +- setup.py | 40 +- src/evengsdk/__init__.py | 1 + src/evengsdk/api.py | 505 +++++++++-------- src/evengsdk/cli/cli.py | 16 +- src/evengsdk/cli/common.py | 25 + src/evengsdk/cli/console.py | 81 +++ src/evengsdk/cli/folders/commands.py | 53 +- src/evengsdk/cli/lab/commands.py | 500 +++++++++-------- src/evengsdk/cli/lab/group.py | 159 ------ src/evengsdk/cli/lab/topology.py | 100 ++++ src/evengsdk/cli/node/__init__.py | 7 +- src/evengsdk/cli/node/commands.py | 323 +++++++++++ src/evengsdk/cli/node/group.py | 119 ---- src/evengsdk/cli/nodes/__init__.py | 5 - src/evengsdk/cli/nodes/commands.py | 343 ------------ src/evengsdk/cli/system/commands.py | 214 ++++---- src/evengsdk/cli/utils.py | 5 +- src/evengsdk/cli/version.py | 2 +- src/evengsdk/client.py | 209 ++++---- src/evengsdk/exceptions.py | 6 +- src/evengsdk/inventory.py | 17 - src/evengsdk/plugins/display.py | 109 ++-- src/evengsdk/schemas/__init__.py | 0 src/evengsdk/schemas/lab-schema.json | 507 ++++++++++++++++++ src/evengsdk/schemas/validator.py | 16 + src/evengsdk/templates.py | 91 ++-- src/tests/conftest.py | 4 +- src/tests/data/topology_empty_lab_name.yaml | 64 +++ src/tests/data/topology_lab_tests.yaml | 195 +++++++ src/tests/data/topology_missing_lab_name.yaml | 63 +++ src/tests/data/topology_node_tests.yaml | 328 +++++++++++ src/tests/test_api.py | 94 ++-- src/tests/test_api_lab.py | 12 +- src/tests/test_api_network.py | 13 +- src/tests/test_cli.py | 196 ++----- src/tests/test_cli_node.py | 137 +++++ src/tests/test_cli_system.py | 105 ++++ src/tests/test_client.py | 47 +- src/tests/test_topology_schemas.py | 112 ++++ 53 files changed, 3740 insertions(+), 1727 deletions(-) create mode 100644 .github/issue-branch.yml create mode 100644 .github/workflows/publish.yml create mode 100644 MANIFEST.in create mode 100644 cli-output.png create mode 100644 examples/configs/test_leaf01.cfg create mode 100644 examples/data/leaf03.yml create mode 100644 examples/templates/base.j2 create mode 100644 examples/test_topology.yml create mode 100644 src/evengsdk/cli/common.py create mode 100644 src/evengsdk/cli/console.py delete mode 100644 src/evengsdk/cli/lab/group.py create mode 100644 src/evengsdk/cli/lab/topology.py create mode 100644 src/evengsdk/cli/node/commands.py delete mode 100644 src/evengsdk/cli/node/group.py delete mode 100644 src/evengsdk/cli/nodes/__init__.py delete mode 100644 src/evengsdk/cli/nodes/commands.py delete mode 100644 src/evengsdk/inventory.py create mode 100644 src/evengsdk/schemas/__init__.py create mode 100644 src/evengsdk/schemas/lab-schema.json create mode 100644 src/evengsdk/schemas/validator.py create mode 100644 src/tests/data/topology_empty_lab_name.yaml create mode 100644 src/tests/data/topology_lab_tests.yaml create mode 100644 src/tests/data/topology_missing_lab_name.yaml create mode 100644 src/tests/data/topology_node_tests.yaml create mode 100644 src/tests/test_cli_node.py create mode 100644 src/tests/test_cli_system.py create mode 100644 src/tests/test_topology_schemas.py diff --git a/.editorconfig b/.editorconfig index d4a2c44..052d06d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,12 +4,14 @@ root = true [*] indent_style = space -indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf +[*.py] +indent_size = 4 + [*.bat] indent_style = tab end_of_line = crlf diff --git a/.github/issue-branch.yml b/.github/issue-branch.yml new file mode 100644 index 0000000..56513cb --- /dev/null +++ b/.github/issue-branch.yml @@ -0,0 +1,11 @@ +# create-issue-branch bot settings +# By default the app comments on the issue after creating a branch. +silent: true + +# This app can close issues automatically for you when a pull request for +# an issue branch is merged. You can enable this feature with: +autoCloseIssue: true + +# You can override the source branch (by default the "default branch" of the repository is used) +# in the configuration like this: +defaultBranch: 'develop' diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..11e2288 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,32 @@ +name: Publish Python Package + +on: + release: + types: [created] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.9' + - uses: actions/cache@v2 + name: Configure pip caching + with: + path: ~/.cache/pip + key: ${{ runner.os }}-publish-pip-${{ hashFiles('**/setup.py') }} + restore-keys: | + ${{ runner.os }}-publish-pip- + - name: Install dependencies + run: | + pip install setuptools wheel twine + - name: Publish to PyPI + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} + run: | + python -m build + twine upload dist/* diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..8dad306 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include README.md + +include src/evengsdk/schemas/lab-schema.json diff --git a/README.md b/README.md index 7456fa5..f9f39cd 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,205 @@ # evengsdk -Python SDK and command line utilities to work with the [EVE-NG](https://www.eve-ng.net/) [REST API](https://www.eve-ng.net/index.php/documentation/howtos/how-to-eve-ng-api/) . +Open source library and command line utilities to work with the [EVE-NG](https://www.eve-ng.net/) [REST API](https://www.eve-ng.net/index.php/documentation/howtos/how-to-eve-ng-api/) . -* [Rest API Client ](#developing-with-the-evengclient) - Python client library for managing Eve-NG Server -* [EVE-NG CLI application](#using-eve-ng-cli-application) - `Click` based CLI application to interact with the EVE-NG [REST API](https://www.eve-ng.net/index.php/documentation/howtos/how-to-eve-ng-api/) via the command-line +Evegnsdk allows you to quickly builds network topologies in EVE-NG for testing and developing. The CLI tool also enables you quickly integrate EVE-NG into you CI/CD toolset for automated testing and validation. ## Requirements * Python 3.8+ * An EVE-NG instance -## :rocket:Getting Started +## :rocket:Installation -1. Clone this repository +You can install `evengsdk` using pip ```sh -git clone https://github.com/ttafsir/evengsdk +pip install evegnsdk ``` -2. Create a Python virtual environment and install dependencies +## Basic Usage -```sh -cd evengsdk -rm -rf .venv -python -m venv .venv -pip install -r requirements.txt -``` - -3. Install the CLI application (optional) - -```sh -python3 setup.py install -``` - -## Developing with the `EvengClient` - -### The `EvengClient` REST client +You can interact with the EVE-NG API through the `client.api` interface ```python >>> from evengsdk.client import EvengClient ->>> client = EvengClient('10.246.32.119') +>>> from pprint import pprint >>> ->>> client.login(username='admin', password='eve') ->>> client.get('/status') -{'version': '2.0.3-112', 'qemu_version': '2.4.0', 'uksm': 'enabled', 'ksm': 'unsupported', 'cpulimit': 'enabled', 'cpu': 0, 'disk' -: 16, 'cached': 96, 'mem': 6, 'swap': 0, 'iol': 0, 'dynamips': 0, 'qemu': 1, 'docker': 0, 'vpcs': 0} +>>> client = EvengClient("10.246.32.254", log_file="test.log") +>>> client.login(username="admin", password="eve") +>>> +>>> resp = client.api.list_node_templates() +>>> pprint(resp.get("data")) +{'a10': 'A10 vThunder.missing', + 'acs': 'Cisco ACS.missing', + 'aruba': 'Aruba WiFi Controller.missing', + 'arubacx': 'Aruba OS-CX Virtual Switch.missing', + 'asa': 'Cisco ASA.missing', + 'asav': 'Cisco ASAv', + 'bigip': 'F5 BIG-IP LTM VE', + 'cumulus': 'Cumulus VX', + 'infoblox': 'Infoblox IPAM', + 'iol': 'Cisco IOL.missing', + 'ise': 'Cisco ISE.missing', + + + + 'linux': 'Linux', + 'mikrotik': 'MikroTik RouterOS.missing', + 'nsx': 'VMWare NSX.missing', + 'nxosv9k': 'Cisco NX-OSv 9K', + 'olive': 'Juniper Olive.missing', + 'ostinato': 'Ostinato', + 'osx': 'Apple OSX.missing', + 'paloalto': 'Palo Alto.missing', + 'pfsense': 'pfSense Firewall.missing', + 'vcenter': 'VMWare vCenter.missing', + 'vios': 'Cisco vIOS Router', + 'viosl2': 'Cisco vIOS Switch', + 'vmx': 'Juniper vMX.missing', + 'vwlc': 'Cisco vWLC.missing', + 'vyos': 'VyOS', + 'win': 'Windows.missing', + 'winserver': 'Windows Server.missing', + 'xrv': 'Cisco XRv.missing', + 'xrv9k': 'Cisco XRv 9000.missing'} >>> ``` -### Using the client's API wrapper +#### Example: Build a Lab ```python ->>> # using the API wrapper on the client ->>> client.api.get_server_status() -{'version': '2.0.3-112', 'qemu_version': '2.4.0', 'uksm': 'enabled', 'ksm': 'unsupported', 'cpulimit': 'enabled', 'cpu': 1, 'di -sk': 16, 'cached': 96, 'mem': 6, 'swap': 0, 'iol': 0, 'dynamips': 0, 'qemu': 1, 'docker': 0, 'vpcs': 0} ->>> ->>> # create lab using the API wrapper object ->>> lab = { -... 'name': 'TestLab', -... 'path': '/', -... 'description': 'short description', -... 'version': '1', -... 'body': 'longer description' -... } ->>> client.api.create_lab(**lab) -{'code': 200, 'status': 'success', 'message': 'Lab has been created (60019).'} +from evengsdk.client import EvengClient + + +client = EvengClient("10.246.32.254", log_file="test.log") +client.login(username="admin", password="eve") +client.set_log_level("DEBUG") + +# create a lab +lab = {"name": "test_lab", "description": "Test Lab", "path": "/"} +resp = client.api.create_lab(**lab) +if resp['status'] == "success": + print("lab created successfully.") + +# we need the lab path to create objects in the lab +lab_path = f"{lab['path']}{lab['name']}.unl" + +# create management network +mgmt_cloud = {"name": "eve-mgmt", "network_type": "pnet1"} +client.api.add_lab_network(lab_path, **mgmt_cloud) + +# create Nodes +nodes = [ + {"name": "leaf01", "template": "veos", "image": "veos-4.22.0F", "left": 50}, + {"name": "leaf02", "template": "veos", "image": "veos-4.22.0F", "left": 200}, +] +for node in nodes: + client.api.add_node(lab_path, **node) + +# connect nodes to management network +mgmt_connections = [ + {"src": "leaf01", "src_label": "Mgmt1", "dst": "eve-mgmt"}, + {"src": "leaf02", "src_label": "Mgmt1", "dst": "eve-mgmt"} +] +for link in mgmt_connections: + client.api.connect_node_to_cloud(lab_path, **link) + +# create p2p links +p2p_links = [ + {"src": "leaf01", "src_label": "Eth1", "dst": "leaf02", "dst_label": "Eth1"}, + {"src": "leaf01", "src_label": "Eth1", "dst": "leaf02", "dst_label": "Eth2"}, +] +for link in p2p_links: + client.api.connect_node_to_node(lab_path, **link) + +client.logout() ``` +## API Wrapper Methods + +
+System + +* `get_server_status` +* `node_template_detail` +* `list_node_templates` +* `list_user_roles` +* `list_networks` + +
+ +
+Users + +* `list_users` +* `add_user` +* `get_user` +* `edit_user` +* `delete_user` + +
+ +
+Labs + +* `get_lab` +* `create_lab` +* `delete_lab ` +* `edit_lab` +* `lock_lab` +* `unlock_lab` +* `export_lab` +* `import_lab` + +
+ +
+Nodes + +* `list_nodes` +* `add_node` +* `get_node` +* `get_node_by_name` +* `delete_node` +* `node_exists` +* `get_node_config_by_id` +* `get_node_configs` +* `get_node_interfaces` +* `export_node` +* `export_all_nodes` +* `start_all_nodes` +* `start_node` +* `stop_all_nodes` +* `stop_node` +* `upload_node_config` +* `wipe_all_nodes` +* `wipe_node` +* `connect_node_to_cloud` +* `connect_node_to_node` + +
+ +
+Lab Networks + +* `add_lab_network` +* `edit_lab_network` +* `delete_lab_network` +* `get_lab_network` +* `get_lab_network_by_name` +* `get_lab_topology` +* `list_lab_networks` + +
+ +
+Folders + +* `get_folder` +* `list_folders` + +
+ ## Using `eve-ng` CLI application @@ -76,24 +209,55 @@ The CLI application provides an interface to manage EVE-NG objects including: * `Labs` - manage labs and objects inside labs (nodes, networks, links, etc) * nodes * networks - * links - * pictures - * Links * `Users` - manage system users * `System` - View system status and resources (node templates, network types, user roles, etc..) -

- ![CLI](./docs/images/eve_cli.svg) -

+## The `eve-ng` CLI Application + +The CLI application makes it very simple to quick work with EVE-NG, especially in situation where you would like to automate lab builds and testing using CI/CD. + +```zsh +➜ eveng --help +Usage: eveng [OPTIONS] COMMAND [ARGS]... + + CLI application to manage EVE-NG objects + +Options: + --host TEXT [required] + --username TEXT [default: (current user); required] + --password TEXT [required] + --port INTEGER HTTP port to connect to. Default is 80 + --debug / --no-debug Enables or disables debug mode. + -v, --verbose Enables verbosity. + --help Show this message and exit. + +Commands: + folder folder sub commands + lab lab sub commands + list-network-types list EVE-NG network types + list-node-templates list EVE-NG node templates + list-user-roles list EVE-NG user roles + node node sub commands + show-status View EVE-NG server status + show-template get EVE-NG node template details + user user sub commands + version display library version +``` + +### CLI sample output + +![image-20220114112752004](./cli-output.png) + ## :gear: Configuration It is simple enough to pass the proper flags to `eve-ng` specify details for your EVE-NG host. However, you may also pass the connection details as environment variables. You can set the following `evengsdk` environment variables: -* `EVE_NG_HOST` -* `EVE_NG_USERNAME` -* `EVE_NG_PASSWORD` +* `EVE_NG_HOST ` - EVE-NG host name or IP address +* `EVE_NG_USERNAME` - EVE-NG username +* `EVE_NG_PASSWORD ` EVE-NG API/GUI password +* `EVE_NG_LAB_PATH` - EVE-NG default lab path. Ex. `/myLab.unl` You may set the variables and export them to your shell environment. You can also define your environment variables in a `.env` folder that will automatically be sourced. The example. below shows the contents of a `.env` file that will permit you to both source the file and automatically load the variables as needed. @@ -103,3 +267,95 @@ export EVE_NG_USERNAME=admin export EVE_NG_PASSWORD=eve export EVE_NG_LAB_PATH='/datacenter/leaf_spine_lab.unl' ``` + + + +## IaC / CICD + +The CLI application allows you to build lab topologies using a declarative model in order to quickly spin a lab and configure nodes using configuration files or jinja templates. Below is a sample topology that is the `examples` directory of this project. + +```yaml +--- + name: test + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + configuration: + file: examples/configs/test_leaf01.cfg + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + configuration: + template: base.j2 + vars: + hostname: leaf02 + management_address: 10.10.10.1 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + configuration: + template: base.j2 + vars: examples/data/leaf03.yml + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + +``` + +To create a topology from the example above simply run the following command + +```sh +eve-ng lab create-from-topology -t examples/test_topology.yml --template-dir examples/templates +``` + +By default, the configuration tool searches for templates in `templates` directory, but you can use `--template-dir` as shown above to specify another location. diff --git a/cli-output.png b/cli-output.png new file mode 100644 index 0000000000000000000000000000000000000000..2732b319d495c398376c0479a329a32bb2ef92ee GIT binary patch literal 490350 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 LiG?cej7>#|MM#z|y{PlL|Y=pvDpWeGE{5 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%0AbxXsdHJ)78wWE+*ZNB_{*>EYVUg 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%0D}OYT8DgXuM=w(s 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�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 /mnt/flash/zerotouch-config +{% if hostname is defined and hostname %} +hostname {{ hostname }} +{% else %} +hostname ztp-{{ management_address }} +{% endif %} +! +no aaa root +! +username admin privilege 15 secret Arista123! +username cvpadmin privilege 15 secret Arista123! +! +vrf definition management + description management vrf +! +{% if management_address is defined and management_address %} +interface Management1 + description MANAGEMENT + vrf forwarding management + ip address {{ management_address }} {{subnet_mask}} +! +{% endif %} +ip route vrf management 0.0.0.0/0 {{ gateway }} +! +no ip routing +no ip routing vrf management +! +management api http-commands + no shutdown + ! + vrf management + no shutdown +! +end diff --git a/examples/test_topology.yml b/examples/test_topology.yml new file mode 100644 index 0000000..39dc350 --- /dev/null +++ b/examples/test_topology.yml @@ -0,0 +1,74 @@ +--- + name: test + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + configuration: + file: examples/configs/test_leaf01.cfg + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + configuration: + template: base.j2 + vars: + hostname: leaf02 + management_address: 10.10.10.1 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + configuration: + template: base.j2 + vars: examples/data/leaf03.yml + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} diff --git a/requirements-dev.txt b/requirements-dev.txt index 97c4d13..2f3100e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,8 +4,15 @@ # # pip-compile requirements-dev.in # -attrs==21.2.0 - # via pytest +arrow==1.2.1 + # via + # -r requirements.txt + # isoduration +attrs==21.4.0 + # via + # -r requirements.txt + # jsonschema + # pytest backports.entry-points-selectable==1.1.1 # via virtualenv black==21.12b0 @@ -24,22 +31,45 @@ click==8.0.3 # via # -r requirements.txt # black +colorama==0.4.4 + # via + # -r requirements.txt + # rich +commonmark==0.9.1 + # via + # -r requirements.txt + # rich distlib==0.3.4 # via virtualenv filelock==3.4.2 # via virtualenv flake8==4.0.1 # via -r requirements-dev.in +fqdn==1.5.1 + # via + # -r requirements.txt + # jsonschema identify==2.4.0 # via pre-commit idna==3.3 # via # -r requirements.txt + # jsonschema # requests iniconfig==1.1.1 # via pytest +isoduration==20.11.0 + # via + # -r requirements.txt + # jsonschema jinja2==3.0.3 # via -r requirements.txt +jsonpointer==2.2 + # via + # -r requirements.txt + # jsonschema +jsonschema[format]==4.3.3 + # via -r requirements.txt markupsafe==2.0.1 # via # -r requirements.txt @@ -68,10 +98,22 @@ pycodestyle==2.8.0 # via flake8 pyflakes==2.4.0 # via flake8 +pygments==2.11.2 + # via + # -r requirements.txt + # rich pyparsing==3.0.6 # via packaging +pyrsistent==0.18.0 + # via + # -r requirements.txt + # jsonschema pytest==6.2.5 # via -r requirements-dev.in +python-dateutil==2.8.2 + # via + # -r requirements.txt + # arrow python-dotenv==0.19.2 # via -r requirements.txt pyyaml==6.0 @@ -80,10 +122,22 @@ pyyaml==6.0 # pre-commit requests==2.26.0 # via -r requirements.txt -six==1.16.0 - # via virtualenv -tabulate==0.8.9 +rfc3339-validator==0.1.4 + # via + # -r requirements.txt + # jsonschema +rfc3987==1.3.8 + # via + # -r requirements.txt + # jsonschema +rich==10.16.2 # via -r requirements.txt +six==1.16.0 + # via + # -r requirements.txt + # python-dateutil + # rfc3339-validator + # virtualenv toml==0.10.2 # via # pre-commit @@ -92,9 +146,17 @@ tomli==1.2.3 # via black typing-extensions==4.0.1 # via black +uri-template==1.1.0 + # via + # -r requirements.txt + # jsonschema urllib3==1.26.7 # via # -r requirements.txt # requests virtualenv==20.10.0 # via pre-commit +webcolors==1.11.1 + # via + # -r requirements.txt + # jsonschema diff --git a/requirements.in b/requirements.in index 0d8724e..fa03541 100644 --- a/requirements.in +++ b/requirements.in @@ -1,6 +1,7 @@ click requests>=2.20.0 -tabulate python-dotenv pyyaml jinja2 +rich +jsonschema[format] diff --git a/requirements.txt b/requirements.txt index 57d52bd..322ba3e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,25 +4,61 @@ # # pip-compile requirements.in # +arrow==1.2.1 + # via isoduration +attrs==21.4.0 + # via jsonschema certifi==2021.10.8 # via requests charset-normalizer==2.0.9 # via requests click==8.0.3 # via -r requirements.in +colorama==0.4.4 + # via rich +commonmark==0.9.1 + # via rich +fqdn==1.5.1 + # via jsonschema idna==3.3 - # via requests + # via + # jsonschema + # requests +isoduration==20.11.0 + # via jsonschema jinja2==3.0.3 # via -r requirements.in +jsonpointer==2.2 + # via jsonschema +jsonschema[format]==4.3.3 + # via -r requirements.in markupsafe==2.0.1 # via jinja2 +pygments==2.11.2 + # via rich +pyrsistent==0.18.0 + # via jsonschema +python-dateutil==2.8.2 + # via arrow python-dotenv==0.19.2 # via -r requirements.in pyyaml==6.0 # via -r requirements.in requests==2.26.0 # via -r requirements.in -tabulate==0.8.9 +rfc3339-validator==0.1.4 + # via jsonschema +rfc3987==1.3.8 + # via jsonschema +rich==10.16.2 # via -r requirements.in +six==1.16.0 + # via + # python-dateutil + # rfc3339-validator +uri-template==1.1.0 + # via jsonschema urllib3==1.26.7 # via requests +webcolors==1.11.1 + # via jsonschema diff --git a/setup.py b/setup.py index 92017d1..c3a5fa1 100644 --- a/setup.py +++ b/setup.py @@ -1,28 +1,47 @@ +from pathlib import Path from setuptools import find_packages, setup -with open("README.md", "r") as f: - long_description = f.read() +README = (Path(__file__).parent / "README.md").read_text() REQUIRES = [ - "click", + "click>=7.1.1,<8.1.0", "requests>=2.20.0", - "tabulate", "python-dotenv", - "pyyaml", - "jinja2", + "pyyaml>=5.3,<7.0", + "Jinja2>=2.10.3,<3.1.0", + "rich==10.16.2", + "jsonschema==4.3.3", ] + +def get_version(): + global_vars = {} + exec(Path("src/evengsdk/cli/version.py").read_text(), global_vars) + return global_vars["__version__"] + + setup( name="evengsdk", - keywords="evengsdk", + keywords=["eve-ng", "eveng", "unetlab", "evengsdk"], license="MIT license", - version="0.1.1", + version=get_version(), author="Tafsir Thiam", author_email="ttafsir@gmail.com", + python_requires=">=3.7", + classifiers=[ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + ], description=( - "Python SDK and command line utilities to " "work with the EVE-NG REST API" + "Python SDK and command line utilities to work with the EVE-NG REST API" ), - long_description=long_description, + long_description=README, long_description_content_type="text/markdown", url="https://github.com/ttafsir/evengsdk", packages=find_packages("src"), @@ -34,4 +53,5 @@ "eveng=evengsdk.cli.cli:main", ], }, + include_package_data=True, ) diff --git a/src/evengsdk/__init__.py b/src/evengsdk/__init__.py index e69de29..767dbb3 100644 --- a/src/evengsdk/__init__.py +++ b/src/evengsdk/__init__.py @@ -0,0 +1 @@ +from evengsdk.cli.version import __version__ # noqa: F401 diff --git a/src/evengsdk/api.py b/src/evengsdk/api.py index b50bb58..b37c2ab 100644 --- a/src/evengsdk/api.py +++ b/src/evengsdk/api.py @@ -4,7 +4,7 @@ import json from pathlib import Path from random import randint -from typing import Dict, List, Tuple +from typing import Dict, Tuple, Literal, Optional, BinaryIO from urllib.parse import quote_plus NETWORK_TYPES = ["bridge", "ovs"] @@ -12,72 +12,58 @@ class EvengApi: - def __init__(self, clnt, timeout=30): + def __init__(self, client): """EVE-NG API wrapper object - :param clnt: the EvengClient object for managing REST calls - :type clnt: evengsdk.client.EvengClient + :param client: the EvengClient object for managing REST calls + :type client: evengsdk.client.EvengClient :param timeout: connection timeout in seconds, defaults to 30 :type timeout: int, optional """ - self.clnt = clnt - self.log = clnt.log - self.timeout = timeout + self.client = client + self.log = client.log self.version = None - self.session = clnt.session self.supports_multi_tenants = False def __repr__(self): - return "{}({})".format(self.__class__.__name__, self.session) + return "{}({})".format(self.__class__.__name__, self.client.session) - def get_server_status(self): - """Returns EVE-NG server status + def get_server_status(self) -> Dict: + """Returns EVE-NG server status""" + return self.client.get("/status") - :return: HTTP response object - """ - return self.clnt.get("/status") - - def list_node_templates(self, include_missing: bool = False): - """List available node templates from EVE-NG - - :param include_missing: include templates with missing images, - defaults to False - :type include_missing: bool, optional - :return: HTTP response object - """ - templates = self.clnt.get("/list/templates/") - if not include_missing: - templates = {k: v for k, v in templates.items() if "missing" not in v} - return templates + def list_node_templates(self) -> Dict: + """List available node templates from EVE-NG""" + return self.client.get("/list/templates/") - def node_template_detail(self, node_type: str): + def node_template_detail(self, node_type: str) -> Dict: """List details for single node template all available images for the selected template will be included in the output. - :param node_type: [description] + :param node_type: Node type name to retrieve details for :type node_type: str - :return: [description] - :rtype: [type] + :return: response dict + :rtype: str """ - return self.clnt.get(f"/list/templates/{node_type}") + return self.client.get(f"/list/templates/{node_type}") - def list_users(self): + def list_users(self) -> Dict: """Return list of EVE-NG users""" - return self.clnt.get("/users/") + return self.client.get("/users/") - def list_user_roles(self): + def list_user_roles(self) -> Dict: """Return user roles""" - return self.clnt.get("/list/roles") + return self.client.get("/list/roles") - def get_user(self, username: str): + def get_user(self, username: str) -> Dict: """get user details. Returns empty dictionary if the user does not exist. :param username: username to retrieve details for :type username: str """ - return self.clnt.get(f"/users/{username}") + return self.client.get(f"/users/{username}") def add_user( self, @@ -87,7 +73,7 @@ def add_user( name: str = "", email: str = "", expiration: str = "-1", - ): + ) -> Dict: """Add a new user in EVE-NG host :param username: a unique alphanumeric string used to login @@ -105,7 +91,7 @@ def add_user( or -1 if never expires, defaults to '-1' :type expiration: str, optional """ - return self.clnt.post( + return self.client.post( "/users", data=json.dumps( { @@ -119,7 +105,7 @@ def add_user( ), ) - def edit_user(self, username: str, data: dict = None): + def edit_user(self, username: str, data: dict = None) -> Dict: """Edit user details :param username: the user name for user to update @@ -131,36 +117,36 @@ def edit_user(self, username: str, data: dict = None): if not data: raise ValueError("data field is required.") - url = self.clnt.url_prefix + f"/users/{username}" + url = self.client.url_prefix + f"/users/{username}" existing_user = self.get_user(username) updated_user = {} if existing_user: updated_user = copy.deepcopy(existing_user) updated_user.update(data) - return self.clnt.put(url, data=json.dumps(updated_user)) + return self.client.put(url, data=json.dumps(updated_user)) - def delete_user(self, username: str): - return self.clnt.delete(f"/users/{username}") + def delete_user(self, username: str) -> Dict: + return self.client.delete(f"/users/{username}") - def list_networks(self): + def list_networks(self) -> Dict: """List network types""" - return self.clnt.get("/list/networks") + return self.client.get("/list/networks") - def list_folders(self): + def list_folders(self) -> Dict: """List all folders, including the labs contained within each""" - return self.clnt.get("/folders/") + return self.client.get("/folders/") - def get_folder(self, folder: str): + def get_folder(self, folder: str) -> Dict: """Return details for given folder. folders contain lab files. :param folder: path to folder on server. ex. my_lab_folder :type folder: str """ - return self.clnt.get(f"/folders/{folder}") + return self.client.get(f"/folders/{folder}") @staticmethod - def normalize_path(path: str): + def normalize_path(path: str) -> str: if not path.startswith("/"): path = "/" + path path = Path(path).resolve() @@ -172,19 +158,21 @@ def normalize_path(path: str): quoted_parts = [str(quote_plus(x)) for x in path.parts[1:]] # rejoin the path and return string - new_path = Path("/").joinpath(*quoted_parts).as_posix() + new_path = Path("/").joinpath(*quoted_parts) return str(new_path) - def get_lab(self, path: str): + def get_lab(self, path: str) -> Dict: """Return details for a single lab :param path: path to lab file(including parent folder) :type path: str """ url = "/labs" + self.normalize_path(path) - return self.clnt.get(url) + return self.client.get(url) - def export_lab(self, path: str, filename: str = "lab_export.zip"): + def export_lab( + self, path: str, filename: str = None + ) -> Tuple[bool, Optional[BinaryIO]]: """Export and download a lab as a .unl file :param path: the path of the lab (include parent folder) @@ -192,22 +180,51 @@ def export_lab(self, path: str, filename: str = "lab_export.zip"): :param filename: filename to save the export. defaults to 'lab_export.zip' :type filename: str, optional + :return: tuple of (success, file) """ lab_filepath = Path(path) payload = {"0": str(lab_filepath), "path": ""} - print(payload) + resp = self.client.post("/export", data=json.dumps(payload)) + zip_file_endpoint = resp.get("data", "") + zip_filename = zip_file_endpoint.split("/")[-1] - resp = self.clnt.post("/export", data=json.dumps(payload)) if resp: - client = self.clnt - download_url = f"http://{client.host}:{client.port}{resp}" - _, r = self.clnt.get(download_url) + client = self.client + download_url = f"{client.protocol}://{client.host}{zip_file_endpoint}" + r = self.client.get(download_url, use_prefix=False) - with open(filename, "wb") as handle: + with open(filename or zip_filename, "wb") as handle: handle.write(r.content) + return (True, zip_filename) + return (False, None) + + def import_lab(self, path: str, folder: str = "/") -> bool: + """Import a lab from a .unl file - def list_lab_networks(self, path: str): + :param path: the source .zip file path of the lab + :type path: str + :param folder: the destination folder(s) for the lab as a path string + defaults to '/' + :type folder: str, optional + :return: True if import was successful, False otherwise + """ + if not Path(path).exists(): + raise FileNotFoundError(f"{path} does not exist.") + + # retrieve the current cookies and reset the client custom headers + cookies = self.client.session.cookies.get_dict() + headers = { + "Accept": "*/*", + "Cookie": "; ".join(f"{k}={v}" for k, v in cookies.items()), + } + self.client.session.headers = headers + + # upload the file + files = {"file": open(path, "rb")} + return self.client.post("/import", data={"path": folder}, files=files) + + def list_lab_networks(self, path: str) -> Dict: """Get all networks configured in a lab :param path: path to lab file (include parent folder) @@ -215,9 +232,9 @@ def list_lab_networks(self, path: str): """ normalized_path = self.normalize_path(path) url = "/labs" + f"{normalized_path}/networks" - return self.clnt.get(url) + return self.client.get(url) - def get_lab_network(self, path: str, net_id: int): + def get_lab_network(self, path: str, net_id: int) -> Dict: """Retrieve details for a single network in a lab :param path: path to lab file (include parent folder) @@ -226,10 +243,10 @@ def get_lab_network(self, path: str, net_id: int): :type net_id: int """ normalized_path = self.normalize_path(path) - url = "/labs" + f"{normalized_path}/networks/{str(net_id)}" - return self.clnt.get(url) + url = "/labs" + f"{normalized_path}/networks/{net_id}" + return self.client.get(url) - def get_lab_network_by_name(self, path: str, name: str): + def get_lab_network_by_name(self, path: str, name: str) -> Dict: """retrieve details for a single network using the lab name @@ -238,28 +255,31 @@ def get_lab_network_by_name(self, path: str, name: str): :param name: name of the network :type name: str """ - networks = self.list_lab_networks(path) - return next((v for k, v in networks.items() if v["name"] == name), None) + r = self.list_lab_networks(path) + networks = r.get("data") + if networks: + return next((v for _, v in networks.items() if v["name"] == name), None) + return - def list_lab_links(self, path: str): + def list_lab_links(self, path: str) -> Dict: """Get all remote endpoint for both ethernet and serial interfaces :param path: path to lab file (include parent folder) :type path: str """ url = "/labs" + f"{self.normalize_path(path)}/links" - return self.clnt.get(url) + return self.client.get(url) - def list_nodes(self, path: str): + def list_nodes(self, path: str) -> Dict: """List all nodes in the lab :param path: path to lab file (include parent folder) :type path: str """ url = "/labs" + f"{self.normalize_path(path)}/nodes" - return self.clnt.get(url) + return self.client.get(url) - def get_node(self, path: str, node_id: str): + def get_node(self, path: str, node_id: str) -> Dict: """Retrieve single node from lab by ID :param path: path to lab file (include parent folder) @@ -268,9 +288,20 @@ def get_node(self, path: str, node_id: str): :type node_id: str """ url = "/labs" + f"{self.normalize_path(path)}/nodes/{node_id}" - return self.clnt.get(url) + return self.client.get(url) + + def delete_node(self, path: str, node_id: str) -> Dict: + """Delete a node from the lab + + :param path: path to lab file (include parent folder) + :type path: str + :param node_id: node ID to delete + :type node_id: str + """ + url = "/labs" + f"{self.normalize_path(path)}/nodes/{node_id}" + return self.client.delete(url) - def get_node_by_name(self, path: str, name: str): + def get_node_by_name(self, path: str, name: str) -> Dict: """Retrieve single node from lab by name :param path: path to lab file (include parent folder) @@ -278,19 +309,22 @@ def get_node_by_name(self, path: str, name: str): :param name: node name :type name: str """ - nodes = self.list_nodes(path) - return next((v for k, v in nodes.items() if v["name"] == name), None) + r = self.list_nodes(path) + node_data = r["data"] + if node_data: + return next((v for _, v in node_data.items() if v["name"] == name), None) + return - def get_node_configs(self, path: str): + def get_node_configs(self, path: str) -> Dict: """Return information about node configs :param path: path to lab file (include parent folder) :type path: str """ url = "/labs" + f"{self.normalize_path(path)}/configs" - return self.clnt.get(url) + return self.client.get(url) - def get_node_config_by_id(self, path: str, node_id: int): + def get_node_config_by_id(self, path: str, node_id: int) -> Dict: """Return configuration information about a specific node given the configuration ID @@ -299,10 +333,12 @@ def get_node_config_by_id(self, path: str, node_id: int): :param node_id: ID for node to retrieve configuration for :type node_id: int """ - url = "/labs" + f"{self.normalize_path(path)}/configs/{str(node_id)}" - return self.clnt.get(url) + url = "/labs" + f"{self.normalize_path(path)}/configs/{node_id}" + return self.client.get(url) - def upload_node_config(self, path: str, node_id: str, config: str, enable=False): + def upload_node_config( + self, path: str, node_id: str, config: str, enable=False + ) -> Dict: """Upload node's startup config. :param path: path to lab file (include parent folder) @@ -316,13 +352,23 @@ def upload_node_config(self, path: str, node_id: str, config: str, enable=False) """ url = "/labs" + f"{self.normalize_path(path)}/configs/{node_id}" payload = {"id": node_id, "data": config} - return self.clnt.put(url, data=json.dumps(payload)) + return self.client.put(url, data=json.dumps(payload)) - @staticmethod - def find_node_interface(name: str, intf_list: List): - intf_list = list(intf_list) + def find_node_interface( + self, + path: str, + node_id: str, + interface_name: str, + media: Literal["ethernet", "serial"] = "ethernet", + ) -> Dict: + r = self.get_node_interfaces(path, node_id) + interface_list = r["data"].get(media, []) return next( - ((idx, intf) for idx, intf in enumerate(intf_list) if intf["name"] == name), + ( + (idx, interface) + for idx, interface in enumerate(interface_list) + if interface["name"] == interface_name + ), None, ) @@ -335,7 +381,7 @@ def connect_node( dst_port: str = "", dst_type: str = "network", media: str = "", - ): + ) -> Dict: """Connect node to a network or node :param path: path to lab file (include parent folder) @@ -373,7 +419,7 @@ def connect_node( def connect_p2p_interface( self, path: str, node_id: str, interface: Tuple, net_id: str - ): + ) -> Dict: """Connect node interface to a network :param path: path to lab file (include parent folder) @@ -388,109 +434,124 @@ def connect_p2p_interface( url = "/labs" f"{self.normalize_path(path)}/nodes/{node_id}/interfaces" # connect interfaces - intf_id = interface[0] - self.clnt.put(url, data=json.dumps({intf_id: str(net_id)})) + interface_id = interface[0] + payload = {interface_id: str(net_id)} + self.client.put(url, data=json.dumps(payload)) # set visibility for bridge to "0" to hide bridge in the GUI return self.edit_lab_network(path, net_id, data={"visibility": "0"}) def connect_node_to_cloud( - self, path, node_name, node_port, net_name, media="ethernet" - ): - node = self.get_node_by_name(path, node_name) + self, + path: str, + src: str, + src_label: str, + dst: str, + media: Literal["ethernet", "serial"] = "ethernet", + ) -> Dict: + """Connect node to a cloud""" + normpath = self.normalize_path(path) + node = self.get_node_by_name(path, src) if node is None: - raise ValueError(f"node {node_name} not found or invalid") - - net = self.get_lab_network_by_name(path, net_name) - if net is None: - raise ValueError(f"network {net_name} not found or invalid") - + raise ValueError(f"node {src} not found or invalid") node_id = node.get("id") - all_ports = self.get_node_interfaces(path, node_id).get(media) - found_interface = self.find_node_interface(node_port, all_ports) - - if not found_interface: - raise ValueError(f"{node_port} invalid or missing for " f"{node_name}") - intf_id = str(found_interface[0]) + net = self.get_lab_network_by_name(path, dst) + if net is None: + raise ValueError(f"network {dst} not found or invalid") net_id = net.get("id") - url = "/labs" f"{self.normalize_path(path)}/nodes/{node_id}/interfaces" - return self.clnt.put(url, data=json.dumps({intf_id: str(net_id)})) + node_interface = self.find_node_interface(path, node_id, src_label, media) + if not node_interface: + raise ValueError(f"{src_label} invalid or missing for " f"{src}") + interface = node_interface[0] + + url = f"/labs{normpath}/nodes/{node_id}/interfaces" + return self.client.put(url, data=json.dumps({interface: f"{net_id}"})) def connect_node_to_node( self, - lab, - src_node_name, - src_node_i, - dst_node_name, - dst_node_i, - media="ethernet", - ): - src_node = self.get_node_by_name(lab, src_node_name) - dst_node = self.get_node_by_name(lab, dst_node_name) - - # Validate hosts - if not all((src_node, dst_node)): + path: str, + src: str, + src_label: str, + dst: str, + dst_label: str, + media: Literal["ethernet", "serial"] = "ethernet", + ) -> bool: + """Connect node to another node + + :param path: path to lab file (include parent folder) + :type path: str + :param src: source device name + :type src: str + :param src_label: source port name + :type src_label: str + :param dst: destination device name + :type dst: str + :param dst_label: destination port name + :type dst_label: str + :param media: port media type, defaults to "ethernet" + :type media: str, optional + :return: True if successful + :rtype: bool + """ + + self.client.log.debug( + f"connecting node {src} to node {dst}" + f" on interfaces {src_label} <-> {dst_label}" + f" in lab {path.replace(' ', '_')}" + ) + # find nodes using node names + s_node_dict = self.get_node_by_name(path, src) + d_node_dict = self.get_node_by_name(path, dst) + + # Validate that we found the hosts to connect + s_node_id = s_node_dict.get("id") + d_node_id = d_node_dict.get("id") + if not all((s_node_id, d_node_id)): raise ValueError("host(s) not found or invalid") - # Node IDs - src_node_id = src_node.get("id") - dst_node_id = dst_node.get("id") - - if src_node_id and dst_node_id: - # Get all current interfaces of type media ("ethernet" or "serial") - src_node_ports = self.get_node_interfaces(lab, src_node_id).get(media) - dst_node_ports = self.get_node_interfaces(lab, dst_node_id).get(media) - - # Extract interface dicts from list of interfaces - src_intf = self.find_node_interface(src_node_i, src_node_ports) - dst_intf = self.find_node_interface(dst_node_i, dst_node_ports) - - if src_intf and dst_intf: - net_resp = self.add_lab_network( - lab, network_type="bridge", visibility="1" - ) - - if net_resp is not None and net_resp.get("id"): - net_id = net_resp.get("id") - if net_id: - r1 = self.connect_p2p_interface( - lab, src_node_id, src_intf, net_id - ) - r2 = self.connect_p2p_interface( - lab, dst_node_id, dst_intf, net_id - ) - return (r1, r2) - elif src_intf: - raise ValueError(f"interface not found on node: {src_node_i}") - else: - raise ValueError(f"interface not found on node: {dst_node_i}") - elif src_node_id: - raise ValueError(f"node not found in lab: {dst_node_name}") - else: - raise ValueError(f"node not found in lab: {src_node_name}") - return + # find the p2p interfaces on each of the nodes + src_int = self.find_node_interface(path, s_node_id, src_label, media) + dst_int = self.find_node_interface(path, d_node_id, dst_label, media) + + # create the bridge for the p2p interfaces + self.client.log.debug( + f"creating bridge for p2p link: node{s_node_id} <-> node{d_node_id}" + ) + net_resp = self.add_lab_network(path, network_type="bridge", visibility="1") + net_id = net_resp.get("data", {}).get("id") + self.client.log.debug(f"created bridge ID: {net_id}") + + if not net_id: + raise ValueError("Failed to create bridge") + + # connect the p2p interfaces to the bridge + self.client.log.debug(f"connecting node{s_node_id} -> net:{net_id}") + r1 = self.connect_p2p_interface(path, s_node_id, src_int, net_id) + self.client.log.debug(f"connecting node{d_node_id} -> net:{net_id}") + r2 = self.connect_p2p_interface(path, d_node_id, dst_int, net_id) + return r1["status"] == "success" and r2["status"] == "success" - def start_all_nodes(self, path: str): + def start_all_nodes(self, path: str) -> Dict: """Start one or all nodes configured in a lab :param path: path to lab file (including parent folder) :type path: str """ url = f"/labs{self.normalize_path(path)}/nodes/start" - return self.clnt.get(url) + return self.client.get(url) - def stop_all_nodes(self, path: str): + def stop_all_nodes(self, path: str) -> Dict: """Stop one or all nodes configured in a lab :param path: [description] :type path: str """ url = "/labs" + f"{self.normalize_path(path)}/nodes/stop" - return self.clnt.get(url) + return self.client.get(url) - def start_node(self, path: str, node_id: str): + def start_node(self, path: str, node_id: str) -> Dict: """Start single node in a lab :param path: [description] @@ -498,11 +559,10 @@ def start_node(self, path: str, node_id: str): :param node_id: [description] :type node_id: str """ - uri = f"/nodes/{node_id}/start" - url = "/labs" + self.normalize_path(path) + uri - return self.clnt.get(url) + url = "/labs" + self.normalize_path(path) + f"/nodes/{node_id}/start" + return self.client.get(url) - def stop_node(self, path: str, node_id: str): + def stop_node(self, path: str, node_id: str) -> Dict: """Stop single node in a lab :param path: [description] @@ -510,11 +570,10 @@ def stop_node(self, path: str, node_id: str): :param node_id: [description] :type node_id: str """ - uri = f"/nodes/{node_id}/stop" - url = "/labs" + self.normalize_path(path) + uri - return self.clnt.get(url) + url = "/labs" + self.normalize_path(path) + f"/nodes/{node_id}/stop" + return self.client.get(url) - def wipe_all_nodes(self, path: str): + def wipe_all_nodes(self, path: str) -> Dict: """Wipe one or all nodes configured in a lab. Wiping deletes all user config, included startup-config, VLANs, and so on. The next start will rebuild node from selected image. @@ -524,9 +583,9 @@ def wipe_all_nodes(self, path: str): :return: str """ url = "/labs" + self.normalize_path(path) + "/nodes/wipe" - return self.clnt.get(url) + return self.client.get(url) - def wipe_node(self, path: str, node_id: int): + def wipe_node(self, path: str, node_id: int) -> Dict: """Wipe single node configured in a lab. Wiping deletes all user config, included startup-config, VLANs, and so on. The next start will rebuild node from selected image. @@ -536,11 +595,10 @@ def wipe_node(self, path: str, node_id: int): :param node_id: [description] :type node_id: [type] """ - uri = f"/nodes/{str(node_id)}/wipe" - url = "/labs" + self.normalize_path(path) + uri - return self.clnt.get(url) + url = "/labs" + self.normalize_path(path) + f"/nodes/{node_id}/wipe" + return self.client.get(url) - def export_all_nodes(self, path: str): + def export_all_nodes(self, path: str) -> Dict: """Export one or all nodes configured in a lab. Exporting means saving the startup-config into the lab file. @@ -549,52 +607,50 @@ def export_all_nodes(self, path: str): :type path: str """ url = "/labs" + self.normalize_path(path) + "/nodes/export" - return self.clnt.get(url) + return self.client.put(url) - def export_node(self, path: str, node_id: int): + def export_node(self, path: str, node_id: int) -> Dict: """Export node configuration. Exporting means saving the startup-config into the lab file. - :param path: [description] + :param path: lab path :type path: str - :param node_id: [description] + :param node_id: node ID for to export config from :type node_id: int """ - uri = f"/nodes/{str(node_id)}/export" - url = "/labs" + self.normalize_path(path) + uri - return self.clnt.get(url) + url = "/labs" + f"{self.normalize_path(path)}/nodes/{node_id}/export" + return self.client.put(url) - def get_node_interfaces(self, path: str, node_id: int): + def get_node_interfaces(self, path: str, node_id: int) -> Dict: """Get configured interfaces from a node. - :param path: [description] + :param path: lab path :type path: str - :param node_id: [description] + :param node_id: node id in lab :type node_id: int """ - uri = f"/nodes/{str(node_id)}/interfaces" - url = "/labs" + self.normalize_path(path) + uri - return self.clnt.get(url) + url = "/labs" + self.normalize_path(path) + f"/nodes/{node_id}/interfaces" + return self.client.get(url) - def get_lab_topology(self, path: str): + def get_lab_topology(self, path: str) -> Dict: """Get the lab topology :param path: [description] :type path: str """ url = "/labs" + self.normalize_path(path) + "/topology" - return self.clnt.get(url) + return self.client.get(url) - def get_lab_pictures(self, path: str): + def get_lab_pictures(self, path: str) -> Dict: """Get one or all pictures configured in a lab :param path: [description] :type path: str """ url = f"/labs{self.normalize_path(path)}/pictures" - return self.clnt.get(url) + return self.client.get(url) - def get_lab_picture_details(self, path: str, picture_id: int): + def get_lab_picture_details(self, path: str, picture_id: int) -> Dict: """Retrieve single picture :param path: [description] @@ -602,16 +658,12 @@ def get_lab_picture_details(self, path: str, picture_id: int): :param picture_id: [description] :type picture_id: int """ - uri = f"/pictures/{str(picture_id)}" - url = "/labs" + self.normalize_path(path) + uri - return self.clnt.get(url) + url = "/labs" + self.normalize_path(path) + f"/pictures/{picture_id}" + return self.client.get(url) - def node_exists(self, path, nodename): - exists = False + def node_exists(self, path, nodename) -> bool: node = self.get_node_by_name(path, nodename) - if node is not None: - exists = node.get("name") == nodename.lower() - return exists + return node.get("name") == nodename.lower() if node is not None else False def create_lab( self, @@ -664,7 +716,7 @@ def create_lab( existing_user = self.get_user(tenant) if existing_user: url += "{tenant}/" - return self.clnt.post(url, data=json.dumps(data)) + return self.client.post(url, data=json.dumps(data)) def edit_lab(self, path: str, param: dict) -> Dict: """Edit an existing lab. The request can set only one single @@ -695,27 +747,26 @@ def edit_lab(self, path: str, param: dict) -> Dict: raise ValueError(f"{key} is an invalid or unsupported paramater") url = "/labs" + f"{self.normalize_path(path)}" - print(url) - return self.clnt.put(url, data=json.dumps(param)) + return self.client.put(url, data=json.dumps(param)) - def delete_lab(self, path: str) -> bool: + def delete_lab(self, path: str) -> Dict: """Delete an existing lab :param path: [description] :type path: str """ url = "/labs" + self.normalize_path(path) - return self.clnt.delete(url) + return self.client.delete(url) - def lock_lab(self, path: str): + def lock_lab(self, path: str) -> Dict: """Lock lab to prevent edits""" url = "/labs" + f"{self.normalize_path(path)}/Lock" - return self.clnt.put(url) + return self.client.put(url) - def unlock_lab(self, path: str): + def unlock_lab(self, path: str) -> Dict: """Unlock lab to allow edits""" url = "/labs" + f"{self.normalize_path(path)}/Unlock" - return self.clnt.put(url) + return self.client.put(url) def _get_network_types(self): network_types = set(NETWORK_TYPES) @@ -726,7 +777,7 @@ def _get_network_types(self): def network_types(self): return self._get_network_types() - def edit_lab_network(self, path: str, net_id: int, data: Dict = None): + def edit_lab_network(self, path: str, net_id: int, data: Dict = None) -> Dict: """Edit lab network :param path: [description] @@ -738,8 +789,8 @@ def edit_lab_network(self, path: str, net_id: int, data: Dict = None): """ if not data: raise ValueError("data field is required.") - url = "/labs" + self.normalize_path(path) + f"/networks/{str(net_id)}" - return self.clnt.put(url, data=json.dumps(data)) + url = "/labs" + self.normalize_path(path) + f"/networks/{net_id}" + return self.client.put(url, data=json.dumps(data)) def add_lab_network( self, @@ -749,7 +800,7 @@ def add_lab_network( name: str = "", left: int = randint(30, 70), top: int = randint(30, 70), - ): + ) -> Dict: """Add new network to lab :param path: [description] @@ -770,6 +821,10 @@ def add_lab_network( defaults to randint(30, 70) :type top: int, optional """ + existing_network = self.get_lab_network_by_name(path, name) + if existing_network: + raise ValueError(f"Network already exists: `{name}` in lab {path}") + if network_type not in self.network_types: raise ValueError( f"invalid network type: {network_type} \ @@ -784,11 +839,11 @@ def add_lab_network( "visibility": visibility, } url = "/labs" + self.normalize_path(path) + "/networks" - return self.clnt.post(url, data=json.dumps(data)) + return self.client.post(url, data=json.dumps(data)) - def delete_lab_network(self, path: str, net_id: int): - url = f"/labs{self.normalize_path(path)}/networks/{str(net_id)}" - return self.clnt.delete(url) + def delete_lab_network(self, path: str, net_id: int) -> Dict: + url = f"/labs{self.normalize_path(path)}/networks/{net_id}" + return self.client.delete(url) def add_node( self, @@ -810,7 +865,7 @@ def add_node( nvram: int = None, idlepc: str = None, slots: str = "", - ): + ) -> Dict: """Create node and add to lab @@ -873,7 +928,7 @@ def add_node( template = template resp = self.node_template_detail(template) - template_defaults = resp.get("options") + template_defaults = resp["data"]["options"] icon = icon or template_defaults.get("icon")["value"] ethernet = ethernet or template_defaults.get("ethernet")["value"] @@ -898,5 +953,5 @@ def add_node( } resp = {} if not self.node_exists(path, name): - resp = self.clnt.post(url, data=json.dumps(data)) + resp = self.client.post(url, data=json.dumps(data)) return resp diff --git a/src/evengsdk/cli/cli.py b/src/evengsdk/cli/cli.py index fed268c..d5fd61e 100644 --- a/src/evengsdk/cli/cli.py +++ b/src/evengsdk/cli/cli.py @@ -5,9 +5,10 @@ import click from evengsdk.client import EvengClient +from evengsdk.cli.console import cli_print from evengsdk.cli.folders.commands import folder from evengsdk.cli.lab.commands import lab -from evengsdk.cli.nodes.commands import node +from evengsdk.cli.node.commands import node from evengsdk.cli.users.commands import user from evengsdk.cli.system.commands import ( status, @@ -82,7 +83,7 @@ def common_options(f): @click.command() def version(): """display library version""" - click.echo(click.style(f"{__version__}", bold=True)) + cli_print(f"evengsdk {__version__}") @click.group() @@ -109,19 +110,16 @@ def main(ctx, host, port, username, password): logging_level = ( LOGGING_LEVELS[ctx.verbosity] if ctx.verbosity in LOGGING_LEVELS - else logging.DEBUG + else logging.ERROR ) if ctx.verbosity > 0: client.log = logging.getLogger("evengcli") client.log.addHandler(logging.StreamHandler()) client.log.setLevel(logging_level) - click.echo( - click.style( - f"Verbose logging is enabled. " - f"(LEVEL={logging.getLogger().getEffectiveLevel()})", - fg="yellow", - ) + cli_print( + f"Verbose logging is enabled. " f"(LEVEL={client.log.getEffectiveLevel()})", + style="warning", ) ctx.client = client diff --git a/src/evengsdk/cli/common.py b/src/evengsdk/cli/common.py new file mode 100644 index 0000000..a5ed0b2 --- /dev/null +++ b/src/evengsdk/cli/common.py @@ -0,0 +1,25 @@ +import click + + +output_option = click.option( + "--output", + type=click.Choice(["json", "text", "table"]), + default="table", +) + + +def list_sub_command(subcommand): + for decorator in reversed( + ( + click.command(name="list"), + output_option, + ) + ): + subcommand = decorator(subcommand) + return subcommand + + +def list_command(command): + for decorator in reversed((output_option,)): + command = decorator(command) + return command diff --git a/src/evengsdk/cli/console.py b/src/evengsdk/cli/console.py new file mode 100644 index 0000000..0753dc0 --- /dev/null +++ b/src/evengsdk/cli/console.py @@ -0,0 +1,81 @@ +from typing import Dict, List, Union, Any, Literal +import sys + +from rich.console import Console +from rich.theme import Theme +from rich.traceback import install + +from evengsdk.plugins.display import format_output +from evengsdk.exceptions import EvengHTTPError, EvengApiError + +# Install rich traceback as default traceback handler +install(show_locals=True, max_frames=10) + +console_theme = Theme({"info": "cyan", "warning": "magenta", "danger": "bold red"}) + + +class ConsolePrinter(Console): + def __init__(self): + super().__init__(theme=console_theme) + + def print_output(self, plugin: str, data: Dict, *args, **kwargs) -> None: + """Print output based on plugin""" + header = kwargs.pop("header", None) + output = format_output(plugin, data, *args, **kwargs) + + if not output: + sys.exit(0) + + try: + if plugin == "json": + self.print_json(output) + sys.exit(0) + + if plugin == "text" and header: + self.print(header, style="info") + + self.print(output) + sys.exit(0) + except Exception: + self.console.print_exception(show_locals=True) + + def print_error(self, message: str) -> None: + self.print(f"[danger]ERROR:[/danger] {message}") + sys.exit(1) + + def print_exc(self) -> None: + self.print_exception(show_locals=True, max_frames=10) + + +console = ConsolePrinter() + + +def cli_print_output( + plugin: Literal["json", "text", "table"], + data: Union[Dict, List, str], + *args, + **kwargs, +): + """ + Print based on the plugin type + """ + try: + console.print_output(plugin, data, *args, **kwargs) + except (EvengHTTPError, EvengApiError) as e: + msg = f"{e}" + if "Cannot find node" in msg: + msg = "could not find specified node in lab" + console.print_error(msg) + + +def cli_print(output: Any, *args, **kwargs): + """Generic print function""" + try: + console.print(output, *args, **kwargs) + except (EvengHTTPError, EvengApiError) as e: + console.print_error(f"{e}") + + +def cli_print_error(output: Any): + """Generic print function""" + console.print_error(f"{output}") diff --git a/src/evengsdk/cli/folders/commands.py b/src/evengsdk/cli/folders/commands.py index b5d537a..015b4e9 100644 --- a/src/evengsdk/cli/folders/commands.py +++ b/src/evengsdk/cli/folders/commands.py @@ -1,28 +1,35 @@ # -*- coding: utf-8 -*- -import sys - import click +from evengsdk.cli.common import list_sub_command +from evengsdk.cli.console import cli_print_output from evengsdk.cli.utils import get_client -from evengsdk.exceptions import EvengHTTPError, EvengApiError -from evengsdk.plugins.display import display -@click.command(name="list") +@list_sub_command @click.pass_context -def ls(ctx): +def ls(ctx, output): """ List folders on EVE-NG host + + \b + Examples: + eve-ng folder list """ - try: - client = get_client(ctx) - folders = client.api.list_folders() - click.echo(display("json", folders)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + client = get_client(ctx) + resp = client.api.list_folders() + folder_data = resp["data"]["folders"] + table_header = [ + ("Name", dict(justify="right", style="cyan", no_wrap=True)), + ("Path", {}), + ] + cli_print_output( + output, + {"data": folder_data}, + header="Folders", + table_header=table_header, + table_title="Folders", + ) @click.command() @@ -41,16 +48,14 @@ def create(ctx, path): def read(ctx, folder): """ Get folder details EVE-NG host + + \b + Examples: + eve-ng folder read /path/to/folder """ - try: - client = get_client(ctx) - folder = client.api.get_folder(folder) - click.echo(display("json", folder)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + client = get_client(ctx) + resp = client.api.get_folder(folder) + cli_print_output("json", resp) @click.command() diff --git a/src/evengsdk/cli/lab/commands.py b/src/evengsdk/cli/lab/commands.py index a8183cb..8cc32c9 100644 --- a/src/evengsdk/cli/lab/commands.py +++ b/src/evengsdk/cli/lab/commands.py @@ -7,12 +7,13 @@ from typing import Dict, List import click +import yaml +from evengsdk.cli.common import list_sub_command, list_command +from evengsdk.cli.console import cli_print, cli_print_error, cli_print_output, console +from evengsdk.cli.lab.topology import Topology from evengsdk.cli.utils import get_active_lab, get_client, thread_executor from evengsdk.client import EvengClient -from evengsdk.exceptions import EvengApiError, EvengHTTPError -from evengsdk.inventory import build_inventory -from evengsdk.plugins.display import display # https://stackoverflow.com/questions/37310718/mutually-exclusive-option-groups-in-python-click @@ -50,31 +51,25 @@ def _get_client_session(): return thread_local.client -def _get_lab_folder(name: str) -> List: +def _get_lab_folder(name: str) -> List[Dict]: """Get labs from nested folder structure - Args: - name (str): name of folder - - Returns: - [list]: list of labs from folder(s) + :param name: folder name + :type name: str + :return: list of labs """ session = _get_client_session() r = session.api.get_folder(name) - # get the labs from the folder - labs_from_folder = list() - labs_from_folder.append(r.get("labs")) - + labs_from_folder = [r.get("data", {}).get("labs")] # let's get labs from nested folders too - while len(nested_folders := r.get("folders")) > 1: + nested_folders = r.get("data", {}).get("folders") + while len(nested_folders) > 1: for folder in nested_folders: - # skip the '..' folder as it refers to the parent if folder["name"] == "..": continue - else: - r = session.api.get_folder(f'{folder["path"]}') - labs_from_folder.append(r.get("labs")) + r = session.api.get_folder(f'{folder["path"]}') + labs_from_folder.append(r.get("data", {}).get("labs")) return labs_from_folder @@ -86,15 +81,17 @@ def _get_lab_details(path: str) -> Dict: response = session.api.get_lab(path) if response: path = path.lstrip("/") - response.update({"path": "/" + path}) + response["data"].update({"path": "/" + path}) return response def _get_all_labs(client: EvengClient) -> List: + """ + Get all labs from EVE-NG host by parsing all nested folders + """ resp = client.api.list_folders() - - root_folders = resp["folders"] - labs_in_root_folder = resp.get("labs") + root_folders = resp.get("data", {}).get("folders") + labs_in_root_folder = resp.get("data", {}).get("labs") # Get the lab information from all other folders (non-root) labs_in_nested_folders = chain( @@ -103,101 +100,137 @@ def _get_all_labs(client: EvengClient) -> List: # flatten the results to single iterable # (labs from root folder + labs from nested) all_lab_info = chain(labs_in_root_folder, *labs_in_nested_folders) + return thread_executor(_get_lab_details, (x["path"] for x in all_lab_info)) - # Get the actual details for Each lab using the lab paths - lab_details = thread_executor(_get_lab_details, (x["path"] for x in all_lab_info)) - return lab_details + +def create_network_links( + client: EvengClient, topology: Topology, tasks: List = None +) -> None: + """ + Create network links + """ + for link in topology.cloud_links: + r = client.api.connect_node_to_cloud(topology.path, **link) + status = "completed" if r["status"] == "success" else "failed" + console.log(f"{tasks.pop(0)} {status}") + + +def create_p2p_links( + client: EvengClient, topology: Topology, tasks: List = None +) -> None: + """ + Create p2p links + """ + for link in topology.p2p_links: + created = client.api.connect_node_to_node(topology.path, **link) + console.log(f"{tasks.pop(0)} {'completed' if created else 'failed'}") + + +def create_and_configure_nodes( + client: EvengClient, topology: Topology, tasks: List = None +) -> None: + """ + Create and configure nodes + """ + for node in topology.nodes: + # create node + resp = client.api.add_node(topology.path, **node) + create_result = "completed" if resp["status"] == "success" else "failed" + + # configure node + if resp["status"] == "success": + config = topology.get_node_config(node["name"]) + if config: + node_id = resp["data"]["id"] + resp = client.api.upload_node_config( + topology.path, node_id, config, enable=True + ) + console.log(f"{tasks.pop(0)} {create_result}") + + +def create_networks( + client: EvengClient, topology: Topology, tasks: List = None +) -> None: + """ + Create networks + """ + for network in topology.networks: + resp = client.api.add_lab_network(topology.path, **network) + success = resp["status"] == "success" + status = "completed" if success else "failed" + console.log(f"{tasks.pop(0)} {status}. ID: {resp.get('data', {}).get('id')}") @click.command() @click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab ) -@click.option("--output", type=click.Choice(["json", "text"]), default="text") +@click.option("--output", type=click.Choice(["json", "text"]), default="json") @click.pass_context def read(ctx, path, output): """ Get EVE-NG lab details + + \b + Examples: + eve-ng lab read + eve-ng lab read --path /folder/to/lab.unl """ - try: - client = get_client(ctx) - lab = client.api.get_lab(path) - click.secho(lab["name"].upper(), fg="yellow") - click.echo(display(output, lab)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + client = get_client(ctx) + resp = client.api.get_lab(path) + cli_print_output(output, resp, header=f"Lab: {resp.get('name')}") @click.command() @click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab ) -@click.option("--output", type=click.Choice(["json", "text", "table"]), default="text") +@list_command @click.pass_context def topology(ctx, path, output): """ Retrieve lab topology + + \b + Examples: + eve-ng lab topology """ - try: - client = get_client(ctx) - resp = client.api.get_lab_topology(path) - - click.secho(f"Lab Topology @ {path}", fg="bright_blue") - header = [ - "type", - "source", - "source_type", - "source_label", - "destination", - "destination_type", - "destination_label", - ] - click.echo(display(output, resp, header=header)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + client = get_client(ctx) + resp = client.api.get_lab_topology(path) + table_header = [ + ("type", {}), + ("source", dict(justify="center", style="cyan", no_wrap=True)), + ("source_type", {}), + ("source_label", {}), + ("destination", dict(justify="center", style="magenta", no_wrap=True)), + ("destination_type", {}), + ("destination_label", {}), + ] + cli_print_output( + output, resp, header=f"Lab Topology @ {path}", table_header=table_header + ) @click.command(name="export") @click.option("--dest", help="destination path", type=click.Path(), default=".") @click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab ) @click.pass_context def export_lab(ctx, path, dest): """ Export and download lab file as ZIP archive - """ - try: - client = get_client(ctx) - resp = client.api.export_lab(path) - - # get name and content from response - name, content = resp - full_filepath = dest / Path(name) - # save file - full_filepath.write_bytes(content) - - success_message = f"Success: {str(full_filepath.resolve())}" - click.secho(display("text", success_message)) - - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + \b + Examples: + eve-ng lab export + """ + client = get_client(ctx) + with console.status("[bold green]Exporting lab..."): + saved, zipname = client.api.export_lab(path) + if saved: + cli_print(f"Lab exported to {zipname}") + sys.exit(0) @click.command(name="import") @@ -208,45 +241,46 @@ def import_lab(ctx, folder, src): """ Import lab into EVE-NG from ZIP archive """ - try: - client = get_client(ctx) - resp = client.api.import_lab(Path(src), folder) - click.echo(display("text", resp)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + + client = get_client(ctx) + with console.status("[bold green]Importing lab..."): + resp = client.api.import_lab(src, folder) + cli_print_output("json", resp) -@click.command(name="list") -@click.option("--output", type=click.Choice(["json", "text"]), default="text") +@list_sub_command @click.pass_context def ls(ctx, output): """ List the available labs in EVE-NG host - """ - try: - client = get_client(ctx) - lab_details = _get_all_labs(client) - # Display output - Human readable - click.secho("Labs", fg="bright_blue") - - # header for table output - header = ["author", "filename", "id", "version", "path"] - - click.echo(display(output, lab_details, header=header, record_header="name")) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + \b + Examples: + eve-ng lab list + """ + client = get_client(ctx) + resp = _get_all_labs(client) + lab_data = [x["data"] for x in resp] if resp else resp + table_header = [ + ("Name", dict(justify="right", style="cyan", no_wrap=True)), + ("Path", {}), + ("Description", {}), + ("Author", {}), + ("Lock", {}), + ] + cli_print_output( + output, + {"data": lab_data}, + header="Labs", + table_header=table_header, + table_title="Labs", + record_header_key="name", + ) @click.command() @click.option("--path", default="/", help="folder to create lab in") -@click.option("--name", help="lab name") +@click.option("--name", help="lab name", required=True) @click.option("--author", help="lab author") @click.option("--description", help="lab description") @click.option("--version", help="lab version") @@ -254,22 +288,102 @@ def ls(ctx, output): def create(ctx, path: str, author: str, description: str, version: int, name: str): """ Create a new lab + + \b + Examples: + eve-ng lab create --name lab1 --author "John Doe" --description "My lab" + """ + client = get_client(ctx) + response = client.api.create_lab( + name=name, + author=author, + path=path, + description=description, + version=version, + ) + cli_print_output("text", response) + + +@click.command() +@click.option( + "-t", + "--topology", + required=True, + help="Toplogy file to import", + type=click.Path(exists=True), +) +@click.option( + "-d", + "--template-dir", + default="templates", + help="Template directory", + type=click.Path(), +) +@click.pass_context +def create_from_topology(ctx, topology, template_dir): + """ + Create a new lab + + \b + Examples: + eveng lab create-from-topology --topology examples/test_topology.yml """ + client = get_client(ctx) + + if not Path(topology).exists(): + raise click.BadParameter(f"Topology file {topology} does not exist") + + topology_data = yaml.safe_load(Path(topology).read_text()) + topology = Topology(topology_data) + + errors = topology.validate() + if errors: + cli_print_error(f"Topology validation failed: {errors}") + + # create device configs, if needed + topology.build_node_configs(template_dir=template_dir) + try: - client = get_client(ctx) - response = client.api.create_lab( - name=name, - author=author, - path=path, - description=description, - version=version, - ) - click.echo(display("text", response)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") + # create lab + with console.status("[bold green]Creating lab..."): + resp = client.api.create_lab(**topology.lab) + if resp["status"] == "success": + console.log(f"Lab created: {topology.path}") + + # create nodes and apply configs, if needed + node_tasks = [ + f"node [bold green]{n['name']}[/bold green]" for n in topology.nodes + ] + with console.status("[bold green]Creating nodes..."): + create_and_configure_nodes(client, topology, tasks=node_tasks) + + # create networks + network_tasks = [f"network {n['name']}" for n in topology.networks] + with console.status("[bold green]Creating networks..."): + create_networks(client, topology, tasks=network_tasks) + + # create network links + link_tasks = [ + f"link [bold green]{link['src']}:{link['src_label']}[/bold green]" + f" -> [bold green]{link['dst']}[/bold green]" + for link in topology.cloud_links + ] + with console.status("[bold green]Creating links..."): + create_network_links(client, topology, tasks=link_tasks) + + # create p2p links + p2p_tasks = [ + f"link [bold green]{link['src']}:{link['src_label']}[/bold green]" + f" <-> [bold green]{link['dst']}:{link['dst_label']}[/bold green]" + for link in topology.p2p_links + ] + with console.status("[bold green]Creating links..."): + create_p2p_links(client, topology, tasks=p2p_tasks) + except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + if "already exists" not in str(e): + client.api.delete_lab(topology.path) + cli_print_error(f"Error creating lab: {e}") @click.command() @@ -298,7 +412,7 @@ def create(ctx, path: str, author: str, description: str, version: int, name: st mutually_exclusive=["author", "description", "version"], ) @click.option( - "--path", default=None, callback=lambda ctx, params, v: v or ctx.obj.active_lab + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab ) @click.pass_context def edit(ctx, path: str, **kwargs): @@ -310,107 +424,67 @@ def edit(ctx, path: str, **kwargs): eve-ng lab edit --author "Tafsir Thiam" eve-ng lab edit --body "Lab to demonstrate VXLAN/BGP-EVPN on vEOS" """ - try: - edit_param = {k: v for k, v in kwargs.items() if v is not None} - client = get_client(ctx) - click.echo(f"updating lab @: {path}") - response = client.api.edit_lab(path, param=edit_param) - click.echo(display("text", response)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + edit_param = {k: v for k, v in kwargs.items() if v is not None} + client = get_client(ctx) + response = client.api.edit_lab(path, param=edit_param) + cli_print_output("text", response) @click.command() @click.option("--path", default="/", help="folder to create lab in") -# @click.option('--name', help='lab name') @click.pass_context def delete(ctx, path): """ Delete a lab on EVE-NG host + + \b + Examples: + eve-ng lab delete --path /lab1 """ - try: - client = get_client(ctx) - response = client.api.delete_lab(path) - click.echo(display("text", response)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + client = get_client(ctx) + response = client.api.delete_lab(path) + cli_print_output("text", response) @click.command() @click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab ) @click.pass_context def start(ctx, path): - """Start all nodes in lab""" - try: - client = get_client(ctx) - response = client.api.start_all_nodes(path) - click.echo(display("text", response)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") + """Start all nodes in lab + + \b + Examples: + eve-ng lab start + eve-ng lab start --path /lab1 + """ + client = get_client(ctx) + response = client.api.start_all_nodes(path) + cli_print_output("text", response) @click.command() @click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab ) @click.pass_context def stop(ctx, path): """ Stop all nodes in lab - """ - try: - client = get_client(ctx) - response = client.api.stop_all_nodes(path) - if response.get("status") and response["status"] == "success": - close_resp = client.delete("/labs/close") - click.echo(display("text", close_resp)) - else: - click.echo(display("text", response)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-w", "--write", help="Output filename.") -@click.pass_context -def inventory(ctx, path, write): - """ - generate inventory file (INI). + \b + Examples: + eve-ng lab stop + eve-ng lab stop --path /lab1 """ - eve_host = ctx.obj.host - client.login(username=ctx.obj.username, password=ctx.obj.password) - resp = client.api.list_nodes(path) - node_indexes = resp.keys() - nodes_list = [resp[idx] for idx in node_indexes] - - inventory = build_inventory(eve_host, path, nodes_list) - if write: - with open(write, "w") as handle: - handle.write(inventory) - sys.exit() + client = get_client(ctx) + response = client.api.stop_all_nodes(path) + if response.get("status") and response["status"] == "success": + close_resp = client.delete("/labs/close") + cli_print_output("text", close_resp) + else: + cli_print_output("text", response) @click.command(name="show-active") @@ -418,10 +492,13 @@ def inventory(ctx, path, write): def show_active(ctx): """ Show active lab + + \b + Examples: + eve-ng lab show-active """ - title = click.style("Active Lab: ", fg="bright_blue") active_lab = ctx.obj.active_lab or os.environ.get("EVE_NG_PATH") - click.echo(f"{title}{active_lab}") + cli_print(f"Active Lab: {active_lab}") @click.command(name="set-active") @@ -440,15 +517,17 @@ def active(ctx, path): active_lab = active_lab_filepath.read_text() else: active_lab = os.environ.get("EVE_NG_PATH") - click.secho("Active Lab", fg="bright_blue") - click.echo(active_lab) + cli_print("Active Lab", style="info") + cli_print(active_lab) # set path option as active lab else: client.login(username=ctx.obj.username, password=ctx.obj.password) # Make sure this is a lab that exists in EVE-NG - labs = _get_all_labs(client) - existing_lab = next((lab for lab in labs if lab["path"] == path), None) + resp = _get_all_labs(client) + existing_lab = next( + (lab["data"] for lab in resp if lab["data"]["path"] == path), None + ) if not existing_lab: msg = click.style( f"\nLab @ {path} does not exist or could not be found.", fg="red" @@ -457,7 +536,7 @@ def active(ctx, path): else: # TODO: Stop previously active lab? active_lab_filepath.write_text(path) - click.secho(f"Active Lab set to {path}", fg="green") + cli_print(f"Active Lab set to {path}", style="info") @click.group() @@ -469,10 +548,7 @@ def lab(ctx): Manage EVE-NG labs """ global client - - # get active lab path from eve-ng dir or ENV ctx.obj.active_lab = get_active_lab(ctx.obj.active_lab_dir) - client = ctx.obj.client @@ -483,9 +559,9 @@ def lab(ctx): lab.add_command(create) lab.add_command(edit) lab.add_command(delete) -lab.add_command(inventory) lab.add_command(active) lab.add_command(show_active) lab.add_command(topology) lab.add_command(import_lab) lab.add_command(export_lab) +lab.add_command(create_from_topology) diff --git a/src/evengsdk/cli/lab/group.py b/src/evengsdk/cli/lab/group.py deleted file mode 100644 index baaa722..0000000 --- a/src/evengsdk/cli/lab/group.py +++ /dev/null @@ -1,159 +0,0 @@ -# -*- coding: utf-8 -*- -import click -from tabulate import tabulate -from evengsdk.cli.lab.generate import generate -from evengsdk.inventory import build_inventory - - -@click.command() -@click.option( - "--lab-path", required=True, help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.pass_context -def info(ctx, lab_path): - """ - Get EVE-NG lab details - """ - client = ctx.obj["CLIENT"] - details = client.api.get_lab(lab_path) - click.echo(tabulate([details], headers="keys", tablefmt="grid")) - - -@click.command() -@click.option( - "--lab-path", required=True, help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -def upload(ctx): - pass - - -@click.command() -@click.option( - "--lab-path", required=True, help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.pass_context -def export(ctx, lab_path): - """ - Export and download lab file as .zip archive - """ - client = ctx.obj["CLIENT"] - resp = client.api.export_lab(lab_path) - click.echo(resp) - - -@click.command() -@click.pass_context -def ls(ctx): - """ - List the available labs in EVE-NG host - """ - client = ctx.obj["CLIENT"] - resp = client.api.list_folders() - - root_folders = resp["folders"] - labs = resp.get("labs") - - for folder in root_folders: - folder_labs = client.api.get_folder(folder["name"]).get("labs") - labs.extend(folder_labs) - click.echo(tabulate(labs, headers="keys", tablefmt="grid")) - - -@click.command() -@click.option( - "--lab-path", required=True, help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.pass_context -def links(ctx, lab_path): - """ - Get EVE-NG lab topology - """ - client = ctx.obj["CLIENT"] - - links = client.api.get_lab_topology(lab_path) - click.echo(tabulate(links, headers="keys", tablefmt="fancy_grid")) - - -@click.command() -@click.option( - "--lab-path", required=True, help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.pass_context -def networks(ctx, lab_path): - """ - Get EVE-NG lab topology - """ - client = ctx.obj["CLIENT"] - - resp = client.api.list_lab_networks(lab_path) - networks = [_dict for key, _dict in resp.items()] - click.echo(tabulate(networks, headers="keys", tablefmt="fancy_grid")) - - -@click.command() -@click.option( - "--lab-path", default="/", help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.pass_context -def start(ctx, lab_path): - """ - Start all nodes in lab - """ - client = ctx.obj["CLIENT"] - status = client.api.start_all_nodes(lab_path) - click.echo(status) - - -@click.command() -@click.option( - "--lab-path", default="/", help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.pass_context -def stop(ctx, lab_path): - """ - Stop all nodes in lab - """ - client = ctx.obj["CLIENT"] - status = client.api.stop_all_nodes(lab_path) - click.echo(status) - - -@click.command() -@click.option( - "--lab-path", default="/", help="Path to the lab in EVE-NG host. ex: /MYLAB.unl" -) -@click.option("-o", "--output", help="Output filename.") -@click.pass_context -def inventory(ctx, lab_path, output): - """ - generate inventory file (INI). - """ - eve_host = ctx.obj["HOST"] - client = ctx.obj["CLIENT"] - resp = client.api.list_nodes(lab_path) - node_indexes = resp.keys() - nodes_list = [resp[idx] for idx in node_indexes] - - inventory = build_inventory(eve_host, lab_path, nodes_list) - if output: - with open(output, "w") as handle: - handle.write(inventory) - - -@click.group() -@click.pass_context -def lab(ctx): - """ - EVE-NG lab commands - """ - - -lab.add_command(info) -lab.add_command(ls) -lab.add_command(start) -lab.add_command(stop) -lab.add_command(inventory) -lab.add_command(links) -lab.add_command(networks) -lab.add_command(export) -lab.add_command(generate) diff --git a/src/evengsdk/cli/lab/topology.py b/src/evengsdk/cli/lab/topology.py new file mode 100644 index 0000000..0e8d5f4 --- /dev/null +++ b/src/evengsdk/cli/lab/topology.py @@ -0,0 +1,100 @@ +from pathlib import Path + +import yaml + +from evengsdk.schemas.validator import SchemaValidator +from evengsdk.templates import ConfigTemplateBuilder + + +class Topology: + def __init__(self, data_dict: dict): + self.validator = SchemaValidator() + self.instance = data_dict + self.config_builder = ConfigTemplateBuilder() + self._lab = None + self._path = None + self._configurations = {} + + def validate(self): + return self.validator.validate(self.instance) + + def _get_lab(self): + return { + "name": self.instance.get("name"), + "description": self.instance.get("description"), + "version": self.instance.get("version"), + "path": self.instance.get("path"), + "body": self.instance.get("body"), + "author": self.instance.get("author"), + } + + @property + def lab(self): + return self._get_lab() + + def _get_path(self): + return f'{self.lab["path"]}/{self.lab["name"]}.unl' + + @property + def path(self): + return self._get_path() + + @property + def nodes(self): + return self.instance.get("nodes") + + @property + def networks(self): + return self.instance.get("networks") + + @property + def cloud_links(self): + return self.instance.get("links", {}).get("network") + + @property + def p2p_links(self): + return self.instance.get("links", {}).get("node") + + def _load_file_content(self, config_path: Path) -> str: + """Load device config""" + return config_path.read_text() + + def render_node_config(self, template: str, data: dict) -> str: + """Render node config""" + return self.config_builder.render_template(template, data) + + def build_node_configs(self, template_dir: str = "templates"): + """Build node configs""" + for node in self.nodes: + node_name = node["name"] + + if not node.get("configuration"): + continue + + # configuration key is only needed for config builds, not for the API + config_options = node.pop("configuration") + + if "file" in config_options: + config_path = Path(config_options["file"]) + if not config_path.exists(): + raise FileNotFoundError(f"Config file {config_path} not found") + self._configurations[node_name] = self._load_file_content(config_path) + + if "template" in config_options: + context_data = config_options.get("vars") or config_options.get( + "vars_file" + ) + if isinstance(context_data, str): + context_data = yaml.safe_load( + self._load_file_content(Path(context_data)) + ) + if template_dir: + self.config_builder.template_path = Path(template_dir) + + self._configurations[node_name] = self.render_node_config( + config_options["template"], context_data + ) + + def get_node_config(self, node_name: str): + """Get node config""" + return self._configurations.get(node_name) diff --git a/src/evengsdk/cli/node/__init__.py b/src/evengsdk/cli/node/__init__.py index c551c95..3e183c4 100644 --- a/src/evengsdk/cli/node/__init__.py +++ b/src/evengsdk/cli/node/__init__.py @@ -1,5 +1,10 @@ # -*- coding: utf-8 -*- -NODE_STATUS_CODES = {0: "stopped", 1: "running", 2: "started", 3: "stopped"} +NODE_STATUS_CODES = { + 0: ("stopped", ":red_circle:"), + 1: ("running", ":green_circle:"), + 2: ("started", ":orange_circle:"), + 3: ("building", ":red_circle:"), +} NODE_STATUS_COLOR = {0: "red", 1: "green", 2: "green", 3: "red"} diff --git a/src/evengsdk/cli/node/commands.py b/src/evengsdk/cli/node/commands.py new file mode 100644 index 0000000..81b003f --- /dev/null +++ b/src/evengsdk/cli/node/commands.py @@ -0,0 +1,323 @@ +# -*- coding: utf-8 -*- +from pathlib import Path +import os +from typing import List, Dict + +import click + +from evengsdk.cli.common import list_sub_command +from evengsdk.cli.utils import get_client, get_active_lab +from evengsdk.cli.console import cli_print_output, cli_print_error, cli_print +from evengsdk.cli.node import NODE_STATUS_CODES + + +client = None + + +def _get_configs(src: Path) -> List[Dict]: + path = Path(src) + configs = [] + for filename in os.listdir(path): + filepath = Path(filename) + hostname = filepath.stem + fullpath = os.path.join(src, filepath) + with open(fullpath, "r") as handle: + stream = handle.read() + configs.append({"hostname": hostname, "config": stream}) + return configs + + +def _get_config(src: Path) -> str: + """load device config""" + with open(src, "r") as handle: + return handle.read() + + +@click.command("config") +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id", required=True) +@click.option("-s", "--src", help="config file to upload", type=click.Path(exists=True)) +@click.option("-c", "--config", default=None, help="config to upload", type=str) +@click.pass_context +def upload_config(ctx, node_id, path, src, config): + """ + Upload device configuration + + \b + Examples: + eveng node config -n 1 # view startup config + eveng node config -n 4 --config "hostname testing" # upload config from string + eveng node -config -n 4 -src config.txt # load config from file + """ + client = get_client(ctx) + if any([src, config]): + _config = config or _get_config(src) + resp = client.api.upload_node_config(path, node_id, config=_config, enable=True) + cli_print_output("text", resp) + else: + resp = client.api.get_node_config_by_id(path, node_id) + if resp["status"] == "success": + resp = resp.get("data", {}).get("data") + cli_print(resp) + + +@click.command() +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id", required=True) +@click.pass_context +def start(ctx, path, node_id): + """start node in lab + + \b + Example: + eve-ng node start -n 4 + """ + client = get_client(ctx) + resp = client.api.start_node(path, node_id) + cli_print_output("text", resp) + + +@click.command() +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id", required=True) +@click.pass_context +def stop(ctx, path, node_id): + """stop node in lab + + \b + Example: + eve-ng node stop -n 1 + """ + client = get_client(ctx) + resp = client.api.stop_node(path, node_id) + cli_print_output("text", resp) + + +@click.command() +@click.option("--name", help="node name") +@click.option( + "--node-type", default="qemu", type=click.Choice(["iol", "qemu", "dynamips"]) +) +@click.option("--template", required=True, help="node template to create node from") +@click.option("--image", help="image to boot node with") +@click.option("--ethernet", default=2, help="number of ethernet interfaces.") +@click.option("--serial", default=2, help="number of serial interfaces.") +@click.option( + "--console-type", + default="telnet", + type=click.Choice(["telnet", "vnc"]), + help="number of serial interfaces.", +) +@click.option("--ram", default=1024, help="RAM for node") +@click.option("--cpu", default=1, help="CPU count for node") +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.pass_context +def create( + ctx, + path, + name, + node_type, + template, + image, + ethernet, + serial, + console_type, + cpu, + ram, +): + """Create lab node + + \b + Example: + eve-ng node create --name leaf05 --template veos --image veos-4.22.0F + """ + client = get_client(ctx) + node = { + "name": name, + "node_type": node_type, + "template": template, + "image": image, + "ethernet": ethernet, + "serial": serial, + "console": console_type, + "cpu": cpu, + "ram": ram, + } + resp = client.api.add_node(path, **node) + cli_print_output("json", resp, header="Node created") + + +@click.command() +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id") +@click.pass_context +def wipe(ctx, path, node_id): + """Create lab node + + \b + Example: + eve-ng node wipe -n 4 # wipe node with id 4 + eve-ng node wipe # wipe all nodes + """ + client = get_client(ctx) + if node_id: + client.api.get_node(path, node_id) + resp = client.api.wipe_node(path, node_id) + else: + resp = client.api.wipe_all_nodes(path) + cli_print_output("text", resp, header="Node wiped") + + +@click.command(name="export") +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id") +@click.pass_context +def export_node(ctx, path, node_id): + """Create export node configuration (save) + + \b + Example: + eve-ng node export -n 4 # export node with id 4 + eve-ng node export # export all nodes + """ + client = get_client(ctx) + if node_id: + client.api.get_node(path, node_id) + resp = client.api.export_node(path, node_id) + else: + resp = client.api.export_all_nodes(path) + cli_print_output("text", resp) + + +@click.command() +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id", required=True) +@click.option("--output", type=click.Choice(["json", "text"]), default="json") +@click.pass_context +def read(ctx, path, node_id, output): + """Retrieve lab node details + + \b + Example: + eve-ng node read -n 4 # read node with id 4 + """ + client = get_client(ctx) + resp = client.api.get_node(path, node_id) + node_name = resp["data"]["name"].upper() + cli_print_output(output, resp, header=node_name) + + +@click.command() +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.option("-n", "--node-id", required=True) +@click.pass_context +def delete(ctx, path, node_id): + """Delete lab node with specified id + + \b + Example: + eve-ng node delete -n 4 # delete node with id 4 + """ + client = get_client(ctx) + client.api.get_node(path, node_id) + resp = client.api.delete_node(path, node_id) + cli_print_output("text", resp) + + +@list_sub_command +@click.option( + "--path", default=None, callback=lambda ctx, _, v: v or ctx.obj.active_lab +) +@click.pass_context +def ls(ctx, path, output): + """ + list lab nodes + + \b + Example: + eve-ng node list # list all nodes + """ + client = get_client(ctx) + resp = client.api.list_nodes(path) + + node_data = resp.get("data", {}) + if not node_data: + cli_print_error("No nodes found. Is this lab empty?") + + node_indexes = resp.get("data", {}).keys() + nodes_list = [(idx, resp["data"][idx]) for idx in node_indexes] + + node_table = [] + for idx, n in nodes_list: + node_status = n["status"] + status = NODE_STATUS_CODES[node_status] + table_row = { + "id": idx, + "name": n["name"], + "url": n["url"], + "image": n["image"], + "template": n["template"], + "status": f"{status[0]} {status[1]}", + "console": n["console"], + "ram": n["ram"], + "cpu": n["cpu"], + } + node_table.append(table_row) + + table_header = [ + ("ID", dict(justify="right", style="cyan", no_wrap=True)), + ("Name", {}), + ("Url", {}), + ("Image", {}), + ("Template", {}), + ("Status", {}), + ("Console", {}), + ("RAM", {}), + ("CPU", {}), + ] + + table_data = {"data": node_table} + cli_print_output( + output, table_data, table_header=table_header, table_title=f"Nodes @ {path}" + ) + + +@click.group() +@click.pass_context +def node(ctx): + """node sub commands + + Manage EVE-NG lab nodes + """ + global client + + # get active lab path from eve-ng dir or ENV + ctx.obj.active_lab = get_active_lab(ctx.obj.active_lab_dir) + client = ctx.obj.client + + +node.add_command(ls) +node.add_command(create) +node.add_command(read) +node.add_command(delete) +node.add_command(start) +node.add_command(stop) +node.add_command(wipe) +node.add_command(export_node) +node.add_command(upload_config) diff --git a/src/evengsdk/cli/node/group.py b/src/evengsdk/cli/node/group.py deleted file mode 100644 index aea6853..0000000 --- a/src/evengsdk/cli/node/group.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -from pathlib import Path -import os -import click - -from tabulate import tabulate - -from evengsdk.cli.node import NODE_STATUS_CODES, NODE_STATUS_COLOR - - -def get_configs(src): - path = Path(src) - configs = [] - for filename in os.listdir(path): - filepath = Path(filename) - hostname = filepath.stem - fullpath = os.path.join(src, filepath) - with open(fullpath, "r") as handle: - stream = handle.read() - configs.append({"hostname": hostname, "config": stream}) - return configs - - -def get_config(src): - """ - load device config - """ - with open(src, "r") as handle: - stream = handle.read() - return stream - - -@click.command() -@click.option("--lab-path", required=True) -@click.option("--node-id", required=True) -@click.option("--src", required=True, type=click.Path(exists=True)) -@click.pass_context -def upload_config(ctx, node_id, lab_path, src): - """ - Upload device configuration - """ - client = ctx.obj["CLIENT"] - config = get_config(src) - client.api.upload_node_config(lab_path, node_id, config=config, enable=True) - - -@click.command() -@click.option("--lab-path", required=True) -@click.option("--node-id") -@click.pass_context -def start(ctx, lab_path, node_id): - """ - start node in lab. - """ - client = ctx.obj["CLIENT"] - resp = client.api.start_node(lab_path, node_id) - click.echo(resp) - - -@click.command() -@click.option("--lab-path", required=True) -@click.option("--node-id") -@click.pass_context -def stop(ctx, lab_path, node_id): - """ - stop node in lab. - """ - client = ctx.obj["CLIENT"] - resp = client.api.stop_node(lab_path, node_id) - if resp.get("status") and resp["status"] == "success": - close_resp = client.delete("/labs/close") - click.echo(close_resp) - - -@click.command() -@click.option("--lab-path", required=True) -@click.pass_context -def ls(ctx, lab_path): - """ - list lab nodes - """ - - client = ctx.obj["CLIENT"] - - resp = client.api.list_nodes(lab_path) - if resp: - node_indexes = resp.keys() - nodes_list = [(idx, resp[idx]) for idx in node_indexes] - - node_table = [] - for idx, n in nodes_list: - status_code = n["status"] - table_row = { - "id": idx, - "name": n["name"], - "url": n["url"], - "image": n["image"], - "template": n["template"], - "uuid": n["uuid"], - "status": click.style( - NODE_STATUS_CODES[status_code], fg=NODE_STATUS_COLOR[status_code] - ), - } - node_table.append(table_row) - click.echo(tabulate(node_table, headers="keys", tablefmt="fancy_grid")) - - -@click.group() -@click.pass_context -def node(ctx): - """ - EVE-NG lab commands - """ - - -node.add_command(ls) -node.add_command(start) -node.add_command(stop) -node.add_command(upload_config) diff --git a/src/evengsdk/cli/nodes/__init__.py b/src/evengsdk/cli/nodes/__init__.py deleted file mode 100644 index c551c95..0000000 --- a/src/evengsdk/cli/nodes/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- - -NODE_STATUS_CODES = {0: "stopped", 1: "running", 2: "started", 3: "stopped"} - -NODE_STATUS_COLOR = {0: "red", 1: "green", 2: "green", 3: "red"} diff --git a/src/evengsdk/cli/nodes/commands.py b/src/evengsdk/cli/nodes/commands.py deleted file mode 100644 index a0b7d45..0000000 --- a/src/evengsdk/cli/nodes/commands.py +++ /dev/null @@ -1,343 +0,0 @@ -# -*- coding: utf-8 -*- -from pathlib import Path -import os -import sys - -import click - -from evengsdk.exceptions import EvengHTTPError, EvengApiError -from evengsdk.cli.utils import get_client, get_active_lab -from evengsdk.plugins.display import display -from evengsdk.cli.nodes import NODE_STATUS_CODES, NODE_STATUS_COLOR - - -client = None - - -def get_configs(src): - path = Path(src) - configs = [] - for filename in os.listdir(path): - filepath = Path(filename) - hostname = filepath.stem - fullpath = os.path.join(src, filepath) - with open(fullpath, "r") as handle: - stream = handle.read() - configs.append({"hostname": hostname, "config": stream}) - return configs - - -def get_config(src): - """ - load device config - """ - with open(src, "r") as handle: - stream = handle.read() - return stream - - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.option("-s", "--src", required=True, type=click.Path(exists=True)) -@click.pass_context -def upload_config(ctx, node_id, path, src): - """ - Upload device configuration - """ - try: - client = get_client(ctx) - config = get_config(src) - resp = client.api.upload_node_config(path, node_id, config=config, enable=True) - click.echo(display("text", resp)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.pass_context -def start(ctx, path, node_id): - """ - start node in lab - """ - try: - client = get_client(ctx) - resp = client.api.start_node(path, node_id) - click.echo(display("text", resp)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.pass_context -def stop(ctx, path, node_id): - """ - stop node in lab - """ - try: - client = get_client(ctx) - resp = client.api.stop_node(path, node_id) - click.echo(display("text", resp)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command() -@click.option("--name", help="node name") -@click.option( - "--node-type", default="qemu", type=click.Choice(["iol", "qemu", "dynamips"]) -) -@click.option("--template", required=True, help="node template to create node from") -@click.option("--image", help="image to boot node with") -@click.option("--ethernet", default=2, help="number of ethernet interfaces.") -@click.option("--serial", default=2, help="number of serial interfaces.") -@click.option( - "--console", - default="telnet", - type=click.Choice(["telnet", "vnc"]), - help="number of serial interfaces.", -) -@click.option("--ram", default=1024, help="RAM for node") -@click.option("--cpu", default=1, help="CPU count for node") -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.pass_context -def create( - ctx, - path, - name, - node_type, - template, - image, - ethernet, - serial, - console, - cpu, - ram, -): - """ - Create lab node - """ - try: - client = get_client(ctx) - node = { - "name": name, - "node_type": node_type, - "template": template, - "image": image, - "ethernet": ethernet, - "serial": serial, - "console": console, - "cpu": cpu, - "ram": ram, - } - resp = client.api.add_node(path, **node) - click.echo(display("text", resp)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.pass_context -def wipe(ctx, path, node_id): - """ - Create lab node - """ - try: - client = get_client(ctx) - client.api.get_node(path, node_id) - resp = client.api.wipe_node(path, node_id) - click.echo(display("text", resp)) - except EvengHTTPError as e: - if "Cannot find node" in str(e): - sys.exit(click.style("could not find specified node in lab", fg="red")) - else: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command(name="export") -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.pass_context -def export_node(ctx, path, node_id): - """ - Create export node configuration (save) - """ - try: - client = get_client(ctx) - client.api.get_node(path, node_id) - resp = client.api.export_node(path, node_id) - click.echo(display("text", resp)) - except EvengHTTPError as e: - if "Cannot find node" in str(e): - sys.exit(click.style("could not find specified node in lab", fg="red")) - else: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.option("--output", type=click.Choice(["json", "text"]), default="text") -@click.pass_context -def read(ctx, path, node_id, output): - """ - Retrieve lab node details - """ - try: - client = get_client(ctx) - node = client.api.get_node(path, node_id) - - click.secho(node["name"].upper(), fg="yellow", dim=True) - click.echo(display(output, node)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command() -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("-n", "--node-id", required=True) -@click.pass_context -def delete(ctx, path, node_id): - """ - Retrieve lab node details - """ - try: - client = get_client(ctx) - client.api.get_node(path, node_id) - resp = client.api.delete_node(path, node_id) - click.echo(display("text", resp)) - except EvengHTTPError as e: - if "Cannot find node" in str(e): - sys.exit(click.style("could not find specified node in lab", fg="red")) - else: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.command(name="list") -@click.option( - "--path", - default=None, - callback=lambda ctx, params, v: v if v else ctx.obj.active_lab, -) -@click.option("--output", type=click.Choice(["json", "text"]), default="text") -@click.pass_context -def ls(ctx, path, output): - """ - list lab nodes - """ - try: - client = get_client(ctx) - resp = client.api.list_nodes(path) - node_indexes = resp.keys() - nodes_list = [(idx, resp[idx]) for idx in node_indexes] - - node_table = [] - for idx, n in nodes_list: - status_code = n["status"] - table_row = { - "id": idx, - "name": n["name"], - "url": n["url"], - "image": n["image"], - "template": n["template"], - "uuid": n["uuid"], - "status": click.style( - NODE_STATUS_CODES[status_code], fg=NODE_STATUS_COLOR[status_code] - ), - } - node_table.append(table_row) - - click.secho(f"Nodes @ {path}", fg="blue") - - keys_to_display = "id name url image uuid template status".split() - click.echo(display(output, node_table, header=keys_to_display)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ctx.obj.error_fmt}{msg}") - except Exception as e: - sys.exit(f"{ctx.obj.unknown_error_fmt}{str(e)}") - - -@click.group() -@click.pass_context -def node(ctx): - """node sub commands - - Manage EVE-NG lab nodes - """ - global client - - # get active lab path from eve-ng dir or ENV - ctx.obj.active_lab = get_active_lab(ctx.obj.active_lab_dir) - - client = ctx.obj.client - - -node.add_command(ls) -node.add_command(create) -node.add_command(read) -node.add_command(delete) -node.add_command(start) -node.add_command(stop) -node.add_command(wipe) -node.add_command(export_node) -node.add_command(upload_config) diff --git a/src/evengsdk/cli/system/commands.py b/src/evengsdk/cli/system/commands.py index de316fc..11cd28f 100644 --- a/src/evengsdk/cli/system/commands.py +++ b/src/evengsdk/cli/system/commands.py @@ -1,129 +1,163 @@ # -*- coding: utf-8 -*- -import sys - import click +from evengsdk.cli.common import list_command from evengsdk.cli.utils import get_client -from evengsdk.plugins.display import display -from evengsdk.exceptions import EvengHTTPError, EvengApiError +from evengsdk.cli.console import cli_print_output client = None -ERROR = click.style("ERROR: ", fg="red") -UNKNOWN_ERROR = click.style("UNKNOWN ERROR: ", fg="red") +@list_command @click.command(name="list-node-templates") -@click.option("--include-missing", is_flag=True, default=False) -@click.option("--output", type=click.Choice(["json", "text", "table"]), default="text") @click.pass_context -def templates(ctx, output, include_missing): +def templates(ctx, output): """ list EVE-NG node templates + + \b + Examples: + eveng list-node-templates """ - try: - client = get_client(ctx) - resp = client.api.list_node_templates(include_missing=include_missing) - click.secho("Node Templates", fg="blue") - table_header = ["Template", "Description"] - click.echo(display(output, resp, header=table_header)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ERROR}{msg}") - except Exception as e: - sys.exit(f"{UNKNOWN_ERROR}{str(e)}") + client = get_client(ctx) + resp = client.api.list_node_templates() + + if output == "table": + table_data = [] + style = {"true": "green", "false": "red"} + for key, value in resp["data"].items(): + template_image_available = "true" if "missing" not in value else "false" + this_style = style[template_image_available] + table_data.append( + { + "name": key, + "description": value, + "available": f"[{this_style}]{template_image_available}[/{this_style}]", + } + ) + + table_header = [ + ("Name", dict(justify="right", style="cyan", no_wrap=True)), + ("Description", {}), + ("Available", dict(justify="center")), + ] + cli_print_output( + output, + {"data": table_data}, + table_header=table_header, + table_title="Node Templates", + ) + else: + cli_print_output("json", resp) @click.command(name="show-template") -@click.option("--output", type=click.Choice(["json", "text"]), default="text") @click.argument("template_name") @click.pass_context -def read_template(ctx, template_name, output): +def read_template(ctx, template_name): """ get EVE-NG node template details + + \b + Examples: + eveng show-template veos """ - try: - client = get_client(ctx) - resp = client.api.node_template_detail(template_name) - click.secho(f"Node Template: {template_name}", fg="blue") - click.echo(display(output, resp)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ERROR}{msg}") - except Exception as e: - sys.exit(f"{UNKNOWN_ERROR}{str(e)}") + client = get_client(ctx) + resp = client.api.node_template_detail(template_name) + if resp: + del resp["data"]["options"]["icon"]["list"] + text_header = f"Node Template: {template_name}" + cli_print_output("json", resp, header=text_header) +@list_command @click.command(name="list-network-types") -@click.option("--output", type=click.Choice(["json", "text", "table"]), default="text") @click.pass_context def network_types(ctx, output): """ list EVE-NG network types - """ - try: - client = get_client(ctx) - resp = client.api.list_networks() - click.secho("Network Types", fg="blue") - table_header = ["Network Type", "Name"] - click.echo(display(output, resp, header=table_header)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ERROR}{msg}") - except Exception as e: - sys.exit(f"{UNKNOWN_ERROR}{str(e)}") - + \b + Examples: + eveng list-network-types + """ + client = get_client(ctx) + resp = client.api.list_networks() + if output == "table": + table_data = [ + {"name": key, "description": value} for key, value in resp["data"].items() + ] + + table_header = [ + ("Name", dict(justify="right", style="cyan", no_wrap=True)), + ("Description", {}), + ] + cli_print_output( + output, + {"data": table_data}, + table_header=table_header, + table_title="Network Types", + ) + cli_print_output(output, resp, header="Network Types") + + +@list_command @click.command(name="list-user-roles") -@click.option("--output", type=click.Choice(["json", "text", "table"]), default="text") @click.pass_context def user_roles(ctx, output): """ list EVE-NG user roles - """ - try: - client = get_client(ctx) - resp = client.api.list_user_roles() - click.secho("User Roles", fg="blue") - table_header = ["Role Name", "Description"] - click.echo(display(output, resp, header=table_header)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ERROR}{msg}") - except Exception as e: - sys.exit(f"{UNKNOWN_ERROR}{str(e)}") - + \b + Examples: + eveng list-user-roles + """ + client = get_client(ctx) + resp = client.api.list_user_roles() + if output == "table": + table_data = [ + {"name": key, "description": value} for key, value in resp["data"].items() + ] + + table_header = [ + ("Name", dict(justify="right", style="cyan", no_wrap=True)), + ("Description", {}), + ] + cli_print_output( + output, + {"data": table_data}, + table_header=table_header, + table_title="User Roles", + ) + cli_print_output("json", resp, header="User Roles") + + +@list_command @click.command(name="show-status") -@click.option("--output", type=click.Choice(["json", "text", "table"]), default="text") @click.pass_context def status(ctx, output): - """View EVE-NG server status""" - try: - client = get_client(ctx) - status = client.api.get_server_status() - click.secho("System", fg="blue") - table_header = ["Component", "Status"] - click.echo(display(output, status, header=table_header)) - except (EvengHTTPError, EvengApiError) as e: - msg = click.style(str(e), fg="bright_white") - sys.exit(f"{ERROR}{msg}") - except Exception as e: - sys.exit(f"{UNKNOWN_ERROR}{str(e)}") - - -# @click.group() -# @click.pass_context -# def system(ctx): -# """ -# EVE-NG system commands -# """ -# global client -# client = ctx.obj.client - - -# system.add_command(status) -# system.add_command(templates) -# system.add_command(read_template) -# system.add_command(network_types) -# system.add_command(user_roles) + """View EVE-NG server status + + \b + Examples: + eveng show-status + """ + client = get_client(ctx) + resp = client.api.get_server_status() + if output == "table": + table_data = [ + {"name": key, "value": value} for key, value in resp["data"].items() + ] + + table_header = [ + ("Name", dict(justify="right", style="cyan", no_wrap=True)), + ("Value", {}), + ] + cli_print_output( + output, + {"data": table_data}, + table_header=table_header, + table_title="Server Status", + ) + cli_print_output(output, resp, header="System") diff --git a/src/evengsdk/cli/utils.py b/src/evengsdk/cli/utils.py index 69ac32a..8a08b9d 100644 --- a/src/evengsdk/cli/utils.py +++ b/src/evengsdk/cli/utils.py @@ -40,7 +40,7 @@ def to_human_readable(obj: Dict, keys: List[str] = []) -> str: def thread_executor(func, items): - futures = list() + futures = [] with ThreadPoolExecutor(max_workers=5) as executor: for future in executor.map(func, items): futures.append(future) @@ -73,6 +73,5 @@ def get_active_lab(eveng_directory: str): active_lab_filepath = Path(eveng_directory) / "active" if active_lab_filepath.exists(): - active_lab = active_lab_filepath.read_text() - return active_lab + return active_lab_filepath.read_text() return os.environ.get("EVE_NG_LAB_PATH") diff --git a/src/evengsdk/cli/version.py b/src/evengsdk/cli/version.py index 981d99a..5f155f7 100644 --- a/src/evengsdk/cli/version.py +++ b/src/evengsdk/cli/version.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -__version__ = "1.0" +__version__ = "0.2.0" diff --git a/src/evengsdk/client.py b/src/evengsdk/client.py index 0296ff2..5c85208 100644 --- a/src/evengsdk/client.py +++ b/src/evengsdk/client.py @@ -1,177 +1,158 @@ -# -*- coding: utf-8 -*- import json import logging import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning - from evengsdk.api import EvengApi -from evengsdk.exceptions import EvengHTTPError, EvengLoginError -DISABLE_INSECURE_WARNINGS = True +from evengsdk.exceptions import EvengHTTPError, EvengLoginError class EvengClient: def __init__( - self, host, log_level="INFO", log_file=None, port=80, verify=False, **kwargs + self, + host: str = None, + protocol: str = "http", + log_file: str = None, + log_level: str = "INFO", + port: int = None, + disable_insecure_warnings: bool = False, ): self.host = host - self.port = port - self.authdata = None - self.verify = verify - self.cookies = None - self.url_prefix = "" - self.api = None - self.session = {} - self.timeout = 10 + self.protocol = protocol + self.session = None + self.log_level = log_level + self.log_file = log_file self.html5 = -1 - self.headers = { - "Accept": "application/json", - "Content-Type": "application/json", - } - - if DISABLE_INSECURE_WARNINGS: - requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + self.api = None + self.port = port # Create Logger and set Set log level - self.log = logging.getLogger("eve-client") + self.log = logging.getLogger("eveng-client") self.set_log_level(log_level) if log_file: self.log.addHandler(logging.FileHandler(log_file)) else: self.log.addHandler(logging.NullHandler()) - def set_log_level(self, log_level="INFO"): + # disable insecure warnings + if disable_insecure_warnings: + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + + @property + def url_prefix(self): + """Return full url prefix for EVE-NG API.""" + if self.port: + return f"{self.protocol}://{self.host}:{self.port}/api" + return f"{self.protocol}://{self.host}/api" + + def set_log_level(self, log_level: str) -> None: """Set log level for logger. Defaults to INFO if no level passed in or if an invalid level is passed in. :param log_level: Log level to use for logger, defaults to 'INFO' :type log_level: str, optional """ - log_level = log_level.upper() LOG_LEVELS = ("NOTSET", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL") - if log_level not in LOG_LEVELS: + if log_level.upper() not in LOG_LEVELS: log_level = "INFO" self.log.setLevel(getattr(logging, log_level)) - def login(self, username: str, password: str, verify: bool = False) -> None: - """Initiate login to EVE-NG host. Api object is created - after successful login. + def login(self, username: str, password: str, *args, **kwargs) -> None: + """Initiate login to EVE-NG host. Accepts args and kwargs for + request.Session object, except "data" key. :param username: EVE-NG login username, defaults to '' :type username: str, optional :param password: EVE-NG login password, defaults to '' :type password: str, optional - :param verify: verify certificates, defaults to False - :type verify: bool, optional :raises EvengLoginError: raises for unsuccessful logins """ - self.verify = verify - self.authdata = { - "username": username, - "password": password, - "html5": self.html5, - } + login_endpoint = self.url_prefix + "/auth/login" + authdata = {"username": username, "password": password, "html5": self.html5} self.log.debug("creating session") - self._create_session() - if not self.session: - msg = "Please check your login credentials and try again" - raise EvengLoginError("Could not login to {}: {}".format(self.host, msg)) - - self.api = EvengApi(self) + self.session = requests.Session() - def _create_session(self): - """ - Login to EVE-NG host and set session information - """ - host = self.host - protocol = {80: "http", 443: "https"} - self.url_prefix = f"{protocol.get(self.port, 'http')}://{host}:{self.port}/api" - - self.session = requests.Session() - url = self.url_prefix + "/auth/login" - - r = self.session.post(url, data=json.dumps(self.authdata), verify=self.verify) + # set default session header + self.session.headers = { + "Accept": "application/json", + "Content-Type": "application/json", + } - errors = "" + _ = kwargs.pop("data", None) # avoids duplicate `data` key for Session + r = self.session.post( + login_endpoint, data=json.dumps(authdata), *args, **kwargs + ) if r.ok: try: "logged in" in r.json() - self.log.debug(r.json()) - except json.decoder.JSONDecodeError as ex: - errors += str(ex) + self.api = EvengApi(self) # create API wrapper object + except json.decoder.JSONDecodeError: + self.log.error("Error logging in: {}".format(r.text)) + raise EvengLoginError("Error logging in: {}".format(r.text)) else: self.session = {} - errors += r.reason - - if errors: - raise EvengLoginError("Could Not login @ {url}\n{errors}") + raise EvengLoginError("Error logging in: {}".format(r.text)) def logout(self): + try: + self.session.get(self.url_prefix + "/auth/logout") + finally: + self.session = None + + def _make_request( + self, method: str, url: str, use_prefix: bool = True, *args, **kwargs + ) -> dict: + """Craft request to EVE-NG API + + :param method: request method + :type method: str + :param url: full url or endpoint for request + :type url: str + :raises ValueError: if no session exists + :raises ValueError: if response object does not contain valid JSON data + :return: Response dictionary from EVE-NG API + :rtype: dict """ - Logout of of EVE-NG host - """ - if self.session: - logout_endpoint = "/auth/logout" - self.get(logout_endpoint) - self.session = {} - - def post(self, url, **kwargs): - return self._make_request("POST", url, **kwargs) - - def get(self, url, **kwargs): - return self._make_request("GET", url, **kwargs) - - def put(self, url, **kwargs): - return self._make_request("PUT", url, **kwargs) - - def patch(self, url, **kwargs): - return self._make_request("PATCH", url, **kwargs) - - def delete(self, url, **kwargs): - return self._make_request("DELETE", url, **kwargs) - - def _make_request(self, method, url, **kwargs): if not self.session: raise ValueError("No valid session exist") - if self.url_prefix not in url: + if use_prefix and self.url_prefix not in url: url = self.url_prefix + url - # craft and send the request - self.log.debug("making {} - {}".format(method, url)) - r = self._send_request(method, url, verify=self.verify, **kwargs) + req = requests.Request(method, url, *args, **kwargs) + prepped_req = self.session.prepare_request(req) - # parse response data + r = self.session.send(prepped_req) if r.ok: try: - return r.json()["data"] - except json.JSONDecodeError: - raise ValueError("Invalid JSON data") - except KeyError: return r.json() - else: - err = f"[{r.status_code}] - {r.reason}, {r.text}" - raise EvengHTTPError(err) + except json.JSONDecodeError: + return r + self.log.error("Error: {}".format(r.text)) + + # EVE-NG API returns HTTP error code and message in JSON response + if hasattr(r, "json"): + err_code = r.json().get("code") + err_msg = r.json().get("message") + raise EvengHTTPError("Error: {} {}".format(err_code, err_msg)) + + # Other HTTP errors for which we don't have a JSON response r.raise_for_status() - def _send_request(self, method, url, **kwargs): - try: - headers = kwargs.pop("headers") - except KeyError: - headers = self.headers - - self.log.debug(headers) - if method == "DELETE": - resp = self.session.delete(url, **kwargs) - elif method == "GET": - resp = self.session.get(url, **kwargs) - elif method == "PUT": - resp = self.session.put(url, **kwargs) - elif method == "PATCH": - resp = self.session.patch(url, **kwargs) - elif method == "POST": - resp = self.session.post(url, **kwargs) - return resp + def post(self, url: str, *args, **kwargs): + return self._make_request("POST", url, *args, **kwargs) + + def get(self, url: str, *args, **kwargs): + return self._make_request("GET", url, *args, **kwargs) + + def put(self, url: str, *args, **kwargs): + return self._make_request("PUT", url, *args, **kwargs) + + def patch(self, url: str, *args, **kwargs): + return self._make_request("PATCH", url, *args, **kwargs) + + def delete(self, url: str, *args, **kwargs): + return self._make_request("DELETE", url, *args, **kwargs) diff --git a/src/evengsdk/exceptions.py b/src/evengsdk/exceptions.py index 67c1363..edbc2f9 100644 --- a/src/evengsdk/exceptions.py +++ b/src/evengsdk/exceptions.py @@ -13,21 +13,21 @@ def __str__(self): class EvengHTTPError(EvengClientError): - """ Error encountered related to the client making an HTTP call""" + """Error encountered related to the client making an HTTP call""" def __init__(self, msg): super().__init__(msg) class EvengApiError(EvengClientError): - """ Error encountered related to the Eveng API request""" + """Error encountered related to the Eveng API request""" def __init__(self, msg): super().__init__(msg) class EvengLoginError(EvengClientError): - """ Error encountered with user credentials at login """ + """Error encountered with user credentials at login""" def __init__(self, msg): super().__init__(msg) diff --git a/src/evengsdk/inventory.py b/src/evengsdk/inventory.py deleted file mode 100644 index c914fd1..0000000 --- a/src/evengsdk/inventory.py +++ /dev/null @@ -1,17 +0,0 @@ -from jinja2 import Environment, PackageLoader - - -def build_inventory(eve_host, lab_path, nodes): - for node in nodes: - node["console_port"] = node["url"].split(":")[2] - node["console_server"] = eve_host - - template_data = { - "lab_path": lab_path, - "eve_host": eve_host, - "groups": {"all": nodes}, - } - env = Environment(loader=PackageLoader("evengsdk", "templates")) - template = env.get_template("inventory.ini.j2") - inventory = template.render(template_data) - return inventory diff --git a/src/evengsdk/plugins/display.py b/src/evengsdk/plugins/display.py index 8bf6bc2..b5d3a71 100644 --- a/src/evengsdk/plugins/display.py +++ b/src/evengsdk/plugins/display.py @@ -2,11 +2,10 @@ # standard lib imports import html import json as jsonlib -from typing import List, Dict, Union +from typing import List, Dict, Union, Any # third party lib imports -import click -from tabulate import tabulate +from rich.table import Table # package imports @@ -19,7 +18,7 @@ def register_plugin(func): return func -def display(plugin: str, data: Union[List, Dict], *args, **kwargs) -> str: +def format_output(plugin: str, data: Union[List, Dict], *args, **kwargs) -> str: if plugin in _PLUGINS: return _PLUGINS[plugin](data, *args, **kwargs) else: @@ -29,29 +28,45 @@ def display(plugin: str, data: Union[List, Dict], *args, **kwargs) -> str: @register_plugin def json(data, *args, **kwargs): indent = kwargs.get("indent", 2) - fg_color = kwargs.get("fg_color", "bright_white") - return click.style(jsonlib.dumps(data, indent=indent), fg=fg_color) + if isinstance(data, dict): + return jsonlib.dumps(data.get("data", data), indent=indent) + return jsonlib.dumps(data, indent=indent) @register_plugin def table(data, *args, **kwargs): - header = kwargs.get("header") + table = Table( + title=kwargs.get("table_title", None), + show_header=kwargs.get("show_header", True), + ) + table_header_and_opts = kwargs.get("table_header") # tuples of (header, opts) + keys = data["data"][0].keys() # keys from first item in data + + # use the first item in table_header_and_opts to set the header; default to keys in data + table_header = [x[0] for x in table_header_and_opts] or list(keys) + + # determine which keys to display + keys_to_drop = ( + set(keys) - {x.lower() for x in table_header} if table_header else set() + ) + table_data = data.get("data", []) display_table = [] - fmt = kwargs.get("tablefmt", "grid") - - if isinstance(data, dict) and header: - display_table = iter(data.items()) - return tabulate(display_table, headers=header, tablefmt=fmt) - elif isinstance(data, list): - for item in data: - # trim dict keys to match header passed in - keys_to_drop = set(item) - set(header) if header else set() + if isinstance(table_data, list): + for item in table_data: for key in keys_to_drop: if isinstance(item, dict): del item[key] display_table.append(item) - return tabulate(display_table, headers="keys", tablefmt=fmt) + + if table_header: + for col_name, col_options in table_header_and_opts: + formatted_col_name = col_name.title().replace("_", " ") + table.add_column(formatted_col_name, **col_options) + + for row in display_table: + table.add_row(*[f"{row[key.lower()]}" for key in table_header]) + return table def _dict_to_string(obj: dict) -> str: @@ -65,43 +80,39 @@ def _dict_to_string(obj: dict) -> str: @register_plugin def text( - data: Dict, - header: List[str] = [], - fg_color: str = "bright_white", - record_header: str = "", - record_header_fg_color: str = "yellow", + data: Any, + record_header_key: str = "", + *args, + **kwargs, ) -> str: - """Generate human readable output for passed object - - Args: - data (Dict): dict or list of dicts to format as output - header (List[str], optional): list of keys to output. Defaults to []. - fg_color (str, optional): fg color for output. Defaults to - "bright_white". - record_header (str, optional): Header to display for each record in a - list. Defaults to "". - - Returns: - str: formatted output string - """ - string_output = "\n" - - if isinstance(data, dict): - for ln in _dict_to_string(data): + """Format data as text""" + string_output = "" + display_data = data.get("data") + + # sometimes we just have a status message + if display_data is None and data.get("message") is not None: + string_output = f"{data.get('status')}: {data.get('message')}" + return string_output + + # render dicts as text output + if isinstance(display_data, dict): + for ln in _dict_to_string(display_data): string_output += ln - - elif isinstance(data, list): - for obj in data: - if record_header: - string_output += click.style( - obj[record_header].upper(), fg=record_header_fg_color + return string_output + + # render lists as text output, if a record_header_key is passed + # we retrieve the value of that key from each record and use it as the header in the output text + elif isinstance(display_data, list): + for obj in display_data: + if record_header_key: + string_output += ( + f"[bold][cyan]{obj.get(record_header_key).upper()}[/cyan][/bold]" ) string_output += "\n" if isinstance(obj, dict): for ln in _dict_to_string(obj): - string_output += ln + string_output += f"[white]{ln}[/white]" string_output += "\n" - else: - string_output += str(data) - return click.style(string_output, fg=fg_color) + return string_output + return data diff --git a/src/evengsdk/schemas/__init__.py b/src/evengsdk/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evengsdk/schemas/lab-schema.json b/src/evengsdk/schemas/lab-schema.json new file mode 100644 index 0000000..6e397b1 --- /dev/null +++ b/src/evengsdk/schemas/lab-schema.json @@ -0,0 +1,507 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "definitions": { + "labName": { + "type": "string", + "description": "Name", + "minLength": 1, + "maxLength": 255 + }, + "labPath": { + "type": "string", + "description": "Path", + "default": "/" + }, + "labVersion": { + "type": "number", + "description": "Version", + "default": 0 + }, + "labAuthor": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "title": "Author" + }, + "labScriptTimeout": { + "type": "number", + "default": 300, + "title": "Config script timeout" + }, + "labDescription": { + "type": "string", + "title": "Description" + }, + "labTasks": { + "type": "string", + "title": "Tasks" + }, + "labBody": { + "type": "string", + "title": "Body" + }, + "nodeName": { + "type": "string", + "minLength": 1, + "title": "Name/Prefix" + }, + "nodeConfig": { + "type": "number", + "enum": [0, 1], + "default": 0, + "title": "Startup config", + "description": "Startup config configured" + }, + "nodeDelay": { + "type": "number", + "default": 0, + "title": "Delay", + "description": "Seconds to wait before starting the node" + }, + "nodeLeft": { + "type": "number", + "title": "Left", + "description": "Margin from left, in percentage (i.e. 35%)" + }, + "nodeTop": { + "type": "number", + "title": "Top", + "description": "Margin from top, in percentage (i.e. 35%)" + }, + "nodeIcon": { + "type": "string", + "title": "Icon", + "description": "Node Icon filename" + }, + "nodeImage": { + "type": "string", + "title": "Image", + "description": "The Application Service Port. Use '0' for ICMP only" + }, + "nodeTemplate": { + "type": "string", + "enum": [ + "a10", + "osx", + "veos", + "clearpass", + "arubacx", + "aruba", + "barracuda", + "brocadevadx", + "cpsg", + "acs", + "ampcloud", + "apicem", + "asa", + "asav", + "c9800cl", + "cda", + "csr1000v", + "csr1000vng", + "cucm", + "dcnm", + "phoebe", + "cexpresw", + "firepower", + "firepower6", + "iol", + "c1710", + "c3725", + "c7200", + "cips", + "ise", + "cms", + "titanium", + "nxosv9k", + "prime", + "stealth", + "uccx", + "cup", + "ucspe", + "cue", + "vios", + "viosl2", + "vnam", + "vwaas", + "vwlc", + "coeus", + "xrv", + "xrv9k", + "nsvpx", + "ctxsdw", + "cumulus", + "cyberoam", + "extremexos", + "bigip", + "fortinet", + "hpvsr", + "huaweiar1k", + "huaweiusg6kv", + "infoblox", + "olive", + "junipervrr", + "vmx", + "vmxvcp", + "vmxvfp", + "vqfxpfe", + "vqfxre", + "vsrx", + "vsrxng", + "jspace", + "kerio", + "linux", + "mikrotik", + "newimage", + "timoscpm", + "timosiom", + "timos", + "ostinato", + "paloalto", + "pfsense", + "scrutinizer", + "pulse", + "alteon", + "riverbed", + "sterra", + "silveredge", + "silverorch", + "sonicwall", + "sophosutm", + "sophosxg", + "trendmivtps", + "veloedge", + "velogw", + "veloorch", + "versaana", + "versadir", + "versafvnf", + "vtbond", + "vtedge", + "vtmgmt", + "vtsmart", + "vpcs", + "esxi", + "nsx", + "vcenter", + "vyos", + "win", + "winserver" + ], + "title": "Template", + "description": "Template for device image and type" + }, + "nodeType": { + "type": "string", + "title": "Node hypervisor type", + "enum": ["qemu", "dynamips", "iol"], + "default": "qemu" + }, + "nodeCpu": { + "type": "number", + "title": "CPU", + "default": 1 + }, + "nodeRam": { + "type": "number", + "title": "RAM", + "default": 1024, + "description": "MB of RAM configured for the node" + }, + "nodeEthernet": { + "title": "Ethernet", + "type": "number", + "description": "Number of Ethernet ports", + "default": 2 + }, + "nodeSerial": { + "title": "Serial", + "type": "number" + }, + "nodeConsole": { + "title": "Console", + "type": "string", + "enum": ["telnet", "vnc"], + "default": "telnet" + }, + "nodeConfigurationFile": { + "type": "string", + "title": "Configuration file path", + "minLength": 1 + }, + "nodeConfigurationTemplate": { + "type": "string", + "title": "Configuration template", + "minLength": 1 + }, + "nodeConfigurationTemplateVars": { + "type": "object", + "title": "Configuration template variables" + }, + "nodeConfigurationTemplateVarsfile": { + "type": "string", + "title": "Configuration template variables file" + }, + "nodeConfigurationFileOption": { + "type": "object", + "properties": { + "file": { + "$ref": "#/definitions/nodeConfigurationFile" + } + }, + "required": ["file"] + }, + "nodeConfigurationTemplateOption": { + "type": "object", + "properties": { + "template": { + "$ref": "#/definitions/nodeConfigurationTemplate" + }, + "vars": { + "oneOf": [ + { + "$ref": "#/definitions/nodeConfigurationTemplateVars" + }, + { + "$ref": "#/definitions/nodeConfigurationTemplateVarsfile" + } + ], + "minimumProperties": 1 + } + }, + "required": ["template", "vars"] + }, + "node": { + "type": "object", + "properties":{ + "console": { + "$ref": "#/definitions/nodeConsole" + }, + "config": { + "$ref": "#/definitions/nodeConfig" + }, + "delay": { + "$ref": "#/definitions/nodeDelay" + }, + "left": { + "$ref": "#/definitions/nodeLeft" + }, + "icon": { + "$ref": "#/definitions/nodeIcon" + }, + "image": { + "$ref": "#/definitions/nodeImage" + }, + "name": { + "$ref": "#/definitions/nodeName" + }, + "template": { + "$ref": "#/definitions/nodeTemplate" + }, + "node_type": { + "$ref": "#/definitions/nodeType" + }, + "top": { + "$ref": "#/definitions/nodeTop" + }, + "cpu": { + "$ref": "#/definitions/nodeCpu" + }, + "ram": { + "$ref": "#/definitions/nodeRam" + }, + "ethernet": { + "$ref": "#/definitions/nodeEthernet" + }, + "serial": { + "$ref": "#/definitions/nodeSerial" + }, + "configuration": { + "title": "Node configuration file or template", + "oneOf": [ + {"$ref": "#/definitions/nodeConfigurationFileOption"}, + {"$ref": "#/definitions/nodeConfigurationTemplateOption"} + ] + } + }, + "required": ["name", "image", "template"] + }, + "networkName": { + "type": "string", + "minLength": 1, + "title": "Name" + }, + "networkVisibility": { + "type": "number", + "enum": [0, 1], + "default": 1, + "title": "Network Visibility" + }, + "networkTop": { + "type": "number", + "title": "Top", + "description": "Margin from top, in percentage (i.e. 35%)" + }, + "networkLeft": { + "type": "number", + "title": "Left", + "description": "Margin from left, in percentage (i.e. 35%)" + }, + "networkType": { + "type": "string", + "enum": [ + "bridge", + "ovs", + "pnet0", + "pnet1", + "pnet2", + "pnet3", + "pnet4", + "pnet5", + "pnet6", + "pnet7", + "pnet8", + "pnet9" + ], + "title": "Name" + }, + "network": { + "name": { + "$ref": "#/definitions/networkName" + }, + "visibility": { + "$ref": "#/definitions/networkVisibility" + }, + "top": { + "$ref": "#/definitions/networkTop" + }, + "left": { + "$ref": "#/definitions/networkLeft" + }, + "network_type": { + "$ref": "#/definitions/networkType" + }, + "required": ["name", "network_type"] + }, + "linkSrc": { + "type": "string", + "title": "Link source" + }, + "linkSrcLabel": { + "type": "string", + "title": "Link source label" + }, + "linkDst": { + "type": "string", + "title": "Link destination" + }, + "linkDstLabel": { + "type": "string", + "title": "Link destination label" + }, + "linkMedia": { + "type": "string", + "title": "Link media", + "enum": ["ethernet", "serial"], + "default": "ethernet" + }, + "nodeToNetworkLink": { + "type": "object", + "properties": { + "src": { + "$ref": "#/definitions/linkSrc" + }, + "src_label": { + "$ref": "#/definitions/linkSrcLabel" + }, + "dst": { + "$ref": "#/definitions/linkDst" + } + }, + "required": ["src", "dst"] + }, + "nodeToNodeLink": { + "type": "object", + "properties": { + "src": { + "$ref": "#/definitions/linkSrc" + }, + "src_label": { + "$ref": "#/definitions/linkSrcLabel" + }, + "dst": { + "$ref": "#/definitions/linkDst" + }, + "dst_label": { + "$ref": "#/definitions/linkDstLabel" + }, + "media": { + "$ref": "#/definitions/linkMedia" + } + }, + "required": ["src", "dst"] + } + }, + "properties": { + "name": { + "$ref": "#/definitions/labName" + }, + "path": { + "$ref": "#/definitions/labPath" + }, + "author": { + "$ref": "#/definitions/labAuthor" + }, + "description": { + "$ref": "#/definitions/labDescription" + }, + "version": { + "$ref": "#/definitions/labVersion" + }, + "tasks": { + "$ref": "#/definitions/labTasks" + }, + "scripttimeout": { + "$ref": "#/definitions/labScriptTimeout" + }, + "body": { + "$ref": "#/definitions/labBody" + }, + "nodes": { + "title": "nodes", + "type": "array", + "items": { + "$ref": "#/definitions/node" + } + }, + "networks": { + "title": "networks", + "type": "array", + "items": { + "$ref": "#/definitions/network" + } + }, + "links": { + "title": "links", + "type": "object", + "properties": { + "network": { + "type": "array", + "title": "Node to Network Link", + "items": { + "$ref": "#/definitions/nodeToNetworkLink" + } + }, + "node": { + "type": "array", + "title": "Node to Node Link", + "items": { + "$ref": "#/definitions/nodeToNodeLink" + } + } + } + } + }, + "required": ["name"] +} diff --git a/src/evengsdk/schemas/validator.py b/src/evengsdk/schemas/validator.py new file mode 100644 index 0000000..690a6d4 --- /dev/null +++ b/src/evengsdk/schemas/validator.py @@ -0,0 +1,16 @@ +import json +from pathlib import Path + +from jsonschema import Draft7Validator + + +SCHEMAFILE = Path(__file__).parent / "lab-schema.json" + + +class SchemaValidator: + def __init__(self): + self.schema = json.loads(SCHEMAFILE.read_text()) + self.validator = Draft7Validator(schema=self.schema) + + def validate(self, topology: dict): + return self.validator.validate(topology) diff --git a/src/evengsdk/templates.py b/src/evengsdk/templates.py index 5dde3f7..2c90c75 100644 --- a/src/evengsdk/templates.py +++ b/src/evengsdk/templates.py @@ -1,34 +1,57 @@ -# -*- coding: utf-8 -*- -from jinja2 import BaseLoader, Environment - - -def render_template(templateIO, data): - """ - Render a Jinja template with supplied data - - Parameters: - templateIO (str): jinja2 formatted string template - data (dict): data to be rendered to template - - Returns: - str: rendered string - """ - env = Environment(loader=BaseLoader(), trim_blocks=True, lstrip_blocks=True) - template = env.from_string(templateIO) - return template.render(data) - - -def render_from_path(path, data): - """ - Load template string from given path and render - - Parameters: - path (str): path to template - data (dict): data to be rendered to template - - Returns: - str: rendered string - """ - with open(path, "r") as f: - template_string = f.read() - return render_template(template_string, data) +from pathlib import Path +from typing import Union, List, Any + +from jinja2 import Environment, FileSystemLoader, Template + + +class ConfigTemplateBuilder: + def __init__(self, template_dir: str = "templates"): + self._template_path = Path(template_dir) + self._set_env() + + def _set_env(self) -> Environment: + """Create a jinja2 environment with the given template directory. + + :return: jinja2 environment + :rtype: Environment + """ + env = Environment( + loader=FileSystemLoader(self._template_path), + trim_blocks=True, + lstrip_blocks=True, + keep_trailing_newline=True, + extensions=["jinja2.ext.do"], + ) + self.env = env + + def _get_template_path(self) -> Path: + return self._template_path + + @property + def template_path(self) -> Path: + return self._get_template_path() + + @template_path.setter + def template_path(self, template_path: str): + if Path(template_path).is_dir(): + self._template_path = Path(template_path) + self._set_env() + + def _render(self, template: Template, context: Any) -> str: + return template.render(context) + + def render_template( + self, template_name_or_list: Union[str, List[str]], context: Any + ) -> str: + """Render a template with the given context. + + :param template_name_or_list: name of the template to render or a list of template names. + If a list, the first template that can be rendered will be used. + :type template_name_or_list: Union[str, List[str]] + :param context: The data to render the template with. + :type context: Any + :return: templated string + :rtype: str + """ + template = self.env.get_or_select_template(template_name_or_list) + return self._render(template, context) diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 94562d8..2b0c4c4 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -10,7 +10,9 @@ @pytest.fixture(scope="session") def client(): - return EvengClient(os.environ["EVE_NG_HOST"], log_file="test.log") + return EvengClient( + os.environ["EVE_NG_HOST"], log_file="test.log", log_level="DEBUG" + ) @pytest.fixture(scope="session") diff --git a/src/tests/data/topology_empty_lab_name.yaml b/src/tests/data/topology_empty_lab_name.yaml new file mode 100644 index 0000000..87e7af3 --- /dev/null +++ b/src/tests/data/topology_empty_lab_name.yaml @@ -0,0 +1,64 @@ +--- +name: +description: Arista VEOS leaf-spine lab +path: "/test/path" +nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 +networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 +links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} diff --git a/src/tests/data/topology_lab_tests.yaml b/src/tests/data/topology_lab_tests.yaml new file mode 100644 index 0000000..5208163 --- /dev/null +++ b/src/tests/data/topology_lab_tests.yaml @@ -0,0 +1,195 @@ +--- +empty_lab_name: + name: + description: Arista VEOS leaf-spine lab + path: "/test/path" + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + + +missing_lab_name: + description: Arista VEOS leaf-spine lab + path: "/test/path" + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + + +missing_lab_path: + name: test + description: Arista VEOS leaf-spine lab + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} diff --git a/src/tests/data/topology_missing_lab_name.yaml b/src/tests/data/topology_missing_lab_name.yaml new file mode 100644 index 0000000..27cba3d --- /dev/null +++ b/src/tests/data/topology_missing_lab_name.yaml @@ -0,0 +1,63 @@ +--- +description: Arista VEOS leaf-spine lab +path: "/test/path" +nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 +networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 +links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} diff --git a/src/tests/data/topology_node_tests.yaml b/src/tests/data/topology_node_tests.yaml new file mode 100644 index 0000000..3ae2082 --- /dev/null +++ b/src/tests/data/topology_node_tests.yaml @@ -0,0 +1,328 @@ +--- +missing_node_name: + name: test topology + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + + +missing_node_template: + name: test topology + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - name: leaf01 + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + + +missing_node_image: + name: test topology + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - name: leaf01 + template: veos + node_type: qemu + left: 50 + top: 135 + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + + +node_config_is_null: + name: test topology + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + configuration: null + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} + + +invalid_node_type: + name: test topology + description: Arista VEOS leaf-spine lab + path: "/" + nodes: + - name: leaf01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 50 + top: 135 + configuration: null + - name: leaf02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 200 + top: 135 + - name: leaf03 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 135 + - name: leaf04 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 500 + top: 135 + - name: spine01 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 150 + top: 474 + - name: spine02 + template: veos + image: veos-4.22.0F + node_type: qemu + left: 350 + top: 474 + networks: + - name: vCloud + network_type: pnet1 + visibility: 1 + top: 300 + left: 475 + links: + network: + - {"src": "leaf01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf02", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf03", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "leaf04", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine01", "src_label": "Mgmt1", "dst": "vCloud"} + - {"src": "spine02", "src_label": "Mgmt1", "dst": "vCloud"} + node: + - {"src": "leaf01", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth1", "media": "ethernet"} + - {"src": "leaf02", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth3", "dst": "spine01", "dst_label": "Eth4"} + - {"src": "leaf01", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth1"} + - {"src": "leaf02", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth2"} + - {"src": "leaf03", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth3"} + - {"src": "leaf04", "src_label": "Eth2", "dst": "spine02", "dst_label": "Eth4"} diff --git a/src/tests/test_api.py b/src/tests/test_api.py index 82946e5..9db6c2f 100644 --- a/src/tests/test_api.py +++ b/src/tests/test_api.py @@ -18,21 +18,21 @@ class TestEvengApi: - """ Test cases """ + """Test cases""" - def test_api_get_get_server_status(self, authenticated_client): + def test_api_get_server_status(self, authenticated_client): """ Verify server status using the API """ - status = authenticated_client.api.get_server_status() - assert status.get("cpu") is not None + r = authenticated_client.api.get_server_status() + assert r["data"].get("cpu") is not None def test_list_node_templates(self, authenticated_client): """ Verify we can list node templates from API """ - templates = authenticated_client.api.list_node_templates() - assert isinstance(templates, dict) + r = authenticated_client.api.list_node_templates() + assert r["data"] is not None def test_node_template_detail(self, authenticated_client): """ @@ -48,22 +48,22 @@ def test_list_users(self, authenticated_client): Verify that we can retrieve list of users and that the default 'admin' user exists. """ - users = authenticated_client.api.list_users() - assert "admin" in users + r = authenticated_client.api.list_users() + assert "admin" in r["data"] def test_list_user_roles(self, authenticated_client): """ Verify that we can retrieve list of user roles """ - roles = authenticated_client.api.list_user_roles() - assert "admin" in roles + r = authenticated_client.api.list_user_roles() + assert "admin" in r["data"] def test_get_user(self, authenticated_client): """ Verify that we can retrieve a single user detail """ - user_details = authenticated_client.api.get_user("admin") - assert "email" in user_details + r = authenticated_client.api.get_user("admin") + assert "email" in r["data"] def test_get_non_existing_user(self, authenticated_client): """ @@ -82,7 +82,7 @@ def test_add_user(self, authenticated_client): for username, password in iter(USERS["to_create"]): try: r = authenticated_client.api.add_user(username, password) - assert r.get("status") == "success" + assert r["status"] == "success" except EvengHTTPError as e: assert "check if already exists" in str(e) @@ -105,10 +105,10 @@ def test_edit_existing_user(self, authenticated_client): authenticated_client.api.edit_user(user[0], data=new_data) # retrieve updates - updated_user = authenticated_client.api.get_user(user[0]) + r = authenticated_client.api.get_user(user[0]) # ensure new data was PUT successfully - assert updated_user["email"] == new_data["email"] + assert r["data"]["email"] == new_data["email"] def test_edit_non_existing_user(self, authenticated_client): """ @@ -132,8 +132,8 @@ def test_delete_user(self, authenticated_client): Verify that we can delete users """ for username, _ in iter(USERS["to_create"]): - resp = authenticated_client.api.delete_user(username) - assert resp.get("status") == "success" + r = authenticated_client.api.delete_user(username) + assert r["status"] == "success" # make sure it was deleted with pytest.raises(EvengHTTPError): @@ -145,31 +145,29 @@ def test_list_networks(self, authenticated_client): data returned is a dictionary that includes network types and instances. """ - networks = authenticated_client.api.list_networks() - assert networks["bridge"] is not None + r = authenticated_client.api.list_networks() + assert r["data"]["bridge"] is not None def test_list_lab_networks(self, authenticated_client): """ Verify that we can list lab networks. """ - networks = authenticated_client.api.list_lab_networks(LAB_PATH) - assert isinstance(networks, dict) + r = authenticated_client.api.list_lab_networks(LAB_PATH) + assert r["data"] is not None def test_get_lab_network(self, authenticated_client): """ Verify that we can retrieve a specific lab by id """ - network_details = authenticated_client.api.get_lab_network(LAB_PATH, "1") - assert network_details["type"] is not None + r = authenticated_client.api.get_lab_network(LAB_PATH, "1") + assert r["data"]["type"] is not None def test_get_lab_network_by_name(self, authenticated_client): """ Verify that we can retrieve a specific lab by name """ - network_details = authenticated_client.api.get_lab_network_by_name( - LAB_PATH, TEST_NETWORK - ) - assert network_details is not None + r = authenticated_client.api.get_lab_network_by_name(LAB_PATH, TEST_NETWORK) + assert r["name"] is not None def test_list_lab_links(self, authenticated_client): """ @@ -177,15 +175,17 @@ def test_list_lab_links(self, authenticated_client): and serial interfaces. Returns dictionary of existing links or empty dictionary. """ - links = authenticated_client.api.list_lab_links(LAB_PATH) - assert links is not None + r = authenticated_client.api.list_lab_links(LAB_PATH) + assert r["status"] == "success" + assert r["data"] is not None def test_list_nodes(self, authenticated_client): """ Verify that we can retrieve all node details """ - nodes = authenticated_client.api.list_nodes(LAB_PATH) - assert nodes is not None and nodes + r = authenticated_client.api.list_nodes(LAB_PATH) + assert r["status"] == "success" + assert r["data"] is not None def test_get_node(self, authenticated_client): """ @@ -193,7 +193,7 @@ def test_get_node(self, authenticated_client): """ # get with node with ID == 1 node = authenticated_client.api.get_node(LAB_PATH, "1") - assert node["type"] is not None + assert node["data"]["type"] is not None def test_add_node(self, authenticated_client): """ @@ -209,16 +209,17 @@ def test_add_node(self, authenticated_client): "serial": 2, "delay": 0, } - resp = authenticated_client.api.add_node(LAB_PATH, **node) - assert resp + r = authenticated_client.api.add_node(LAB_PATH, **node) + assert r["status"] == "success" + assert r["data"] def test_get_node_by_name(self, authenticated_client): """ Verify that we can details for a single node by node name """ # get with node with name == TEST_NODE - node = authenticated_client.api.get_node_by_name(LAB_PATH, TEST_NODE) - assert node["name"] == TEST_NODE + r = authenticated_client.api.get_node_by_name(LAB_PATH, TEST_NODE) + assert r["name"] == TEST_NODE def test_get_node_configs(self, authenticated_client): """ @@ -236,24 +237,19 @@ def test_get_node_config_by_id(self, authenticated_client): config = authenticated_client.api.get_node_config_by_id(LAB_PATH, "1") assert config["data"] is not None - def test_get_node_config_by_name(self, authenticated_client): - """ - Verify that we can retrieve configuration data - using a node name - """ - config = authenticated_client.api.get_node_config_by_name(LAB_PATH, TEST_NODE) - assert config["name"] == TEST_NODE - def test_upload_node_config(self, authenticated_client): """ Upload node's config to set startup config """ - config = authenticated_client.api.get_node_config_by_name(LAB_PATH, TEST_NODE) - node_id = config.get("id") - resp = authenticated_client.api.upload_node_config( + resp = authenticated_client.api.get_node_configs(LAB_PATH) + node_id = next( + (k for k, v in resp["data"].items() if v["name"] == TEST_NODE), None + ) + upload_resp = authenticated_client.api.upload_node_config( LAB_PATH, node_id, config=TEST_CONFIG ) - assert resp["status"] == "success" + assert upload_resp["status"] == "success" + assert "Lab has been saved" in upload_resp["message"] def test_stop_all_nodes(self, authenticated_client): """ @@ -329,4 +325,4 @@ def test_get_node_interfaces(self, authenticated_client): def test_list_lab_pictures(self, authenticated_client): resp = authenticated_client.api.get_lab_pictures(LAB_PATH) - assert isinstance(resp, list) + assert resp["status"] == "success" diff --git a/src/tests/test_api_lab.py b/src/tests/test_api_lab.py index 8418029..4bf8d06 100644 --- a/src/tests/test_api_lab.py +++ b/src/tests/test_api_lab.py @@ -18,23 +18,23 @@ class TestEvengApiLab: - """ Test cases """ + """Test cases""" def test_api_get_lab_wo_extension(self, authenticated_client): """ Retrieve Lab details without file extension """ fullpath = LAB_PATH + LAB_NAME - lab = authenticated_client.api.get_lab(fullpath) - assert lab.get("name") == LAB_NAME + resp = authenticated_client.api.get_lab(fullpath) + assert resp["data"]["name"] == LAB_NAME def test_api_get_lab_w_extension(self, authenticated_client): """ Retrieve Lab details with file extension """ fullpath = LAB_PATH + LAB_NAME + EXT - lab = authenticated_client.api.get_lab(fullpath) - assert lab.get("name") == LAB_NAME + resp = authenticated_client.api.get_lab(fullpath) + assert resp["data"]["name"] == LAB_NAME def test_get_non_existing_lab(self, authenticated_client): """ @@ -80,7 +80,7 @@ def test_unlock_lab(self, authenticated_client): def test_get_lab_topology(self, authenticated_client): lab_path = TESTLAB["path"] + TESTLAB["name"] resp = authenticated_client.api.get_lab(lab_path) - assert resp["name"] == TESTLAB["name"] + assert resp["data"]["name"] == TESTLAB["name"] lab_path = TESTLAB["path"] + TESTLAB["name"] def test_delete_lab(self, authenticated_client): diff --git a/src/tests/test_api_network.py b/src/tests/test_api_network.py index e3a8e9a..52bd6aa 100644 --- a/src/tests/test_api_network.py +++ b/src/tests/test_api_network.py @@ -38,12 +38,13 @@ def test_add_network( lab_path, network_type=network_type, name=name, visibility=visibility ) # ID is returned after creation - network_id = resp["id"] + network_id = resp.get("data", {}).get("id") assert int(network_id) # network name exists in lab networks lab_networks = authenticated_client.api.list_lab_networks(lab_path) - assert lab_networks[str(network_id)]["name"] == name + + assert lab_networks["data"][f"{network_id}"]["name"] == name @pytest.mark.parametrize( "network_type, visibility", @@ -63,7 +64,7 @@ def test_add_invalid_network_raises( def test_edit_network(self, authenticated_client, setup_lab, lab, lab_path): net = dict(name="bridge_network", network_type="bridge", visibility="1") add_resp = authenticated_client.api.add_lab_network(lab_path, **net) - net_id = add_resp["id"] + net_id = add_resp.get("data", {}).get("id") edited = lab.copy() edited.update({"name": "edited"}) @@ -76,16 +77,18 @@ def test_edit_network(self, authenticated_client, setup_lab, lab, lab_path): # network updated lab_networks = authenticated_client.api.list_lab_networks(lab_path) - assert lab_networks[str(net_id)]["name"] == "edited" + assert lab_networks["data"][f"{net_id}"]["name"] == "edited" # edit operation without data should raise with pytest.raises(ValueError): edit_resp = authenticated_client.api.edit_lab_network(lab_path, net_id) + @pytest.mark.xfail(reason="TODO: fix this test") def test_delete_network(self, authenticated_client, setup_lab, lab_path): net = dict(name="bridge_network", network_type="bridge") add_resp = authenticated_client.api.add_lab_network(lab_path, **net) - net_id = add_resp["id"] + net_id = add_resp.get("data", {}).get("id") + print(f"deleting net_id: {net_id}") del_resp = authenticated_client.api.delete_lab_network(lab_path, net_id) assert del_resp["status"] == "success" diff --git a/src/tests/test_cli.py b/src/tests/test_cli.py index f24fab3..accb3cd 100644 --- a/src/tests/test_cli.py +++ b/src/tests/test_cli.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- import os +import re import pytest from click.testing import CliRunner, Result from evengsdk.cli.cli import main as cli from evengsdk.cli.version import __version__ +from evengsdk.exceptions import EvengHTTPError LAB_TO_EDIT = {"name": "lab_to_edit", "path": "/"} @@ -27,27 +29,37 @@ """ -@pytest.fixture() +@pytest.fixture(scope="session") def lab_to_edit(): return LAB_TO_EDIT.copy() -@pytest.fixture() -def cli_client(lab_to_edit, client, request): +@pytest.fixture(scope="session") +def cli_client(client): client.login( username=os.environ["EVE_NG_USERNAME"], password=os.environ["EVE_NG_PASSWORD"] ) - return client + yield client -@pytest.fixture() +@pytest.fixture(scope="session") def setup_test_lab(lab_to_edit, cli_client): - cli_client.api.create_lab(**lab_to_edit) + cli_client.log.debug("starting CLI test..") + try: + cli_client.api.create_lab(**lab_to_edit) + except EvengHTTPError as e: + if "already exists" not in f"{e}": + cli_client.log.debug("Lab already exists...skipping setup") + raise e yield - cli_client.login( - username=os.environ["EVE_NG_USERNAME"], password=os.environ["EVE_NG_PASSWORD"] - ) + cli_client.log.debug("cleaning up test session..") cli_client.api.delete_lab(lab_to_edit["path"] + lab_to_edit["name"]) + if not cli_client.session: + cli_client.login( + username=os.environ["EVE_NG_USERNAME"], + password=os.environ["EVE_NG_PASSWORD"], + ) + cli_client.logout() class TestCli: @@ -71,63 +83,6 @@ def test_version_displays_library_version(self): ), "Version number should match library version." -class TestSystemCommands: - def test_system_status(self): - """ - Arrange/Act: Run the `system` command with the 'status' subcommand. - Assert: The output indicates that a status is successfully returned. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["show-status"]) - - assert result.exit_code == 0, result.output - assert "System" in result.output - - def test_system_list_network_types_text_output(self): - """ - Arrange/Act: Run the `system` command with the 'list-network-types' - subcommand. - Assert: The output indicates that network types are successfully - returned. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["list-network-types"]) - assert result.exit_code == 0, result.output - - def test_system_list_node_templates_text_output(self): - """ - Arrange/Act: Run the `system` command with the 'list-node-templates' - subcommand. - Assert: The output indicates that node templates are successfully - returned. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["list-node-templates"]) - assert result.exit_code == 0, result.output - - def test_system_list_user_roles_text_output(self): - """ - Arrange/Act: Run the `system` command with the 'user-roles' - subcommand. - Assert: The output indicates that node templates are successfully - returned. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["list-user-roles"]) - assert result.exit_code == 0, result.output - - def test_system_read_template(self): - """ - Arrange/Act: Run the `system` command with the 'read-template' - subcommand. - Assert: The output indicates that node templates are successfully - returned. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["show-template", "asa"]) - assert result.exit_code == 0, result.output - - class TestUserCommands: def test_user_list(self): """ @@ -270,9 +225,9 @@ def test_lab_create_without_name_raises(self): ] result: Result = runner.invoke(cli, cli_args) assert result.exit_code > 0 - assert "invalid or missing mandatory parameters" in result.output + assert "Missing option" in result.output - def test_lab_edit(self, setup_test_lab, lab_to_edit): + def test_lab_edit(self, lab_to_edit): """ Arrange/Act: Run the `lab` command with the 'edit' subcommand. Assert: The output indicates that lab is updated successfully. @@ -349,101 +304,26 @@ def test_list_lab_topology(self): result: Result = runner.invoke(cli, ["lab", "topology"]) assert result.exit_code == 0, result.output - @pytest.mark.xfail - def test_lab_export(self): + +class TestImportExportCommands: + def test_lab_export_and_import(self, lab_to_edit, setup_test_lab): """ Arrange/Act: Run the `lab` command with the 'export' subcommand. Assert: The output indicates that lab exported successfully. """ - runner: CliRunner = CliRunner() + path = f"{lab_to_edit['path']}{lab_to_edit['name']}.unl" + runner: CliRunner = CliRunner(env={"EVE_NG_LAB_PATH": path}) with runner.isolated_filesystem(): - result: Result = runner.invoke(cli, ["lab", "export"]) + # Export the lab + result: Result = runner.invoke(cli, ["lab", "export", "--path", path]) assert result.exit_code == 0, result.output - assert "Success" in result.output - - # def test_lab_import(self): - # """ - # Arrange/Act: Run the `lab` command with the 'export' subcommand. - # Assert: The output indicates that lab imported successfully. - # """ - # runner: CliRunner = CliRunner() - # cli_commands = ["lab", "import", "--src", "test.zip"] - # result: Result = runner.invoke(cli, cli_commands) - # assert result.exit_code == 0, result.output + assert "Lab exported" in result.output + # grab the exported lab + match = re.search(r"unetlab_.*zip", result.output) + zipname = match.group(0) -class TestLabNodeCommands: - def test_lab_node_create(self): - """ - Arrange/Act: Run the `node` command with the 'create' subcommand. - Assert: The output indicates that lab imported successfully. - """ - cli_commands = [ - "node", - "create", - "--node-type", - "qemu", - "--name", - "TEST_CSR", - "--template", - "csr1000v", - "--ethernet", - "4", - ] - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, cli_commands) - assert result.exit_code == 0, result.output - - def test_lab_node_list(self): - """ - Arrange/Act: Run the `node` command with the 'list' subcommand. - Assert: The output indicates that lab imported successfully. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["node", "list"]) - assert result.exit_code == 0, result.output - - def test_lab_node_read(self): - """ - Arrange/Act: Run the `node` command with the 'read' subcommand. - Assert: The output indicates that lab retrieved successfully. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["node", "read", "--node-id", "1"]) - assert result.exit_code == 0, result.output - - def test_lab_node_start_command(self): - """ - Arrange/Act: Run the `node` command with the 'start' subcommand. - Assert: The output indicates that lab started successfully. - """ - cli_commands = ["node", "start", "--node-id", "1"] - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, cli_commands) - assert result.exit_code == 0, result.output - assert "started" in result.output - - def test_lab_node_stop_command(self): - """ - Arrange/Act: Run the `node` command with the 'stop' subcommand. - Assert: The output indicates that lab stopped successfully. - """ - runner: CliRunner = CliRunner() - result: Result = runner.invoke(cli, ["node", "stop", "--node-id", "1"]) - assert result.exit_code == 0, result.output - assert "stopped" in result.output - - def test_lab_node_upload_config_command(self): - """ - Arrange/Act: Run the `node` command with the 'upload-config' - subcommand. - Assert: The output indicates that lab started successfully. - """ - runner: CliRunner = CliRunner() - with runner.isolated_filesystem(): - with open("config.txt", "w") as f: - f.write(TEST_CONFIG) - cli_commands = ["node", "upload-config", "-n", "1", "--src", "config.txt"] - result: Result = runner.invoke(cli, cli_commands) - assert result.exit_code == 0, result.output - assert "Lab has been saved" in result.output + # Import the lab + result2: Result = runner.invoke(cli, ["lab", "import", "--src", zipname]) + assert result2.exit_code == 0, result2.output + assert "imported" in result2.output diff --git a/src/tests/test_cli_node.py b/src/tests/test_cli_node.py new file mode 100644 index 0000000..af1a328 --- /dev/null +++ b/src/tests/test_cli_node.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +import os + +import pytest +from click.testing import CliRunner, Result + +from evengsdk.cli.cli import main as cli + + +LAB_TO_EDIT = {"name": "lab_to_edit", "path": "/"} +LAB_TO_CREATE = {"name": "test lab1", "path": "/test lab1.unl"} +NODE_TO_CREATE = { + "node_type": "qemu", + "template": "csr1000v", + "image": "csr1000v-universalk9-16.06.06", + "name": "CSR1", + "ethernet": 4, + "cpu": 2, + "serial": 2, + "delay": 0, +} +TEST_CONFIG = """ +! +hostname vEOS4 +! +""" + + +@pytest.fixture() +def lab_to_edit(): + return LAB_TO_EDIT.copy() + + +@pytest.fixture() +def cli_client(lab_to_edit, client, request): + client.login( + username=os.environ["EVE_NG_USERNAME"], password=os.environ["EVE_NG_PASSWORD"] + ) + return client + + +@pytest.fixture() +def setup_test_lab(lab_to_edit, cli_client): + cli_client.api.create_lab(**lab_to_edit) + yield + cli_client.login( + username=os.environ["EVE_NG_USERNAME"], password=os.environ["EVE_NG_PASSWORD"] + ) + cli_client.api.delete_lab(lab_to_edit["path"] + lab_to_edit["name"]) + + +class TestLabNodeCommands: + def _run_commands(self, commands: list): + runner: CliRunner = CliRunner(env={"EVE_NG_LAB_PATH": "/test lab1.unl"}) + return runner.invoke(cli, commands) + + def _run_node_command(self, cmd: str): + return self._run_commands(["node", cmd, "--node-id", "1"]) + + def test_lab_node_create(self): + """ + Arrange/Act: Run the `node` command with the 'create' subcommand. + Assert: The output indicates that lab imported successfully. + """ + cli_commands = [ + "node", + "create", + "--node-type", + "qemu", + "--name", + "TEST_CSR", + "--template", + "csr1000v", + "--ethernet", + "4", + ] + + result = self._run_commands(cli_commands) + assert result.exit_code == 0, result.output + + def test_lab_node_list(self): + """ + Arrange/Act: Run the `node` command with the 'list' subcommand. + Assert: The output indicates that lab imported successfully. + """ + result = self._run_commands(["node", "list"]) + assert result.exit_code == 0, result.output + + def test_lab_node_read(self): + """ + Arrange/Act: Run the `node` command with the 'read' subcommand. + Assert: The output indicates that lab retrieved successfully. + """ + result = self._run_node_command("read") + assert result.exit_code == 0, result.output + + def test_lab_node_start_command(self): + """ + Arrange/Act: Run the `node` command with the 'start' subcommand. + Assert: The output indicates that lab started successfully. + """ + result = self._run_node_command("start") + assert result.exit_code == 0, result.output + assert "started" in result.output + + def test_lab_node_stop_command(self): + """ + Arrange/Act: Run the `node` command with the 'stop' subcommand. + Assert: The output indicates that lab stopped successfully. + """ + result = result = self._run_node_command("stop") + assert result.exit_code == 0, result.output + assert "stopped" in result.output + + @pytest.mark.skip(reason="TODO: Need to fix set-active command") + def test_lab_node_upload_config_command(self): + """ + Arrange/Act: Run the `node` command with the 'upload-config' + subcommand. + Assert: The output indicates that lab string configuration + uploaded successfully. + """ + runner: CliRunner = CliRunner(env={"EVE_NG_LAB_PATH": "/test lab1.unl"}) + with runner.isolated_filesystem(): + with open("config.txt", "w") as f: + f.write(TEST_CONFIG) + commands = [ + "node", + "upload-config", + "-n", + "1", + "-c", + "hostname test" f"--path {LAB_TO_CREATE}", + ] + result: Result = runner.invoke(cli, commands) + assert result.exit_code == 0, result.output + assert "Lab has been saved" in result.output diff --git a/src/tests/test_cli_system.py b/src/tests/test_cli_system.py new file mode 100644 index 0000000..2f88275 --- /dev/null +++ b/src/tests/test_cli_system.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +import os + +import pytest +from click.testing import CliRunner, Result + +from evengsdk.cli.cli import main as cli + + +LAB_TO_EDIT = {"name": "lab_to_edit", "path": "/"} +LAB_TO_CREATE = {"name": "test lab1", "path": "/test lab1.unl"} +NODE_TO_CREATE = { + "node_type": "qemu", + "template": "csr1000v", + "image": "csr1000v-universalk9-16.06.06", + "name": "CSR1", + "ethernet": 4, + "cpu": 2, + "serial": 2, + "delay": 0, +} +TEST_CONFIG = """ +! +hostname vEOS4 +! +""" + + +@pytest.fixture() +def lab_to_edit(): + return LAB_TO_EDIT.copy() + + +@pytest.fixture() +def cli_client(lab_to_edit, client, request): + client.login( + username=os.environ["EVE_NG_USERNAME"], password=os.environ["EVE_NG_PASSWORD"] + ) + return client + + +@pytest.fixture() +def setup_test_lab(lab_to_edit, cli_client): + cli_client.api.create_lab(**lab_to_edit) + yield + cli_client.login( + username=os.environ["EVE_NG_USERNAME"], password=os.environ["EVE_NG_PASSWORD"] + ) + cli_client.api.delete_lab(lab_to_edit["path"] + lab_to_edit["name"]) + + +class TestSystemCommands: + def _run_commands(self, commands: list): + runner: CliRunner = CliRunner(env={"EVE_NG_LAB_PATH": "/test lab1.unl"}) + result: Result = runner.invoke(cli, commands) + assert result.exit_code == 0, result.output + return result + + def test_system_status(self): + """ + Arrange/Act: Run the `system` command with the 'status' subcommand. + Assert: The output indicates that a status is successfully returned. + """ + result = self._run_commands(["show-status"]) + assert "qemu_version" in result.output + + def test_system_list_network_types_text_output(self): + """ + Arrange/Act: Run the `system` command with the 'list-network-types' + subcommand. + Assert: The output indicates that network types are successfully + returned. + """ + result = self._run_commands(["list-network-types"]) + assert "pnet0" in result.output + + def test_system_list_node_templates_text_output(self): + """ + Arrange/Act: Run the `system` command with the 'list-node-templates' + subcommand. + Assert: The output indicates that node templates are successfully + returned. + """ + result = self._run_commands(["list-node-templates"]) + assert "osx" in result.output + + def test_system_list_user_roles_text_output(self): + """ + Arrange/Act: Run the `system` command with the 'user-roles' + subcommand. + Assert: The output indicates that node templates are successfully + returned. + """ + result = self._run_commands(["list-user-roles"]) + assert "admin" in result.output + + def test_system_read_template(self): + """ + Arrange/Act: Run the `system` command with the 'read-template' + subcommand. + Assert: The output indicates that node templates are successfully + returned. + """ + result = self._run_commands(["show-template", "asa"]) + assert "cpulimit" in result.output diff --git a/src/tests/test_client.py b/src/tests/test_client.py index ee10686..b9e17e1 100644 --- a/src/tests/test_client.py +++ b/src/tests/test_client.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import os import logging + import pytest from evengsdk.client import EvengClient -from evengsdk.exceptions import EvengClientError, EvengLoginError +from evengsdk.exceptions import EvengLoginError, EvengHTTPError @pytest.fixture() @@ -18,7 +19,7 @@ def local_client(local_client_ip): class TestEvengClient: - """ Test cases """ + """Test cases""" def test_create_client_with_logfile(self, local_client_host): """ @@ -76,44 +77,38 @@ def test_client_login_bad_host(self, local_client_host): with pytest.raises(EvengLoginError): username = os.environ["EVE_NG_USERNAME"] passwd = os.environ["EVE_NG_PASSWORD"] - resp = client.login(username=username, password=passwd) - print(resp) - - def test_client_api_created(self, authenticated_client): - assert authenticated_client.api is not None - assert ( - authenticated_client.api.__repr__() - == f"EvengApi({authenticated_client.session})" - ) + client.login(username=username, password=passwd) # ********************************* # HTTP METHODS # ********************************* - def test_client_get(self, authenticated_client): + def test_client_get_status_full_url(self, authenticated_client): """ Verify GET call from client """ - url = authenticated_client.url_prefix + "/status" - r = authenticated_client.session.get(url) - assert r.status_code >= 200 <= 299 + url = f"http://{authenticated_client.host}/api/status" + r = authenticated_client.get(url) + assert r["data"] - def test_client_get_call_bad_ep(self, authenticated_client): + def test_client_get_status_endpoint(self, authenticated_client): """ - Verify GET with bad endpoint returns an error + Verify GET call from client """ - url = authenticated_client.url_prefix + "/bad_endpoint" - r = authenticated_client.session.get(url) - assert r.status_code >= 400 + r = authenticated_client.get("/status") + assert r["data"] - def test_post_call(self, authenticated_client): + def test_client_get_bad_endpoint(self, authenticated_client): """ - Verify POST call with client + Verify GET with bad endpoint returns an error """ - pass + endpoint = "/bad_endpoint" + with pytest.raises(EvengHTTPError): + authenticated_client.get(endpoint) - def test_post_call_bad_url(self, authenticated_client): + def test_client_post_bad_endpoint(self, authenticated_client): """ Verify post with bad URL returns an error """ - with pytest.raises(EvengClientError): - authenticated_client.post("/bogus", data=None) + endpoint = "/bad_endpoint" + with pytest.raises(EvengHTTPError): + authenticated_client.post(endpoint, data=None) diff --git a/src/tests/test_topology_schemas.py b/src/tests/test_topology_schemas.py new file mode 100644 index 0000000..566363f --- /dev/null +++ b/src/tests/test_topology_schemas.py @@ -0,0 +1,112 @@ +import json +from pathlib import Path + +import jsonschema +import pytest +import yaml + + +@pytest.fixture() +def topology(filename): + topology_file = Path(__file__).parent / f"data/{filename}" + return yaml.safe_load(topology_file.read_text()) + + +@pytest.fixture() +def topology_schema_file(): + """ + Returns the path to the topology schema file + from evengsdk.schemas directory + """ + return Path("src/evengsdk/schemas/lab-schema.json") + + +@pytest.fixture() +def schema(topology_schema_file): + return json.loads(topology_schema_file.read_text()) + + +@pytest.fixture() +def validator(schema): + return jsonschema.Draft7Validator(schema=schema) + + +@pytest.mark.parametrize("filename", ["topology_lab_tests.yaml"]) +def test_missing_lab_name_raises(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["missing_lab_name"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "'name' is a required property" in str(e.value) + + +@pytest.mark.parametrize("filename", ["topology_lab_tests.yaml"]) +def test_null_lab_name_fails(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["empty_lab_name"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "is not of type" in str(e.value) + + +@pytest.mark.parametrize("filename", ["topology_node_tests.yaml"]) +def test_missing_node_name_raises(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["missing_node_name"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "'name' is a required property" in str(e.value) + assert "'required' in schema['properties']['nodes']['items']" in str(e.value) + + +@pytest.mark.parametrize("filename", ["topology_node_tests.yaml"]) +def test_missing_node_template_raises(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["missing_node_template"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "'template' is a required property" in str(e.value) + assert "'required' in schema['properties']['nodes']['items']" in str(e.value) + + +@pytest.mark.parametrize("filename", ["topology_node_tests.yaml"]) +def test_missing_node_image_raises(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["missing_node_image"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "'image' is a required property" in str(e.value) + assert "'required' in schema['properties']['nodes']['items']" in str(e.value) + + +@pytest.mark.parametrize("filename", ["topology_node_tests.yaml"]) +def test_node_config_null_raises(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["node_config_is_null"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "None is not valid under any of the given schemas" in str(e.value) + assert "On instance['nodes'][0]['configuration']" in str(e.value) + + +@pytest.mark.parametrize("filename", ["topology_node_tests.yaml"]) +def test_node_config_invalid_type_raises(topology, validator): + """ + Verify topology schema is valid + """ + test_topology = topology["invalid_node_type"] + with pytest.raises(jsonschema.exceptions.ValidationError) as e: + validator.validate(test_topology) + assert "None is not valid under any of the given schemas" in str(e.value)