2025-02-05 13:43:43 +01:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# coding: utf-8 -*-
|
|
|
|
# pylint: disable=no-value-for-parameter
|
|
|
|
# pylint: disable=too-many-arguments
|
|
|
|
# pylint: disable=line-too-long
|
|
|
|
# pylint: disable=redefined-builtin
|
|
|
|
# flake8: noqa E501
|
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
"""CLI commands for listing Arista package information.
|
|
|
|
|
|
|
|
This module provides CLI commands to query and display version information for Arista packages (EOS and CVP).
|
|
|
|
It includes commands to:
|
|
|
|
- List all available versions with filtering options
|
|
|
|
- Get the latest version for a given package/branch
|
|
|
|
|
|
|
|
The commands use Click for CLI argument parsing and support both text and JSON output formats.
|
|
|
|
Authentication is handled via a token passed through Click context.
|
|
|
|
|
|
|
|
Commands:
|
|
|
|
versions: Lists all available versions with optional filtering
|
|
|
|
latest: Shows the latest version matching the filter criteria
|
|
|
|
|
|
|
|
Dependencies:
|
|
|
|
click: CLI framework
|
|
|
|
rich: For pretty JSON output
|
|
|
|
eos_downloader.logics.arista_server: Core logic for querying Arista servers
|
2025-02-05 13:43:43 +01:00
|
|
|
"""
|
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
import json
|
2025-02-05 13:43:43 +01:00
|
|
|
|
|
|
|
import click
|
2025-02-10 06:39:48 +01:00
|
|
|
from rich import print_json
|
|
|
|
from rich.panel import Panel
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
from eos_downloader.models.data import software_mapping
|
|
|
|
from eos_downloader.models.types import AristaPackage, ReleaseType, AristaMapping
|
|
|
|
import eos_downloader.logics.arista_xml_server
|
|
|
|
from eos_downloader.cli.utils import console_configuration
|
|
|
|
from eos_downloader.cli.utils import cli_logging
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
# """
|
|
|
|
# Commands for ARDL CLI to list data.
|
|
|
|
# """
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
|
|
|
|
@click.command()
|
2025-02-05 13:48:40 +01:00
|
|
|
@click.option(
|
2025-02-10 06:39:48 +01:00
|
|
|
"--format",
|
|
|
|
type=click.Choice(["json", "text", "fancy"]),
|
|
|
|
default="fancy",
|
|
|
|
help="Output format",
|
2025-02-05 13:48:40 +01:00
|
|
|
)
|
|
|
|
@click.option(
|
2025-02-10 06:39:48 +01:00
|
|
|
"--package", type=click.Choice(["eos", "cvp"]), default="eos", required=False
|
2025-02-05 13:48:40 +01:00
|
|
|
)
|
2025-02-10 06:39:48 +01:00
|
|
|
@click.option("--branch", "-b", type=str, required=False)
|
|
|
|
@click.option("--release-type", type=str, required=False)
|
|
|
|
@click.pass_context
|
|
|
|
def versions(
|
|
|
|
ctx: click.Context,
|
|
|
|
package: AristaPackage,
|
|
|
|
branch: str,
|
|
|
|
release_type: ReleaseType,
|
|
|
|
format: str,
|
|
|
|
) -> None:
|
|
|
|
"""List available package versions from Arista server."""
|
|
|
|
|
|
|
|
console = console_configuration()
|
|
|
|
token = ctx.obj["token"]
|
|
|
|
debug = ctx.obj["debug"]
|
|
|
|
log_level = ctx.obj["log_level"]
|
|
|
|
cli_logging(log_level)
|
|
|
|
|
|
|
|
querier = eos_downloader.logics.arista_xml_server.AristaXmlQuerier(token=token)
|
|
|
|
|
|
|
|
received_versions = None
|
|
|
|
try:
|
|
|
|
received_versions = querier.available_public_versions(
|
|
|
|
package=package, branch=branch, rtype=release_type
|
|
|
|
)
|
|
|
|
except ValueError:
|
|
|
|
if debug:
|
|
|
|
console.print_exception(show_locals=True)
|
|
|
|
else:
|
|
|
|
console.print("[red]No versions found[/red]")
|
|
|
|
return
|
|
|
|
|
|
|
|
if format == "text":
|
|
|
|
console.print("Listing available versions")
|
|
|
|
if received_versions is None:
|
|
|
|
console.print("[red]No versions found[/red]")
|
|
|
|
return
|
|
|
|
for version in received_versions:
|
|
|
|
console.print(f" - version: [blue]{version}[/blue]")
|
|
|
|
elif format == "fancy":
|
|
|
|
lines_output = []
|
|
|
|
if received_versions is None:
|
|
|
|
console.print("[red]No versions found[/red]")
|
|
|
|
return
|
|
|
|
for version in received_versions:
|
|
|
|
lines_output.append(f" - version: [blue]{version}[/blue]")
|
|
|
|
console.print("")
|
|
|
|
console.print(
|
|
|
|
Panel("\n".join(lines_output), title="Available versions", padding=1)
|
|
|
|
)
|
|
|
|
elif format == "json":
|
|
|
|
response = []
|
|
|
|
if received_versions is None:
|
|
|
|
console.print("[red]No versions found[/red]")
|
|
|
|
return
|
|
|
|
for version in received_versions:
|
|
|
|
out = {}
|
|
|
|
out["version"] = str(version)
|
|
|
|
out["branch"] = str(version.branch)
|
|
|
|
response.append(out)
|
|
|
|
response = json.dumps(response) # type: ignore
|
|
|
|
print_json(response)
|
|
|
|
|
|
|
|
|
|
|
|
@click.command()
|
2025-02-05 13:48:40 +01:00
|
|
|
@click.option(
|
2025-02-10 06:39:48 +01:00
|
|
|
"--format",
|
|
|
|
type=click.Choice(["json", "text", "fancy"]),
|
|
|
|
default="fancy",
|
|
|
|
help="Output format",
|
2025-02-05 13:48:40 +01:00
|
|
|
)
|
|
|
|
@click.option(
|
2025-02-10 06:39:48 +01:00
|
|
|
"--package", type=click.Choice(["eos", "cvp"]), default="eos", required=False
|
2025-02-05 13:48:40 +01:00
|
|
|
)
|
2025-02-10 06:39:48 +01:00
|
|
|
@click.option("--branch", "-b", type=str, required=False)
|
|
|
|
@click.option("--release-type", type=str, required=False)
|
|
|
|
@click.pass_context
|
|
|
|
def latest(
|
2025-02-05 13:48:40 +01:00
|
|
|
ctx: click.Context,
|
2025-02-10 06:39:48 +01:00
|
|
|
package: AristaPackage,
|
|
|
|
branch: str,
|
|
|
|
release_type: ReleaseType,
|
|
|
|
format: str,
|
2025-02-05 13:48:40 +01:00
|
|
|
) -> None:
|
2025-02-10 06:39:48 +01:00
|
|
|
"""List available versions of Arista packages (eos or CVP) packages."""
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
console = console_configuration()
|
|
|
|
token = ctx.obj["token"]
|
|
|
|
debug = ctx.obj["debug"]
|
|
|
|
log_level = ctx.obj["log_level"]
|
|
|
|
cli_logging(log_level)
|
|
|
|
querier = eos_downloader.logics.arista_xml_server.AristaXmlQuerier(token=token)
|
|
|
|
received_version = None
|
|
|
|
try:
|
|
|
|
received_version = querier.latest(
|
|
|
|
package=package, branch=branch, rtype=release_type
|
|
|
|
)
|
|
|
|
except ValueError:
|
|
|
|
if debug:
|
|
|
|
console.print_exception(show_locals=True)
|
|
|
|
else:
|
|
|
|
console.print("[red]No versions found[/red]")
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
if format in ["text", "fancy"]:
|
|
|
|
version_info = f"Latest version for [green]{package}[/green]: [blue]{received_version}[/blue]"
|
|
|
|
if branch:
|
|
|
|
version_info += f" for branch [blue]{branch}[/blue]"
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
if format == "text":
|
|
|
|
console.print("")
|
|
|
|
console.print(version_info)
|
|
|
|
else: # fancy format
|
|
|
|
console.print("")
|
|
|
|
console.print(Panel(version_info, title="Latest version", padding=1))
|
|
|
|
else: # json format
|
|
|
|
print_json(json.dumps({"version": str(received_version)}))
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
|
|
|
|
@click.command()
|
|
|
|
@click.option(
|
|
|
|
"--package", type=click.Choice(["eos", "cvp"]), default="eos", required=False
|
|
|
|
)
|
|
|
|
@click.option(
|
|
|
|
"--format",
|
|
|
|
type=click.Choice(["json", "text", "fancy"]),
|
|
|
|
default="fancy",
|
|
|
|
help="Output format",
|
|
|
|
)
|
|
|
|
@click.option(
|
|
|
|
"--details",
|
|
|
|
is_flag=True,
|
|
|
|
show_default=True,
|
|
|
|
default=False,
|
|
|
|
help="Show details for each flavor",
|
|
|
|
)
|
|
|
|
@click.pass_context
|
|
|
|
def mapping(
|
|
|
|
ctx: click.Context, package: AristaPackage, details: bool, format: str
|
|
|
|
) -> None:
|
|
|
|
"""List available flavors of Arista packages (eos or CVP) packages."""
|
|
|
|
|
|
|
|
mapping_pkg_name: AristaMapping = "EOS"
|
|
|
|
if package == "eos":
|
|
|
|
mapping_pkg_name = "EOS"
|
|
|
|
elif package == "cvp":
|
|
|
|
mapping_pkg_name = "CloudVision"
|
|
|
|
console = console_configuration()
|
|
|
|
log_level = ctx.obj["log_level"]
|
|
|
|
console.print(f"Log Level is: {log_level}")
|
|
|
|
cli_logging(log_level)
|
|
|
|
|
|
|
|
if mapping_pkg_name in software_mapping.model_fields:
|
|
|
|
mapping_entries = getattr(software_mapping, mapping_pkg_name, None)
|
|
|
|
if format == "text":
|
2025-02-05 13:48:40 +01:00
|
|
|
console.print(
|
2025-02-10 06:39:48 +01:00
|
|
|
f"Following flavors for [red]{package}/{mapping_pkg_name}[/red] have been found:"
|
2025-02-05 13:48:40 +01:00
|
|
|
)
|
2025-02-10 06:39:48 +01:00
|
|
|
if mapping_entries is None:
|
|
|
|
console.print("[red]No flavors found[/red]")
|
|
|
|
return
|
|
|
|
for mapping_entry in mapping_entries:
|
|
|
|
console.print(f" * Flavor: [blue]{mapping_entry}[/blue]")
|
|
|
|
if details:
|
|
|
|
console.print(
|
|
|
|
f" - Information: [black]{mapping_entries[mapping_entry]}[/black]"
|
|
|
|
)
|
|
|
|
console.print("\n")
|
|
|
|
elif format == "fancy":
|
|
|
|
lines_output = []
|
|
|
|
if mapping_entries is None:
|
|
|
|
lines_output.append("[red]No flavors found[/red]")
|
|
|
|
console.print("\n".join(lines_output))
|
|
|
|
return
|
|
|
|
for mapping_entry in mapping_entries:
|
|
|
|
lines_output.append(f" * Flavor: [blue]{mapping_entry}[/blue]")
|
|
|
|
if details:
|
|
|
|
lines_output.append(
|
|
|
|
f" - Information: [black]{mapping_entries[mapping_entry]}[/black]"
|
|
|
|
)
|
|
|
|
console.print("")
|
|
|
|
console.print(Panel("\n".join(lines_output), title="Flavors", padding=1))
|
|
|
|
console.print("\n")
|
|
|
|
elif format == "json":
|
|
|
|
mapping_json = software_mapping.model_dump()[package.upper()]
|
|
|
|
print_json(json.dumps(mapping_json))
|