Source code for air_sdk.endpoints.fleets
# SPDX-FileCopyrightText: Copyright (c) 2022-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: MIT
from __future__ import annotations
from dataclasses import _MISSING_TYPE, MISSING, dataclass, field
from datetime import datetime
from typing import TYPE_CHECKING, Any, Iterator
from air_sdk.air_model import AirModel, BaseEndpointAPI, DataDict
from air_sdk.endpoints import mixins
from air_sdk.utils import validate_payload_types
if TYPE_CHECKING:
from air_sdk.endpoints.workers import Worker, WorkerEndpointAPI
[docs]
@dataclass(eq=False)
class Fleet(AirModel):
id: str = field(repr=False)
created: datetime = field(repr=False)
modified: datetime = field(repr=False)
name: str
[docs]
@classmethod
def get_model_api(cls) -> type[FleetEndpointAPI]:
"""Returns the respective `AirModelAPI` type for this model."""
return FleetEndpointAPI
[docs]
@validate_payload_types
def update(
self,
*,
name: str | _MISSING_TYPE = MISSING,
) -> None:
"""Update specific fields of the fleet.
Example
-------
>>> fleet = api.fleets.get('123e4567-e89b-12d3-a456-426614174000')
>>> fleet.update(name='new-name')
"""
data = {
'name': name,
}
payload = {key: value for (key, value) in data.items() if value is not MISSING}
super().update(**payload)
[docs]
def create_worker(
self,
*,
fqdn: str,
ip_address: str,
cpu_arch: str | _MISSING_TYPE = MISSING,
) -> Worker:
"""Create a new worker in the fleet.
Example
-------
>>> fleet = api.fleets.get('123e4567-e89b-12d3-a456-426614174000')
>>> worker = fleet.create_worker(fqdn='w1.example.com', ip_address='1.1.1.1')
>>> print(worker)
"""
return self.__api__.workers.create(
fleet=self,
fqdn=fqdn,
ip_address=ip_address,
cpu_arch=cpu_arch,
)
@property
def workers(self) -> WorkerEndpointAPI:
"""Query for the related workers of the fleet."""
from air_sdk.endpoints.workers import WorkerEndpointAPI
return WorkerEndpointAPI(
self.__api__, default_filters={'fleet': str(self.__pk__)}
)
[docs]
class FleetEndpointAPI(
mixins.ListApiMixin[Fleet],
mixins.CreateApiMixin[Fleet],
mixins.GetApiMixin[Fleet],
mixins.PatchApiMixin[Fleet],
mixins.DeleteApiMixin,
BaseEndpointAPI[Fleet],
):
API_PATH = 'infra/fleets/'
model = Fleet
[docs]
@validate_payload_types
def list(
self,
name: str | _MISSING_TYPE = MISSING,
search: str | _MISSING_TYPE = MISSING,
ordering: str | _MISSING_TYPE = MISSING,
**params: Any,
) -> Iterator[Fleet]:
"""List all fleets.
Example
-------
>>> for fleet in api.fleets.list(ordering='name'):
... print(fleet.name)
"""
params.update(
{
k: v
for k, v in {
'name': name,
'search': search,
'ordering': ordering,
}.items()
if v is not MISSING
}
)
return super().list(**params)
[docs]
@validate_payload_types
def create(self, *, name: str) -> Fleet:
"""Create a new fleet.
Example
-------
>>> fleet = api.fleets.create(name='My Fleet')
>>> print(fleet)
"""
data: DataDict = {
'name': name,
}
payload = {key: value for (key, value) in data.items() if value is not MISSING}
return super().create(**payload)