Skip to content

Commit 50276b4

Browse files
feat(long-term): add OpenAPI long-term periods service
Co-authored-by: imagene-shahar <imagene-shahar@users.noreply.github.com>
1 parent 8182777 commit 50276b4

8 files changed

Lines changed: 118 additions & 0 deletions

File tree

datacrunch_compat/datacrunch/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
images,
1616
instance_types,
1717
instances,
18+
long_term,
1819
locations,
1920
ssh_keys,
2021
startup_scripts,
@@ -41,6 +42,7 @@
4142
'images',
4243
'instance_types',
4344
'instances',
45+
'long_term',
4446
'locations',
4547
'ssh_keys',
4648
'startup_scripts',

datacrunch_compat/datacrunch/datacrunch.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from verda.images import ImagesService
1313
from verda.instance_types import InstanceTypesService
1414
from verda.instances import InstancesService
15+
from verda.long_term import LongTermService
1516
from verda.locations import LocationsService
1617
from verda.ssh_keys import SSHKeysService
1718
from verda.startup_scripts import StartupScriptsService
@@ -31,6 +32,7 @@
3132
'ImagesService',
3233
'InstanceTypesService',
3334
'InstancesService',
35+
'LongTermService',
3436
'LocationsService',
3537
'SSHKeysService',
3638
'StartupScriptsService',
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Long Term
2+
=========
3+
4+
.. autoclass:: verda.long_term.LongTermService
5+
:members:
6+
7+
.. autoclass:: verda.long_term.LongTermPeriod
8+
:members:
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import responses # https://github.com/getsentry/responses
2+
3+
from verda.long_term import LongTermPeriod, LongTermService
4+
5+
PERIODS_PAYLOAD = [
6+
{
7+
'code': '1-month',
8+
'name': '1 Month',
9+
'is_enabled': True,
10+
'unit_name': 'month',
11+
'unit_value': 1,
12+
'discount_percentage': 5,
13+
}
14+
]
15+
16+
17+
class TestLongTermService:
18+
@responses.activate
19+
def test_get_periods(self, http_client):
20+
endpoint = http_client._base_url + '/long-term/periods'
21+
responses.add(responses.GET, endpoint, json=PERIODS_PAYLOAD, status=200)
22+
23+
service = LongTermService(http_client)
24+
25+
periods = service.get()
26+
27+
assert isinstance(periods, list)
28+
assert len(periods) == 1
29+
assert isinstance(periods[0], LongTermPeriod)
30+
assert periods[0].code == '1-month'
31+
assert periods[0].discount_percentage == 5
32+
assert responses.assert_call_count(endpoint, 1) is True
33+
34+
@responses.activate
35+
def test_get_instance_periods(self, http_client):
36+
endpoint = http_client._base_url + '/long-term/periods/instances'
37+
responses.add(responses.GET, endpoint, json=PERIODS_PAYLOAD, status=200)
38+
39+
service = LongTermService(http_client)
40+
41+
periods = service.get_instances()
42+
43+
assert len(periods) == 1
44+
assert periods[0].unit_name == 'month'
45+
assert responses.assert_call_count(endpoint, 1) is True
46+
47+
@responses.activate
48+
def test_get_cluster_periods(self, http_client):
49+
endpoint = http_client._base_url + '/long-term/periods/clusters'
50+
responses.add(responses.GET, endpoint, json=PERIODS_PAYLOAD, status=200)
51+
52+
service = LongTermService(http_client)
53+
54+
periods = service.get_clusters()
55+
56+
assert len(periods) == 1
57+
assert periods[0].is_enabled is True
58+
assert responses.assert_call_count(endpoint, 1) is True

tests/unit_tests/test_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def test_client(self):
2828
assert client.constants.base_url == BASE_URL
2929
assert hasattr(client, 'container_types')
3030
assert hasattr(client, 'cluster_types')
31+
assert hasattr(client, 'long_term')
3132

3233
@responses.activate
3334
def test_client_with_default_base_url(self):

verda/_verda.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from verda.images import ImagesService
1111
from verda.instance_types import InstanceTypesService
1212
from verda.instances import InstancesService
13+
from verda.long_term import LongTermService
1314
from verda.locations import LocationsService
1415
from verda.ssh_keys import SSHKeysService
1516
from verda.startup_scripts import StartupScriptsService
@@ -91,5 +92,8 @@ def __init__(
9192
self.cluster_types: ClusterTypesService = ClusterTypesService(self._http_client)
9293
"""Cluster types service. Get available cluster SKUs"""
9394

95+
self.long_term: LongTermService = LongTermService(self._http_client)
96+
"""Long-term service. Get available long-term pricing periods"""
97+
9498

9599
__all__ = ['VerdaClient']

verda/long_term/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from verda.long_term._long_term import LongTermPeriod, LongTermService
2+
3+
__all__ = ['LongTermPeriod', 'LongTermService']

verda/long_term/_long_term.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from dataclasses import dataclass
2+
3+
from dataclasses_json import dataclass_json
4+
5+
LONG_TERM_PERIODS_ENDPOINT = '/long-term/periods'
6+
7+
8+
@dataclass_json
9+
@dataclass
10+
class LongTermPeriod:
11+
"""Long-term pricing period returned by the public API."""
12+
13+
code: str
14+
name: str
15+
is_enabled: bool
16+
unit_name: str
17+
unit_value: float
18+
discount_percentage: float
19+
20+
21+
class LongTermService:
22+
"""Service for interacting with long-term pricing periods."""
23+
24+
def __init__(self, http_client) -> None:
25+
self._http_client = http_client
26+
27+
def get(self) -> list[LongTermPeriod]:
28+
"""Return all long-term periods."""
29+
periods = self._http_client.get(LONG_TERM_PERIODS_ENDPOINT).json()
30+
return [LongTermPeriod.from_dict(period) for period in periods]
31+
32+
def get_instances(self) -> list[LongTermPeriod]:
33+
"""Return long-term periods available for instances."""
34+
periods = self._http_client.get(f'{LONG_TERM_PERIODS_ENDPOINT}/instances').json()
35+
return [LongTermPeriod.from_dict(period) for period in periods]
36+
37+
def get_clusters(self) -> list[LongTermPeriod]:
38+
"""Return long-term periods available for clusters."""
39+
periods = self._http_client.get(f'{LONG_TERM_PERIODS_ENDPOINT}/clusters').json()
40+
return [LongTermPeriod.from_dict(period) for period in periods]

0 commit comments

Comments
 (0)