v10.3.0: Add `sporestack server regions` command

This commit is contained in:
SporeStack 2023-05-12 14:27:13 +00:00
parent 9acfc88e2a
commit 4311d86658
8 changed files with 50 additions and 4 deletions

View File

@ -14,6 +14,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Nothing yet.
## [10.3.0 - 2023-05-12]
## Added
- `regions` to `APIClient` and `Client`.
- `sporestack server regions` command.
## [10.2.0 - 2023-05-03]
## Changed

View File

@ -35,6 +35,7 @@ sporestack server launch --no-quote --token importediminvalid --operating-system
sporestack server flavors | grep vcpu
sporestack server operating-systems | grep debian-11
sporestack server regions | grep sfo3
if [ -z "$REAL_TESTING_TOKEN" ]; then
rm -r $SPORESTACK_DIR

View File

@ -2,4 +2,4 @@
__all__ = ["api", "api_client", "exceptions"]
__version__ = "10.2.0"
__version__ = "10.3.0"

View File

@ -7,7 +7,7 @@ from typing import Dict, List, Optional, Union
from pydantic import BaseModel, Field
from .models import Flavor, OperatingSystem, Payment
from .models import Flavor, OperatingSystem, Payment, Region
class TokenAdd:
@ -175,6 +175,14 @@ class OperatingSystems:
operating_systems: Dict[str, OperatingSystem]
class Regions:
url = "/regions"
method = "GET"
class Response(BaseModel):
regions: Dict[str, Region]
class TokenMessageSender(str, Enum):
USER = "User"
SPORESTACK = "SporeStack"

View File

@ -242,6 +242,14 @@ class APIClient:
response_object = api.OperatingSystems.Response.parse_obj(response.json())
return response_object
def regions(self) -> api.Regions.Response:
"""Returns regions that you can launch a server in."""
url = self.api_endpoint + api.Regions.url
response = self._httpx_client.get(url)
_handle_response(response)
response_object = api.Regions.Response.parse_obj(response.json())
return response_object
def changelog(self) -> str:
"""Returns the API changelog."""
url = self.api_endpoint + "/changelog"

View File

@ -555,7 +555,7 @@ def rebuild(
@server_cli.command()
def flavors() -> None:
"""Show available flavors."""
"""Shows available flavors."""
from .api_client import APIClient
api_client = APIClient(api_endpoint=get_api_endpoint())
@ -572,7 +572,18 @@ def operating_systems() -> None:
api_client = APIClient(api_endpoint=get_api_endpoint())
os_list = api_client.operating_systems().operating_systems
for operating_system in os_list:
typer.echo(operating_system)
typer.echo(f"{operating_system}")
@server_cli.command()
def regions() -> None:
"""Shows regions that servers can be launched in."""
from .api_client import APIClient
api_client = APIClient(api_endpoint=get_api_endpoint())
regions = api_client.regions().regions
for region in regions:
typer.echo(f"{region}: {regions[region].name}")
def load_token(token: str) -> str:

View File

@ -138,6 +138,10 @@ class Client:
"""Returns available operating systems."""
return self.api_client.operating_systems()
def regions(self) -> api.Regions.Response:
"""Returns regions that servers can be launched in."""
return self.api_client.regions()
def server_quote(self, days: int, flavor: str) -> api.ServerQuote.Response:
"""Get a quote for how much a server will cost."""
return self.api_client.server_quote(days=days, flavor=flavor)

View File

@ -59,3 +59,10 @@ class TokenInfo(BaseModel):
burn_rate_usd: str
days_remaining: int
servers: int
class Region(BaseModel):
# Unique string to identify the region that's sort of human readable.
slug: str
# Actually human readable string describing the region.
name: str