Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion test/integration/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ def retry_sending_request(
raise Exception(
"Api Error: Failed after all retry attempts"
) from e
time.sleep(backoff)
wait = backoff * attempt + random.uniform(0, 2)
print(f"Attempt {attempt} failed ({e}), retrying in {wait:.1f}s...")
time.sleep(wait)


def send_request_when_resource_available(
Expand Down
6 changes: 1 addition & 5 deletions test/integration/linode_client/test_linode_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@
import pytest

from linode_api4 import ApiError
from linode_api4.objects import (
ConfigInterface,
ObjectStorageKeys,
Region,
)
from linode_api4.objects import ConfigInterface, ObjectStorageKeys, Region


@pytest.fixture(scope="session")
Expand Down
34 changes: 17 additions & 17 deletions test/integration/models/account/test_account.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def test_get_login(test_linode_client):
assert "ip" in str(login._raw_json)
assert "datetime" in str(login._raw_json)
assert "status" in str(login._raw_json)
assert login_updated < 15
assert login_updated < 60


def test_get_account_settings(test_linode_client):
Expand Down Expand Up @@ -102,29 +102,29 @@ def test_latest_get_event(test_linode_client, e2e_test_firewall):
firewall=e2e_test_firewall,
)

events = client.load(Event, "")
try:
for _ in range(5):
events = client.load(Event, "")
latest_events = events._raw_json.get("data", [])[:50]

latest_events = events._raw_json.get("data")

linode.delete()

for event in latest_events[:15]:
if label == event["entity"]["label"]:
break
else:
assert False, f"Linode '{label}' not found in the last 15 events"
if any(
event["entity"]["id"] == linode.id for event in latest_events
):
break
time.sleep(1)
else:
assert False, f"Linode '{label}' not found in recent events"
finally:
linode.delete()


def test_get_user(test_linode_client):
client = test_linode_client

events = client.load(Event, "")

username = events._raw_json.get("data")[0]["username"]

user = client.load(User, username)
profile = client.profile()
user = client.load(User, profile.username)

assert username == user.username
assert user.username == profile.username
assert "email" in user._raw_json


Expand Down
62 changes: 43 additions & 19 deletions test/integration/models/firewall/test_firewall.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,45 @@


@pytest.fixture(scope="session")
def linode_fw(test_linode_client):
def linode_fw(test_linode_client, test_firewall):
client = test_linode_client
region = get_region(client, {"Linodes", "Cloud Firewall"}, site_type="core")
label = get_test_label()

linode_instance, password = client.linode.instance_create(
linode_instance, _ = client.linode.instance_create(
"g6-nanode-1", region, image="linode/debian12", label=label
)

yield linode_instance
for fw in linode_instance.firewalls():
fw_device = next(
(d for d in fw.devices if d.entity.id == linode_instance.id), None
)
if fw_device:
fw_device.delete()

firewall = client.networking.firewall_create(
label=f"{label}-fw",
rules={
"inbound": [],
"inbound_policy": "DROP",
"outbound": [],
"outbound_policy": "ACCEPT",
},
)

client.post(
f"/networking/firewalls/{firewall.id}/devices",
data={"id": linode_instance.id, "type": "linode"},
)

linode_instance.delete()
try:
yield linode_instance, firewall
finally:
for obj, name in ((firewall, "firewall"), (linode_instance, "Linode")):
try:
obj.delete()
except Exception as e:
print(f"Warning: failed to delete {name} {obj.id}: {e}")


@pytest.mark.smoke
Expand Down Expand Up @@ -63,22 +90,19 @@ def test_update_firewall_rules(test_linode_client, test_firewall):
assert firewall.rules.outbound_policy == "DROP"


def test_get_devices(test_linode_client, linode_fw, test_firewall):
linode = linode_fw

test_firewall.device_create(int(linode.id))
def test_get_devices(test_linode_client, linode_fw):
linode, firewall = linode_fw
devices = list(test_linode_client.load(Firewall, firewall.id).devices)
assert any(d.entity.id == linode.id for d in devices)

firewall = test_linode_client.load(Firewall, test_firewall.id)

assert len(firewall.devices) > 0

def test_get_device(test_linode_client, linode_fw):
linode, firewall = linode_fw
devices = list(test_linode_client.load(Firewall, firewall.id).devices)
assert devices, "No devices found on Firewall"

def test_get_device(test_linode_client, test_firewall, linode_fw):
firewall = test_firewall

firewall_device = test_linode_client.load(
FirewallDevice, firewall.devices.first().id, firewall.id
)
device = next(d for d in devices if d.entity.id == linode.id)
fw_device = test_linode_client.load(FirewallDevice, device.id, firewall.id)

assert firewall_device.entity.type == "linode"
assert "/v4/linode/instances/" in firewall_device.entity.url
assert fw_device.entity.type == "linode"
assert f"/v4/linode/instances/{linode.id}" in fw_device.entity.url
18 changes: 12 additions & 6 deletions test/integration/models/linode/test_linode.py
Original file line number Diff line number Diff line change
Expand Up @@ -888,9 +888,12 @@ def test_create_vpc(
test_linode_client,
linode_and_vpc_for_legacy_interface_tests_offline,
):
vpc, subnet, linode, _ = (
linode_and_vpc_for_legacy_interface_tests_offline
)
(
vpc,
subnet,
linode,
_,
) = linode_and_vpc_for_legacy_interface_tests_offline

config: Config = linode.configs[0]

Expand Down Expand Up @@ -945,9 +948,12 @@ def test_update_vpc(
self,
linode_and_vpc_for_legacy_interface_tests_offline,
):
vpc, subnet, linode, _ = (
linode_and_vpc_for_legacy_interface_tests_offline
)
(
vpc,
subnet,
linode,
_,
) = linode_and_vpc_for_legacy_interface_tests_offline

config: Config = linode.configs[0]

Expand Down
25 changes: 20 additions & 5 deletions test/integration/models/nodebalancer/test_nodebalancer.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,35 @@ def linode_with_private_ip(test_linode_client, e2e_test_firewall):


@pytest.fixture(scope="session")
def create_nb_config(test_linode_client, e2e_test_firewall):
def create_nb_config(
test_linode_client, e2e_test_firewall, linode_with_private_ip
):
client = test_linode_client
label = get_test_label(8)
nb_label = get_test_label()
node_label = get_test_label(8)

nb = client.nodebalancer_create(
region=TEST_REGION, label=label, firewall=e2e_test_firewall.id
region=TEST_REGION,
label=nb_label,
firewall=e2e_test_firewall.id,
)

config = nb.config_create()
linode = linode_with_private_ip
address = next(a for a in linode.ipv4 if a.startswith("192.168"))
node = config.node_create(
node_label, f"{address}:80", weight=50, mode="accept"
)

yield config

config.delete()
nb.delete()
# cleanup
for obj in [node, config, nb]:
try:
obj.delete()
except ApiError as e:
if e.status != 404:
raise


@pytest.fixture(scope="session")
Expand Down
5 changes: 1 addition & 4 deletions test/unit/groups/linode_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
build_interface_options_vpc,
)

from linode_api4 import (
InstancePlacementGroupAssignment,
InterfaceGeneration,
)
from linode_api4 import InstancePlacementGroupAssignment, InterfaceGeneration
from linode_api4.objects import ConfigInterface


Expand Down
1 change: 0 additions & 1 deletion test/unit/objects/linode_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,6 @@ def test_get_stackscript(self):


class TypeTest(ClientBaseCase):

def test_get_type_by_id(self):
"""
Tests that a Linode type is loaded correctly by ID
Expand Down
2 changes: 0 additions & 2 deletions test/unit/objects/monitor_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ def test_specific_service_details(self):
self.assertEqual(data.service_type, "dbaas")

def test_metric_definitions(self):

metrics = self.client.monitor.metric_definitions(service_type="dbaas")
self.assertEqual(
metrics[0].available_aggregate_functions,
Expand All @@ -109,7 +108,6 @@ def test_metric_definitions(self):
)

def test_create_token(self):

with self.mock_post("/monitor/services/dbaas/token") as m:
self.client.monitor.create_token(
service_type="dbaas", entity_ids=[189690, 188020]
Expand Down
Loading