Source code for cherryservers_sdk_python.plans

"""Cherry Servers plan resource management module."""

from __future__ import annotations

from pydantic import Field

from cherryservers_sdk_python import _base, regions


[docs] class AvailableRegionsModel(regions.RegionModel): """Cherry Servers plan available regions model. This model is frozen by default, since it represents an actual Cherry Servers plan available region resource state. Inherits all attributes of :class:`cherryservers_sdk_python.regions.RegionModel`. Attributes: stock_qty (int | None): The number servers in stock. spot_qty (int | None): The number of servers as spot instances in stock. """ stock_qty: int | None = Field( description="The number servers in stock.", default=None ) spot_qty: int | None = Field( description="The number of servers as spot instances in stock.", default=None )
[docs] class BandwidthModel(_base.ResourceModel): """Cherry Servers plan specs bandwidth model. This model is frozen by default, since it represents an actual Cherry Servers plan specs bandwidth resource state. Attributes: name (str | None): Bandwidth name. """ name: str | None = Field(description="Bandwidth name.", default=None)
[docs] class NicsModel(_base.ResourceModel): """Cherry Servers plan specs network interface controllers model. This model is frozen by default, since it represents an actual Cherry Servers plan specs network interface controllers state. Attributes: name (str | None): NICS name. """ name: str | None = Field(description="NICS name.", default=None)
[docs] class RaidModel(_base.ResourceModel): """Cherry Servers plan specs RAID model. This model is frozen by default, since it represents an actual Cherry Servers plan specs RAID resource state. Attributes: name (str | None): RAID name. """ name: str | None = Field(description="RAID name.", default=None)
[docs] class StorageModel(_base.ResourceModel): """Cherry Servers plan specs storage model. This model is frozen by default, since it represents an actual Cherry Servers plan specs storage resource state. Attributes: name (str | None): Storage device name. count (int | None): The number of storage devices. size (float | None): The size of the storage devices. unit (str | None): Storage device size measurement unit. """ name: str | None = Field(description="Storage device name.", default=None) count: int | None = Field( description="The number of storage devices.", default=None ) size: float | None = Field( description="The size of the storage devices.", default=None ) unit: str | None = Field( description="Storage device size measurement unit.", default=None )
[docs] class MemoryModel(_base.ResourceModel): """Cherry Servers plan specs memory model. This model is frozen by default, since it represents an actual Cherry Servers plan specs memory resource state. Attributes: name (str | None): Memory device name. count (int | None): The number of memory devices. total (int | None): The total capacity of the memory devices. unit (str | None): Memory device size measurement unit. """ name: str | None = Field(description="Storage device name.", default=None) count: int | None = Field(description="The number of memory devices.", default=None) total: int | None = Field( description="The total capacity of the memory devices.", default=None ) unit: str | None = Field( description="Memory device size measurement unit.", default=None )
[docs] class CPUModel(_base.ResourceModel): """Cherry Servers plan specs CPU model. This model is frozen by default, since it represents an actual Cherry Servers plan specs CPU resource state. Attributes: name (str | None): CPU device name. count (int | None): The number of CPU devices. cores (int | None): The number of CPU cores. frequency (float | None): The frequency of the CPU cores. unit (str | None): CPU core frequency measurement unit. """ name: str | None = Field(description="CPU device name.", default=None) count: int | None = Field(description="The number of CPU devices.", default=None) cores: int | None = Field(description="The number of CPU cores.", default=None) frequency: float | None = Field( description="The frequency of the CPU cores.", default=None ) unit: str | None = Field( description="CPU core frequency measurement unit.", default=None )
[docs] class SpecsModel(_base.ResourceModel): """Cherry Servers plan specs model. This model is frozen by default, since it represents an actual Cherry Servers plan specs resource state. Attributes: cpus (cherryservers_sdk_python.plans.CPUModel | None): CPU device data. memory (cherryservers_sdk_python.plans.MemoryModel | None): Memory device data. storage (list[cherryservers_sdk_python.plans.StorageModel] | None): Storage device data. raid (cherryservers_sdk_python.plans.RaidModel | None): RAID data. nics (cherryservers_sdk_python.plans.NicsModel | None): NICS device data. bandwidth (cherryservers_sdk_python.plans.BandwidthModel | None): Bandwidth data. """ cpus: CPUModel | None = Field(description="CPU device data.", default=None) memory: MemoryModel | None = Field(description="Memory device data.", default=None) storage: list[StorageModel] | None = Field( description="Storage device data.", default=None ) raid: RaidModel | None = Field(description="RAID data.", default=None) nics: NicsModel | None = Field(description="NICS device data.", default=None) bandwidth: BandwidthModel | None = Field( description="Bandwidth data.", default=None )
[docs] class PricingModel(_base.ResourceModel): """Cherry Servers pricing model. This model is frozen by default, since it represents an actual Cherry Servers pricing resource state. Attributes: price (float | None): Price. taxed (bool | None): Whether tax is applied. currency (str | None): Currency type. unit (str | None): Time unit type. """ price: float | None = Field(description="Price.", default=None) taxed: bool | None = Field(description="Whether tax is applied.", default=None) currency: str | None = Field(description=" Currency type.", default=None) unit: str | None = Field(description="Time unit type.", default=None)
[docs] class PlanModel(_base.ResourceModel): """Cherry Servers plan model. This model is frozen by default, since it represents an actual Cherry Servers plan resource state. Attributes: id (int): Plan ID. name (str | None): Plan full name. slug (str | None): Plan name slug. type (str | None): Plan type, such as `baremetal` or `premium-vds`. specs (cherryservers_sdk_python.plans.SpecsModel | None): Plan specs. pricing (list[cherryservers_sdk_python.plans.PricingModel] | None): Plan pricing. available_regions(list[cherryservers_sdk_python.plans.AvailableRegionsModel] | None): Available regions for the plan. """ # noqa: W505 id: int = Field(description="Plan ID.") name: str | None = Field(description="Plan full name.", default=None) slug: str | None = Field(description="Plan name slug.", default=None) type: str | None = Field( description="Plan type, such as `baremetal` or `premium-vds`.", default=None ) specs: SpecsModel | None = Field(description="Plan specs.", default=None) pricing: list[PricingModel] | None = Field( description="Plan pricing.", default=None ) available_regions: list[AvailableRegionsModel] | None = Field( description="Available regions for the plan.", default=None )
[docs] class PlanClient(_base.ResourceClient): """Cherry Servers server plan client. Manage Cherry Servers plan resources. This class should typically be initialized by :class:`cherryservers_sdk_python.facade.CherryApiFacade`. Example: .. code-block:: python facade = cherryservers_sdk_python.facade.CherryApiFacade(token) # Get a list of all team permitted plans. plans = facade.plans.get_by_team(123456): # Get a plan by id (or slug). plan = facade.plans.get_by_id_or_slug("premium_vds_2") """
[docs] def get_by_id_or_slug(self, plan_id_or_slug: int | str) -> Plan: """Retrieve a plan by ID or slug.""" response = self._api_client.get( f"plans/{plan_id_or_slug}", {"fields": "plan,specs,pricing,region,href"}, self.request_timeout, ) plan_model = PlanModel.model_validate(response.json()) return Plan(self, plan_model)
[docs] def list_by_team(self, team_id: int) -> list[Plan]: """Get all plans that are available to a team.""" response = self._api_client.get( f"teams/{team_id}/plans", {"fields": "plan,specs,pricing,region,href"}, self.request_timeout, ) plans: list[Plan] = [] for value in response.json(): plan_model = PlanModel.model_validate(value) plans.append(Plan(self, plan_model)) return plans
[docs] class Plan(_base.Resource[PlanClient, PlanModel]): """Cherry Servers server plan resource. This class represents an existing Cherry Servers resource and should only be initialized by :class:`PlanClient`. """
[docs] def get_id(self) -> int: """Get resource ID.""" return self._model.id