Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

project: DC-Specific Pricing #331

Merged
merged 7 commits into from
Oct 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ release: build
twine upload dist/*

@PHONEY: install
install: clean
install: clean requirements
python3 -m pip install .

@PHONEY: requirements
Expand Down
1 change: 1 addition & 0 deletions linode_api4/objects/linode.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ class Type(Base):
"label": Property(),
"network_out": Property(),
"price": Property(),
"region_prices": Property(),
"addons": Property(),
"memory": Property(),
"transfer": Property(),
Expand Down
14 changes: 14 additions & 0 deletions test/fixtures/account_transfer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"quota": 471,
"used": 737373,
"billable": 0,

"region_transfers": [
{
"id": "ap-west",
"used": 1,
"quota": 5010,
"billable": 0
}
]
}
114 changes: 105 additions & 9 deletions test/fixtures/linode_types.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"results": 4,
"pages": 1,
"page": 1,
"data": [
"results": 4,
"pages": 1,
"page": 1,
"data": [
{
"disk": 20480,
"memory": 1024,
Expand All @@ -12,7 +12,19 @@
"price": {
"hourly": 0.003,
"monthly": 2
}
},
"region_prices": [
{
"id": "ap-west",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
]
}
},
"class": "nanode",
Expand All @@ -25,6 +37,18 @@
"hourly": 0.0075,
"monthly": 5
},
"region_prices": [
{
"id": "us-east",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
],
"successor": null
},
{
Expand All @@ -36,7 +60,19 @@
"price": {
"hourly": 0.008,
"monthly": 5
}
},
"region_prices": [
{
"id": "ap-west",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
]
}
},
"class": "highmem",
Expand All @@ -49,6 +85,18 @@
"hourly": 0.09,
"monthly": 60
},
"region_prices": [
{
"id": "us-east",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
],
"successor": null
},
{
Expand All @@ -60,7 +108,19 @@
"price": {
"hourly": 0.004,
"monthly": 2.5
}
},
"region_prices": [
{
"id": "ap-west",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
]
}
},
"class": "standard",
Expand All @@ -73,6 +133,18 @@
"hourly": 0.015,
"monthly": 10
},
"region_prices": [
{
"id": "us-east",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
],
"successor": null
},
{
Expand All @@ -84,7 +156,19 @@
"price": {
"hourly": 0.008,
"monthly": 5
}
},
"region_prices": [
{
"id": "ap-west",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
]
}
},
"class": "gpu",
Expand All @@ -97,7 +181,19 @@
"hourly": 0.03,
"monthly": 20
},
"region_prices": [
{
"id": "us-east",
"hourly": 0.02,
"monthly": 20
},
{
"id": "ap-northeast",
"hourly": 0.02,
"monthly": 20
}
],
"successor": null
}
]
}
}
19 changes: 18 additions & 1 deletion test/integration/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,24 @@
from linode_api4.linode_client import LinodeClient

ENV_TOKEN_NAME = "LINODE_TOKEN"
ENV_API_URL_NAME = "LINODE_API_URL"
ENV_API_CA_NAME = "LINODE_API_CA"
RUN_LONG_TESTS = "RUN_LONG_TESTS"


def get_token():
return os.environ.get(ENV_TOKEN_NAME, None)


def get_api_url():
return os.environ.get(ENV_API_URL_NAME, "https://api.linode.com/v4beta")


def get_api_ca_file():
result = os.environ.get(ENV_API_CA_NAME, None)
return result if result != "" else None


def run_long_tests():
return os.environ.get(RUN_LONG_TESTS, None)

Expand Down Expand Up @@ -71,7 +82,13 @@ def ssh_key_gen():
@pytest.fixture(scope="session")
def get_client():
token = get_token()
client = LinodeClient(token)
api_url = get_api_url()
api_ca_file = get_api_ca_file()
client = LinodeClient(
token,
base_url=api_url,
ca_path=api_ca_file,
)
return client


Expand Down
16 changes: 16 additions & 0 deletions test/integration/models/test_linode.py
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,22 @@ def test_get_linode_types(get_client):
assert "g6-nanode-1" in ids


def test_get_linode_types_overrides(get_client):
types = get_client.linode.types()

target_types = [
v
for v in types
if len(v.region_prices) > 0 and v.region_prices[0].hourly > 0
]

assert len(target_types) > 0

for linode_type in target_types:
assert linode_type.region_prices[0].hourly >= 0
assert linode_type.region_prices[0].monthly >= 0


def test_get_linode_type_by_id(get_client):
pytest.skip(
"Might need Type to match how other object models are behaving e.g. client.load(Type, 123)"
Expand Down
16 changes: 16 additions & 0 deletions test/unit/linode_client_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,22 @@ def test_join_beta_program(self):
)
self.assertEqual(m.call_url, join_beta_url)

def test_account_transfer(self):
"""
Tests that payments can be retrieved
"""
transfer = self.client.account.transfer()
Copy link
Contributor

@ykim-1 ykim-1 Sep 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this function hard to test with integration tests? Other than that tests look good!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ykim-1 Yup! The main issue is that this represents account-wide network transfer so it's difficult to reliably test it across multiple accunts.


self.assertEqual(transfer.quota, 471)
self.assertEqual(transfer.used, 737373)
self.assertEqual(transfer.billable, 0)

self.assertEqual(len(transfer.region_transfers), 1)
self.assertEqual(transfer.region_transfers[0].id, "ap-west")
self.assertEqual(transfer.region_transfers[0].used, 1)
self.assertEqual(transfer.region_transfers[0].quota, 5010)
self.assertEqual(transfer.region_transfers[0].billable, 0)


class BetaProgramGroupTest(ClientBaseCase):
"""
Expand Down
3 changes: 3 additions & 0 deletions test/unit/objects/linode_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,8 @@ def test_get_types(self):
self.assertIsNotNone(t.type_class)
self.assertIsNotNone(t.gpus)
self.assertIsNone(t.successor)
self.assertIsNotNone(t.region_prices)
self.assertIsNotNone(t.addons.backups.region_prices)

def test_get_type_by_id(self):
"""
Expand All @@ -546,6 +548,7 @@ def test_get_type_by_id(self):
self.assertEqual(t.label, "Linode 1024")
self.assertEqual(t.disk, 20480)
self.assertEqual(t.type_class, "nanode")
self.assertEqual(t.region_prices[0].id, "us-east")

def test_get_type_gpu(self):
"""
Expand Down